Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion htdocs/core/js/lib_head.js.php
Original file line number Diff line number Diff line change
Expand Up @@ -1321,7 +1321,7 @@ function price2numjs(amount) {


jQuery(document).ready(function() {
jQuery(".butAction.dropdown-toggle").on("click", function(event) {
jQuery(document).on("click", ".butAction.dropdown-toggle", function(event) {
console.log("Click on .butAction.dropdown-toggle");
var parentholder = jQuery(".butAction.dropdown-toggle").closest(".dropdown");
var offset = parentholder.offset();
Expand Down
51 changes: 44 additions & 7 deletions htdocs/core/lib/functions.lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -12291,6 +12291,39 @@ function dolGetButtonAction($label, $text = '', $actionType = 'default', $url =

// If $url is an array, we must build a dropdown button or recursively iterate over each value
if (is_array($url)) {

/**
* An anonymous function to complete dropdown url
* @param string $url
* @return string
*/
$completeUrl = function ($url) use ($params) {
if (empty($url)) {
return '';
}

$parsedUrl = parse_url($url);
if (isset($parsedUrl['scheme']) && $parsedUrl['scheme'] === 'javascript') {
return $url;
}

if (!empty($parsedUrl['query'])) {
// Use parse_str() function to parse the string passed via URL
parse_str($parsedUrl['query'], $urlQuery);
if (!isset($urlQuery['backtopage']) && isset($params['backtopage'])) {
$url.= '&backtopage='.urlencode($params['backtopage']);
}
}

// TODO : this is a first fix of button behavior : external module will needs to use http:// or https:// prefix on there Urls
if (!isset($parsedUrl['scheme'])) {
$url = DOL_URL_ROOT.$url;
}

return $url;
};
Comment on lines +12295 to +12324
Copy link
Contributor Author

@thersane-john thersane-john Oct 3, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@eldy I think you've misunderstood what I mean with this function.
In some case if href attribute of link start with javascript: because a link can have differrent sheme like

  • http:
  • https:
  • javascript:
  • maito: (I doesn't check this one yet)
  • # (I doesn't check this one yet)

but in all cases the code force to add &backtopage= to url. Also the actual dolibarr code doesn't check if query already contain backtopage param.

see this pull request of subtotal module and search javascript: to get a usecase.

to restart on good bases of code, I will recreate 2 separated PRs

  • first to fix ajax loaded BTN
  • secondly to allow deactivation of &backtopage=



// Loop on $url array to remove entries of disabled modules
foreach ($url as $key => $subbutton) {
if (isset($subbutton['enabled']) && empty($subbutton['enabled'])) {
Expand All @@ -12311,13 +12344,15 @@ function dolGetButtonAction($label, $text = '', $actionType = 'default', $url =
$tmpUrl = DOL_URL_ROOT.$button['url'].(empty($params['backtopage']) ? '' : '&backtopage='.urlencode($params['backtopage']));
$id = $button['id'] ?? '';
$userRight = $button['perm'] ?? 1;
$params = $button['params'] ?? [];
$button['params'] = $button['params'] ?? [];

$out .= dolGetButtonAction($label, $text, $actionType, $tmpUrl, $id, $userRight, $params);
$out .= dolGetButtonAction($label, $text, $actionType, $tmpUrl, $id, $userRight, $button['params']);
}
return $out;
}



if (count($url) > 1) {
$out .= '<div class="dropdown inline-block dropdown-holder">';
$out .= '<a style="margin-right: auto;" class="dropdown-toggle classfortooltip butAction'.($userRight ? '' : 'Refused').'" title="'.dol_escape_htmltag($label).'" data-toggle="dropdown">'.($text ? $text : $label).'</a>';
Expand All @@ -12326,8 +12361,12 @@ function dolGetButtonAction($label, $text = '', $actionType = 'default', $url =
if (!empty($subbutton['lang'])) {
$langs->load($subbutton['lang']);
}
$tmpurl = DOL_URL_ROOT.$subbutton['url'].(empty($params['backtopage']) ? '' : '&amp;backtopage='.urlencode($params['backtopage']));
$out .= dolGetButtonAction('', $langs->trans($subbutton['label']), 'default', $tmpurl, '', $subbutton['perm'], array('isDropDown' => true));

if (!isset($subbutton['params'])) {
$subbutton['params'] = array();
}
$subbutton['params']['isDropdown'] = true;
$out .= dolGetButtonAction('', $langs->trans($subbutton['label']), 'default', $completeUrl($subbutton['url']), $subbutton['id'] ?? '', $subbutton['perm'], $subbutton['params']);
}
$out .= "</div>";
$out .= "</div>";
Expand All @@ -12336,16 +12375,14 @@ function dolGetButtonAction($label, $text = '', $actionType = 'default', $url =
if (!empty($subbutton['lang'])) {
$langs->load($subbutton['lang']);
}
$tmpurl = DOL_URL_ROOT.$subbutton['url'].(empty($params['backtopage']) ? '' : '&amp;backtopage='.urlencode($params['backtopage']));
$out .= dolGetButtonAction('', $langs->trans($subbutton['label']), 'default', $tmpurl, '', $subbutton['perm']);
$out .= dolGetButtonAction('', $langs->trans($subbutton['label']), 'default', $completeUrl($subbutton['url']), '', $subbutton['perm']);
}
}

return $out;
}

// Here, $url is a simple link

if (!empty($params['isDropdown'])) {
$class = "dropdown-item";
} else {
Expand Down