Skip to content

Commit 1808462

Browse files
committed
fix(forms): export controller
Signed-off-by: Cory Rylan <crylan@nvidia.com>
1 parent 4ef2eb3 commit 1808462

4 files changed

Lines changed: 66 additions & 5 deletions

File tree

‎projects/forms/package.json‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,14 @@
7373
"./validators/index.js": {
7474
"types": "./dist/validators/index.d.ts",
7575
"default": "./dist/validators/index.js"
76+
},
77+
"./internal": {
78+
"types": "./dist/internal/index.d.ts",
79+
"default": "./dist/internal/index.js"
80+
},
81+
"./internal/index.js": {
82+
"types": "./dist/internal/index.d.ts",
83+
"default": "./dist/internal/index.js"
7684
}
7785
},
7886
"sideEffects": [],

‎projects/forms/src/internal/controllers/type-command.controller.test.ts‎

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import type { ReactiveController } from './types.js';
1111
typeCommandTestEvent=Event&{command: string;source: HTMLElement};
1212

1313
classCommandBehaviorControllerTestElementextendsHTMLElement{
14+
staticevents: readonlystring[]|undefined;
15+
1416
command?: string;
1517
commandfor: string|null=null;
1618
commandForElement: HTMLElement|null=null;
@@ -20,7 +22,12 @@ class CommandBehaviorControllerTestElement extends HTMLElement {
2022

2123
constructor(){
2224
super();
23-
newTypeCommandController(this);
25+
constevents=(this.constructorastypeofCommandBehaviorControllerTestElement).events;
26+
if(events){
27+
newTypeCommandController(this,{ events });
28+
}else{
29+
newTypeCommandController(this);
30+
}
2431
}
2532

2633
addController(controller: ReactiveController){
@@ -40,10 +47,21 @@ class CommandBehaviorControllerTestElement extends HTMLElement {
4047
}
4148
}
4249

50+
classMultiEventCommandBehaviorControllerTestElementextendsCommandBehaviorControllerTestElement{
51+
staticoverrideevents=['change','click'];
52+
}
53+
4354
if(!customElements.get('command-behavior-controller-test-element')){
4455
customElements.define('command-behavior-controller-test-element',CommandBehaviorControllerTestElement);
4556
}
4657

58+
if(!customElements.get('multi-event-command-behavior-controller-test-element')){
59+
customElements.define(
60+
'multi-event-command-behavior-controller-test-element',
61+
MultiEventCommandBehaviorControllerTestElement
62+
);
63+
}
64+
4765
describe('CommandBehaviorController',()=>{
4866
letfixture: HTMLElement;
4967

@@ -73,6 +91,30 @@ describe('CommandBehaviorController', () => {
7391
expect(event.source).toBe(element);
7492
});
7593

94+
it('should dispatch command events for every configured event',async()=>{
95+
fixture=awaitcreateFixture(
96+
html`<multi-event-command-behavior-controller-test-element></multi-event-command-behavior-controller-test-element><div
97+
id="target"
98+
></div>`
99+
);
100+
constelement=fixture.querySelector<MultiEventCommandBehaviorControllerTestElement>(
101+
'multi-event-command-behavior-controller-test-element'
102+
)!;
103+
consttarget=fixture.querySelector<HTMLElement>('#target')!;
104+
constcommand=vi.fn();
105+
106+
target.addEventListener('command',command);
107+
element.command='--test';
108+
element.commandForElement=target;
109+
element.sync();
110+
111+
element.dispatchEvent(newEvent('change'));
112+
awaitemulateClick(element);
113+
element.dispatchEvent(newEvent('input'));
114+
115+
expect(command).toHaveBeenCalledTimes(2);
116+
});
117+
76118
it('should resolve command targets by commandfor id',async()=>{
77119
fixture=awaitcreateFixture(
78120
html`<command-behavior-controller-test-element></command-behavior-controller-test-element><divid="target"></div>`

‎projects/forms/src/internal/controllers/type-command.controller.ts‎

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,25 @@ type CommandBehaviorHost = ReactiveElement & {
1111
readOnly: boolean;
1212
};
1313

14+
typeTypeCommandControllerOptions={
15+
events?: readonlystring[];
16+
};
17+
1418
exportclassTypeCommandController<TextendsCommandBehaviorHost>implementsReactiveController{
15-
constructor(privatehost: T){
19+
readonly #events: readonlystring[];
20+
21+
constructor(
22+
privatehost: T,
23+
{ events =['click']}: TypeCommandControllerOptions={}
24+
){
25+
this.#events =[...newSet(events)];
1626
this.host.addController(this);
1727
}
1828

1929
hostUpdated(){
2030
this.#removeCommandBehavior();
2131
if(!this.host.readOnly&&!this.host.disabled){
22-
this.host.addEventListener('click',this.#onCommandClick);
32+
this.#events.forEach(eventType=>this.host.addEventListener(eventType,this.#onCommand));
2333
}
2434
}
2535

@@ -28,10 +38,10 @@ export class TypeCommandController<T extends CommandBehaviorHost> implements Rea
2838
}
2939

3040
#removeCommandBehavior(){
31-
this.host.removeEventListener('click',this.#onCommandClick);
41+
this.#events.forEach(eventType=>this.host.removeEventListener(eventType,this.#onCommand));
3242
}
3343

34-
#onCommandClick=(event: Event)=>{
44+
#onCommand=(event: Event)=>{
3545
if(!event.defaultPrevented){
3646
this.#dispatchCommand();
3747
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export{TypeCommandController}from'./controllers/type-command.controller.js';

0 commit comments

Comments
 (0)