##// END OF EJS Templates
Added events map support to _WidgetBase, corrected attributes map support in _WidgetBase
cin -
r2:1e22cac2aaf4 v1.0.0-rc1 default
parent child
Show More
@@ -0,0 +1,25
1 import * as _WidgetBase from "dijit/_WidgetBase";
2 import * as Stateful from "dojo/Stateful";
3
4 export interface IRemovable {
5 remove(): void;
6 }
7
8 type StatefulAttrs<T> = T extends Stateful<infer A> ? A : never;
9
10 interface WatchFn {
11 <T extends Stateful, K extends keyof StatefulAttrs<T>>(
12 target: T,
13 prop: K,
14 render: (model: StatefulAttrs<T>[K]) => any,
15 own?: (obj: IRemovable) => void
16 );
17 <W extends _WidgetBase, K extends keyof W>(
18 target: W,
19 prop: K,
20 render: (model: W[K]) => any,
21 own?: (obj: IRemovable) => void
22 );
23 }
24
25 export declare const watch: WatchFn;
@@ -549,8 +549,65 declare namespace dijit {
549 onClose(): boolean;
549 onClose(): boolean;
550 }
550 }
551
551
552 interface _WidgetBase {
553 /**
554 * Used across all instances a hash to cache attribute names and their getter
555 * and setter names.
556 */
557 _attrPairNames: { [attr: string]: string };
558
559 /**
560 * Helper function for get() and set().
561 * Caches attribute name values so we don't do the string ops every time.
562 */
563 _getAttrNames(name: string): string;
564
565 /**
566 * Internal helper for directly changing an attribute value.
567 * This method id derived from Stateful and must not be used!
568 * @deprecated use `_set(name, value)` instead.
569 */
570 _changeAttrValue(name: string, value: any): this;
571
572 get<K extends keyof this & string>(name: K): this[K];
573
574 /**
575 * Helper function to set new value for specified property, and call handlers
576 * registered with watch() if the value has changed.
577 * @param name
578 * @param value
579 */
580 _set<K extends keyof this>(name: K, value: this[K]): void;
581
582 /**
583 * Helper function to get value for specified property stored by this._set(),
584 * i.e. for properties with custom setters. Used mainly by custom getters.
585 *
586 * For example, CheckBox._getValueAttr() calls this._get("value").
587 * @param name
588 */
589 _get<K extends keyof this>(name: K): this[K];
590
591 /**
592 * Set a property on a Stateful instance
593 */
594 set<K extends keyof this & string>(name: K, value: this[K]): this;
595 set<K extends { [p in keyof this]: this[p] extends any[] ? p : never; }[keyof this & string]>(name: K, ...values: this[K]): this;
596 set(values: Partial<this>): this;
597
598 /**
599 * Watches a property for changes
600 */
601 watch(callback: <K extends keyof any>(prop: K, oldValue: any, newValue: any) => void): dojo.WatchHandle;
602 watch<K extends keyof this>(name: K, callback: (prop: K, oldValue: this[K], newValue: this[K]) => void): dojo.WatchHandle;
603 }
604
605 type EventInitArgs<T extends Event> = {
606 [p in keyof T]?: T[p] extends (...args: any) => any ? never : T[p];
607 };
608
552 /* dijit/_WidgetBase */
609 /* dijit/_WidgetBase */
553 interface _WidgetBase<Attrs = any> extends dojo.Stateful<Attrs & _WidgetBase>, Destroyable {
610 interface _WidgetBase<Events extends { [name in keyof Events]: Event } = GlobalEventHandlersEventMap> extends Destroyable {
554
611
555 /**
612 /**
556 * A unique, opaque ID string that can be assigned by users or by the
613 * A unique, opaque ID string that can be assigned by users or by the
@@ -647,6 +704,8 declare namespace dijit {
647 */
704 */
648 textDir: string;
705 textDir: string;
649
706
707 _started?: boolean;
708
650 /**
709 /**
651 * Kicks off widget instantiation. See create() for details.
710 * Kicks off widget instantiation. See create() for details.
652 */
711 */
@@ -700,6 +759,7 declare namespace dijit {
700 /**
759 /**
701 * Deprecated. Override destroy() instead to implement custom widget tear-down
760 * Deprecated. Override destroy() instead to implement custom widget tear-down
702 * behavior.
761 * behavior.
762 * @deprecated
703 */
763 */
704 uninitialize(): boolean;
764 uninitialize(): boolean;
705
765
@@ -707,11 +767,24 declare namespace dijit {
707 * Used by widgets to signal that a synthetic event occurred, ex:
767 * Used by widgets to signal that a synthetic event occurred, ex:
708 * | myWidget.emit("attrmodified-selectedChildWidget", {}).
768 * | myWidget.emit("attrmodified-selectedChildWidget", {}).
709 */
769 */
710 emit(type: string, eventObj?: any, callbackArgs?: any[]): any;
770 emit<K extends keyof Events>(eventName: K, evt: EventInitArgs<Events[K]>): void;
771
772 /**
773 * @param type
774 * @param eventObj
775 * @param callbackArgs
776 */
777 emit<K extends string>(
778 type: K,
779 eventObj?: K extends keyof Events ? EventInitArgs<Events[K]> : any,
780 callbackArgs?: any[]
781 ): any;
711
782
712 /**
783 /**
713 * Call specified function when event occurs, ex: myWidget.on("click", function(){ ... }).
784 * Call specified function when event occurs, ex: myWidget.on("click", function(){ ... }).
714 */
785 */
786 on<K extends keyof Events>(eventName: K, cb: (evt: Events[K]) => void): dojo.WatchHandle;
787
715 on(type: string | dojo.ExtensionEvent, func: dojo.EventListener | Function): dojo.WatchHandle;
788 on(type: string | dojo.ExtensionEvent, func: dojo.EventListener | Function): dojo.WatchHandle;
716
789
717 /**
790 /**
@@ -732,21 +805,25 declare namespace dijit {
732
805
733 /**
806 /**
734 * Deprecated, will be removed in 2.0, use this.own(on(...)) or this.own(aspect.after(...)) instead.
807 * Deprecated, will be removed in 2.0, use this.own(on(...)) or this.own(aspect.after(...)) instead.
808 * @deprecated
735 */
809 */
736 connect(obj: any, event: string | dojo.ExtensionEvent, method: string | dojo.EventListener): dojo.WatchHandle;
810 connect(obj: any, event: string | dojo.ExtensionEvent, method: string | dojo.EventListener): dojo.WatchHandle;
737
811
738 /**
812 /**
739 * Deprecated, will be removed in 2.0, use handle.remove() instead.
813 * Deprecated, will be removed in 2.0, use handle.remove() instead.
814 * @deprecated
740 */
815 */
741 disconnect(handle: dojo.WatchHandle): void;
816 disconnect(handle: dojo.WatchHandle): void;
742
817
743 /**
818 /**
744 * Deprecated, will be removed in 2.0, use this.own(topic.subscribe()) instead.
819 * Deprecated, will be removed in 2.0, use this.own(topic.subscribe()) instead.
820 * @deprecated
745 */
821 */
746 subscribe(t: string, method: dojo.EventListener): dojo.WatchHandle;
822 subscribe(t: string, method: dojo.EventListener): dojo.WatchHandle;
747
823
748 /**
824 /**
749 * Deprecated, will be removed in 2.0, use handle.remove() instead.
825 * Deprecated, will be removed in 2.0, use handle.remove() instead.
826 * @deprecated
750 */
827 */
751 unsubscribe(handle: dojo.WatchHandle): void;
828 unsubscribe(handle: dojo.WatchHandle): void;
752
829
@@ -827,9 +904,9 declare namespace dijit {
827 onMonthSelect(): void;
904 onMonthSelect(): void;
828 postCreate(): void;
905 postCreate(): void;
829
906
830 set(name: 'month', value: number): this;
907 //set(name: 'month', value: number): this;
831 set(name: string, value: any): this;
908 //set(name: string, value: any): this;
832 set(values: Object): this;
909 //set(values: Object): this;
833 }
910 }
834
911
835 interface _MonthDropDownButtonConstructor extends _WidgetBaseConstructor<_MonthDropDownButton> { }
912 interface _MonthDropDownButtonConstructor extends _WidgetBaseConstructor<_MonthDropDownButton> { }
@@ -844,9 +921,9 declare namespace dijit {
844 */
921 */
845 onChange(month: number): void;
922 onChange(month: number): void;
846
923
847 set(name: 'months', value: string[]): this;
924 //set(name: 'months', value: string[]): this;
848 set(name: string, value: any): this;
925 //set(name: string, value: any): this;
849 set(values: Object): this;
926 //set(values: Object): this;
850 }
927 }
851
928
852 interface _MonthDropDownConstructor extends _WidgetBaseConstructor<_MonthDropDown> { }
929 interface _MonthDropDownConstructor extends _WidgetBaseConstructor<_MonthDropDown> { }
@@ -907,12 +984,12 declare namespace dijit {
907 */
984 */
908 getClassForDate(dateObject: Date, locale?: string): string;
985 getClassForDate(dateObject: Date, locale?: string): string;
909
986
910 get(name: 'value'): Date;
987 // get(name: 'value'): Date;
911 get(name: string): any;
988 // get(name: string): any;
912
989
913 set(name: 'value', value: number | Date): this;
990 // set(name: 'value', value: number | Date): this;
914 set(name: string, value: any): this;
991 // set(name: string, value: any): this;
915 set(values: Object): this;
992 // set(values: Object): this;
916 }
993 }
917
994
918 interface CalendarConstructor extends _WidgetBaseConstructor<Calendar> {
995 interface CalendarConstructor extends _WidgetBaseConstructor<Calendar> {
@@ -924,9 +1001,9 declare namespace dijit {
924 /* dijit/CalendarLite */
1001 /* dijit/CalendarLite */
925
1002
926 interface _MonthWidget extends _WidgetBase {
1003 interface _MonthWidget extends _WidgetBase {
927 set(name: 'month', value: Date): this;
1004 // set(name: 'month', value: Date): this;
928 set(name: string, value: any): this;
1005 // set(name: string, value: any): this;
929 set(values: Object): this;
1006 // set(values: Object): this;
930 }
1007 }
931
1008
932 interface _MonthWidgetConstructor extends _WidgetBaseConstructor<_MonthWidget> { }
1009 interface _MonthWidgetConstructor extends _WidgetBaseConstructor<_MonthWidget> { }
@@ -1082,12 +1159,12 declare namespace dijit {
1082 */
1159 */
1083 getClassForDate(dateObject: Date, locale?: string): string;
1160 getClassForDate(dateObject: Date, locale?: string): string;
1084
1161
1085 get(name: 'value'): Date;
1162 // get(name: 'value'): Date;
1086 get(name: string): any;
1163 // get(name: string): any;
1087
1164
1088 set(name: 'value', value: number | Date): this;
1165 // set(name: 'value', value: number | Date): this;
1089 set(name: string, value: any): this;
1166 // set(name: string, value: any): this;
1090 set(values: Object): this;
1167 // set(values: Object): this;
1091 }
1168 }
1092
1169
1093 interface CalendarLiteConstructor extends _WidgetBaseConstructor<CalendarLite> {
1170 interface CalendarLiteConstructor extends _WidgetBaseConstructor<CalendarLite> {
@@ -7,12 +7,12 declare module 'dijit/_Widget' {
7 }
7 }
8
8
9 declare module 'dijit/_WidgetBase' {
9 declare module 'dijit/_WidgetBase' {
10 type _WidgetBase<A = any> = dijit._WidgetBase<A>;
10 type _WidgetBase<E extends { [k in keyof E]: Event } = {}> = dijit._WidgetBase<E & GlobalEventHandlersEventMap>;
11
11
12 // individual _WidgetBase constructor to keep type parameters
12 // individual _WidgetBase constructor to keep type parameters
13 interface _WidgetBaseConstructor {
13 interface _WidgetBaseConstructor {
14 new <A = any>(params?: Partial<_WidgetBase<A> & A>, srcNodeRef?: dojo.NodeOrString): _WidgetBase<A> & dojo._base.DeclareCreatedObject;
14 new <A = {}, E extends { [k in keyof E]: Event } = {}>(params?: Partial<_WidgetBase<E> & A>, srcNodeRef?: dojo.NodeOrString): _WidgetBase<E> & dojo._base.DeclareCreatedObject;
15 prototype: _WidgetBase;
15 prototype: _WidgetBase<any>;
16 }
16 }
17 const _WidgetBase: _WidgetBaseConstructor;
17 const _WidgetBase: _WidgetBaseConstructor;
18 export = _WidgetBase;
18 export = _WidgetBase;
@@ -1961,7 +1961,7 declare namespace dojo {
1961 /**
1961 /**
1962 * Watches a property for changes
1962 * Watches a property for changes
1963 */
1963 */
1964 watch(callback: <K extends keyof T>(prop: K, oldValue: T[K], newValue: T[K]) => void): WatchHandle;
1964 watch(callback:(prop: keyof any, oldValue: any, newValue: any) => void): WatchHandle;
1965 watch<K extends keyof T>(name: K, callback: (prop: K, oldValue: T[K], newValue: T[K]) => void): WatchHandle;
1965 watch<K extends keyof T>(name: K, callback: (prop: K, oldValue: T[K], newValue: T[K]) => void): WatchHandle;
1966 }
1966 }
1967
1967
@@ -724,7 +724,7 declare module 'dojo/sniff' {
724 }
724 }
725
725
726 declare module 'dojo/Stateful' {
726 declare module 'dojo/Stateful' {
727 type Stateful<T = any> = dojo.Stateful<any>;
727 type Stateful<T = any> = dojo.Stateful<T>;
728 const Stateful: dojo.StatefulConstructor;
728 const Stateful: dojo.StatefulConstructor;
729 export = Stateful;
729 export = Stateful;
730 }
730 }
@@ -1,4 +1,5
1 import Stateful = require("dojo/Stateful");
1 import * as Stateful from "dojo/Stateful";
2 import { StatefulAttrs, watch } from "./traits";
2
3
3 interface ScheduleAttrs {
4 interface ScheduleAttrs {
4 title: string;
5 title: string;
@@ -18,4 +19,8 const model = new Schedule({duration: 10
18 model.get("title");
19 model.get("title");
19 model.get("duration");
20 model.get("duration");
20
21
21 model.set("duration", 12); No newline at end of file
22 model.set("duration", 12);
23
24 watch(model, "duration", v => v);
25
26 declare const o : StatefulAttrs<Schedule>; No newline at end of file
@@ -1,5 +1,5
1 import Memory = require("dojo/store/Memory");
1 import * as Memory from "dojo/store/Memory";
2 import Observable = require("dojo/store/Observable");
2 import * as Observable from "dojo/store/Observable";
3
3
4 interface Schedule {
4 interface Schedule {
5
5
@@ -16,7 +16,6 const observable = new Observable(store)
16
16
17 const mem = new Memory<Schedule>();
17 const mem = new Memory<Schedule>();
18
18
19 (async () => {
20 observable.query().observe(() => {});
19 observable.query().observe(() => { });
21 store.query().forEach(() => {});
20 store.query().forEach(() => { });
22 const total = await store.query().total;
21 const total = await store.query().total;
@@ -25,4 +24,3 const mem = new Memory<Schedule>();
25 mem.query();
24 mem.query();
26
25
27 mem.add({duration: 10, title: "Test event"});
26 mem.add({ duration: 10, title: "Test event" });
28 })(); No newline at end of file
@@ -1,17 +1,41
1 import _WidgetBase = require("dijit/_WidgetBase");
1 import * as _WidgetBase from "dijit/_WidgetBase";
2 import { watch } from "./traits";
2
3
3 interface ScheduleWidgetAttrs {
4 interface ScheduleWidgetAttrs {
4 data: string[];
5 data: string[];
5 }
6 }
6
7
7 declare const w0: _WidgetBase<ScheduleWidgetAttrs>;
8 interface ScheduleWidgetEvents {
9 "scheduled": Event & {
10 detail: {
11 startDate: Date,
12 endDate: Date
13 }
14 };
15 }
8
16
9 w0.get("data");
17 declare class ScheduleWidget extends _WidgetBase<ScheduleWidgetAttrs, ScheduleWidgetEvents> {
10
11 declare class ScheduleWidget extends _WidgetBase {
12 data: string[];
18 data: string[];
13 }
19 }
14
20
15 const w = new ScheduleWidget({title: "Year schedule", data: ["a", "b"] });
21 const w = new ScheduleWidget({title: "Year schedule", data: ["a", "b"] });
16
22
17 w.get("data"); No newline at end of file
23 w.get("data");
24
25 w.watch((p, o, n) => [p,o,n]);
26
27 w.watch("data", (p, o, n) => [p,o,n]);
28
29 watch(w, "title", v => String(v) );
30 watch(w, "data", v => String(v) );
31
32 w.emit("scheduled", { detail: { startDate: new Date(), endDate: new Date()} });
33
34 w.emit("click", {} );
35
36 w.emit("click", {} );
37
38 w.emit("some-extra-event", {});
39
40 w.on("click", e => e);
41 w.on("some-extra-event", e => e);
@@ -5,6 +5,7
5 "rootDir": "ts",
5 "rootDir": "ts",
6 "rootDirs": [
6 "rootDirs": [
7 "ts",
7 "ts",
8 "typings",
8 "../main/ts"
9 "../main/ts"
9 ],
10 ],
10 "types": [
11 "types": [
@@ -12,7 +13,8
12 "../main/typings/dojo/modules",
13 "../main/typings/dojo/modules",
13 "../main/typings/dijit/modules"
14 "../main/typings/dijit/modules"
14 ],
15 ],
15 "module": "amd"
16 "module": "ESNext",
17 "target": "ESNext"
16 },
18 },
17 "include": [
19 "include": [
18 "typings/**/*.ts",
20 "typings/**/*.ts",
General Comments 0
You need to be logged in to leave comments. Login now