/** * @ngdoc fbDokumentVaerdeStyle * @name fasit.component.fbDokumentVaerdeStyle * @fbDokumentVaerdeStyle * * @description * directive som tar ett dokumentVaerde som parameter och tillåter användaren att sätta styling på detta dokumentVaerde * */ angular.module('fasit') .directive('fbDokumentSection', ['commonService', '$timeout', 'logService', 'uniqueIdService', function ( commonService: fb.ICommonService, $timeout: ng.ITimeoutService, logService: fb.ILogService, uniqueIdService: fb.IUniqueIdService) { var link = function (scope: fb.IFbDokumentSectionScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes) { /* scope.hasFocus = false; var focusoutTimeout; scope.focusVaerde = null; scope.sectionSplit = []; if (typeof scope.visibleDokumentVaerde === 'undefined') { scope.visibleDokumentVaerde = new fb.DokumentVaerde({}); if (scope.defaultVisible === false || scope.defaultVisible === 'false') { scope.visibleDokumentVaerde.Vaerde = false; } else { scope.visibleDokumentVaerde.Vaerde = true; } scope.visibleDokumentVaerde.save = false; } scope.hide = function () { scope.visibleDokumentVaerde.Vaerde = false; }; scope.show = function () { scope.visibleDokumentVaerde.Vaerde = true; }; scope.$on('$destroy', function () { element.off('focusin'); element.off('focusout'); }); // När något innehåll i sectionen får fokus element.on('focusin', function (event) { var typelessEvent: any = event; try { var directiveElement = angular.element(typelessEvent.target)[0].parentElement; // Kolla om det var ett editable field och sätt isåfall detta som det fält som redigeras just nu // Går inte att enhetstesta eftersom att det lägger krav på strukturen hos en annan enhet if (directiveElement.nodeName === 'FB-DOKUMENT-FIELD') { var VaerdeNamn = angular.element(directiveElement.attributes['dokument-vaerde'])[0].nodeValue; if (VaerdeNamn.slice(0, 16) === 'dokumentVaerden.') { scope.focusVaerde = scope.dokumentVaerden[VaerdeNamn.slice(16, VaerdeNamn.length)]; } } } catch (ex) { logService.log('fbDokumentSection tog imot ett focusin-event som inte var på ett fb-dokument-field'); } $timeout.cancel(focusoutTimeout); commonService.angularFunctions.safeApply(scope, function () { scope.styleObject.styleSection = scope.visibleDokumentVaerde; scope.hasFocus = true; }); }); element.on('focusout', function (event) { var source: any = event.target; // Om focusout eventet kom från en knapp så ska inte sectionen förlora focus if (source.type === 'button' || source.type === 'submit') { event.stopPropagation(); return; } // fördröjer focusout-eventet med 50 ms för att kunna bryta eventet ifall focus byttes till någonting annat i samma section focusoutTimeout = $timeout(function () { commonService.angularFunctions.safeApply(scope, function () { scope.hasFocus = false; scope.focusVaerde = null; scope.splitIntoPages(); //$timeout(scope.splitIntoPages); //console.log('focusout'); }); }, 50); }); // ********************************** Sidindelning ***************************************** scope.$watch('sectionHeight', function (newVal, oldVal) { if (typeof scope.sectionHoejdData !== 'undefined') { if (!scope.sectionHoejdData[scope.index]) { scope.sectionHoejdData[scope.index] = { height: 0, offset: 0 }; } scope.sectionHoejdData[scope.index].height = scope.sectionHeight; } //scope.splitIntoPages(); //$timeout(scope.splitIntoPages); //console.log('sectionHeight', scope.index, newVal, oldVal); }); scope.$watchCollection('pageSplit', function (newVal, oldVal) { scope.splitIntoPages(); //$timeout(scope.splitIntoPages); //console.log('pageSplit', scope.index, newVal, oldVal); }); scope.$watch('sectionOffset.top', function (newVal, oldVal) { scope.splitIntoPages(); //$timeout(scope.splitIntoPages); //console.log('offset.top', scope.index, newVal, oldVal); if (typeof scope.sectionHoejdData !== 'undefined') { if (!scope.sectionHoejdData[scope.index]) { scope.sectionHoejdData[scope.index] = { height: 0, offset: 0 }; } scope.sectionHoejdData[scope.index].offset = scope.sectionOffset.top; } }); var lastSplit = 0; scope.splitIntoPages = function () { return; if (!scope.pageSplit) { return; } var currentTime = new Date().getTime(); if (currentTime - lastSplit < 50) { return; } lastSplit = currentTime; var offsetTop = scope.sectionOffset.top; var offsetHeight = scope.sectionHeight; //console.log('splitting section ' + scope.index + ' into pages', scope.sectionOffset.top, scope.sectionHeight); var marginBeforeElement = element.find('.fb-dokument-section-page-break-before'); var transcludedContent = element.find('.fb-dokument-section-body'); var marginBeforeChanged = false; var breakElements = element.find('.section-page-break-element'); for (var iter: number = 0; iter < breakElements.length; iter++) { uniqueIdService.removeUniqueId(breakElements[iter].id); } element.find('.section-page-break-element').remove(); scope.sectionSplit = []; // påverkar sidindelningen detta element? for (var i: number = 0; i < scope.pageSplit.length; i++) { var split = scope.pageSplit[i]; if (scope.newPage && !marginBeforeChanged && split.endOffset > offsetTop) { var newMarginBefore = split.endOffset - offsetTop; marginBeforeElement[0].style.height = newMarginBefore + 'px'; marginBeforeElement[0].style.pageBreakAfter = 'always'; marginBeforeChanged = true; } if (offsetTop + offsetHeight < split.startOffset) { break; } // om: // sektionen börjar innan slutet av pagebreak OCH slutar efter början på pagebreak // ELLER // sektionen börjar efter början på pagebreak OCH börjar innan slutet på pagebreak if (scope.pageSplit[i - 1] && scope.sectionSplit.length > 0) { offsetTop = scope.pageSplit[i - 1].endOffset; offsetHeight -= (scope.pageSplit[i - 1].startOffset - offsetTop); } if ((offsetTop < split.endOffset && (offsetTop + offsetHeight) > split.startOffset) || ((offsetTop > split.startOffset && offsetTop < split.endOffset))) { // detta element behöver delas upp av nuvarande split // case: sektionen börjar nära siddelningen eller i sidindelningen // så split görs lämpligast genom att flytta hela sektionen var MARGIN_FOR_MOVING_WHOLE_SECTION = 200; if (split.startOffset - offsetTop < MARGIN_FOR_MOVING_WHOLE_SECTION) { var marginBefore = Math.floor(split.endOffset - offsetTop); marginBeforeElement[0].style.height = marginBefore + 'px'; marginBeforeElement[0].style.pageBreakAfter = 'always'; //console.log('split section ' + scope.index + ' before', offsetTop, offsetHeight); marginBeforeChanged = true; } else { // elementet behöver delas upp inuti, iterera över elementen i sektionen för att avgöra vilket element som bör flyttas for (var j: number = 0; j < transcludedContent[0].children.length; j++) { var currentChildElement = angular.element(transcludedContent[0].children[j]); // om det går att flytta ett helt element i sektionen gör det var childHeight = currentChildElement[0].offsetHeight; var childOffset = commonService.absolutePositioning.offsetTop(currentChildElement); if ((childOffset < split.endOffset && (childOffset + childHeight) > split.startOffset) || ((childOffset > split.startOffset && childOffset < split.endOffset))) { // elementet överlappar eller börjar i pagesplit var currentElementSplittable: boolean = false; try { var str = angular.element(currentChildElement[0].attributes['splittable'])[0].nodeValue; if (str && str !== 'false') { currentElementSplittable = true; } } catch (ex) { //logService.log('splittable not set on element '); } if (scope.pageSplit[i - 1] && childHeight > split.startOffset - scope.pageSplit[i - 1].endOffset && !currentElementSplittable) { // Om elementet är större än en sida och inte splittable, ignorera elementet continue; } else if (currentElementSplittable) { //om elementet är splittable, dela upp elementet // som det ser ut just nu så delar delbara element upp sig själva för att inte få några jobbiga beroenden mellan section och de olika delbara delarna } else { //console.log('split section ' + scope.index + ' inside', offsetTop, offsetHeight); // om elementet inte är splittable, flytta elementet till nästa sida var marginBeforeChildElement = split.endOffset - childOffset; var newElement = document.createElement('div'); newElement.className = 'section-page-break-element'; newElement.style.height = marginBeforeChildElement + 'px'; newElement.style.pageBreakAfter = 'always'; newElement.id = uniqueIdService.getUniqueId('sidIndelningsBlock'); scope.sectionSplit.push({ element: newElement, height: marginBeforeChildElement }); transcludedContent[0].insertBefore(newElement, currentChildElement[0]); j++; } } } // end for loop över child elements } } } // end for-loop över page-split if (!marginBeforeChanged) { marginBeforeElement[0].style.height = 0 + 'px'; marginBeforeElement[0].style.pageBreakAfter = ''; } }; */ }; return { restrict: 'E', scope: { //optional: '@', //visibleDokumentVaerde: '=?', //dokumentVaerden: '=', //index: '=', sectionHoejdData: '=', //pageSplit: '=', //styleObject: '=', //granska: '=', //defaultVisible: '@', //newPage: '@' }, templateUrl: 'app/Directives/fbDokumentSection/fbDokumentSection.html', link: link, replace: false, transclude: true } }]);