Passed
Push — master ( eb013e...37f747 )
by Jonathan
04:35
created

AdminConfigController::index()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 115
Code Lines 37

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 37
nc 4
nop 0
dl 0
loc 115
rs 9.328
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * webtrees-lib: MyArtJaub library for webtrees
4
 *
5
 * @package MyArtJaub\Webtrees
6
 * @subpackage AdminTasks
7
 * @author Jonathan Jaubart <[email protected]>
8
 * @copyright Copyright (c) 2012-2016, Jonathan Jaubart
9
 * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3
10
 */
11
namespace MyArtJaub\Webtrees\Module\AdminTasks;
12
13
use Fisharebest\Webtrees\Auth;
14
use Fisharebest\Webtrees\Controller\AjaxController;
15
use Fisharebest\Webtrees\Controller\PageController;
16
use Fisharebest\Webtrees\Filter;
17
use Fisharebest\Webtrees\I18N;
18
use Fisharebest\Webtrees\Log;
19
use Fisharebest\Webtrees\Module;
20
use Fisharebest\Webtrees\Module\AbstractModule;
21
use Fisharebest\Webtrees\Theme;
22
use Fisharebest\Webtrees\Theme\AdministrationTheme;
23
use MyArtJaub\Webtrees\Controller\JsonController;
24
use MyArtJaub\Webtrees\Functions\Functions;
25
use MyArtJaub\Webtrees\Globals;
26
use MyArtJaub\Webtrees\Module\AdminTasks\Model\AbstractTask;
27
use MyArtJaub\Webtrees\Module\AdminTasks\Model\TaskProviderInterface;
28
use MyArtJaub\Webtrees\Mvc\Controller\MvcController;
29
use MyArtJaub\Webtrees\Mvc\View\ViewBag;
30
use MyArtJaub\Webtrees\Mvc\View\ViewFactory;
31
use Rhumsaa\Uuid\Uuid;
32
33
/**
34
 * Controller for AdminTasks AdminConfig
35
 */
