From dc23f2880cd10868038f0d23eadd6b244b4d0c39 Mon Sep 17 00:00:00 2001 From: Andrew Sunada Date: Wed, 24 Jul 2019 14:45:29 -0700 Subject: [PATCH 1/6] fix(dino-park): reorganizing loading order --- src/pages/PageOrgchart.vue | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/pages/PageOrgchart.vue b/src/pages/PageOrgchart.vue index b5176e283..eda3ad73d 100644 --- a/src/pages/PageOrgchart.vue +++ b/src/pages/PageOrgchart.vue @@ -31,7 +31,9 @@
-
+
+ +
Date: Mon, 29 Jul 2019 16:17:45 -0700 Subject: [PATCH 2/6] feat(dino-park): adjusting org chart loading --- src/components/ui/UserPicture.vue | 18 ++++++-------- src/pages/PageOrgchart.vue | 40 ++++++++++++++++++++++++++----- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/components/ui/UserPicture.vue b/src/components/ui/UserPicture.vue index ef1992af7..e095e0df7 100644 --- a/src/components/ui/UserPicture.vue +++ b/src/components/ui/UserPicture.vue @@ -1,15 +1,11 @@ diff --git a/src/pages/PageOrgchart.vue b/src/pages/PageOrgchart.vue index eda3ad73d..32ac0e955 100644 --- a/src/pages/PageOrgchart.vue +++ b/src/pages/PageOrgchart.vue @@ -196,13 +196,14 @@ export default { desktopView: false, dirty: false, rawJson: null, + chartForHighlightClicked: false, }; }, async created() { window.addEventListener('resize', this.updateView); this.updateView(); - this.highlight(); - this.fetchData(); + await this.fetchData(); + await this.highlight(); }, computed: { username() { @@ -262,7 +263,7 @@ export default { orgChartRoot.addEventListener('click', (event) => { const li = event.target.closest('li'); - + this.chartForHighlightClicked = true; if (event.target.closest('button')) { this.toggle(li); this.saveOrgTree(); @@ -384,9 +385,36 @@ export default { }); }, expandAll() { - Object.entries(this.expandables).forEach(([, li]) => { - this.toggle(li, true); - }); + const entries = Object.entries(this.expandables); + const loadSet = (idx, num) => { + entries.slice(idx, idx + num).forEach(([, li]) => { + this.toggle(li, true); + }); + }; + let step = 25, + i = 0, + intervalTime = 1000; + let inter = setInterval(() => { + const run = () => { + if (i < entries.length) { + loadSet(i, step); + i += step; + if (i + step > entries.length) { + step = entries.length - i; + } + } else { + clearInterval(inter); + } + }; + if (this.chartForHighlightClicked) { + setTimeout(() => { + run(); + this.chartForHighlightClicked = false; + }); + } else { + run(); + } + }, intervalTime); this.saveOrgTree(); }, collapseAll() { From 15844ea7bcecbfd19a045bfa8e16e0f9b85b5cb4 Mon Sep 17 00:00:00 2001 From: Andrew Sunada Date: Mon, 12 Aug 2019 16:34:02 -0700 Subject: [PATCH 3/6] feat(IAM-158): setting up page to load 1 image at a time to maintain interactivability --- src/assets/images/empty_profile.png | Bin 0 -> 3218 bytes src/assets/js/image-collection-handler.js | 88 ++++++++++++++++ src/pages/PageOrgchart.vue | 121 +++++++++++++--------- 3 files changed, 161 insertions(+), 48 deletions(-) create mode 100644 src/assets/images/empty_profile.png create mode 100644 src/assets/js/image-collection-handler.js diff --git a/src/assets/images/empty_profile.png b/src/assets/images/empty_profile.png new file mode 100644 index 0000000000000000000000000000000000000000..8baf9029aaba828224ae17c99d7fb5ef879c02c0 GIT binary patch literal 3218 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 YH$quoe(~4k-mipY#!C9>#Em=t3&}wyKmY&$ literal 0 HcmV?d00001 diff --git a/src/assets/js/image-collection-handler.js b/src/assets/js/image-collection-handler.js new file mode 100644 index 000000000..2a016f4cd --- /dev/null +++ b/src/assets/js/image-collection-handler.js @@ -0,0 +1,88 @@ +import generateIdenticon from '@/assets/js/identicon-avatar'; + +export default class ImageCollectionHandler { + constructor(options) { + this.images = []; + this.loadedIds = []; + this.nodesToLoad = []; + this.interrupted = false; + this.onImageLoaded = + 'onImageLoaded' in options ? options.onImageLoaded : (key, image) => {}; + } + loadImagesFromNodes(nodes) { + return new Promise((res, rej) => { + this.nodesToLoad = nodes.slice(0); + const loadNextNode = () => { + const self = this; + if (this.nodesToLoad.length === 0) { + res(this.images); + return; + } + const poppedNode = this.nodesToLoad.shift(); + if (this.loadedIds.includes(poppedNode.username)) { + console.log('Already loaded: ', poppedNode.username); + loadNextNode(); + return; + } + let { picture, username } = poppedNode; + let url = null; + let img = null; + if ( + picture === null || + picture === '' || + picture === 'default:' || + picture.startsWith('https://s3.amazonaws.com/') + ) { + img = new Image(); + generateIdenticon(username, 40).then((src) => { + url = src; + img.src = url; + }); + } else { + img = new Image(); + url = `${picture}?size=40`; + img.src = url; + } + + img.onload = function() { + self.images.unshift(img); + self.loadedIds.unshift(poppedNode.username); + self.onImageLoaded(poppedNode.username, this); + if (self.interrupted) { + if (Array.isArray(self.interrupted)) { + self.nodesToLoad = self.interrupted.concat(self.nodesToLoad); + } else { + self.nodesToLoad.push(self.interrupted); + } + self.interrupted = false; + loadNextNode(); + } else { + loadNextNode(); + } + }; + img.onerror = function() { + loadNextNode(); + console.log("Couldn't load: ", url); + }; + }; + loadNextNode(); + }); + } + interruptImagesWithNode(id) { + for (let i = 0, len = this.nodesToLoad.length; i < len; i++) { + if (this.nodesToLoad[i].username === id) { + this.interrupted = this.nodesToLoad[i]; + break; + } + } + } + interruptImagesWithNodeList(ids) { + const interruptedSet = []; + for (let i = 0, len = this.nodesToLoad.length; i < len; i++) { + if (ids.includes(this.nodesToLoad[i].username)) { + interruptedSet.push(this.nodesToLoad[i]); + } + } + this.interrupted = interruptedSet; + } +} diff --git a/src/pages/PageOrgchart.vue b/src/pages/PageOrgchart.vue index 32ac0e955..db6861f84 100644 --- a/src/pages/PageOrgchart.vue +++ b/src/pages/PageOrgchart.vue @@ -1,6 +1,6 @@