Hệ thống pháp luật

ỦY BAN NHÂN DÂN
THÀNH PHỐ HỒ CHÍ MINH
SỞ GIÁO DỤC VÀ ĐÀO TẠO
-------

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập - Tự do - Hạnh phúc
---------------

Số: 4554/KH-SGDĐT

Thành phố Hồ Chí Minh, ngày 21 tháng 8 năm 2023

 

KẾ HOẠCH

CÔNG TÁC PHÒNG, CHỐNG THAM NHŨNG, TIÊU CỰC NĂM 2023

Căn cứ Luật Phòng, chống tham nhũng năm 2018, Nghị định số 59/2019/NĐ-CP ngày 01 tháng 7 năm 2019 quy định chi tiết một số điều và biện pháp thi hành Luật Phòng, chống tham nhũng, Chương trình số 01-CTr/BCĐ ngày 26 tháng 9 năm 2022 của Ban Chỉ đạo Phòng, chống tham nhũng, tiêu cực Thành phố Hồ Chí Minh về chương trình công tác quý 4 năm 2022 và năm 2023;

Thực hiện Kế hoạch số 1725/KH-UBND ngày 28 tháng 4 năm 2023 của Ủy ban nhân dân Thành phố Hồ Chí Minh về Kế hoạch thực hiện công tác phòng, chống tham nhũng, tiêu cực năm 2023, Sở Giáo dục và Đào tạo Thành phố Hồ Chí Minh xây dựng kế hoạch công tác phòng, chống tham nhũng, tiêu cực năm 2023 như sau:

I. MỤC ĐÍCH YÊU CẦU

1. Mục đích:

- Tiếp tục chỉ đạo, triển khai thực hiện có hiệu quả các chủ trương, định hướng, giải pháp của Đảng và các quy định pháp luật của Nhà nước về phòng, chống tham nhũng, tiêu cực; triển khai thực hiện đồng bộ, kịp thời, có hiệu quả các biện pháp phòng ngừa tham nhũng, tiêu cực.

- Tăng cường phát hiện, xử lý kịp thời các hành vi tham nhũng, tiêu cực; kiên quyết thu hồi tài sản tham nhũng trong các vụ việc, vụ án tham nhũng, kinh tế nghiêm trọng, phức tạp theo chỉ đạo của Bộ Chính trị, Ban Chỉ đạo Trung ương về phòng, chống tham nhũng, tiêu cực, Ban Thường vụ Thành ủy và Ban Chỉ đạo Phòng, chống tham nhũng, tiêu cực Thành phố theo đúng quy định pháp luật. Kịp thời ngăn chặn, xử lý, đẩy lùi tham nhũng, góp phần giữ vững ổn định chính trị - xã hội, nâng cao hiệu quả quản lý Nhà nước, thúc đẩy phát triển kinh tế - xã hội trên địa bàn Thành phố Hồ Chí Minh.

- Phát huy vai trò, trách nhiệm của toàn xã hội trong công tác phòng, chống tham nhũng, tiêu cực. Khuyến khích, vận động Nhân dân, doanh nghiệp tham gia tích cực vào việc phát hiện, phản ánh, tố cáo, tố giác các hành vi tham nhũng, tiêu cực, kịp thời cung cấp thông tin cho cơ quan, tổ chức, đơn vị, cá nhân có thẩm quyền để xem xét xử lý theo quy định; bảo vệ người phát hiện, tố giác đấu tranh chống tham nhũng, tiêu cực.

2. Yêu cầu:

- Đẩy mạnh công tác thông tin, tuyên truyền, phổ biến, quán triệt và thực hiện nghiêm các quy định của pháp luật về phòng, chống tham nhũng, tiêu cực, các Nghị quyết, kết luận của Ban Chỉ đạo Trung ương về phòng, chống tham nhũng, tiêu cực, Chính phủ, Thanh tra Chính phủ, các văn bản chỉ đạo của Thành ủy, Ban Chỉ đạo Phòng, chống tham nhũng, tiêu cực Thành phố, Ủy ban nhân dân Thành phố về công tác phòng, chống tham nhũng, tiêu cực.

- Thủ trưởng các cơ quan, tổ chức, đơn vị trực thuộc Sở Giáo dục và Đào tạo Thành phố Hồ Chí Minh bám sát, triển khai có hiệu quả Chương trình công tác năm 2023 của Ban Chỉ đạo Phòng, chống tham nhũng, tiêu cực Thành phố, nâng cao trách nhiệm trong công tác chỉ đạo, tổ chức triển khai, kiểm tra việc thực hiện các quy định của pháp luật về phòng, chống tham nhũng, tiêu cực và các văn bản hướng dẫn thực hiện chủ trương, chỉ đạo của cấp có thẩm quyền; cụ thể hóa các nội dung, giải pháp cụ thể để chỉ đạo thực hiện, phát hiện và xử lý kịp thời các hành vi tham nhũng, tiêu cực; xác định việc triển khai thực hiện các nhiệm vụ, giải pháp phòng, chống tham nhũng, tiêu cực là một trong các tiêu chí để đánh giá việc hoàn thành nhiệm vụ hàng năm.

- Các cơ quan, tổ chức, đơn vị xây dựng kế hoạch triển khai, đề ra giải pháp phù hợp với tình hình thực tế của cơ quan, đơn vị mình để triển khai thực hiện hiệu quả công tác phòng, chống tham nhũng, tiêu cực.

II. NỘI DUNG

1. Tiếp tục đẩy mạnh tuyên truyền, giáo dục và thực hiện nghiêm túc, có hiệu quả các nghị quyết, chủ trương, định hướng của Đảng, chính sách, pháp luật của Nhà nước và các văn bản chỉ đạo của Ban Thường vụ Thành ủy, Ban Chỉ đạo Phòng, chống tham nhũng, tiêu cực Thành phố và của Ủy ban nhân dân Thành phố về công tác phòng, chống tham nhũng, tiêu cực2. Cụ thể hóa, thể chế hóa các chủ trương, định hướng, giải pháp của Đảng về phòng, chống tham nhũng, tiêu cực; triển khai, thực hiện có hiệu quả các văn bản, ý kiến chỉ đạo của Ban Chấp hành Trung ương, Bộ Chính trị, Ban Chỉ đạo Trung ương về phòng, chống tham nhũng, tiêu cực và Ban Chỉ đạo phòng, chống tham nhũng, tiêu cực Thành phố Hồ Chí Minh về công tác phòng, chống tham nhũng, tiêu cực.

3. Thường xuyên kiểm tra, rà soát, tham mưu đề xuất cấp có thẩm quyền sửa đổi, bổ sung các văn bản quy phạm pháp luật về phòng, chống tham nhũng, tiêu cực. Rà soát, khắc phục hoặc kiến nghị khắc phục những sơ hở, bất cập trong cơ chế, chính sách liên quan đến đấu thầu, đấu giá, quản lý, sử dụng đất đai, tài sản công, hợp tác công tư, xã hội hóa, tự chủ tài chính và các lĩnh vực tiềm ẩn tham nhũng, tiêu cực đã được các cơ quan kiểm tra, giám sát, kiểm toán, thanh tra, điều tra, truy tố, xét xử hoặc các đoàn kiểm tra, giám sát có kết luận, kiến nghị, đề xuất và chỉ đạo khắc phục.

