+
Content Website
-
- Tinjau pengajuan perubahan dari kontributor dan terapkan ke konten live.
+
+ Di bagian atas: pengajuan baru yang perlu disetujui. Di bawah: konten
+ live di semua tab (hanya lihat) untuk membandingkan dengan pengajuan.
-
- setSearch(e.target.value)}
- className="max-w-md"
- />
-
-
+
+
+
+ Perubahan menunggu persetujuan
+
+
+ {filtered.length} pending
+
+
+
+ Setujui atau tolak di sini. Gunakan{" "}
+ Lihat konten live{" "}
+ untuk membuka tab yang sama dengan bagian yang diajukan.
+
-
-
- {loading ? (
-
-
-
- ) : (
-
-
-
- Judul
- Bagian
- Pengaju
- Tanggal
- Aksi
-
-
-
- {filtered.length === 0 ? (
-
-
- Tidak ada pengajuan tertunda.
-
+
+ setSearch(e.target.value)}
+ className="max-w-md"
+ />
+
+
+
+
+
+ {loading ? (
+
+
+
+ ) : (
+
+
+
+ Judul
+ Bagian
+ Pengaju
+ Tanggal
+ Aksi
- ) : (
- filtered.map((item) => (
-
-
- {item.title}
-
-
-
- {DOMAIN_LABEL[item.domain] ?? item.domain}
-
-
-
- {item.submitter_name || `User #${item.submitted_by_id}`}
-
-
- {formatDate(item.created_at)}
-
-
-
-
+
+
+ {filtered.length === 0 ? (
+
+
+ Tidak ada pengajuan tertunda.
- ))
- )}
-
-
- )}
-
-
+ ) : (
+ filtered.map((item) => (
+
+
+ {item.title}
+
+
+
+ {DOMAIN_LABEL[item.domain] ?? item.domain}
+
+
+
+ {item.submitter_name ||
+ `User #${item.submitted_by_id}`}
+
+
+ {formatDate(item.created_at)}
+
+
+
+
+
+
+
+
+
+ ))
+ )}
+
+
+ )}
+
+
+
+
+
+
+
+ Konten live (semua tab, hanya lihat)
+
+
+ Data yang sedang ditampilkan di website. Field tidak dapat diubah di
+ sini — bandingkan dengan baris pengajuan di atas sebelum
+ menyetujui.
+
+
+
+
);
}
diff --git a/components/main/content-website.tsx b/components/main/content-website.tsx
index 929a2a4..90dc169 100644
--- a/components/main/content-website.tsx
+++ b/components/main/content-website.tsx
@@ -91,16 +91,33 @@ function setPickedFile(
type ContentWebsiteProps = {
/** User level 2: changes go through approval instead of live CMS APIs. */
contributorMode?: boolean;
+ /** Approver (or admin): load live CMS data but disable all edits (all tabs). */
+ viewOnly?: boolean;
+ /** Omit page title/actions row — parent supplies section headings (e.g. approver layout). */
+ hideHeader?: boolean;
+ /** Parent increments this (e.g. 1,2,3…) to switch the visible tab. */
+ tabFocusSignal?: number;
+ /** Tab id matching `TabsTrigger` values: hero | about | products | services | partners | popup */
+ tabFocusTarget?: string;
+ /** Increment (e.g. after approver applies CMS) to reload live data from API without remounting. */
+ liveDataReloadSignal?: number;
};
export default function ContentWebsite({
contributorMode = false,
+ viewOnly = false,
+ hideHeader = false,
+ tabFocusSignal = 0,
+ tabFocusTarget = "",
+ liveDataReloadSignal = 0,
}: ContentWebsiteProps) {
const [activeTab, setActiveTab] = useState("hero");
const [loading, setLoading] = useState(true);
const [saving, setSaving] = useState(false);
const [editMode, setEditMode] = useState(!contributorMode);
- const canInteract = !contributorMode || editMode;
+ const canInteract = (!contributorMode || editMode) && !viewOnly;
+ const dimContributorPreview =
+ contributorMode && !editMode && !viewOnly;
const [heroId, setHeroId] = useState
(null);
const [heroImageId, setHeroImageId] = useState(null);
@@ -262,6 +279,24 @@ export default function ContentWebsite({
loadAll();
}, [loadAll]);
+ useEffect(() => {
+ if (!viewOnly) return;
+ setProductModalOpen(false);
+ setServiceModalOpen(false);
+ setPartnerModalOpen(false);
+ setPopupModalOpen(false);
+ }, [viewOnly]);
+
+ useEffect(() => {
+ if (tabFocusSignal < 1 || !tabFocusTarget) return;
+ setActiveTab(tabFocusTarget);
+ }, [tabFocusSignal, tabFocusTarget]);
+
+ useEffect(() => {
+ if (liveDataReloadSignal < 1) return;
+ void loadAll();
+ }, [liveDataReloadSignal, loadAll]);
+
async function saveHeroTab() {
if (!heroPrimary.trim()) {
await Swal.fire({ icon: "warning", title: "Main title is required" });
@@ -1239,14 +1274,42 @@ export default function ContentWebsite({
return (
-
-
-
Content Website
-
- Update homepage content, products, services, and partners.
-
+ {!hideHeader ? (
+
+
+
+ Content Website
+
+
+ {viewOnly
+ ? "Konten live di semua tab: hanya lihat. Pengajuan perubahan ditangani di bagian atas halaman."
+ : "Update homepage content, products, services, and partners."}
+
+
+
+
+ {contributorMode ? (
+
+ ) : null}
+
-
+ ) : viewOnly ? (
+
- {contributorMode ? (
-
- ) : null}
-
+ ) : null}
- {contributorMode && !editMode ? (
+ {contributorMode && !editMode && !viewOnly ? (
Aktifkan Edit Mode untuk mengusulkan perubahan. Perubahan akan masuk ke{" "}
My Content menunggu persetujuan approver. Unggah file gambar tidak tersedia sebagai kontributor;
@@ -1279,7 +1332,9 @@ export default function ContentWebsite({
@@ -1305,6 +1360,10 @@ export default function ContentWebsite({
+