                    (str "Call #" (inc index) " (Subworkflow ID " subWorkflowId "): ")
                    (if (contains? (:subworkflow-expanded @state) subWorkflowId)
                      [:span {}
-                      ;; click to hide this SubworkflowDetails and remove from the :subworkflow-expanded map in @state
+                      ;; click to hide this subworkflow's WorkflowDetails and remove from the :subworkflow-expanded map in @state
                       (links/create-internal {:onClick #(swap! state update :subworkflow-expanded
                                                                (fn [expanded-map]
                                                                  (dissoc expanded-map subWorkflowId)))}

     {:expanded false})
   :render
   (fn [{:keys [props state]}]
     [:div {}
      (create-field
       (:label props)
       (if (empty? (:data props))
         "None"
         (links/create-internal {:onClick #(swap! state update :expanded not)}
           (if (:expanded @state) "Hide" "Show"))))
      (when (:expanded @state)
        [:div {:style {:padding "0.25em 0 0.25em 1em"}}
         (let [namespace (get-in props [:workspace-id :namespace])
               columns [{:header "Label"
                         :column-data #(last (string/split (key %) #"\."))}
                        {:header "Value"
                         :initial-width :auto
                         :sortable? false
                         :column-data #(display-value namespace (second %))}]
               task-column {:header "Task"
                            :column-data #(second (string/split (key %) #"\."))}]
           [Table
            {:data (:data props)
             :body {:style table-style/table-heavy
                    :behavior {:reorderable-columns? false
                               :filterable? false}
                    :columns (if (:call-detail? props) columns (cons task-column columns))}}])])])})

(react/defc- WorkflowTimingDiagram
  {:render

     (str gcs-uri))))

(defonce default-metadata-includes ["backendLogs" "backendStatus" "end" "executionStatus" "callCaching:hit" "failures"
                                    "id" "jobId" "start" "status" "stderr" "stdout" "submission" "subworkflowId"
                                    "workflowLog" "workflowName" "workflowRoot"])

(defonce metadata-timing-includes ["attempt" "description" "end" "endTime" "executionEvents" "executionStatus"
                                   "shardIndex" "start" "startTime" "workflowName"])

(defonce metadata-inputs-includes ["submittedFiles:inputs" "inputs"])

;; requesting executionStatus for outputs makes the response payload somewhat larger, but it forces Cromwell to return
;; data about every call in a task scatter. Otherwise, if we request just includeKey=outputs and a scatter contains both
;; successes and failures, Cromwell will return only those calls that have outputs, i.e. the successes. Since our CLJS code
;; identifies calls by their index in an array, this causes off-by-one (or off-by-many) functional errors.
(defonce metadata-outputs-includes ["executionStatus" "outputs"])

(defn getTimingDiagramHeight [chartContainer]
  (let [e (-> chartContainer (.-childNodes)
