dothtml 5.2.2 → 5.2.4
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/lib/dothtml.js +1 -1
- package/package.json +2 -1
- package/.vscode/launch.json +0 -34
- package/.vscode/settings.json +0 -6
- package/azure-pipelines.yml +0 -14
- package/babel.config.js +0 -1
- package/jest.config.ts +0 -207
- package/out.md +0 -1340
- package/src/arg-callback-obj.ts +0 -76
- package/src/built-in-components/nav-link.ts +0 -21
- package/src/built-in-components/router.ts +0 -315
- package/src/component.ts +0 -415
- package/src/dot-util.ts +0 -69
- package/src/dot.ts +0 -1147
- package/src/dothtml.ts +0 -39
- package/src/err.ts +0 -22
- package/src/event-bus.ts +0 -39
- package/src/i-dot.ts +0 -787
- package/src/node-polyfill.ts +0 -11
- package/src/observable-array.ts +0 -289
- package/src/styling/css-types.ts/css-angle.ts +0 -18
- package/src/styling/css-types.ts/css-color.ts +0 -233
- package/src/styling/css-types.ts/css-complex.ts +0 -20
- package/src/styling/css-types.ts/css-data-type.ts +0 -9
- package/src/styling/css-types.ts/css-filter.ts +0 -134
- package/src/styling/css-types.ts/css-length.ts +0 -20
- package/src/styling/css-types.ts/css-number.ts +0 -12
- package/src/styling/css-types.ts/css-percentage.ts +0 -10
- package/src/styling/css-types.ts/css-transform.ts +0 -220
- package/src/styling/css-types.ts/css-unknown.ts +0 -13
- package/src/styling/css-types.ts/css-url.ts +0 -41
- package/src/styling/i-dotcss.ts +0 -1198
- package/src/styling/style-builder.ts +0 -967
- package/src/styling/unit-function-tables.ts +0 -24
- package/tsconfig.json +0 -99
- package/unittests/advanced-bindings.test.ts +0 -421
- package/unittests/array-evaluation.test.ts +0 -7
- package/unittests/basic-functionality.test.ts +0 -88
- package/unittests/calc.test.ts +0 -6
- package/unittests/class-binding.test.ts +0 -227
- package/unittests/components/component-decorator.-.ts +0 -14
- package/unittests/components/components-data.test.ts +0 -153
- package/unittests/components/components.test.ts +0 -258
- package/unittests/computed.test.ts +0 -35
- package/unittests/core.ts +0 -66
- package/unittests/element-and-attribute-coverage.test.ts +0 -472
- package/unittests/hooks.test.ts +0 -67
- package/unittests/immutable-if.test.ts +0 -19
- package/unittests/input-bindings.test.ts +0 -166
- package/unittests/integration.test.ts +0 -5
- package/unittests/iterations.test.ts +0 -18
- package/unittests/logic.test.ts +0 -18
- package/unittests/non-function-props-rerender.test.ts +0 -86
- package/unittests/refs.test.ts +0 -36
- package/unittests/routing.-.ts +0 -56
- package/unittests/scopes.test.ts +0 -22
- package/unittests/special-tags.test.ts +0 -39
- package/unittests/styles.test.ts +0 -9
- package/unittests/styling/animations.test.ts +0 -14
- package/unittests/styling/filters.test.ts +0 -23
- package/unittests/styling/inline-styling.test.ts +0 -18
- package/unittests/styling/pseudo-selectors.test.ts +0 -33
- package/unittests/styling/transformations.test.ts +0 -234
- package/unittests/styling/value-interpretation.test.ts +0 -3
- package/unittests/testpage.ts +0 -5
- package/unittests/wait.test.ts +0 -31
- package/webpack.config.js +0 -28
package/src/arg-callback-obj.ts
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { IDotDocument } from "./i-dot";
|
|
2
|
-
|
|
3
|
-
export abstract class ArgCallback{
|
|
4
|
-
el: Element;
|
|
5
|
-
f: (content?: any, index?: number)=>string;
|
|
6
|
-
|
|
7
|
-
constructor(element: Element, value: (content?: any, index?: number)=>string){
|
|
8
|
-
this.el = element;
|
|
9
|
-
this.f = value;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
abstract updateContent(dot: IDotDocument, propVal?: any);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export class AttrArgCallback extends ArgCallback{
|
|
16
|
-
attr: string;
|
|
17
|
-
constructor(element: Element, attributeName: string, value: (content?: any)=>string){
|
|
18
|
-
super(element, value);
|
|
19
|
-
this.attr = attributeName;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
updateContent(dot){
|
|
23
|
-
this.el.setAttribute(this.attr, this.f());
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export class ContentArgCallback extends ArgCallback{
|
|
28
|
-
constructor(element: Element, content: ()=>string){
|
|
29
|
-
super(element, content);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
updateContent(dot, propVal: string){
|
|
33
|
-
dot(this.el).empty().h(this.f(propVal));
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export class ArrayArgCallback extends ArgCallback{
|
|
38
|
-
dotTarget: IDotDocument;
|
|
39
|
-
constructor(dotTarget, content){
|
|
40
|
-
super(null, content);
|
|
41
|
-
this.dotTarget = dotTarget;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
updateContent(){}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export class ConditionalArgCallback extends ArgCallback{
|
|
48
|
-
startNode: Node;
|
|
49
|
-
endNode: Node;
|
|
50
|
-
condition: ()=>boolean | boolean;
|
|
51
|
-
lastValue: boolean;
|
|
52
|
-
constructor(startNode, endNode, content, condition){
|
|
53
|
-
super(null, content);
|
|
54
|
-
this.startNode = startNode;
|
|
55
|
-
this.endNode = endNode;
|
|
56
|
-
this.condition = condition;
|
|
57
|
-
this.lastValue = undefined; // This will be set by the calling code - after the object is added to __currentArgCallback.
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
updateContent(dot){
|
|
61
|
-
if(this.lastValue != !!this.condition()){
|
|
62
|
-
this.lastValue = !this.lastValue;
|
|
63
|
-
if(this.lastValue){
|
|
64
|
-
dot._appendOrCreateDocument(this.f, this.endNode.parentNode, this.endNode);
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
do{
|
|
68
|
-
var e = this.startNode.nextSibling;
|
|
69
|
-
if(e && e != this.endNode){
|
|
70
|
-
e.parentNode.removeChild(e);
|
|
71
|
-
}
|
|
72
|
-
} while(this.startNode.nextSibling && this.startNode.nextSibling != this.endNode)
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import Component from "../component";
|
|
2
|
-
import dot from "../dot";
|
|
3
|
-
import { DotContent } from "../i-dot";
|
|
4
|
-
|
|
5
|
-
// TODO: make text and links mutable by making them properties.
|
|
6
|
-
export class NavLink extends Component{
|
|
7
|
-
content: DotContent;
|
|
8
|
-
hRef: string;
|
|
9
|
-
constructor(content: DotContent, href: string){
|
|
10
|
-
super();
|
|
11
|
-
this.content = content;
|
|
12
|
-
this.hRef = href;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
builder() {
|
|
16
|
-
return dot.a(this.content).hRef(this.hRef).onClick(e => {
|
|
17
|
-
e.preventDefault();
|
|
18
|
-
dot.navigate(this.hRef);
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,315 +0,0 @@
|
|
|
1
|
-
// ROUTING:
|
|
2
|
-
// TODO: Put this in the register hook for router.
|
|
3
|
-
|
|
4
|
-
import Component from "../component";
|
|
5
|
-
import dot from "../dot";
|
|
6
|
-
import ERR from "../err";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
interface RouterParams{
|
|
12
|
-
autoNavigate: boolean;
|
|
13
|
-
onNavigateInit: Function;
|
|
14
|
-
onError: Function;
|
|
15
|
-
onResponse: Function;
|
|
16
|
-
onComplete: Function;
|
|
17
|
-
routes: Array<{
|
|
18
|
-
path: string
|
|
19
|
-
}>;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export default class DotRouter extends Component{
|
|
23
|
-
|
|
24
|
-
// TODO: Test to make sure allRouters get cleared when a nested router gets deleted.
|
|
25
|
-
static allRouters: {[key: string]: DotRouter} = {};
|
|
26
|
-
static routerId = 1;
|
|
27
|
-
static mayRedirect = false;
|
|
28
|
-
|
|
29
|
-
static _get(url, success, fail){
|
|
30
|
-
var xhttp = new XMLHttpRequest();
|
|
31
|
-
xhttp.onreadystatechange = function() {
|
|
32
|
-
if(this.readyState == 4){
|
|
33
|
-
if (this.status == 200) {
|
|
34
|
-
success && success(this);
|
|
35
|
-
}
|
|
36
|
-
else{
|
|
37
|
-
fail && fail(this);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
xhttp.open("GET", url, true);
|
|
42
|
-
xhttp.send();
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
static routerEventSet = false;
|
|
46
|
-
static setupPopupFunction(){
|
|
47
|
-
!DotRouter.routerEventSet && (DotRouter.routerEventSet = true) ? window.onpopstate = function(e){
|
|
48
|
-
if(e.state){
|
|
49
|
-
dot.navigate(e.state.path, true);
|
|
50
|
-
document.title = e.state.pageTitle;
|
|
51
|
-
}
|
|
52
|
-
} : 0;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
id: number = 0;
|
|
56
|
-
outlet: Element = null;
|
|
57
|
-
navId: number = 0;
|
|
58
|
-
currentRoute: string = null;
|
|
59
|
-
currentParams: RouterParams = null;
|
|
60
|
-
params: RouterParams;
|
|
61
|
-
routesAndSegments: Array<{
|
|
62
|
-
path: string,
|
|
63
|
-
segments: string[]
|
|
64
|
-
}> = [];
|
|
65
|
-
|
|
66
|
-
constructor(params: RouterParams){
|
|
67
|
-
super();
|
|
68
|
-
this.params = params;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* TODO: convert to interface.
|
|
73
|
-
* @param {Object} params - Parameters.
|
|
74
|
-
* @param {Array.<{path: string, title: string, component: Object}>} params.routes - Array of routes.
|
|
75
|
-
* @param {boolean} params.autoNavigate - Router will automatically navigate when outlet is created.
|
|
76
|
-
* @param {Function} params.onNavigateInit - Occurs before any request is sent, and before the router outlet is emptied.
|
|
77
|
-
* @param {Function} params.onError - Occurs in the event of an HTTP error.
|
|
78
|
-
* @param {Function} params.onResponse - Occurs after a successful HTTP response, but before rendering.
|
|
79
|
-
* @param {Function} params.onComplete - Occurs after an uncancelled route completes without an error.
|
|
80
|
-
*/
|
|
81
|
-
builder() {
|
|
82
|
-
let t = this;
|
|
83
|
-
|
|
84
|
-
if(!t.params || !t.params.routes) ERR("R");;
|
|
85
|
-
t.routesAndSegments = t.params.routes.map(r => {
|
|
86
|
-
if(r.path === null || r.path === undefined) ERR("R");
|
|
87
|
-
return { path: r.path, segments: r.path.split("/") };
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
//t.navigate = function(p, nh, f){return routerNavigate.call(t, p, nh, f)};
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if(t.params.autoNavigate === undefined) t.params.autoNavigate = true;
|
|
94
|
-
var o = dot.el("dothtml-router");
|
|
95
|
-
t.outlet = o.getLast();
|
|
96
|
-
t.id = DotRouter.routerId++;
|
|
97
|
-
DotRouter.allRouters[t.id] = t;
|
|
98
|
-
// This use to be here, but not sure what the point of it is anymore. It's not used anywhere.
|
|
99
|
-
// t.outlet.dothtmlRouterId = t.id;
|
|
100
|
-
return o;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
registered(): void {
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
ready(): void {
|
|
108
|
-
// If there is a route left inside the route queue
|
|
109
|
-
DotRouter.setupPopupFunction();
|
|
110
|
-
|
|
111
|
-
// TODO: this method is messed up. Params might not be set when replaceState is called.
|
|
112
|
-
if(this.params.autoNavigate){
|
|
113
|
-
DotRouter.mayRedirect = true;
|
|
114
|
-
var params = this.navigate(window.location.pathname + (window.location.hash || ""), true);
|
|
115
|
-
DotRouter.mayRedirect = false;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
if(history.pushState) history.replaceState({"pageTitle":params.title || document.title, "path": params.path}, "", params.path);
|
|
119
|
-
else window.location.hash = params.path;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
deleting(): void {
|
|
123
|
-
delete DotRouter.allRouters[this.id];
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
navigate(path: string, noHistory: boolean = false, force: boolean = false){
|
|
127
|
-
let t = this;
|
|
128
|
-
//console.log("NAVIGATING", path);
|
|
129
|
-
// Step 1: parse the path into a route queue:
|
|
130
|
-
path = path || "";
|
|
131
|
-
if(typeof path != "string") path = path + "";
|
|
132
|
-
var hashPath = path;
|
|
133
|
-
if(path.indexOf("#") != -1) hashPath = path.split("#")[1];
|
|
134
|
-
|
|
135
|
-
var hashParts = path.split("#");
|
|
136
|
-
var allQueues = [];
|
|
137
|
-
|
|
138
|
-
// Route navigating.
|
|
139
|
-
var routeQueue = hashParts[0].split("?")[0].split("/");
|
|
140
|
-
routeQueue[0] === "" ? routeQueue.shift() : 0;
|
|
141
|
-
allQueues.push(routeQueue);
|
|
142
|
-
|
|
143
|
-
// Hash navigating.
|
|
144
|
-
var tryHashQueue = hashParts.length > 1 ? hashParts[1].split("/") : null;
|
|
145
|
-
tryHashQueue ? ((tryHashQueue[0] === "" ? tryHashQueue.shift() : 0)) : 0;
|
|
146
|
-
tryHashQueue ? ((routeQueue.length > 1 ? allQueues.push(tryHashQueue) : allQueues.unshift(tryHashQueue))) : 0;
|
|
147
|
-
|
|
148
|
-
var cancel = false;
|
|
149
|
-
var navParams = {
|
|
150
|
-
cancel: function(){
|
|
151
|
-
cancel = true;
|
|
152
|
-
navParams.wasCancelled = true;
|
|
153
|
-
},
|
|
154
|
-
element: t.outlet,
|
|
155
|
-
httpResponse: null,
|
|
156
|
-
isNew: true,
|
|
157
|
-
params: null,
|
|
158
|
-
path: path,
|
|
159
|
-
title: null,
|
|
160
|
-
wasCancelled: false
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
// Step 2: determine the last router that is correctly loaded.
|
|
164
|
-
|
|
165
|
-
// var deepestRouter = null;
|
|
166
|
-
var bestRoute = null;
|
|
167
|
-
// Loop through the router stack from start to finish to find the deepest router and the best route to take.
|
|
168
|
-
// for(var i = 0; i < routerOutletStack.length; i++){
|
|
169
|
-
|
|
170
|
-
// var candidate = routerOutletStack[i];
|
|
171
|
-
// Find the an available route that matches.
|
|
172
|
-
// bestRoute = null;
|
|
173
|
-
for(var q in allQueues){
|
|
174
|
-
var Q = allQueues[q];
|
|
175
|
-
var rFound = false;
|
|
176
|
-
for(var r in t.routesAndSegments){
|
|
177
|
-
rFound = true;
|
|
178
|
-
var nextRoute = t.routesAndSegments[r];
|
|
179
|
-
var prms = {};
|
|
180
|
-
var rs = 0;
|
|
181
|
-
var ps = 0;
|
|
182
|
-
var lastRn = null;
|
|
183
|
-
while(1){
|
|
184
|
-
var rSn = nextRoute.segments[rs] || null;
|
|
185
|
-
var pSn = Q[ps] || null;
|
|
186
|
-
if(rSn === null && pSn === null) break;
|
|
187
|
-
if(rSn === null && pSn !== null || rSn !== null && pSn === null) {
|
|
188
|
-
rFound = false;
|
|
189
|
-
break;
|
|
190
|
-
}
|
|
191
|
-
if(rSn === null && lastRn == "*") rSn = "*";
|
|
192
|
-
|
|
193
|
-
if(rSn == pSn || rSn == "+" || rSn == "*"){ // It's the route, or it's a wildcard.
|
|
194
|
-
rs++;
|
|
195
|
-
}
|
|
196
|
-
else if(rSn.length > 2 && rSn.charAt(0) == "{" && rSn.charAt(rSn.length - 1) == "}"){ // It's a parameterized route.
|
|
197
|
-
rs++;
|
|
198
|
-
prms[rSn.substring(1, rSn.length - 1)] = pSn;
|
|
199
|
-
}
|
|
200
|
-
else if(lastRn != "*"){ // If the route doesn't match but the previous term was a super-wildcard, do nothing. Else, break.
|
|
201
|
-
rFound = false;
|
|
202
|
-
break;
|
|
203
|
-
}
|
|
204
|
-
ps++;
|
|
205
|
-
lastRn = rSn;
|
|
206
|
-
}
|
|
207
|
-
if(rFound){
|
|
208
|
-
bestRoute = nextRoute;
|
|
209
|
-
navParams.params = prms;
|
|
210
|
-
break;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
if(rFound){
|
|
214
|
-
if(Q == routeQueue) {
|
|
215
|
-
if(!history.pushState && DotRouter.mayRedirect) {
|
|
216
|
-
window.location.hash = path;
|
|
217
|
-
window.location.pathname = "/";
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
break;
|
|
221
|
-
};
|
|
222
|
-
if(Q == tryHashQueue) {
|
|
223
|
-
path = hashPath;
|
|
224
|
-
navParams.path = path;
|
|
225
|
-
if(history.pushState) {
|
|
226
|
-
window.location.hash = "";
|
|
227
|
-
history.replaceState({"pageTitle":document.title, "path": path}, document.title, path);
|
|
228
|
-
}
|
|
229
|
-
break;
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
navParams.isNew = !(!force && t.currentRoute == bestRoute && (!t.currentParams || t.currentParams == navParams.params || JSON.stringify(t.currentParams) === JSON.stringify(navParams.params)));
|
|
235
|
-
|
|
236
|
-
t.params.onNavigateInit && t.params.onNavigateInit(navParams);
|
|
237
|
-
|
|
238
|
-
if(!navParams.isNew || cancel) return navParams;
|
|
239
|
-
t.currentRoute = bestRoute;
|
|
240
|
-
t.currentParams = navParams.params;
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
var ro = t.outlet;
|
|
244
|
-
dot(ro).empty();
|
|
245
|
-
var navId = ++t.navId;
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
//if(deepestRouter == null) return this;
|
|
249
|
-
if(routeQueue.length == 0) return navParams;
|
|
250
|
-
if(bestRoute == null) return navParams;
|
|
251
|
-
|
|
252
|
-
navParams.title = bestRoute.title;
|
|
253
|
-
|
|
254
|
-
if(typeof bestRoute.component == "string"){
|
|
255
|
-
DotRouter._get(bestRoute.component, function(result){
|
|
256
|
-
var text = result.responseText;
|
|
257
|
-
navParams.httpResponse = result;
|
|
258
|
-
if(navId != t.navId) return navParams;
|
|
259
|
-
t.params.onResponse && t.params.onResponse(navParams);
|
|
260
|
-
if(cancel) return navParams;
|
|
261
|
-
if(bestRoute.component.split("?")[0].split("#")[0].toLowerCase().indexOf(".js") == bestRoute.component.length - 3){
|
|
262
|
-
try{
|
|
263
|
-
text = Function("var exports=null,module={},route=arguments[0];" + text + "\r\nreturn module.exports || exports;")(navParams);
|
|
264
|
-
}
|
|
265
|
-
catch(e){
|
|
266
|
-
//e.fileName = bestRoute.component;
|
|
267
|
-
console.error(e);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
dot(ro).h(text);
|
|
271
|
-
t.params.onComplete && t.params.onComplete(navParams);
|
|
272
|
-
}, function(result){
|
|
273
|
-
navParams.httpResponse = result;
|
|
274
|
-
t.params.onError && t.params.onError(navParams);
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
else{
|
|
278
|
-
dot(ro).h(bestRoute.component.call(dot, navParams));
|
|
279
|
-
t.params.onComplete && t.params.onComplete(navParams);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
return navParams;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// Extend dot.
|
|
287
|
-
dot.navigate = function(path: string, noHistory: boolean = false, force: boolean = false){
|
|
288
|
-
|
|
289
|
-
DotRouter.setupPopupFunction();
|
|
290
|
-
|
|
291
|
-
var K = Object.keys(DotRouter.allRouters);
|
|
292
|
-
var lastNavParams: {[key: string]: unknown} = {};
|
|
293
|
-
var bestTitle = document.title;
|
|
294
|
-
for(var k = 0; k < K.length; k++){
|
|
295
|
-
var kk = K[k];
|
|
296
|
-
var r = DotRouter.allRouters[kk];
|
|
297
|
-
if(r) {
|
|
298
|
-
var currentNavParams = r.navigate(path, noHistory, force);
|
|
299
|
-
if(currentNavParams.isNew && !currentNavParams.wasCancelled){
|
|
300
|
-
lastNavParams = currentNavParams;
|
|
301
|
-
bestTitle = (lastNavParams.title as string) || bestTitle;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
try{
|
|
307
|
-
if(lastNavParams && !noHistory){
|
|
308
|
-
//if(history.replaceState) history.replaceState({"pageTitle":title, "path": path}, title, path);
|
|
309
|
-
if(history.pushState) history.pushState({"pageTitle":bestTitle, "path": lastNavParams.path}, bestTitle, (lastNavParams.path as string));
|
|
310
|
-
else window.location.hash = (lastNavParams.path as string);
|
|
311
|
-
}
|
|
312
|
-
}catch(e){}
|
|
313
|
-
|
|
314
|
-
return this;
|
|
315
|
-
}
|