From 20f386402b6dbab37a83628ee73d8cdb40d64a64 Mon Sep 17 00:00:00 2001 From: caesay Date: Tue, 4 Apr 2017 21:07:58 +1000 Subject: [PATCH] Fix for height jitters when truncating single lines --- .../events/events-directive.tpl.html | 4 +-- src/components/truncate/truncate-directive.js | 34 ++++++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/components/events/events-directive.tpl.html b/src/components/events/events-directive.tpl.html index 51b88558..18877615 100644 --- a/src/components/events/events-directive.tpl.html +++ b/src/components/events/events-directive.tpl.html @@ -19,8 +19,8 @@ - {{::event.data.Name}} - {{::(event.data.Name || event.data.Identity)}} + + -- diff --git a/src/components/truncate/truncate-directive.js b/src/components/truncate/truncate-directive.js index 7cae9ca1..81eccf7b 100644 --- a/src/components/truncate/truncate-directive.js +++ b/src/components/truncate/truncate-directive.js @@ -6,13 +6,39 @@ return { restrict: 'A', link: function (scope, element, attrs) { + var el = angular.element(element); + var lines = attrs.lines || 1; + + // workaround for single-line truncations so they don't cause height jittering + var defaultOverflow, defaultWhiteSpace, firstRender; + if (lines === 1) { + firstRender = true; + defaultOverflow = el.css('overflow'); + defaultWhiteSpace = el.css('whitespace'); + if (!defaultOverflow) defaultOverflow = "initial"; + if (!defaultWhiteSpace) defaultWhiteSpace = "initial"; + el.css('overflow', "hidden"); + el.css('white-space', "nowrap"); + } + + // function to provide debounced truncation (useful so window resizing doesn't cause issues) var truncate = debounce(function () { - angular.element(element).trunk8({ lines: attrs.lines || 1, tooltip: (attrs.overwriteTooltip !== undefined ? attrs.overwriteTooltip === true : true) }); - }, 150); + if (firstRender) { + firstRender = false; + el.css('overflow', defaultOverflow); + el.css('white-space', defaultWhiteSpace); + } + + el.trunk8({ + lines: lines, + tooltip: (attrs.overwriteTooltip !== undefined ? attrs.overwriteTooltip === true : true), + }); + }, 100); - // TODO: Fix this bug: http://branchandbound.net/blog/web/2013/08/some-angularjs-pitfalls/ - var timeout = $timeout(truncate, 150); + // execute truncate after a short delay - this is so the browser can calculate the available width of the containing element. + var timeout = $timeout(truncate, 100); + // register for resize events as this is the only other time we may need to update var window = angular.element($window); window.bind('resize', truncate);