From cf8ed6f8d3de07a42982611c476c939707da0b95 Mon Sep 17 00:00:00 2001 From: joan Date: Mon, 19 Oct 2020 07:35:24 +0200 Subject: [PATCH] Anchor directive functionality --- front/core/directives/anchor.js | 57 ++++++++++++++++++---- front/core/directives/specs/anchor.spec.js | 22 +++++++++ 2 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 front/core/directives/specs/anchor.spec.js diff --git a/front/core/directives/anchor.js b/front/core/directives/anchor.js index 48c2da4937..a0ae62a980 100644 --- a/front/core/directives/anchor.js +++ b/front/core/directives/anchor.js @@ -7,26 +7,63 @@ import ngModule from '../module'; * @param {Object} $state * @return {Object} The directive */ -export function directive($parse, $state) { +export function directive($state, $window) { + let ctrlPressed = false; + + $window.addEventListener('keydown', event => { + if (event.key == 'Control') + ctrlPressed = true; + }); + + $window.addEventListener('keyup', event => { + if (event.key == 'Control') + ctrlPressed = false; + }); + + function changeState(event, state) { + const params = stringifyParams(state); + $state.go(state.url, params); + + event.preventDefault(); + event.stopPropagation(); + } + + function newTab(event, state) { + const params = stringifyParams(state); + const url = $state.href(state.url, params); + $window.open(url); + + event.preventDefault(); + event.stopPropagation(); + } + + function stringifyParams(state) { + const params = Object.assign({}, state.params); + for (let param in params) + params[param] = JSON.stringify(params[param]); + + return params; + } + return { restrict: 'A', link: function($scope, $element, $attrs) { const state = $scope.$eval($attrs.vnAnchor); - // const element = $element[0]; $element.on('click', event => { - const params = []; + if (ctrlPressed) + newTab(event, state); + else + changeState(event, state); + }); - for (let param in state.params) - console.log(param); - - // $state.go(state.url, state.params); - event.preventDefault(); - event.stopPropagation(); + $element.on('mousedown', event => { + if (event.button == 1) + newTab(event, state); }); } }; } -directive.$inject = ['$parse', '$state']; +directive.$inject = ['$state', '$window']; ngModule.directive('vnAnchor', directive); diff --git a/front/core/directives/specs/anchor.spec.js b/front/core/directives/specs/anchor.spec.js new file mode 100644 index 0000000000..fc3c053b35 --- /dev/null +++ b/front/core/directives/specs/anchor.spec.js @@ -0,0 +1,22 @@ + +fdescribe('Directive vnAnchor', () => { + let $scope; + let $element; + let compile; + + beforeEach(ngModule('vnCore')); + + compile = _element => { + inject(($compile, $rootScope) => { + $scope = $rootScope.$new(); + $element = angular.element(_element); + $compile($element)($scope); + $scope.$digest(); + }); + }; + + it(`should throw an error when there's no id defined`, () => { + let html = ``; + compile(html); + }); +});