Add endpoints for re-ordering elements, add arrows to page
This commit is contained in:
parent
25922d99f3
commit
add02b208d
@ -51,7 +51,7 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
|
|||||||
<th>Text</th>
|
<th>Text</th>
|
||||||
<th>Subtext</th>
|
<th>Subtext</th>
|
||||||
<th>Image URL / Font Icon</th>
|
<th>Image URL / Font Icon</th>
|
||||||
<th>Place</th>
|
<th>URL</th>
|
||||||
<th>Actions</th>
|
<th>Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@ -193,7 +193,7 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
|
|||||||
<p style="display: none" id="lang_no_custom_nav_elements_found"><?php echo $hesklang['no_custom_nav_elements_found']; ?></p>
|
<p style="display: none" id="lang_no_custom_nav_elements_found"><?php echo $hesklang['no_custom_nav_elements_found']; ?></p>
|
||||||
<script type="text/html" id="nav-element-template">
|
<script type="text/html" id="nav-element-template">
|
||||||
<tr>
|
<tr>
|
||||||
<td><span data-property="id"></span></td>
|
<td><span data-property="id" data-value="x"></span></td>
|
||||||
<td><span>
|
<td><span>
|
||||||
<ul data-property="text" class="list-unstyled"></ul>
|
<ul data-property="text" class="list-unstyled"></ul>
|
||||||
</span></td>
|
</span></td>
|
||||||
@ -201,15 +201,24 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
|
|||||||
<ul data-property="subtext" class="list-unstyled"></ul>
|
<ul data-property="subtext" class="list-unstyled"></ul>
|
||||||
</span></td>
|
</span></td>
|
||||||
<td><span data-property="image-or-font"></span></td>
|
<td><span data-property="image-or-font"></span></td>
|
||||||
<td style="display: none"><span data-property="place-id"></span></td>
|
<td><span data-property="url"></span></td>
|
||||||
<td><span data-property="place"></span></td>
|
|
||||||
<td>
|
<td>
|
||||||
<a href="#" data-action="edit">
|
<a href="#" data-action="edit">
|
||||||
<i class="fa fa-pencil icon-link orange"
|
<i class="fa fa-fw fa-pencil icon-link orange"
|
||||||
data-toggle="tooltip" title="<?php echo $hesklang['edit']; ?>"></i>
|
data-toggle="tooltip" title="<?php echo $hesklang['edit']; ?>"></i>
|
||||||
</a>
|
</a>
|
||||||
|
<a href="#" data-action="sort"
|
||||||
|
data-direction="up">
|
||||||
|
<i class="fa fa-fw fa-arrow-up icon-link green"
|
||||||
|
data-toggle="tooltip" title="<?php echo $hesklang['move_up']; ?>"></i>
|
||||||
|
</a>
|
||||||
|
<a href="#" data-action="sort"
|
||||||
|
data-direction="down">
|
||||||
|
<i class="fa fa-fw fa-arrow-down icon-link green"
|
||||||
|
data-toggle="tooltip" title="<?php echo $hesklang['move_dn'] ?>"></i>
|
||||||
|
</a>
|
||||||
<a href="#" data-action="delete">
|
<a href="#" data-action="delete">
|
||||||
<i class="fa fa-times icon-link red"
|
<i class="fa fa-fw fa-times icon-link red"
|
||||||
data-toggle="tooltip" title="<?php echo $hesklang['delete']; ?>"></i>
|
data-toggle="tooltip" title="<?php echo $hesklang['delete']; ?>"></i>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
|
@ -21,4 +21,10 @@ class CustomNavElement {
|
|||||||
|
|
||||||
/* @var $place int */
|
/* @var $place int */
|
||||||
public $place;
|
public $place;
|
||||||
|
|
||||||
|
/* @var $url string */
|
||||||
|
public $url;
|
||||||
|
|
||||||
|
/* @var $sort int */
|
||||||
|
public $sort;
|
||||||
}
|
}
|
@ -31,6 +31,7 @@ class CustomNavElementHandler {
|
|||||||
|
|
||||||
function deleteCustomNavElement($id, $heskSettings) {
|
function deleteCustomNavElement($id, $heskSettings) {
|
||||||
$this->customNavElementGateway->deleteCustomNavElement($id, $heskSettings);
|
$this->customNavElementGateway->deleteCustomNavElement($id, $heskSettings);
|
||||||
|
$this->customNavElementGateway->resortAllElements($heskSettings);
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveCustomNavElement($element, $heskSettings) {
|
function saveCustomNavElement($element, $heskSettings) {
|
||||||
@ -38,6 +39,23 @@ class CustomNavElementHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function createCustomNavElement($element, $heskSettings) {
|
function createCustomNavElement($element, $heskSettings) {
|
||||||
return $this->customNavElementGateway->createCustomNavElement($element, $heskSettings);
|
$element = $this->customNavElementGateway->createCustomNavElement($element, $heskSettings);
|
||||||
|
$this->customNavElementGateway->resortAllElements($heskSettings);
|
||||||
|
|
||||||
|
return $element;
|
||||||
|
}
|
||||||
|
|
||||||
|
function sortCustomNavElement($elementId, $direction, $heskSettings) {
|
||||||
|
/* @var $element CustomNavElement */
|
||||||
|
$element = $this->customNavElementGateway->getAllCustomNavElements($heskSettings)[$elementId];
|
||||||
|
|
||||||
|
if ($direction === 'up') {
|
||||||
|
$element->sort -= 15;
|
||||||
|
} else {
|
||||||
|
$element->sort += 15;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->customNavElementGateway->saveCustomNavElement($element, $heskSettings);
|
||||||
|
$this->customNavElementGateway->resortAllElements($heskSettings);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -21,6 +21,17 @@ class CustomNavElementController extends InternalApiController {
|
|||||||
output($handler->getAllCustomNavElements($hesk_settings));
|
output($handler->getAllCustomNavElements($hesk_settings));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static function sort($id, $direction) {
|
||||||
|
global $applicationContext, $hesk_settings;
|
||||||
|
|
||||||
|
self::staticCheckForInternalUseOnly();
|
||||||
|
|
||||||
|
/* @var $handler CustomNavElementHandler */
|
||||||
|
$handler = $applicationContext->get[CustomNavElementHandler::class];
|
||||||
|
|
||||||
|
$handler->sortCustomNavElement($id, $direction, $hesk_settings);
|
||||||
|
}
|
||||||
|
|
||||||
function get($id) {
|
function get($id) {
|
||||||
global $applicationContext, $hesk_settings;
|
global $applicationContext, $hesk_settings;
|
||||||
|
|
||||||
@ -81,6 +92,8 @@ class CustomNavElementController extends InternalApiController {
|
|||||||
$element->imageUrl = Helpers::safeArrayGet($data, 'imageUrl');
|
$element->imageUrl = Helpers::safeArrayGet($data, 'imageUrl');
|
||||||
$element->text = Helpers::safeArrayGet($data, 'text');
|
$element->text = Helpers::safeArrayGet($data, 'text');
|
||||||
$element->subtext = Helpers::safeArrayGet($data, 'subtext');
|
$element->subtext = Helpers::safeArrayGet($data, 'subtext');
|
||||||
|
$element->url = Helpers::safeArrayGet($data, 'url');
|
||||||
|
$element->sort = intval(Helpers::safeArrayGet($data, 'sort'));
|
||||||
|
|
||||||
return $element;
|
return $element;
|
||||||
}
|
}
|
||||||
|
@ -117,11 +117,16 @@ class CustomNavElementGateway extends CommonDao {
|
|||||||
function createCustomNavElement($element, $heskSettings) {
|
function createCustomNavElement($element, $heskSettings) {
|
||||||
$this->init();
|
$this->init();
|
||||||
|
|
||||||
|
$rs = hesk_dbQuery("SELECT MAX(`sort`) FROM `" . hesk_dbEscape($heskSettings['db_pfix']) . "custom_nav_element`
|
||||||
|
WHERE `place` = " . intval($element->place));
|
||||||
|
$maxSort = hesk_dbFetchAssoc($rs);
|
||||||
|
$sortValue = intval($maxSort['sort']) + 1;
|
||||||
|
|
||||||
$imageUrl = $element->imageUrl == null ? 'NULL' : "'" . hesk_dbEscape($element->imageUrl) . "'";
|
$imageUrl = $element->imageUrl == null ? 'NULL' : "'" . hesk_dbEscape($element->imageUrl) . "'";
|
||||||
$fontIcon = $element->fontIcon == null ? 'NULL' : "'" . hesk_dbEscape($element->fontIcon) . "'";
|
$fontIcon = $element->fontIcon == null ? 'NULL' : "'" . hesk_dbEscape($element->fontIcon) . "'";
|
||||||
hesk_dbQuery("INSERT INTO `" . hesk_dbEscape($heskSettings['db_pfix']) . "custom_nav_element`
|
hesk_dbQuery("INSERT INTO `" . hesk_dbEscape($heskSettings['db_pfix']) . "custom_nav_element`
|
||||||
(`image_url`, `font_icon`, `place`)
|
(`image_url`, `font_icon`, `place`, `sort`)
|
||||||
VALUES ({$imageUrl}, {$fontIcon}, " . intval($element->place) . ")");
|
VALUES ({$imageUrl}, {$fontIcon}, " . intval($element->place) . ", " . $sortValue . ")");
|
||||||
|
|
||||||
$element->id = hesk_dbInsertID();
|
$element->id = hesk_dbInsertID();
|
||||||
|
|
||||||
@ -150,4 +155,23 @@ class CustomNavElementGateway extends CommonDao {
|
|||||||
|
|
||||||
return $element;
|
return $element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function resortAllElements($heskSettings) {
|
||||||
|
$this->init();
|
||||||
|
|
||||||
|
$rs = hesk_dbQuery("SELECT `id` FROM `" . hesk_dbEscape($heskSettings['db_pfix']) . "custom_nav_element`
|
||||||
|
ORDER BY `place` ASC, `sort` ASC");
|
||||||
|
|
||||||
|
$sortValue = 10;
|
||||||
|
while ($row = hesk_dbFetchAssoc($rs)) {
|
||||||
|
hesk_dbQuery("UPDATE `" . hesk_dbEscape($heskSettings['db_pfix']) . "custom_nav_element`
|
||||||
|
SET `sort` = " . intval($sortValue) . "
|
||||||
|
WHERE `id` = " . intval($row['id']));
|
||||||
|
|
||||||
|
$sortValue += 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->close();
|
||||||
|
}
|
||||||
}
|
}
|
@ -190,6 +190,7 @@ Link::all(array(
|
|||||||
'/v1-internal/custom-navigation/all' => \Controllers\Navigation\CustomNavElementController::class . '::getAll',
|
'/v1-internal/custom-navigation/all' => \Controllers\Navigation\CustomNavElementController::class . '::getAll',
|
||||||
'/v1-internal/custom-navigation' => \Controllers\Navigation\CustomNavElementController::class,
|
'/v1-internal/custom-navigation' => \Controllers\Navigation\CustomNavElementController::class,
|
||||||
'/v1-internal/custom-navigation/{i}' => \Controllers\Navigation\CustomNavElementController::class,
|
'/v1-internal/custom-navigation/{i}' => \Controllers\Navigation\CustomNavElementController::class,
|
||||||
|
'/v1-internal/custom-navigation/{i}/sort/{s}' => \Controllers\Navigation\CustomNavElementController::class . '::sort',
|
||||||
|
|
||||||
// Any URL that doesn't match goes to the 404 handler
|
// Any URL that doesn't match goes to the 404 handler
|
||||||
'404' => 'handle404'
|
'404' => 'handle404'
|
||||||
|
@ -998,6 +998,7 @@ function execute310Scripts() {
|
|||||||
image_url TEXT,
|
image_url TEXT,
|
||||||
font_icon VARCHAR(200),
|
font_icon VARCHAR(200),
|
||||||
place INT NOT NULL,
|
place INT NOT NULL,
|
||||||
|
url VARCHAR(500) NOT NULL,
|
||||||
sort INT NOT NULL)");
|
sort INT NOT NULL)");
|
||||||
executeQuery("CREATE TABLE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "custom_nav_element_to_text`
|
executeQuery("CREATE TABLE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "custom_nav_element_to_text`
|
||||||
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
@ -125,29 +125,38 @@ function loadTable(modalToClose) {
|
|||||||
$('#table-body').append('<tr><td colspan="6" class="bg-gray"><i><b>' + places[1] + '</b></i></td></tr>');
|
$('#table-body').append('<tr><td colspan="6" class="bg-gray"><i><b>' + places[1] + '</b></i></td></tr>');
|
||||||
var currentPlace = 1;
|
var currentPlace = 1;
|
||||||
var addedElementToPlace = false;
|
var addedElementToPlace = false;
|
||||||
|
var first = true;
|
||||||
|
var lastElement = null;
|
||||||
$.each(data, function() {
|
$.each(data, function() {
|
||||||
if (this.place !== currentPlace) {
|
if (this.place !== currentPlace) {
|
||||||
if (!addedElementToPlace) {
|
if (!addedElementToPlace) {
|
||||||
$('#table-body').append('<tr><td colspan="6">' + notFoundText + '</td></tr>');
|
$('#table-body').append('<tr><td colspan="6">' + notFoundText + '</td></tr>');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lastElement !== null) {
|
||||||
|
//-- Hide the down arrow on the last element
|
||||||
|
$('[data-value="' + lastElement.id + '"]').parent().parent()
|
||||||
|
.find('[data-direction="down"]').find('i').removeClass('fa-arrow-down');
|
||||||
|
lastElement = null;
|
||||||
|
}
|
||||||
|
|
||||||
$('#table-body').append('<tr><td colspan="6" class="bg-gray"><i><b>' + places[this.place] + '</b></i></td></tr>');
|
$('#table-body').append('<tr><td colspan="6" class="bg-gray"><i><b>' + places[this.place] + '</b></i></td></tr>');
|
||||||
currentPlace = this.place;
|
currentPlace = this.place;
|
||||||
console.log(this);
|
console.log(this);
|
||||||
addedElementToPlace = false;
|
addedElementToPlace = false;
|
||||||
|
first = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var $template = $($('#nav-element-template').html());
|
var $template = $($('#nav-element-template').html());
|
||||||
|
|
||||||
$template.find('span[data-property="id"]').text(this.id);
|
$template.find('span[data-property="id"]').text(this.id).attr('data-value', this.id);
|
||||||
if (this.imageUrl === null) {
|
if (this.imageUrl === null) {
|
||||||
$template.find('span[data-property="image-or-font"]').html('<i class="' + escape(this.fontIcon) + '"></i>');
|
$template.find('span[data-property="image-or-font"]').html('<i class="' + escape(this.fontIcon) + '"></i>');
|
||||||
} else {
|
} else {
|
||||||
$template.find('span[data-property="image-or-font"]').text(this.imageUrl);
|
$template.find('span[data-property="image-or-font"]').text(this.imageUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
$template.find('span[data-property="place"]').text(places[this.place]);
|
$template.find('span[data-property="url"]').text(places[this.url]);
|
||||||
$template.find('span[data-property="place-id"]').text(this.place);
|
|
||||||
|
|
||||||
var text = '';
|
var text = '';
|
||||||
$.each(this.text, function(key, value) {
|
$.each(this.text, function(key, value) {
|
||||||
@ -164,11 +173,17 @@ function loadTable(modalToClose) {
|
|||||||
}
|
}
|
||||||
$template.find('ul[data-property="subtext"]').html(subtext);
|
$template.find('ul[data-property="subtext"]').html(subtext);
|
||||||
|
|
||||||
|
if (first) {
|
||||||
|
$template.find('[data-direction="up"]').find('i').removeClass('fa-arrow-up');
|
||||||
|
first = false;
|
||||||
|
}
|
||||||
|
|
||||||
$('#table-body').append($template);
|
$('#table-body').append($template);
|
||||||
|
|
||||||
elements[this.id] = this;
|
elements[this.id] = this;
|
||||||
|
|
||||||
addedElementToPlace = true;
|
addedElementToPlace = true;
|
||||||
|
lastElement = this;
|
||||||
});
|
});
|
||||||
|
|
||||||
//-- Add missing headers if no elements are in them
|
//-- Add missing headers if no elements are in them
|
||||||
@ -181,6 +196,12 @@ function loadTable(modalToClose) {
|
|||||||
$('#table-body').append('<tr><td colspan="6">' + notFoundText + '</td></tr>');
|
$('#table-body').append('<tr><td colspan="6">' + notFoundText + '</td></tr>');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lastElement) {
|
||||||
|
//-- Hide the down arrow on the last element
|
||||||
|
$('[data-value="' + lastElement.id + '"]').parent().parent()
|
||||||
|
.find('[data-direction="down"]').find('i').removeClass('fa-arrow-down');
|
||||||
|
}
|
||||||
|
|
||||||
if (modalToClose !== undefined) {
|
if (modalToClose !== undefined) {
|
||||||
modalToClose.modal('hide');
|
modalToClose.modal('hide');
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user