Skip to content

Commit

Permalink
Merge pull request #23 from RStankov/minor-code-improvements
Browse files Browse the repository at this point in the history
Minor code improvements
  • Loading branch information
ncuillery committed Jun 27, 2014
2 parents 2ab7ced + a59e995 commit 3c19f89
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 110 deletions.
83 changes: 29 additions & 54 deletions dist/angular-breadcrumb.js
@@ -1,4 +1,4 @@
/*! angular-breadcrumb - v0.2.2-dev-2014-06-23
/*! angular-breadcrumb - v0.2.2-dev-2014-06-27
* https://github.com/ncuillery/angular-breadcrumb
* Copyright (c) 2014 Nicolas Cuillery; Licensed MIT */

Expand Down Expand Up @@ -35,64 +35,45 @@ function $Breadcrumb() {
}
});

// Check if a property in state's data is inherited from the parent state
var $$isInherited = function(state, dataProperty) {
// Check if a property in state's data is its own
var $$isStateDataProperty = function(state, property) {
if(!state.data || !state.data[property]) {
return false;
}

var parentState = $$parentState(state);
return angular.isDefined(parentState) &&
angular.isDefined(parentState.data) &&
angular.isDefined(parentState.data[dataProperty]) &&
angular.equals(state.data[dataProperty], parentState.data[dataProperty]);
return !(parentState && parentState.data && parentState.data[property] && state.data[property] === parentState.data[property]);
};

// Get the parent state
var $$parentState = function(state) {
if (angular.isDefined(state.parent)) {
return $state.get(state.parent);
}

var compositeName = /^(.+)\.[^.]+$/.exec(state.name);
if(compositeName) {
return $state.get(compositeName[1]);
}
return undefined;
// Check if state has explicit parent OR we try guess parent from its name
var name = state.parent || (/^(.+)\.[^.]+$/.exec(state.name) || [])[1];
// If we were able to figure out parent name then get this state
return name && $state.get(name);
};

// Add the state in the chain if not already in and if not abstract
var $$addStateInChain = function(chain, state, prefixStateInserted) {
var stateAlreadyInChain = false;
angular.forEach(chain, function(value) {
if(!stateAlreadyInChain && angular.equals(value, state)) {
stateAlreadyInChain = true;
}
});

var skipStep = angular.isDefined(state.data) &&
state.data.ncyBreadcrumbSkip &&
!$$isInherited(state, 'ncyBreadcrumbSkip');
var $$addStateInChain = function(chain, state) {
for(var i=0, l=chain.length; i<l; i+=1) {
if (chain[i].name === state.name) {
return;
}
}

if(!stateAlreadyInChain && !state.abstract && !skipStep) {
// Insert at first or second index.
if(prefixStateInserted) {
chain.splice(1, 0, state);
} else {
chain.unshift(state);
}
return true;
if(!state.abstract && !$$isStateDataProperty(state, 'ncyBreadcrumbSkip')) {
state.ncyBreadcrumbLink = $state.href(state.name);
chain.unshift(state);
}
return false;
};

// Get the state for the parent step in the breadcrumb
var $$breadcrumbParentState = function(state) {

if(angular.isDefined(state.data) &&
angular.isDefined(state.data.ncyBreadcrumbParent) &&
!$$isInherited(state, 'ncyBreadcrumbParent')) {
if($$isStateDataProperty(state, 'ncyBreadcrumbParent')) {
return $state.get(state.data.ncyBreadcrumbParent);
}

return $$parentState(state);

};

return {
Expand All @@ -115,27 +96,21 @@ function $Breadcrumb() {

getStatesChain: function() {
var chain = [];
var prefixStateInserted = false;

// From current state to the root
for(var state = $state.$current.self; state && state.name !== ''; state=$$breadcrumbParentState(state)) {
$$addStateInChain(chain, state);
}

// Prefix state treatment
if($$options.prefixStateName) {
var prefixState = $state.get($$options.prefixStateName);
if(prefixState) {
var prefixStep = angular.extend(prefixState, {ncyBreadcrumbLink: $state.href(prefixState)});
prefixStateInserted = $$addStateInChain(chain, prefixStep, prefixStateInserted);
} else {
if(!prefixState) {
throw 'Bad configuration : prefixState "' + $$options.prefixStateName + '" unknown';
}
}

// From current state to the root
var state = $state.$current.self;
do {
var step = angular.extend(state, {ncyBreadcrumbLink: $state.href(state.name)});
$$addStateInChain(chain, step, prefixStateInserted);
state = $$breadcrumbParentState(state);
$$addStateInChain(chain, prefixState);
}
while(state && state.name !== '');

return chain;
},
Expand Down
4 changes: 2 additions & 2 deletions dist/angular-breadcrumb.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

81 changes: 28 additions & 53 deletions src/angular-breadcrumb.js
Expand Up @@ -30,64 +30,45 @@ function $Breadcrumb() {
}
});

// Check if a property in state's data is inherited from the parent state
var $$isInherited = function(state, dataProperty) {
// Check if a property in state's data is its own
var $$isStateDataProperty = function(state, property) {
if(!state.data || !state.data[property]) {
return false;
}

var parentState = $$parentState(state);
return angular.isDefined(parentState) &&
angular.isDefined(parentState.data) &&
angular.isDefined(parentState.data[dataProperty]) &&
angular.equals(state.data[dataProperty], parentState.data[dataProperty]);
return !(parentState && parentState.data && parentState.data[property] && state.data[property] === parentState.data[property]);
};

// Get the parent state
var $$parentState = function(state) {
if (angular.isDefined(state.parent)) {
return $state.get(state.parent);
}

var compositeName = /^(.+)\.[^.]+$/.exec(state.name);
if(compositeName) {
return $state.get(compositeName[1]);
}
return undefined;
// Check if state has explicit parent OR we try guess parent from its name
var name = state.parent || (/^(.+)\.[^.]+$/.exec(state.name) || [])[1];
// If we were able to figure out parent name then get this state
return name && $state.get(name);
};

// Add the state in the chain if not already in and if not abstract
var $$addStateInChain = function(chain, state, prefixStateInserted) {
var stateAlreadyInChain = false;
angular.forEach(chain, function(value) {
if(!stateAlreadyInChain && angular.equals(value, state)) {
stateAlreadyInChain = true;
}
});

var skipStep = angular.isDefined(state.data) &&
state.data.ncyBreadcrumbSkip &&
!$$isInherited(state, 'ncyBreadcrumbSkip');
var $$addStateInChain = function(chain, state) {
for(var i=0, l=chain.length; i<l; i+=1) {
if (chain[i].name === state.name) {
return;
}
}

if(!stateAlreadyInChain && !state.abstract && !skipStep) {
// Insert at first or second index.
if(prefixStateInserted) {
chain.splice(1, 0, state);
} else {
chain.unshift(state);
}
return true;
if(!state.abstract && !$$isStateDataProperty(state, 'ncyBreadcrumbSkip')) {
state.ncyBreadcrumbLink = $state.href(state.name);
chain.unshift(state);
}
return false;
};

// Get the state for the parent step in the breadcrumb
var $$breadcrumbParentState = function(state) {

if(angular.isDefined(state.data) &&
angular.isDefined(state.data.ncyBreadcrumbParent) &&
!$$isInherited(state, 'ncyBreadcrumbParent')) {
if($$isStateDataProperty(state, 'ncyBreadcrumbParent')) {
return $state.get(state.data.ncyBreadcrumbParent);
}

return $$parentState(state);

};

return {
Expand All @@ -110,27 +91,21 @@ function $Breadcrumb() {

getStatesChain: function() {
var chain = [];
var prefixStateInserted = false;

// From current state to the root
for(var state = $state.$current.self; state && state.name !== ''; state=$$breadcrumbParentState(state)) {
$$addStateInChain(chain, state);
}

// Prefix state treatment
if($$options.prefixStateName) {
var prefixState = $state.get($$options.prefixStateName);
if(prefixState) {
var prefixStep = angular.extend(prefixState, {ncyBreadcrumbLink: $state.href(prefixState)});
prefixStateInserted = $$addStateInChain(chain, prefixStep, prefixStateInserted);
} else {
if(!prefixState) {
throw 'Bad configuration : prefixState "' + $$options.prefixStateName + '" unknown';
}
}

// From current state to the root
var state = $state.$current.self;
do {
var step = angular.extend(state, {ncyBreadcrumbLink: $state.href(state.name)});
$$addStateInChain(chain, step, prefixStateInserted);
state = $$breadcrumbParentState(state);
$$addStateInChain(chain, prefixState);
}
while(state && state.name !== '');

return chain;
},
Expand Down
8 changes: 7 additions & 1 deletion test/spec/service-sample-test.js
Expand Up @@ -27,4 +27,10 @@ describe('Service with sample conf', function() {
expect(stringifyStateChain(statesChain)).toBe('home --> sample --> room --> room.detail');
}));

});
it('must build a correct link for each steps', inject(function($breadcrumb) {
goToStateAndFlush('room');
var statesChain = $breadcrumb.getStatesChain();
expect(statesChain[0].ncyBreadcrumbLink).toBe('#/home');
expect(statesChain[1].ncyBreadcrumbLink).toBe('#/sample');
}));
});

0 comments on commit 3c19f89

Please sign in to comment.