diff --git a/controllers/serviceController.js b/controllers/serviceController.js index 9c25c63..9cf24a0 100644 --- a/controllers/serviceController.js +++ b/controllers/serviceController.js @@ -1,5 +1,6 @@ const { getServiceData } = require("../services/service.service"); const Service = require("../models/service"); +const syncServiceMenu = require("../services/syncServiceMenu"); const { addBaseUrlToImages, getFullImageUrl } = require("../utils/imageHelper"); const writeAuditLog = require("../audit/writeAuditLog"); const diffObject = require("../audit/diffObject"); @@ -98,6 +99,8 @@ exports.updateService = async (req, res) => { changes, req, }); + // Sync header menu children to reflect updated service name/slug + await syncServiceMenu(updatedData.services?.items || []); req.flash("success_msg", "Service updated successfully"); res.redirect("/admin/service"); } catch (err) { @@ -168,6 +171,9 @@ exports.update = async (req, res) => { await Service.create(updatedData); } + // Sync header menu children to reflect current service list + await syncServiceMenu(updatedData.services?.items || []); + req.flash("success_msg", "Service updated successfully"); res.redirect("/admin/service"); } catch (err) { diff --git a/scripts/sync-service-menu-now.js b/scripts/sync-service-menu-now.js new file mode 100644 index 0000000..efdb347 --- /dev/null +++ b/scripts/sync-service-menu-now.js @@ -0,0 +1,34 @@ +/** + * One-time script: sync service menu items from DB into HeaderMenu. + * Run: node scripts/sync-service-menu-now.js + */ +const mongoose = require("mongoose"); +const dotenv = require("dotenv"); +dotenv.config(); + +const Service = require("../models/service"); +const syncServiceMenu = require("../services/syncServiceMenu"); + +const MONGODB_URI = process.env.MONGODB_URI || "mongodb://localhost:27017/hailearning"; + +async function run() { + await mongoose.connect(MONGODB_URI); + console.log("✅ Connected to MongoDB"); + + const serviceDoc = await Service.findOne().lean(); + if (!serviceDoc?.services?.items?.length) { + console.log("⚠️ No services found in DB."); + process.exit(0); + } + + console.log(`Found ${serviceDoc.services.items.length} services. Syncing menu...`); + await syncServiceMenu(serviceDoc.services.items); + + console.log("✅ Done."); + process.exit(0); +} + +run().catch((err) => { + console.error("❌ Error:", err); + process.exit(1); +}); diff --git a/services/syncServiceMenu.js b/services/syncServiceMenu.js new file mode 100644 index 0000000..f749871 --- /dev/null +++ b/services/syncServiceMenu.js @@ -0,0 +1,57 @@ +/** + * Sync HeaderMenu children of the "Services" menu item + * to match the current list of services in the database. + * + * Strategy: + * - Find the HeaderMenu item whose url === '/services' + * - Delete all its direct children + * - Re-create one child per service item (url = /services/) + */ + +const HeaderMenu = require("../models/headerMenu"); +const slugify = require("slugify"); + +/** + * @param {Array} serviceItems - array of service objects { slug, name } + */ +const syncServiceMenu = async (serviceItems = []) => { + try { + // 1. Find the "Services" parent menu item + const servicesParent = await HeaderMenu.findOne({ url: "/services" }); + + if (!servicesParent) { + console.warn("[syncServiceMenu] No HeaderMenu item with url=/services found. Skipping sync."); + return; + } + + const parentId = servicesParent._id; + + // 2. Remove all existing children of that parent + await HeaderMenu.deleteMany({ parentId }); + + // 3. Re-create one child per service + const ops = serviceItems + .filter((s) => s && s.slug && s.name) + .map((s, index) => ({ + title: s.name, + slug: slugify(s.name, { lower: true, strict: true }), + url: `/services/${s.slug}`, + parentId, + order: index + 1, + status: "active", + type: "internal", + is_maintainance: false, + })); + + if (ops.length > 0) { + await HeaderMenu.insertMany(ops); + } + + console.log(`[syncServiceMenu] Synced ${ops.length} service menu items under parentId=${parentId}`); + } catch (err) { + // Non-fatal – log but don't crash the main request + console.error("[syncServiceMenu] Error syncing service menu:", err.message); + } +}; + +module.exports = syncServiceMenu; diff --git a/views/admin/home/sections/floatingContact.ejs b/views/admin/home/sections/floatingContact.ejs index d0ff814..a2b023e 100644 --- a/views/admin/home/sections/floatingContact.ejs +++ b/views/admin/home/sections/floatingContact.ejs @@ -2,6 +2,14 @@
+
+
+
+ > +
+
+
@@ -11,21 +19,7 @@
-
-
-
-
Widget visibility
- Enable or disable the floating contact widget on the homepage. -
-
- /> - -
-
-
+