4. Tăng cường công khai, minh bạch, trách nhiệm giải trình, kiểm soát xung đột lợi ích gắn với siết chặt kỷ cương, kỷ luật trong hoạt động của Nhà nước và của cán bộ, công chức, viên chức. Thực hiện đồng bộ các giải pháp phòng ngừa tham nhũng, tiêu cực: đẩy mạnh ứng dụng công nghệ thông tin, thực hiện chuyển đổi số; công khai, minh bạch niêm yết các thủ tục hành chính và trong hoạt động của cơ quan, tổ chức, đơn vị nhất là trong công tác quy hoạch, đấu thầu, tuyển dụng, bổ nhiệm cán bộ, công chức, viên chức,...; thực hiện nghiêm quy tắc ứng xử, quy tắc đạo đức nghề nghiệp và chuyển đổi vị trí công tác của cán bộ, công chức, viên chức; đẩy mạnh công tác cải cách hành chính theo hướng tinh, gọn, tránh gây phiền hà cho nhân dân; kiểm soát tài sản, thu nhập của cán bộ, công chức; xây dựng và thực hiện tốt các chế độ, định mức, tiêu chuẩn... xử lý, ngăn chặn có hiệu quả tình trạng nhũng nhiễu, tiêu cực, gây phiền hà cho người dân, doanh nghiệp, nhất là tình trạng tham nhũng vặt.

5. Tăng cường kiểm tra, giám sát, thanh tra các lĩnh vực chuyên môn, dễ phát sinh tham nhũng, tiêu cực (quản lý, sử dụng tài chính công, tài sản công; đấu thầu, đấu giá, mua sắm tài sản công; sử dụng nguồn viện trợ, tài trợ...). Xử lý nghiêm minh, kịp thời các trường hợp vi phạm hoặc chuyển cơ quan điều tra xử lý theo quy định đối với các hành vi có dấu hiệu tội phạm được phát hiện qua kiểm tra, thanh tra.

6. Thường xuyên kiểm tra, theo dõi, rà soát, tổ chức thực hiện nghiêm túc, có hiệu quả các kết luận kiểm tra, giám sát của Ban Chỉ đạo Trung ương về phòng, chống tham nhũng, tiêu cực, chỉ đạo của Ban Thường vụ Thành ủy, Ban Chỉ đạo Phòng, chống tham nhũng, tiêu cực Thành phố và Ủy ban nhân dân Thành phố. Xem xét, xử lý trách nhiệm hoặc báo cáo cấp có thẩm quyền xử lý trách nhiệm đối với các cơ quan, tổ chức, cá nhân không thực hiện hoặc thực hiện không nghiêm túc, đầy đủ các kết luận, kiến nghị của đoàn công tác của Ban Chỉ đạo Trung ương về phòng, chống tham nhũng và chỉ đạo của Ban Thường vụ Thành ủy, Ban Chỉ đạo Phòng, chống tham nhũng, tiêu cực Thành phố về công tác phòng, chống tham nhũng, tiêu cực.

7. Tiếp tục rà soát, đẩy mạnh thực hiện các nhiệm vụ theo Chỉ thị số 12/CT-TTg ngày 28 tháng 4 năm 2016 của Thủ tướng Chính phủ về tăng cường công tác phát hiện, xử lý vụ việc, vụ án tham nhũng; Chỉ thị số 04-CT/TW ngày 02 tháng 6 năm 2021 của Ban Bí thư về tăng cường sự lãnh đạo của Đảng đối với công tác thu hồi tài sản trong các vụ án hình sự về tham nhũng, kinh tế; Kết luận số 05-KL/TW ngày 03 tháng 6 năm 2021 của Ban Bí thư về việc tiếp tục thực hiện Chỉ thị số 50-CT/TW ngày 07 tháng 12 năm 2015 của Bộ Chính trị về tăng cường sự lãnh đạo của Đảng đối với công tác phát hiện, xử lý vụ việc, vụ án tham nhũng.

8. Nâng cao hiệu quả phát hiện, xử lý tham nhũng qua công tác thanh tra, kiểm tra; tiếp công dân, giải quyết tố cáo, xử lý tin báo tố giác tội phạm.

9. Tiếp tục triển khai thực hiện có hiệu quả Thông tri số 28-TT/TU ngày 22 tháng 4 năm 2019 của Ban Thường vụ Thành ủy về tăng cường sự lãnh đạo của Đảng đối với công tác bảo vệ người phát hiện, tố giác, đấu tranh chống tham nhũng, lãng phí, tiêu cực theo Chỉ thị số 27-CT/TW ngày 10 tháng 01 năm 2019 của Bộ Chính trị. Đồng thời, tổ chức biểu dương, khen thưởng kịp thời các tập thể, cá nhân có đóng góp xuất sắc cho công tác phòng, chống tham nhũng, tiêu cực hàng năm.

10. Tạo điều kiện thuận lợi, phối hợp theo quy định với Ủy ban Mặt trận Tổ quốc Việt Nam các cấp, các tổ chức thành viên và các cơ quan báo chí trong công tác đấu tranh phòng, chống tham nhũng, tiêu cực; tiếp tục đổi mới, nâng cao chất lượng giám sát việc thực hiện các chủ trương, chính sách của Đảng, pháp luật của Nhà nước về phòng, chống tham nhũng, tiêu cực; tiếp tục tăng cường phản biện xã hội, kiến nghị hoàn thiện chính sách, pháp luật về phòng, chống tham nhũng, tiêu cực; chủ động cung cấp thông tin cho các cơ quan có thẩm quyền trong phát hiện, xử lý tham nhũng; động viên nhân dân tích cực tham gia phát hiện, phản ánh, tố cáo, cung cấp thông tin cho cơ quan, tổ chức, đơn vị, cá nhân có thẩm quyền trong việc phát hiện, xử lý tham nhũng, tiêu cực.

11. Thực hiện công tác phòng, chống tham nhũng trong doanh nghiệp, tổ chức khu vực ngoài nhà nước theo quy định của Luật Phòng, chống tham nhũng năm 2018 và Nghị định số 59/2019/NĐ-CP ngày 01 tháng 7 năm 2019 quy định chi tiết một số điều và biện pháp thi hành Luật Phòng, chống tham nhũng. Các đơn vị ngoài công lập căn cứ quy định của Luật Phòng, chống tham nhũng năm 2018 và các văn bản pháp luật khác có liên quan, ban hành quy tắc ứng xử, cơ chế kiểm soát nội bộ nhằm phòng ngừa, kiểm soát xung đột lợi ích, ngăn chặn hành vi tham nhũng, tiêu cực; giám sát việc chấp hành pháp luật về phòng, chống tham nhũng, tiêu cực và tích cực tham gia vào việc hoàn thiện, chính sách, pháp luật để phòng, chống tham nhũng, tiêu cực.

12. Triển khai thực hiện nghiêm túc Nghị định số 130/2020/NĐ-CP ngày 30 tháng 10 năm 2020 của Chính phủ quy định về kiểm soát tài sản, thu nhập của người có chức vụ, quyền hạn trong cơ quan, tổ chức, đơn vị và Quyết định số 56-QĐ/TW ngày 08 tháng 02 năm 2022 của Bộ Chính trị về việc ban hành Quy chế phối hợp giữa các cơ quan kiểm soát tài sản, thu nhập; tăng cường chế độ trách nhiệm của các cấp chính quyền, thủ trưởng các cơ quan, đơn vị trong việc chỉ đạo thực hiện và kiểm tra, giám sát việc thực hiện công tác kê khai, công khai và kiểm soát việc kê khai tài sản, thu nhập; tăng cường việc kiểm soát biến động tài sản, thu nhập của đối tượng có nghĩa vụ kê khai và việc quản lý, sử dụng bản kê khai.

