district_cn_selector 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ });