1

I have list of countries with state and country. This code is working with a cascading dropdown. How can I make a dropdown based on user input

Expectation: When I click Country Dropdown one text box with list should come if user enter input based country list should come (like search).

I have added my code below

angular.module('test', [])
    .controller('TestController', ['$scope', '$filter',

function ($scope, $filter) {
    $scope.country = "India";
    $scope.state = "Rajasthan";
    $scope.city = "Ajmer";

    $scope.countries = [{
        "name": "India",
            "states": [{
            "name": "Maharashtra",
                "cities": [{
                "name": "Pune"
            }, {
                "name": "Mumbai"
            }, {
                "name": "Nagpur"
            }, {
                "name": "Akola"
            }]
        }, {
            "name": "Madhya Pradesh",
                "cities": [{
                "name": "Indore"
            }, {
                "name": "Bhopal"
            }, {
                "name": "Jabalpur"
            }]
        }, {
            "name": "Rajasthan",
                "cities": [{
                "name": "Jaipur"
            }, {
                "name": "Ajmer"
            }, {
                "name": "Jodhpur"
            }]
        }]
    }, {
        "name": "USA",
            "states": [{
            "name": "Alabama",
                "cities": [{
                "name": "Montgomery"
            }, {
                "name": "Birmingham"
            }]
        }, {
            "name": "California",
                "cities": [{
                "name": "Sacramento"
            }, {
                "name": "Fremont"
            }]
        }, {
            "name": "Illinois",
                "cities": [{
                "name": "Springfield"
            }, {
                "name": "Chicago"
            }]
        }]
    }, {
        "name": "Australia",
            "states": [{
            "name": "NewSouthWales",
                "cities": [{
                "name": "Sydney"
            }]
        }, {
            "name": "Victoria",
                "cities": [{
                "name": "Melbourne"
            }]
        }]
    }];

    $scope.getStates = function () {
        $scope.states = null;
        $scope.cities = null;
        console.log($scope.country);
        if ($scope.country != null) {
            var filteredCountry = $filter("filter")($scope.countries, $scope.country);
            if (filteredCountry != null && filteredCountry.length == 1) {
                $scope.states = filteredCountry[0].states;
            }
        }
    };

    $scope.getCity = function () {
        $scope.cities = null;
        if ($scope.state != null) {
            var filteredState = $filter("filter")($scope.states, $scope.state);
            if (filteredState != null && filteredState.length == 1) {
                $scope.cities = filteredState[0].cities;
            }
        }
    };

    if ($scope.country != null) {
        var filteredCountry = $filter("filter")($scope.countries, $scope.country);
        if (filteredCountry != null && filteredCountry.length == 1) {
            $scope.states = filteredCountry[0].states;

            var filteredState = $filter("filter")($scope.states, $scope.state);
            if (filteredState != null && filteredState.length == 1) {
                $scope.cities = filteredState[0].cities;
            }
        }
    }

    $scope.alertCity = function () {
        alert('You selected ' + $scope.city);
    };
    //console.log($scope.countries);
}]);

html

<div ng-app="test">
    <div ng-controller="TestController">
        <div>Country:
            <select ng-model="country" ng-options="country.name as country.name for country in countries" ng-change="getStates()">
                <option value=''>Select</option>
            </select>
        </div>
        <div>States:
            <select id="state" ng-disabled="!country" ng-model="state" ng-options="state.name as state.name for state in states" ng-change="getCity()">
                <option value=''>Select</option>
            </select>
        </div>
        <div>City:
            <select id="city" ng-disabled="!country || !state" ng-model="city" ng-options="city.name as city.name for city in cities" ng-change="alertCity()">
                <option value=''>Select</option>
            </select>
        </div>
    </div>
</div>

mydemo I want to introduce a filter for every dropdown.

Community
  • 1
  • 1

1 Answers1

0

You can actually do the same using Select2. Since you are already populating the data using AngularJS, that's done. So check this snippet out:

angular.module('test', [])
    .controller('TestController', ['$scope', '$filter',

function ($scope, $filter) {
    $scope.country = "India";
    $scope.state = "Rajasthan";
    $scope.city = "Ajmer";

    $scope.countries = [{
        "name": "India",
            "states": [{
            "name": "Maharashtra",
                "cities": [{
                "name": "Pune"
            }, {
                "name": "Mumbai"
            }, {
                "name": "Nagpur"
            }, {
                "name": "Akola"
            }]
        }, {
            "name": "Madhya Pradesh",
                "cities": [{
                "name": "Indore"
            }, {
                "name": "Bhopal"
            }, {
                "name": "Jabalpur"
            }]
        }, {
            "name": "Rajasthan",
                "cities": [{
                "name": "Jaipur"
            }, {
                "name": "Ajmer"
            }, {
                "name": "Jodhpur"
            }]
        }]
    }, {
        "name": "USA",
            "states": [{
            "name": "Alabama",
                "cities": [{
                "name": "Montgomery"
            }, {
                "name": "Birmingham"
            }]
        }, {
            "name": "California",
                "cities": [{
                "name": "Sacramento"
            }, {
                "name": "Fremont"
            }]
        }, {
            "name": "Illinois",
                "cities": [{
                "name": "Springfield"
            }, {
                "name": "Chicago"
            }]
        }]
    }, {
        "name": "Australia",
            "states": [{
            "name": "NewSouthWales",
                "cities": [{
                "name": "Sydney"
            }]
        }, {
            "name": "Victoria",
                "cities": [{
                "name": "Melbourne"
            }]
        }]
    }];

    $scope.getStates = function () {
        $scope.states = null;
        $scope.cities = null;
        console.log($scope.country);
        if ($scope.country != null) {
            var filteredCountry = $filter("filter")($scope.countries, $scope.country);
            if (filteredCountry != null && filteredCountry.length == 1) {
                $scope.states = filteredCountry[0].states;
            }
        }
    };

    $scope.getCity = function () {
        $scope.cities = null;
        if ($scope.state != null) {
            var filteredState = $filter("filter")($scope.states, $scope.state);
            if (filteredState != null && filteredState.length == 1) {
                $scope.cities = filteredState[0].cities;
            }
        }
    };

    if ($scope.country != null) {
        var filteredCountry = $filter("filter")($scope.countries, $scope.country);
        if (filteredCountry != null && filteredCountry.length == 1) {
            $scope.states = filteredCountry[0].states;

            var filteredState = $filter("filter")($scope.states, $scope.state);
            if (filteredState != null && filteredState.length == 1) {
                $scope.cities = filteredState[0].cities;
            }
        }
    }

    $scope.alertCity = function () {
        alert('You selected ' + $scope.city);
    };
    //console.log($scope.countries);
}]);
$(function () {
  setTimeout(function () {
    $("select").select2();
  }, 100);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/js/select2.full.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/css/select2.min.css" />
<div ng-app="test">
  <div ng-controller="TestController">
    <div>Country:
      <select ng-model="country" ng-options="country.name as country.name for country in countries" ng-change="getStates()">
        <option value=''>Select</option>
      </select>
    </div>
    <div>States:
      <select id="state" ng-disabled="!country" ng-model="state" ng-options="state.name as state.name for state in states" ng-change="getCity()">
        <option value=''>Select</option>
      </select>
    </div>
    <div>City:
      <select id="city" ng-disabled="!country || !state" ng-model="city" ng-options="city.name as city.name for city in cities" ng-change="alertCity()">
        <option value=''>Select</option>
      </select>
    </div>
  </div>
</div>
Praveen Kumar Purushothaman
  • 164,888
  • 24
  • 203
  • 252