web-atoms-mvvm
Version:
MVVM, REST Json Service, Message Subscriptions for Web Atoms
1,389 lines (1,388 loc) • 42.4 kB
TypeScript
/**
* Easy and Simple Dependency Injection
*/
declare namespace WebAtoms {
type AtomControlType = {
new (e: any);
};
/**
* @export
* @class DI
*/
class DI {
private static factory;
/**
* @static
* @template T
* @param {new () => T} key
* @param {() => T} factory
* @param {boolean} [transient=false] - If true, always new instance will be created
* @memberof DI
*/
static register<T>(key: new () => T, factory: () => T, transient?: boolean): void;
/**
* @static
* @template T
* @param {new () => T} c
* @returns {T}
* @memberof DI
*/
static resolve<T>(c: new () => T): T;
/**
* Use this for unit testing, this will push existing
* DI factory and all instances will be resolved with
* given instance
*
* @static
* @param {*} key
* @param {*} instance
* @memberof DI
*/
static push(key: any, instance: any): void;
/**
* @static
* @param {*} key
* @memberof DI
*/
static pop(key: any): void;
}
/**
* This decorator will register given class as singleton instance on DI.
* @example
* @DIGlobal
* class BackendService{
* }
* @export
* @param {new () => any} c
* @returns
*/
function DIGlobal(c: any): any;
/**
* This decorator will register given class as transient instance on DI.
* @example
* @DIAlwaysNew
* class StringHelper{
* }
* @export
* @param {new () => any} c
* @returns
*/
function DIAlwaysNew(c: any): any;
}
declare var DIGlobal: any;
declare var DIAlwaysNew: any;
declare function mapLibrary(...a: any[]): any;
declare function createProperty(...a: any[]): any;
declare function classCreator__(name: any, basePrototype: any, classConstructor: any, classPrototype: any, classProperties: any, thisPrototype: any, thisProperties: any): any;
/**
* Atom helper class
* @class Atom
*/
declare class Atom {
static pageQuery: {
[key: string]: any;
};
/**
* Set this true to return mock in RestServices
* @static
* @type {boolean}
* @memberof Atom
*/
static designMode: boolean;
/**
* Set this true to return mock in test mode
* @static
* @type {boolean}
* @memberof Atom
*/
static testMode: boolean;
/**
* Refreshes bindings for specified property of the target
* @static
* @param {*} target
* @param {string} property
* @memberof Atom
*/
static refresh(target: any, property: string): void;
/**
* Display given error message to user, this must be set by
* the app developer
* @static
* @param {string} msg
* @memberof Atom
*/
static showError(msg: string): void;
/**
* [Obsolete] do not use, this will retrieve value at given path for target
* @static
* @param {*} target
* @param {string} path
* @returns {*}
* @memberof Atom
*/
static get(target: any, path: string): any;
/**
* [Obsolete] do not use, this will set value at given path for target
* @static
* @param {*} target
* @param {string} path
* @param {*} value
* @memberof Atom
*/
static set(target: any, path: string, value: any): void;
/**
* Schedules given call in next available callLater slot
* @static
* @param {()=>void} f
* @memberof Atom
*/
static post(f: () => void): void;
/**
* Schedules given call in next available callLater slot and also returns
* promise that can be awaited, calling `Atom.postAsync` inside `Atom.postAsync`
* will create deadlock
* @static
* @param {()=>Promise<any>} f
* @returns {Promise<any>}
* @memberof Atom
*/
static postAsync(f: () => Promise<any>): Promise<any>;
/**
* Invokes given function and disposes given object after execution
* @static
* @param {WebAtoms.AtomDisposable} d
* @param {()=>void} f
* @memberof Atom
*/
static using(d: WebAtoms.AtomDisposable, f: () => void): void;
/**
* Invokes given function and disposes given object after execution asynchronously
* @static
* @param {WebAtoms.AtomDisposable} d
* @param {()=>Promise<any>} f
* @returns {Promise<any>}
* @memberof Atom
*/
static usingAsync(d: WebAtoms.AtomDisposable, f: () => Promise<any>): Promise<any>;
/**
* Sets up watch and returns disposable to destroy watch
* @static
* @param {*} item
* @param {string} property
* @param {()=>void} f
* @returns {WebAtoms.AtomDisposable}
* @memberof Atom
*/
static watch(item: any, property: string, f: () => void): WebAtoms.AtomDisposable;
/**
* await for delay for given number of milliseconds
* @static
* @param {number} n
* @param {WebAtoms.CancelToken} [ct]
* @returns {Promise<any>}
* @memberof Atom
*/
static delay(n: number, ct?: WebAtoms.CancelToken): Promise<any>;
/**
* Version
* @static
* @type {{
* text: string,
* major: number,
* minor: number,
* build: number
* }}
* @memberof Atom
*/
static version: {
text: string;
major: number;
minor: number;
build: number;
};
/**
* Current time in milliseconds
* @static
* @returns {number}
* @memberof Atom
*/
static time(): number;
/**
* Combine and prepare given url from fragments
* @static
* @param {string} url
* @param {*} queryString
* @param {*} hash
* @returns {string}
* @memberof Atom
*/
static url(url: string, queryString: any, hash?: any): string;
/**
* Creates secure version of the given url with fragments
* @static
* @param {string} url
* @param {...string[]} padding
* @returns {string}
* @memberof Atom
*/
static secureUrl(url: string, ...padding: string[]): string;
/**
* Creates bindable proxy for given object
* @static
* @param {*} e
* @returns {*}
* @memberof Atom
*/
static bindable<T>(e: T): T;
/**
* Creates an element enclosing given control name or class
*
* @static
* @param {((string | WebAtoms.AtomControlType))} name
* @param {string} tagName
* @returns {HTMLElement}
* @memberof Atom
*/
static controlToElement(name: (string | WebAtoms.AtomControlType), tagName?: string): HTMLElement;
}
declare class AtomDate {
static zoneOffsetMinutes: number;
static zoneOffset: number;
static toLocalTime(d: Date): string;
static setTime(d: Date, time: string): Date;
static toMMDDYY(d: Date): string;
static toShortDateString(d: Date | string): string;
static toDateTimeString(d: Date | string): string;
static toTimeString(d: Date | string): string;
static smartDate(d: Date | string): string;
static smartDateUTC(d: Date | string): string;
static jsonDate(d: Date | string): {
Year: number;
Month: number;
Date: number;
Hours: number;
Minutes: number;
Seconds: number;
Offset: number;
};
static toUTC(d: Date | string): Date;
static parse(d: any): Date;
static monthList: Array<{
label: string;
value: number;
}>;
}
declare class AtomPhone {
static toSmallPhoneString(v: string): string;
static toPhoneString(v: string): string;
}
declare class AtomUri {
constructor(v: string);
host: string;
protocol: string;
port: number;
path: string;
query: {
[s: string]: string;
};
hash: {
[s: string]: string;
};
}
/**
* This decorator will mark given property as bindable, it will define
* getter and setter, and in the setter, it will refresh the property.
*
* class Customer{
*
* @bindableProperty
* firstName:string;
*
* }
*
* @param {*} target
* @param {string} key
*/
declare function bindableProperty(target: any, key: string): void;
declare namespace WebAtoms {
/**
*
*
* @export
* @class CancelToken
*/
class CancelToken {
listeners: Array<() => void>;
private _cancelled;
readonly cancelled: boolean;
cancel(): void;
reset(): void;
registerForCancel(f: () => void): void;
}
class AtomModel {
refresh(name: string): void;
}
/**
* Though you can directly call methods of view model in binding expression,
* but we recommend using AtomCommand for two reasons.
*
* First one, it has enabled bindable property, which can be used to enable/disable UI.
* AtomButton already has `command` and `commandParameter` property which automatically
* binds execution and disabling the UI.
*
* Second one, it has busy bindable property, which can be used to display a busy indicator
* when corresponding action is a promise and it is yet not resolved.
*
* @export
* @class AtomCommand
* @extends {AtomModel}
* @template T
*/
class AtomCommand<T> extends AtomModel {
readonly isMVVMAtomCommand: boolean;
private _enabled;
/**
*
*
* @type {boolean}
* @memberof AtomCommand
*/
enabled: boolean;
private _busy;
/**
*
*
* @type {boolean}
* @memberof AtomCommand
*/
busy: boolean;
private action;
execute: (p: T) => any;
private executeAction(p);
constructor(action: (p: T) => any);
}
}
declare namespace WebAtoms {
/**
* DisposableAction holds an action that
* will be executed when dispose will be called.
*
* subscribe(m,f):AtomDisposable{
* //...
* //subscribe to something...
* //...
* return new AtomDisposable(()=>{
*
* //...
* //unsubscribe from something
* //
*
* });
* }
*
* User can simply call dispose to make sure subscription was unsubscribed.
*
* @export
* @class DisposableAction
* @implements {AtomDisposable}
*/
class DisposableAction implements AtomDisposable {
f: () => void;
constructor(f: () => void);
dispose(): void;
}
/**
*
*
* @export
* @interface AtomDisposable
*/
interface AtomDisposable {
dispose(): void;
}
type AtomAction = (msg: string, data: any) => void;
class AtomMessageAction {
message: string;
action: AtomAction;
constructor(msg: string, a: AtomAction);
}
/**
* Device (usually browser), instance of which supports
* singleton instance to provide broadcast/messaging
*
* @export
* @class AtomDevice
*/
class AtomDevice {
/**
*
*
* @static
* @type {AtomDevice}
* @memberof AtomDevice
*/
static instance: AtomDevice;
constructor();
/**
* This method will run any asynchronous method
* and it will display an error if it will fail
* asynchronously
*
* @template T
* @param {() => Promise<T>} tf
* @memberof AtomDevice
*/
runAsync<T>(tf: () => Promise<T>): void;
private bag;
/**
* Broadcast given data to channel, only within the current window.
*
* @param {string} channel
* @param {*} data
* @returns
* @memberof AtomDevice
*/
broadcast(channel: string, data: any): void;
/**
* Subscribe for given channel with action that will be
* executed when anyone will broadcast (this only works within the
* current browser window)
*
* This method returns a disposable, when you call `.dispose()` it will
* unsubscribe for current subscription
*
* @param {string} channel
* @param {AtomAction} action
* @returns {AtomDisposable} Disposable that supports removal of subscription
* @memberof AtomDevice
*/
subscribe(channel: string, action: AtomAction): AtomDisposable;
}
}
declare namespace WebAtoms {
class AtomPageView extends AtomControl {
url: string;
private disposables;
stack: AtomControl[];
keepStack: boolean;
current: AtomControl;
currentDisposable: AtomDisposable;
backCommand: Function;
constructor(e: HTMLElement);
onBackCommand(): void;
canChange(): Promise<boolean>;
push(ctrl: AtomControl): void;
init(): void;
dispose(e?: HTMLElement): void;
createControl(c: {
new (e: HTMLElement);
}, vmt: {
new (q?: any);
}, q?: any): AtomControl;
load(url: string): Promise<any>;
toUpperCase(s: string): string;
}
}
declare namespace WebAtoms {
/**
*
*
* @export
* @class AtomList
* @extends {Array<T>}
* @template T
*/
class AtomList<T> extends Array<T> {
constructor();
next: Function;
prev: Function;
private _start;
start: number;
private _total;
total: number;
private _size;
size: number;
/**
* Adds the item in the list and refresh bindings
* @param {T} item
* @returns {number}
* @memberof AtomList
*/
add(item: T): number;
/**
* Add given items in the list and refresh bindings
* @param {Array<T>} items
* @memberof AtomList
*/
addAll(items: Array<T>): void;
/**
* Replaces list with given items, use this
* to avoid flickering in screen
* @param {T[]} items
* @memberof AtomList
*/
replace(items: T[], start?: number, size?: number): void;
/**
* Inserts given number in the list at position `i`
* and refreshes the bindings.
* @param {number} i
* @param {T} item
* @memberof AtomList
*/
insert(i: number, item: T): void;
/**
* Removes item at given index i and refresh the bindings
* @param {number} i
* @memberof AtomList
*/
removeAt(i: number): void;
/**
* Removes given item or removes all items that match
* given lambda as true and refresh the bindings
* @param {(T | ((i:T) => boolean))} item
* @returns {boolean} `true` if any item was removed
* @memberof AtomList
*/
remove(item: T | ((i: T) => boolean)): boolean;
/**
* Removes all items from the list and refreshes the bindings
* @memberof AtomList
*/
clear(): void;
refresh(): void;
watch(f: () => void): AtomDisposable;
}
}
interface Array<T> {
add?(item: T): number;
addAll?(item: T[]): void;
clear?(): void;
refresh?(): void;
remove?(item: T | ((i: T) => boolean)): boolean;
removeAt?(i: number): void;
watch?(f: () => void): WebAtoms.AtomDisposable;
}
declare namespace WebAtoms {
/**
*
*
* @export
* @class AtomViewModel
* @extends {AtomModel}
*/
class AtomViewModel extends AtomModel {
private disposables;
private subscriptions;
private _channelPrefix;
channelPrefix: string;
private _isReady;
readonly isReady: boolean;
constructor();
private privateInit();
waitForReady(): Promise<any>;
protected onReady(): void;
postInit: Array<Function>;
private runDecoratorInits();
private validations;
/**
* Internal method, do not use, instead use errors.hasErrors()
*
* @memberof AtomViewModel
*/
validate(): void;
/**
* Adds validation expression to be executed when any bindable expression is updated.
*
* `target` must always be set to `this`.
*
* this.addValidation(() => {
* this.errors.nameError = this.data.firstName ? "" : "Name cannot be empty";
* });
*
* Only difference here is, validation will not kick in first time, where else watch will
* be invoked as soon as it is setup.
*
* Validation will be invoked when any bindable property in given expression is updated.
*
* Validation can be invoked explicitly only by calling `errors.hasErrors()`.
*
* @protected
* @template T
* @param {() => any} ft
* @returns {AtomDisposable}
* @memberof AtomViewModel
*/
protected addValidation(...fts: (() => any)[]): AtomDisposable;
/**
* Execute given expression whenever any bindable expression changes
* in the expression.
*
* For correct generic type resolution, target must always be `this`.
*
* this.watch(() => {
* if(!this.data.fullName){
* this.data.fullName = `${this.data.firstName} ${this.data.lastName}`;
* }
* });
*
* @protected
* @template T
* @param {() => any} ft
* @returns {AtomDisposable}
* @memberof AtomViewModel
*/
protected watch(...fts: (() => any)[]): AtomDisposable;
/**
* Register a disposable to be disposed when view model will be disposed.
*
* @protected
* @param {AtomDisposable} d
* @memberof AtomViewModel
*/
registerDisposable(d: AtomDisposable): void;
protected onPropertyChanged(name: string): void;
/**
* Register listener for given message.
*
* @protected
* @template T
* @param {string} msg
* @param {(data: T) => void} a
* @memberof AtomViewModel
*/
protected onMessage<T>(msg: string, a: (data: T) => void): void;
/**
* Broadcast given data to channel (msg)
*
* @param {string} msg
* @param {*} data
* @memberof AtomViewModel
*/
broadcast(msg: string, data: any): void;
private subscribe(channel, c);
/**
* Put your asynchronous initializations here
*
* @returns {Promise<any>}
* @memberof AtomViewModel
*/
init(): Promise<any>;
/**
* dispose method will becalled when attached view will be disposed or
* when a new view model will be assigned to view, old view model will be disposed.
*
* @memberof AtomViewModel
*/
dispose(): void;
}
/**
* This view model should be used with WindowService to create and open window.
*
* This view model has `close` and `cancel` methods. `close` method will
* close the window and will resolve the given result in promise. `cancel`
* will reject the given promise.
*
* @example
*
* var windowService = WebAtoms.DI.resolve(WindowService);
* var result = await
* windowService.openWindow(
* "Namespace.WindowName",
* new WindowNameViewModel());
*
*
*
* class NewTaskWindowViewModel extends AtomWindowViewModel{
*
* ....
* save(){
*
* // close and send result
* this.close(task);
*
* }
* ....
*
* }
*
* @export
* @class AtomWindowViewModel
* @extends {AtomViewModel}
*/
class AtomWindowViewModel extends AtomViewModel {
/**
* windowName will be set to generated html tag id, you can use this
* to mock AtomWindowViewModel in testing.
*
* When window is closed or cancelled, view model only broadcasts
* `atom-window-close:${this.windowName}`, you can listen for
* such message.
*
* @type {string}
* @memberof AtomWindowViewModel
*/
windowName: string;
_windowName: string;
/**
* This will broadcast `atom-window-close:windowName`.
* WindowService will close the window on receipt of such message and
* it will resolve the promise with given result.
*
* this.close(someResult);
*
* @param {*} [result]
* @memberof AtomWindowViewModel
*/
close(result?: any): void;
/**
* This will broadcast `atom-window-cancel:windowName`
* WindowService will cancel the window on receipt of such message and
* it will reject the promise with "cancelled" message.
*
* this.cancel();
*
* @memberof AtomWindowViewModel
*/
cancel(): void;
}
class AtomPageViewModel extends AtomViewModel {
pageId: string;
closeWarning: string;
cancel(): Promise<any>;
}
}
declare type viewModelInit = (vm: WebAtoms.AtomViewModel) => void;
declare function registerInit(target: WebAtoms.AtomViewModel, fx: viewModelInit): void;
/**
* Receive messages for given channel
* @param {(string | RegExp)} channel
* @returns {Function}
*/
declare function receive(...channel: string[]): Function;
declare function bindableReceive(...channel: string[]): Function;
declare function bindableBroadcast(...channel: string[]): Function;
declare function watch(target: WebAtoms.AtomViewModel, key: string | symbol, descriptor: any): void;
declare function validate(target: WebAtoms.AtomViewModel, key: string | symbol, descriptor: any): void;
declare namespace WebAtoms {
/**
* AtomErrors class holds all validation errors registered in view model.
*
* hasErrors() method will return true if there are any validation errors in this AtomErrors object.
*
* @export
* @class AtomErrors
*/
class AtomErrors {
private static isInternal;
private __target;
/**
* Creates an instance of AtomErrors.
* @param {AtomViewModel} target
* @memberof AtomErrors
*/
constructor(target: AtomViewModel);
/**
*
*
* @returns {boolean}
* @memberof AtomErrors
*/
hasErrors(): boolean;
/**
*
*
* @memberof AtomErrors
*/
clear(): void;
}
class ObjectProperty {
target: object;
name: string;
watcher: AtomDisposable;
constructor(name: string);
toString(): string;
}
/**
*
*
* @export
* @class AtomWatcher
* @implements {AtomDisposable}
* @template T
*/
class AtomWatcher<T> implements AtomDisposable {
private forValidation;
/**
* If path was given as an array of string property path, you can use this `func` that will be executed
* when any of property is updated.
*
* You must manually invoke evaluate after setting this property.
*
* @memberof AtomWatcher
*/
func: (t: T) => any;
private _isExecuting;
funcText: string;
private evaluatePath(target, path);
/**
*
*
* @param {boolean} [force]
* @returns {*}
* @memberof AtomWatcher
*/
evaluate(force?: boolean): any;
path: Array<Array<ObjectProperty>>;
target: any;
/**
* Creates an instance of AtomWatcher.
*
* var w = new AtomWatcher(this, x => x.data.fullName = `${x.data.firstName} ${x.data.lastName}`);
*
* You must dispose `w` in order to avoid memory leaks.
* Above method will set fullName whenver, data or its firstName,lastName property is modified.
*
* AtomWatcher will assign null if any expression results in null in single property path.
*
* In order to avoid null, you can rewrite above expression as,
*
* var w = new AtomWatcher(this,
* x => {
* if(x.data.firstName && x.data.lastName){
* x.data.fullName = `${x.data.firstName} ${x.data.lastName}`
* }
* });
*
* @param {T} target - Target on which watch will be set to observe given set of properties
* @param {(string[] | ((x:T) => any))} path - Path is either lambda expression or array of
* property path to watch, if path was lambda, it will be executed when any of
* members will modify
* @param {boolean} [forValidation] forValidtion - Ignore, used for internal purpose
* @memberof AtomWatcher
*/
constructor(target: T, path: string[] | (() => any), runAfterSetup: boolean, forValidation?: boolean);
runEvaluate: () => any;
toString(): string;
/**
* This will dispose and unregister all watchers
*
* @memberof AtomWatcher
*/
dispose(): void;
}
}
declare namespace WebAtoms {
type AtomLocation = {
href?: string;
hash?: string;
host?: string;
hostName?: string;
port?: string;
protocol?: string;
};
/**
* BrowserService provides access to browser attributes
* such as title of current window, location etc.
*
* @export
* @class BrowserService
*/
class BrowserService {
/**
* DI Resolved instance
*
* @readonly
* @static
* @type {BrowserService}
* @memberof BrowserService
*/
static readonly instance: BrowserService;
/**
* Get current window title
*
* @type {string}
* @memberof BrowserService
*/
/**
* Set current window title
* @memberof BrowserService
*/
title: string;
/**
* Gets current location of browser, this does not return
* actual location but it returns values of browser location.
* This is done to provide mocking behaviour for unit testing.
*
* @readonly
* @type {AtomLocation}
* @memberof BrowserService
*/
readonly location: AtomLocation;
/**
* Navigate current browser to given url.
* @param {string} url
* @memberof BrowserService
*/
navigate(url: string): void;
/**
* Get access to available appScope from Web Atoms.
* @readonly
* @type {*}
* @memberof BrowserService
*/
readonly appScope: any;
back(): void;
}
}
declare var $: any;
declare var atomApplication: any;
declare class AtomUI {
static createControl(e: HTMLElement, ctrl: (string | {
new (e: any);
})): WebAtoms.AtomControl;
}
declare class AtomBinder {
static getClone(a: any): any;
static add_CollectionChanged(target: any, f: Function): void;
static remove_CollectionChanged(target: any, f: Function): void;
static add_WatchHandler(target: any, key: string, f: Function): void;
static remove_WatchHandler(target: any, key: string, f: Function): void;
static invokeItemsEvent(targe: any, key: string, index: number, item: any): void;
static setValue(target: any, key: string, value: any): void;
static getValue(target: any, key: string): any;
}
declare class AtomPromise {
static json(url: string, query: any, options: WebAtoms.Rest.AjaxOptions): AtomPromise;
abort(): void;
then(f: (p: AtomPromise) => void): AtomPromise;
failed(f: Function): AtomPromise;
showError(v: boolean): void;
showProgress(v: boolean): void;
invoke(s: string): void;
value(v?: any): any;
error: {
msg?: string;
};
success: any;
onInvoke(f: Function): void;
errors: any[];
handle: Function;
static parseDates(v: any): any;
}
declare namespace WebAtoms {
class AtomControl {
_element: HTMLElement;
constructor(e: HTMLElement);
init(): void;
dispose(e?: HTMLElement): void;
createChildren(): void;
bindEvent(e: HTMLElement, eventName: string, methodName: (string | Function), key?: string, method?: Function): void;
unbindEvent(e: HTMLElement, eventName: string, methodName: (string | Function), key?: string): void;
bind(e: HTMLElement, key: string, value: (Array<string[]> | string[]), twoWays?: boolean, vf?: () => any, events?: string | string[]): void;
viewModel: any;
setLocalValue(key: any, value: any, element: any, refresh: boolean): void;
}
class AtomItemsControl extends AtomControl {
items: any;
selectedItem: any;
readonly selectedItems: any[];
itemTemplate: any;
itemsPresenter: any;
}
class AtomListBox extends AtomItemsControl {
}
/**
* Core class as an replacement for jQuery
* @class Core
*/
class Core {
static addClass(e: HTMLElement, c: string): void;
static removeClass(e: HTMLElement, c: string): void;
static atomParent(element: any): AtomControl;
static hasClass(e: HTMLElement, className: string): any;
static getOffsetRect(e: HTMLElement): Rect;
}
type Rect = {
x: number;
y: number;
width: number;
height: number;
};
}
declare function methodBuilder(method: string): (url: string) => (target: WebAtoms.Rest.BaseService, propertyKey: string, descriptor: any) => void;
declare function Return(type: {
new ();
}): (target: WebAtoms.Rest.BaseService, propertyKey: string, descriptor: any) => void;
declare function parameterBuilder(paramName: string): (key: string) => (target: WebAtoms.Rest.BaseService, propertyKey: string | symbol, parameterIndex: number) => void;
declare type RestAttr = (target: WebAtoms.Rest.BaseService, propertyKey: string | Symbol, parameterIndex: number) => void;
declare type RestParamAttr = (key: string) => RestAttr;
declare type RestMethodAttr = (key: string) => (target: WebAtoms.Rest.BaseService, propertyKey: string | Symbol, descriptor: any) => void;
/**
* This will register Url path fragment on parameter.
*
* @example
*
* @Get("/api/products/{category}")
* async getProducts(
* @Path("category") category: number
* ): Promise<Product[]> {
* }
*
* @export
* @function Path
* @param {name} - Name of the parameter
*/
declare var Path: RestParamAttr;
/**
* This will register header on parameter.
*
* @example
*
* @Get("/api/products/{category}")
* async getProducts(
* @Header("x-http-auth") category: number
* ): Promise<Product[]> {
* }
*
* @export
* @function Path
* @param {name} - Name of the parameter
*/
declare var Header: RestParamAttr;
/**
* This will register Url query fragment on parameter.
*
* @example
*
* @Get("/api/products")
* async getProducts(
* @Query("category") category: number
* ): Promise<Product[]> {
* }
*
* @export
* @function Query
* @param {name} - Name of the parameter
*/
declare var Query: RestParamAttr;
/**
* This will register data fragment on ajax.
*
* @example
*
* @Post("/api/products")
* async getProducts(
* @Query("id") id: number,
* @Body product: Product
* ): Promise<Product[]> {
* }
*
* @export
* @function Body
*/
declare var Body: RestAttr;
/**
* This will register data fragment on ajax in old formModel way.
*
* @example
*
* @Post("/api/products")
* async getProducts(
* @Query("id") id: number,
* @BodyFormModel product: Product
* ): Promise<Product[]> {
* }
*
* @export
* @function BodyFormModel
*/
declare var BodyFormModel: RestAttr;
/**
* Http Post method
* @example
*
* @Post("/api/products")
* async saveProduct(
* @Body product: Product
* ): Promise<Product> {
* }
*
* @export
* @function Post
* @param {url} - Url for the operation
*/
declare var Post: RestMethodAttr;
/**
* Http Get Method
*
* @example
*
* @Get("/api/products/{category}")
* async getProducts(
* @Path("category") category?:string
* ): Promise<Product[]> {
* }
*
* @export
* @function Body
*/
declare var Get: RestMethodAttr;
/**
* Http Delete method
* @example
*
* @Delete("/api/products")
* async deleteProduct(
* @Body product: Product
* ): Promise<Product> {
* }
*
* @export
* @function Delete
* @param {url} - Url for the operation
*/
declare var Delete: RestMethodAttr;
/**
* Http Put method
* @example
*
* @Put("/api/products")
* async saveProduct(
* @Body product: Product
* ): Promise<Product> {
* }
*
* @export
* @function Put
* @param {url} - Url for the operation
*/
declare var Put: RestMethodAttr;
/**
* Http Patch method
* @example
*
* @Patch("/api/products")
* async saveProduct(
* @Body product: any
* ): Promise<Product> {
* }
*
* @export
* @function Patch
* @param {url} - Url for the operation
*/
declare var Patch: RestMethodAttr;
/**
* Cancellation token
* @example
*
* @Put("/api/products")
* async saveProduct(
* @Body product: Product
* @Cancel cancel: CancelToken
* ): Promise<Product> {
* }
*
* @export
* @function Put
* @param {url} - Url for the operation
*/
declare function Cancel(target: WebAtoms.Rest.BaseService, propertyKey: string | symbol, parameterIndex: number): void;
declare namespace WebAtoms.Rest {
class ServiceParameter {
key: string;
type: string;
constructor(type: string, key: string);
}
class AjaxOptions {
dataType: string;
contentType: string;
method: string;
url: string;
data: any;
type: string;
cancel: CancelToken;
headers: any;
inputProcessed: boolean;
success: Function;
error: any;
cache: any;
attachments: any[];
xhr: any;
processData: boolean;
}
/**
*
*
* @export
* @class CancellablePromise
* @implements {Promise<T>}
* @template T
*/
class CancellablePromise<T> implements Promise<T> {
[Symbol.toStringTag]: "Promise";
onCancel: () => void;
p: Promise<T>;
constructor(p: Promise<T>, onCancel: () => void);
abort(): void;
then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;
catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
}
/**
*
*
* @export
* @class BaseService
*/
class BaseService {
testMode: boolean;
showProgress: boolean;
showError: boolean;
methods: any;
methodReturns: any;
static cloneObject(dupeObj: any): any;
encodeData(o: AjaxOptions): AjaxOptions;
sendResult(result: any, error?: any): Promise<any>;
invoke(url: string, method: string, bag: Array<ServiceParameter>, values: Array<any>, returns: {
new ();
}): Promise<any>;
ajax(url: string, options: AjaxOptions): AtomPromise;
}
}
declare namespace WebAtoms {
/**
*
*
* @export
* @class WindowService
*/
class WindowService {
/**
* Reference used by popup opener as an anchor
* @type {HTMLElement}
* @memberof WindowService
*/
currentTarget: HTMLElement;
popups: AtomControl[];
/**
*
*/
constructor();
private closePopup();
private close(c);
lastPopupID: number;
/**
* This method will open a new popup identified by name of the popup or class of popup.
* Supplied view model has to be derived from AtomWindowViewModel.
*
*
* @example
*
* var result = await windowService.openPopup<Task>(NewTaskWindow, new NewTaskWindowViewModel() );
*
* class NewTaskWindowViewModel extends AtomWindowViewModel{
*
* ....
* save(){
*
* // close and send result
* this.close(task);
*
* }
* ....
*
* }
*
* @template T
* @param {(string | {new(e)})} windowType
* @param {AtomWindowViewModel} [viewModel]
* @returns {Promise<T>}
* @memberof WindowService
*/
openPopup<T>(p: (HTMLElement | AtomControlType), vm: AtomWindowViewModel): Promise<T>;
private _openPopupAsync<T>(p, vm);
/**
* Resolves current Window Service, you can use this method
* to resolve service using DI, internally it calls
* DI.resolve(WindowService).
*
* @readonly
* @static
* @type {WindowService}
* @memberof WindowService
*/
static readonly instance: WindowService;
private lastWindowID;
/**
* Display an alert, and method will continue after alert is closed.
*
* @param {string} msg
* @param {string} [title]
* @returns {Promise<any>}
* @memberof WindowService
*/
alert(msg: string, title?: string): Promise<any>;
/**
* Display a confirm window with promise that will resolve when yes or no
* is clicked.
*
* @param {string} msg
* @param {string} [title]
* @returns {Promise<boolean>}
* @memberof WindowService
*/
confirm(msg: string, title?: string): Promise<boolean>;
private showAlert(msg, title, confirm);
/**
*
*
* @param {string} frameHostId
* @param {((string | {new (e:any)}))} frameType
* @param {AtomViewModel} [viewModel]
* @returns {Promise<any>}
* @memberof WindowService
*/
pushPage(frameHostId: string, frameType: (string | {
new (e: any);
}), viewModel?: AtomPageViewModel): Promise<any>;
/**
* zIndex of next window
* @type {number}
* @memberof WindowService
*/
private zIndex;
/**
* This method will open a new window identified by name of the window or class of window.
* Supplied view model has to be derived from AtomWindowViewModel.
*
* By default this window has a localScope, so it does not corrupt scope.
*
* @example
*
* var result = await windowService.openWindow<Task>(NewTaskWindow, new NewTaskWindowViewModel() );
*
* class NewTaskWindowViewModel extends AtomWindowViewModel{
*
* ....
* save(){
*
* // close and send result
* this.close(task);
*
* }
* ....
*
* }
*
* @template T
* @param {(string | {new(e)})} windowType
* @param {AtomWindowViewModel} [viewModel]
* @returns {Promise<T>}
* @memberof WindowService
*/
openWindow<T>(windowType: string | {
new (e: any);
}, viewModel?: AtomWindowViewModel): Promise<T>;
}
}
declare var WindowService: typeof WebAtoms.WindowService;