295 lines
11 KiB
JavaScript
295 lines
11 KiB
JavaScript
// Compiled by ClojureScript 1.9.946 {}
|
|
goog.provide('accountant.core');
|
|
goog.require('cljs.core');
|
|
goog.require('clojure.string');
|
|
goog.require('goog.events');
|
|
goog.require('goog.history.EventType');
|
|
goog.require('goog.history.Event');
|
|
goog.require('goog.history.Html5History');
|
|
goog.require('goog.Uri');
|
|
accountant.core.transformer_create_url = (function accountant$core$transformer_create_url(token,path_prefix,location){
|
|
return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(path_prefix),cljs.core.str.cljs$core$IFn$_invoke$arity$1(token)].join('');
|
|
});
|
|
accountant.core.transformer_retrieve_token = (function accountant$core$transformer_retrieve_token(path_prefix,location){
|
|
return [cljs.core.str.cljs$core$IFn$_invoke$arity$1(location.pathname),cljs.core.str.cljs$core$IFn$_invoke$arity$1(location.search),cljs.core.str.cljs$core$IFn$_invoke$arity$1(location.hash)].join('');
|
|
});
|
|
if(typeof accountant.core.history !== 'undefined'){
|
|
} else {
|
|
accountant.core.history = (function (){var transformer = (new goog.history.Html5History.TokenTransformer());
|
|
transformer.retrieveToken = accountant.core.transformer_retrieve_token;
|
|
|
|
transformer.createUrl = accountant.core.transformer_create_url;
|
|
|
|
return (new goog.history.Html5History(window,transformer));
|
|
})();
|
|
}
|
|
accountant.core.dispatch_on_navigate = (function accountant$core$dispatch_on_navigate(history,nav_handler){
|
|
return goog.events.listen(history,goog.history.EventType.NAVIGATE,(function (e){
|
|
var token = e.token;
|
|
return nav_handler.call(null,token);
|
|
}));
|
|
});
|
|
/**
|
|
* Given a DOM node, if it is an element node, return its href attribute.
|
|
* Otherwise, return nil.
|
|
*/
|
|
accountant.core.get_href_attribute = (function accountant$core$get_href_attribute(node){
|
|
if(cljs.core.truth_((function (){var and__35486__auto__ = node;
|
|
if(cljs.core.truth_(and__35486__auto__)){
|
|
return cljs.core._EQ_.call(null,node.nodeType,Node.ELEMENT_NODE);
|
|
} else {
|
|
return and__35486__auto__;
|
|
}
|
|
})())){
|
|
return node.getAttribute("href");
|
|
} else {
|
|
return null;
|
|
}
|
|
});
|
|
/**
|
|
* Given a DOM element that may or may not be a link, traverse up the DOM tree
|
|
* to see if any of its parents are links. If so, return the href content, if
|
|
* it does not have an explicit `data-trigger` attribute to signify a non-navigational
|
|
* link element.
|
|
*/
|
|
accountant.core.find_href_node = (function accountant$core$find_href_node(e){
|
|
while(true){
|
|
var href = accountant.core.get_href_attribute.call(null,e);
|
|
var attrs = e.attributes;
|
|
var navigation_link_QMARK_ = (function (){var and__35486__auto__ = href;
|
|
if(cljs.core.truth_(and__35486__auto__)){
|
|
var and__35486__auto____$1 = attrs;
|
|
if(cljs.core.truth_(and__35486__auto____$1)){
|
|
return cljs.core.not.call(null,(attrs["data-trigger"]));
|
|
} else {
|
|
return and__35486__auto____$1;
|
|
}
|
|
} else {
|
|
return and__35486__auto__;
|
|
}
|
|
})();
|
|
if(cljs.core.truth_(navigation_link_QMARK_)){
|
|
return e;
|
|
} else {
|
|
var temp__5457__auto__ = e.parentNode;
|
|
if(cljs.core.truth_(temp__5457__auto__)){
|
|
var parent = temp__5457__auto__;
|
|
var G__37812 = parent;
|
|
e = G__37812;
|
|
continue;
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
});
|
|
accountant.core.uri__GT_query = (function accountant$core$uri__GT_query(uri){
|
|
var query = uri.getQuery();
|
|
if(cljs.core.empty_QMARK_.call(null,query)){
|
|
return null;
|
|
} else {
|
|
return ["?",cljs.core.str.cljs$core$IFn$_invoke$arity$1(query)].join('');
|
|
}
|
|
});
|
|
accountant.core.uri__GT_fragment = (function accountant$core$uri__GT_fragment(uri){
|
|
var fragment = uri.getFragment();
|
|
if(cljs.core.empty_QMARK_.call(null,fragment)){
|
|
return null;
|
|
} else {
|
|
return ["#",cljs.core.str.cljs$core$IFn$_invoke$arity$1(fragment)].join('');
|
|
}
|
|
});
|
|
/**
|
|
* Create a click handler that blocks page reloads for known routes
|
|
*/
|
|
accountant.core.prevent_reload_on_known_path = (function accountant$core$prevent_reload_on_known_path(history,path_exists_QMARK_){
|
|
return goog.events.listen(document,"click",(function (e){
|
|
var target = e.target;
|
|
var button = e.button;
|
|
var meta_key = e.metaKey;
|
|
var alt_key = e.altKey;
|
|
var ctrl_key = e.ctrlKey;
|
|
var shift_key = e.shiftKey;
|
|
var any_key = (function (){var or__35498__auto__ = meta_key;
|
|
if(cljs.core.truth_(or__35498__auto__)){
|
|
return or__35498__auto__;
|
|
} else {
|
|
var or__35498__auto____$1 = alt_key;
|
|
if(cljs.core.truth_(or__35498__auto____$1)){
|
|
return or__35498__auto____$1;
|
|
} else {
|
|
var or__35498__auto____$2 = ctrl_key;
|
|
if(cljs.core.truth_(or__35498__auto____$2)){
|
|
return or__35498__auto____$2;
|
|
} else {
|
|
return shift_key;
|
|
}
|
|
}
|
|
}
|
|
})();
|
|
var href_node = accountant.core.find_href_node.call(null,target);
|
|
var href = (cljs.core.truth_(href_node)?href_node.href:null);
|
|
var link_target = (cljs.core.truth_(href_node)?href_node.target:null);
|
|
var uri = goog.Uri.parse(href);
|
|
var path = uri.getPath();
|
|
var query = accountant.core.uri__GT_query.call(null,uri);
|
|
var fragment = accountant.core.uri__GT_fragment.call(null,uri);
|
|
var relative_href = [cljs.core.str.cljs$core$IFn$_invoke$arity$1(path),cljs.core.str.cljs$core$IFn$_invoke$arity$1(query),cljs.core.str.cljs$core$IFn$_invoke$arity$1(fragment)].join('');
|
|
var title = target.title;
|
|
var host = uri.getDomain();
|
|
var port = uri.getPort();
|
|
var current_host = window.location.hostname;
|
|
var current_port = window.location.port;
|
|
var loc = window.location;
|
|
var current_relative_href = [cljs.core.str.cljs$core$IFn$_invoke$arity$1(loc.pathname),cljs.core.str.cljs$core$IFn$_invoke$arity$1(loc.query),cljs.core.str.cljs$core$IFn$_invoke$arity$1(loc.hash)].join('');
|
|
if(cljs.core.truth_((function (){var and__35486__auto__ = cljs.core.not.call(null,any_key);
|
|
if(and__35486__auto__){
|
|
var and__35486__auto____$1 = new cljs.core.PersistentHashSet(null, new cljs.core.PersistentArrayMap(null, 2, ["",null,"_self",null], null), null).call(null,link_target);
|
|
if(cljs.core.truth_(and__35486__auto____$1)){
|
|
var and__35486__auto____$2 = cljs.core._EQ_.call(null,button,(0));
|
|
if(and__35486__auto____$2){
|
|
var and__35486__auto____$3 = cljs.core._EQ_.call(null,host,current_host);
|
|
if(and__35486__auto____$3){
|
|
var and__35486__auto____$4 = (cljs.core.not.call(null,port)) || (cljs.core._EQ_.call(null,[cljs.core.str.cljs$core$IFn$_invoke$arity$1(port)].join(''),[cljs.core.str.cljs$core$IFn$_invoke$arity$1(current_port)].join('')));
|
|
if(and__35486__auto____$4){
|
|
return path_exists_QMARK_.call(null,path);
|
|
} else {
|
|
return and__35486__auto____$4;
|
|
}
|
|
} else {
|
|
return and__35486__auto____$3;
|
|
}
|
|
} else {
|
|
return and__35486__auto____$2;
|
|
}
|
|
} else {
|
|
return and__35486__auto____$1;
|
|
}
|
|
} else {
|
|
return and__35486__auto__;
|
|
}
|
|
})())){
|
|
if(cljs.core.not_EQ_.call(null,current_relative_href,relative_href)){
|
|
history.setToken(relative_href,title);
|
|
} else {
|
|
}
|
|
|
|
return e.preventDefault();
|
|
} else {
|
|
return null;
|
|
}
|
|
}));
|
|
});
|
|
if(typeof accountant.core.nav_handler !== 'undefined'){
|
|
} else {
|
|
accountant.core.nav_handler = null;
|
|
}
|
|
if(typeof accountant.core.path_exists_QMARK_ !== 'undefined'){
|
|
} else {
|
|
accountant.core.path_exists_QMARK_ = null;
|
|
}
|
|
/**
|
|
* Create and configure HTML5 history navigation.
|
|
*
|
|
* nav-handler: a fn of one argument, a path. Called when we've decided
|
|
* to navigate to another page. You'll want to make your app draw the
|
|
* new page here.
|
|
*
|
|
* path-exists?: a fn of one argument, a path. Return truthy if this path is handled by the SPA
|
|
*/
|
|
accountant.core.configure_navigation_BANG_ = (function accountant$core$configure_navigation_BANG_(p__37813){
|
|
var map__37814 = p__37813;
|
|
var map__37814__$1 = ((((!((map__37814 == null)))?((((map__37814.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === map__37814.cljs$core$ISeq$)))?true:false):false))?cljs.core.apply.call(null,cljs.core.hash_map,map__37814):map__37814);
|
|
var nav_handler = cljs.core.get.call(null,map__37814__$1,new cljs.core.Keyword(null,"nav-handler","nav-handler",2039495484));
|
|
var path_exists_QMARK_ = cljs.core.get.call(null,map__37814__$1,new cljs.core.Keyword(null,"path-exists?","path-exists?",1473384514));
|
|
accountant.core.history.setUseFragment(false);
|
|
|
|
accountant.core.history.setPathPrefix("");
|
|
|
|
accountant.core.history.setEnabled(true);
|
|
|
|
accountant.core.nav_handler = nav_handler;
|
|
|
|
accountant.core.path_exists_QMARK_ = path_exists_QMARK_;
|
|
|
|
accountant.core.dispatch_on_navigate.call(null,accountant.core.history,nav_handler);
|
|
|
|
return accountant.core.prevent_reload_on_known_path.call(null,accountant.core.history,path_exists_QMARK_);
|
|
});
|
|
accountant.core.map__GT_params = (function accountant$core$map__GT_params(query){
|
|
var params = cljs.core.map.call(null,(function (p1__37816_SHARP_){
|
|
return cljs.core.name.call(null,p1__37816_SHARP_);
|
|
}),cljs.core.keys.call(null,query));
|
|
var values = cljs.core.vals.call(null,query);
|
|
var pairs = cljs.core.partition.call(null,(2),cljs.core.interleave.call(null,params,values));
|
|
return clojure.string.join.call(null,"&",cljs.core.map.call(null,((function (params,values,pairs){
|
|
return (function (p1__37817_SHARP_){
|
|
return clojure.string.join.call(null,"=",p1__37817_SHARP_);
|
|
});})(params,values,pairs))
|
|
,pairs));
|
|
});
|
|
/**
|
|
* add a browser history entry. updates window/location
|
|
*/
|
|
accountant.core.navigate_BANG_ = (function accountant$core$navigate_BANG_(var_args){
|
|
var G__37819 = arguments.length;
|
|
switch (G__37819) {
|
|
case 1:
|
|
return accountant.core.navigate_BANG_.cljs$core$IFn$_invoke$arity$1((arguments[(0)]));
|
|
|
|
break;
|
|
case 2:
|
|
return accountant.core.navigate_BANG_.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
|
|
|
|
break;
|
|
default:
|
|
throw (new Error(["Invalid arity: ",cljs.core.str.cljs$core$IFn$_invoke$arity$1(arguments.length)].join('')));
|
|
|
|
}
|
|
});
|
|
|
|
accountant.core.navigate_BANG_.cljs$core$IFn$_invoke$arity$1 = (function (route){
|
|
return accountant.core.navigate_BANG_.call(null,route,cljs.core.PersistentArrayMap.EMPTY);
|
|
});
|
|
|
|
accountant.core.navigate_BANG_.cljs$core$IFn$_invoke$arity$2 = (function (route,query){
|
|
if(cljs.core.truth_(accountant.core.nav_handler)){
|
|
var token = accountant.core.history.getToken();
|
|
var old_route = cljs.core.first.call(null,clojure.string.split.call(null,token,"?"));
|
|
var query_string = accountant.core.map__GT_params.call(null,cljs.core.reduce_kv.call(null,((function (token,old_route){
|
|
return (function (valid,k,v){
|
|
if(cljs.core.truth_(v)){
|
|
return cljs.core.assoc.call(null,valid,k,v);
|
|
} else {
|
|
return valid;
|
|
}
|
|
});})(token,old_route))
|
|
,cljs.core.PersistentArrayMap.EMPTY,query));
|
|
var with_params = ((cljs.core.empty_QMARK_.call(null,query_string))?route:[cljs.core.str.cljs$core$IFn$_invoke$arity$1(route),"?",cljs.core.str.cljs$core$IFn$_invoke$arity$1(query_string)].join(''));
|
|
if(cljs.core._EQ_.call(null,old_route,route)){
|
|
return accountant.core.history.replaceToken(with_params);
|
|
} else {
|
|
return accountant.core.history.setToken(with_params);
|
|
}
|
|
} else {
|
|
return console.error("can't navigate! until configure-navigation! called");
|
|
}
|
|
});
|
|
|
|
accountant.core.navigate_BANG_.cljs$lang$maxFixedArity = 2;
|
|
|
|
accountant.core.dispatch_current_BANG_ = (function accountant$core$dispatch_current_BANG_(){
|
|
|
|
var path = window.location.pathname;
|
|
var query = window.location.search;
|
|
var hash = window.location.hash;
|
|
if(cljs.core.truth_(accountant.core.nav_handler)){
|
|
return accountant.core.nav_handler.call(null,[cljs.core.str.cljs$core$IFn$_invoke$arity$1(path),cljs.core.str.cljs$core$IFn$_invoke$arity$1(query),cljs.core.str.cljs$core$IFn$_invoke$arity$1(hash)].join(''));
|
|
} else {
|
|
return console.error("can't dispatch-current until configure-navigation! called");
|
|
}
|
|
});
|
|
|
|
//# sourceMappingURL=core.js.map?rel=1517021941432
|