Skip to content

Commit 24776dc

Browse files
committed
Send live action arguments to backend
1 parent 39d4e49 commit 24776dc

File tree

3 files changed

+53
-4
lines changed

3 files changed

+53
-4
lines changed

src/LiveComponent/assets/dist/live_controller.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,7 +1070,7 @@ class default_1 extends Controller {
10701070
directives.forEach((directive) => {
10711071
const _executeAction = () => {
10721072
this._clearWaitingDebouncedRenders();
1073-
this._makeRequest(directive.action);
1073+
this._makeRequest(directive.action, directive.args.length > 0 ? directive.args : directive.named);
10741074
};
10751075
let handled = false;
10761076
directive.modifiers.forEach((modifier) => {
@@ -1162,11 +1162,22 @@ class default_1 extends Controller {
11621162
}, this.debounceValue || DEFAULT_DEBOUNCE);
11631163
}
11641164
}
1165-
_makeRequest(action) {
1165+
_makeRequest(action, values) {
11661166
const splitUrl = this.urlValue.split('?');
11671167
let [url] = splitUrl;
11681168
const [, queryString] = splitUrl;
11691169
const params = new URLSearchParams(queryString || '');
1170+
let valueParams = null;
1171+
if (Array.isArray(values)) {
1172+
valueParams = new URLSearchParams();
1173+
values.forEach((v, i) => valueParams.set(i, v));
1174+
}
1175+
else if (typeof values === 'object' && Object.keys(values).length > 0) {
1176+
valueParams = new URLSearchParams(values);
1177+
}
1178+
if (valueParams !== null) {
1179+
params.set('values', valueParams.toString());
1180+
}
11701181
const fetchOptions = {};
11711182
fetchOptions.headers = {
11721183
'Accept': 'application/vnd.live-component+json',

src/LiveComponent/assets/src/live_controller.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ export default class extends Controller {
144144
// taking precedence
145145
this._clearWaitingDebouncedRenders();
146146

147-
this._makeRequest(directive.action);
147+
this._makeRequest(directive.action, directive.args.length > 0 ? directive.args : directive.named);
148148
}
149149

150150
let handled = false;
@@ -296,11 +296,24 @@ export default class extends Controller {
296296
}
297297
}
298298

299-
_makeRequest(action: string|null) {
299+
_makeRequest(action: string|null, values: Array<string>|Record<string,unknown>) {
300300
const splitUrl = this.urlValue.split('?');
301301
let [url] = splitUrl
302302
const [, queryString] = splitUrl;
303303
const params = new URLSearchParams(queryString || '');
304+
let valueParams = null;
305+
306+
if (Array.isArray(values)) {
307+
valueParams = new URLSearchParams();
308+
309+
values.forEach((v, i) => valueParams.set(i, v));
310+
} else if (typeof values === 'object' && Object.keys(values).length > 0) {
311+
valueParams = new URLSearchParams(values);
312+
}
313+
314+
if (valueParams !== null) {
315+
params.set('values', valueParams.toString());
316+
}
304317

305318
const fetchOptions: RequestInit = {};
306319
fetchOptions.headers = {

src/LiveComponent/assets/test/controller/action.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ describe('LiveController Action Tests', () => {
3535
data-action="live#action"
3636
data-action-name="save"
3737
>Save</button>
38+
39+
<button data-action="live#action" data-action-name="updateSimple(a, b, c)">Update simple</button>
40+
<button data-action="live#action" data-action-name="updateNamed(a=1, b=2, c=3)">Update named</button>
3841
</div>
3942
`;
4043

@@ -64,4 +67,26 @@ describe('LiveController Action Tests', () => {
6467

6568
expect(postMock.lastOptions().body.get('comments')).toEqual('hi WEAVER');
6669
});
70+
71+
it('Sends action simple args', async () => {
72+
const data = { comments: 'hi' };
73+
const { element } = await startStimulus(template(data));
74+
75+
fetchMock.postOnce('http://localhost/_components/my_component/updateSimple?values=0%3Da%261%3Db%262%3Dc', {
76+
html: template({ comments: 'hi' }),
77+
});
78+
79+
getByText(element, 'Update simple').click();
80+
});
81+
82+
it('Sends action named args', async () => {
83+
const data = { comments: 'hi' };
84+
const { element } = await startStimulus(template(data));
85+
86+
fetchMock.postOnce('http://localhost/_components/my_component/updateNamed?values=a%3D1%26b%3D2%26c%3D3', {
87+
html: template({ comments: 'hi' }),
88+
});
89+
90+
getByText(element, 'Update named').click();
91+
});
6792
});

0 commit comments

Comments
 (0)