Skip to content

Commit ad70f81

Browse files
Lustmoredweaverryan
authored andcommitted
Hook up files in Component and build assets
1 parent 458ba60 commit ad70f81

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

src/LiveComponent/assets/dist/Component/index.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export default class Component {
2020
defaultDebounce: number;
2121
private backendRequest;
2222
private pendingActions;
23+
private pendingFiles;
2324
private isRequestPending;
2425
private requestDebounceTimeout;
2526
private nextRequestPromise;
@@ -40,6 +41,7 @@ export default class Component {
4041
set(model: string, value: any, reRender?: boolean, debounce?: number | boolean): Promise<BackendResponse>;
4142
getData(model: string): any;
4243
action(name: string, args?: any, debounce?: number | boolean): Promise<BackendResponse>;
44+
files(key: string, fileList: FileList): void;
4345
render(): Promise<BackendResponse>;
4446
getUnsyncedModels(): string[];
4547
addChild(child: Component, modelBindings?: ModelBinding[]): void;

src/LiveComponent/assets/dist/live_controller.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export default class LiveControllerDefault extends Controller<HTMLElement> imple
4848
component: Component;
4949
pendingActionTriggerModelElement: HTMLElement | null;
5050
private elementEventListeners;
51+
private pendingFiles;
5152
static componentRegistry: ComponentRegistry;
5253
initialize(): void;
5354
connect(): void;

src/LiveComponent/assets/dist/live_controller.js

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1724,6 +1724,7 @@ class Component {
17241724
this.defaultDebounce = 150;
17251725
this.backendRequest = null;
17261726
this.pendingActions = [];
1727+
this.pendingFiles = {};
17271728
this.isRequestPending = false;
17281729
this.requestDebounceTimeout = null;
17291730
this.children = new Map();
@@ -1801,6 +1802,9 @@ class Component {
18011802
this.debouncedStartRequest(debounce);
18021803
return promise;
18031804
}
1805+
files(key, fileList) {
1806+
this.pendingFiles[key] = fileList;
1807+
}
18041808
render() {
18051809
const promise = this.nextRequestPromise;
18061810
this.tryStartingRequest();
@@ -1900,7 +1904,7 @@ class Component {
19001904
const thisPromiseResolve = this.nextRequestPromiseResolve;
19011905
this.resetPromise();
19021906
this.unsyncedInputsTracker.resetUnsyncedFields();
1903-
this.backendRequest = this.backend.makeRequest(this.valueStore.getOriginalProps(), this.pendingActions, this.valueStore.getDirtyProps(), this.getChildrenFingerprints(), this.valueStore.getUpdatedPropsFromParent(), {});
1907+
this.backendRequest = this.backend.makeRequest(this.valueStore.getOriginalProps(), this.pendingActions, this.valueStore.getDirtyProps(), this.getChildrenFingerprints(), this.valueStore.getUpdatedPropsFromParent(), this.pendingFiles);
19041908
this.hooks.triggerHook('loading.state:started', this.element, this.backendRequest);
19051909
this.pendingActions = [];
19061910
this.valueStore.flushDirtyPropsToPending();
@@ -2668,6 +2672,7 @@ class LiveControllerDefault extends Controller {
26682672
{ event: 'change', callback: (event) => this.handleChangeEvent(event) },
26692673
{ event: 'live:connect', callback: (event) => this.handleConnectedControllerEvent(event) },
26702674
];
2675+
this.pendingFiles = {};
26712676
}
26722677
initialize() {
26732678
this.handleDisconnectedChildControllerEvent = this.handleDisconnectedChildControllerEvent.bind(this);
@@ -2716,6 +2721,7 @@ class LiveControllerDefault extends Controller {
27162721
const directives = parseDirectives(rawAction);
27172722
let debounce = false;
27182723
directives.forEach((directive) => {
2724+
let pendingFiles = {};
27192725
const validModifiers = new Map();
27202726
validModifiers.set('prevent', () => {
27212727
event.preventDefault();
@@ -2731,6 +2737,14 @@ class LiveControllerDefault extends Controller {
27312737
validModifiers.set('debounce', (modifier) => {
27322738
debounce = modifier.value ? parseInt(modifier.value) : true;
27332739
});
2740+
validModifiers.set('files', (modifier) => {
2741+
if (!modifier.value) {
2742+
pendingFiles = this.pendingFiles;
2743+
}
2744+
else if (this.pendingFiles[modifier.value]) {
2745+
pendingFiles[modifier.value] = this.pendingFiles[modifier.value];
2746+
}
2747+
});
27342748
directive.modifiers.forEach((modifier) => {
27352749
var _a;
27362750
if (validModifiers.has(modifier.name)) {
@@ -2740,6 +2754,10 @@ class LiveControllerDefault extends Controller {
27402754
}
27412755
console.warn(`Unknown modifier ${modifier.name} in action "${rawAction}". Available modifiers are: ${Array.from(validModifiers.keys()).join(', ')}.`);
27422756
});
2757+
for (const [key, files] of Object.entries(pendingFiles)) {
2758+
this.component.files(key, files);
2759+
delete this.pendingFiles[key];
2760+
}
27432761
this.component.action(directive.action, directive.named, debounce);
27442762
if (getModelDirectiveFromElement(event.currentTarget, false)) {
27452763
this.pendingActionTriggerModelElement = event.currentTarget;
@@ -2809,12 +2827,23 @@ class LiveControllerDefault extends Controller {
28092827
this.updateModelFromElementEvent(target, 'change');
28102828
}
28112829
updateModelFromElementEvent(element, eventName) {
2830+
var _a, _b;
28122831
if (!elementBelongsToThisComponent(element, this.component)) {
28132832
return;
28142833
}
28152834
if (!(element instanceof HTMLElement)) {
28162835
throw new Error('Could not update model for non HTMLElement');
28172836
}
2837+
if (element instanceof HTMLInputElement
2838+
&& element.type === 'file') {
2839+
const key = (_a = element.dataset.model) !== null && _a !== void 0 ? _a : element.name;
2840+
if ((_b = element.files) === null || _b === void 0 ? void 0 : _b.length) {
2841+
this.pendingFiles[key] = element.files;
2842+
}
2843+
else if (this.pendingFiles[key]) {
2844+
delete this.pendingFiles[key];
2845+
}
2846+
}
28182847
const modelDirective = getModelDirectiveFromElement(element, false);
28192848
if (!modelDirective) {
28202849
return;

0 commit comments

Comments
 (0)