Kính gửi: Các Sở Giáo dục và Đào tạo.
Căn cứ vào tình hình thực tế của địa phương, để triển khai hiệu quả nhiệm vụ, Bộ Giáo dục và Đào tạo (GDĐT) hướng dẫn các Sở GDĐT triển khai thực hiện nhiệm vụ năm học 2023-2024 đối với giáo dục tiểu học như sau:
A. NHIỆM VỤ CHUNG
1. Chủ động, tích cực, kịp thời trong công tác tham mưu và tổ chức triển khai nhiệm vụ năm học 2023 - 2024 bảo đảm an toàn trường học; thực hiện hiệu quả phân cấp quản lí gắn với trách nhiệm giải trình trong tổ chức thực hiện kế hoạch năm học theo quy định và phù hợp với thực tiễn tại địa phương.
2. Thực hiện hiệu quả Chương trình giáo dục phổ thông cấp tiểu học ban hành kèm theo Thông tư số 32/2018/TT-BGDĐT ngày 26/12/2018 của Bộ trưởng Bộ GDĐT (Chương trình giáo dục phổ thông 2018) đối với lớp 1, lớp 2, lớp 3, lớp 4 và Chương trình giáo dục phổ thông cấp tiểu học ban hành theo Quyết định số 16/2006/QĐ-BGDĐT ngày 05/5/2006 (Chương trình giáo dục phổ thông 2006) đối với lớp 5.
3. Tiếp tục nâng cao chất lượng đội ngũ giáo viên và cán bộ quản lí; thực hiện xây dựng kế hoạch tuyển dụng, đào tạo, bồi dưỡng và tự bồi dưỡng để có đủ giáo viên, bảo đảm chất lượng dạy học các môn học, hoạt động giáo dục theo Chương trình giáo dục phổ thông cấp tiểu học.
4. Chú trọng thực hiện quy hoạch phát triển mạng lưới trường, lớp và đảm bảo cơ sở vật chất, thiết bị dạy học; duy trì, nâng cao chất lượng phổ cập giáo dục tiểu học và thực hiện giáo dục tiểu học là giáo dục bắt buộc theo quy định của Luật Giáo dục 2019.
5. Chú trọng đổi mới công tác quản lí, quản trị trường họcB. NHIỆM VỤ CỤ THỂ
I. Thực hiện Chương trình giáo dục phổ thông
1. Thực hiện các giải pháp bảo đảm an toàn trường học
Duy trì vệ sinh môi trường trong trường học và các phương án bảo đảm sức khỏe cho học sinh, nhân viên, giáo viên, cán bộ quản lí; chủ động các phương án tổ chức dạy học linh hoạt, phù hợp với học sinh và điều kiện thực tiễn, đề phòng trường hợp xảy ra thiên tai, dịch bệnh tại địa phương, nhà trường trên cơ sở đánh giá tổng kết, rút kinh nghiệm từ các năm học trước.
Tiếp tục tổ chức triển khai có hiệu quả các nhiệm vụ về giáo dục đạo đức, lối sống, kĩ năng sống cho học sinh; công tác bảo đảm môi trường giáo dục an toàn, lành mạnh, thân thiện, phòng chống bạo lực học đường.
2. Thực hiện chương trình, kế hoạch giáo dục
a) Xây dựng kế hoạch giáo dục của nhà trường để chủ động, linh hoạt thực hiện và hoàn thành chương trình năm học
Sở GDĐT chỉ đạo các cơ sở giáo dục tổ chức xây dựng kế hoạch giáo dục của nhà trường, kế hoạch dạy học các môn học, hoạt động giáo dục và kế hoạch bài dạy theo quy địnhb) Thực hiện chương trình giáo dục phổ thông
*) Đối với lớp 1, lớp 2, lớp 3 và lớp 4
Sở GDĐT chỉ đạo các cơ sở giáo dục thực hiện Chương trình giáo dục phổ thông 2018 đối với lớp 1, lớp 2, lớp 3 và lớp 4 theo các văn bản hướng dẫn chuyên môn về giáo dục tiểu học đã được Bộ GDĐT ban hành- Bảo đảm tỷ lệ 01 phòng học/lớp, cơ sở vật chất, sĩ số học sinh/lớp theo quy định tại Điều lệ trường tiểu học; có đủ thiết bị dạy học tối thiểu theo quy định - Thực hiện dạy học các môn học và hoạt động giáo dục bắt buộc - Tổ chức dạy học 2 buổi/ngày, mỗi ngày bố trí không quá 7 tiết học, mỗi tiết 35 phút; thực hiện kế hoạch dạy học tối thiểu 9 buổi/tuần với 32 tiết/tuần; kế hoạch giáo dục bảo đảm phân bổ hợp lí giữa các nội dung giáo dục, giúp học sinh hoàn thành nhiệm vụ học tập, yêu cầu cần đạt của chương trình; tạo điều kiện cho học sinh được học tập các môn học tự chọn và tham gia các hoạt động giáo dục nhằm thực hiện mục tiêu giáo dục toàn diện ở tiểu học; thời khóa biểu cần được sắp xếp một cách khoa học, bảo đảm tỷ lệ hợp lí giữa các nội dung dạy học và hoạt động giáo dục, phân bổ hợp lí về thời lượng, thời điểm trong ngày học và tuần học phù hợp với tâm sinh lí lứa tuổi học sinh tiểu học.
- Đối với cơ sở giáo dục tiểu học chưa đủ điều kiện tổ chức dạy học 2 buổi/ngày, trên cơ sở dạy học đúng, đủ nội dung và thời lượng các môn học bắt buộc theo quy định của chương trình, cơ sở giáo dục tiểu học chủ động xác định nội dung, lựa chọn hình thức tổ chức, phân bổ thời lượng phù hợp cho môn học tự chọn- Xây dựng kế hoạch tổ chức bán trú với nội dung, hình thức phù hợp điều kiện thực tế, có sự thống nhất, tự nguyện của học sinh, cha mẹ học sinh và theo các quy định, hướng dẫn của cơ quan quản lí; các hoạt động bán trú được tổ chức trong khoảng thời gian từ sau giờ học buổi sáng đến trước khi bắt đầu giờ học buổi chiều, thông qua hoạt động bán trú góp phần rèn luyện học sinh về kĩ năng sống, các năng lực, phẩm chất cần thiết, tính kỷ luật, tự phục vụ, trách nhiệm, chia sẻ, yêu thương; việc tổ chức hoạt động bán trú cần linh hoạt, có thể bao gồm các hoạt động: tổ chức ăn trưa, ngủ trưa, vui chơi, giải trí,...cho học sinh; tổ chức ăn trưa, bán trú phải bảo đảm các quy định về an toàn, vệ sinh thực phẩm, bảo đảm dinh dưỡng, sức khỏe cho học sinh.
- Tổ chức các hoạt động cho học sinh ngoài giờ học chính thức trong ngày là hoạt động theo nhu cầu, sở thích của học sinh trong khoảng thời gian từ sau giờ học chính thức cho đến thời điểm được cha mẹ học sinh đón về nhà; căn cứ vào nhu cầu, sở thích của học sinh, có thể tổ chức các hoạt động dưới hình thức sinh hoạt câu lạc bộ hoặc sử dụng cơ sở vật chất của nhà trường (thư viện, sân chơi, bãi tập, nhà đa năng...) tạo điều kiện để học sinh vui chơi, giải trí; việc tổ chức hoạt động sau giờ học chính thức trong ngày dưới hình thức sinh hoạt câu lạc bộ cần được cấp có thẩm quyền phê duyệt.
*) Đối với lớp 5
Trên cơ sở Chương trình giáo dục phổ thông 2006, các Sở GDĐT, Phòng GDĐT giao quyền chủ động cho các cơ sở giáo dục tiểu học xây dựng và thực hiện kế hoạch giáo dục đối với lớp 5 theo định hướng phát triển phẩm chất, năng lực học sinh để đáp ứng yêu cầu đổi mới chương trình giáo dục phổ thông- Thực hiện điều chỉnh nội dung dạy học một cách hợp lí nhằm đáp ứng yêu cầu, mục tiêu giáo dục tiểu học, phù hợp với đối tượng học sinh các vùng miền, địa phương, đồng thời từng bước thực hiện đổi mới nội dung, phương pháp dạy học theo hướng phát triển phẩm chất, năng lực của học sinh trên nguyên tắc: bảo đảm yêu cầu chuẩn kiến thức, kĩ năng và phù hợp điều kiện thực tế; rà soát, tinh giản những nội dung chồng chéo, trùng lặp giữa các môn học, giữa các khối lớp trong cấp học và các nội dung chưa thực sự cấp thiết đối với học sinh tiểu học; sắp xếp, điều chỉnh nội dung dạy học theo các chủ đề học tập phù hợp với đối tượng học sinh; không cắt xén cơ học mà tập trung vào đổi mới phương pháp dạy học, đổi mới cách thức tổ chức các hoạt động giáo dục sao cho nhẹ nhàng, tự nhiên, hiệu quả nhằm phát huy tính tích cực, chủ động, sáng tạo của học sinh; tạo điều kiện cho học sinh được học tập các môn học tự chọn và tham gia các hoạt động giáo dục nhằm thực hiện mục tiêu giáo dục toàn diện ở tiểu học.
- Tổ chức dạy học cho học sinh lớp 5 để học sinh được chuẩn bị học lớp 6 theo Chương trình giáo dục phổ thông 20183. Tổ chức dạy học các môn Ngoại ngữ 1, Tin học theo Chương trình giáo dục phổ thông cấp tiểu học
a) Tổ chức dạy học các môn Ngoại Ngữ 1
- Đối với lớp 1 và lớp 2: tiếp tục triển khai Chương trình môn tiếng Anh tự chọn bảo đảm các yêu cầu được quy định trong Chương trình giáo dục phổ thông 2018- Đối với lớp 3 và lớp 4: triển khai thực hiện các giải pháp để tổ chức dạy học môn Ngoại ngữ 1 bắt buộc; lựa chọn một trong các môn Ngoại ngữ 1 đã có đủ điều kiện triển khai (đã được Bộ GDĐT phê duyệt danh mục SGK) phù hợp với khả năng tổ chức của các cơ sở giáo dục, nhu cầu học sinh và của cha mẹ học sinh, bảo đảm tính liên thông và theo các yêu cầu được quy định trong chương trình các môn ngoại ngữ và các văn bản chỉ đạo của Bộ GDĐT- Đối với lớp 5: tiếp tục triển khai Chương trình Tiếng Anh tự chọn theo Chương trình giáo dục phổ thông 2006 hoặc Chương trình thí điểm Tiếng Anh cấp tiểu họcKhuyến khích các cơ sở giáo dục thực hiện xã hội hóa theo tinh thần tự nguyện trong dạy học ngoại ngữ để tăng cường thời lượng học; dạy học ngoại ngữ qua các chủ đề Toán và Khoa học; dạy học một số môn học bằng tiếng nước ngoài b) Tổ chức dạy học môn Tin học
- Tổ chức dạy học môn Tin học bắt buộc cho 100% học sinh lớp 3, lớp 4 theo yêu cầu được quy định trong Chương trình giáo dục phổ thông 2018; triển khai thực hiện các giải pháp để tổ chức dạy học môn Tin học theo hướng dẫn của Bộ GDĐT- Tổ chức thực hiện các hoạt động giáo dục tin học, giáo dục kĩ năng công dân số cho học sinh theo hướng dẫn của Bộ GDĐT - Thực hiện các giải pháp phù hợp để tăng số lượng trường, lớp, học sinh lớp 5 được học môn Tin học tự chọn theo Chương trình giáo dục phổ thông 2006, khi thực hiện cần có những giải pháp tiếp cận Chương trình môn Tin học trong Chương trình giáo dục phổ thông 2018 một cách linh hoạt, phù hợp trên cơ sở tinh giản Chương trình giáo dục phổ thông 2006 đối với môn Tin học tạo điều kiện tốt nhất cho học sinh tiếp cận, học tập môn Tin học ở lớp 6.
4. Thực hiện hiệu quả tổ chức dạy học môn học Tiếng dân tộc thiểu số
Tổ chức thực hiện dạy học tiếng dân tộc thiểu số theo Nghị định số 82/2010/NĐ-CP5. Thực hiện biên soạn, thẩm định, dạy học nội dung giáo dục “Địa phương em” và tổ chức dạy học giáo dục địa phương theo Chương trình giáo dục phổ thông 2018
- Sở GDĐT tham mưu Ủy ban nhân dân (UBND) tỉnh chỉ đạo tổ chức biên soạn, thẩm định và triển khai mạch nội dung giáo dục “Địa phương em” theo hướng dẫn của Bộ GDĐT- Trong trường hợp biên soạn mạch nội dung giáo dục “Địa phương em” tích hợp vào tài liệu giáo dục địa phương lớp 4 cần tập trung xây dựng một số chủ đề đáp ứng yêu cầu cần đạt của hai mạch kiến thức (gồm Thiên nhiên và con người địa phương; Lịch sử và văn hóa truyền thống địa phương) theo quy định của Chương trình giáo dục phổ thông 2018 đối với môn Lịch sử và Địa lí lớp 4. Tránh dàn trải nhiều chủ đề trong tài liệu giáo dục địa phương gây khó khăn cho việc tổ chức dạy học và trong công tác quản lí.
- Hướng dẫn các cơ sở giáo dục thực hiện tổ chức dạy học mạch nội dung giáo dục “Địa phương em” phù hợp với thực tiễn của địa phương và phải được thực hiện trước khi tổ chức dạy học các nội dung khác của mạch nội dung “Địa phương và các vùng miền của Việt Nam” theo quy định của Chương trình giáo dục phổ thông 2018 và sách giáo khoa được lựa chọn đối với môn Lịch sử và Địa lí lớp 4.
6. Triển khai giáo dục STEM
Tổ chức thực hiện giáo dục STEM tiếp cận theo định hướng của Chương trình giáo dục phổ thông 2018 theo hướng dẫn của Bộ GDĐT- Đối với các tỉnh, thành phố đã tham gia thí điểm năm học 2022-2023 (gồm: Hà Nội, Lào Cai, Nam Định, Thừa Thiên Huế, Đắk Lắk, Cần Thơ và Đồng Tháp) cần xây dựng kế hoạch, tổ chức hội nghị tập huấn, triển khai thực hiện đến tất cả các cơ sở giáo dục tiểu học trên địa bàn bảo đảm chất lượng và yêu cầu theo quy định.
- Đối với các tỉnh, thành phố còn lại xây dựng kế hoạch triển khai theo lộ trình từng giai đoạn trên địa bàn, mỗi tỉnh chọn ít nhất 05 đơn vị cấp huyện, mỗi đơn vị cấp huyện chọn ít nhất 05 cơ sở giáo dục tiểu học để tổ chức tập huấn, hướng dẫn các nhà trường xây dựng kế hoạch triển khai thực hiện, tổ chức hội nghị chuyên đề, đánh giá, sơ kết, tổng kết rút kinh nghiệm.
- Tăng cường tham mưu UBND tỉnh chỉ đạo các sở, ngành, địa phương cấp huyện quan tâm bố trí nguồn kinh phí, trang bị cơ sở vật chất để bảo đảm thực hiện hiệu quả giáo dục STEM trong các cơ sở giáo dục tiểu học trên địa bàn phù hợp với điều kiện của địa phương theo quy định; thực hiện hiệu quả công tác tuyên truyền, nâng cao nhận thức của cán bộ quản lí, giáo viên, cha mẹ học sinh, học sinh về vai trò của giáo dục STEM. Trong quá trình triển khai thực hiện tại địa phương cần hướng dẫn giáo viên sử dụng hiệu quả nguồn học liệu tại địa chỉ website https://stemtieuhoc.edu.vn và tổ chức lựa chọn tài liệu, các nguồn học liệu khác theo quy định7. Nâng cao hiệu quả phương pháp, hình thức tổ chức dạy học và phương pháp, hình thức đánh giá
a) Thực hiện linh hoạt các phương pháp và hình thức tổ chức dạy học
Thực hiện linh hoạt phương pháp, hình thức tổ chức dạy học theo hướng phát triển phẩm chất, năng lực của học sinh; vận dụng phù hợp những thành tố tích cực của các mô hình, phương thức giáo dục tiên tiến nhằm nâng cao chất lượng, hiệu quả giáo dục, đặc biệt là đổi mới tổ chức hoạt động giáo dục trên lớp học; tăng cường tổ chức thực hành trải nghiệm, tích hợp nội dung giáo dục địa phương, vận dụng kiến thức vào thực tế cuộc sống.
Tiếp tục áp dụng một cách phù hợp mô hình trường học mớib) Thực hiện hiệu quả các phương pháp và hình thức đánh giá
Đối với học sinh lớp 5 tiếp tục được đánh giá theo quy định tại Thông tư số 30/2014/TT-BGDĐT và Thông tư số 22/2016/TT-BGDĐTThực hiện nghiêm túc bàn giao kết quả giáo dục cuối năm học, phù hợp với từng nhóm đối tượng, kiên quyết không để học sinh “ngồi nhầm lớp”; thực hiện khen thưởng học sinh thực chất, đúng quy định, tránh khen tràn lan gây bức xúc cho cha mẹ học sinh và dư luận xã hội.
Tiếp tục tổ chức tập huấn, hướng dẫn các giáo viên về hình thức tổ chức, phương pháp đánh giá thường xuyên; biên soạn đề và tổ chức thực hiện bài kiểm tra định kỳ cho các môn học theo Thông tư số 27/2020/TT-BGDĐT và Quyết định số 2904/QĐ-BGDĐT ngày 07/10/2022.
II. Thực hiện quy hoạch phát triển mạng lưới trường, lớp; củng cố, nâng cao chất lượng phổ cập giáo dục và thực hiện công bằng trong tiếp cận giáo dục
1. Rà soát, quy hoạch hợp lí mạng lưới trường, lớp
Triển khai rà soát, sắp xếp, tổ chức lại các cơ sở giáo dục tiểu học theo hướng dẫn của Bộ GDĐTKhi thực hiện quy hoạch, dồn ghép trường, lớp cần ưu tiên thực hiện dồn ghép các trường tiểu học có quy mô nhỏ với nhau bảo đảm thực hiện đúng quy định của Điều lệ trường tiểu học; có thể bố trí điểm trường để tạo điều kiện thuận lợi cho người học (có thể thành lập trường tiểu học liên xã, liên phường) không thành lập trường liên cấp Mầm non - Tiểu học.
Đối với các trường liên cấp Tiểu học - Trung học cơ sở cần bảo đảm quy định tiêu chuẩn cơ sở vật chất các trường phổ thông có nhiều cấp học2. Củng cố, nâng cao chất lượng phổ cập giáo dục và bảo đảm hiệu quả công tác kiểm định chất lượng giáo dục, xây dựng trường đạt chuẩn quốc gia
a) Củng cố, nâng cao chất lượng phổ cập giáo dục
Tiếp tục tham mưu Tỉnh ủy, Hội đồng nhân dân tỉnh, UBND tỉnh quan tâm chỉ đạo thực hiện hiệu quả công tác phổ cập giáo dục, xoá mù chữ theo các quy định của Chính phủb) Thực hiện hiệu quả công tác kiểm định chất lượng giáo dục và xây dựng trường đạt chuẩn quốc gia
Tiếp tục thực hiện kiểm định chất lượng giáo dục và kiểm tra công nhận trường tiểu học đạt chuẩn quốc gia theo quy định của Bộ GDĐT3. Triển khai các giải pháp tăng cường tiếng Việt cho học sinh dân tộc thiểu số và dạy học tiếng Việt cho trẻ em là người dân tộc thiểu số trước khi vào lớp 1
a) Tăng cường tiếng Việt cho học sinh vùng dân tộc thiểu số
Tiếp tục thực hiện kế hoạch triển khai Đề án “Tăng cường tiếng Việt cho trẻ em mầm non, học sinh tiểu học vùng dân tộc thiểu số giai đoạn 2016-2020, định hướng đến 2025”b) Tổ chức dạy học tiếng Việt cho trẻ em là người dân tộc thiểu số trước khi vào lớp 1
Chỉ đạo, hướng dẫn các cơ sở giáo dục thực hiện chương trình giáo dục tiểu học xây dựng kế hoạch và tổ chức thực hiện dạy học tiếng Việt cho trẻ em là người dân tộc thiểu số trước khi vào lớp 1 theo quy định của Bộ GDĐT. Tổ chức tập huấn cho cán bộ quản lí, giáo viên về nội dung, phương pháp dạy và học tiếng Việt cho trẻ là người dân tộc thiểu số trước khi vào lớp 1 để thực hiện chuẩn bị tâm thế và kĩ năng học tập cho trẻ em là người dân tộc thiểu số trước khi vào lớp 1.
4. Thực hiện giáo dục đối với trẻ khuyết tật, trẻ em có hoàn cảnh khó khăn
a) Đối với trẻ khuyết tật
Mở rộng quy mô, nâng cao chất lượng giáo dục đối với trẻ khuyết tật, xây dựng, tổ chức triển khai thực hiện Kế hoạch giáo dục người khuyết tật tại địa phương theo Luật Người khuyết tật 2010 và các văn bảnTích cực tham mưu UBND tỉnh chỉ đạo thành lập Trung tâm hỗ trợ phát triển giáo dục hòa nhập, Phòng hỗ trợ giáo dục hòa nhập nhằm thúc đẩy công tác giáo dục hòa nhập ở địa phương bảo đảm quyền được học, được tiếp cận với giáo dục đối với trẻ em khuyết tật.
b) Đối với trẻ em lang thang cơ nhỡ
Chỉ đạo các cơ sở giáo dục phối hợp với các tổ chức, cá nhân có liên quan tổ chức các lớp học linh hoạt cho trẻ em lang thang, cơ nhỡ theo kế hoạch dạy học và thời khoá biểu được điều chỉnh phù hợp với đối tượng học sinh và điều kiện của địa phương. Nội dung học tập cần tập trung vào các môn Toán, Tiếng Việt nhằm rèn kĩ năng đọc, viết và tính toán cho học sinh. Căn cứ số lượng trẻ có thể tổ chức thành các lớp cùng trình độ hoặc các lớp ghép không quá hai trình độ. Đánh giá học sinh có hoàn cảnh khó khăn thực hiện theo quy định hiện hành và căn cứ vào mức độ đạt được so với nội dung và yêu cầu đã được điều chỉnh theo quy định5. Thực hiện hiệu quả lớp học linh hoạt, lớp ghép
Căn cứ số lượng học sinh, điều kiện từng trường, từng địa phương các cơ sở giáo dục dựa vào kết quả đánh giá năng lực, trình độ và khả năng tiếp thu của học sinh tổ chức các lớp học linh hoạt, lớp ghép để thực hiện các hoạt động dạy học phù hợp với đối tượng. Tại các địa bàn khó khăn để bảo đảm quyền lợi và thuận lợi học tập của học sinh có thể tổ chức dạy học lớp ghép, trong quá trình tổ chức dạy học tại các lớp ghép phải bảo đảm thực hiện theo hướng dẫn của Bộ GDĐT tại Công văn số 533 5/BGDĐT-GDTHIII. Củng cố và tăng cường các điều kiện bảo đảm chất lượng giáo dục
1. Củng cố và phát triển đội ngũ giáo viên và cán bộ quản lí giáo dục
a) Thực hiện tuyển dụng và linh hoạt các giải pháp bố trí, sử dụng giáo viên
Tham mưu UBND tỉnh tổ chức tuyển dụng giáo viên, thực hiện rà soát, bố trí, sử dụng giáo viên bảo đảm đủ giáo viên dạy đúng, đủ các môn học theo quy định; khắc phục tình trạng thiếu hoặc bố trí, sử dụng giáo viên không phù hợp với chuyên ngành đào tạo đối với cấp tiểu học; thực hiện phương án điều chuyển, biệt phái giáo viên từ nơi thừa sang nơi thiếu; thực hiện các giải pháp để bảo đảm có đủ giáo viên dạy học các môn Tiếng Anh, môn Tin học theo hướng dẫn của Bộ GDĐTĐối với các trường liên cấp Tiểu học-Trung học cơ sở cần thực hiện biên chế cán bộ quản lí, giáo viên, nhân viên bảo đảm cơ cấu, thành phần, số lượng theo các quy định b) Nâng cao năng lực đội ngũ giáo viên và cán bộ quản lí giáo dục
Xây dựng đội ngũ cán bộ quản lí và giáo viên cốt cán các môn học để triển khai bồi dưỡng tại địa phương theo phương thức bồi dưỡng trực tuyến, thường xuyên, liên tục, ngay tại trường; gắn nội dung bồi dưỡng thường xuyên với nội dung sinh hoạt tổ, nhóm chuyên môn trong trường và cụm trường để nâng cao năng lực nghề nghiệp giáo viên; tiếp tục triển khai hiệu quả công tác đánh giá và bồi dưỡng thường xuyên theo chuẩn nghề nghiệp giáo viên và chuẩn hiệu trưởng cơ sở giáo dục phổ thông.
Tổ chức sinh hoạt chuyên môn và hướng dẫn giáo viên trong tổ, nhóm chuyên môn tham gia cùng xây dựng kế hoạch cá nhân, kịp thời phát hiện thuận lợi, khó khăn và đề xuất những biện pháp giải quyết khó khăn về chuyên môn, nghiệp vụ khi thực hiện chương trình, sách giáo khoa mới. Chỉ đạo các cơ sở giáo dục dự kiến phân công giáo viên dạy học lớp 5 năm học 2024-2025 để tập trung bồi dưỡng để sẵn sàng thực hiện Chương trình giáo dục phổ thông 2018.
2. Tăng cường cơ sở vật chất và thiết bị dạy học
a) Bảo đảm các điều kiện về cơ sở vật chất, thiết bị dạy học
Chủ động tham mưu UBND tỉnh thực hiện rà soát quy hoạch, phát triển mạng lưới cơ sở giáo dục tiểu học bảo đảm phù hợp với thực tiễn, có các biện pháp, phương án cụ thể giải quyết vấn đề trường, lớp tại từng địa bàn, đáp ứng nhu cầu đến trường của học sinh và không để tình trạng gây bức xúc trong nhân dân; bảo đảm học sinh tiểu học được học 2 buổi/ngày.
Tăng cường tham mưu Hội đồng nhân dân tỉnh, UBND tỉnh cân đối, bố trí ngân sách phù hợp cho đầu tư cơ sở vật chất, thực hiện mua sắm thiết bị dạy học để thực hiện hiệu quả chương trình, sách giáo khoa giáo dục phổ thông cấp tiểu học theo quy định của Bộ GDĐT. Chỉ đạo các cơ sở giáo dục thực hiện mua sắm thiết bị, đồ dùng dạy học theo đúng quy định, bảo đảm có đủ thiết bị đồ dùng dạy học tối thiểu đáp ứng yêu cầu đổi mới giáo dục; sử dụng hiệu quả cơ sở vật chất, thiết bị, đồ dùng dạy học hiện có. Vào đầu năm học yêu cầu các cơ sở giáo dục công khai danh mục, thiết bị đồ dùng dạy học hiện có của nhà trường, chỉ đạo tổ chuyên môn xây dựng kế hoạch sử dụng thiết bị dạy học trong quá trình tổ chức các hoạt động dạy học, tăng cường công tác kiểm tra việc sử dụng thiết bị đồ dùng dạy học với mục tiêu kiên quyết không để tình trạng “thiết bị đến trường mà không ra lớp”; rà soát nhu cầu và có kế hoạch bổ sung đủ thiết bị dạy học tối thiểu để thực hiện Chương trình giáo dục phổ thông 2018 theo lộ trình quy địnhb) Tổ chức lựa chọn, triển khai sách giáo khoa lớp 5
Tham mưu UBND tỉnh tổ chức thực hiện việc lựa chọn sách giáo khoa lớp 5 theo quy địnhc) Nâng cao hoạt động của thư viện trường học
Tiếp tục chỉ đạo các Phòng GDĐT và các nhà trường chủ động triển khai hiệu quả, thiết thực các hoạt động thư viện, hoạt động khuyến đọc; nâng cao văn hóa đọc trong nhà trường và địa phương; sắp xếp bố trí nhân viên thư viện đúng chuyên môn làm công tác thiết lập và vận hành thư viện; tăng cường tập huấn, bồi dưỡng nâng cao năng lực cho giáo viên và nhân viên thư viện về công tác tổ chức hoạt động đọc cho học sinh; dành thời lượng phù hợp cho tiết đọc thư viện; đầu tư cơ sở vật chất, phương tiện kĩ thuật, học liệu và tăng cường ứng dụng công nghệ thông tin trong công tác quản lí và tổ chức hoạt động thư viện, đặc biệt là phát triển thư viện số, thư viện trực tuyến; huy động sự tham gia của cha mẹ học sinh và cộng đồng trong quá trình tổ chức hoạt động nhằm góp phần xây dựng văn hóa đọc trong nhà trường và cộng đồng.
Nghiên cứu, nhân rộng mô hình thư viện thân thiện trường tiểu học phù hợp với điều kiện thực tế của địa phương. Triển khai hiệu quả các văn bản3. Tăng cường chuyển đổi số trong giáo dục và đào tạo và giáo dục kĩ năng công dân số
a) Tăng cường ứng dụng công nghệ thông tin và chuyển đổi số trong giáo dục và đào tạo
Chủ động xây dựng kế hoạch triển khai thực hiện Đề án “Tăng cường ứng dụng công nghệ thông tin và chuyển đổi số trong giáo dục và đào tạo giai đoạn 2022 - 2025, định hướng đến năm 2030”Tăng cường đầu tư cơ sở vật chất, thiết bị dạy học, tập huấn sử dụng cho đội ngũ giáo viên bảo đảm tỉ trọng nội dung chương trình giáo dục phổ thông được triển khai dưới hình thức trực tuyến (tổ chức các tiết dạy học, các hoạt động giáo dục, tập huấn, bồi dưỡng, sinh hoạt chuyên môn, hội thảo chuyên môn... bằng hình thức trực tuyến) đạt từ 2% đến 5% ở cấp tiểu học; khuyến khích các cơ sở giáo dục duy trì phương thức dạy học trực tuyến đối với một số môn học, hoạt động giáo dục; chuẩn bị các phương án sẵn sàng đáp ứng yêu cầu tổ chức dạy học trong điều kiện thiên tai, dịch bệnh không thể tổ chức dạy học trực tiếp.
Thực hiện thí điểm một số nội dung chuyển đổi số (Học bạ điện tử, Thư viện số, Quản lí hồ sơ chuyên môn trên môi trường số) theo kế hoạch của Bộ GDĐT. Tăng cường đầu tư cơ sở vật chất, hạ tầng công nghệ thông tin; bồi dưỡng đội ngũ về kĩ năng công nghệ thông tin sẵn sàng triển khai thực hiện các nội dung cụ thể về chuyển đổi số theo kế hoạch.
b) Triển khai thực hiện đưa nội dung giáo dục kĩ năng công dân số vào giảng dạy ở cấp tiểu học
Triển khai thực hiện đưa nội dung giáo dục kĩ năng công dân số vào giảng dạy ở cấp tiểu học thông qua dạy học môn Tin học, tích hợp giáo dục kĩ năng công dân số thông qua tổ chức dạy học các môn học, hoạt động giáo dục theo hướng dẫn của Bộ GDĐT.
IV. Tăng cường huy động nguồn lực để nâng cao chất lượng giáo dục
Tham mưu UBND tỉnh chỉ đạo các sở, ngành, địa phương thực hiện bảo đảm mức chi tối thiểu 20% ngân sách địa phương cho giáo dục theo quy địnhChỉ đạo các cơ sở giáo dục phổ thông sử dụng hiệu quả các nguồn lực được huy động để chuyển hoá thành chất lượng giáo dục của nhà trường; xây dựng kế hoạch giáo dục nhà trường thực hiện quyền tự chủ và tự chịu trách nhiệm về kế hoạch dạy học và giáo dục theo quy định V. Đẩy mạnh công tác truyền thông
Chủ động xây dựng và tổ chức thực hiện kế hoạch truyền thông về đổi mới Chương trình giáo dục phổ thông 2018, tổ chức triển khai sách giáo khoa cấp tiểu học, chú trọng các nội dung liên quan đến lớp 1, lớp 2, lớp 3, lớp 4 và công tác chuẩn bị đối với lớp 5 theo lộ trình. Tổ chức truyền thông đa phương tiện nhằm tuyên truyền, định hướng các chủ trương, chính sách mới về giáo dục; chủ động xử lí các vấn đề truyền thông tại địa phương; nâng cao việc phân tích và xử lí thông tin để đáp ứng yêu cầu truyền thông của Ngành; đẩy mạnh truyền thông về nội dung, giải pháp, lộ trình và điều kiện thực hiện Chương trình giáo dục phổ thông 2018 để tạo sự đồng thuận giữa nhà trường, gia đình và xã hội.
Khuyến khích đội ngũ nhà giáo, cán bộ quản lí giáo dục viết bài và đưa tin về các hoạt động của Ngành việc triển khai thực hiện Chương trình giáo dục phổ thông 2018, gương người tốt, việc tốt, các điển hình tiên tiến của cấp học,... để tạo sức lan tỏa sâu rộng trong cộng đồng.
C. TỔ CHỨC THỰC HIỆN
Trên cơ sở những nội dung hướng dẫn trên đây và căn cứ vào tình hình thực tiễn tại địa phương, Sở GDĐT xây dựng kế hoạch chi tiết để tổ chức thực hiện và báo cáo Bộ GDĐT kết quả thực hiện khi kết thúc năm học. Trong quá trình triển khai, nếu có những vấn đề vướng mắc, đề nghị các Sở GDĐT phản ánh về Bộ GDĐT (qua Vụ Giáo dục Tiểu học) để kịp thời giải quyết./.
Nơi nhận: - Như trên (để th/h); - Bộ trưởng (để b/c); - Các Thứ trưởng; - UBND các tỉnh, thành phố trực thuộc Trung ương; - Các cơ quan thuộc Bộ (để th/h); - Cổng TTĐT Bộ GDĐT; - Lưu: VT, Vụ GDTH.
KT. BỘ TRƯỞNG THỨ TRƯỞNG Phạm Ngọc Thưởng
lồng nhau (bên trong) hay không
const memberID = 0;
const isVIP = false;
const vbID = '3ae1c9075467a4c04ee2ac905d99d7d0';
const unlockAllPhanTich = true;
// 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
// Typing effect state
let typingTimerId = null;
let typingCancelled = false;
// Thinking GIF state
let thinkingGifIntervalId = null;
let thinkingGifActive = false;
let thinkingGifCurrent = 0; // chỉ số GIF hiện tại 1..10
// Detect touch device - chỉ true khi thiết bị CHÍNH sử dụng touch (không có mouse chính xác)
const isTouchDevice = () => {
// Nếu USE_THREE_DOTS_BUTTON = true, luôn trả về true (hiện trên mọi thiết bị)
if (USE_THREE_DOTS_BUTTON === true) return true;
// Ưu tiên: Kiểm tra pointer: coarse (thiết bị chính sử dụng touch, không có mouse/trackpad)
if (window.matchMedia) {
// pointer: coarse = thiết bị chính sử dụng touch (mobile/tablet)
// pointer: fine = thiết bị có mouse/trackpad chính xác (desktop/laptop)
const hasCoarsePointer = window.matchMedia('(pointer: coarse)').matches;
if (hasCoarsePointer) return true;
}
// Fallback: Kiểm tra touch support (không chính xác lắm vì laptop cũng có thể có touch)
// Chỉ dùng khi không support matchMedia
if (!window.matchMedia) {
return (('ontouchstart' in window) ||
(navigator.maxTouchPoints > 0) ||
(navigator.msMaxTouchPoints > 0));
}
return false;
};
const isTouch = isTouchDevice();
// State for dropdown menu on touch devices
let currentOpenDropdown = null;
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, vb_ngaybanhanh: '2023-07-31 00:00:00 AM' };
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/menu
if (((unlockAllPhanTich) || memberID === 4 || memberID === 3 || memberID === 2) && typeof attachPhanTichBadge === 'function') {
setTimeout(function() {
// $element chính là thẻ p, kiểm tra và attach badge/menu trực tiếp
const $parent = $element.closest('phan, chuong, muc, tieumuc, dieu, khoan, diem');
if ($parent.length > 0) {
const address = $parent.attr('address');
const parentType = getParentTypeName($parent.prop('tagName').toLowerCase());
const extraClass = (unlockAllPhanTich && memberID <= 0) ? ' upgrade-require' : '';
if (isTouch) {
// Touch device: Thêm nút 3 chấm (append vào body)
if ($('body').find('.menu-button-phan-tich[data-for="' + address + '"]').length === 0) {
const $menuButton = $('');
$('body').append($menuButton); // Append vào body
$parent.addClass('has-phan-tich-menu');
// Trigger update positions sau khi thêm
setTimeout(function() {
if (typeof window.updateMenuButtonPositions === 'function') {
window.updateMenuButtonPositions();
}
}, 10);
}
} else {
// Desktop: Append badge vào parent
if ($parent.find('.badge-phan-tich[data-for="' + address + '"]').length === 0) {
$element.attr('data-address', address);
const $badge = $('');
$parent.append($badge);
$parent.addClass('has-phan-tich-badge');
}
}
}
// Xử lý các p con (nếu có sub-p)
attachPhanTichBadge($element);
}, 3); // Đợi 3ms để CTTD render xong
}
},
complete: function() {
$element.removeClass('loading-content');
}
})
);
processQueue();
}
});
} catch(e) {
}
}
$(window).on('scroll resize', function () {
processVisibleParagraphs();
});
processVisibleParagraphs();
// Chức năng phân tích điều luật (mở theo lịch unlockAllPhanTich cho tất cả, nhưng khách click sẽ mở modal đăng nhập/mua gói)
if ((unlockAllPhanTich) || memberID === 4 || memberID === 3 || memberID === 2) {
// 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';
}
// Chuyển Telex -> Unicode cho giá trị (ví dụ: dd->đ, oo->ô, ow->ơ, aa->â, ee->ê, aw->ă, uw->ư)
function telexToUnicode(str) {
if (!str) return str;
// Giữ nguyên số
if (/^\d+$/.test(str)) return str;
let s = String(str);
// dd / ĐĐ
s = s.replace(/dd/g, 'đ');
s = s.replace(/DD/g, 'Đ');
// nguyên âm có mũ/dấu
s = s.replace(/aa/g, 'â').replace(/AA/g, 'Â');
s = s.replace(/ee/g, 'ê').replace(/EE/g, 'Ê');
s = s.replace(/oo/g, 'ô').replace(/OO/g, 'Ô');
s = s.replace(/ow/g, 'ơ').replace(/OW/g, 'Ơ');
s = s.replace(/uw/g, 'ư').replace(/UW/g, 'Ư');
s = s.replace(/aw/g, 'ă').replace(/AW/g, 'Ă');
return s;
}
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');
// Trên touch device: Thêm nút 3 chấm dọc (append vào body vì dùng fixed position)
if (isTouch) {
// Kiểm tra đã có nút 3 chấm chưa (trong body)
if ($('body').find('.menu-button-phan-tich[data-for="' + address + '"]').length === 0) {
const parentType = getParentTypeName($parent.prop('tagName').toLowerCase());
const extraClass = (unlockAllPhanTich && memberID <= 0) ? ' upgrade-require' : '';
// Tạo nút 3 chấm với dropdown và append vào body
const $menuButton = $('');
$('body').append($menuButton); // Append vào body, không vào parent
$parent.addClass('has-phan-tich-menu');
}
} else {
// Desktop: Giữ nguyên badge hover như cũ (append vào parent)
if ($parent.find('.badge-phan-tich[data-for="' + address + '"]').length === 0) {
$p.attr('data-address', address);
const parentType = getParentTypeName($parent.prop('tagName').toLowerCase());
const extraClass = (unlockAllPhanTich && memberID <= 0) ? ' upgrade-require' : '';
const $badge = $('');
$parent.append($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, '');
// 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);
}
// Stop typing animation nếu đang chạy
stopThinkingTyping();
// 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
} else {
// KHÔNG có CTTD → SHOW lại rightdocinfo
const $rightdocinfo = $('#rightdocinfo');
if ($rightdocinfo.length > 0) {
$rightdocinfo.show();
}
}
// Reset state
isAnalyzing = false;
currentAnalyzingAddress = null;
currentAnalyzingElement = null;
currentAnalyzingBadge = null;
isPanelOpen = false; // Đánh dấu panel đã đóng
}
// Panel đã song song với rightdocinfo → không cần MutationObserver nữa
// 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();
if ($('#phanTichPanelBody').hasClass('thinking-mode')) {
updateThinkingGifHeight();
}
}
}, 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');
// Mobile: dùng bottom sheet → để CSS điều khiển, bỏ qua reposition bằng JS
if ($(window).width() <= 768) {
return;
}
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'
});
} else {
}
// Restore trạng thái hidden nếu cần
if (wasHidden) {
$reference.hide().css('visibility', '');
}
}
}
// Hiệu ứng typing giả lập đang phân tích trong panel
function stopThinkingTyping() {
typingCancelled = true;
if (typingTimerId) {
clearTimeout(typingTimerId);
typingTimerId = null;
}
// Dừng trình chiếu ảnh khi dừng typing
stopThinkingImages();
}
// Helper GIF: chọn chỉ số ảnh mới 1..10 khác với exclude
function randomGifIndex(exclude) {
let n = exclude;
while (n === exclude) {
n = Math.floor(Math.random() * 10) + 1;
}
return n;
}
// Helper GIF: preload rồi gán src cho img, gọi callback sau khi load xong (hoặc lỗi)
function setGifSrc($img, idx, cb) {
const url = '/assets/images/gif/researching-' + idx + '.gif';
const updateWrapHeight = function(nW, nH){
try {
const $wrap = $img.closest('#thinkingGifWrapper');
if ($wrap.length && nW && nH) {
const wrapW = $wrap.width();
const maxW = wrapW * 0.9; // khớp với CSS max-width:90%
const displayW = Math.min(nW, maxW);
const displayH = nH * (displayW / nW);
$wrap.css('height', displayH + 'px');
}
} catch(e) { /* ignore */ }
};
if ($img.attr('src') === url) {
// Ảnh trùng src -> vẫn cập nhật lại chiều cao wrapper theo kích thước hiển thị hiện tại
const el = $img[0];
if (el && el.naturalWidth && el.naturalHeight) {
updateWrapHeight(el.naturalWidth, el.naturalHeight);
}
if (cb) cb();
return;
}
const pre = new Image();
pre.onload = function() {
$img.attr('src', url);
updateWrapHeight(pre.naturalWidth, pre.naturalHeight);
if (cb) cb();
};
pre.onerror = function() {
$img.attr('src', url);
// Không lấy được kích thước tự nhiên -> để auto
const $wrap = $img.closest('#thinkingGifWrapper');
if ($wrap.length) { $wrap.css('height', 'auto'); }
if (cb) cb();
};
pre.src = url;
}
function updateThinkingGifHeight() {
const $wrap = $('#thinkingGifWrapper');
if ($wrap.length === 0) return;
const $show = $('#thinkingGifA.visible, #thinkingGifB.visible').first();
if ($show.length === 0) return;
const el = $show[0];
if (!el.naturalWidth || !el.naturalHeight) return;
const wrapW = $wrap.width();
const maxW = wrapW * 0.9;
const displayW = Math.min(el.naturalWidth, maxW);
const displayH = el.naturalHeight * (displayW / el.naturalWidth);
$wrap.css('height', displayH + 'px');
}
function startThinkingImages() {
// Nếu body/khung chưa sẵn sàng thì bỏ qua
const $wrap = $('#thinkingGifWrapper');
if ($wrap.length === 0) return;
// Clear trước nếu đang chạy
stopThinkingImages();
thinkingGifActive = true;
const $a = $('#thinkingGifA');
const $b = $('#thinkingGifB');
$a.removeClass('visible');
$b.removeClass('visible');
// Ảnh đầu tiên
thinkingGifCurrent = randomGifIndex(0);
let useA = true; // ảnh A hiển thị trước
setGifSrc($a, thinkingGifCurrent, function(){ $a.addClass('visible'); });
// Mỗi 3s đổi ảnh, crossfade 0.5s qua CSS
thinkingGifIntervalId = setInterval(function(){
if (!thinkingGifActive) return;
const nextIdx = randomGifIndex(thinkingGifCurrent);
const $show = useA ? $b : $a; // show ảnh còn lại
const $hide = useA ? $a : $b;
setGifSrc($show, nextIdx, function(){
// Bắt đầu chuyển ảnh: ẩn ảnh cũ, hiện ảnh mới
$hide.removeClass('visible');
setTimeout(function(){ $show.addClass('visible'); }, 10);
thinkingGifCurrent = nextIdx;
useA = !useA;
});
}, 5000);
}
function stopThinkingImages() {
thinkingGifActive = false;
if (thinkingGifIntervalId) {
clearInterval(thinkingGifIntervalId);
thinkingGifIntervalId = null;
}
}
// Giải quyết address: nếu không có '_' thì decrypt (ưu tiên API, fallback client), ngược lại trả về nguyên vẹn
function clientDecrypt(encrypted, key) {
try {
const bin = atob(encrypted);
let out = '';
for (let i = 0; i < bin.length; i++) {
const ch = bin.charCodeAt(i);
const k = key.charCodeAt(i % key.length);
out += String.fromCharCode(ch ^ k);
}
// Chuẩn hóa tương tự server
out = out.toLowerCase().replace(/[^a-z0-9_]/g, '');
return out || encrypted;
} catch (e) {
return encrypted;
}
}
function resolveAddress(address) {
return new Promise(function(resolve) {
if (!address) { resolve(''); return; }
const addr = String(address);
const lower = addr.toLowerCase();
if (lower === 'trichyeu' || lower === 'cancu' || addr.indexOf('_') !== -1) {
resolve(addr);
return;
}
const randomServer = Math.floor(Math.random() * 10) + 1;
$.ajax({
url: '//tnpl' + randomServer + '.hethongphapluat.com/tien-ich/ajax/decrypt.ndsh.address.php',
type: 'POST',
data: { address_encrypted: addr },
timeout: 10000,
success: function(resp) {
try {
// jQuery sẽ parse JSON theo header, nhưng vẫn fallback nếu là string
if (typeof resp === 'string') { resp = JSON.parse(resp); }
} catch(e) { /* ignore */ }
if (resp && resp.ok && resp.address) {
resolve(resp.address);
} else {
// Fallback client decrypt
resolve(clientDecrypt(addr, 'htpl_noi_dung_vb_address'));
}
},
error: function() {
// Fallback client decrypt
resolve(clientDecrypt(addr, 'htpl_noi_dung_vb_address'));
}
});
});
}
function startThinkingTyping(address) {
// Reset trước khi bắt đầu
stopThinkingTyping();
typingCancelled = false;
const $body = $('#phanTichPanelBody');
if ($body.length === 0) return;
// Đánh dấu chế độ thinking để căn giữa toàn bộ nội dung trong body
$body.addClass('thinking-mode');
// Khởi tạo container nếu chưa có
if ($('#thinkingContainer').length === 0) {
$body.html('\
\
\
\
');
}
$('#thinkingText').html('');
// Khởi động slideshow ảnh thinking
startThinkingImages();
// Chờ resolve address (decrypt nếu cần) rồi mới bắt đầu typing
resolveAddress(address).then(function(addrPlain) {
if (typingCancelled) return;
const displayNameLarge = getElementDisplayNameLargeFirst(addrPlain);
$('.processing-text').text('Đang xử lý phân tích ' + displayNameLarge.toLowerCase() + '...');
// Câu nói đa dạng cho từng bước
const variants = [
[
'Tôi đã nhận được yêu cầu phân tích {name}...',
'Cảm ơn bạn đã gửi yêu cầu phân tích {name}, tôi sẽ bắt đầu...',
'Bạn đã yêu cầu tôi phân tích {name}, hãy chờ tôi lập kế hoạch...',
'Yêu cầu phân tích {name} đã được ghi nhận, tôi đang chuẩn bị...'
],
[
'Tiếp theo, tôi sẽ đọc kỹ nội dung chi tiết của {name}...',
'Bây giờ tôi cần xem xét kỹ nội dung của {name}...',
'Đang mở và duyệt qua nội dung {name}...'
],
[
'Tôi đã đọc xong. Tôi sẽ kiểm tra xem {name} có bị sửa đổi, bổ sung, thay thế hoặc bãi bỏ bởi điều khoản nào không...',
'Tôi sẽ đối chiếu các văn bản để xem {name} có thay đổi hiệu lực nào không...',
'Tiếp tục kiểm tra trạng thái hiệu lực và các lần sửa đổi của {name}...'
],
[
'Tôi cũng cần xem {name} có được hướng dẫn bởi điều luật nào không...',
'Đang tìm các quy định hướng dẫn áp dụng liên quan đến {name}...',
'Kiểm tra các văn bản hướng dẫn có nhắc đến {name}...'
],
[
'Tôi sẽ kiểm tra {name} có viện dẫn/nhắc đến điều luật khác để tham chiếu hay không...',
'Đang rà soát các điều khoản được {name} đề cập đến...',
'Tìm các tham chiếu pháp lý xuất hiện trong {name}...'
],
[
'Tôi sẽ nghiên cứu về phạm vi điều chỉnh và đối tượng áp dụng'
],
[
'Bây giờ tôi cần tìm ví dụ minh họa cho nội dung điều này...'
],
[
'Tôi cũng cần bổ sung vài lưu ý thực tiễn trong bài phân tích của tôi...'
],
[
'Giờ tôi sẽ viết phần kết luận của bài phân tích...'
],
[
'Bây giờ tôi bắt đầu phân tích chi tiết {name}...',
'Bắt đầu tổng hợp và phân tích {name}...',
'Tiến hành phân tích nội dung {name}...'
]
];
const pick = (arr) => arr[Math.floor(Math.random() * arr.length)];
const lines = variants.map(group => pick(group).replace(/\{name\}/g, displayNameLarge));
let lineIndex = 0;
let charIndex = 0;
const speedMin = 12; // ms
const speedMax = 25; // ms
const linePause = 2000; // ms chờ 2s giữa các câu
function typeNextChar() {
if (typingCancelled) return;
const line = lines[lineIndex];
if (charIndex < line.length) {
$('#thinkingText').append(line.charAt(charIndex));
charIndex++;
const delay = Math.floor(Math.random() * (speedMax - speedMin + 1)) + speedMin;
typingTimerId = setTimeout(typeNextChar, delay);
} else {
// Hoàn tất 1 câu
if (lineIndex < lines.length - 1) {
// Chờ 2s rồi chuyển sang câu tiếp theo, thay thế câu cũ (không append)
typingTimerId = setTimeout(function() {
if (typingCancelled) return;
$('#thinkingText').html('');
lineIndex++;
charIndex = 0;
typeNextChar();
}, linePause);
} else {
// Câu cuối cùng -> giữ nguyên, chỉ để caret nhấp nháy; không loop
return;
}
}
}
typeNextChar();
});
}
function openPhanTichPanel(address, vbID) {
// Kiểm tra nếu đang phân tích element khác
if (isAnalyzing && currentAnalyzingAddress && currentAnalyzingAddress !== address) {
// Giải mã địa chỉ hiện đang phân tích trước khi hiển thị trong modal
resolveAddress(currentAnalyzingAddress).then(function(addrPlain) {
const currentName = getElementDisplayNameLargeFirst(addrPlain);
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) {
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
// ẨN rightdocinfo để tiết kiệm không gian
if ($rightdocinfo.length > 0) {
$rightdocinfo.hide();
}
// XÓA highlight persistent của TẤT CẢ elements cũ trước
$('#tab_noi_dung_vb .highlight-border-persistent').removeClass('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;
// 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
// Đả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 debugHTML = (memberID === 3 || memberID === 4) ? `
Debug Mode
` : '';
const panelHTML = `
`;
// 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;
// Bắt đầu typing
stopThinkingTyping();
startThinkingTyping(address);
}, 10);
} else {
// Khởi tạo giao diện typing khi mở lại panel
$('#phanTichPanelBody').addClass('thinking-mode').html('');
// Update dimensions khi re-open
updatePanelDimensions();
$('#phanTichPanel').addClass('show');
isPanelOpen = true;
// Bắt đầu typing
stopThinkingTyping();
startThinkingTyping(address);
}
// 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');
// Show typing trong panel thay cho loading
$('#phanTichPanelBody').addClass('thinking-mode').html('');
stopThinkingTyping();
startThinkingTyping(address);
// Gọi API xóa cache trước
deletePhanTichCache(address, vbID, function(deleteSuccess) {
if (deleteSuccess) {
// 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 {
$('#phanTichPanelBody').html(`
Lỗi! Không thể xóa cache. Vui lòng thử lại.
`);
$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, attempt) {
attempt = attempt || 1;
const randomServer = Math.floor(Math.random() * 10) + 1;
const debugMode = $('#debugModePhanTich').is(':checked') ? 1 : 0;
$.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,
debug: debugMode
}),
success: function(response) {
if (response && response.ok) {
// Thành công -> kết thúc thinking và reset trạng thái
stopThinkingTyping();
if (currentAnalyzingBadge) {
currentAnalyzingBadge.text('Phân tích').removeClass('analyzing');
currentAnalyzingBadge.data('analyzing', false);
}
isAnalyzing = false;
// Render kết quả phân tích với hiệu ứng xuất hiện dần từ trên xuống dưới
let html = '';
html += '';
html += '';
html += '
' + markdownToHtml(response.phan_tich) + '
';
// Khuyến cáo thay cho thống kê token
html += '
';
html += 'Những thông tin em vừa cung cấp chỉ mang tính chất tham khảo, không đại diện cho tư vấn chính thức của luật sư. Quý khách nên tìm đến sự tư vấn trực tiếp từ Luật sư hoặc đơn vị pháp lý có chuyên môn để được hỗ trợ cụ thể cho trường hợp của mình.';
html += '
';
html += '
';
$('#phanTichPanelBody').removeClass('thinking-mode').html(html);
applyFadeReveal();
} else {
// Không ok -> nếu là quá tải và chưa vượt số lần thử thì retry
const msg = response && response.error ? response.error : '';
if (isOverloadedMessage(msg) && attempt < 50 && isPanelOpen && isAnalyzing && currentAnalyzingAddress === address) {
const delay = Math.min(1200 + attempt * 100, 5000);
setTimeout(function() { callPhanTichAPI(address, vbID, callback, attempt + 1); }, delay);
return;
}
// Hết số lần thử hoặc không phải quá tải -> hiển thị lỗi
stopThinkingTyping();
if (currentAnalyzingBadge) {
currentAnalyzingBadge.text('Phân tích').removeClass('analyzing');
currentAnalyzingBadge.data('analyzing', false);
}
isAnalyzing = false;
if (isOverloadedMessage(msg)) {
$('#phanTichPanelBody').removeClass('thinking-mode').html(`
Hiện tại A.I đang bị quá tải , vui lòng thử lại sau ít phút!
Thử lại
`);
$(document).off('click.tryAgainPanel').on('click.tryAgainPanel', '#btnTryAgainPanel', function() {
openPhanTichPanel(address, vbID);
});
} else {
$('#phanTichPanelBody').removeClass('thinking-mode').html(`
Lỗi! ${escapeHtml(msg || 'Không thể phân tích điều luật.')}
Vui lòng thử lại sau.
`);
}
}
if (callback) callback();
},
error: function(xhr, status, error) {
// Nếu quá tải và chưa quá 50 lần -> retry, giữ hiệu ứng thinking và trạng thái analyzing
let errorMsg = error;
if (xhr.responseJSON && xhr.responseJSON.error) {
errorMsg = (xhr.responseJSON.error.message || xhr.responseJSON.error) || errorMsg;
} else if (xhr.responseText) {
errorMsg = xhr.responseText;
}
if ((xhr.status === 503 || isOverloadedMessage(errorMsg)) && attempt < 50 && isPanelOpen && isAnalyzing && currentAnalyzingAddress === address) {
const delay = Math.min(1200 + attempt * 100, 5000);
setTimeout(function() { callPhanTichAPI(address, vbID, callback, attempt + 1); }, delay);
return;
}
// Hết số lần thử hoặc lỗi khác -> hiển thị thông báo phù hợp
stopThinkingTyping();
if (currentAnalyzingBadge) {
currentAnalyzingBadge.text('Phân tích').removeClass('analyzing');
currentAnalyzingBadge.data('analyzing', false);
}
isAnalyzing = false;
if (xhr.status === 503 || isOverloadedMessage(errorMsg)) {
$('#phanTichPanelBody').removeClass('thinking-mode').html(`
Hiện tại A.I đang bị quá tải , vui lòng thử lại sau ít phút!
Thử lại
`);
$(document).off('click.tryAgainPanel').on('click.tryAgainPanel', '#btnTryAgainPanel', function() {
openPhanTichPanel(address, vbID);
});
} else {
$('#phanTichPanelBody').removeClass('thinking-mode').html(`
Lỗi! Không thể kết nối đến server phân tích.
Chi tiết: ${escapeHtml(errorMsg)}
`);
}
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) {
if (callback) callback(response.ok || false);
},
error: function(xhr, status, error) {
if (callback) callback(false);
}
});
}
// Helper: Lấy tên hiển thị của element từ address (có chuyển Telex -> Unicode ở phần giá trị)
function getElementDisplayName(address) {
if (!address) return 'nội dung';
const addrStr = String(address).toLowerCase();
// Các trường hợp đặc biệt không có cặp key_value
if (addrStr === 'trichyeu') return 'Trích yếu';
if (addrStr === 'cancu') return 'Căn cứ';
// Parse địa chỉ linh hoạt: hỗ trợ cả dạng thiếu cặp
const parts = addrStr.split('_');
const types = new Set(['phan', 'chuong', 'muc', 'tieumuc', 'dieu', 'khoan', 'diem']);
const displayParts = [];
for (let i = 0; i < parts.length; i++) {
const key = parts[i];
if (types.has(key)) {
const label = getParentTypeName(key);
const val = (i + 1 < parts.length) ? parts[i + 1] : '';
const valVN = telexToUnicode(val);
displayParts.push(label + (valVN ? ' ' + valVN : ''));
if (val) i++; // bỏ qua value nếu đã dùng
}
}
const title = displayParts.reverse().join(' ');
if (title) return title;
// Fallback: nếu không parse được, trả về address gốc
return address;
}
// Helper: Lấy tên hiển thị theo thứ tự lớn -> nhỏ (Điều > Khoản > Điểm), có chuyển Telex
function getElementDisplayNameLargeFirst(address) {
if (!address) return 'nội dung';
const addrStr = String(address).toLowerCase();
if (addrStr === 'trichyeu') return 'Trích yếu';
if (addrStr === 'cancu') return 'Căn cứ';
const parts = addrStr.split('_');
const types = new Set(['phan', 'chuong', 'muc', 'tieumuc', 'dieu', 'khoan', 'diem']);
const displayParts = [];
for (let i = 0; i < parts.length; i++) {
const key = parts[i];
if (types.has(key)) {
const label = getParentTypeName(key);
const val = (i + 1 < parts.length) ? parts[i + 1] : '';
const valVN = telexToUnicode(val);
displayParts.push(label + (valVN ? ' ' + valVN : ''));
if (val) i++;
}
}
const title = displayParts.join(' ');
return title || address;
}
// Hiệu ứng typing nhanh cho nội dung kết quả (preview text), sau đó thay bằng HTML đầy đủ
let fastTypingTimerId = null;
function stopFastTypingContent() {
if (fastTypingTimerId) {
clearTimeout(fastTypingTimerId);
fastTypingTimerId = null;
}
}
function stripHtmlToText(html) {
const tmp = document.createElement('div');
tmp.innerHTML = html;
const text = (tmp.textContent || tmp.innerText || '') || '';
return text.replace(/\u00A0/g, ' ');
}
function startFastTypingFinalContent(finalHtml) {
stopThinkingTyping();
stopFastTypingContent();
stopThinkingImages();
const $body = $('#phanTichPanelBody');
if ($body.length === 0) return;
$body.removeClass('thinking-mode');
const previewTextFull = stripHtmlToText(finalHtml).trim();
const maxChars = 800; // giới hạn để không quá lâu
const previewText = previewTextFull.slice(0, maxChars);
$body.html('');
let idx = 0;
const speedMin = 2;
const speedMax = 5;
function typeNext() {
if (idx < previewText.length) {
$('#fastTypingText').append(previewText.charAt(idx));
idx++;
const delay = Math.floor(Math.random() * (speedMax - speedMin + 1)) + speedMin;
fastTypingTimerId = setTimeout(typeNext, delay);
} else {
// Khi gõ xong preview → thay bằng HTML đầy đủ
$body.html(finalHtml);
}
}
typeNext();
}
// Áp dụng hiệu ứng xuất hiện dần từ trên xuống dưới
function applyFadeReveal() {
const $container = $('#phanTichPanelBody .fade-reveal-container');
if (!$container.length) return;
// Lấy các block cấp cao và các phần tử con trong nội dung phân tích
const $blocks = $().add($container.children())
.add($container.find('.phan-tich-content').children());
let delayMs = 0;
const stepMs = 60; // ms giữa các phần tử
$blocks.each(function() {
const $el = $(this);
// Bỏ qua các node text trống
if ($el.prop('nodeType') !== 1) return;
$el.addClass('fade-reveal').css('animation-delay', (delayMs/1000) + 's');
delayMs += stepMs;
});
}
// Nhận diện lỗi quá tải model (503/overloaded) - phạm vi toàn cục
function isOverloadedMessage(msg) {
if (!msg) return false;
const s = String(msg).toLowerCase();
return s.includes('overloaded') || s.includes('unavailable') || s.includes('503');
}
function openPhanTichModal(address, vbID) {
// Tạo modal nếu chưa có
if ($('#modalPhanTich').length === 0) {
const modalHTML = `
Đang phân tích...
Đang phân tích...
`;
$('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 với retry tối đa 50 lần khi quá tải
(function requestModal(attempt) {
attempt = attempt || 1;
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 && response.ok) {
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) + ' ';
html += '
';
html += '' + markdownToHtml(response.phan_tich) + '
';
html += '';
html += 'Những thông tin em vừa cung cấp chỉ mang tính chất tham khảo, không đại diện cho tư vấn chính thức của luật sư. Quý khách nên tìm đến sự tư vấn trực tiếp từ Luật sư hoặc đơn vị pháp lý có chuyên môn để được hỗ trợ cụ thể cho trường hợp của mình.';
html += '
';
$('#modalPhanTichBody').html(html);
} else {
const msg = response && response.error ? response.error : '';
if (isOverloadedMessage(msg) && attempt < 50) {
const delay = Math.min(1200 + attempt * 100, 5000);
setTimeout(function(){ requestModal(attempt + 1); }, delay);
return;
}
if (isOverloadedMessage(msg)) {
$('#modalPhanTichBody').html(`
Hiện tại A.I đang bị quá tải , vui lòng thử lại sau ít phút!
Thử lại
`);
$(document).off('click.tryAgainModal').on('click.tryAgainModal', '#btnTryAgainModal', function(){
openPhanTichModal(address, vbID);
});
} else {
$('#modalPhanTichBody').html(`
Lỗi! ${escapeHtml(msg || 'Không thể phân tích điều luật.')}
Vui lòng thử lại sau.
`);
}
}
},
error: function(xhr, status, error) {
let errorMsg = error;
if (xhr.responseJSON && xhr.responseJSON.error) {
errorMsg = (xhr.responseJSON.error.message || xhr.responseJSON.error) || errorMsg;
} else if (xhr.responseText) {
errorMsg = xhr.responseText;
}
if ((xhr.status === 503 || isOverloadedMessage(errorMsg)) && attempt < 50) {
const delay = Math.min(1200 + attempt * 100, 5000);
setTimeout(function(){ requestModal(attempt + 1); }, delay);
return;
}
if (xhr.status === 503 || isOverloadedMessage(errorMsg)) {
$('#modalPhanTichBody').html(`
Hiện tại A.I đang bị quá tải , vui lòng thử lại sau ít phút!
Thử lại
`);
$(document).off('click.tryAgainModal').on('click.tryAgainModal', '#btnTryAgainModal', function(){
openPhanTichModal(address, vbID);
});
} else {
$('#modalPhanTichBody').html(`
Lỗi! Không thể kết nối đến server phân tích.
Chi tiết: ${escapeHtml(errorMsg)}
`);
}
}
});
})(1);
}
// 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) {
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 + 8) + 'px',
left: (offset.left + $parent.outerWidth() - badgeWidth - scrollLeft - 4) + 'px' // -5px padding
});
$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;
// Dùng mousemove để track chính xác element nào đang được hover (hiển thị ngay lập tức)
$(document).on('mousemove', '#tab_noi_dung_vb', function(e) {
// Bỏ logic ẩn badge khi hover vào tnpl - bây giờ badge luôn hiển thị
// Badge "Phân tích" sẽ luôn hiện kể cả khi di chuột vào tnpl
// Tìm element gần nhất (phan, chuong, muc, tieumuc, 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;
}
// Element thay đổi → xử lý ngay lập tức (không debounce)
// 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 extraClass = (unlockAllPhanTich && memberID <= 0) ? ' upgrade-require' : '';
const $badge = $('');
$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;
});
// Event delegation cho hover ra khỏi #tab_noi_dung_vb
$(document).on('mouseleave', '#tab_noi_dung_vb', function(e) {
// Nếu di chuột sang menu button thì KHÔNG clear currentHoveredElement
if (e.relatedTarget && $(e.relatedTarget).closest('.menu-button-phan-tich').length > 0) {
return;
}
// 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'});
}
});
}
}, 3);
});
// 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');
// Nếu di chuột sang menu button của chính nó thì KHÔNG xử lý mouseleave
if (e.relatedTarget && $(e.relatedTarget).closest('.menu-button-phan-tich[data-for="' + parentAddress + '"]').length > 0) {
return;
}
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')) {
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);
}
}, 3); // 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')) {
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);
}
}, 3);
});
// 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(), 3);
}
});
// Event delegation cho click badge → mở panel
$(document).on('click', '.badge-phan-tich, .badge-phan-tich-container, .badge-phan-tich-fixed', function(e) {
const $badge = $(this);
// Nếu là khách (chưa đăng nhập) sau thời điểm mở khóa → mở modal đăng nhập/mua gói
if (typeof memberID !== 'undefined' && memberID !== 4 && !isVIP) {
e.preventDefault();
e.stopPropagation();
openModal(this, '/ajax/member/m-register/new/1');
return;
}
// Thành viên → mở panel phân tích
e.preventDefault();
e.stopPropagation();
// Nếu badge đang analyzing thì không cho click
if ($badge.hasClass('analyzing') || $badge.data('analyzing')) {
return;
}
// Lấy address từ data-for attribute
const address = $badge.attr('data-for');
if (address && vbID) {
openPhanTichPanel(address, vbID);
} else {
showWarningModal('Không tìm thấy địa chỉ điều luật hoặc ID văn bản!');
}
});
// Xử lý click vào CTTD/DCTD cho khách (non-VIP) -> mở modal đăng ký
$(document).on('click', 'cttd, dctk, dctd, .chuthichtudong', function(e) {
if (typeof memberID !== 'undefined' && memberID !== 4 && !isVIP) {
e.preventDefault();
e.stopImmediatePropagation();
openModal(this, '/ajax/member/m-register/new/1');
return false;
}
});
// Ẩn badge khi click vào CTTD
$(document).on('click', 'cttd.chuthichtudong span, dctk span, dctd span', function(e) {
// Ẩ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'});
}
});
});
// 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);
// Function để update vị trí nút 3 chấm (fixed position) - exposed globally
window.updateMenuButtonPositions = function() {
if (!isTouch) return; // Chỉ chạy trên touch device
$('.menu-button-phan-tich').each(function() {
const $menuButton = $(this);
const address = $menuButton.attr('data-for');
const $parent = $('[address="' + address + '"]').first();
if ($parent.length > 0) {
const parentOffset = $parent.offset();
const parentWidth = $parent.outerWidth();
const parentHeight = $parent.outerHeight();
const scrollTop = $(window).scrollTop();
const windowHeight = $(window).innerHeight();
const viewportTop = scrollTop;
const viewportBottom = scrollTop + windowHeight;
// Kiểm tra parent có trong viewport không
const parentTop = parentOffset.top;
const parentBottom = parentOffset.top + parentHeight;
const inViewport = (parentBottom > viewportTop && parentTop < viewportBottom);
if (inViewport) {
const scrollLeft = $(window).scrollLeft();
// Tính vị trí: góc phải của parent element
// Canh chỉnh top để tâm của nút 3 chấm (cao ~36px) ngang hàng với tâm của badge (cao ~21px, top 8px)
// Badge center: 8 + 10.5 = 18.5px
// Button center: Top + 18px
// => Top = 18.5 - 18 = 0.5px -> Lấy tròn 1px
const topOffset = 3;
topPosition = parentOffset.top - scrollTop + topOffset;
// Left = left của parent + width của parent - khoảng 30px (chiều rộng icon + padding)
// Để nút nằm bên trong parent, góc phải
// Trừ scrollLeft vì position: fixed tính theo viewport
const leftPosition = parentOffset.left + parentWidth - 2 - scrollLeft;
$menuButton.css({
top: topPosition + 'px',
left: leftPosition + 'px',
right: 'auto', // Reset right
display: 'block'
});
} else {
// Ẩn nếu parent không trong viewport
$menuButton.css({display: 'none'});
}
}
});
};
// Highlight parent khi hover/touch vào nút 3 chấm
$(document).on('mouseenter touchstart', '.menu-button-phan-tich', function() {
const address = $(this).attr('data-for');
const $parent = $('[address="' + address + '"]').first();
if ($parent.length) {
$parent.addClass('highlight-border');
$parent.data('hovering', true); // Mark as hovering
currentHoveredElement = $parent; // Update global tracker
// Attach badge nếu chưa có (logic tương tự như khi hover vào parent)
if ($parent.find('.badge-phan-tich-container[data-for="' + address + '"]').length === 0) {
const parentType = getParentTypeName($parent.prop('tagName').toLowerCase());
const extraClass = (unlockAllPhanTich && memberID <= 0) ? ' upgrade-require' : '';
const $badge = $('');
$parent.append($badge);
$parent.addClass('has-phan-tich-badge');
}
// Show badge tương ứng
if (typeof showPhanTichBadgeForParent === 'function') {
showPhanTichBadgeForParent($parent);
}
}
});
$(document).on('mouseleave touchend', '.menu-button-phan-tich', function(e) {
const address = $(this).attr('data-for');
const $parent = $('[address="' + address + '"]').first();
// Nếu di chuột sang parent thì không remove highlight
if (e.relatedTarget && $(e.relatedTarget).closest('[address="' + address + '"]').length > 0) {
return;
}
// Nếu di chuột ra ngoài hoàn toàn (không vào parent)
currentHoveredElement = null;
if ($parent.length) {
$parent.removeClass('highlight-border');
$parent.data('hovering', false);
// Hide badge
if (typeof hidePhanTichBadgeForParent === 'function') {
hidePhanTichBadgeForParent($parent);
}
}
});
// ===== Event handlers cho touch device =====
if (isTouch) {
// Update positions khi scroll hoặc resize
$(window).on('scroll resize', function() {
window.updateMenuButtonPositions();
});
// Initial update
setTimeout(window.updateMenuButtonPositions, 500);
// Xử lý click nút Phân tích (badge hoặc dropdown item)
$(document).on('click', '.badge-phan-tich, .dropdown-item-phan-tich[data-action="analyze"]', function(e) {
e.preventDefault();
e.stopPropagation();
if (typeof memberID !== 'undefined' && memberID !== 4 && !isVIP) {
openModal(this, '/ajax/member/m-register/new/1');
return;
}
const $btn = $(this);
let address = $btn.attr('data-for');
// Nếu click từ dropdown item, cần lấy address từ parent menu button
if (!address) {
const $menuBtn = $btn.closest('.menu-button-phan-tich');
address = $menuBtn.attr('data-for');
}
if (address) {
// Đóng dropdown menu nếu đang mở (trên mobile)
if (currentOpenDropdown) {
currentOpenDropdown.removeClass('show');
currentOpenDropdown = null;
}
openPhanTichPanel(address, vbID);
}
});
// Click vào nút 3 chấm -> mở panel phân tích luôn (không cần dropdown)
$(document).on('click', '.btn-three-dots', function(e) {
e.preventDefault();
e.stopPropagation();
const $button = $(this);
const $menuContainer = $button.closest('.menu-button-phan-tich');
const address = $menuContainer.attr('data-for');
// Kiểm tra nếu là khách (chưa đăng nhập)
if (unlockAllPhanTich && memberID <= 0) {
if (!$menuContainer.hasClass('upgrade-require')) {
$menuContainer.addClass('upgrade-require');
}
// Trigger event để modal.content.php bắt và mở modal đăng nhập
$menuContainer.trigger('click');
return;
}
// Thành viên -> mở panel phân tích trực tiếp
if (address && vbID) {
openPhanTichPanel(address, vbID);
} else {
showWarningModal('Không tìm thấy địa chỉ điều luật hoặc ID văn bản!');
}
});
// Update positions khi scroll hoặc resize
$(window).on('scroll resize', function() {
window.updateMenuButtonPositions();
});
}
}
});
Tra cứu thuật ngữ với từ hoặc cụm từ đã chọn?
×
Công văn 3819/BGDĐT-GDTH năm 2023 hướng dẫn thực hiện nhiệm vụ giáo dục Tiểu học năm học 2023-2024 do Bộ Giáo dục và Đào tạo ban hành