From 1664c512d20d2430fbf552145f93685a811eea57 Mon Sep 17 00:00:00 2001
From: Ivan Gavryshko <igavryshko@ebay.com>
Date: Wed, 18 May 2016 13:40:40 -0500
Subject: [PATCH] MAGETWO-52914: Setup UI Modifications

- added show unstable checkbox to controll select version dropdown
- by default we show only stable versions
---
 setup/pub/magento/setup/select-version.js     | 46 ++++++++++++-------
 .../src/Magento/Setup/Model/SystemPackage.php | 38 +++++++++++++++
 setup/view/magento/setup/select-version.phtml | 15 ++++++
 3 files changed, 82 insertions(+), 17 deletions(-)

diff --git a/setup/pub/magento/setup/select-version.js b/setup/pub/magento/setup/select-version.js
index 8e9eba9c5c4..89bf9b63c1b 100644
--- a/setup/pub/magento/setup/select-version.js
+++ b/setup/pub/magento/setup/select-version.js
@@ -17,6 +17,7 @@ angular.module('select-version', ['ngStorage'])
         $scope.componentsReadyForNext = true;
         $scope.componentsProcessed = false;
         $scope.componentsProcessError = false;
+        $scope.showUnstable = false;
 
         $scope.tryAgainEnabled = function() {
             return ($scope.upgradeProcessed || $scope.upgradeProcessError)
@@ -28,31 +29,23 @@ angular.module('select-version', ['ngStorage'])
         $http.get('index.php/select-version/systemPackage', {'responseType' : 'json'})
             .success(function (data) {
                 if (data.responseType != 'error') {
-                    if (data.packages.length == 1 && data.packages[0].versions.length <=1) {
+                    if (data.packages.length == 1) {
                         $scope.upgradeProcessError = true;
                         $scope.upgradeProcessErrorMessage = "You're already using the latest version, there's nothing for us to do.";
                     } else {
                         $scope.selectedOption = [];
                         $scope.versions = [];
-                        for (var i = 0; i < data.packages.length; i++) {
-                            angular.forEach(data.packages[i].versions, function (value, key) {
+                        $scope.data = data;
+                        angular.forEach(data.packages, function (value, key) {
+                            if (value.stable) {
                                 $scope.versions.push({
                                     'versionInfo': angular.toJson({
-                                        'package': data.packages[i].package,
-                                        'version': value
-                                    }), 'version': value
+                                        'package': value.package,
+                                        'version': value.id
+                                    }),
+                                    'version': value
                                 });
-                            });
-                        }
-
-                        $scope.versions = $scope.versions.sort(function (a, b) {
-                            if (a.version.id < b.version.id) {
-                                return 1;
-                            }
-                            if (a.version.id > b.version.id) {
-                                return -1;
                             }
-                            return 0;
                         });
                         $scope.selectedOption = $scope.versions[0].versionInfo;
                         $scope.upgradeReadyForNext = true;
@@ -160,10 +153,29 @@ angular.module('select-version', ['ngStorage'])
             return false;
         };
 
+        $scope.showUnstableClick = function() {
+            $scope.upgradeReadyForNext = false;
+            $scope.selectedOption = [];
+            $scope.versions = [];
+            angular.forEach($scope.data.packages, function (value, key) {
+                if (value.stable || $scope.showUnstable) {
+                    $scope.versions.push({
+                        'versionInfo': angular.toJson({
+                            'package': value.package,
+                            'version': value.id
+                        }),
+                        'version': value
+                    });
+                }
+            });
+            $scope.selectedOption = $scope.versions[0].versionInfo;
+            $scope.upgradeReadyForNext = true;
+        }
+
         $scope.update = function() {
             var selectedVersionInfo = angular.fromJson($scope.selectedOption);
             $scope.packages[0]['name'] = selectedVersionInfo.package;
-            $scope.packages[0].version = selectedVersionInfo.version.id;
+            $scope.packages[0].version = selectedVersionInfo.version;
             if (angular.equals($scope.updateComponents.no, true)) {
                 if ($scope.totalForGrid > 0) {
                     $scope.packages.splice(1, $scope.totalForGrid);
diff --git a/setup/src/Magento/Setup/Model/SystemPackage.php b/setup/src/Magento/Setup/Model/SystemPackage.php
index 6ac9b9d3a60..5b920d298d7 100755
--- a/setup/src/Magento/Setup/Model/SystemPackage.php
+++ b/setup/src/Magento/Setup/Model/SystemPackage.php
@@ -87,6 +87,8 @@ class SystemPackage
         if (!in_array('magento/product-enterprise-edition', $systemPackages)) {
             $result = array_merge($this->getAllowedEnterpriseVersions($currentCE), $result);
         }
+        
+        $result = $this->formatPackages($result);
 
         return $result;
     }
@@ -194,6 +196,42 @@ class SystemPackage
         return $enterpriseVersions;
     }
 
+    /**
+     * @param array $packages
+     * @return array
+     */
+    private function formatPackages($packages) {
+
+        $versions = [];
+
+        foreach ($packages as $package) {
+            foreach ($package['versions'] as $version) {
+                $version['package'] = $package['package'];
+
+                if (preg_match('/^[0-9].[0-9].[0-9]$/', $version['id']) || strpos($version['name'], 'current')) {
+                    $version['stable'] = true;
+                } else {
+                    $version['name'] = $version['name'] . ' (unstable version)';
+                    $version['stable'] = false;
+                }
+
+                $versions[] = $version;
+            }
+        }
+
+        usort($versions, function ($versionOne, $versionTwo) {
+            if (version_compare($versionOne['id'], $versionTwo['id'], '==')) {
+                if ($versionOne['package'] === 'magento/product-community-edition') {
+                    return 1;
+                }
+                return 0;
+            }
+            return (version_compare($versionOne['id'], $versionTwo['id'], '<')) ? 1 : -1;
+        });
+
+        return $versions;
+    }
+
     /**
      * @param string $currentCE
      * @param array $enterpriseVersions
diff --git a/setup/view/magento/setup/select-version.phtml b/setup/view/magento/setup/select-version.phtml
index 17ed7061b1d..4f71e0885db 100644
--- a/setup/view/magento/setup/select-version.phtml
+++ b/setup/view/magento/setup/select-version.phtml
@@ -56,6 +56,21 @@
             </select>
         </div>
     </div>
+    <div class="row" ng-show="upgradeProcessed && !upgradeProcessError">
+        <div class="col-m-3">
+            <label class="form-label" for="showUnstable">
+                Show Unstable
+            </label>
+        </div>
+        <div class="col-m-4">
+            <input
+                id="showUnstable"
+                type="checkbox"
+                ng-model="showUnstable"
+                ng-change="showUnstableClick()"
+            >
+        </div>
+    </div>
 </div>
 
 <div class="row form-row" ng-show="!upgradeProcessError">
-- 
GitLab