13. Tham gia các hoạt động hợp tác quốc tế và đối thoại về phỏng, chống tham nhũng, tiêu cực. Thực hiện trách nhiệm, nguyên tắc chung về hợp tác quốc tế về nghiên cứu, đào tạo, xây dựng chính sách, trao đổi thông tin, kinh nghiệm... trong công tác phòng, chống tham nhũng, tiêu cực kịp thời theo chỉ đạo của Ủy ban nhân dân Thành phố theo quy định.

III. TỔ CHỨC THỰC HIỆN

1. Trưởng phòng Giáo dục và Đào tạo Thành phố Thủ Đức và các quận, huyện; Hiệu trưởng các trường Cao đẳng - Trung cấp, trường Trung học phổ thông, trường phổ thông nhiều cấp học và Thủ trưởng các đơn vị trực thuộc căn cứ Kế hoạch này và chức năng, nhiệm vụ được giao có trách nhiệm xây dựng, triển khai thực hiện nghiêm túc, có hiệu quả và thường xuyên theo dõi, đôn đốc, kiểm tra, giám sát việc thực hiện công tác phòng, chống tham nhũng, tiêu cực tại cơ quan, đơn vị mình phụ trách; trong đó, chú trọng việc thực hiện công khai, minh bạch theo quy định tại Điều 10 và việc kiểm soát xung đột lợi ích theo quy định tại Điều 23, Luật Phòng, chống tham nhũng năm 2018.

Thủ trưởng các cơ quan, đơn vị có trách nhiệm xây dựng kế hoạch tự kiểm tra việc thực hiện nhiệm vụ, công vụ của người có chức vụ, quyền hạn do mình quản lý nhằm kịp thời phát hiện, ngăn chặn, xử lý hành vi tham nhũng, tiêu cực. Khi phát hiện có hành vi tham nhũng, tiêu cực, người đứng đầu cơ quan, đơn vị phải kịp thời xử lý theo thẩm quyền hoặc báo cho cơ quan có thẩm quyền xử lý theo quy định của pháp luật.

2. Văn phòng Sở

- Tiếp tục tăng cường tuyên truyền, phổ biến, giáo dục pháp luật về công tác phòng, chống tham nhũng, tiêu cực trên trang thông tin điện tử của Sở Giáo dục và Đào tạo góp phần tăng cường phổ biến, giáo dục pháp luật qua phương tiện thông tin đại chúng.

- Hướng dẫn, đôn đốc, kiểm tra các đơn vị trong công tác cải cách hành chính. Chịu trách nhiệm xây dựng kế hoạch, tổng hợp tình hình, kết quả thực hiện công tác cải cách hành chính, định kỳ hàng quý, 6 tháng, 9 tháng và năm; báo cáo tình hình, kết quả thực hiện cho Ủy ban nhân dân Thành phố.

3. Phòng Chính trị tư tưởng

- Chủ trì, phối hợp các đơn vị, phòng ban liên quan rà soát, nghiên cứu, đề xuất triển khai thực hiện đầy đủ các nhiệm vụ theo các văn bản quy phạm pháp luật về phòng, chống tham nhũng, tiêu cực.

- Thường xuyên kiểm tra, rà soát văn bản pháp luật nhằm phát hiện các nội dung có kẽ hở, là điều kiện, môi trường phát sinh tham nhũng, tiêu cực; kịp thời tham mưu kiến nghị cấp có thẩm quyền điều chỉnh, bổ sung, sửa đổi các văn bản quy phạm pháp luật để phòng ngừa tham nhũng, tiêu cực, nhất là hành vi “tham nhũng vặt”.

- Thực hiện hiệu quả công tác tuyên truyền, phổ biến, giáo dục pháp luật về phòng, chống tham nhũng, tiêu cực, Công ước của Liên Hiệp quốc về phòng, chống tham nhũng, tiêu cực. Hướng dẫn, đôn đốc Phòng Giáo dục và Đào tạo Thành phố Thủ Đức và các quận, huyện; Hiệu trưởng các trường Cao đẳng - Trung cấp, trường Trung học phổ thông, trường phổ thông nhiều cấp học và Thủ trưởng các đơn vị trực thuộc thực hiện công tác tuyên truyền, phổ biến giáo dục pháp luật về phòng, chống tham nhũng, tiêu cực.

- Đưa nội dung, yêu cầu tuyên truyền, phổ biến, giáo dục pháp luật về phòng, chống tham nhũng, tiêu cực vào các sự kiện, văn bản hướng dẫn thực hiện công tác pháp chế, hoạt động “Ngày Pháp luật Việt Nam - 09 tháng 11” hằng năm.

4. Phòng Giáo dục Tiểu học, Giáo dục Trung học

- Hướng dẫn việc tổ chức triển khai lồng ghép nội dung pháp luật về phòng, chống tham nhũng và đạo đức liêm chính vào các chương trình giáo dục tiểu học và trung học cơ sở trên phạm vi toàn thành phố.

- Tiếp tục thực hiện đưa nội dung phòng, chống tham nhũng vào giảng dạy tại các cơ sở giáo dục đào tạo theo Chỉ thị số 10/CT-TTg ngày 12 tháng 6 năm 2013 của Thủ tướng Chính phủ; đẩy mạnh công tác tuyên truyền về phòng, chống tham nhũng, tiêu cực bằng nhiều hình thức phù hợp với từng đối tượng, từng thời điểm và tình hình cụ thể, bám sát sự chỉ đạo, định hướng của Thành ủy và Ủy ban nhân dân Thành phố Hồ Chí Minh.

5. Phòng Kế hoạch Tài chính

Thường xuyên thanh tra, kiểm tra việc chấp hành chế độ, định mức, tiêu chuẩn; việc thực hiện công khai, minh bạch trong bố trí, quản lý, sử dụng tài chính công, tài sản công hoặc kinh phí huy động từ các nguồn hợp pháp khác để kịp thời phát hiện và báo cáo, đề xuất biện pháp xử lý nghiêm các trường hợp vi phạm.

6. Phòng Tổ chức Cán bộ

- Hướng dẫn, đôn đốc, kiểm tra các đơn vị trong việc thực hiện các quy định của pháp luật về chuyển đổi vị trí công tác của cán bộ, công chức, viên chức để phòng, chống tham nhũng, tiêu cực; trong công tác tổ chức cán bộ của cơ quan, tổ chức, đơn vị và việc thực hiện quy tắc ứng xử của người có chức vụ, quyền hạn.

- Tiếp tục kiến nghị và theo dõi việc thực hiện kiến nghị về sửa đổi, bổ sung, hướng dẫn việc quản lý, sử dụng công chức, viên chức phù hợp, đảm bảo bộ máy tinh gọn, hoạt động hiệu lực, hiệu quả.

- Hướng dẫn, đôn đốc các đơn vị thực hiện công tác kê khai tài sản, thu nhập; thực hiện công tác kiểm soát tài sản, thu nhập theo quy định.

