wenzhixin / bootstrap-table

An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation, Vue.js)
https://bootstrap-table.com/
MIT License
11.72k stars 4.44k forks source link

'refresh' method doesn't reuse parameters provided as "query", it only takes "url". #7318

Closed utilmind closed 4 weeks ago

utilmind commented 3 months ago

Bootstraptable version(s) affected

1.22.5 (latest)

Description

Unfortunately "refresh" button on toolbar is useless, if I originally provide the request parameters as "query" property, instead of straightforward GET-query, as part of "url" property.

So if I originally provide data as follows, this will not work on manual "refresh" (click on refresh button on toolbar), it will just ignore "query" on repeating request:

$table.bootstrapTable('refresh', {
                            url: thisToolUrl,
                            query: prepareHttpQuery(),
                        });

However, the following will work:

$table.bootstrapTable('refresh', {
                            // httpBuildQuery converts array to &-separated and urlencoded 'key=value' pairs.
                            url: thisToolUrl + '?' + httpBuildQuery(prepareHttpQuery()), 
                        });

I think it should not ignore data provided in "query" on repeating "refreshes". The workaround provided above is works for me, so I don't submitting the pool request, but would switch to "query" if it will be fixed in further Bootstrap Table versions.

Example(s)

No response

Possible Solutions

Fix initServer() method, reuse saved "query" parameter from previous "refresh" request.

Additional Context

No response

wenzhixin commented 3 months ago

Please provide an Online Example to show your problem. Thanks!

UtechtDustin commented 3 months ago

We will close this issue as we got no response form you. If you still need help with that please provide us an example as @wenzhixin said.

utilmind commented 3 months ago

@UtechtDustin -- We will close, or already closing? In either case, it's can't be closed as "Completed". It's not completed.

utilmind commented 3 months ago

@wenzhixin here you go https://live.bootstrap-table.com/code/utilmind/17717 There are 2 buttons in example. First specifying parameters in documented 'query' property (this example doesn't works), second specifying parameter(s) directly in the 'url' (this works).

@UtechtDustin please don't close the issue as “Completed” immediately after reminder. This is extremely discouraging.

utilmind commented 3 months ago

Just in case, here is the source code of PHP script which generating content for my example on https://live.bootstrap-table.com/code/utilmind/17717

<?php

if (isset($_GET['required-parameter'])) {
    $out = [
        [
            'id' => 1,
            'name' => 'name1',
            'price' => 123.45,
        ],
        [
            'id' => 2,
            'name' => 'name2',
            'price' => 543.21,
        ],
    ];

}else {
    $out = [];
}

// No cache
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.date('r'));
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
header('Pragma: no-cache');
header('X-Robots-Tag: noindex, nofollow, noarchive');
// Allow at least live.bootstrap-table.com
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: *');
// Output JSON
header('Content-type: application/json');
exit(json_encode($out, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
utilmind commented 3 months ago

As I mentioned in my top comment, I'm not contributing the fix for this issue because a workaround with ?parameters= in the url works pretty well for me, although this is obviously wrong that query is ignored in the refresh method and could be issue for someone else.

UtechtDustin commented 3 months ago

Sorry, my bad. I don't know that the close button marks it as completed or that there is a close option without out the completed part.

UtechtDustin commented 3 months ago

The query option of the refresh method is internally almost the same as the queryparams table option. Which means you have to define the query as Object, as documented on both options.

Bildschirmfoto 2024-05-26 um 23 56 23

Working demo: https://live.bootstrap-table.com/code/UtechtDustin/17720

utilmind commented 3 months ago

@UtechtDustin Okay, yes, my bad I specified the query incorrectly in my example, but it was correct in my real app.

Here is another example: https://live.bootstrap-table.com/code/utilmind/17722 It uses your fix + little improvement, "refresh" button in toolbar.

  1. Try to load data with the first, [Refresh using 'query'] button. Then try to reload data with "refresh" button at the top-right side of table. This will not work. Data specified in query will not be preserved, it will not be used for native refresh.
  2. However, if you load the data using only URL, with the second button, URL will be used upon native refresh. (Click second button, then reload data with "refresh" button at the top-right — second case works.)
UtechtDustin commented 3 months ago

You're right! if a url is passed to the refresh method the url will be set as new "base"-url, which means if we have a url with parameters the parameters are also the new default value. If we pass the query they are only used for the next request. https://github.com/wenzhixin/bootstrap-table/blob/develop/src/bootstrap-table.js#L3094-L3106

That should be an easy fix, as soon we get a query object we have to add/merge it to our base url.

UtechtDustin commented 3 months ago

Should be fixed by #7353. Working example with the fix: https://live.bootstrap-table.com/code/UtechtDustin/17731