36
class AdminConfigController extends MvcController
37
{    
38
    /**
39
     * Tasks Provider
40
     * @var TaskProviderInterface $provider
41
     */
42
    protected $provider;    
43
    
44
    /**
45
     * Constructor for Admin Config controller
46
     * @param \Fisharebest\Webtrees\Module\AbstractModule $module
47
     */
48
    public function __construct(AbstractModule $module) {
49
        parent::__construct($module);
50
        
51
        $this->provider = $this->module->getProvider();
52
    }    
53
    
54
    /**
55
     * Pages
56
     */
57
        
58
    /**
59
     * AdminConfig@index
60
     */
61
    public function index() {
62
        
63
        $tree = Globals::getTree();
64
        Theme::theme(new AdministrationTheme)->init($tree);
65
        $controller = new PageController();
66
        $controller
67
            ->restrictAccess(Auth::isAdmin())
68
            ->setPageTitle($this->module->getTitle());
69
			
70
		$token = $this->module->getSetting('MAJ_AT_FORCE_EXEC_TOKEN');
71
		if(is_null($token)) {
72
			$token = Functions::generateRandomToken();
73
			$this->module->setSetting('PAT_FORCE_EXEC_TOKEN', $token);
74
		}
75
        
76
        $data = new ViewBag();
77
        $data->set('title', $controller->getPageTitle());
78
        
79
        $table_id = 'table-admintasks-' . Uuid::uuid4();
80
        $data->set('table_id', $table_id);
81
		
82
		$data->set('trigger_url_root', WT_BASE_URL.'module.php?mod='.$this->module->getName().'&mod_action=Task@trigger');
83
		$token = $this->module->getSetting('MAJ_AT_FORCE_EXEC_TOKEN');
84
		if(is_null($token)) {
85
			$token = Functions::generateRandomToken();
86
			$this->module->setSetting('MAJ_AT_FORCE_EXEC_TOKEN', $token);
87
		}
88
		$data->set('trigger_token', $token);
89
		
90
		$this->provider->getInstalledTasks();
91
		
92
		$controller
93
            ->addExternalJavascript(WT_JQUERY_DATATABLES_JS_URL)
94
            ->addExternalJavascript(WT_DATATABLES_BOOTSTRAP_JS_URL)
95
            ->addInlineJavascript('
96
                //Datatable initialisation
97
				jQuery.fn.dataTableExt.oSort["unicode-asc"  ]=function(a,b) {return a.replace(/<[^<]*>/, "").localeCompare(b.replace(/<[^<]*>/, ""))};
98
				jQuery.fn.dataTableExt.oSort["unicode-desc" ]=function(a,b) {return b.replace(/<[^<]*>/, "").localeCompare(a.replace(/<[^<]*>/, ""))};
99
				jQuery.fn.dataTableExt.oSort["num-html-asc" ]=function(a,b) {a=parseFloat(a.replace(/<[^<]*>/, "")); b=parseFloat(b.replace(/<[^<]*>/, "")); return (a<b) ? -1 : (a>b ? 1 : 0);};
100
				jQuery.fn.dataTableExt.oSort["num-html-desc"]=function(a,b) {a=parseFloat(a.replace(/<[^<]*>/, "")); b=parseFloat(b.replace(/<[^<]*>/, "")); return (a>b) ? -1 : (a<b ? 1 : 0);};
101
	
102
				var adminTasksTable = jQuery("#'.$table_id.'").DataTable({
103
					'.I18N::datatablesI18N().',			
104
					sorting: [[3, "asc"]],
105
					pageLength: 10,
106
                    processing: true,
107
                    serverSide : true,
108
					ajax : {
109
						url : "module.php?mod='.$this->module->getName().'&mod_action=AdminConfig@jsonTasksList&ged='. $tree->getNameUrl().'",
110
                        type : "POST"
111
					},
112
                    columns: [
113
						/* 0 Edit		 	*/ { sortable: false, className: "text-center"},
114
                        /* 1 task_name      */ { visible: false },
115
						/* 2 Enabled 		*/ { sortable: false, className: "text-center"  },
116
						/* 3 Task Title		*/ null,
117
						/* 4 Last Run		*/ null,
118
						/* 5 Last status 	*/ { className: "text-center" },
119
						/* 6 Frequency      */ { sortable: false, className: "text-center" },
120
						/* 7 Nb Occcurrences*/ { sortable: false, className: "text-center" },
121
						/* 8 Is Running    	*/ { sortable: false, className: "text-center" },					
122
						/* 9 Run task		*/ { sortable: false, className: "text-center" }
123
					],
124
				});
125
                
126
                ')
127
                ->addInlineJavascript('					
128
					function generate_force_token() {
129
						jQuery("#bt_genforcetoken").attr("disabled", "disabled");
130
						jQuery("#bt_tokentext").empty().html("<i class=\"fa fa-spinner fa-pulse fa-fw\"></i>");
131
						jQuery("#token_url").load(
132
							"module.php?mod='.$this->module->getName().'&mod_action=AdminConfig@generateToken",
133
							function() {
134
								jQuery("#bt_genforcetoken").removeAttr("disabled");
135
								jQuery("#bt_tokentext").empty().html("'.I18N::translate('Regenerate token').'");
136
                                adminTasksTable.ajax.reload();
137
							}
138
						);
139
					}
140
				
141
                    function set_admintask_status(task, status) {
142
                		jQuery.ajax({
143
                            url: "module.php", 
144
                            type: "GET",
145
                            data: {
146
                			    mod: "' . $this->module->getName() .'",
147
                                mod_action:  "Task@setStatus",
148
                			    task: task,
149
                                status: status
150
                            },
151
                            error: function(result, stat, error) {
152
                                var err = typeof result.responseJSON === "undefined" ? error : result.responseJSON.error;
153
                                alert("' . I18N::translate('An error occured while editing this task:') . '" + err);
154
                            },
155
                            complete: function(result, stat) {
156
                                adminTasksTable.ajax.reload(null, false);
157
                            }                            
158
                		});
159
                    } 
160
                    
161
                    function run_admintask(taskname) {
162
                        jQuery("#bt_runtask_" + taskname).attr("disabled", "disabled");
163
				        jQuery("#bt_runtasktext_" + taskname).empty().html("<i class=\"fa fa-cog fa-spin fa-fw\"></i><span class=\"sr-only\">'.I18N::translate('Running').'</span>");
164
				        jQuery("#bt_runtasktext_" + taskname).load(
165
					       "module.php?mod='.$this->module->getName().'&mod_action=Task@trigger&force='.$token.'&task=" + taskname,
166
        					function() {
167
        						jQuery("#bt_runtasktext_" + taskname).empty().html("<i class=\"fa fa-check\"></i>'.I18N::translate('Done').'");
168
        						adminTasksTable.ajax.reload();
169
        					}
170
				        );
171
                    
172
                    } 
173
                ');
174
        
175
        ViewFactory::make('AdminConfig', $this, $controller, $data)->render();
176
    }
177
    
178
    /**
179
     * AdminConfig@jsonTasksList
180
     */
181
    public function jsonTasksList() {    
182
        $controller = new JsonController();
183
        $controller
184
            ->restrictAccess(Auth::isAdmin());
185
    
186
        // Generate an AJAX/JSON response for datatables to load a block of rows
187
        $search = Filter::postArray('search');
188
        if($search) $search = $search['value'];
0 ignored issues
show
Bug Best Practice introduced by
The expression $search of type string[] is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
189
        $start  = Filter::postInteger('start');
190
        $length = Filter::postInteger('length');
191
        $order  = Filter::postArray('order');
192
    
193
		$order_by_name = false;
194
        foreach($order as $key => &$value) {
195
            switch($value['column']) {
196
                case 3:
197
					$order_by_name = true;
198
                    unset($order[$key]);
199
                    break;
200
                case 4;
201
					$value['column'] = 'majat_last_run';
202
					break;
203
				case 4;
204
					$value['column'] = 'majat_last_result';
205
					break;
206
                default:
207
                    unset($order[$key]);
208
            }
209
        }
210
    
211
        $list = $this->provider->getFilteredTasksList($search, $order, $start, $length);
0 ignored issues
show
Bug introduced by
It seems like $search can also be of type string[]; however, parameter $search of MyArtJaub\Webtrees\Modul...:getFilteredTasksList() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

211
        $list = $this->provider->getFilteredTasksList(/** @scrutinizer ignore-type */ $search, $order, $start, $length);
Loading history...
212
		if($order_by_name) {
213
			usort($list, function(AbstractTask $a, AbstractTask $b) { return I18N::strcasecmp($a->getTitle(), $b->getTitle()); });
214
		}
215
        $recordsFiltered = count($list);
216
        $recordsTotal = $this->provider->getTasksCount();
217
    
218
        $data = array();
219
        foreach($list as $task) {    
220
            $datum = array();
221
			
222
            $datum[0] = '
223
                <div class="btn-group">
224
                    <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
225
                        <i class="fa fa-pencil"></i><span class="caret"></span>
226
                    </button>
227
                    <ul class="dropdown-menu" role="menu">
228
                       <li>
229
                            <a href="#" onclick="return set_admintask_status(\''. $task->getName().'\', '.($task->isEnabled() ? 'false' : 'true').');">
230
                                <i class="fa fa-fw '.($task->isEnabled() ? 'fa-times' : 'fa-check').'"></i> ' . ($task->isEnabled() ? I18N::translate('Disable') : I18N::translate('Enable')) . '
231
                            </a>
232
                       </li>
233
                        <li>
234
                            <a href="module.php?mod='.$this->module->getName().'&mod_action=Task@edit&task='. $task->getName().'">
235
                                <i class="fa fa-fw fa-pencil"></i> ' . I18N::translate('Edit') . '
236
                            </a>
237
                       </li>
238
                    </ul>
239
                </div>';
240
            $datum[1] = $task->getName();
241
            $datum[2] = $task->isEnabled() ? 
242
				'<i class="fa fa-check"></i><span class="sr-only">'.I18N::translate('Enabled').'</span>' : 
243
				'<i class="fa fa-times"></i><span class="sr-only">'.I18N::translate('Disabled').'</span>';
244
            $datum[3] = $task->getTitle();
245
            $date_format = str_replace('%', '', I18N::dateFormat()) . ' H:i:s';
246
			$datum[4] = $task->getLastUpdated()->format($date_format);
247
            $datum[5] = $task->isLastRunSuccess() ? 
248
				'<i class="fa fa-check"></i><span class="sr-only">'.I18N::translate('Yes').'</span>' : 
249
				'<i class="fa fa-times"></i><span class="sr-only">'.I18N::translate('No').'</span>';
250
            $dtF = new \DateTime('@0');
251
            $dtT = new \DateTime('@' . ($task->getFrequency() * 60));            
252
            $datum[6] = $dtF->diff($dtT)->format(I18N::translate('%a d %h h %i m'));
253
			$datum[7] = $task->getRemainingOccurrences() > 0 ? I18N::number($task->getRemainingOccurrences()) : I18N::translate('Unlimited');
254
			$datum[8] = $task->isRunning() ? 
255
				'<i class="fa fa-cog fa-spin fa-fw"></i><span class="sr-only">'.I18N::translate('Running').'</span>' : 
256
				'<i class="fa fa-times"></i><span class="sr-only">'.I18N::translate('Not running').'</span>';
257
			if($task->isEnabled() && !$task->isRunning()) {
258
			    $datum[9] = '
259
    			    <button id="bt_runtask_'. $task->getName() .'" class="btn btn-primary" href="#" onclick="return run_admintask(\''. $task->getName() .'\')">
260
    			         <div id="bt_runtasktext_'. $task->getName() .'"><i class="fa fa-cog fa-fw" ></i>' . I18N::translate('Run') . '</div>
261
    			    </button>';
262
			}
263
			else {
264
			    $datum[9] = '';
265
			}			    
266
						
267
            $data[] = $datum;
268
        }
269
    
270
        $controller->pageHeader();
271
    
272
        $controller->encode(array(
273
            'draw'            => Filter::getInteger('draw'),
274
            'recordsTotal'    => $recordsTotal,
275
            'recordsFiltered' => $recordsFiltered,
276
            'data'            => $data
277
        ));
278
    
279
    }
280
		
281
	/**
282
	 * AdminConfig@generateToken
283
     *
284
	 * Ajax call to generate a new token. Display the token, if generated.
285
	 * Tokens call only be generated by a site administrator.
286
	 *
287
	 */
288
	public function generateToken()
289
	{
290
		$controller = new AjaxController();
291
		$controller->restrictAccess(Auth::isAdmin());
292
		
293
		$token = Functions::generateRandomToken();		
294
		$this->module->setSetting('MAJ_AT_FORCE_EXEC_TOKEN', $token);
295
		Log::addConfigurationLog($this->module->getTitle().' : New token generated.');
296
		
297
		$controller->pageHeader();
298
		echo $token;
299
	}
300
	
301
	
302
    
303
    
304
}