nmce-func 0.0.4 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_func/addressFunc.d.ts +31 -0
- package/_func/authentication.service.d.ts +27 -0
- package/_func/currencyFunc.d.ts +20 -0
- package/_func/dateFunc.d.ts +121 -0
- package/_func/htmlPrintFunc.d.ts +18 -0
- package/_func/index.d.ts +10 -0
- package/_func/javascriptFunc.d.ts +9 -0
- package/_func/jsonFunc.d.ts +31 -0
- package/_func/stringAusFunc.d.ts +40 -0
- package/_func/stringFunc.d.ts +41 -0
- package/_func/uuidFunc.d.ts +7 -0
- package/esm2020/_func/addressFunc.mjs +49 -0
- package/esm2020/_func/authentication.service.mjs +43 -0
- package/esm2020/_func/currencyFunc.mjs +72 -0
- package/esm2020/_func/dateFunc.mjs +316 -0
- package/esm2020/_func/htmlPrintFunc.mjs +45 -0
- package/esm2020/_func/index.mjs +11 -0
- package/esm2020/_func/javascriptFunc.mjs +17 -0
- package/esm2020/_func/jsonFunc.mjs +67 -0
- package/esm2020/_func/stringAusFunc.mjs +200 -0
- package/esm2020/_func/stringFunc.mjs +93 -0
- package/esm2020/_func/uuidFunc.mjs +17 -0
- package/esm2020/nmce-func.mjs +5 -0
- package/esm2020/public-api.mjs +5 -0
- package/fesm2015/nmce-func.mjs +931 -0
- package/fesm2015/nmce-func.mjs.map +1 -0
- package/fesm2020/nmce-func.mjs +929 -0
- package/fesm2020/nmce-func.mjs.map +1 -0
- package/nmce-func.d.ts +5 -0
- package/package.json +33 -7
- package/public-api.d.ts +1 -0
- package/karma.conf.js +0 -44
- package/ng-package.json +0 -11
- package/src/_func/addressFunc.spec.ts +0 -12
- package/src/_func/addressFunc.ts +0 -54
- package/src/_func/authentication.service.ts +0 -47
- package/src/_func/currencyFunc.ts +0 -71
- package/src/_func/dateFunc.spec.ts +0 -191
- package/src/_func/dateFunc.ts +0 -385
- package/src/_func/helperFunc.ts +0 -27
- package/src/_func/htmlFunc.ts +0 -46
- package/src/_func/index.ts +0 -9
- package/src/_func/jsFunc.ts +0 -48
- package/src/_func/stringFunc.spec.ts +0 -142
- package/src/_func/stringFunc.ts +0 -337
- package/src/public-api.ts +0 -5
- package/src/test.ts +0 -26
- package/tsconfig.lib.json +0 -25
- package/tsconfig.lib.prod.json +0 -11
- package/tsconfig.spec.json +0 -17
- package/tslint.json +0 -17
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare class AddressFunc {
|
|
2
|
+
/**
|
|
3
|
+
* Compose to one line separated by comma
|
|
4
|
+
* @param st1
|
|
5
|
+
* @param st2
|
|
6
|
+
* @param city
|
|
7
|
+
* @param state
|
|
8
|
+
* @param postcode
|
|
9
|
+
*/
|
|
10
|
+
static composeOneLineAddress(st1: string | undefined, st2: string | undefined, city: string | undefined, state: string | undefined, postcode: string | undefined): string;
|
|
11
|
+
/**
|
|
12
|
+
* Compose to multiple separated by \n
|
|
13
|
+
* @param st1
|
|
14
|
+
* @param st2
|
|
15
|
+
* @param city
|
|
16
|
+
* @param state
|
|
17
|
+
* @param postcode
|
|
18
|
+
*/
|
|
19
|
+
static composeMultiLineAddress(st1: string | undefined, st2: string | undefined, city: string | undefined, state: string | undefined, postcode: string | undefined): string;
|
|
20
|
+
/**
|
|
21
|
+
* Compose with separator
|
|
22
|
+
* @param st1
|
|
23
|
+
* @param st2
|
|
24
|
+
* @param city
|
|
25
|
+
* @param state
|
|
26
|
+
* @param postcode
|
|
27
|
+
* @param sep
|
|
28
|
+
*/
|
|
29
|
+
static composeAddress(st1: string | undefined, st2: string | undefined, city: string | undefined, state: string | undefined, postcode: string | undefined, sep: string | undefined): string;
|
|
30
|
+
static composeGoogleMapsAuUrl(st1: string | undefined, st2: string | undefined, city: string | undefined, state: string | undefined, country: string | undefined): string;
|
|
31
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Login and saving tokens in sessionStorage.
|
|
5
|
+
* App needs to provide constant 'auth.tokenUrl'.
|
|
6
|
+
*/
|
|
7
|
+
export declare class AuthenticationService {
|
|
8
|
+
private authUri;
|
|
9
|
+
private http;
|
|
10
|
+
userName: string;
|
|
11
|
+
constructor(authUri: string, http: HttpClient);
|
|
12
|
+
/**
|
|
13
|
+
* Login and save tokens to sessionStorage then return an observable.
|
|
14
|
+
* @param username
|
|
15
|
+
* @param password
|
|
16
|
+
*/
|
|
17
|
+
login(username: string, password: string): import("rxjs").Observable<{
|
|
18
|
+
access_token?: string | undefined;
|
|
19
|
+
expires?: string | undefined;
|
|
20
|
+
expires_in?: number | undefined;
|
|
21
|
+
issued?: string | undefined;
|
|
22
|
+
token_type?: string | undefined;
|
|
23
|
+
username: string;
|
|
24
|
+
}>;
|
|
25
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AuthenticationService, never>;
|
|
26
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<AuthenticationService>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Currency calculations. Undefined input of number is considered zero, just like null.
|
|
3
|
+
*/
|
|
4
|
+
export declare class CurrencyFunc {
|
|
5
|
+
private static DECIMAL_SEPARATOR;
|
|
6
|
+
private static THOUSANDS_SEPARATOR;
|
|
7
|
+
private static PADDING;
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
* @param num
|
|
11
|
+
* @param decimalPlaces default 0
|
|
12
|
+
*/
|
|
13
|
+
static bankerRound(num: number | null | undefined, decimalPlaces?: number): number;
|
|
14
|
+
static bankerRoundTo5cents(num: number | null | undefined): number;
|
|
15
|
+
static ceilTo5cents(num: number | null | undefined): number;
|
|
16
|
+
static transformCurrency(value: number | string | undefined, fractionSize?: number): string;
|
|
17
|
+
static parseCurrency(value: string | undefined, fractionSize?: number): string;
|
|
18
|
+
static pad(num: number | null | undefined, size: number): string;
|
|
19
|
+
static sum(ns: (number | null | undefined)[]): number;
|
|
20
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import moment from 'moment';
|
|
2
|
+
export declare class DateFunc {
|
|
3
|
+
/**
|
|
4
|
+
* Transform UTC DateTime to local date without H, M and S. For example, the month day of 2018-01-23T22:00:00Z is 24 in Australia.
|
|
5
|
+
* @param dtUtc
|
|
6
|
+
* @param offsetMinutes if not defined, it will be new Date().getTimezoneOffset(). //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
|
|
7
|
+
*/
|
|
8
|
+
static dateTimeUtcToLocalDateNumber(dtUtc: Date | null | undefined): number;
|
|
9
|
+
/**
|
|
10
|
+
* Date only. However, the date may still be in UTC.
|
|
11
|
+
* @param dtUtc
|
|
12
|
+
*/
|
|
13
|
+
static dateTimeUtcToLocalDate(dtUtc: Date | null | undefined): Date;
|
|
14
|
+
static localISODateString(dtUtc: Date | null | undefined): string;
|
|
15
|
+
/**
|
|
16
|
+
* locate date ONLY (no time) to UTC date.
|
|
17
|
+
* @param dt if dt contain time info, it will become dt.setHours(0, 0, 0, 0)
|
|
18
|
+
*/
|
|
19
|
+
static localDateToUtc(d: Date | number | null | undefined | string): Date;
|
|
20
|
+
static getTimezoneOffset(): number;
|
|
21
|
+
/**
|
|
22
|
+
* Transform UTC DateTime to local dateTime.
|
|
23
|
+
* @param dtUtc
|
|
24
|
+
* @param offsetMinutes if not defined, it will be new Date().getTimezoneOffset(). //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
|
|
25
|
+
*/
|
|
26
|
+
static dateTimeUtcToLocalDateTime(dtUtc: Date | null | undefined): Date;
|
|
27
|
+
static dateTimeUtcToLocaMoment(dtUtc: Date | null | undefined): moment.Moment;
|
|
28
|
+
static getEndOfWeek(dt: Date | null | undefined | number): Date;
|
|
29
|
+
static getStartOfWeek(dt: Date | null | undefined | number): Date;
|
|
30
|
+
static getEndOfMonth(dt: Date | null | undefined | number): Date;
|
|
31
|
+
static getStartOfMonth(dt: Date | null | undefined | number): Date;
|
|
32
|
+
static getDaysBetweenDates(dt1: Date | null | undefined, dt2: Date | null | undefined): number;
|
|
33
|
+
static getEndOfDate(dt: Date | null | undefined): Date;
|
|
34
|
+
static getStartOfDate(dt: Date | null | undefined): Date;
|
|
35
|
+
static getEndOfToday(): Date;
|
|
36
|
+
static getStartOfToday(): Date;
|
|
37
|
+
static addDays(dt: Date | null | undefined, days?: number): Date;
|
|
38
|
+
static subtractDays(dt: Date | null | undefined, days?: number): Date;
|
|
39
|
+
/**
|
|
40
|
+
* Start of today
|
|
41
|
+
*/
|
|
42
|
+
static get today(): Date;
|
|
43
|
+
static get now(): Date;
|
|
44
|
+
static getNext5MinuteMark(): Date;
|
|
45
|
+
static getYMD(d: Date): string;
|
|
46
|
+
static getDMYWithSlash(d: Date): string;
|
|
47
|
+
static getDMYHmWithSlash(d: Date): string;
|
|
48
|
+
static getMcpTime(dt: Date | null | undefined): string;
|
|
49
|
+
/**
|
|
50
|
+
* In 24 hour format
|
|
51
|
+
* @param dtUtc
|
|
52
|
+
*/
|
|
53
|
+
static getLocalDMYHmWithSlash(dtUtc: Date | null | undefined): string;
|
|
54
|
+
/**
|
|
55
|
+
* Offset minutes comparing with today
|
|
56
|
+
*/
|
|
57
|
+
static getOffsetMinutes(dtUtc: Date | null | undefined | number): number;
|
|
58
|
+
static getDaysBetween(d1?: Date | number | null | undefined, d2?: Date | number | null | undefined): number;
|
|
59
|
+
/**
|
|
60
|
+
* Get hour of the date. If Date is not defined, the hour will be current hour.
|
|
61
|
+
* @param dtUtc
|
|
62
|
+
*/
|
|
63
|
+
static getHour(dtUtc: Date | null | undefined | number): number;
|
|
64
|
+
static getMinute(dtUtc: Date | null | undefined | number): number;
|
|
65
|
+
static composeDateTime(dt: Date | null | undefined, h?: number, minute?: number): Date;
|
|
66
|
+
static olderThan24Hours(d: Date | null | undefined): boolean;
|
|
67
|
+
static olderThan24HoursUtc(dtUtc: Date | null | undefined): boolean;
|
|
68
|
+
static olderThanHours(d: Date, hours: number): boolean;
|
|
69
|
+
static olderThanHoursUtc(dtUtc: Date | null | undefined, hours: number): boolean;
|
|
70
|
+
static olderThanMinutes(d: Date, minutes: number): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* It could be 11PM yesterday, and 1 AM today. Actually based on local today.
|
|
73
|
+
*/
|
|
74
|
+
static olderThan1Day(dtUtc: Date | null | undefined): boolean;
|
|
75
|
+
static getHourAge(d: Date): number;
|
|
76
|
+
static getHourAgeUtc(dtUtc: Date | null | undefined): number;
|
|
77
|
+
/**
|
|
78
|
+
* Compare utc date with utc now.
|
|
79
|
+
* @param dtUtc
|
|
80
|
+
*/
|
|
81
|
+
static getDayAgeUtc(dtUtc: Date | null | undefined): number;
|
|
82
|
+
/**
|
|
83
|
+
* How many years from now.
|
|
84
|
+
* @param d
|
|
85
|
+
* @returns
|
|
86
|
+
*/
|
|
87
|
+
static getAge(d: Date): number;
|
|
88
|
+
/**
|
|
89
|
+
* Year of date.
|
|
90
|
+
* @param d
|
|
91
|
+
* @returns
|
|
92
|
+
*/
|
|
93
|
+
static getYear(d: Date): number;
|
|
94
|
+
static getUtcNow(): Date;
|
|
95
|
+
static addMinutes(d: Date, m: number): Date;
|
|
96
|
+
static addMonth(d: Date, m: number): Date;
|
|
97
|
+
static getDuration(d1: Date, d2: Date): moment.Duration;
|
|
98
|
+
/**
|
|
99
|
+
* Convert minutes from midnight to HH:mm text
|
|
100
|
+
* @param mins
|
|
101
|
+
*/
|
|
102
|
+
static getHMFromMins(mins: number): string;
|
|
103
|
+
static getMinutesSinceMidnight(d: Date | null | undefined): number;
|
|
104
|
+
static getMinutesBetween(start: Date | null | undefined, end: Date | null | undefined): number;
|
|
105
|
+
/**
|
|
106
|
+
* Parse json string with date serialized into string, and get proper date object back
|
|
107
|
+
* @param s
|
|
108
|
+
*/
|
|
109
|
+
static dateSafeJsonParse(s: string): any;
|
|
110
|
+
private static dateReviver;
|
|
111
|
+
private static isSerializedDate;
|
|
112
|
+
private static isString;
|
|
113
|
+
static dateSafeParse(s: string | Date): Date;
|
|
114
|
+
static composeDateWithMinutes(d: Date, minute: number): Date;
|
|
115
|
+
/**
|
|
116
|
+
* Safe compare since date data may be considered as string rather than date.
|
|
117
|
+
* @param d1
|
|
118
|
+
* @param d2
|
|
119
|
+
*/
|
|
120
|
+
static compare(d1: Date | undefined, d2: Date | undefined): number;
|
|
121
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare class HtmlPrintFunc {
|
|
2
|
+
/**
|
|
3
|
+
* Print with CSS for internal reports
|
|
4
|
+
* @param htmlTags
|
|
5
|
+
* @param cssUrl
|
|
6
|
+
*/
|
|
7
|
+
static printWithCSS(htmlTags: string, cssUrl: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Print for external documents.
|
|
10
|
+
* @param htmlTags
|
|
11
|
+
*/
|
|
12
|
+
static print(htmlTags: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Print image url through html img.
|
|
15
|
+
* @param url
|
|
16
|
+
*/
|
|
17
|
+
static printImage(url: string): void;
|
|
18
|
+
}
|
package/_func/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './addressFunc';
|
|
2
|
+
export * from './authentication.service';
|
|
3
|
+
export * from './currencyFunc';
|
|
4
|
+
export * from './dateFunc';
|
|
5
|
+
export * from './htmlPrintFunc';
|
|
6
|
+
export * from './javascriptFunc';
|
|
7
|
+
export * from './jsonFunc';
|
|
8
|
+
export * from './stringAusFunc';
|
|
9
|
+
export * from './stringFunc';
|
|
10
|
+
export * from './uuidFunc';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class JavaScriptFunc {
|
|
2
|
+
/**
|
|
3
|
+
* Some business functions depend on external JavaScript libraries. Lazy loading of respective business modules is good,
|
|
4
|
+
* and this function supports lazy loading of JS libraries.
|
|
5
|
+
* @param scriptUrl
|
|
6
|
+
* @returns Promise for subsequent JS function calls.
|
|
7
|
+
*/
|
|
8
|
+
static loadExternalScript(scriptUrl: string): Promise<unknown>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Basic JSON functions
|
|
3
|
+
*/
|
|
4
|
+
export declare class JsonFunc {
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @param array Group by a property of array element.
|
|
8
|
+
* @param propertyName
|
|
9
|
+
* @returns
|
|
10
|
+
*/
|
|
11
|
+
static groupBy<T>(array: Array<T>, propertyName: string): any;
|
|
12
|
+
/**
|
|
13
|
+
* Group by a date property. The key is always of string type and representing milliseconds.
|
|
14
|
+
* The client should convert the string to number.
|
|
15
|
+
* Angular date pipe could actually consume such string without explicitly converting to number.
|
|
16
|
+
* @param array
|
|
17
|
+
* @param propertyName
|
|
18
|
+
*/
|
|
19
|
+
static groupByDate<T>(array: Array<T>, propertyName: string): any;
|
|
20
|
+
/**
|
|
21
|
+
* Remove null or empty fields including those in nested objects.
|
|
22
|
+
* This is useful for reducing payload of AJAX serialization.
|
|
23
|
+
* @param obj
|
|
24
|
+
*/
|
|
25
|
+
static removeNullOrEmptyFields(obj: any): void;
|
|
26
|
+
/**
|
|
27
|
+
*
|
|
28
|
+
* @param obj Remove null fields of object at only the 1st level.
|
|
29
|
+
*/
|
|
30
|
+
static removeNullFields(obj: any): void;
|
|
31
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* String functions specific to Australia
|
|
3
|
+
*/
|
|
4
|
+
export declare class StringAusFunc {
|
|
5
|
+
private static acnWeights;
|
|
6
|
+
private static weights;
|
|
7
|
+
private static suggestLookup;
|
|
8
|
+
/**
|
|
9
|
+
* Validate medicare number
|
|
10
|
+
* @param n
|
|
11
|
+
* @returns validation error message
|
|
12
|
+
*/
|
|
13
|
+
static validateMedicare(n: string | null | undefined): {
|
|
14
|
+
code: number;
|
|
15
|
+
message: string;
|
|
16
|
+
} | null;
|
|
17
|
+
static validateMedicareProviderNumber(providerNumber: string | null | undefined): {
|
|
18
|
+
code: number;
|
|
19
|
+
message: string;
|
|
20
|
+
} | null;
|
|
21
|
+
static validateDVAFileNumber(dva: string | null | undefined): {
|
|
22
|
+
code: number;
|
|
23
|
+
message: string;
|
|
24
|
+
} | null;
|
|
25
|
+
static validateTFN(n: string | null | undefined): {
|
|
26
|
+
code: number;
|
|
27
|
+
message: string;
|
|
28
|
+
} | null;
|
|
29
|
+
private static addWeighted;
|
|
30
|
+
private static addAcnWeighted;
|
|
31
|
+
private static generateLookup;
|
|
32
|
+
static validateABN(abn: string | null | undefined): {
|
|
33
|
+
code: number;
|
|
34
|
+
message: string;
|
|
35
|
+
} | null;
|
|
36
|
+
static validateACN(acn: string | null | undefined): {
|
|
37
|
+
code: number;
|
|
38
|
+
message: string;
|
|
39
|
+
} | null;
|
|
40
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export declare class StringFunc {
|
|
2
|
+
/**
|
|
3
|
+
* Up to 2 letters. For John Smith, returns JS, for Huang, Zijian, returns ZH
|
|
4
|
+
* @param s
|
|
5
|
+
*/
|
|
6
|
+
static getAbbr(s: string | null | undefined): string;
|
|
7
|
+
/**
|
|
8
|
+
* A substring with line breaks replaced by space.
|
|
9
|
+
* @param s
|
|
10
|
+
* @param length
|
|
11
|
+
* @returns result, or empty string if the input is empty, null or undefined
|
|
12
|
+
*/
|
|
13
|
+
static getOneLineDigest(s: string | null | undefined, length: number): string;
|
|
14
|
+
/**
|
|
15
|
+
* Remove line breaks and econde with encodeURI() so the data could be saved in Azure as meta. If the string is truncated, the return will have ... suffix.
|
|
16
|
+
* @param s
|
|
17
|
+
* @param length
|
|
18
|
+
* @returns result, or empty string if the input is empty, null or undefined
|
|
19
|
+
*/
|
|
20
|
+
static getOneLineDigestOfHtml(s: string | null | undefined, length: number): string;
|
|
21
|
+
/**
|
|
22
|
+
* Pad number with zero
|
|
23
|
+
* @param num
|
|
24
|
+
* @param size
|
|
25
|
+
* @returns
|
|
26
|
+
*/
|
|
27
|
+
static pad(num: number | undefined, size: number): string;
|
|
28
|
+
/**
|
|
29
|
+
* get plain text of HTML content
|
|
30
|
+
* @param s
|
|
31
|
+
* @returns result. If input is empty, null, or undefined, return the same.
|
|
32
|
+
*/
|
|
33
|
+
static getHtmlPlainText(s: string | null | undefined): string | null;
|
|
34
|
+
/**
|
|
35
|
+
*
|
|
36
|
+
* @param s
|
|
37
|
+
* @returns result. If input is empty, null, or undefined, return the same.
|
|
38
|
+
*/
|
|
39
|
+
static capitalizeWords(s: string | null | undefined): string | null | undefined;
|
|
40
|
+
static validateEmail(email: string | null | undefined): boolean;
|
|
41
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export class AddressFunc {
|
|
2
|
+
/**
|
|
3
|
+
* Compose to one line separated by comma
|
|
4
|
+
* @param st1
|
|
5
|
+
* @param st2
|
|
6
|
+
* @param city
|
|
7
|
+
* @param state
|
|
8
|
+
* @param postcode
|
|
9
|
+
*/
|
|
10
|
+
static composeOneLineAddress(st1, st2, city, state, postcode) {
|
|
11
|
+
return AddressFunc.composeAddress(st1, st2, city, state, postcode, ', ');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Compose to multiple separated by \n
|
|
15
|
+
* @param st1
|
|
16
|
+
* @param st2
|
|
17
|
+
* @param city
|
|
18
|
+
* @param state
|
|
19
|
+
* @param postcode
|
|
20
|
+
*/
|
|
21
|
+
static composeMultiLineAddress(st1, st2, city, state, postcode) {
|
|
22
|
+
return AddressFunc.composeAddress(st1, st2, city, state, postcode, '\n');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Compose with separator
|
|
26
|
+
* @param st1
|
|
27
|
+
* @param st2
|
|
28
|
+
* @param city
|
|
29
|
+
* @param state
|
|
30
|
+
* @param postcode
|
|
31
|
+
* @param sep
|
|
32
|
+
*/
|
|
33
|
+
static composeAddress(st1, st2, city, state, postcode, sep) {
|
|
34
|
+
const r = (st1 ? (st1 + sep) : '') + (st2 ? (st2 + sep) : '') + (city ? (city + sep) : '') + (state ? (state + ' ') : '') + (postcode ? postcode : '');
|
|
35
|
+
return r;
|
|
36
|
+
}
|
|
37
|
+
static composeGoogleMapsAuUrl(st1, st2, city, state, country) {
|
|
38
|
+
const googleBaseUrl = 'https://www.google.com.au/maps?hl=en&q=';
|
|
39
|
+
const fff = (s) => {
|
|
40
|
+
if (!s) {
|
|
41
|
+
return '';
|
|
42
|
+
}
|
|
43
|
+
return '+' + encodeURIComponent(s.replace(' ', '+')) + ',';
|
|
44
|
+
};
|
|
45
|
+
const ss = fff(st1) + fff(st2) + fff(city) + fff(state) + fff(country);
|
|
46
|
+
return googleBaseUrl + ss;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzc0Z1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2FkZHJlc3NGdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxXQUFXO0lBQ3ZCOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMscUJBQXFCLENBQUMsR0FBdUIsRUFBRSxHQUF1QixFQUFFLElBQXdCLEVBQUUsS0FBeUIsRUFBRSxRQUE0QjtRQUMvSixPQUFPLFdBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxHQUF1QixFQUFFLEdBQXVCLEVBQUUsSUFBd0IsRUFBRSxLQUF5QixFQUFFLFFBQTRCO1FBQ2pLLE9BQU8sV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBdUIsRUFBRSxHQUF1QixFQUFFLElBQXdCLEVBQUUsS0FBeUIsRUFBRSxRQUE0QixFQUFFLEdBQXVCO1FBQ2pMLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkosT0FBTyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEdBQXVCLEVBQUUsR0FBdUIsRUFBRSxJQUF3QixFQUFFLEtBQXlCLEVBQUUsT0FBMkI7UUFDL0osTUFBTSxhQUFhLEdBQUcseUNBQXlDLENBQUM7UUFDaEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFxQixFQUFVLEVBQUU7WUFDN0MsSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDUCxPQUFPLEVBQUUsQ0FBQzthQUNWO1lBRUQsT0FBTyxHQUFHLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDNUQsQ0FBQyxDQUFDO1FBRUYsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RSxPQUFPLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDM0IsQ0FBQztDQUVEIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEFkZHJlc3NGdW5jIHtcclxuXHQvKipcclxuXHQgKiBDb21wb3NlIHRvIG9uZSBsaW5lIHNlcGFyYXRlZCBieSBjb21tYVxyXG5cdCAqIEBwYXJhbSBzdDFcclxuXHQgKiBAcGFyYW0gc3QyXHJcblx0ICogQHBhcmFtIGNpdHlcclxuXHQgKiBAcGFyYW0gc3RhdGVcclxuXHQgKiBAcGFyYW0gcG9zdGNvZGVcclxuXHQgKi9cclxuXHRzdGF0aWMgY29tcG9zZU9uZUxpbmVBZGRyZXNzKHN0MTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdDI6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2l0eTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwb3N0Y29kZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBBZGRyZXNzRnVuYy5jb21wb3NlQWRkcmVzcyhzdDEsIHN0MiwgY2l0eSwgc3RhdGUsIHBvc3Rjb2RlLCAnLCAnKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXBvc2UgdG8gbXVsdGlwbGUgc2VwYXJhdGVkIGJ5IFxcblxyXG5cdCAqIEBwYXJhbSBzdDFcclxuXHQgKiBAcGFyYW0gc3QyXHJcblx0ICogQHBhcmFtIGNpdHlcclxuXHQgKiBAcGFyYW0gc3RhdGVcclxuXHQgKiBAcGFyYW0gcG9zdGNvZGVcclxuXHQgKi9cclxuXHRzdGF0aWMgY29tcG9zZU11bHRpTGluZUFkZHJlc3Moc3QxOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0Mjogc3RyaW5nIHwgdW5kZWZpbmVkLCBjaXR5OiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0YXRlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHBvc3Rjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIEFkZHJlc3NGdW5jLmNvbXBvc2VBZGRyZXNzKHN0MSwgc3QyLCBjaXR5LCBzdGF0ZSwgcG9zdGNvZGUsICdcXG4nKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbXBvc2Ugd2l0aCBzZXBhcmF0b3JcclxuXHQgKiBAcGFyYW0gc3QxXHJcblx0ICogQHBhcmFtIHN0MlxyXG5cdCAqIEBwYXJhbSBjaXR5XHJcblx0ICogQHBhcmFtIHN0YXRlXHJcblx0ICogQHBhcmFtIHBvc3Rjb2RlXHJcblx0ICogQHBhcmFtIHNlcFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBjb21wb3NlQWRkcmVzcyhzdDE6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3QyOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNpdHk6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3RhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgcG9zdGNvZGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgc2VwOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG5cdFx0Y29uc3QgciA9IChzdDEgPyAoc3QxICsgc2VwKSA6ICcnKSArIChzdDIgPyAoc3QyICsgc2VwKSA6ICcnKSArIChjaXR5ID8gKGNpdHkgKyBzZXApIDogJycpICsgKHN0YXRlID8gKHN0YXRlICsgJyAnKSA6ICcnKSArIChwb3N0Y29kZSA/IHBvc3Rjb2RlIDogJycpO1xyXG5cdFx0cmV0dXJuIHI7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgY29tcG9zZUdvb2dsZU1hcHNBdVVybChzdDE6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3QyOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNpdHk6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3RhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgY291bnRyeTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuXHRcdGNvbnN0IGdvb2dsZUJhc2VVcmwgPSAnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS5hdS9tYXBzP2hsPWVuJnE9JztcclxuXHRcdGNvbnN0IGZmZiA9IChzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xyXG5cdFx0XHRpZiAoIXMpIHtcclxuXHRcdFx0XHRyZXR1cm4gJyc7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiAnKycgKyBlbmNvZGVVUklDb21wb25lbnQocy5yZXBsYWNlKCcgJywgJysnKSkgKyAnLCc7XHJcblx0XHR9O1xyXG5cclxuXHRcdGNvbnN0IHNzID0gZmZmKHN0MSkgKyBmZmYoc3QyKSArIGZmZihjaXR5KSArIGZmZihzdGF0ZSkgKyBmZmYoY291bnRyeSk7XHJcblx0XHRyZXR1cm4gZ29vZ2xlQmFzZVVybCArIHNzO1xyXG5cdH1cclxuXHJcbn1cclxuIl19
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
|
+
import { map } from 'rxjs/operators';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common/http";
|
|
5
|
+
/**
|
|
6
|
+
* Login and saving tokens in sessionStorage.
|
|
7
|
+
* App needs to provide constant 'auth.tokenUrl'.
|
|
8
|
+
*/
|
|
9
|
+
export class AuthenticationService {
|
|
10
|
+
constructor(authUri, http) {
|
|
11
|
+
this.authUri = authUri;
|
|
12
|
+
this.http = http;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Login and save tokens to sessionStorage then return an observable.
|
|
16
|
+
* @param username
|
|
17
|
+
* @param password
|
|
18
|
+
*/
|
|
19
|
+
login(username, password) {
|
|
20
|
+
const body = 'username=' + username + '&password=' + password + '&grant_type=password';
|
|
21
|
+
const options = { headers: { 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8' } };
|
|
22
|
+
return this.http.post(this.authUri, body, options)
|
|
23
|
+
.pipe(map(response => {
|
|
24
|
+
//sessionStorage.setItem('access_token', response.access_token); The client code is response to doing these.
|
|
25
|
+
//sessionStorage.setItem('expires_in', response.expires_in.toString());
|
|
26
|
+
//sessionStorage.setItem('token_type', response.token_type);
|
|
27
|
+
//sessionStorage.setItem('issued', response.issued);
|
|
28
|
+
//sessionStorage.setItem('expires', response.expires); // often up to 2 weeks by default in Asp.net identity 2.
|
|
29
|
+
this.userName = response.username;
|
|
30
|
+
//APP_STATUSES.userName = this.userName;
|
|
31
|
+
return response;
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
AuthenticationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: AuthenticationService, deps: [{ token: 'auth.tokenUrl' }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
36
|
+
AuthenticationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: AuthenticationService });
|
|
37
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: AuthenticationService, decorators: [{
|
|
38
|
+
type: Injectable
|
|
39
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
40
|
+
type: Inject,
|
|
41
|
+
args: ['auth.tokenUrl']
|
|
42
|
+
}] }, { type: i1.HttpClient }]; } });
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25tY2UtZnVuYy9zcmMvX2Z1bmMvYXV0aGVudGljYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUVyQzs7O0dBR0c7QUFFSCxNQUFNLE9BQU8scUJBQXFCO0lBR2pDLFlBQTZDLE9BQWUsRUFBVSxJQUFnQjtRQUF6QyxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBWTtJQUN0RixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxRQUFnQixFQUFFLFFBQWdCO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLFdBQVcsR0FBRyxRQUFRLEdBQUcsWUFBWSxHQUFHLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQztRQUN2RixNQUFNLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrREFBa0QsRUFBRSxFQUFFLENBQUM7UUFDcEcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FPbEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDO2FBQzdCLElBQUksQ0FBQyxHQUFHLENBQ1IsUUFBUSxDQUFDLEVBQUU7WUFDViw0R0FBNEc7WUFDNUcsdUVBQXVFO1lBQ3ZFLDREQUE0RDtZQUM1RCxvREFBb0Q7WUFDcEQsK0dBQStHO1lBQy9HLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNsQyx3Q0FBd0M7WUFDeEMsT0FBTyxRQUFRLENBQUM7UUFDakIsQ0FBQyxDQUVELENBQUMsQ0FBQztJQUNMLENBQUM7O2tIQW5DVyxxQkFBcUIsa0JBR2IsZUFBZTtzSEFIdkIscUJBQXFCOzJGQUFyQixxQkFBcUI7a0JBRGpDLFVBQVU7OzBCQUlHLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG4vKipcclxuICogTG9naW4gYW5kIHNhdmluZyB0b2tlbnMgaW4gc2Vzc2lvblN0b3JhZ2UuXHJcbiAqIEFwcCBuZWVkcyB0byBwcm92aWRlIGNvbnN0YW50ICdhdXRoLnRva2VuVXJsJy5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0aW9uU2VydmljZSB7XHJcblx0dXNlck5hbWU6IHN0cmluZztcclxuXHJcblx0Y29uc3RydWN0b3IoQEluamVjdCgnYXV0aC50b2tlblVybCcpIHByaXZhdGUgYXV0aFVyaTogc3RyaW5nLCBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExvZ2luIGFuZCBzYXZlIHRva2VucyB0byBzZXNzaW9uU3RvcmFnZSB0aGVuIHJldHVybiBhbiBvYnNlcnZhYmxlLlxyXG5cdCAqIEBwYXJhbSB1c2VybmFtZVxyXG5cdCAqIEBwYXJhbSBwYXNzd29yZFxyXG5cdCAqL1xyXG5cdGxvZ2luKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpIHtcclxuXHRcdGNvbnN0IGJvZHkgPSAndXNlcm5hbWU9JyArIHVzZXJuYW1lICsgJyZwYXNzd29yZD0nICsgcGFzc3dvcmQgKyAnJmdyYW50X3R5cGU9cGFzc3dvcmQnO1xyXG5cdFx0Y29uc3Qgb3B0aW9ucyA9IHsgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCcgfSB9O1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0PHtcclxuXHRcdFx0YWNjZXNzX3Rva2VuPzogc3RyaW5nO1xyXG5cdFx0XHRleHBpcmVzPzogc3RyaW5nO1xyXG5cdFx0XHRleHBpcmVzX2luPzogbnVtYmVyO1xyXG5cdFx0XHRpc3N1ZWQ/OiBzdHJpbmc7XHJcblx0XHRcdHRva2VuX3R5cGU/OiBzdHJpbmc7XHJcblx0XHRcdHVzZXJuYW1lOiBzdHJpbmc7XHJcblx0XHR9Pih0aGlzLmF1dGhVcmksIGJvZHksIG9wdGlvbnMpXHJcblx0XHRcdC5waXBlKG1hcChcclxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XHJcblx0XHRcdFx0XHQvL3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2FjY2Vzc190b2tlbicsIHJlc3BvbnNlLmFjY2Vzc190b2tlbik7IFRoZSBjbGllbnQgY29kZSBpcyByZXNwb25zZSB0byBkb2luZyB0aGVzZS5cclxuXHRcdFx0XHRcdC8vc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZXhwaXJlc19pbicsIHJlc3BvbnNlLmV4cGlyZXNfaW4udG9TdHJpbmcoKSk7XHJcblx0XHRcdFx0XHQvL3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3Rva2VuX3R5cGUnLCByZXNwb25zZS50b2tlbl90eXBlKTtcclxuXHRcdFx0XHRcdC8vc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnaXNzdWVkJywgcmVzcG9uc2UuaXNzdWVkKTtcclxuXHRcdFx0XHRcdC8vc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZXhwaXJlcycsIHJlc3BvbnNlLmV4cGlyZXMpOyAvLyBvZnRlbiB1cCB0byAyIHdlZWtzIGJ5IGRlZmF1bHQgaW4gQXNwLm5ldCBpZGVudGl0eSAyLlxyXG5cdFx0XHRcdFx0dGhpcy51c2VyTmFtZSA9IHJlc3BvbnNlLnVzZXJuYW1lO1xyXG5cdFx0XHRcdFx0Ly9BUFBfU1RBVFVTRVMudXNlck5hbWUgPSB0aGlzLnVzZXJOYW1lO1xyXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdCkpO1xyXG5cdH1cclxuXHJcbn1cclxuIl19
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Currency calculations. Undefined input of number is considered zero, just like null.
|
|
3
|
+
*/
|
|
4
|
+
export class CurrencyFunc {
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @param num
|
|
8
|
+
* @param decimalPlaces default 0
|
|
9
|
+
*/
|
|
10
|
+
static bankerRound(num, decimalPlaces) {
|
|
11
|
+
if (!num) {
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
14
|
+
const d = decimalPlaces || 0;
|
|
15
|
+
const m = Math.pow(10, d);
|
|
16
|
+
const n = +(d ? num * m : num).toFixed(8); // Avoid rounding errors
|
|
17
|
+
const i = Math.floor(n), f = n - i;
|
|
18
|
+
const e = 1e-8; // Allow for rounding errors in f
|
|
19
|
+
const r = (f > 0.5 - e && f < 0.5 + e) ?
|
|
20
|
+
((i % 2 === 0) ? i : i + 1) : Math.round(n);
|
|
21
|
+
return d ? r / m : r;
|
|
22
|
+
}
|
|
23
|
+
static bankerRoundTo5cents(num) {
|
|
24
|
+
if (!num) {
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
27
|
+
const r = this.bankerRound(Math.ceil(num * 20 - 0.5) / 20, 2);
|
|
28
|
+
return r;
|
|
29
|
+
}
|
|
30
|
+
static ceilTo5cents(num) {
|
|
31
|
+
if (!num) {
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
const r = this.bankerRound(Math.ceil(num * 20) / 20, 4);
|
|
35
|
+
const roundup = Math.ceil(r * 10000) / 10000;
|
|
36
|
+
return roundup;
|
|
37
|
+
}
|
|
38
|
+
static transformCurrency(value, fractionSize = 2) {
|
|
39
|
+
let [integer, fraction = ''] = (value || '').toString()
|
|
40
|
+
.split(this.DECIMAL_SEPARATOR);
|
|
41
|
+
fraction = fractionSize > 0
|
|
42
|
+
? this.DECIMAL_SEPARATOR + (fraction + this.PADDING).substring(0, fractionSize)
|
|
43
|
+
: '';
|
|
44
|
+
integer = integer.replace(/\B(?=(\d{3})+(?!\d))/g, this.THOUSANDS_SEPARATOR);
|
|
45
|
+
return integer + fraction;
|
|
46
|
+
}
|
|
47
|
+
static parseCurrency(value, fractionSize = 2) {
|
|
48
|
+
let [integer, fraction = ''] = (value || '').split(this.DECIMAL_SEPARATOR);
|
|
49
|
+
integer = integer.replace(new RegExp(this.THOUSANDS_SEPARATOR, 'g'), '');
|
|
50
|
+
fraction = parseInt(fraction, 10) > 0 && fractionSize > 0
|
|
51
|
+
? this.DECIMAL_SEPARATOR + (fraction + this.PADDING).substring(0, fractionSize)
|
|
52
|
+
: '';
|
|
53
|
+
return integer + fraction;
|
|
54
|
+
}
|
|
55
|
+
//http://stackoverflow.com/questions/2998784/how-to-output-integers-with-leading-zeros-in-javascript
|
|
56
|
+
static pad(num, size) {
|
|
57
|
+
num = null;
|
|
58
|
+
let s = num + '';
|
|
59
|
+
while (s.length < size) {
|
|
60
|
+
s = '0' + s;
|
|
61
|
+
}
|
|
62
|
+
return s;
|
|
63
|
+
}
|
|
64
|
+
static sum(ns) {
|
|
65
|
+
const r = ns.reduce((a, b) => (a ?? 0) + (b ?? 0), 0);
|
|
66
|
+
return r;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
CurrencyFunc.DECIMAL_SEPARATOR = '.';
|
|
70
|
+
CurrencyFunc.THOUSANDS_SEPARATOR = ',';
|
|
71
|
+
CurrencyFunc.PADDING = '000000';
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3lGdW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbm1jZS1mdW5jL3NyYy9fZnVuYy9jdXJyZW5jeUZ1bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQU14Qjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUE4QixFQUFFLGFBQXNCO1FBQ3hFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDVCxPQUFPLENBQUMsQ0FBQztTQUNUO1FBRUQsTUFBTSxDQUFDLEdBQUcsYUFBYSxJQUFJLENBQUMsQ0FBQztRQUM3QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0I7UUFDbkUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxpQ0FBaUM7UUFDakQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFD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RTtRQUN4QyxPQUFPLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQWlDO1FBQzNDLE1BQU0sQ0FBQyxHQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsQ0FBQztJQUNWLENBQUM7O0FBbEZjLDhCQUFpQixHQUFHLEdBQUcsQ0FBQztBQUN4QixnQ0FBbUIsR0FBRyxHQUFHLENBQUM7QUFFMUIsb0JBQU8sR0FBRyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQ3VycmVuY3kgY2FsY3VsYXRpb25zLiBVbmRlZmluZWQgaW5wdXQgb2YgbnVtYmVyIGlzIGNvbnNpZGVyZWQgemVybywganVzdCBsaWtlIG51bGwuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ3VycmVuY3lGdW5jIHtcclxuXHRwcml2YXRlIHN0YXRpYyBERUNJTUFMX1NFUEFSQVRPUiA9ICcuJztcclxuXHRwcml2YXRlIHN0YXRpYyBUSE9VU0FORFNfU0VQQVJBVE9SID0gJywnO1xyXG5cclxuXHRwcml2YXRlIHN0YXRpYyBQQURESU5HID0gJzAwMDAwMCc7XHJcblxyXG5cdC8qKlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIG51bVxyXG5cdCAqIEBwYXJhbSBkZWNpbWFsUGxhY2VzIGRlZmF1bHQgMFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBiYW5rZXJSb3VuZChudW06IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGRlY2ltYWxQbGFjZXM/OiBudW1iZXIpOiBudW1iZXIgey8vaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMTA4OTg2L2dhdXNzaWFuLWJhbmtlcnMtcm91bmRpbmctaW4tamF2YXNjcmlwdFxyXG5cdFx0aWYgKCFudW0pIHtcclxuXHRcdFx0cmV0dXJuIDA7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZCA9IGRlY2ltYWxQbGFjZXMgfHwgMDtcclxuXHRcdGNvbnN0IG0gPSBNYXRoLnBvdygxMCwgZCk7XHJcblx0XHRjb25zdCBuID0gKyhkID8gbnVtICogbSA6IG51bSkudG9GaXhlZCg4KTsgLy8gQXZvaWQgcm91bmRpbmcgZXJyb3JzXHJcblx0XHRjb25zdCBpID0gTWF0aC5mbG9vcihuKSwgZiA9IG4gLSBpO1xyXG5cdFx0Y29uc3QgZSA9IDFlLTg7IC8vIEFsbG93IGZvciByb3VuZGluZyBlcnJvcnMgaW4gZlxyXG5cdFx0Y29uc3QgciA9IChmID4gMC41IC0gZSAmJiBmIDwgMC41ICsgZSkgP1xyXG5cdFx0XHQoKGkgJSAyID09PSAwKSA/IGkgOiBpICsgMSkgOiBNYXRoLnJvdW5kKG4pO1xyXG5cdFx0cmV0dXJuIGQgPyByIC8gbSA6IHI7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgYmFua2VyUm91bmRUbzVjZW50cyhudW06IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xyXG5cdFx0aWYgKCFudW0pIHtcclxuXHRcdFx0cmV0dXJuIDA7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgciA9IHRoaXMuYmFua2VyUm91bmQoTWF0aC5jZWlsKG51bSAqIDIwIC0gMC41KSAvIDIwLCAyKTtcclxuXHRcdHJldHVybiByO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGNlaWxUbzVjZW50cyhudW06IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xyXG5cdFx0aWYgKCFudW0pIHtcclxuXHRcdFx0cmV0dXJuIDA7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgciA9IHRoaXMuYmFua2VyUm91bmQoTWF0aC5jZWlsKG51bSAqIDIwKSAvIDIwLCA0KTtcclxuXHRcdGNvbnN0IHJvdW5kdXAgPSBNYXRoLmNlaWwociAqIDEwMDAwKSAvIDEwMDAwO1xyXG5cdFx0cmV0dXJuIHJvdW5kdXA7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgdHJhbnNmb3JtQ3VycmVuY3kodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCwgZnJhY3Rpb25TaXplOiBudW1iZXIgPSAyKTogc3RyaW5nIHtcclxuXHRcdGxldCBbaW50ZWdlciwgZnJhY3Rpb24gPSAnJ10gPSAodmFsdWUgfHwgJycpLnRvU3RyaW5nKClcclxuXHRcdFx0LnNwbGl0KHRoaXMuREVDSU1BTF9TRVBBUkFUT1IpO1xyXG5cclxuXHRcdGZyYWN0aW9uID0gZnJhY3Rpb25TaXplID4gMFxyXG5cdFx0XHQ/IHRoaXMuREVDSU1BTF9TRVBBUkFUT1IgKyAoZnJhY3Rpb24gKyB0aGlzLlBBRERJTkcpLnN1YnN0cmluZygwLCBmcmFjdGlvblNpemUpXHJcblx0XHRcdDogJyc7XHJcblxyXG5cdFx0aW50ZWdlciA9IGludGVnZXIucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgdGhpcy5USE9VU0FORFNfU0VQQVJBVE9SKTtcclxuXHJcblx0XHRyZXR1cm4gaW50ZWdlciArIGZyYWN0aW9uO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHBhcnNlQ3VycmVuY3kodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZnJhY3Rpb25TaXplOiBudW1iZXIgPSAyKTogc3RyaW5nIHtcclxuXHRcdGxldCBbaW50ZWdlciwgZnJhY3Rpb24gPSAnJ10gPSAodmFsdWUgfHwgJycpLnNwbGl0KHRoaXMuREVDSU1BTF9TRVBBUkFUT1IpO1xyXG5cclxuXHRcdGludGVnZXIgPSBpbnRlZ2VyLnJlcGxhY2UobmV3IFJlZ0V4cCh0aGlzLlRIT1VTQU5EU19TRVBBUkFUT1IsICdnJyksICcnKTtcclxuXHJcblx0XHRmcmFjdGlvbiA9IHBhcnNlSW50KGZyYWN0aW9uLCAxMCkgPiAwICYmIGZyYWN0aW9uU2l6ZSA+IDBcclxuXHRcdFx0PyB0aGlzLkRFQ0lNQUxfU0VQQVJBVE9SICsgKGZyYWN0aW9uICsgdGhpcy5QQURESU5HKS5zdWJzdHJpbmcoMCwgZnJhY3Rpb25TaXplKVxyXG5cdFx0XHQ6ICcnO1xyXG5cclxuXHRcdHJldHVybiBpbnRlZ2VyICsgZnJhY3Rpb247XHJcblx0fVxyXG5cclxuXHJcblx0Ly9odHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI5OTg3ODQvaG93LXRvLW91dHB1dC1pbnRlZ2Vycy13aXRoLWxlYWRpbmctemVyb3MtaW4tamF2YXNjcmlwdFxyXG5cdHN0YXRpYyBwYWQobnVtOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBzaXplOiBudW1iZXIpOiBzdHJpbmcge1xyXG5cclxuXHRcdG51bSA9IG51bGw7XHJcblx0XHRsZXQgcyA9IG51bSArICcnO1xyXG5cdFx0d2hpbGUgKHMubGVuZ3RoIDwgc2l6ZSkgeyBzID0gJzAnICsgczsgfVxyXG5cdFx0cmV0dXJuIHM7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgc3VtKG5zOiAobnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZClbXSk6IG51bWJlciB7XHJcblx0XHRjb25zdCByID0gPG51bWJlcj5ucy5yZWR1Y2UoKGEsIGIpID0+IChhID8/IDApICsgKGIgPz8gMCksIDApO1xyXG5cdFx0cmV0dXJuIHI7XHJcblx0fVxyXG5cclxufVxyXG4iXX0=
|