district_cn_selector 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/.gitignore +27 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +14 -0
  4. data/Gemfile +37 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +138 -0
  7. data/Rakefile +21 -0
  8. data/config/routes.rb +7 -0
  9. data/district_cn_selector.gemspec +27 -0
  10. data/lib/district_cn_selector.rb +22 -0
  11. data/lib/district_cn_selector/district_controller.rb +26 -0
  12. data/lib/district_cn_selector/district_select_helper.rb +46 -0
  13. data/lib/district_cn_selector/district_select_ul_helper.rb +48 -0
  14. data/lib/district_cn_selector/engine.rb +22 -0
  15. data/lib/district_cn_selector/helpers/form_builder.rb +13 -0
  16. data/lib/district_cn_selector/helpers/form_builder_extension.rb +49 -0
  17. data/lib/district_cn_selector/hooks/simple_form.rb +72 -0
  18. data/lib/district_cn_selector/selector.rb +202 -0
  19. data/lib/district_cn_selector/theme.rb +19 -0
  20. data/lib/district_cn_selector/version.rb +3 -0
  21. data/spec/controllers/district_cn_selector/district_controller_spec.rb +13 -0
  22. data/spec/dummy/README.rdoc +261 -0
  23. data/spec/dummy/Rakefile +7 -0
  24. data/spec/dummy/app/assets/javascripts/application.js +5 -0
  25. data/spec/dummy/app/assets/stylesheets/application.css.scss +31 -0
  26. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  27. data/spec/dummy/app/controllers/home_controller.rb +7 -0
  28. data/spec/dummy/app/controllers/tests_controller.rb +10 -0
  29. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  30. data/spec/dummy/app/mailers/.gitkeep +0 -0
  31. data/spec/dummy/app/models/company.rb +8 -0
  32. data/spec/dummy/app/views/home/index.html.erb +31 -0
  33. data/spec/dummy/app/views/home/select2_backup.html.erb +49 -0
  34. data/spec/dummy/app/views/layouts/application.html.erb +15 -0
  35. data/spec/dummy/app/views/tests/1.html.erb +8 -0
  36. data/spec/dummy/app/views/tests/2.html.erb +9 -0
  37. data/spec/dummy/app/views/tests/3.html.erb +7 -0
  38. data/spec/dummy/app/views/tests/4.html.erb +7 -0
  39. data/spec/dummy/app/views/tests/5.html.erb +7 -0
  40. data/spec/dummy/app/views/tests/6.html.erb +7 -0
  41. data/spec/dummy/config.ru +4 -0
  42. data/spec/dummy/config/application.rb +75 -0
  43. data/spec/dummy/config/boot.rb +10 -0
  44. data/spec/dummy/config/database.yml +16 -0
  45. data/spec/dummy/config/environment.rb +5 -0
  46. data/spec/dummy/config/environments/development.rb +37 -0
  47. data/spec/dummy/config/environments/production.rb +67 -0
  48. data/spec/dummy/config/environments/test.rb +37 -0
  49. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  50. data/spec/dummy/config/initializers/inflections.rb +15 -0
  51. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  52. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  53. data/spec/dummy/config/initializers/session_store.rb +8 -0
  54. data/spec/dummy/config/initializers/simple_form.rb +142 -0
  55. data/spec/dummy/config/initializers/simple_form_bootstrap.rb +45 -0
  56. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  57. data/spec/dummy/config/locales/active_record.zh-CN.yml +11 -0
  58. data/spec/dummy/config/locales/en.yml +5 -0
  59. data/spec/dummy/config/locales/simple_form.en.yml +26 -0
  60. data/spec/dummy/config/routes.rb +5 -0
  61. data/spec/dummy/db/migrate/20130717055253_create_companies.rb +10 -0
  62. data/spec/dummy/db/schema.rb +24 -0
  63. data/spec/dummy/lib/assets/.gitkeep +0 -0
  64. data/spec/dummy/log/.gitkeep +0 -0
  65. data/spec/dummy/public/404.html +26 -0
  66. data/spec/dummy/public/422.html +26 -0
  67. data/spec/dummy/public/500.html +25 -0
  68. data/spec/dummy/public/area_select_cn/area-bg1.jpg +0 -0
  69. data/spec/dummy/public/area_select_cn/area-bg2.jpg +0 -0
  70. data/spec/dummy/public/favicon.ico +0 -0
  71. data/spec/dummy/script/rails +6 -0
  72. data/spec/factories/.gitkeep +0 -0
  73. data/spec/features/visit_testpage_spec.rb +93 -0
  74. data/spec/helpers/form_spec.rb +106 -0
  75. data/spec/helpers/simple_form_spec.rb +101 -0
  76. data/spec/spec_helper.rb +48 -0
  77. data/spec/support/mock_controller.rb +22 -0
  78. data/spec/support/view_test_helper.rb +29 -0
  79. data/vendor/assets/images/district_cn_selector/area-bg1.jpg +0 -0
  80. data/vendor/assets/images/district_cn_selector/area-bg2.jpg +0 -0
  81. data/vendor/assets/images/district_cn_selector/bootstrap-theme.png +0 -0
  82. data/vendor/assets/images/district_cn_selector/default-theme.png +0 -0
  83. data/vendor/assets/javascripts/district_cn_selector/jquery.district-ul.js +224 -0
  84. data/vendor/assets/javascripts/district_cn_selector/jquery.district.js +119 -0
  85. data/vendor/assets/stylesheets/district_cn_selector/district-ul.css +93 -0
  86. metadata +269 -0
