Hi guys,
I am using the CustomBoard
class in my dashboard and faced the need to interact with the server beyond updating the view — such as interactively modifying selection lists in inputs or updating individual elements on the page. I implemented this as follows, and I hope it might be helpful to someone else. I also kindly ask the KoolReport team to review my solution for potential issues.
In the class that extends CustomBoard
, I overrode the handle function to process my custom actions.
// CustomBoard class extension to handle custom server-side actions
class MyReportBoard extends CustomBoard{
public function handle($request)
{
// Retrieve the action from the request
$action = $request->action();
// Check if the action corresponds to a method in this class
if (method_exists($this, $action)) {
// Call the corresponding method dynamically
return $this->$action($request);
}
// Fall back to the parent CustomBoard class's handle method if action is not custom
return parent::handle($request);
}
// Custom action to handle "action1" logic
protected function action1($request)
{
$response = Response::create();
// Prepare data for the response (populate $data as needed)
$data = [
'message' => 'This is a response for action1',
'timestamp' => time()
];
// Encode the data as JSON and include it in the response
$response->html(json_encode($data));
return $response;
}
// Another Custom action
protected function action2($request)
{
$response = Response::create();
// Prepare data for the response (populate $data as needed)
$data = [
...
];
...
return $response;
}
}
On the client side, I use the following: In the required case, a JavaScript function is called, which interacts with the server via AJAX.
<script>
/**
* Function to handle interaction with the server
*/
function action1() {
// Get selected values from the board
let selectedValues = ...
// Proceed only if there are selected values
if (selectedValues && selectedValues.length > 0) {
// Show loader to indicate data is being processed
KoolReport.dashboard.theme.showLoader(true);
// Define the route and action for the server-side request
let route = 'App/' + KoolReport.dashboard.page.name +
(KoolReport.dashboard.dboard.name !== '' ? '/' + KoolReport.dashboard.dboard.name : '');
let action = 'action1';
let params = {ids: selectedValues};
// Prepare data object for the AJAX request
var data = {
kdr: {
route: route,
action: action,
params: params
}
};
// Encode parameters in base64 for secure transmission
if (params) {
data.kdr.encodedParams = base64_encode(JSON.stringify(params));
}
// Add CSRF token for security
if (KoolReport.dashboard.security.csrf) {
data[KoolReport.dashboard.security.csrf.name] = KoolReport.dashboard.security.csrf.token;
}
// Make the AJAX request
$.ajax({
url: window.location.href.replace(window.location.hash, ''), // Use the current URL without the hash
method: 'POST', // POST method to send data to the server
data: data, // Data payload for the server
async: true, // Asynchronous request
dataType: 'json', // Expect JSON response
})
.fail(function (xhr) {
// Handle request failure
KoolReport.dashboard.theme.showLoader(false); // Hide loader
KoolReport.dashboard.contactFail(xhr); // Notify the dashboard of the failure
})
.done(function (data) {
// Hide loader upon successful response
KoolReport.dashboard.theme.showLoader(false);
// do something based on response
...
});
}
}
</script>
I hope this helps those who need to add their own actions.
PS I am not 100% sure that contactFail(xhr) will work correctly, and I hope the KoolReport team will correct me if needed.