Điểm Tin Đầu ngày

<!DOCTYPE html>
<html lang="vi">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Điểm Tin Thị Trường Hàng Ngày - Responsive</title>
    <script src="https://cdn.tailwindcss.com"></script>
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" xintegrity="sha512-Fo3rlrZj/k7ujTnHg4CGR2D7kSs0v4LLanw2qksYuRlEzO+tcaEPQogQ0KaoGN26/zrn20ImR1DfuLWnOo7aBA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
    <style>
        body {
            font-family: 'Inter', sans-serif;
            background-color: #F9FAFB; /* bg-gray-50 - Nền body hơi xám nhẹ */
        }
        .responsive-blog-container {
            background-color: #FFFFFF; /* bg-white - Nền container chính */
            color: #1F2937; /* text-gray-800 - Màu chữ chính */
            max-width: 1100px; /* Giới hạn chiều rộng tối đa */
            margin: 20px auto;
            padding: 16px; /* Default padding for mobile */
        }
        @media (min-width: 640px) { /* sm */
            .responsive-blog-container {
                padding: 24px; /* sm:p-6 */
            }
        }
        @media (min-width: 1024px) { /* lg */
            .responsive-blog-container {
                padding: 32px; /* lg:p-8 */
            }
        }
        .responsive-blog-container {
            border-radius: 8px;
            box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
        }
        .article-card-responsive {
            background-color: #FFFFFF;
            border-radius: 8px;
            margin-bottom: 20px;
            transition: box-shadow 0.3s ease;
            overflow: hidden;
            border: 1px solid #E5E7EB; /* border-gray-200 */
        }
        .article-card-responsive:hover {
            box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
        }
        .article-card-content {
            padding: 16px; /* p-4 */
        }
        @media (min-width: 640px) { /* sm */
            .article-card-content {
                padding: 20px; /* sm:p-5 */
            }
        }
        .article-image {
            width: 100%;
            height: 200px; /* Chiều cao cố định cho ảnh thumbnail */
            object-fit: cover; /* Đảm bảo ảnh che phủ mà không bị méo */
        }
        .featured-article-image {
            width: 100%;
            height: 300px; /* Chiều cao lớn hơn cho ảnh nổi bật */
            object-fit: cover;
        }
        @media (min-width: 768px) { /* md */
            .featured-article-image {
                height: 400px;
            }
        }

        .article-content-full {
            display: none;
            margin-top: 15px;
            padding-top: 15px;
            border-top: 1px solid #E5E7EB; /* border-gray-200 */
        }
        .article-content-full p,
        .article-content-full ul,
        .article-content-full h4,
        .article-content-full pre /* Style for preformatted code blocks */
        {
            margin-bottom: 10px;
            color: #374151; /* text-gray-700 */
            word-wrap: break-word; /* Ensure long words/strings wrap */
        }
         .article-content-full h4 {
            font-size: 1.1rem;
            font-weight: 600;
            color: #4B5563; /* text-gray-600 */
        }
        .article-content-full pre { /* Styling for code blocks */
            background-color: #f4f4f4;
            padding: 15px;
            border-radius: 5px;
            overflow-x: auto; /* Allow horizontal scrolling for long code lines */
            font-family: 'Courier New', Courier, monospace;
            font-size: 0.9em;
            border: 1px solid #ddd;
            white-space: pre-wrap; /* Allow wrapping of long code lines */
        }
        .read-more-btn {
            color: #2563EB; /* text-blue-600 */
            cursor: pointer;
            font-weight: 500;
            display: inline-block;
            margin-top: 10px;
            padding: 8px 0; /* Tăng vùng chạm */
        }
        .read-more-btn:hover {
            color: #1D4ED8; /* text-blue-700 */
            text-decoration: underline;
        }
        .author-info .author-name {
            color: #111827; /* text-gray-900 */
        }
        .author-info .author-meta {
            color: #6B7280; /* text-gray-500 */
        }
        .author-avatar {
            width: 32px;
            height: 32px;
            border-radius: 50%;
            margin-right: 10px;
            object-fit: cover;
        }
        .post-new-btn {
            background-color: #2563EB; /* bg-blue-600 */
            color: white;
            padding: 10px 15px;
            border-radius: 6px;
            font-weight: 500;
            transition: background-color 0.2s ease;
            white-space: nowrap; /* Ngăn nút bị xuống dòng */
        }
        .post-new-btn:hover {
            background-color: #1D4ED8; /* bg-blue-700 */
        }
        .post-new-btn:disabled {
            background-color: #9CA3AF; /* bg-gray-400 */
            cursor: not-allowed;
        }
        .category-tag {
            background-color: #3B82F6; /* bg-blue-500 */
            color: white;
            font-size: 0.75rem; /* text-xs */
            font-weight: 500;
            padding: 4px 8px;
            border-radius: 4px;
            display: inline-block;
            margin-bottom: 10px;
        }
        /* Title colors */
        .title-main { color: #111827; /* text-gray-900 */ }
        .title-article { color: #1F2937; /* text-gray-800 */ }
        .title-article:hover { color: #2563EB; /* text-blue-600 */ }
        .subtitle-date { color: #2563EB; /* text-blue-600 */ }
        .section-title { color: #111827; /* text-gray-900 */ }

        /* Pagination */
        .pagination a {
            border-color: #D1D5DB; /* border-gray-300 */
            background-color: #FFFFFF; /* bg-white */
            color: #6B7280; /* text-gray-500 */
        }
        .pagination a:hover {
            background-color: #F9FAFB; /* bg-gray-50 */
        }
        .pagination a[aria-current="page"] {
            border-color: #2563EB; /* border-blue-600 */
            background-color: #2563EB; /* bg-blue-600 */
            color: #FFFFFF; /* text-white */
        }
        /* Footer Text */
        .footer-text {
            color: #6B7280; /* text-gray-500 */
        }

        /* Modal styles */
        .modal {
            display: none; /* Hidden by default */
            position: fixed;
            z-index: 1000;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            overflow: auto;
            background-color: rgba(0,0,0,0.5); /* Black w/ opacity */
            align-items: center;
            justify-content: center;
        }
        .modal-content {
            background-color: #fff;
            margin: auto;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 4px 6px rgba(0,0,0,0.1);
            width: 90%;
            max-width: 600px; /* Tăng chiều rộng modal để chứa thêm trường */
        }
        .modal-header {
            padding-bottom: 10px;
            border-bottom: 1px solid #E5E7EB;
            font-size: 1.25rem; /* text-xl */
            font-weight: 600; /* font-semibold */
        }
        .modal-body {
            padding-top: 10px;
            padding-bottom: 20px;
            max-height: 70vh; /* Giới hạn chiều cao modal body và cho phép cuộn */
            overflow-y: auto;
        }
        .modal-footer {
            padding-top: 10px;
            border-top: 1px solid #E5E7EB;
            text-align: right;
        }
        .modal-close-btn {
            background-color: #6B7280; /* bg-gray-500 */
            color: white;
        }
        .modal-close-btn:hover {
            background-color: #4B5563; /* bg-gray-600 */
        }
        .modal-save-btn {
             background-color: #2563EB; /* bg-blue-600 */
            color: white;
        }
        .modal-save-btn:hover {
             background-color: #1D4ED8; /* bg-blue-700 */
        }
        .image-preview-container {
            margin-top: 8px;
            width: 150px; /* Kích thước vùng xem trước */
            height: 100px;
            border: 1px dashed #D1D5DB; /* border-gray-300 */
            display: flex;
            align-items: center;
            justify-content: center;
            text-align: center;
            background-color: #F9FAFB; /* bg-gray-50 */
            border-radius: 4px;
            overflow: hidden; /* Để ảnh không tràn ra ngoài */
        }
        .image-preview-container img {
            max-width: 100%;
            max-height: 100%;
            object-fit: cover;
        }
        .image-preview-container span {
            font-size: 0.875rem; /* text-sm */
            color: #6B7280; /* text-gray-500 */
        }

    </style>
</head>
<body>

    <div class="responsive-blog-container">
        <div class="flex flex-col sm:flex-row justify-between items-center mb-4 sm:mb-6">
            <h1 class="text-2xl sm:text-3xl font-bold title-main mb-3 sm:mb-0 text-center sm:text-left">Điểm Tin Thị Trường Hàng Ngày</h1>
            <button id="openNewPostModalBtn" class="post-new-btn w-full sm:w-auto" style="display: none;"> <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 inline-block mr-1 -mt-0.5" viewBox="0 0 20 20" fill="currentColor">
                    <path fill-rule="evenodd" d="M10 3a1 1 0 011 1v4h4a1 1 0 110 2h-4v4a1 1 0 11-2 0v-4H5a1 1 0 110-2h4V4a1 1 0 011-1z" clip-rule="evenodd" />
                </svg>
                Đăng Bài Mới
            </button>
        </div>
        <p id="bulletin-subtitle" class="font-medium mb-6 sm:mb-8 text-md sm:text-lg text-center sm:text-left subtitle-date"></p>

        <div id="articles-list">
            <div class="mb-8 md:mb-10">
                <article class="article-card-responsive" data-article-id="featured-post-1">
                    <img src="https://placehold.co/800x400/E0E7FF/374151?text=Ảnh+Nổi+Bật" alt="Ảnh bài viết nổi bật" class="featured-article-image" onerror="this.src='https://placehold.co/800x400/EFEFEF/AAAAAA?text=Lỗi+Ảnh+Nổi+Bật'">
                    <div class="article-card-content">
                        <span class="category-tag">Xu Hướng Đầu Tư</span>
                        <h2 class="text-xl sm:text-2xl md:text-3xl font-bold mt-1 mb-2 sm:mb-3 transition-colors title-article"><a href="#">Dòng Vốn Thông Minh Đang Hướng Về Đâu Trong Nửa Cuối Năm 2025?</a></h2>
                        <div class="author-info flex items-center mb-2 sm:mb-3">
                            <img src="https://placehold.co/100x100/7F9CF5/EBF4FF?text=Admin" alt="Ảnh đại diện Admin" class="author-avatar" onerror="this.src='https://placehold.co/100x100/EFEFEF/AAAAAA?text=Lỗi+Avatar'">
                            <div>
                                <span class="font-semibold text-sm sm:text-base author-name">Admin Fisc</span>
                                <p class="text-xs sm:text-sm author-meta">Đăng lúc 09:00 - <span class="post-date">27/05/2025</span></p>
                            </div>
                        </div>
                        <p class="text-gray-600 text-sm sm:text-base leading-relaxed summary mb-2 sm:mb-3">
                            Trong bối cảnh thị trường có nhiều biến động, việc xác định các xu hướng đầu tư chủ đạo là vô cùng quan trọng. Phân tích dòng vốn cho thấy sự dịch chuyển đáng kể sang các nhóm ngành công nghệ, năng lượng tái tạo và bất động sản khu công nghiệp...
                        </p>
                        <span class="read-more-btn" onclick="toggleArticle('featured-post-1')">Đọc thêm &darr;</span>
                        <div class="article-content-full">
                            <h4>Phân tích chuyên sâu:</h4>
                            <p>Nội dung chi tiết về dòng vốn, các yếu tố vĩ mô và vi mô tác động. Đánh giá tiềm năng và rủi ro của từng nhóm ngành. Sự phục hồi kinh tế toàn cầu và các chính sách hỗ trợ trong nước đang tạo đà cho các ngành này bứt phá.</p>
                            <img src="https://placehold.co/700x350/D1FAE5/1F2937?text=Biểu+Đồ+Dòng+Vốn" alt="Biểu đồ phân bổ dòng vốn" class="w-full h-auto rounded-md my-3" onerror="this.src='https://placehold.co/700x350/EFEFEF/AAAAAA?text=Lỗi+Biểu+Đồ'">
                            <h4>Khuyến nghị:</h4>
                            <p>Nhà đầu tư nên cân nhắc đa dạng hóa danh mục, tập trung vào các doanh nghiệp có nền tảng cơ bản tốt, tiềm năng tăng trưởng dài hạn và hưởng lợi từ các xu hướng vĩ mô.</p>
                        </div>
                    </div>
                </article>
            </div>

            <h3 class="text-xl sm:text-2xl font-semibold mb-4 sm:mb-6 section-title">Các Phân Tích Khác</h3>
            <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 sm:gap-6">
                <article class="article-card-responsive" data-article-id="post-grid-1">
                    <img src="https://placehold.co/400x250/DBEAFE/4B5563?text=Ngân+Hàng" alt="Cổ phiếu ngân hàng" class="article-image" onerror="this.src='https://placehold.co/400x250/EFEFEF/AAAAAA?text=Lỗi+Ảnh+NH'">
                    <div class="article-card-content">
                        <span class="category-tag">Phân Tích Cổ Phiếu</span>
                         <h2 class="text-lg sm:text-xl font-bold mt-1 mb-2 transition-colors title-article"><a href="#">Cổ Phiếu Ngân Hàng: Triển Vọng Quý 3</a></h2>
                        <div class="author-info flex items-center mb-2">
                            <img src="https://placehold.co/100x100/818CF8/EBF4FF?text=TV1" alt="Ảnh đại diện TV1" class="author-avatar" onerror="this.src='https://placehold.co/100x100/EFEFEF/AAAAAA?text=Lỗi+Avatar'">
                            <div>
                                <span class="font-semibold text-sm author-name">Chuyên Gia A</span>
                                <p class="text-xs author-meta">08:15 - <span class="post-date">27/05/2025</span></p>
                            </div>
                        </div>
                        <p class="text-gray-600 text-sm leading-relaxed summary">
                            Sau giai đoạn điều chỉnh, nhiều cổ phiếu ngân hàng đang ở vùng giá hấp dẫn. Liệu đây có phải cơ hội?
                        </p>
                        <span class="read-more-btn" onclick="toggleArticle('post-grid-1')">Đọc thêm &darr;</span>
                        <div class="article-content-full">
                            <h4>Chi tiết:</h4>
                            <p>Phân tích KQKD quý 2, triển vọng NIM, chất lượng tài sản của VCB, TCB, MBB.</p>
                        </div>
                    </div>
                </article>

                <article class="article-card-responsive" data-article-id="post-grid-2">
                    <img src="https://placehold.co/400x250/DDD6FE/4B5563?text=Thị+Trường" alt="Nhận định thị trường" class="article-image" onerror="this.src='https://placehold.co/400x250/EFEFEF/AAAAAA?text=Lỗi+Ảnh+TT'">
                    <div class="article-card-content">
                         <span class="category-tag">Nhận Định Thị Trường</span>
                        <h2 class="text-lg sm:text-xl font-bold mt-1 mb-2 transition-colors title-article"><a href="#">Thị Trường Tháng 6: Yếu Tố Cần Lưu Ý</a></h2>
                        <div class="author-info flex items-center mb-2">
                            <img src="https://placehold.co/100x100/A78BFA/EBF4FF?text=TV2" alt="Ảnh đại diện TV2" class="author-avatar" onerror="this.src='https://placehold.co/100x100/EFEFEF/AAAAAA?text=Lỗi+Avatar'">
                            <div>
                                <span class="font-semibold text-sm author-name">Nhà Phân Tích B</span>
                                <p class="text-xs author-meta">07:50 - <span class="post-date">27/05/2025</span></p>
                            </div>
                        </div>
                        <p class="text-gray-600 text-sm leading-relaxed summary">
                            Các sự kiện kinh tế vĩ mô và diễn biến dòng tiền sẽ định hình xu hướng thị trường tháng 6.
                        </p>
                        <span class="read-more-btn" onclick="toggleArticle('post-grid-2')">Đọc thêm &darr;</span>
                        <div class="article-content-full">
                            <h4>Các yếu tố chính:</h4>
                            <ul><li>Chính sách tiền tệ.</li><li>Số liệu lạm phát.</li></ul>
                        </div>
                    </div>
                </article>

                <article class="article-card-responsive" data-article-id="post-grid-3">
                     <div class="article-card-content">
                         <span class="category-tag">Chiến Lược Giao Dịch</span>
                        <h2 class="text-lg sm:text-xl font-bold mt-1 mb-2 transition-colors title-article"><a href="#">Xây Dựng Danh Mục Bền Vững</a></h2>
                        <div class="author-info flex items-center mb-2">
                            <img src="https://placehold.co/100x100/FBBF24/FFFBEB?text=TV3" alt="Ảnh đại diện TV3" class="author-avatar" onerror="this.src='https://placehold.co/100x100/EFEFEF/AAAAAA?text=Lỗi+Avatar'">
                            <div>
                                <span class="font-semibold text-sm author-name">Cố Vấn C</span>
                                <p class="text-xs author-meta">10:30 - <span class="post-date">26/05/2025</span></p>
                            </div>
                        </div>
                        <p class="text-gray-600 text-sm leading-relaxed summary">
                            Nguyên tắc phân bổ tài sản, quản lý rủi ro và lựa chọn cổ phiếu cho người mới.
                        </p>
                        <span class="read-more-btn" onclick="toggleArticle('post-grid-3')">Đọc thêm &darr;</span>
                        <div class="article-content-full">
                            <h4>Các bước:</h4> <p>1. Xác định mục tiêu. 2. Lựa chọn tài sản.</p>
                        </div>
                    </div>
                </article>

                <article class="article-card-responsive" data-article-id="post-grid-4">
                    <img src="https://placehold.co/400x250/A5F3FC/0E7490?text=Công+Nghệ" alt="Tin công nghệ" class="article-image" onerror="this.src='https://placehold.co/400x250/EFEFEF/AAAAAA?text=Lỗi+Ảnh+CN'">
                    <div class="article-card-content">
                        <span class="category-tag">Tin Doanh Nghiệp</span>
                        <h2 class="text-lg sm:text-xl font-bold mt-1 mb-2 transition-colors title-article"><a href="#">FPT Ký Hợp Đồng Lớn Tại Nhật</a></h2>
                        <div class="author-info flex items-center mb-2">
                            <img src="https://placehold.co/100x100/818CF8/EBF4FF?text=TV1" alt="Ảnh đại diện TV1" class="author-avatar" onerror="this.src='https://placehold.co/100x100/EFEFEF/AAAAAA?text=Lỗi+Avatar'">
                            <div>
                                <span class="font-semibold text-sm author-name">Chuyên Gia A</span>
                                <p class="text-xs author-meta">14:00 - <span class="post-date">26/05/2025</span></p>
                            </div>
                        </div>
                        <p class="text-gray-600 text-sm leading-relaxed summary">
                            FPT Software công bố ký hợp đồng triệu USD với đối tác ô tô Nhật Bản.
                        </p>
                        <span class="read-more-btn" onclick="toggleArticle('post-grid-4')">Đọc thêm &darr;</span>
                        <div class="article-content-full">
                            <h4>Chi tiết:</h4><p>Hợp đồng phát triển phần mềm cho xe tự hành.</p>
                        </div>
                    </div>
                </article>

                <article class="article-card-responsive" data-article-id="post-grid-5">
                    <img src="https://placehold.co/400x250/FECACA/7F1D1D?text=Vàng" alt="Giá vàng" class="article-image" onerror="this.src='https://placehold.co/400x250/EFEFEF/AAAAAA?text=Lỗi+Ảnh+Vàng'">
                    <div class="article-card-content">
                        <span class="category-tag">Hàng Hóa</span>
                        <h2 class="text-lg sm:text-xl font-bold mt-1 mb-2 transition-colors title-article"><a href="#">Giá Vàng Biến Động Mạnh: Nên Mua Hay Bán?</a></h2>
                        <div class="author-info flex items-center mb-2">
                            <img src="https://placehold.co/100x100/A78BFA/EBF4FF?text=TV2" alt="Ảnh đại diện TV2" class="author-avatar" onerror="this.src='https://placehold.co/100x100/EFEFEF/AAAAAA?text=Lỗi+Avatar'">
                            <div>
                                <span class="font-semibold text-sm author-name">Nhà Phân Tích B</span>
                                <p class="text-xs author-meta">11:20 - <span class="post-date">26/05/2025</span></p>
                            </div>
                        </div>
                        <p class="text-gray-600 text-sm leading-relaxed summary">
                            Giá vàng thế giới và trong nước có những phiên tăng giảm khó lường. Chuyên gia đưa ra lời khuyên.
                        </p>
                        <span class="read-more-btn" onclick="toggleArticle('post-grid-5')">Đọc thêm &darr;</span>
                        <div class="article-content-full">
                            <h4>Phân tích:</h4><p>Ảnh hưởng từ chính sách FED và căng thẳng địa chính trị.</p>
                        </div>
                    </div>
                </article>

                <article class="article-card-responsive" data-article-id="post-grid-6">
                     <div class="article-card-content">
                        <span class="category-tag">Kiến Thức Cơ Bản</span>
                        <h2 class="text-lg sm:text-xl font-bold mt-1 mb-2 transition-colors title-article"><a href="#">Chỉ Số P/E Là Gì? Cách Sử Dụng Hiệu Quả</a></h2>
                        <div class="author-info flex items-center mb-2">
                            <img src="https://placehold.co/100x100/FBBF24/FFFBEB?text=TV3" alt="Ảnh đại diện TV3" class="author-avatar" onerror="this.src='https://placehold.co/100x100/EFEFEF/AAAAAA?text=Lỗi+Avatar'">
                            <div>
                                <span class="font-semibold text-sm author-name">Cố Vấn C</span>
                                <p class="text-xs author-meta">09:00 - <span class="post-date">25/05/2025</span></p>
                            </div>
                        </div>
                        <p class="text-gray-600 text-sm leading-relaxed summary">
                            Giải thích về chỉ số P/E (Price to Earnings ratio) và cách nhà đầu tư có thể sử dụng nó để đánh giá cổ phiếu.
                        </p>
                        <span class="read-more-btn" onclick="toggleArticle('post-grid-6')">Đọc thêm &darr;</span>
                        <div class="article-content-full">
                            <h4>Lưu ý:</h4><p>P/E chỉ là một trong nhiều yếu tố. Cần kết hợp với các chỉ số khác.</p>
                        </div>
                    </div>
                </article>

                <article class="article-card-responsive" data-article-id="post-gemini-1">
                    <img src="https://placehold.co/400x250/BFDBFE/1E3A8A?text=Gemini+Post" alt="Bài viết từ Gemini" class="article-image" onerror="this.src='https://placehold.co/400x250/EFEFEF/AAAAAA?text=Lỗi+Ảnh+Gemini'">
                    <div class="article-card-content">
                        <span class="category-tag">Tin Tức Gemini</span>
                         <h2 class="text-lg sm:text-xl font-bold mt-1 mb-2 transition-colors title-article"><a href="#">Tiêu Đề Bài Viết Mới Từ Gemini</a></h2>
                        <div class="author-info flex items-center mb-2">
                            <img src="https://placehold.co/100x100/C7D2FE/4338CA?text=GMN" alt="Ảnh đại diện Gemini" class="author-avatar" onerror="this.src='https://placehold.co/100x100/EFEFEF/AAAAAA?text=Lỗi+Avatar'">
                            <div>
                                <span class="font-semibold text-sm author-name">Gemini Bot</span>
                                <p class="text-xs author-meta">15:00 - <span class="post-date">27/05/2025</span></p>
                            </div>
                        </div>
                        <p class="text-gray-600 text-sm leading-relaxed summary">
                            Đây là phần tóm tắt cho bài viết mới được tạo bởi Gemini. Bạn có thể thay thế nội dung này bằng thông tin thực tế.
                        </p>
                        <span class="read-more-btn" onclick="toggleArticle('post-gemini-1')">Đọc thêm &darr;</span>
                        <div class="article-content-full">
                            <h4>Nội dung chi tiết từ Gemini:</h4>
                            <p>Phần nội dung đầy đủ của bài viết sẽ được hiển thị ở đây. Gemini có thể giúp bạn tạo ra các phân tích, nhận định hoặc tin tức thị trường một cách nhanh chóng và hiệu quả.</p>
                            <ul>
                                <li>Điểm nổi bật 1 của bài viết.</li>
                                <li>Điểm nổi bật 2 với các phân tích sâu hơn.</li>
                                <li>Kết luận và khuyến nghị (nếu có).</li>
                            </ul>
                            <p>Hãy nhớ rằng đây chỉ là nội dung mẫu, bạn cần chỉnh sửa cho phù hợp với yêu cầu cụ thể.</p>
                             <!-- <div class="pasted-code-block">
                                <h4>Mã Code Đính Kèm:</h4>
                                <pre><code>&lt;p&gt;Đây là một đoạn code mẫu.&lt;/p&gt;</code></pre>
                             </div> -->
                        </div>
                    </div>
                </article>
                </div>
        </div>
        
        <div class="mt-8 sm:mt-10 flex justify-center">
            <nav class="inline-flex rounded-md shadow-sm -space-x-px pagination" aria-label="Pagination">
                <a href="#" class="relative inline-flex items-center px-2 py-2 rounded-l-md text-sm font-medium">
                    <span class="sr-only">Previous</span>
                    <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z" clip-rule="evenodd" /></svg>
                </a>
                <a href="#" aria-current="page" class="relative z-10 inline-flex items-center px-4 py-2 text-sm font-medium">1</a>
                <a href="#" class="relative inline-flex items-center px-4 py-2 text-sm font-medium">2</a>
                <a href="#" class="relative inline-flex items-center px-4 py-2 text-sm font-medium">3</a>
                <a href="#" class="relative inline-flex items-center px-2 py-2 rounded-r-md text-sm font-medium">
                    <span class="sr-only">Next</span>
                    <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"><path fill-rule="evenodd" d="M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z" clip-rule="evenodd" /></svg>
                </a>
            </nav>
        </div>

        <div class="mt-8 sm:mt-10 pt-6 border-t border-gray-200 text-center footer-text">
            <p class="text-xs">
                Các bài viết thể hiện quan điểm cá nhân của tác giả, không nhất thiết phản ánh quan điểm của [Tên Trang Web Của Bạn].
            </p>
            <p class="text-xs mt-1">
                &copy; <span id="current-year"></span> [Tên Trang Web Của Bạn]. Mọi quyền được bảo lưu.
            </p>
        </div>
    </div>

    <div id="newPostModal" class="modal" style="display: none;">
        <div class="modal-content">
            <div class="modal-header">
                Đăng Bài Viết Mới
            </div>
            <div class="modal-body">
                <form id="newPostForm">
                    <div class="mb-4">
                        <label for="postTitle" class="block text-sm font-medium text-gray-700 mb-1">Tiêu đề bài viết: <span class="text-red-500">*</span></label>
                        <input type="text" id="postTitle" name="postTitle" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" required>
                    </div>
                    <div class="mb-4">
                        <label for="postCategory" class="block text-sm font-medium text-gray-700 mb-1">Chuyên mục:</label>
                        <input type="text" id="postCategory" name="postCategory" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" placeholder="Ví dụ: Phân Tích Cổ Phiếu">
                    </div>
                    <div class="mb-4">
                        <label for="postSummary" class="block text-sm font-medium text-gray-700 mb-1">Tóm tắt: <span class="text-red-500">*</span></label>
                        <textarea id="postSummary" name="postSummary" rows="3" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500" required></textarea>
                    </div>
                    <p class="text-xs text-gray-500 mb-3">Cung cấp Nội dung đầy đủ (văn bản) HOẶC Dán mã HTML/Code. <span class="text-red-500">*</span></p>
                    <div class="mb-4">
                        <label for="postContent" class="block text-sm font-medium text-gray-700 mb-1">Nội dung đầy đủ (văn bản):</label>
                        <textarea id="postContent" name="postContent" rows="6" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500"></textarea>
                    </div>
                    
                    <div class="mb-4">
                        <label for="postHtmlCode" class="block text-sm font-medium text-gray-700 mb-1">Dán mã HTML/Code (nếu có):</label>
                        <textarea id="postHtmlCode" name="postHtmlCode" rows="8" class="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 font-mono text-sm" placeholder="<p>Dán mã HTML của bạn vào đây...</p>"></textarea>
                    </div>
                     <div class="mb-4">
                        <label for="postImageFile" class="block text-sm font-medium text-gray-700 mb-1">Tải ảnh thumbnail (từ máy tính):</label>
                        <input type="file" id="postImageFile" name="postImageFile" accept="image/*" class="w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-md file:border-0 file:text-sm file:font-semibold file:bg-blue-50 file:text-blue-700 hover:file:bg-blue-100">
                        <div id="imagePreviewContainer" class="image-preview-container">
                           <span id="imagePreviewText">Xem trước ảnh</span>
                           <img id="imagePreview" src="#" alt="Xem trước ảnh đã chọn" class="hidden"/>
                        </div>
                    </div>
                </form>
            </div>
            <div class="modal-footer">
                <button id="closeNewPostModalBtn" class="post-new-btn modal-close-btn mr-2">Hủy</button>
                <button id="saveNewPostBtn" class="post-new-btn modal-save-btn">Đăng Bài</button>
            </div>
        </div>
    </div>


    <script>
        // --- Cập nhật ngày tháng ---
        const today = new Date();
        const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
        const formattedDate = "Bản tin ngày " + today.toLocaleDateString('vi-VN', options);
        
        const subtitleElement = document.getElementById('bulletin-subtitle');
        if (subtitleElement) {
            subtitleElement.textContent = formattedDate;
        }
        
        const yearElement = document.getElementById('current-year');
        if (yearElement) {
            yearElement.textContent = today.getFullYear();
        }

        document.querySelectorAll('.post-date').forEach(el => {
            // Giữ ngày placeholder hoặc cập nhật động nếu cần
        });

        // --- Chức năng Đọc thêm/Ẩn bớt ---
        function toggleArticle(articleId) {
            const articleCard = document.querySelector(`.article-card-responsive[data-article-id="${articleId}"]`);
            if (!articleCard) return;

            const contentFull = articleCard.querySelector('.article-content-full');
            const readMoreBtn = articleCard.querySelector('.read-more-btn');

            if (!contentFull || !readMoreBtn) return; 

            if (contentFull.style.display === "block") {
                contentFull.style.display = "none";
                readMoreBtn.innerHTML = "Đọc thêm &darr;";
            } else {
                contentFull.style.display = "block";
                readMoreBtn.innerHTML = "Ẩn bớt &uarr;";
            }
        }

        // --- Phân quyền và Chức năng Đăng Bài Mới ---
        const openNewPostModalButton = document.getElementById('openNewPostModalBtn');
        const newPostModal = document.getElementById('newPostModal');
        const closeNewPostModalButton = document.getElementById('closeNewPostModalBtn');
        const saveNewPostButton = document.getElementById('saveNewPostBtn');
        const newPostForm = document.getElementById('newPostForm');
        const postImageFileInput = document.getElementById('postImageFile');
        const imagePreview = document.getElementById('imagePreview');
        const imagePreviewText = document.getElementById('imagePreviewText');


        // Mô phỏng vai trò người dùng. Thay đổi giá trị này thành 'admin', 'manager', hoặc 'user' để kiểm tra.
        // Trong ứng dụng thực tế, giá trị này sẽ được lấy từ session hoặc token của người dùng đã đăng nhập.
        let currentUserRole = 'admin'; // Có thể là 'admin', 'manager', 'user'

        function checkUserRoleAndSetupNewPostButton() {
            if (!openNewPostModalButton) return;

            if (currentUserRole === 'admin' || currentUserRole === 'manager') {
                openNewPostModalButton.style.display = 'inline-flex'; 
                openNewPostModalButton.disabled = false;
                openNewPostModalButton.addEventListener('click', () => {
                    if (newPostModal) {
                        newPostModal.style.display = 'flex'; 
                        newPostForm.reset(); // Reset form mỗi khi mở
                        imagePreview.classList.add('hidden'); // Ẩn ảnh preview cũ
                        imagePreview.src = "#";
                        imagePreviewText.classList.remove('hidden'); // Hiện lại text placeholder
                    }
                });
            } else {
                openNewPostModalButton.style.display = 'none'; 
            }
        }

        // Xử lý xem trước ảnh khi người dùng chọn file
        if (postImageFileInput && imagePreview && imagePreviewText) {
            postImageFileInput.addEventListener('change', function(event) {
                const file = event.target.files[0];
                if (file && file.type.startsWith('image/')) {
                    const reader = new FileReader();
                    reader.onload = function(e) {
                        imagePreview.src = e.target.result;
                        imagePreview.classList.remove('hidden');
                        imagePreviewText.classList.add('hidden');
                    }
                    reader.readAsDataURL(file);
                } else {
                    imagePreview.classList.add('hidden');
                    imagePreview.src = "#";
                    imagePreviewText.classList.remove('hidden');
                    if (file) { // Nếu chọn file nhưng không phải ảnh
                         displayCustomAlert("Vui lòng chọn một file hình ảnh.");
                         postImageFileInput.value = ""; // Xóa file đã chọn nếu không hợp lệ
                    }
                }
            });
        }

        // Đóng Modal
        if (closeNewPostModalButton && newPostModal) {
            closeNewPostModalButton.addEventListener('click', () => {
                newPostModal.style.display = 'none';
            });
        }
        
        window.addEventListener('click', (event) => {
            if (event.target === newPostModal && newPostModal) { 
                 newPostModal.style.display = 'none';
            }
        });

        // Xử lý lưu bài viết mới (mô phỏng)
        if (saveNewPostButton && newPostModal && newPostForm) {
            saveNewPostButton.addEventListener('click', () => {
                const title = document.getElementById('postTitle').value.trim();
                const category = document.getElementById('postCategory').value.trim();
                const summary = document.getElementById('postSummary').value.trim();
                const content = document.getElementById('postContent').value.trim();
                const htmlCode = document.getElementById('postHtmlCode').value.trim(); 
                const imageFile = postImageFileInput.files[0]; // Lấy file ảnh

                // Validation: Tiêu đề và Tóm tắt là bắt buộc
                if (!title || !summary) {
                    displayCustomAlert("Vui lòng điền đầy đủ Tiêu đề và Tóm tắt.");
                    return;
                }

                // Validation: Phải có Nội dung văn bản HOẶC Mã HTML
                if (!content && !htmlCode) {
                    displayCustomAlert("Vui lòng cung cấp Nội dung đầy đủ (văn bản) hoặc Dán mã HTML/Code.");
                    return;
                }
                
                let imageName = imageFile ? imageFile.name : "Không có ảnh";
                let imagePreviewSrc = imageFile ? imagePreview.src : "Không có ảnh"; // Lấy src từ preview nếu có

                console.log("Đang lưu bài viết mới:", { 
                    title, 
                    category, 
                    summary, 
                    content: content ? content : "Không có nội dung văn bản", // Gửi "Không có..." nếu trống
                    htmlCode: htmlCode ? htmlCode : "Không có mã HTML", // Gửi "Không có..." nếu trống
                    imageFileName: imageName,
                    imagePreviewDataUrl: imagePreviewSrc // (Đây là data URL, trong thực tế bạn sẽ upload file)
                });
                
                // --- Logic để tạo và chèn card bài viết mới (ví dụ) ---
                // Bạn cần một hàm như createNewArticleCard(data) để làm điều này
                // Ví dụ:
                // const newArticleData = { title, category, summary, content, htmlCode, imageUrl: imagePreviewSrc, author: "Admin", date: new Date().toLocaleDateString('vi-VN')};
                // const articlesContainer = document.querySelector('#articles-list .grid');
                // if (articlesContainer) {
                //     const newCard = createNewArticleCardElement(newArticleData); // Bạn cần tự viết hàm này
                //     articlesContainer.insertBefore(newCard, articlesContainer.firstChild); // Thêm vào đầu danh sách
                // }
                // --- Kết thúc ví dụ chèn card ---


                newPostModal.style.display = 'none';
                newPostForm.reset(); 
                imagePreview.classList.add('hidden'); // Reset image preview
                imagePreview.src = "#";
                imagePreviewText.classList.remove('hidden');
                postImageFileInput.value = ""; // Quan trọng: reset file input

                displayCustomAlert(`Bài viết "${title}" đã được đăng (mô phỏng).`);
            });
        }
        
        function displayCustomAlert(message) {
            const alertBox = document.createElement('div');
            alertBox.style.position = 'fixed';
            alertBox.style.top = '20px';
            alertBox.style.left = '50%';
            alertBox.style.transform = 'translateX(-50%)';
            alertBox.style.padding = '15px 20px';
            alertBox.style.backgroundColor = '#2563EB'; 
            alertBox.style.color = 'white';
            alertBox.style.borderRadius = '6px';
            alertBox.style.boxShadow = '0 4px 12px rgba(0,0,0,0.15)';
            alertBox.style.zIndex = '2000';
            alertBox.style.fontSize = '0.9rem';
            alertBox.textContent = message;
            document.body.appendChild(alertBox);

            setTimeout(() => {
                if (alertBox.parentNode) { 
                    alertBox.remove();
                }
            }, 3000);
        }

        document.addEventListener('DOMContentLoaded', () => {
            checkUserRoleAndSetupNewPostButton();
        });

    </script>

</body>
</html>

Tham gia thảo luận

Compare listings

So sánh