File without changes
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
File without changes
@@ -0,0 +1,93 @@
1
+ #encoding: utf-8
2
+ #require 'spec_helper'
3
+ #
4
+ #TEST_CODE = "341002"
5
+ #TOTAL_PAGE_CASE = 6
6
+ #
7
+ #feature 'visit the testpage' do
8
+ # scenario 'page should init district-ul select' do
9
+ # test_all_cases do
10
+ # assert_select_exist
11
+ # assert_district_ul(AreaSelectCn::District.id(TEST_CODE))
12
+ # end
13
+ # end
14
+ #
15
+ # scenario 'page should init other district-ul select' do
16
+ # test_all_cases do
17
+ # assert_district_ul(AreaSelectCn::District.id(TEST_CODE))
18
+ # end
19
+ # end
20
+ #
21
+ # scenario 'select area', :driver => :webkit do
22
+ # test_all_cases do
23
+ # {:province => ["安徽省", "340000"],
24
+ # :city => ["合肥市", "340100"],
25
+ # :districts => ["瑶海区", "340102"]
26
+ # }.each do |scope, area|
27
+ # page.execute_script(%Q{jQuery("li[data-value='#{area[1]}']").click();})
28
+ # assert_district_ul(AreaSelectCn::District.id(area[1]))
29
+ # end
30
+ # end
31
+ #
32
+ # #page.execute_script(%Q{jQuery("li[data-value='310000']").click();})
33
+ # #assert_district_ul(AreaSelectCn::District.id('310000'))
34
+ # end
35
+ #
36
+ # def province_blank
37
+ # ["省 份", ""]
38
+ # end
39
+ #
40
+ # def city_blank
41
+ # ["城 市", ""]
42
+ # end
43
+ #
44
+ # def district_blank
45
+ # ["区 县", ""]
46
+ # end
47
+ #
48
+ # def assert_select_exist
49
+ # page.source.should have_selector('.select-input')
50
+ # page.source.should have_selector('ul.select-opts')
51
+ # # page.should have_css('div.area_select_ul')
52
+ # #page.assert_selector('dd.select-input')
53
+ # #page.assert_selector('ul.select-opts')
54
+ # end
55
+ #
56
+ # def assert_district_ul(area_id)
57
+ # assert_page_select_content(area_id)
58
+ # assert_page_select_opts(area_id)
59
+ # end
60
+ #
61
+ # def assert_page_select_opts(area_id)
62
+ # [:province, :city, :district].each do |scope|
63
+ # selected = area_id.public_send("selected_#{scope.to_s.pluralize}")
64
+ # selected.unshift(public_send("#{scope}_blank")).sort!
65
+ # page_select_opts(scope).should eql(selected)
66
+ # end
67
+ # end
68
+ #
69
+ # def assert_page_select_content(area_id)
70
+ # [:province, :city, :district].each do |scope|
71
+ # if area_id.public_send(scope)
72
+ # find(".#{scope} .select-content").text.should eq(area_id.public_send("#{scope}_name"))
73
+ # find(".#{scope} .select-content")['data-value'].should eq(area_id.public_send("#{scope}_id"))
74
+ # else
75
+ # find(".#{scope} .select-content").text.should eq(public_send("#{scope}_blank")[0])
76
+ # find(".#{scope} .select-content")['data-value'].should be_blank
77
+ # end
78
+ # end
79
+ # end
80
+ #
81
+ # def page_select_opts(scope)
82
+ # Capybara.string(page.body).all(".#{scope} > .select-opts > li").map do |li|
83
+ # [li.text, li['data-value']]
84
+ # end.sort
85
+ # end
86
+ #
87
+ # def test_all_cases(&block)
88
+ # (1..TOTAL_PAGE_CASE).each do |i|
89
+ # visit "/tests/#{i}"
90
+ # block.call
91
+ # end
92
+ # end
93
+ #end
@@ -0,0 +1,106 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ describe "Form" do
4
+ #include ViewTestHelper
5
+ let(:company) { Company.new(:loc_code=>331002)}
6
+ let(:unvalid_company) { Company.new }
7
+
8
+ before {
9
+ @builder = DistrictCnSelector::Helpers::FormBuilder
10
+ }
11
+
12
+ context "select_ul" do
13
+ it 'renders province select-ul' do
14
+ concat(form_for(company,:url=>"",:builder=>@builder) do |f|
15
+ f.province_select_ul :loc_code
16
+ end)
17
+ assert_select 'div.district_cn_selector'
18
+ assert_select 'div.province'
19
+
20
+ assert_select 'input.select-value'
21
+ end
22
+
23
+ it 'renders city select-ul' do
24
+ concat(form_for(company,:url=>"",:builder=>@builder) do |f|
25
+ f.city_select_ul :loc_code
26
+ end)
27
+ assert_select 'div.district_cn_selector'
28
+ assert_select 'div.province'
29
+ assert_select 'div.city'
30
+
31
+ assert_select 'input.select-value'
32
+ end
33
+
34
+ it 'renders district select-ul' do
35
+ concat(form_for(company,:url=>"",:builder=>@builder) do |f|
36
+ f.district_select_ul :loc_code
37
+ end)
38
+
39
+ assert_select 'div.district_cn_selector'
40
+ assert_select 'div.province'
41
+ assert_select 'div.city'
42
+ assert_select 'div.district'
43
+
44
+ assert_select 'input.select-value'
45
+ end
46
+ it 'validates :loc_code, presence: true' do
47
+ expect(unvalid_company.valid?).to be_false
48
+
49
+ concat(form_for(unvalid_company,:url=>"",:builder=>@builder) do |f|
50
+ f.district_select_ul :loc_code
51
+ end)
52
+
53
+ assert_select '.field_with_errors',2
54
+ end
55
+ end
56
+
57
+ context "select" do
58
+ it 'renders province select' do
59
+ concat(form_for(company,:url=>"",:builder=>@builder) do |f|
60
+ f.province_select :loc_code
61
+ end)
62
+
63
+ assert_select 'div.district_cn_selector'
64
+ assert_select 'select.province'
65
+
66
+ assert_select 'input.select-value'
67
+ end
68
+
69
+ it 'renders city select' do
70
+ concat(form_for(company,:url=>"",:builder=>@builder) do |f|
71
+ f.city_select :loc_code
72
+ end)
73
+
74
+ assert_select 'div.district_cn_selector'
75
+ assert_select 'select.province'
76
+ assert_select 'select.city'
77
+
78
+ assert_select 'input.select-value'
79
+ end
80
+
81
+ it 'renders district select' do
82
+ concat(form_for(company,:url=>"",:builder=>@builder) do |f|
83
+ f.district_select :loc_code
84
+ end)
85
+ assert_select 'div.district_cn_selector'
86
+ assert_select 'select.province'
87
+ assert_select 'select.city'
88
+ assert_select 'select.district'
89
+
90
+ assert_select 'input.select-value'
91
+ end
92
+
93
+ it 'validates :loc_code, presence: true' do
94
+ expect(unvalid_company.valid?).to be_false
95
+
96
+ concat(form_for(unvalid_company,:url=>"",:builder=>@builder) do |f|
97
+ f.district_select :loc_code
98
+ end)
99
+
100
+ assert_select '.field_with_errors',2
101
+ end
102
+
103
+ end
104
+
105
+ end
106
+
@@ -0,0 +1,101 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe "SimpleForm" do
5
+ #include ViewTestHelper
6
+ include SimpleForm::ActionViewExtensions::FormHelper
7
+ let(:company) { Company.new(:loc_code=>331002)}
8
+ let(:unvalid_company) { Company.new }
9
+
10
+ context "select_ul" do
11
+ it 'renders province select-ul' do
12
+ concat(simple_form_for(company,:url=>"") do |f|
13
+ f.input :loc_code, :as => :province_select_ul
14
+ end)
15
+ assert_select 'div.province_select_ul'
16
+ assert_select 'div.province'
17
+
18
+ assert_select 'input.select-value'
19
+ end
20
+
21
+ it 'renders city select-ul' do
22
+ concat(simple_form_for(company,:url=>"") do |f|
23
+ f.input :loc_code, :as => :city_select_ul
24
+ end)
25
+ assert_select 'div.city_select_ul'
26
+ assert_select 'div.province'
27
+ assert_select 'div.city'
28
+
29
+ assert_select 'input.select-value'
30
+ end
31
+
32
+ it 'renders district select-ul' do
33
+ concat(simple_form_for(company,:url=>"") do |f|
34
+ f.input :loc_code, :as => :district_select_ul
35
+ end)
36
+ assert_select 'div.district_select_ul'
37
+ assert_select 'div.province'
38
+ assert_select 'div.city'
39
+ assert_select 'div.district'
40
+
41
+ assert_select 'input.select-value'
42
+ end
43
+ it 'validates :loc_code, presence: true' do
44
+ expect(unvalid_company.valid?).to be_false
45
+
46
+ concat(simple_form_for(unvalid_company,:url=>"") do |f|
47
+ f.input :loc_code, :as => :district_select_ul
48
+ end)
49
+
50
+ assert_select 'div.district_select_ul'
51
+ assert_select '.error'
52
+ end
53
+ end
54
+
55
+ context "select" do
56
+ it 'renders province select' do
57
+ concat(simple_form_for(company,:url=>"") do |f|
58
+ f.input :loc_code, :as => :province_select
59
+ end)
60
+ assert_select 'div.province_select'
61
+ assert_select 'select.province'
62
+
63
+ assert_select 'input.select-value'
64
+ end
65
+
66
+ it 'renders city select' do
67
+ concat(simple_form_for(company,:url=>"") do |f|
68
+ f.input :loc_code, :as => :city_select
69
+ end)
70
+ assert_select 'div.city_select'
71
+ assert_select 'select.province'
72
+ assert_select 'select.city'
73
+
74
+ assert_select 'input.select-value'
75
+ end
76
+
77
+ it 'renders district select' do
78
+ concat(simple_form_for(company,:url=>"") do |f|
79
+ f.input :loc_code, :as => :district_select
80
+ end)
81
+ assert_select 'div.district_select'
82
+ assert_select 'select.province'
83
+ assert_select 'select.city'
84
+ assert_select 'select.district'
85
+
86
+ assert_select 'input.select-value'
87
+ end
88
+
89
+ it 'validates :loc_code, presence: true' do
90
+ expect(unvalid_company.valid?).to be_false
91
+
92
+ concat(simple_form_for(unvalid_company,:url=>"") do |f|
93
+ f.input :loc_code, :as => :district_select
94
+ end)
95
+
96
+ assert_select '.error'
97
+ end
98
+
99
+ end
100
+
101
+ end
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ ENV['RAILS_ENV'] ||= 'test'
3
+
4
+ require "rails"
5
+ require "active_record"
6
+ require "district_cn"
7
+ silence_warnings do
8
+ ActiveRecord::Migration.verbose = false
9
+ ActiveRecord::Base.logger = Logger.new(nil)
10
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
11
+ end
12
+
13
+ ActiveRecord::Base.connection.instance_eval do
14
+ create_table :companies do |t|
15
+ t.string :name
16
+ t.string :loc_code
17
+ t.string :another_code
18
+ t.timestamps
19
+ end
20
+ end
21
+
22
+ class Company < ActiveRecord::Base
23
+ attr_accessor :region_code
24
+
25
+ act_as_area_field :region_code,:loc_code
26
+ validates :region_code, presence: true
27
+ validates :loc_code, presence: true
28
+ end
29
+
30
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
31
+ require 'rspec/rails'
32
+ require 'rspec/autorun'
33
+ require 'capybara/rails'
34
+ require 'factory_girl_rails'
35
+
36
+
37
+ Rails.backtrace_cleaner.remove_silencers!
38
+ Capybara.javascript_driver = :webkit
39
+
40
+ # Load support files
41
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
42
+
43
+ RSpec.configure do |config|
44
+ config.mock_with :rspec
45
+ config.use_transactional_fixtures = true
46
+ config.infer_base_class_for_anonymous_controllers = false
47
+ config.order = "random"
48
+ end
@@ -0,0 +1,22 @@
1
+ class MockController
2
+ attr_writer :action_name
3
+
4
+ def _routes
5
+ self
6
+ end
7
+
8
+ def action_name
9
+ defined?(@action_name) ? @action_name : "edit"
10
+ end
11
+
12
+ def url_for(*args)
13
+ "http://example.com"
14
+ end
15
+
16
+ def url_helpers
17
+ self
18
+ end
19
+
20
+ def hash_for_users_path(*args)
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ require 'active_support/concern'
2
+ require 'active_support/testing/setup_and_teardown'
3
+
4
+ module ViewTestHelper
5
+ extend ActiveSupport::Concern
6
+
7
+ include ActiveSupport::Testing::SetupAndTeardown
8
+ include ActionView::TestCase::Behavior
9
+
10
+ included do
11
+ setup :set_controller
12
+ end
13
+
14
+ def set_controller
15
+ @controller = MockController.new
16
+ end
17
+
18
+ def method_missing(method, *args)
19
+ super unless method.to_s =~ /_path$/
20
+ end
21
+
22
+ def respond_to?(method, include_private=false)
23
+ method.to_s =~ /_path$/ || super
24
+ end
25
+
26
+ def protect_against_forgery?
27
+ false
28
+ end
29
+ end
@@ -0,0 +1,224 @@
1
+ /*
2
+ * jQuery DistrictUl Plugin
3
+ */
4
+ (function ($) {
5
+ var jQuery = $;
6
+
7
+ var DistrictUl = function (selector, options) {
8
+ options = options || {};
9
+ jQuery.extend(this.options, options);
10
+
11
+ if (!this.options.perAjax) {
12
+ this.loadDistrictData(); // 预先加载好区域数据
13
+ }
14
+
15
+ this.districtContainer = $(selector);
16
+ this.selects = this.districtContainer.find(this.options.selectContainer);
17
+ this.selectPrompts = this.selects.find(this.options.selectPromptContainer);
18
+ this.selectOpts = this.selects.find(this.options.selectOptsContainer);
19
+
20
+ this.resetSelectedValues();
21
+
22
+ this.attachEvents();
23
+
24
+ this.attachBody();
25
+ };
26
+
27
+ // for `new jQuery.DistrictUl()` or `jQuery.DistrictUl()`
28
+ jQuery.DistrictUl = function (selector, options) {
29
+ return new DistrictUl(selector, options);
30
+ };
31
+
32
+ jQuery.extend(DistrictUl.prototype, {
33
+ loadDistrictData: function () {
34
+ var self = this;
35
+ if (!this.district) {
36
+ if (!DistrictUl.data) {
37
+ $.get(this.options.url, function (data) {
38
+ DistrictUl.data = data;
39
+ self.district = DistrictUl.data;
40
+ }, self.options.dataType);
41
+ } else {
42
+ self.district = DistrictUl.data;
43
+ }
44
+ }
45
+ },
46
+ attachEvents: function () {
47
+ var self = this;
48
+ this.selectPrompts.on('click', function () {
49
+ var $this = $(this);
50
+ var index = jQuery.inArray(this, self.selectPrompts);
51
+ var $selectOpt = $(self.selectOpts[index])
52
+ var indexes = [0, 1, 2]
53
+ $.each(indexes, function (key, value) {
54
+ if (key != index) {
55
+ $(self.selectOpts[key]).hide();
56
+ }
57
+ })
58
+ $selectOpt.toggle();
59
+ });
60
+ this.selectOpts.on('click', 'li', function () {
61
+ var $this = $(this);
62
+ if (!$this.hasClass(self.options.selectedClass)) {
63
+ self.activeOpt($this);
64
+ var $selectOpt = $this.parent();
65
+ var index = jQuery.inArray($selectOpt[0], self.selectOpts);
66
+ self.changePrompt(index, $this);
67
+ var val = $this.attr(self.options.dataName);
68
+ if (val === '') {
69
+ self.clearNextSelects(index);
70
+ self.afterChange($this);
71
+ } else {
72
+ self.requestDistricts(val, function (data) {
73
+ self.changeNextSelect(index, data);
74
+ self.clearNext2Select(index);
75
+ self.afterChange($this);
76
+ });
77
+ }
78
+ }
79
+ $this.parent().toggle();
80
+ });
81
+ },
82
+ attachBody: function () {
83
+ var self = this;
84
+ $('body').on('click', function (e) {
85
+ var target = e.target;
86
+ if (!jQuery.contains(self.districtContainer[0], target))
87
+ self.selectOpts.hide();
88
+ });
89
+ },
90
+ afterChange: function ($opt) {
91
+ var self = this;
92
+ this.resetSelectedValues();
93
+ if (jQuery.type(this.options.onChange) === 'function')
94
+ this.options.onChange.call($opt, self.districtContainer, this.curDistrict);
95
+ },
96
+ resetSelectedValues: function () {
97
+ var self = this;
98
+ var selectedDatas = this.selectPrompts.map(function (i, p) {
99
+ return $(p).find(":first-child").attr(self.options.dataName);
100
+ });
101
+ this.selectedProvince = selectedDatas[0];
102
+ this.selectedCity = selectedDatas[1];
103
+ this.selectedCounty = selectedDatas[2];
104
+ this.curDistrict = this.selectedCounty || this.selectedCity || this.selectedProvince;
105
+ },
106
+
107
+ requestDistricts: function (code, callback) {
108
+ if (this.dataCache[code])
109
+ return callback.call(this, this.dataCache[code]);
110
+
111
+ var self = this;
112
+ if (this.options.perAjax) {
113
+ $.get(this.options.url + code, function (data) {
114
+ self.dataCache[code] = $.type(data) === 'string' ? $.parseJSON(data) : data;
115
+ callback.call(self, self.dataCache[code]);
116
+ }, this.options.dataType);
117
+ } else {
118
+ // 如果区域json数据没有, 请求区域json数据
119
+ if (!this.district) {
120
+ $.get(this.options.url, function (data) {
121
+ self.district = data;
122
+ self.dataCache[code] = self.listDistrict(code);
123
+ callback.call(self, self.dataCache[code]);
124
+ }, self.options.dataType);
125
+ } else {
126
+ self.dataCache[code] = self.listDistrict(code);
127
+ callback.call(self, self.dataCache[code]);
128
+ }
129
+ }
130
+ },
131
+ listDistrict: function (code) {
132
+ var result = [];
133
+ if (code.length == 0) return result;
134
+
135
+ var id_match = code.match(/(\d{2})(\d{2})(\d{2})/);
136
+ var province_id = id_match[1].concat("0000");
137
+ var city_id = (id_match[1] + id_match[2]).concat("00");
138
+
139
+ var children;
140
+ if (this.district[province_id]) {
141
+ children = this.district[province_id]['children'];
142
+ }
143
+ if (children[city_id]) {
144
+ children = children[city_id]['children'];
145
+ }
146
+
147
+ for (var id in children) {
148
+ result.push([children[id]['text'], id]);
149
+ }
150
+
151
+ return result.sort(function (d1, d2) {
152
+ return d1[1] - d2[1];
153
+ });
154
+ },
155
+ addSelectOptions: function ($select, data) {
156
+ var self = this;
157
+ var optionEles = [];
158
+ $.each(data, function (i, district) {
159
+ $link = $("<a href=\"javascript:void(0);\">" + district[0] + "</a>");
160
+ $li = $(document.createElement("li"))
161
+ .attr(self.options.dataName, district[1])
162
+ .append($link)
163
+
164
+ optionEles.push($li)
165
+ });
166
+ $.each(optionEles, function (i, ele) {
167
+ $select.append(ele);
168
+ });
169
+ },
170
+ changeNextSelect: function (index, data) {
171
+ var $nextSelect = $(this.selectOpts[index + 1]);
172
+ this.clearSelects($nextSelect);
173
+ this.addSelectOptions($nextSelect, data);
174
+ },
175
+ clearNext2Select: function (index) {
176
+ this.clearSelects(this.selectOpts.slice(index + 2));
177
+ },
178
+ clearNextSelects: function (index) {
179
+ this.clearSelects(this.selectOpts.slice(index + 1));
180
+ },
181
+ clearSelects: function ($selectOpts) {
182
+ var self = this;
183
+ $selectOpts.each(function (i, selectOpt) {
184
+ var index = jQuery.inArray(selectOpt, self.selectOpts)
185
+ $(selectOpt).children('li').slice(1).remove();
186
+ $(self.selectPrompts[index]).find(":first-child")
187
+ .text(self.options.prompts[index])
188
+ .attr(self.options.dataName, '');
189
+ });
190
+ },
191
+ activeOpt: function ($opt) {
192
+ $opt.toggleClass(this.options.selectedClass);
193
+ $opt.siblings('li.' + this.options.selectedClass).toggleClass(this.options.selectedClass);
194
+ },
195
+ changePrompt: function (index, $opt) {
196
+ $prompt = $(this.selectPrompts[index]);
197
+ $prompt.find(':first-child').text($opt.text())
198
+ .attr(this.options.dataName, $opt.attr(this.options.dataName));
199
+ },
200
+ dataCache: {},
201
+ district: null,
202
+ options: {
203
+ selectContainer: '.select-input',
204
+ selectOptsContainer: '.select-opts',
205
+ selectPromptContainer: '.select-prompt',
206
+ selectedClass: 'active',
207
+ dataName: 'data-value',
208
+ perAjax: false, //是每次选择区域进行请求,还是一次获得所有区域数据
209
+ url: '/district_cn_selector/district',
210
+ dataType: 'json',
211
+ onChange: null,
212
+ prompts: ['省 份', '城 市', '区 县']
213
+ }
214
+ });
215
+ })(jQuery);
216
+
217
+ $(document).ready(function () {
218
+ if (window.AREA_SELECT_CN_DISTRICT_UL_FIELDS !== undefined) {
219
+ for (var i in window.AREA_SELECT_CN_DISTRICT_UL_FIELDS) {
220
+ var f = window.AREA_SELECT_CN_DISTRICT_UL_FIELDS[i];
221
+ jQuery.DistrictUl(f[0], f[1]);
222
+ }
223
+ }
224
+ });