- Thường xuyên theo dõi, đôn đốc, kiểm tra, giám sát các đơn vị thực hiện công tác phòng, chống tham nhũng, tiêu cực; trong đó, chú trọng việc thực hiện công khai, minh bạch theo quy định tại Điều 10 và việc kiểm soát xung đột lợi ích theo quy định tại Điều 23, Luật Phòng, chống tham nhũng năm 2018.

- Thanh tra, kiểm tra việc thực hiện chức trách, nhiệm vụ, công vụ, việc thực hiện kỷ cương, kỷ luật hành chính, quy tắc ứng xử, đạo đức nghề nghiệp, việc tuyển dụng, quy hoạch, bổ nhiệm, điều động, luân chuyển, việc chuyển đổi vị trí của các đơn vị, cán bộ, công chức, viên chức để phòng ngừa tham nhũng, tiêu cực chú trọng kiểm tra, giám sát, kiểm soát quyền lực trong công tác cán bộ.

7. Thanh tra Sở

- Nâng cao năng lực, trách nhiệm trong công tác thanh tra phát hiện, xử lý các vụ việc có dấu hiệu, hành vi tham nhũng; chú trọng theo dõi, đôn đốc thực hiện kết luận, kiến nghị, khắc phục hậu quả, xử lý sai phạm sau thanh tra; thực hiện thanh tra, kiểm tra định kỳ, đột xuất trách nhiệm của người đứng đầu trong thực hiện các quy định của pháp luật về phòng, chống tham nhũng, tiêu cực.

- Tiếp tục thực hiện các quy định của pháp luật trong công tác tiếp công dân, giải quyết tố cáo, xử lý tin báo tố giác, tố cáo vụ việc có dấu hiệu tham nhũng. Xử lý theo thẩm quyền hoặc chuyển cơ quan có thẩm quyền xem xét xử lý các vụ việc tham nhũng, tiêu cực phát hiện qua công tác thanh tra, giải quyết tố cáo và phòng, chống tham nhũng, tiêu cực.

- Chịu trách nhiệm theo dõi, đôn đốc, kiểm tra, tổng hợp tình hình, kết quả thực hiện công tác phòng, chống tham nhũng, tiêu cực đột xuất và định kỳ hàng quý, 6 tháng, 9 tháng và năm; báo cáo tình hình, kết quả thực hiện cho Ủy ban nhân dân Thành phố.

Sở Giáo dục và Đào tạo yêu cầu Trưởng các phòng ban thuộc Sở căn cứ tình hình thực tế triển khai thực hiện Kế hoạch đảm bảo tiến độ và đạt hiệu quả các nội dung đề ra./.

 


Nơi nhận:
- Thanh tra Thành phố;
- Các Phó Giám đốc Sở GDĐT;
- Trưởng các phòng ban Sở GDĐT;
- Phòng GDĐT TP. Thủ Đức và các quận, huyện; các trường Cao đẳng - Trung cấp, trường THPT, trường PT nhiều cấp học và các đơn vị trực thuộc;
- Lưu: VT, TTr (LSN)

GIÁM ĐỐC




Nguyễn Văn Hiếu

 



lồng nhau (bên trong) hay không const memberID = 0; const vbID = 'f57f8f2fc9f5d0c38a4546b2b2a1a95a'; // State management cho phân tích let isAnalyzing = false; // Có đang phân tích không let currentAnalyzingAddress = null; // Address đang được phân tích let currentAnalyzingElement = null; // Element đang được phân tích let currentAnalyzingBadge = null; // Badge của element đang phân tích let isPanelOpen = false; // Panel phân tích có đang mở không console.log('Tiện ích loaded - memberID:', memberID, 'vbID:', vbID); function isInViewportAndTabNoiDung(element) { const rect = element.getBoundingClientRect(); const buffer = 1500; // Buffer to preload content below the viewport (approx. 50+ lines) const viewHeight = window.innerHeight || document.documentElement.clientHeight; const isInViewport = rect.top < viewHeight + buffer && rect.bottom >= 0; const isInTabNoiDung = $(element).closest('#tab_noi_dung_vb').length > 0; return isInViewport && isInTabNoiDung; } function getAddress(element) { const validTags = ['trichyeu', 'cancu', 'phan', 'chuong', 'muc', 'tieumuc', 'dieu', 'khoan', 'diem']; const $parent = $(element).closest(validTags.join(',')); if (!$parent.length) { return null; } let addr = $parent.attr('address'); if (!addr && $parent.prop('tagName').toLowerCase() === 'trichyeu') { addr = 'trichyeu'; $parent.attr('address', addr); } return addr || null; } function processTnplClasses($element) { const tnplKeysInLine = new Set(); // key = slug hoặc text (thường là slug) $element.find('tnpl').each(function () { const $tnpl = $(this); const tnplSlug = ($tnpl.attr('slug') || '').trim().toLowerCase(); const tnplKey = tnplSlug || $tnpl.text().trim().toLowerCase(); // Đã xử lý trong cùng dòng => bỏ if (tnplKeysInLine.has(tnplKey)) { return; } tnplKeysInLine.add(tnplKey); let tnplExists = false; // Chỉ duyệt các tnpl đã được tô màu (class on) $('tnpl.on').each(function () { const $existingTnpl = $(this); const existingSlug = ($existingTnpl.attr('slug') || '').trim().toLowerCase(); const existingKey = existingSlug || $existingTnpl.text().trim().toLowerCase(); if ( existingKey === tnplKey && isInViewportAndTabNoiDung($existingTnpl[0]) ) { tnplExists = true; return false; // break each } }); if (!tnplExists) { $tnpl.addClass('on'); } }); } function processQueue() { while (pendingRequests < maxConcurrentRequests && requestQueue.length > 0) { const task = requestQueue.shift(); pendingRequests++; task() .always(() => { pendingRequests--; processQueue(); }); } } function processVisibleParagraphs() { try { $('#tab_noi_dung_vb p:not([is-posted="1"])').each(function () { let $element = $(this); if (isInViewportAndTabNoiDung(this)) { $element.attr('is-posted', '1'); $element.addClass('loading-content'); let p_innerHTML = $element.html(); let address = null; if (cac_cau_hinh.loai_noi_dung.includes('docs')) { address = getAddress($element); } const isSubP = $element.parents('p').length > 0; if (isSubP && !allow_sub_p) { $element.removeClass('loading-content'); return; // Không gửi nếu không cho phép } const postData = { p_content: p_innerHTML, cac_cau_hinh, address }; if (isSubP && allow_sub_p) { postData.sub_p = 1; } requestQueue.push(() => $.ajax({ url: '//tnpl' + (Math.floor(Math.random() * 10) + 1) + '.hethongphapluat.com/tien-ich/tim.tien.ich.php', type: 'POST', data: postData, success: function(response) { $element.html(response); processTnplClasses($element); // Đợi CTTD và các tiện ích load xong rồi mới attach badge if (memberID === 4 && typeof attachPhanTichBadge === 'function') { setTimeout(function() { // $element chính là thẻ p, kiểm tra và attach badge trực tiếp const $parent = $element.closest('phan, chuong, muc, tieumuc, dieu, khoan, diem'); if ($parent.length > 0 && $parent.find('.badge-phan-tich[data-for="' + $parent.attr('address') + '"]').length === 0) { const address = $parent.attr('address'); $element.attr('data-address', address); // Lấy tên loại thẻ cho tooltip const parentType = getParentTypeName($parent.prop('tagName').toLowerCase()); // Append badge VÀO PARENT (dieu, khoan,...) thay vì vào

