mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-19 16:02:15 +00:00
- Added new phrases fot the extension manager
- Renamed uploadExtension to installExtension in application/controllers/system/extensions/CLI_Manager.php - Adapted controller system/extensions/Manager.php to use FHC_Controller functionalities - Changed controller system/extensions/Manager->uploadExtension to get parameters from HTTP post and HTTP file - Changed view system/extensions/manager.php to use templates/FHC-Header, ajaxlib, tablewidget, phrases and the CI upload library - Added new column type array to application/widgets/TableWidget.php - Added new type boolean to the public/js/AjaxLib.js result when checked by the hasData method - Added new JS public/js/ExtensionsManager.js that contains the extensions manager JS - Added new view system/extensions/tableWidget.php to display the extensions manager TableWidget
This commit is contained in:
@@ -11,8 +11,8 @@ class CLI_Manager extends CLI_Controller
|
||||
*
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
// Load helpers to upload files
|
||||
$this->load->helper('form');
|
||||
@@ -30,8 +30,9 @@ class CLI_Manager extends CLI_Controller
|
||||
* @param $filename Url Encoded Pfad zum tgz File der Extension
|
||||
* @param $perform_sql boolean ob die SQL Befehle ausgeführt werden
|
||||
*/
|
||||
public function uploadExtension($extensionName = null, $filename = null, $perform_sql = true)
|
||||
public function installExtension($extensionName, $filename, $perform_sql = true)
|
||||
{
|
||||
$this->extensionslib->installExtension($extensionName, urldecode($filename), $perform_sql);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,8 +11,8 @@ class Manager extends Auth_Controller
|
||||
*
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct(
|
||||
{
|
||||
parent::__construct(
|
||||
array(
|
||||
'index' => 'system/extensions:r',
|
||||
'toggleExtension' => 'system/extensions:rw',
|
||||
@@ -21,11 +21,20 @@ class Manager extends Auth_Controller
|
||||
)
|
||||
);
|
||||
|
||||
// Load helpers to upload files
|
||||
// Loads the form helper
|
||||
$this->load->helper('form');
|
||||
|
||||
// Loads WidgetLib
|
||||
$this->load->library('WidgetLib');
|
||||
|
||||
// Loads the extensions library
|
||||
$this->load->library('ExtensionsLib');
|
||||
|
||||
$this->loadPhrases(
|
||||
array(
|
||||
'extensions'
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -50,7 +59,7 @@ class Manager extends Auth_Controller
|
||||
$extension_id = $this->input->post('extension_id');
|
||||
$enabled = $this->input->post('enabled');
|
||||
|
||||
if ($enabled === 'true')
|
||||
if ($enabled === true)
|
||||
{
|
||||
$toggleExtension = $this->extensionslib->enableExtension($extension_id);
|
||||
}
|
||||
@@ -59,9 +68,7 @@ class Manager extends Auth_Controller
|
||||
$toggleExtension = $this->extensionslib->disableExtension($extension_id);
|
||||
}
|
||||
|
||||
$this->output
|
||||
->set_content_type('application/json')
|
||||
->set_output(json_encode($toggleExtension));
|
||||
$this->outputJsonSuccess($toggleExtension);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -69,15 +76,11 @@ class Manager extends Auth_Controller
|
||||
*/
|
||||
public function delExtension()
|
||||
{
|
||||
$delExtension = false;
|
||||
|
||||
$extension_id = $this->input->post('extension_id');
|
||||
|
||||
$delExtension = $this->extensionslib->delExtension($extension_id);
|
||||
|
||||
$this->output
|
||||
->set_content_type('application/json')
|
||||
->set_output(json_encode($delExtension));
|
||||
$this->outputJsonSuccess($delExtension);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -89,11 +92,11 @@ class Manager extends Auth_Controller
|
||||
* @param $filename Url Encoded Pfad zum tgz File der Extension
|
||||
* @param $perform_sql boolean ob die SQL Befehle ausgeführt werden
|
||||
*/
|
||||
public function uploadExtension($extensionName = null, $filename = null, $perform_sql = true)
|
||||
public function uploadExtension()
|
||||
{
|
||||
$perform_sql = $this->input->post('databasechange');
|
||||
$perform_sql = isset($perform_sql) ? false : true;
|
||||
$performSql = $this->input->post('performSql');
|
||||
|
||||
$this->extensionslib->installExtension($extensionName, urldecode($filename), $perform_sql);
|
||||
$this->extensionslib->installExtension(null, null, $performSql);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,174 +1,58 @@
|
||||
<?php $this->load->view('templates/header', array('title' => 'Extensions manager', 'jqueryV1' => true, 'tablesort' => true)); ?>
|
||||
<?php
|
||||
$this->load->view(
|
||||
'templates/FHC-Header',
|
||||
array(
|
||||
// Title
|
||||
'title' => 'Extensions manager',
|
||||
|
||||
<script type="text/javascript">
|
||||
// JS & CSS includes
|
||||
'jquery' => true,
|
||||
'jqueryui' => true,
|
||||
'jquerycheckboxes' => true,
|
||||
'bootstrap' => true,
|
||||
|
||||
$(document).ready(function() {
|
||||
// Styles includes
|
||||
'fontawesome' => true,
|
||||
'sbadmintemplate' => true,
|
||||
|
||||
$(".tablesorter").each(function(i, v) {
|
||||
|
||||
$("#" + v.id).tablesorter({
|
||||
widgets: ["zebra"],
|
||||
sortList: [[0, 0]],
|
||||
headers: {7: {sorter: false}}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
$(".chkbox").change(function() {
|
||||
|
||||
var chkId = $(this).context.name;
|
||||
var checked = $(this).prop("checked");
|
||||
|
||||
$.ajax({
|
||||
url: "<?php echo current_url(); ?>/toggleExtension",
|
||||
dataType: "json",
|
||||
type: "POST",
|
||||
data: {
|
||||
extension_id: chkId,
|
||||
enabled: checked
|
||||
},
|
||||
error: function(jqXHR, textStatus, errorThrown) {
|
||||
|
||||
alert("Error while saving data");
|
||||
},
|
||||
success: function(response, textStatus, jqXHR) {
|
||||
if (response != true)
|
||||
{
|
||||
alert("Error while saving data");
|
||||
}
|
||||
},
|
||||
complete: function() {
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
$(".lnkrm").click(function() {
|
||||
|
||||
var lnkId = $(this).context.name;
|
||||
|
||||
if (window.confirm('Are you really shure???') == true)
|
||||
{
|
||||
$.ajax({
|
||||
url: "<?php echo current_url(); ?>/delExtension",
|
||||
dataType: "json",
|
||||
type: "POST",
|
||||
data: {
|
||||
extension_id: lnkId
|
||||
},
|
||||
error: function(jqXHR, textStatus, errorThrown) {
|
||||
alert("Error while saving data");
|
||||
},
|
||||
success: function(response, textStatus, jqXHR) {
|
||||
if (response != true)
|
||||
{
|
||||
alert("Error while saving data");
|
||||
}
|
||||
},
|
||||
complete: function() {
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
// FHC JS & CSS includes
|
||||
'ajaxlib' => true,
|
||||
'dialoglib' => true,
|
||||
'tabulator' => true,
|
||||
'tablewidget' => true,
|
||||
'phrases' => array(
|
||||
'extensions'
|
||||
),
|
||||
'customJSs' => array('public/js/ExtensionsManager.js')
|
||||
)
|
||||
);
|
||||
?>
|
||||
|
||||
<body>
|
||||
<div>
|
||||
<h3 class="page-header">
|
||||
<?php echo $this->p->t('extensions', 'title'); ?>
|
||||
</h3>
|
||||
|
||||
<?php
|
||||
if (!hasData($extensions))
|
||||
{
|
||||
echo 'No extension installed!<br>';
|
||||
}
|
||||
elseif (isError($extensions))
|
||||
{
|
||||
echo 'An error occurred while retriving extenions list.';
|
||||
}
|
||||
elseif (hasData($extensions))
|
||||
{
|
||||
?>
|
||||
<div>
|
||||
<?php $this->load->view('system/extensions/tableWidget.php'); ?>
|
||||
</div>
|
||||
|
||||
<?php echo form_open_multipart(current_url().'/uploadExtension'); ?>
|
||||
<div>
|
||||
List of installed extensions
|
||||
<input type="file" name="extension" />
|
||||
<input type="button" id="uploadExtension" value="<?php echo $this->p->t('extensions', 'uploadExtension'); ?>" />
|
||||
</div>
|
||||
|
||||
<br>
|
||||
|
||||
<table class="tablesorter" id="t0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Description</th>
|
||||
<th>Server</th>
|
||||
<th>Version</th>
|
||||
<th>Licence</th>
|
||||
<th>URL</th>
|
||||
<th>Minimum required Core version</th>
|
||||
<th>Dependes on (extensions)</th>
|
||||
<th>Enabled</th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<?php
|
||||
$tableRow = '
|
||||
<tr>
|
||||
<td>%s</td>
|
||||
<td>%s</td>
|
||||
<td>%s</td>
|
||||
<td>%s</td>
|
||||
<td>%s</td>
|
||||
<td>%s</td>
|
||||
<td>%s</td>
|
||||
<td>%s</td>
|
||||
<td>
|
||||
<input type="checkbox" class="chkbox" name="%s" %s>
|
||||
</td>
|
||||
<td>
|
||||
<a href="#" name="%s" class="lnkrm" >Remove</a>
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
foreach ($extensions->retval as $key => $extension)
|
||||
{
|
||||
echo sprintf(
|
||||
$tableRow,
|
||||
$extension->name,
|
||||
$extension->description,
|
||||
$extension->server_kurzbz,
|
||||
$extension->version,
|
||||
$extension->license,
|
||||
$extension->url,
|
||||
$extension->core_version,
|
||||
count($extension->dependencies) == 0 ? 'None' : json_encode($extension->dependencies),
|
||||
$extension->extension_id,
|
||||
$extension->enabled === true ? 'checked' : '',
|
||||
$extension->extension_id
|
||||
);
|
||||
}
|
||||
?>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
|
||||
<br>
|
||||
|
||||
<?php echo form_open_multipart(current_url().'/uploadExtension'); ?>
|
||||
<input type="file" name="extension" />
|
||||
<input type="submit" value="Install/Update extension" /> <br/>
|
||||
<input type="checkbox" class="checkbox" id="databasechange" name="databasechange"/>
|
||||
<label for="databasechange">Don´t perform SQL</label>
|
||||
</form>
|
||||
<br/>
|
||||
|
||||
<div>
|
||||
<label for="performSql"><?php echo $this->p->t('extensions', 'performSql'); ?></label>
|
||||
<input type="checkbox" class="checkbox" id="performSql" name="performSql"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<?php $this->load->view('templates/footer'); ?>
|
||||
<?php $this->load->view('templates/FHC-Footer'); ?>
|
||||
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
$tableWidgetArray = array(
|
||||
'query' => '
|
||||
SELECT e.extension_id,
|
||||
e.name,
|
||||
e.description,
|
||||
e.server_kurzbz,
|
||||
e.version,
|
||||
e.license,
|
||||
e.url,
|
||||
e.core_version,
|
||||
e.dependencies,
|
||||
e.enabled
|
||||
FROM system.tbl_extensions e
|
||||
ORDER BY e.name ASC,
|
||||
e.server_kurzbz ASC,
|
||||
e.version ASC
|
||||
',
|
||||
'tableUniqueId' => 'extensionsListTableWidget',
|
||||
'requiredPermissions' => 'system/extensions',
|
||||
'datasetRepresentation' => 'tabulator',
|
||||
'additionalColumns' => array('Delete'),
|
||||
'columnsAliases' => array(
|
||||
'Extension ID',
|
||||
'Name',
|
||||
'Description',
|
||||
'Server',
|
||||
'Version',
|
||||
'License',
|
||||
'URL',
|
||||
'Core version',
|
||||
'Dependencies',
|
||||
'Enabled'
|
||||
),
|
||||
'formatRow' => function($datasetRaw) {
|
||||
|
||||
if ($datasetRaw->{'description'} == null)
|
||||
{
|
||||
$datasetRaw->{'description'} = '-';
|
||||
}
|
||||
|
||||
if ($datasetRaw->{'server_kurzbz'} == null)
|
||||
{
|
||||
$datasetRaw->{'server_kurzbz'} = '-';
|
||||
}
|
||||
|
||||
if ($datasetRaw->{'url'} == null)
|
||||
{
|
||||
$datasetRaw->{'url'} = '-';
|
||||
}
|
||||
|
||||
if ($datasetRaw->{'license'} == null)
|
||||
{
|
||||
$datasetRaw->{'license'} = '-';
|
||||
}
|
||||
|
||||
return $datasetRaw;
|
||||
},
|
||||
'datasetRepOptions' => '{
|
||||
height: "100%",
|
||||
layout: "fitColumns",
|
||||
persistentLayout: true,
|
||||
persistentSort: true,
|
||||
persistentFilter: true,
|
||||
autoResize: false
|
||||
}',
|
||||
'datasetRepFieldsDefs' => '{
|
||||
extension_id: {visible: false},
|
||||
url: {
|
||||
formatter: "link"
|
||||
},
|
||||
enabled: {
|
||||
aligh: "center",
|
||||
headerSort: false,
|
||||
editor: true,
|
||||
formatter: "tickCross",
|
||||
cellEdited: function(cell) {
|
||||
if (cell.getValue() != cell.getOldValue()) toggleExtension(cell.getData().extension_id, cell.getValue());
|
||||
}
|
||||
},
|
||||
Delete: {
|
||||
headerSort: false,
|
||||
formatter: "buttonCross",
|
||||
width: 100,
|
||||
align: "center",
|
||||
cellClick: function(e, cell) {
|
||||
deleteExtension(cell.getData().extension_id, cell.getRow());
|
||||
}
|
||||
}
|
||||
}'
|
||||
);
|
||||
|
||||
echo $this->widgetlib->widget('TableWidget', $tableWidgetArray);
|
||||
?>
|
||||
|
||||
@@ -381,6 +381,19 @@ class TableWidget extends Widget
|
||||
{
|
||||
$rawDatasetRow->{$columnName} = ($columnValue === true ? 'true' : 'false');
|
||||
}
|
||||
// if it is an array
|
||||
elseif (is_array($columnValue))
|
||||
{
|
||||
// Default is an empty string
|
||||
$rawDatasetRow->{$columnName} = '';
|
||||
|
||||
// For each element of the array
|
||||
foreach ($columnValue as $value)
|
||||
{
|
||||
$rawDatasetRow->{$columnName} .= $value."\n"; // concatenate each element of the array
|
||||
}
|
||||
}
|
||||
// if it is a date/timestamp
|
||||
elseif (DateTime::createFromFormat('Y-m-d H:i:s', $columnValue) !== false)
|
||||
{
|
||||
$rawDatasetRow->{$columnName} = date(self::DEFAULT_DATE_FORMAT, strtotime($columnValue));
|
||||
|
||||
@@ -96,16 +96,17 @@ var FHC_AjaxClient = {
|
||||
hasData: function(response) {
|
||||
var hasData = false;
|
||||
|
||||
if (FHC_AjaxClient.isSuccess(response))
|
||||
{
|
||||
if (FHC_AjaxClient.isSuccess(response))
|
||||
{
|
||||
if ((jQuery.type(response.retval) == "object" && !jQuery.isEmptyObject(response.retval))
|
||||
|| (jQuery.isArray(response.retval) && response.retval.length > 0)
|
||||
|| (jQuery.type(response.retval) == "string" && response.retval.trim() != "")
|
||||
|| jQuery.type(response.retval) == "number")
|
||||
|| jQuery.type(response.retval) == "number"
|
||||
|| jQuery.type(response.retval) == "boolean")
|
||||
{
|
||||
hasData = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return hasData;
|
||||
},
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
/**
|
||||
* FH-Complete
|
||||
*
|
||||
* @package
|
||||
* @author
|
||||
* @copyright Copyright (c) 2016-2021
|
||||
* @license GPLv3
|
||||
* @link https://fhcomplete.net
|
||||
* @since Version 1.0.0
|
||||
*/
|
||||
|
||||
/**
|
||||
* Toggle the status of an extension
|
||||
*/
|
||||
function toggleExtension(extensionId, enabled)
|
||||
{
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
"system/extensions/Manager/toggleExtension",
|
||||
{
|
||||
extension_id: extensionId,
|
||||
enabled: enabled
|
||||
},
|
||||
{
|
||||
successCallback: function(data, textStatus, jqXHR) {
|
||||
if (FHC_AjaxClient.hasData(data) && FHC_AjaxClient.getData(data) === true)
|
||||
{
|
||||
FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("extensions", "changeSuccess"));
|
||||
}
|
||||
else
|
||||
{
|
||||
FHC_DialogLib.alertError(FHC_PhrasesLib.t("extensions", "changeError"));
|
||||
}
|
||||
},
|
||||
errorCallback: function(data) {
|
||||
FHC_DialogLib.alertError(FHC_PhrasesLib.t("extensions", "changeError"));
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete an extension
|
||||
* cellRow: tabulator row reference
|
||||
*/
|
||||
function deleteExtension(extensionId, cellRow)
|
||||
{
|
||||
FHC_AjaxClient.ajaxCallPost(
|
||||
"system/extensions/Manager/delExtension",
|
||||
{
|
||||
extension_id: extensionId
|
||||
},
|
||||
{
|
||||
successCallback: function(data, textStatus, jqXHR) {
|
||||
if (FHC_AjaxClient.hasData(data) && FHC_AjaxClient.getData(data) === true)
|
||||
{
|
||||
cellRow.delete(); // delete the row from the tabulator
|
||||
FHC_DialogLib.alertSuccess(FHC_PhrasesLib.t("extensions", "changeSuccess"));
|
||||
}
|
||||
else
|
||||
{
|
||||
FHC_DialogLib.alertError(FHC_PhrasesLib.t("extensions", "changeError"));
|
||||
}
|
||||
},
|
||||
errorCallback: function() {
|
||||
FHC_DialogLib.alertError(FHC_PhrasesLib.t("extensions", "changeError"));
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* When JQuery is up
|
||||
*/
|
||||
$(document).ready(function() {
|
||||
|
||||
$("#uploadExtension").click(function() {
|
||||
$("form").submit();
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -896,3 +896,4 @@ $(document).ready(function() {
|
||||
FHC_TableWidget.display();
|
||||
|
||||
});
|
||||
|
||||
|
||||
+102
-3
@@ -25,7 +25,6 @@
|
||||
//flag for at least one new phrase
|
||||
$new = false;
|
||||
|
||||
|
||||
$phrases = array(
|
||||
//******************* CORE/global
|
||||
array(
|
||||
@@ -12472,6 +12471,106 @@ array(
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'extensions',
|
||||
'phrase' => 'title',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Extensions manager',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Extensions manager',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'extensions',
|
||||
'phrase' => 'uploadExtension',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Upload extension',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Upload extension',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'extensions',
|
||||
'phrase' => 'performSql',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Do not perform SQL',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Do not perform SQL',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'extensions',
|
||||
'phrase' => 'changeSuccess',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'The extension have been correctly changed',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'The extension have been correctly changed',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'extensions',
|
||||
'phrase' => 'changeError',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'An error occurred while changing the extension',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'An error occurred while changing the extension',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
);
|
||||
|
||||
|
||||
@@ -12594,5 +12693,5 @@ foreach ($phrases as $phrase)
|
||||
}
|
||||
}
|
||||
|
||||
if(!$new)
|
||||
echo '<b>Keine neuen Phrasen</b><br>';
|
||||
if (!$new) echo '<b>Keine neuen Phrasen</b><br>';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user