diff --git a/app/assets/javascripts/extensions/element.js.es6 b/app/assets/javascripts/extensions/element.js.es6
new file mode 100644
index 0000000000000000000000000000000000000000..d5d4af3573cc42498f2f552b282be596883fdd0b
--- /dev/null
+++ b/app/assets/javascripts/extensions/element.js.es6
@@ -0,0 +1,6 @@
+Element.prototype.matches = Element.prototype.matches || Element.prototype.msMatches;
+
+Element.prototype.closest = function closest(selector, selectedElement = this) {
+  if (!selectedElement) return;
+  return selectedElement.matches(selector) ? selectedElement : Element.prototype.closest(selector, selectedElement.parentElement);
+};
diff --git a/app/assets/javascripts/pipelines.js.es6 b/app/assets/javascripts/pipelines.js.es6
index a7624de6089f17a77eab7e8f2daa3b4116655ef1..0fa56df0d2a9923658c1fd657de88beff6168b77 100644
--- a/app/assets/javascripts/pipelines.js.es6
+++ b/app/assets/javascripts/pipelines.js.es6
@@ -2,36 +2,39 @@
 
   class Pipelines {
     constructor() {
-      $(document).off('click', '.toggle-pipeline-btn').on('click', '.toggle-pipeline-btn', this.toggleGraph);
+      this.initGraphToggle();
       this.addMarginToBuildColumns();
     }
 
-    toggleGraph() {
-      const $pipelineBtn = $(this).closest('.toggle-pipeline-btn');
-      const $pipelineGraph = $(this).closest('.row-content-block').next('.pipeline-graph');
-      const $btnText = $(this).find('.toggle-btn-text');
-      const graphCollapsed = $pipelineGraph.hasClass('graph-collapsed');
-
-      $($pipelineBtn).add($pipelineGraph).toggleClass('graph-collapsed');
-
+    initGraphToggle() {
+      this.pipelineGraph = document.querySelector('.pipeline-graph');
+      this.toggleButton = document.querySelector('.toggle-pipeline-btn');
+      this.toggleButtonText = this.toggleButton.querySelector('.toggle-btn-text');
+      this.toggleButton.addEventListener('click', this.toggleGraph.bind(this));
+    }
 
-      graphCollapsed ? $btnText.text('Hide') : $btnText.text('Expand')
+    toggleGraph() {
+      const graphCollapsed = this.pipelineGraph.classList.contains('graph-collapsed');
+      this.toggleButton.classList.toggle('graph-collapsed');
+      this.pipelineGraph.classList.toggle('graph-collapsed');
+      this.toggleButtonText.textContent = graphCollapsed ? 'Hide' : 'Expand';
     }
 
     addMarginToBuildColumns() {
-      const $secondChildBuildNode = $('.build:nth-child(2)');
-      if ($secondChildBuildNode.length) {
-        const $firstChildBuildNode = $secondChildBuildNode.prev('.build');
-        const $multiBuildColumn = $secondChildBuildNode.closest('.stage-column');
-        const $previousColumn = $multiBuildColumn.prev('.stage-column');
-        $multiBuildColumn.addClass('left-margin');
-        $firstChildBuildNode.addClass('left-connector');
-        $previousColumn.each(function() {
-          $this = $(this);
-          if ($('.build', $this).length === 1) $this.addClass('no-margin');
-        });
+      const secondChildBuildNodes = this.pipelineGraph.querySelectorAll('.build:nth-child(2)');
+      for (buildNodeIndex in secondChildBuildNodes) {
+        const buildNode = secondChildBuildNodes[buildNodeIndex];
+        const firstChildBuildNode = buildNode.previousElementSibling;
+        if (!firstChildBuildNode || !firstChildBuildNode.matches('.build')) continue;
+        const multiBuildColumn = buildNode.closest('.stage-column');
+        const previousColumn = multiBuildColumn.previousElementSibling;
+        if (!previousColumn || !previousColumn.matches('.stage-column')) continue;
+        multiBuildColumn.classList.add('left-margin');
+        firstChildBuildNode.classList.add('left-connector');
+        const columnBuilds = previousColumn.querySelectorAll('.build');
+        if (columnBuilds.length === 1) previousColumn.classList.add('no-margin');
       }
-      $('.pipeline-graph').removeClass('hidden');
+      this.pipelineGraph.classList.remove('hidden');
     }
   }