CVNSS commited on
Commit
866ac6c
·
verified ·
1 Parent(s): d0f5215

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +147 -18
index.html CHANGED
@@ -1,19 +1,148 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </html>
 
1
+ <!DOCTYPE html>
2
+ <html lang="vi">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>Tra cứu Đơn vị Hành chính - Luat.ai API</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <!-- Bootstrap 5 CDN -->
8
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
9
+ </head>
10
+ <body class="bg-light">
11
+ <div class="container py-5">
12
+ <h2 class="mb-4 text-primary">🔎 Tra cứu Đơn vị Hành chính (Từ sang mới)</h2>
13
+ <div class="card shadow p-4 mb-4">
14
+ <form id="searchForm" autocomplete="off">
15
+ <div class="row mb-3">
16
+ <div class="col-md-4 mb-2">
17
+ <label for="province" class="form-label">Tỉnh/Thành phố cũ</label>
18
+ <select class="form-select" id="province" name="province" required>
19
+ <option value="">-- Chọn tỉnh/thành phố --</option>
20
+ </select>
21
+ </div>
22
+ <div class="col-md-4 mb-2">
23
+ <label for="district" class="form-label">Quận/Huyện cũ</label>
24
+ <select class="form-select" id="district" name="district">
25
+ <option value="">-- Chọn quận/huyện --</option>
26
+ </select>
27
+ </div>
28
+ <div class="col-md-4 mb-2">
29
+ <label for="ward" class="form-label">Phường/Xã cũ</label>
30
+ <select class="form-select" id="ward" name="ward">
31
+ <option value="">-- Chọn phường/xã --</option>
32
+ </select>
33
+ </div>
34
+ </div>
35
+ <button class="btn btn-primary" type="submit" id="searchBtn">
36
+ Tra cứu
37
+ </button>
38
+ <span id="loading" style="display:none;" class="ms-3 text-info">Đang xử lý...</span>
39
+ </form>
40
+ </div>
41
+
42
+ <div id="resultArea"></div>
43
+ </div>
44
+
45
+ <script>
46
+ const apiBase = "https://api.luat.ai/administrative";
47
+ const provinceSel = document.getElementById("province");
48
+ const districtSel = document.getElementById("district");
49
+ const wardSel = document.getElementById("ward");
50
+ const resultArea = document.getElementById("resultArea");
51
+ const searchForm = document.getElementById("searchForm");
52
+ const loading = document.getElementById("loading");
53
+
54
+ // Load province list
55
+ async function loadProvinces() {
56
+ let res = await fetch(apiBase + '/provinces');
57
+ let data = await res.json();
58
+ data.forEach(p => {
59
+ let opt = document.createElement("option");
60
+ opt.value = p;
61
+ opt.innerText = p;
62
+ provinceSel.appendChild(opt);
63
+ });
64
+ }
65
+
66
+ // Load districts when province changes
67
+ provinceSel.addEventListener("change", async function() {
68
+ districtSel.innerHTML = `<option value="">-- Chọn quận/huyện --</option>`;
69
+ wardSel.innerHTML = `<option value="">-- Chọn phường/xã --</option>`;
70
+ if (!this.value) return;
71
+ let res = await fetch(apiBase + '/districts?province=' + encodeURIComponent(this.value));
72
+ let data = await res.json();
73
+ data.forEach(d => {
74
+ let opt = document.createElement("option");
75
+ opt.value = d;
76
+ opt.innerText = d;
77
+ districtSel.appendChild(opt);
78
+ });
79
+ });
80
+
81
+ // Load wards when district changes
82
+ districtSel.addEventListener("change", async function() {
83
+ wardSel.innerHTML = `<option value="">-- Chọn phường/xã --</option>`;
84
+ if (!this.value || !provinceSel.value) return;
85
+ let res = await fetch(apiBase + '/wards?province=' + encodeURIComponent(provinceSel.value) + '&district=' + encodeURIComponent(this.value));
86
+ let data = await res.json();
87
+ data.forEach(w => {
88
+ let opt = document.createElement("option");
89
+ opt.value = w;
90
+ opt.innerText = w;
91
+ wardSel.appendChild(opt);
92
+ });
93
+ });
94
+
95
+ // Handle search
96
+ searchForm.addEventListener("submit", async function(e) {
97
+ e.preventDefault();
98
+ resultArea.innerHTML = "";
99
+ loading.style.display = "inline";
100
+ let params = [];
101
+ if (provinceSel.value) params.push('oldProvince=' + encodeURIComponent(provinceSel.value));
102
+ if (districtSel.value) params.push('oldDistrict=' + encodeURIComponent(districtSel.value));
103
+ if (wardSel.value) params.push('oldWard=' + encodeURIComponent(wardSel.value));
104
+ let url = apiBase + '/search?' + params.join('&');
105
+ try {
106
+ let res = await fetch(url);
107
+ if (!res.ok) throw await res.json();
108
+ let data = await res.json();
109
+ renderResult(data);
110
+ } catch (err) {
111
+ showError(err.message || "Không tìm thấy dữ liệu, vui lòng kiểm tra lại thông tin.");
112
+ }
113
+ loading.style.display = "none";
114
+ });
115
+
116
+ // Hiển thị kết quả
117
+ function renderResult(data) {
118
+ resultArea.innerHTML = `
119
+ <div class="card shadow p-3">
120
+ <h5 class="mb-3 text-success">Kết quả tra cứu:</h5>
121
+ <table class="table table-bordered align-middle">
122
+ <tbody>
123
+ <tr><th scope="row">Tỉnh/TP cũ</th><td>${data.oldProvince || ''}</td></tr>
124
+ <tr><th scope="row">Quận/Huyện cũ</th><td>${data.oldDistrict || ''}</td></tr>
125
+ <tr><th scope="row">Phường/Xã cũ</th><td>${data.oldWard || ''}</td></tr>
126
+ <tr class="table-secondary"><th scope="row">Tỉnh/TP mới</th><td>${data.newProvince || ''}</td></tr>
127
+ <tr class="table-secondary"><th scope="row">Phường/Xã mới</th><td>${data.newWard || ''}</td></tr>
128
+ <tr><th scope="row">Cấp hành chính mới</th><td>${data.newLevel || ''}</td></tr>
129
+ </tbody>
130
+ </table>
131
+ </div>
132
+ `;
133
+ }
134
+
135
+ // Hiển thị lỗi
136
+ function showError(msg) {
137
+ resultArea.innerHTML = `
138
+ <div class="alert alert-danger">
139
+ <b>Lỗi:</b> ${msg}
140
+ </div>
141
+ `;
142
+ }
143
+
144
+ // Initial load
145
+ loadProvinces();
146
+ </script>
147
+ </body>
148
  </html>