tourfp 0.3.2 → 0.3.4

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 (3) hide show
  1. package/README.md +7 -4
  2. package/package.json +1 -1
  3. package/tourfp.js +16 -3
package/README.md CHANGED
@@ -29,13 +29,13 @@ Với Angular, nên khai báo trong `angular.json` để thư viện được n
29
29
  Hoặc không cần cài, nạp bằng một thẻ script qua CDN:
30
30
 
31
31
  ```html
32
- <script src="https://cdn.jsdelivr.net/npm/tourfp@0.3.2/tourfp.js"></script>
32
+ <script src="https://cdn.jsdelivr.net/npm/tourfp@0.3.4/tourfp.js"></script>
33
33
  ```
34
34
 
35
35
  Để dùng thử nhanh trên một trang đang mở (trang phải cho phép script từ `cdn.jsdelivr.net`), dán dòng này vào console:
36
36
 
37
37
  ```js
38
- document.head.appendChild(Object.assign(document.createElement('script'), { src: 'https://cdn.jsdelivr.net/npm/tourfp@0.3.2/tourfp.js' }));
38
+ document.head.appendChild(Object.assign(document.createElement('script'), { src: 'https://cdn.jsdelivr.net/npm/tourfp@0.3.4/tourfp.js' }));
39
39
  ```
40
40
 
41
41
  Tuỳ chọn, đặt trước khi nạp thư viện:
@@ -85,8 +85,11 @@ uvicorn main:app --app-dir server --host 127.0.0.1 --port 8000
85
85
 
86
86
  Mở <http://localhost:8000>:
87
87
 
88
- - **Thêm tour** — đặt tên rồi dán JSON lấy bằng `copy(TourFP.export())`, hoặc chọn file `.json`.
89
- - **Chạy thử** — chép một đoạn mã gồm cả thư viện lẫn tour; mở màn bắt đầu của tour, dán vào console là tour phát ngay.
88
+ - **Thêm tour** — bấm **Ghi tour bằng Chrome**: máy chủ mở Chrome (hồ sơ kiểm thử, đã đăng nhập) có sẵn thanh ghi ở mọi
89
+ trang. Ghi xong bấm **Gửi** trên thanh ghi, tour tự hiện trong hộp Thêm tour; đặt tên rồi lưu. Kéo hẹp cửa sổ Chrome
90
+ để ghi tour cho bố cục mobile. Cũng có thể dán JSON chép từ thanh ghi trên trang khác.
91
+ - **Chạy thử** — bấm **Chạy trong Chrome**: máy chủ mở Chrome (hồ sơ kiểm thử, đã đăng nhập) tại màn bắt đầu của tour,
92
+ nạp thư viện và phát tour ngay theo chế độ và bước dừng đã chọn. Đoạn mã chạy thử vẫn lấy được ở `/api/tours/{id}/snippet.js`.
90
93
  Khi chạy thử, thanh ghi tour không hiện (chế độ chỉ phát); gọi `TourFP.showPanel()` nếu cần hiện lại.
91
94
  - **Xoá**, **Tải JSON**, và xem danh sách bước của từng tour.
92
95
  - **Sửa tên**: bấm vào tên một bước để đặt tên hiển thị cho bước đó (để trống thì dùng lại tên tự lấy từ giao diện); nút **Sửa tên tour** đổi tên và mô tả của tour. Tên đã đặt được dùng trong lời hướng dẫn khi phát và trong việc tìm tour của trợ lý.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tourfp",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "Ghi và phát tour hướng dẫn trên giao diện web bằng dấu vân tay phần tử, không cần sửa mã nguồn của app.",
5
5
  "main": "tourfp.js",
6
6
  "browser": "tourfp.js",
package/tourfp.js CHANGED
@@ -1,4 +1,4 @@
1
- /* TourFP 0.3.2 — bản thử: ghi tour theo thao tác và khớp phần tử bằng "dấu vân tay".
1
+ /* TourFP 0.3.4 — bản thử: ghi tour theo thao tác và khớp phần tử bằng "dấu vân tay".
2
2
  * - Không dùng class/id. Không phụ thuộc thư viện.
3
3
  * - Chữ lấy từ API (tên, tên kế hoạch…) và chữ số bị loại khỏi dấu vân tay.
4
4
  * Để lọc được, file này phải được nạp TRƯỚC khi app gọi API (đặt trong <head>).
@@ -819,7 +819,13 @@
819
819
  }
820
820
 
821
821
  // hộp thoại đang che màn hình mà không bước nào của tour diễn ra trong nó (quảng cáo, thông báo bất chợt)
822
- const foreignDialog = () => { const d = topDialog(); if (!d) return false; const k = dialogKey(d); return !steps.some(s => s.fp.ctx.dialog === k); };
822
+ // Hộp thoại "của tour": có bước diễn ra trong nó, hoặc nó là màn hình sau cú bấm của một bước (ví dụ bước cuối mở hộp thoại
823
+ // Nộp tiền: đó chính là màn đích của tour, không phải hộp thoại lạ).
824
+ const foreignDialog = () => {
825
+ const d = topDialog(); if (!d) return false;
826
+ const k = dialogKey(d);
827
+ return !steps.some(s => s.fp.ctx.dialog === k || (s.after && s.after.dialog === k));
828
+ };
823
829
  // Tạm ngừng dẫn cho tới khi người dùng đóng hộp thoại lạ, rồi phát tiếp từ đúng chỗ. Không chặn cú bấm nào, không tải lại trang.
824
830
  function holdForDialog() {
825
831
  const my = ++token;
@@ -1062,8 +1068,11 @@
1062
1068
  }
1063
1069
  // Máy chủ có gọi được không: null = chưa biết. Trang chặn kết nối ra ngoài thì kết quả không đổi, nên chỉ cần dò một lần.
1064
1070
  let serverOk = null;
1065
- const setSaveMode = () => { bSave.textContent = serverOk === false ? 'Chép JSON' : 'Lưu'; };
1071
+ // Chrome do trang quản trị mở để ghi tour: có sẵn hàm __tourfpHost, gửi tour thẳng về trang quản trị qua đó
1072
+ const host = () => typeof window.__tourfpHost === 'function';
1073
+ const setSaveMode = () => { bSave.textContent = host() ? 'Gửi' : serverOk === false ? 'Chép JSON' : 'Lưu'; };
1066
1074
  async function probe() {
1075
+ if (host()) return setSaveMode();
1067
1076
  if (serverOk !== null) return;
1068
1077
  try { serverOk = (await fetch(SERVER + '/api/config')).ok; } catch (_) { serverOk = false; }
1069
1078
  setSaveMode();
@@ -1074,6 +1083,10 @@
1074
1083
  scrub();
1075
1084
  if (recording) stop();
1076
1085
  if (!steps.length) return setInfo('Chưa có bước nào để lưu');
1086
+ if (host()) {
1087
+ try { await window.__tourfpHost(JSON.stringify(steps)); return setInfo(`Đã gửi ${steps.length} bước về trang quản trị · đặt tên và lưu ở đó`); }
1088
+ catch (_) { return setInfo('Không gửi được về trang quản trị'); }
1089
+ }
1077
1090
  if (serverOk === false) {
1078
1091
  return setInfo(copyNow(JSON.stringify(steps)) ? 'Đã chép JSON · dán vào Thêm tour ở trang quản trị' : 'Không chép được · dùng copy(TourFP.export()) trong console');
1079
1092
  }