@@ -40,12 +40,12 @@ let backButton = onInit(() => {
4040 for ( let ns in data [ "namespaces" ] ) {
4141 let c = block ( "option" , "" , ns ) ;
4242 c . setAttribute ( "value" , ns ) ;
43- if ( ns === data [ "namespace" ] ) c . setAttribute ( "selected" , "true" ) ;
43+ if ( ns === NAMESPACE ) c . setAttribute ( "selected" , "true" ) ;
4444 topNamespace . appendChild ( c ) ;
4545 }
4646 updateHeaderNamespaceWidth ( NAMESPACE ) ;
4747 topNamespace . addEventListener ( "change" , ( e ) => {
48- NAMESPACE = ( e . target || e . srcElement ) . value ;
48+ setNamespace ( ( e . target || e . srcElement ) . value ) ;
4949 updateHeaderNamespaceWidth ( NAMESPACE ) ;
5050 loadLevel ( "" ) ;
5151 } ) ;
@@ -60,6 +60,51 @@ let backButton = onInit(() => {
6060 } ) ;
6161 } ) ;
6262
63+ /**
64+ * Get the location hash parameter value.
65+ * @param {string } name - Parameter name.
66+ * @returns {string|undefined }
67+ */
68+ export function getURLHashParameter ( name ) {
69+ let eName = encodeURIComponent ( name ) ,
70+ arr = location . hash . substr ( 1 ) . split ( "&" ) . filter ( keyVal => keyVal . split ( "=" ) [ 0 ] === eName ) ;
71+ if ( ! arr . length ) return undefined ;
72+ return decodeURIComponent ( arr [ 0 ] . split ( "=" ) [ 1 ] || "" ) ;
73+ }
74+
75+ /**
76+ * Set the location hash parameter value.
77+ * @param {string } name - Parameter name.
78+ * @param {string|undefined } [value] - If no value provided, then URL parameter will be removed.
79+ */
80+ export function setURLHashParameter ( name , value ) {
81+ let eName = encodeURIComponent ( name ) ;
82+ if ( getURLHashParameter ( name ) === undefined ) {
83+ if ( typeof value === "undefined" ) return ;
84+ location . hash += `${ location . hash . length > 1 ? "&" : "" } ${
85+ encodeURIComponent ( name )
86+ } ${ value ? `=${ encodeURIComponent ( value ) } ` : `` } `;
87+ } else {
88+ location . hash = "#" + location . hash . substr ( 1 ) . split ( "&" ) . map ( ( keyVal ) => {
89+ let kv = keyVal . split ( "=" ) ;
90+ return ( kv [ 0 ] === eName )
91+ ? typeof value === "undefined"
92+ ? ""
93+ : `${ kv [ 0 ] } =${ encodeURIComponent ( value ) } `
94+ : keyVal ;
95+ } ) . filter ( e => e !== "" ) . join ( "&" ) ;
96+ }
97+ }
98+
99+ /**
100+ * This function sets the namespace. Note that namespace should be a valid namespace that exists.
101+ * @param {string } namespace
102+ */
103+ export function setNamespace ( namespace ) {
104+ NAMESPACE = namespace ;
105+ setURLHashParameter ( "namespace" , NAMESPACE ) ;
106+ }
107+
63108/**
64109 * This function applies visual effects regarding to changes were made and
65110 * indicates that changes are needed to be saved.
@@ -118,6 +163,8 @@ export function loadLevel (level) {
118163 backButton . style . display = "none" ;
119164 setTitle ( `${ PATH ? "." : "" } ${ PATH } ` ) ;
120165
166+ setURLHashParameter ( "level" , PATH || undefined ) ;
167+
121168 getList ( NAMESPACE , PATH , ( data ) => {
122169 grid . clear ( ) ;
123170 if ( PATH !== "" )
@@ -131,7 +178,7 @@ export function loadLevel (level) {
131178}
132179
133180export function onInit ( callback ) {
134- if ( typeof callback !== "function" ) throw new Error ( `onInit requires function` ) ;
181+ if ( typeof callback !== "function" ) throw new Error ( `onInit requires a function` ) ;
135182 if ( INITIALIZED )
136183 callback ( ) ;
137184 else
@@ -146,10 +193,10 @@ export function onInit (callback) {
146193export function init ( data ) {
147194
148195 INITIALIZED = true ;
149- NAMESPACE = data [ "namespace" ] ;
196+ setNamespace ( getURLHashParameter ( "namespace" ) || data [ "namespace" ] ) ;
150197 initCallbacks . forEach ( cb => cb ( data ) ) ;
151198 initCallbacks = [ ] ;
152199
153- loadLevel ( PATH ) ;
200+ loadLevel ( getURLHashParameter ( "level" ) || "" ) ;
154201
155202}
0 commit comments