CVNSS commited on
Commit
04588f1
·
verified ·
1 Parent(s): c724619

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +50 -53
index.html CHANGED
@@ -2,9 +2,9 @@
2
  <html lang="vi">
3
  <head>
4
  <meta charset="UTF-8">
5
- <title>Tra cứu Đơn vị Hành chính Sáp nhập 3321</title>
6
  <meta name="viewport" content="width=device-width, initial-scale=1">
7
- <!-- Bootstrap 5 & Choices.js CDN -->
8
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
9
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/choices.js/public/assets/styles/choices.min.css"/>
10
  <style>
@@ -22,26 +22,20 @@
22
  </head>
23
  <body>
24
  <div class="container py-5">
25
- <h2 class="mb-4 text-primary">🔎 Tra cứu Đơn vị Hành chính Sáp nhập 3321</h2>
26
  <div class="card shadow p-4 mb-4">
27
  <form id="searchForm" autocomplete="off">
28
  <div class="row mb-3">
29
- <div class="col-md-4 mb-2">
30
- <label for="province_new" class="form-label">Tỉnh/Thành phố mới</label>
31
- <select class="form-select" id="province_new">
32
- <option value="">-- Chọn/Tìm tỉnh/thành phố --</option>
33
- </select>
34
- </div>
35
- <div class="col-md-4 mb-2">
36
- <label for="district_old" class="form-label">Quận/Huyện cũ</label>
37
- <select class="form-select" id="district_old">
38
- <option value="">-- Chọn/Tìm quận/huyện (cũ) --</option>
39
  </select>
40
  </div>
41
- <div class="col-md-4 mb-2">
42
- <label for="ward_new" class="form-label">Phường/ mới</label>
43
- <select class="form-select" id="ward_new">
44
- <option value="">-- Chọn/Tìm phường/ mới --</option>
45
  </select>
46
  </div>
47
  </div>
@@ -56,67 +50,68 @@
56
  </div>
57
  <script src="https://cdn.jsdelivr.net/npm/choices.js/public/assets/scripts/choices.min.js"></script>
58
  <script>
59
- // ====== Đọc file JSON ======
60
  let allData = [];
61
- const dataUrl = 'data_3321.json'; // Đổi tên nếu file bạn khác!
62
 
63
- const provinceNewSel = document.getElementById("province_new");
64
- const districtOldSel = document.getElementById("district_old");
65
  const wardNewSel = document.getElementById("ward_new");
 
66
  const resultArea = document.getElementById("resultArea");
67
  const searchForm = document.getElementById("searchForm");
68
  const loading = document.getElementById("loading");
69
  const resetBtn = document.getElementById("resetBtn");
70
 
71
  // Choices.js
72
- let provinceChoices = new Choices(provinceNewSel, { searchEnabled: true, itemSelectText: '', shouldSort: false });
73
- let districtChoices = new Choices(districtOldSel, { searchEnabled: true, itemSelectText: '', shouldSort: false });
74
  let wardChoices = new Choices(wardNewSel, { searchEnabled: true, itemSelectText: '', shouldSort: false });
 
75
 
76
  async function loadData() {
77
  loading.style.display = "inline";
78
  let res = await fetch(dataUrl);
79
  allData = await res.json();
80
 
81
- // Lấy danh sách tỉnh mới duy nhất
 
 
 
 
82
  let provinces = [...new Set(allData.map(e => e.province_new))].sort();
83
- provinceChoices.setChoices([{ value: '', label: '-- Chọn/Tìm tỉnh/thành phố --', selected: true, disabled: true }, ...provinces.map(p => ({value: p, label: p}))], 'value', 'label', true);
84
 
85
  loading.style.display = "none";
86
  }
87
 
88
- // Tỉnh mới -> Lọc Quận/Huyện
89
- provinceNewSel.addEventListener("change", function() {
90
- districtChoices.clearStore();
91
- wardChoices.clearStore();
92
- districtChoices.setChoices([{ value: '', label: '-- Chọn/Tìm quận/huyện (cũ) --', selected: true, disabled: true }], 'value', 'label', true);
93
- wardChoices.setChoices([{ value: '', label: '-- Chọn/Tìm phường/xã mới --', selected: true, disabled: true }], 'value', 'label', true);
94
- if (!this.value) return;
95
- let districts = allData.filter(e => e.province_new === this.value).map(e => e.district_old);
96
- districts = [...new Set(districts)].sort();
97
- districtChoices.setChoices([{ value: '', label: '-- Chọn/Tìm quận/huyện (cũ) --', selected: true, disabled: true }, ...districts.map(d => ({value: d, label: d}))], 'value', 'label', true);
98
  });
99
 
100
- // Quận/huyện -> Lọc phường/xã mới
101
- districtOldSel.addEventListener("change", function() {
102
- wardChoices.clearStore();
103
- wardChoices.setChoices([{ value: '', label: '-- Chọn/Tìm phường/xã mới --', selected: true, disabled: true }], 'value', 'label', true);
104
- if (!this.value || !provinceNewSel.value) return;
105
- let wards = allData.filter(e => e.province_new === provinceNewSel.value && e.district_old === this.value).map(e => e.ward_new);
 
106
  wards = [...new Set(wards)].sort();
107
- wardChoices.setChoices([{ value: '', label: '-- Chọn/Tìm phường/xã mới --', selected: true, disabled: true }, ...wards.map(w => ({value: w, label: w}))], 'value', 'label', true);
108
  });
109
 
110
- // Tra cứu
111
  searchForm.addEventListener("submit", function(e) {
112
  e.preventDefault();
113
  resultArea.innerHTML = "";
114
  loading.style.display = "inline";
115
- // Lọc kết quả (có thể chọn 1 hoặc nhiều field)
116
  let rs = allData.filter(e =>
117
- (!provinceNewSel.value || e.province_new === provinceNewSel.value) &&
118
- (!districtOldSel.value || e.district_old === districtOldSel.value) &&
119
- (!wardNewSel.value || e.ward_new === wardNewSel.value)
120
  );
121
  if (rs.length === 0) showError("Không tìm thấy dữ liệu.");
122
  else renderResult(rs);
@@ -124,13 +119,11 @@ searchForm.addEventListener("submit", function(e) {
124
  });
125
 
126
  resetBtn.addEventListener("click", function() {
 
127
  provinceChoices.setChoiceByValue('');
128
- districtChoices.clearStore(); districtChoices.setChoices([{ value: '', label: '-- Chọn/Tìm quận/huyện (cũ) --', selected: true, disabled: true }], 'value', 'label', true);
129
- wardChoices.clearStore(); wardChoices.setChoices([{ value: '', label: '-- Chọn/Tìm phường/xã mới --', selected: true, disabled: true }], 'value', 'label', true);
130
  resultArea.innerHTML = "";
131
  });
132
 
133
- // Kết quả
134
  function renderResult(list) {
135
  resultArea.innerHTML = `
136
  <div class="card shadow p-3 mt-2">
@@ -138,14 +131,18 @@ function renderResult(list) {
138
  <div style="max-height:380px;overflow:auto;">
139
  <table class="table table-bordered table-hover align-middle small">
140
  <thead class="table-light"><tr>
141
- <th>Tỉnh/TP mới</th><th>Quận/Huyện cũ</th><th>Phường/Xã mới</th>
 
 
 
142
  </tr></thead>
143
  <tbody>
144
  ${list.map(d=>`
145
  <tr>
 
146
  <td>${d.province_new||''}</td>
147
  <td>${d.district_old||''}</td>
148
- <td>${d.ward_new||''}</td>
149
  </tr>
150
  `).join('')}
151
  </tbody>
@@ -158,7 +155,7 @@ function showError(msg) {
158
  resultArea.innerHTML = `<div class="alert alert-danger"><b>Lỗi:</b> ${msg}</div>`;
159
  }
160
 
161
- // Tải dữ liệu
162
  loadData();
163
  </script>
164
  </body>
 
2
  <html lang="vi">
3
  <head>
4
  <meta charset="UTF-8">
5
+ <title>Tra cứu Sáp nhập 3321 Tìm ngược Xã/Phường mới → Quận/Huyện, Xã/Phường cũ</title>
6
  <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <!-- Bootstrap & Choices.js -->
8
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
9
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/choices.js/public/assets/styles/choices.min.css"/>
10
  <style>
 
22
  </head>
23
  <body>
24
  <div class="container py-5">
25
+ <h2 class="mb-4 text-primary">🔎 Tra cứu Sáp nhập 3321 (Xã/Phường mới Địa danh cũ)</h2>
26
  <div class="card shadow p-4 mb-4">
27
  <form id="searchForm" autocomplete="off">
28
  <div class="row mb-3">
29
+ <div class="col-md-6 mb-2">
30
+ <label for="ward_new" class="form-label">Chọn Xã/Phường mới</label>
31
+ <select class="form-select" id="ward_new">
32
+ <option value="">-- Chọn/Tìm xã/phường mới --</option>
 
 
 
 
 
 
33
  </select>
34
  </div>
35
+ <div class="col-md-6 mb-2">
36
+ <label for="province_new" class="form-label">Chọn Tỉnh/Thành phố mới</label>
37
+ <select class="form-select" id="province_new">
38
+ <option value="">-- Chọn/Tìm tỉnh/thành phố mới --</option>
39
  </select>
40
  </div>
41
  </div>
 
50
  </div>
51
  <script src="https://cdn.jsdelivr.net/npm/choices.js/public/assets/scripts/choices.min.js"></script>
52
  <script>
53
+ // ==== Đọc file JSON 3321 ====
54
  let allData = [];
55
+ const dataUrl = 'data_3321.json';
56
 
 
 
57
  const wardNewSel = document.getElementById("ward_new");
58
+ const provinceNewSel = document.getElementById("province_new");
59
  const resultArea = document.getElementById("resultArea");
60
  const searchForm = document.getElementById("searchForm");
61
  const loading = document.getElementById("loading");
62
  const resetBtn = document.getElementById("resetBtn");
63
 
64
  // Choices.js
 
 
65
  let wardChoices = new Choices(wardNewSel, { searchEnabled: true, itemSelectText: '', shouldSort: false });
66
+ let provinceChoices = new Choices(provinceNewSel, { searchEnabled: true, itemSelectText: '', shouldSort: false });
67
 
68
  async function loadData() {
69
  loading.style.display = "inline";
70
  let res = await fetch(dataUrl);
71
  allData = await res.json();
72
 
73
+ // Lấy tất cả xã/phường mới duy nhất
74
+ let wards = [...new Set(allData.map(e => e.ward_new))].sort();
75
+ wardChoices.setChoices([{ value: '', label: '-- Chọn/Tìm xã/phường mới --', selected: true, disabled: true }, ...wards.map(w => ({value: w, label: w}))], 'value', 'label', true);
76
+
77
+ // Lấy danh sách tỉnh/thành mới duy nhất
78
  let provinces = [...new Set(allData.map(e => e.province_new))].sort();
79
+ provinceChoices.setChoices([{ value: '', label: '-- Chọn/Tìm tỉnh/thành phố mới --', selected: true, disabled: true }, ...provinces.map(p => ({value: p, label: p}))], 'value', 'label', true);
80
 
81
  loading.style.display = "none";
82
  }
83
 
84
+ // Khi chọn xã/phường mới lọc ra những tỉnh mới có xã đó
85
+ wardNewSel.addEventListener("change", function() {
86
+ if (!this.value) {
87
+ provinceChoices.setChoiceByValue('');
88
+ return;
89
+ }
90
+ let provinces = allData.filter(e => e.ward_new === this.value).map(e => e.province_new);
91
+ provinces = [...new Set(provinces)].sort();
92
+ provinceChoices.setChoices([{ value: '', label: '-- Chọn/Tìm tỉnh/thành phố mới --', selected: true, disabled: true }, ...provinces.map(p => ({value: p, label: p}))], 'value', 'label', true);
 
93
  });
94
 
95
+ // Khi chọn tỉnh mới → lọc lại xã/phường mới thuộc tỉnh đó
96
+ provinceNewSel.addEventListener("change", function() {
97
+ if (!this.value) {
98
+ wardChoices.setChoiceByValue('');
99
+ return;
100
+ }
101
+ let wards = allData.filter(e => e.province_new === this.value).map(e => e.ward_new);
102
  wards = [...new Set(wards)].sort();
103
+ wardChoices.setChoices([{ value: '', label: '-- Chọn/Tìm xã/phường mới --', selected: true, disabled: true }, ...wards.map(w => ({value: w, label: w}))], 'value', 'label', true);
104
  });
105
 
106
+ // Tra cứu kết quả
107
  searchForm.addEventListener("submit", function(e) {
108
  e.preventDefault();
109
  resultArea.innerHTML = "";
110
  loading.style.display = "inline";
111
+ // Lọc theo mới và/hoặc tỉnh mới
112
  let rs = allData.filter(e =>
113
+ (!wardNewSel.value || e.ward_new === wardNewSel.value) &&
114
+ (!provinceNewSel.value || e.province_new === provinceNewSel.value)
 
115
  );
116
  if (rs.length === 0) showError("Không tìm thấy dữ liệu.");
117
  else renderResult(rs);
 
119
  });
120
 
121
  resetBtn.addEventListener("click", function() {
122
+ wardChoices.setChoiceByValue('');
123
  provinceChoices.setChoiceByValue('');
 
 
124
  resultArea.innerHTML = "";
125
  });
126
 
 
127
  function renderResult(list) {
128
  resultArea.innerHTML = `
129
  <div class="card shadow p-3 mt-2">
 
131
  <div style="max-height:380px;overflow:auto;">
132
  <table class="table table-bordered table-hover align-middle small">
133
  <thead class="table-light"><tr>
134
+ <th>Xã/Phường mới</th>
135
+ <th>Tỉnh/TP mới</th>
136
+ <th>Quận/Huyện cũ</th>
137
+ <th>Xã/Phường cũ (nếu có)</th>
138
  </tr></thead>
139
  <tbody>
140
  ${list.map(d=>`
141
  <tr>
142
+ <td>${d.ward_new||''}</td>
143
  <td>${d.province_new||''}</td>
144
  <td>${d.district_old||''}</td>
145
+ <td>${d.ward_old||''}</td>
146
  </tr>
147
  `).join('')}
148
  </tbody>
 
155
  resultArea.innerHTML = `<div class="alert alert-danger"><b>Lỗi:</b> ${msg}</div>`;
156
  }
157
 
158
+ // Khởi động
159
  loadData();
160
  </script>
161
  </body>