From 5dccb89847d145863750f70cf2d5060924c3af78 Mon Sep 17 00:00:00 2001
From: Kyle Doherty <kyle.l.doherty@gmail.com>
Date: Fri, 15 Sep 2017 14:50:41 -0700
Subject: [PATCH] determine loading

---
 .../src/metabase/xray/containers/CardXRay.jsx |  4 +++-
 .../metabase/xray/containers/FieldXray.jsx    |  7 +++++-
 .../xray/containers/SegmentComparison.jsx     | 22 +++++++++++--------
 .../containers/SegmentTableComparison.jsx     | 11 ++++++----
 .../metabase/xray/containers/SegmentXRay.jsx  | 15 ++++++++-----
 .../metabase/xray/containers/TableXRay.jsx    |  4 +++-
 frontend/src/metabase/xray/utils.js           |  9 ++++++++
 7 files changed, 51 insertions(+), 21 deletions(-)

diff --git a/frontend/src/metabase/xray/containers/CardXRay.jsx b/frontend/src/metabase/xray/containers/CardXRay.jsx
index b03b51909a3..632cac93070 100644
--- a/frontend/src/metabase/xray/containers/CardXRay.jsx
+++ b/frontend/src/metabase/xray/containers/CardXRay.jsx
@@ -14,6 +14,8 @@ import Visualization from 'metabase/visualizations/components/Visualization'
 import { XRayPageWrapper, Heading } from 'metabase/xray/components/XRayLayout'
 import Periodicity from 'metabase/xray/components/Periodicity'
 
+import { hasXray } from 'metabase/xray/utils'
+
 type Props = {
     fetchCardXray: () => void,
     isLoading: boolean,
@@ -62,7 +64,7 @@ class CardXRay extends Component {
         const { xray, isLoading } = this.props
         const { error } = this.state
         return (
-            <LoadingAndErrorWrapper loading={isLoading} error={error}>
+            <LoadingAndErrorWrapper loading={isLoading || !hasXray(xray)} error={error}>
                 { () =>
                     <XRayPageWrapper>
                         <div className="mt4 mb2">
diff --git a/frontend/src/metabase/xray/containers/FieldXray.jsx b/frontend/src/metabase/xray/containers/FieldXray.jsx
index 612af2bd036..f805152afc0 100644
--- a/frontend/src/metabase/xray/containers/FieldXray.jsx
+++ b/frontend/src/metabase/xray/containers/FieldXray.jsx
@@ -24,6 +24,8 @@ import StatGroup from 'metabase/xray/components/StatGroup'
 import Histogram from 'metabase/xray/Histogram'
 import { Heading, XRayPageWrapper } from 'metabase/xray/components/XRayLayout'
 
+import { hasXray } from 'metabase/xray/utils'
+
 import Periodicity from 'metabase/xray/components/Periodicity'
 
 import type { Field } from 'metabase/meta/types/Field'
@@ -87,9 +89,12 @@ class FieldXRay extends Component {
     render () {
         const { xray, params, isLoading } = this.props
         const { error } = this.state
+
+        console.log(hasXray(xray))
+
         return (
             <LoadingAndErrorWrapper
-                loading={isLoading}
+                loading={isLoading || !hasXray(xray)}
                 error={error}
                 noBackground
             >
diff --git a/frontend/src/metabase/xray/containers/SegmentComparison.jsx b/frontend/src/metabase/xray/containers/SegmentComparison.jsx
index c5c67a95d14..6cdbd87d75f 100644
--- a/frontend/src/metabase/xray/containers/SegmentComparison.jsx
+++ b/frontend/src/metabase/xray/containers/SegmentComparison.jsx
@@ -10,19 +10,22 @@ import {
     getComparisonFields,
     getComparisonContributors,
     getSegmentItem,
-    getTitle
+    getTitle,
+    getLoadingStatus
 } from 'metabase/xray/selectors'
 
-
 import LoadingAndErrorWrapper from 'metabase/components/LoadingAndErrorWrapper'
 import XRayComparison from 'metabase/xray/components/XRayComparison'
 
+import { hasComparison } from 'metabase/xray/utils'
+
 const mapStateToProps = (state) => ({
-        comparison: getComparison(state),
-        fields: getComparisonFields(state),
-        contributors: getComparisonContributors(state),
-        itemA: getSegmentItem(state, 0),
-        itemB: getSegmentItem(state, 1)
+    comparison: getComparison(state),
+    fields: getComparisonFields(state),
+    contributors: getComparisonContributors(state),
+    itemA: getSegmentItem(state, 0),
+    itemB: getSegmentItem(state, 1),
+    isLoading: getLoadingStatus(state)
 })
 
 const mapDispatchToProps = {
@@ -53,14 +56,15 @@ class SegmentComparison extends Component {
             comparison,
             fields,
             itemA,
-            itemB
+            itemB,
+            isLoading
         } = this.props
 
         const { error } = this.state
 
         return (
             <LoadingAndErrorWrapper
-                loading={!comparison}
+                loading={isLoading || !hasComparison(comparison)}
                 error={error}
                 noBackground
             >
diff --git a/frontend/src/metabase/xray/containers/SegmentTableComparison.jsx b/frontend/src/metabase/xray/containers/SegmentTableComparison.jsx
index 4a63733f0d5..a29058cb045 100644
--- a/frontend/src/metabase/xray/containers/SegmentTableComparison.jsx
+++ b/frontend/src/metabase/xray/containers/SegmentTableComparison.jsx
@@ -10,17 +10,20 @@ import {
     getComparisonFields,
     getSegmentItem,
     getTableItem,
-    getTitle
+    getTitle,
+    getLoadingStatus
 } from 'metabase/xray/selectors'
 
 import LoadingAndErrorWrapper from 'metabase/components/LoadingAndErrorWrapper'
 import XRayComparison from 'metabase/xray/components/XRayComparison'
+import { hasComparison } from 'metabase/xray/utils'
 
 const mapStateToProps = state => ({
     comparison: getComparison(state),
     fields: getComparisonFields(state),
     itemA: getSegmentItem(state),
-    itemB: getTableItem(state)
+    itemB: getTableItem(state),
+    isLoading: getLoadingStatus(state)
 })
 
 const mapDispatchToProps = {
@@ -45,11 +48,11 @@ class SegmentTableComparison extends Component {
     }
 
     render () {
-        const { params, fields, comparison, itemA, itemB } = this.props
+        const { params, fields, comparison, itemA, itemB, isLoading } = this.props
         const { error } = this.state
         return (
             <LoadingAndErrorWrapper
-                loading={!comparison}
+                loading={isLoading || !hasComparison(comparison)}
                 error={error}
                 noBackground
             >
diff --git a/frontend/src/metabase/xray/containers/SegmentXRay.jsx b/frontend/src/metabase/xray/containers/SegmentXRay.jsx
index 52e7050dfea..4077b9a1636 100644
--- a/frontend/src/metabase/xray/containers/SegmentXRay.jsx
+++ b/frontend/src/metabase/xray/containers/SegmentXRay.jsx
@@ -15,7 +15,8 @@ import CostSelect from 'metabase/xray/components/CostSelect'
 
 import {
     getSegmentConstituents,
-    getSegmentXray
+    getSegmentXray,
+    getLoadingStatus
 } from 'metabase/xray/selectors'
 
 import Constituent from 'metabase/xray/components/Constituent'
@@ -23,6 +24,8 @@ import Constituent from 'metabase/xray/components/Constituent'
 import type { Table } from 'metabase/meta/types/Table'
 import type { Segment } from 'metabase/meta/types/Segment'
 
+import { hasXray } from 'metabase/xray/utils'
+
 type Props = {
     fetchSegmentXray: () => void,
     constituents: [],
@@ -33,12 +36,14 @@ type Props = {
     params: {
         segmentId: number,
         cost: string,
-    }
+    },
+    isLoading: boolean
 }
 
 const mapStateToProps = state => ({
     xray: getSegmentXray(state),
-    constituents: getSegmentConstituents(state)
+    constituents: getSegmentConstituents(state),
+    isLoading: getLoadingStatus(state)
 })
 
 const mapDispatchToProps = {
@@ -76,12 +81,12 @@ class SegmentXRay extends Component {
     }
 
     render () {
-        const { constituents, xray, params } = this.props
+        const { constituents, xray, params, isLoading } = this.props
         const { error } = this.state
         return (
             <XRayPageWrapper>
                 <LoadingAndErrorWrapper
-                    loading={!constituents}
+                    loading={isLoading || !hasXray(xray)}
                     error={error}
                     noBackground
                 >
diff --git a/frontend/src/metabase/xray/containers/TableXRay.jsx b/frontend/src/metabase/xray/containers/TableXRay.jsx
index 6ed883d1416..90f722fd034 100644
--- a/frontend/src/metabase/xray/containers/TableXRay.jsx
+++ b/frontend/src/metabase/xray/containers/TableXRay.jsx
@@ -23,6 +23,8 @@ import LoadingAndErrorWrapper from 'metabase/components/LoadingAndErrorWrapper'
 
 import type { Table } from 'metabase/meta/types/Table'
 
+import { hasXray } from 'metabase/xray/utils'
+
 type Props = {
     constituents: [],
     fetchTableXray: () => void,
@@ -83,7 +85,7 @@ class TableXRay extends Component {
         return (
             <XRayPageWrapper>
                 <LoadingAndErrorWrapper
-                    loading={isLoading}
+                    loading={isLoading || !hasXray(xray)}
                     error={error}
                     noBackground
                 >
diff --git a/frontend/src/metabase/xray/utils.js b/frontend/src/metabase/xray/utils.js
index 7350f823e16..74d8b386490 100644
--- a/frontend/src/metabase/xray/utils.js
+++ b/frontend/src/metabase/xray/utils.js
@@ -12,3 +12,12 @@ export const distanceToPhrase = (distance) => {
         return 'Very similar'
     }
 }
+
+// Small utilities to determine whether we have an entity yet or not,
+// used for loading status
+function has (entity) {
+    return typeof entity !== 'undefined' ? true : false
+}
+
+export const hasXray = has
+export const hasComparison = has
-- 
GitLab