để tránh xung đột CTTD const $badge = $('Phân tích'); $parent.append($badge); // Thêm class để CSS set position: relative CHỈ cho element có badge $parent.addClass('has-phan-tich-badge'); } // Xử lý các p con (nếu có sub-p) attachPhanTichBadge($element); }, 300); // Đợi 300ms để CTTD render xong } }, complete: function() { $element.removeClass('loading-content'); } }) ); processQueue(); } }); } catch(e) { console.error('Lỗi processVisibleParagraphs:', e); } } $(window).on('scroll resize', function () { processVisibleParagraphs(); }); console.log('Bắt đầu processVisibleParagraphs lần đầu...'); processVisibleParagraphs(); console.log('processVisibleParagraphs lần đầu hoàn thành'); // Chức năng phân tích điều luật (chỉ cho member_id = 4) if (memberID === 4) { // Modal cảnh báo function showWarningModal(message) { // Tạo modal nếu chưa có if ($('#warningModal').length === 0) { const modalHTML = `

`; $('body').append(modalHTML); } $('#warningModalBody').html('

' + message + '

'); $('#warningModal').modal('show'); } // Hàm lấy tên tiếng Việt của thẻ function getParentTypeName(tagName) { const typeNames = { 'phan': 'Phần', 'chuong': 'Chương', 'muc': 'Mục', 'tieumuc': 'Tiểu mục', 'dieu': 'Điều', 'khoan': 'Khoản', 'diem': 'Điểm' }; return typeNames[tagName] || 'Nội dung'; } function attachPhanTichBadge($container) { const validTags = 'phan, chuong, muc, tieumuc, dieu, khoan, diem'; $container.find('p').each(function() { const $p = $(this); const $parent = $p.closest(validTags); if ($parent.length > 0) { const address = $parent.attr('address'); // Kiểm tra đã có badge cho parent này chưa if ($parent.find('.badge-phan-tich[data-for="' + address + '"]').length === 0) { // Lưu address vào data attribute $p.attr('data-address', address); // Lấy tên loại thẻ cho tooltip const parentType = getParentTypeName($parent.prop('tagName').toLowerCase()); // Append badge vào PARENT, không vào

const $badge = $('Phân tích'); $parent.append($badge); // Thêm class để CSS set position: relative CHỈ cho element có badge $parent.addClass('has-phan-tich-badge'); } } }); } // Helper: Escape HTML entities function escapeHtml(text) { const map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return String(text).replace(/[&<>"']/g, function(m) { return map[m]; }); } // Helper: Convert Markdown to HTML (đơn giản) function markdownToHtml(markdown) { if (!markdown) return ''; let html = markdown; // Headers html = html.replace(/^### (.*$)/gim, '

$1
'); html = html.replace(/^## (.*$)/gim, '

$1

'); html = html.replace(/^# (.*$)/gim, '

$1

'); // Bold html = html.replace(/\*\*(.*?)\*\*/g, '$1'); // Italic html = html.replace(/\*(.*?)\*/g, '$1'); // Blockquote html = html.replace(/^> (.*$)/gim, '
$1
'); html = html.replace(/^> (.*$)/gim, '
$1
'); // Lists (unordered) html = html.replace(/^\- (.*$)/gim, '
  • $1
  • '); html = html.replace(/(
  • .*<\/li>)/s, '
      $1
    '); // Lists (ordered) html = html.replace(/^\d+\. (.*$)/gim, '
  • $1
  • '); // Line breaks và paragraphs html = html.split('\n\n').map(para => { para = para.trim(); if (para.startsWith('')) { return para; } if (para) { return '

    ' + para.replace(/\n/g, '
    ') + '

    '; } return ''; }).join('\n'); // Clean up multiple line breaks html = html.replace(/\n{3,}/g, '\n\n'); return html; } // Panel fixed position function closePhanTichPanel() { const $panel = $('#phanTichPanel'); if ($panel.length) { $panel.removeClass('show'); setTimeout(() => { $panel.remove(); }, 300); } // Reset highlight và badge khi đóng panel if (currentAnalyzingElement) { currentAnalyzingElement.removeClass('highlight-border-persistent'); } if (currentAnalyzingBadge) { currentAnalyzingBadge.text('Phân tích').removeClass('analyzing'); currentAnalyzingBadge.data('analyzing', false); currentAnalyzingBadge.data('hovering', false); currentAnalyzingBadge.css({display: 'none'}); // Ẩn badge khi đóng } // Reset tất cả các element khác (trong trường hợp có nhiều) $('#tab_noi_dung_vb .highlight-border-persistent').removeClass('highlight-border-persistent'); $('#tab_noi_dung_vb .badge-phan-tich-container.analyzing').each(function() { $(this).text('Phân tích').removeClass('analyzing').data('analyzing', false); }); // Check: có CTTD pointer đang mở không? const $visiblePointers = $('.pointer:visible'); const hadCTTDOpen = $visiblePointers.length > 0; if (hadCTTDOpen) { // CÓ CTTD đang mở → giữ rightdocinfo ẩn console.log('ℹ️ CTTD pointer is visible, keeping rightdocinfo hidden'); } else { // KHÔNG có CTTD → SHOW lại rightdocinfo const $rightdocinfo = $('#rightdocinfo'); if ($rightdocinfo.length > 0) { $rightdocinfo.show(); console.log('✅ Showing rightdocinfo back (no CTTD pointer)'); } } // Reset state isAnalyzing = false; currentAnalyzingAddress = null; currentAnalyzingElement = null; currentAnalyzingBadge = null; isPanelOpen = false; // Đánh dấu panel đã đóng console.log('✅ Panel closed, state reset, isPanelOpen = false'); } // Panel đã song song với rightdocinfo → không cần MutationObserver nữa console.log('✅ Panel running in standalone mode (parallel to rightdocinfo)'); // Resize event để update panel dimensions khi browser resize let resizeTimer; $(window).on('resize', function() { clearTimeout(resizeTimer); resizeTimer = setTimeout(function() { if (isPanelOpen && $('#phanTichPanel').length > 0) { updatePanelDimensions(); console.log('✅ Panel dimensions updated on window resize'); } }, 250); // Debounce 250ms }); // Function để detect và áp dụng dimensions từ rightdocinfo function updatePanelDimensions() { const $panel = $('#phanTichPanel'); const $rightdocinfo = $('#rightdocinfo'); const $docRightCol = $('#doc-right-col'); if ($panel.length === 0) return; // Ưu tiên: doc-right-col > rightdocinfo let $reference = $docRightCol.length > 0 ? $docRightCol : $rightdocinfo; // Nếu reference bị ẩn (display:none), tạm show để get dimensions let wasHidden = false; if ($reference.length > 0 && !$reference.is(':visible')) { wasHidden = true; $reference.css('visibility', 'hidden').show(); } if ($reference.length > 0) { const refWidth = $reference.outerWidth(); const refOffset = $reference.offset(); if (refWidth && refOffset) { // Tính vị trí right từ edge màn hình const windowWidth = $(window).width(); const rightPosition = windowWidth - (refOffset.left + refWidth); $panel.css({ 'width': refWidth + 'px', 'right': rightPosition + 'px' }); console.log('✅ Panel dimensions updated:', { width: refWidth + 'px', right: rightPosition + 'px', reference: $reference.attr('id') }); } else { console.warn('⚠️ Could not get dimensions from reference element'); } // Restore trạng thái hidden nếu cần if (wasHidden) { $reference.hide().css('visibility', ''); } } else { console.warn('⚠️ No reference element found for panel dimensions'); } } function openPhanTichPanel(address, vbID) { console.log('openPhanTichPanel called with address:', address); console.log('Current state - isAnalyzing:', isAnalyzing, 'currentAnalyzingAddress:', currentAnalyzingAddress); // Kiểm tra nếu đang phân tích element khác if (isAnalyzing && currentAnalyzingAddress && currentAnalyzingAddress !== address) { const currentName = getElementDisplayName(currentAnalyzingAddress); console.warn('Already analyzing:', currentAnalyzingAddress, 'Cannot analyze:', address); showWarningModal('Vui lòng chờ phân tích ' + currentName + ' hoàn tất...'); return; } // Nếu đang phân tích cùng element → không làm gì if (isAnalyzing && currentAnalyzingAddress === address) { console.log('Already analyzing this element, ignoring duplicate request'); return; } // Panel sẽ fixed position append vào body const $rightdocinfo = $('#rightdocinfo'); // KHÔNG ẨN CTTD pointer - cho phép CTTD và panel cùng tồn tại console.log('Panel opening, CTTD pointer can stay visible'); // ẨN rightdocinfo để tiết kiệm không gian if ($rightdocinfo.length > 0) { $rightdocinfo.hide(); console.log('Hidden rightdocinfo to save space'); } // XÓA highlight persistent của TẤT CẢ elements cũ trước $('#tab_noi_dung_vb .highlight-border-persistent').removeClass('highlight-border-persistent'); console.log('Removed all previous highlight-border-persistent'); // Tìm element đang được phân tích và badge của nó const $element = $('[address="' + address + '"]'); const $badge = $element.find('.badge-phan-tich-container[data-for="' + address + '"]').first(); // Set state isAnalyzing = true; currentAnalyzingAddress = address; currentAnalyzingElement = $element; currentAnalyzingBadge = $badge; console.log('State set:', { isAnalyzing: isAnalyzing, currentAnalyzingAddress: currentAnalyzingAddress, elementFound: $element.length > 0, badgeFound: $badge.length > 0 }); // Thêm highlight persistent cho element MỚI này $element.addClass('highlight-border-persistent'); // Thay đổi badge thành "Đang phân tích..." và giữ hiển thị if ($badge.length > 0) { $badge.text('Đang phân tích...').addClass('analyzing'); // Giữ badge hiển thị và ở đúng vị trí $badge.data('analyzing', true); $badge.data('hovering', true); // Prevent auto-hide console.log('Badge set to analyzing state'); // Đảm bảo badge hiển thị ở đúng vị trí (vì dùng position: fixed) showPhanTichBadgeForParent($element); } // Tạo panel nếu chưa có - fixed position append vào body if ($('#phanTichPanel').length === 0) { const panelHTML = `
    Phân tích điều luật
    Đang phân tích...

    Đang phân tích...

    `; // Append vào body (fixed position không cần container cụ thể) $('body').append(panelHTML); // Detect width từ rightdocinfo và áp dụng cho panel updatePanelDimensions(); // Trigger show và set flag setTimeout(() => { $('#phanTichPanel').addClass('show'); isPanelOpen = true; console.log('✅ Panel opened (fixed position), isPanelOpen = true'); }, 10); } else { $('#phanTichPanelBody').html(`
    Đang phân tích...

    Đang phân tích...

    `); // Update dimensions khi re-open updatePanelDimensions(); $('#phanTichPanel').addClass('show'); isPanelOpen = true; console.log('✅ Panel re-opened (fixed position), isPanelOpen = true'); } // Bind nút đóng và ESC $(document).off('click.closePhanTich').on('click.closePhanTich', '.close-phan-tich', function() { closePhanTichPanel(); }); $(document).off('keyup.closePhanTich').on('keyup.closePhanTich', function(e) { if (e.key === 'Escape') closePhanTichPanel(); }); // Bind nút refresh - phân tích lại $(document).off('click.refreshPhanTich').on('click.refreshPhanTich', '.btn-refresh-phan-tich', function(e) { e.preventDefault(); e.stopPropagation(); const $btn = $(this); const $icon = $btn.find('i'); // Disable button và thêm animation $btn.prop('disabled', true); $icon.addClass('fa-spin'); console.log('🔄 Refresh: Phân tích lại address:', address); // Show loading trong panel $('#phanTichPanelBody').html(`
    Đang phân tích lại...

    Đang xóa cache và phân tích lại...

    `); // Gọi API xóa cache trước deletePhanTichCache(address, vbID, function(deleteSuccess) { if (deleteSuccess) { console.log('✅ Cache deleted, now re-analyzing...'); // Sau khi xóa cache, gọi lại API phân tích callPhanTichAPI(address, vbID, function() { // Enable lại button $btn.prop('disabled', false); $icon.removeClass('fa-spin'); }); } else { console.error('❌ Failed to delete cache'); $('#phanTichPanelBody').html(` `); $btn.prop('disabled', false); $icon.removeClass('fa-spin'); } }); }); // Gọi API phân tích (dùng function helper) callPhanTichAPI(address, vbID); } // Helper: Gọi API phân tích (tách riêng để dùng lại) function callPhanTichAPI(address, vbID, callback) { const randomServer = Math.floor(Math.random() * 10) + 1; $.ajax({ url: '//tnpl' + randomServer + '.hethongphapluat.com/tien-ich/phan.tich.dieu.luat.php', type: 'POST', contentType: 'application/json', timeout: 300000, // 5 phút data: JSON.stringify({ address: address, vb_id: vbID }), success: function(response) { console.log('Analysis complete for:', address, response); // Reset badge về trạng thái bình thường (nhưng vẫn hiển thị) if (currentAnalyzingBadge) { currentAnalyzingBadge.text('Phân tích').removeClass('analyzing'); currentAnalyzingBadge.data('analyzing', false); console.log('Badge reset to normal state'); } // Reset state analyzing để có thể phân tích element khác isAnalyzing = false; console.log('State reset: isAnalyzing = false, can analyze other elements now'); if (response.ok) { // Render kết quả phân tích let html = ''; html += '
    '; html += '
    ' + escapeHtml(response.ten_van_ban) + '
    '; if (response.so_hieu) { html += 'Số hiệu: ' + escapeHtml(response.so_hieu) + '
    '; } html += 'Điều khoản: ' + escapeHtml(response.address) + ''; if (response.from_cache) { html += ' Cache'; } html += '
    '; html += '
    ' + markdownToHtml(response.phan_tich) + '
    '; if (response.usage) { html += '
    '; html += 'Thống kê: '; html += 'Input tokens: ' + (response.usage.promptTokenCount || 0) + ', '; html += 'Output tokens: ' + (response.usage.candidatesTokenCount || 0); html += '
    '; } $('#phanTichPanelBody').html(html); } else { $('#phanTichPanelBody').html(` `); } if (callback) callback(); }, error: function(xhr, status, error) { console.error('Analysis error:', error); // Reset badge về trạng thái bình thường if (currentAnalyzingBadge) { currentAnalyzingBadge.text('Phân tích').removeClass('analyzing'); currentAnalyzingBadge.data('analyzing', false); } // Reset state analyzing isAnalyzing = false; let errorMsg = error; if (xhr.responseJSON && xhr.responseJSON.error) { errorMsg = xhr.responseJSON.error; } $('#phanTichPanelBody').html(` `); if (callback) callback(); } }); } // Helper: Xóa cache phân tích function deletePhanTichCache(address, vbID, callback) { const randomServer = Math.floor(Math.random() * 10) + 1; $.ajax({ url: '//tnpl' + randomServer + '.hethongphapluat.com/tien-ich/delete.phan.tich.cache.php', type: 'POST', contentType: 'application/json', timeout: 10000, data: JSON.stringify({ address: address, vb_id: vbID }), success: function(response) { console.log('Delete cache response:', response); if (callback) callback(response.ok || false); }, error: function(xhr, status, error) { console.error('Delete cache error:', error); if (callback) callback(false); } }); } // Helper: Lấy tên hiển thị của element từ address function getElementDisplayName(address) { if (!address) return 'nội dung'; const $element = $('[address="' + address + '"]'); if ($element.length === 0) return address; // Parse address: vd "dieu_3_khoan_29" -> "Khoản 29 Điều 3" // Address format: lớn đến nhỏ (phan > chuong > muc > dieu > khoan > diem) const parts = address.split('_'); const displayParts = []; for (let i = 0; i < parts.length; i += 2) { if (i + 1 < parts.length) { const type = getParentTypeName(parts[i]); const num = parts[i + 1]; displayParts.push(type + ' ' + num); } } // Reverse để hiển thị từ nhỏ đến lớn: "Khoản 29 Điều 3" (thay vì "Điều 3 Khoản 29") return displayParts.reverse().join(' '); } function openPhanTichModal(address, vbID) { // Tạo modal nếu chưa có if ($('#modalPhanTich').length === 0) { const modalHTML = ` `; $('body').append(modalHTML); } // Reset và hiển thị modal với loading $('#modalPhanTichBody').html(`
    Đang phân tích...

    Đang phân tích...

    `); $('#modalPhanTich').modal('show'); // AJAX request const randomServer = Math.floor(Math.random() * 10) + 1; $.ajax({ url: '//tnpl' + randomServer + '.hethongphapluat.com/tien-ich/phan.tich.dieu.luat.php', type: 'POST', contentType: 'application/json', data: JSON.stringify({ address: address, vb_id: vbID }), success: function(response) { if (response.ok) { // Render kết quả phân tích let html = ''; // Header thông tin văn bản html += '
    '; html += '
    ' + escapeHtml(response.ten_van_ban) + '
    '; if (response.so_hieu) { html += 'Số hiệu: ' + escapeHtml(response.so_hieu) + '
    '; } html += 'Điều khoản: ' + escapeHtml(response.address) + ''; html += '
    '; // Nội dung phân tích (Markdown -> HTML) html += '
    '; html += markdownToHtml(response.phan_tich); html += '
    '; // Thông tin usage (nếu có) if (response.usage) { html += '
    '; html += 'Thống kê: '; html += 'Input tokens: ' + (response.usage.promptTokenCount || 0) + ', '; html += 'Output tokens: ' + (response.usage.candidatesTokenCount || 0); html += '
    '; } $('#modalPhanTichBody').html(html); } else { $('#modalPhanTichBody').html(` `); } }, error: function(xhr, status, error) { let errorMsg = error; if (xhr.responseJSON && xhr.responseJSON.error) { errorMsg = xhr.responseJSON.error; } $('#modalPhanTichBody').html(` `); } }); } // Helpers: show/hide badge cho parent element (dieu, khoan,...) với position: fixed function showPhanTichBadgeForParent($parent) { // Lấy badge CỦA CHÍNH parent này (match data-for với address của parent) const parentAddress = $parent.attr('address'); const $badge = $parent.find('.badge-phan-tich-container[data-for="' + parentAddress + '"]').first(); if ($badge.length === 0) { console.warn('No badge found for parent:', parentAddress); return; } // Ẩn TẤT CẢ các badge khác để tránh overlap $('.badge-phan-tich-container').not($badge).each(function() { const $otherBadge = $(this); // Chỉ ẩn badge KHÔNG đang analyzing if (!$otherBadge.data('analyzing')) { $otherBadge.css({display: 'none'}); } }); // Show badge tạm để tính width $badge.css({display: 'inline-block', opacity: 0, visibility: 'hidden'}); const badgeWidth = $badge.outerWidth(); // Tính toán vị trí fixed dựa trên offset của parent const offset = $parent.offset(); const scrollTop = $(window).scrollTop(); const scrollLeft = $(window).scrollLeft(); // Position badge top-right của parent và show $badge.css({ display: 'inline-block', visibility: 'visible', opacity: 1, top: (offset.top - scrollTop) + 'px', left: (offset.left + $parent.outerWidth() - badgeWidth - scrollLeft - 5) + 'px' // -5px padding }); console.log('Showing badge for:', parentAddress, 'at position:', $badge.css('top'), $badge.css('left')); $parent.addClass('highlight-border'); } function hidePhanTichBadgeForParent($parent) { const $badge = $parent.find('.badge-phan-tich-container').first(); if ($badge.length === 0) return; $badge.css({display: 'none', opacity: 0}); $parent.removeClass('highlight-border'); } // Biến lưu element đang hover let currentHoveredElement = null; let hoverDebounceTimer = null; // Dùng mousemove để track chính xác element nào đang được hover $(document).on('mousemove', '#tab_noi_dung_vb', function(e) { // Tìm element gần nhất (phan, chuong, muc, dieu, khoan, diem) tại vị trí chuột const $target = $(e.target).closest('phan, chuong, muc, tieumuc, dieu, khoan, diem'); if ($target.length === 0) { // Không hover vào element nào return; } const address = $target.attr('address'); // Nếu đang hover vào cùng element → skip if (currentHoveredElement && currentHoveredElement[0] === $target[0]) { return; } // Clear debounce timer cũ if (hoverDebounceTimer) { clearTimeout(hoverDebounceTimer); } // Debounce để tránh trigger quá nhiều hoverDebounceTimer = setTimeout(function() { // Element thay đổi console.log('Hover changed to:', address); // Set flag hovering cho element mới $target.data('hovering', true); // Cancel timeout nếu có const timeoutId = $target.data('hideTimeout'); if (timeoutId) { clearTimeout(timeoutId); } // Ẩn badge của TẤT CẢ elements khác $('#tab_noi_dung_vb phan, #tab_noi_dung_vb chuong, #tab_noi_dung_vb muc, #tab_noi_dung_vb tieumuc, #tab_noi_dung_vb dieu, #tab_noi_dung_vb khoan, #tab_noi_dung_vb diem') .not($target) .each(function() { const $el = $(this); // Chỉ xóa highlight-border, KHÔNG xóa highlight-border-persistent $el.removeClass('highlight-border'); // Ẩn badge nếu KHÔNG đang analyzing const $badge = $el.find('.badge-phan-tich-container'); if ($badge.length && !$badge.data('analyzing')) { $badge.css({display: 'none'}); } }); // Attach badge nếu chưa có if (address && $target.find('.badge-phan-tich-container[data-for="' + address + '"]').length === 0) { const parentType = getParentTypeName($target.prop('tagName').toLowerCase()); const $badge = $('Phân tích'); console.log('Creating badge for address:', address, 'parentType:', parentType); $target.append($badge); $target.addClass('has-phan-tich-badge'); } // Show badge cho element này if ($target.find('.badge-phan-tich-container').length > 0) { showPhanTichBadgeForParent($target); } // Update current hovered element currentHoveredElement = $target; }, 50); // Debounce 50ms }); // Event delegation cho hover ra khỏi #tab_noi_dung_vb $(document).on('mouseleave', '#tab_noi_dung_vb', function(e) { // Clear current hovered element currentHoveredElement = null; // Ẩn tất cả badge không đang analyzing sau một khoảng thời gian setTimeout(function() { if (currentHoveredElement === null) { // Chỉ ẩn nếu thực sự không hover vào element nào $('#tab_noi_dung_vb phan, #tab_noi_dung_vb chuong, #tab_noi_dung_vb muc, #tab_noi_dung_vb tieumuc, #tab_noi_dung_vb dieu, #tab_noi_dung_vb khoan, #tab_noi_dung_vb diem') .each(function() { const $el = $(this); const $badge = $el.find('.badge-phan-tich-container'); if ($badge.length && !$badge.data('analyzing')) { $badge.css({display: 'none'}); } }); console.log('Mouse left tab_noi_dung_vb, hiding all badges'); } }, 300); }); // Event delegation cho hover ra khỏi parent (giữ lại cho badge behavior) $(document).on('mouseleave', '#tab_noi_dung_vb phan, #tab_noi_dung_vb chuong, #tab_noi_dung_vb muc, #tab_noi_dung_vb tieumuc, #tab_noi_dung_vb dieu, #tab_noi_dung_vb khoan, #tab_noi_dung_vb diem', function(e) { const $parent = $(this); const parentAddress = $parent.attr('address'); const $badge = $parent.find('.badge-phan-tich-container[data-for="' + parentAddress + '"]').first(); // Set flag parent not hovering $parent.data('hovering', false); // Nếu badge đang analyzing thì KHÔNG ẩn, GIỮ hiển thị if ($badge.length > 0 && $badge.data('analyzing')) { console.log('Badge is analyzing, keep visible'); return; } // Delay để có thời gian di chuột vào badge const timeoutId = setTimeout(() => { // Chỉ ẩn nếu cả parent và badge đều không hover và không analyzing if ($badge.length > 0 && !$parent.data('hovering') && !$badge.data('hovering') && !$badge.data('analyzing')) { hidePhanTichBadgeForParent($parent); } }, 300); // Tăng lên 300ms $parent.data('hideTimeout', timeoutId); }); // Hover vào badge → giữ hiển thị $(document).on('mouseenter', '.badge-phan-tich-container', function(e) { e.stopPropagation(); const $badge = $(this); const $parent = $badge.parent(); $badge.data('hovering', true); // Cancel timeout của parent const timeoutId = $parent.data('hideTimeout'); if (timeoutId) { clearTimeout(timeoutId); } }); // Hover ra khỏi badge → ẩn nếu không hover parent $(document).on('mouseleave', '.badge-phan-tich-container', function(e) { const $badge = $(this); $badge.data('hovering', false); const $parent = $badge.parent(); // Nếu badge đang analyzing thì KHÔNG ẩn, GIỮ hiển thị if ($badge.data('analyzing') || $badge.hasClass('analyzing')) { console.log('Badge is analyzing on mouseleave, keep visible'); return; } setTimeout(() => { // Chỉ ẩn nếu cả parent và badge đều không hover và không analyzing if (!$parent.data('hovering') && !$badge.data('hovering') && !$badge.data('analyzing') && !$badge.hasClass('analyzing')) { hidePhanTichBadgeForParent($parent); } }, 300); }); // Event delegation cho hover vào badge → hiện tooltip $(document).on('mouseenter', '.badge-phan-tich, .badge-phan-tich-container, .badge-phan-tich-fixed', function() { const $badge = $(this); const parentType = $badge.attr('data-parent-type') || 'Nội dung'; if ($badge.find('.badge-tooltip').length === 0) { const $tooltip = $('Phân tích chi tiết nội dung ' + parentType + ' này'); $badge.append($tooltip); setTimeout(() => $tooltip.addClass('show'), 10); } }); // Event delegation cho hover ra khỏi badge → ẩn tooltip $(document).on('mouseleave', '.badge-phan-tich, .badge-phan-tich-container, .badge-phan-tich-fixed', function() { const $tooltip = $(this).find('.badge-tooltip'); if ($tooltip.length > 0) { $tooltip.removeClass('show'); setTimeout(() => $tooltip.remove(), 300); } }); // Event delegation cho click badge → mở panel $(document).on('click', '.badge-phan-tich, .badge-phan-tich-container, .badge-phan-tich-fixed', function(e) { e.preventDefault(); e.stopPropagation(); const $badge = $(this); console.log('Badge clicked! Element:', $badge[0]); console.log('Badge parent:', $badge.parent().prop('tagName'), $badge.parent().attr('address')); console.log('Badge data-for:', $badge.attr('data-for')); console.log('Badge data-parent-type:', $badge.attr('data-parent-type')); // Nếu badge đang analyzing thì không cho click if ($badge.hasClass('analyzing') || $badge.data('analyzing')) { console.log('Badge is analyzing, click ignored'); return; } // Lấy address từ data-for attribute const address = $badge.attr('data-for'); console.log('Will analyze address:', address, 'vbID:', vbID); if (address && vbID) { openPhanTichPanel(address, vbID); } else { console.error('Missing address or vbID', {address, vbID}); showWarningModal('Không tìm thấy địa chỉ điều luật hoặc ID văn bản!'); } }); // Ẩn badge khi click vào CTTD $(document).on('click', 'cttd.chuthichtudong span, dctk span, dctd span', function(e) { console.log('CTTD clicked'); // Ẩn TẤT CẢ badge KHÔNG đang analyzing $('.badge-phan-tich-container').each(function() { const $badge = $(this); if (!$badge.data('analyzing') && !$badge.hasClass('analyzing')) { $badge.css({display: 'none'}); console.log('Hiding badge:', $badge.attr('data-for')); } }); }); // Update badge position khi scroll hoặc resize (vì dùng position: fixed) function updateBadgePositions() { $('.badge-phan-tich-container:visible').each(function() { const $badge = $(this); const $parent = $badge.parent(); // Cập nhật position nếu parent đang hover HOẶC badge đang analyzing if ($parent.length && ($parent.is(':hover') || $badge.data('analyzing'))) { // Re-calculate position const offset = $parent.offset(); const scrollTop = $(window).scrollTop(); const scrollLeft = $(window).scrollLeft(); const badgeWidth = $badge.outerWidth(); $badge.css({ top: (offset.top - scrollTop) + 'px', left: (offset.left + $parent.outerWidth() - badgeWidth - scrollLeft - 5) + 'px' }); } }); } $(window).on('scroll', updateBadgePositions); $(window).on('resize', updateBadgePositions); } });