feat(ui): add inline Trigger Sync button in ChannelList table and update PIM attribute selector

This commit is contained in:
Inamul-hasan-tec
2026-08-12 13:25:49 +05:30
parent e75efac2dc
commit ed97796480
2 changed files with 33 additions and 8 deletions
@@ -5,13 +5,11 @@ import { channelsApi } from "../api/channels.api";
import { notify } from "../../../services/toast";
const COMMON_PIM_ATTRIBUTES = [
{ code: "name", label: "Product Title / Name" },
{ code: "sku", label: "SKU / Item Code" },
{ code: "description", label: "Product Description" },
{ code: "price", label: "Retail Price" },
{ code: "brand", label: "Brand / Manufacturer" },
{ code: "status", label: "Publication Status" },
{ code: "created_at", label: "Creation Timestamp" },
{ code: "name", label: "Product Title / Name (name)" },
{ code: "code", label: "Product Code / SKU (code)" },
{ code: "description", label: "Product Description (description)" },
{ code: "status", label: "Publication Status (status)" },
{ code: "created_at", label: "Creation Timestamp (created_at)" },
];
const COMMON_CHANNEL_FIELDS = [
+28 -1
View File
@@ -1,6 +1,6 @@
import { useEffect, useState } from "react";
import { useNavigate } from "react-router-dom";
import { Plus, RefreshCw, Radio, CheckCircle, Layers, TrendingUp, ShoppingCart, ShoppingBag, Server, Warehouse, Store, Smartphone, Globe, Monitor } from "lucide-react";
import { Plus, RefreshCw, Radio, CheckCircle, Layers, TrendingUp, ShoppingCart, ShoppingBag, Server, Warehouse, Store, Smartphone, Globe, Monitor, Play } from "lucide-react";
import { PageWrapper } from "../../../components/layouts/PageWrapper";
import { ProtectedRoute } from "../../../components/layouts/ProtectedRoute";
import { Breadcrumb } from "../../../components/layouts/Breadcrumb";
@@ -11,6 +11,8 @@ import { StatsCard } from "../../../components/customs/StatsCard";
import { useChannel } from "../hook/useChannel";
import type { Channel } from "../types/channels.types";
import { ConfirmationModal } from "../../../components/modals/ConfirmationModal";
import { channelsApi } from "../api/channels.api";
import { notify } from "../../../services/toast";
import { Can } from "../../../components/customs/Can";
import { usePermissions } from "../../../hooks/usePermission";
@@ -84,6 +86,31 @@ export default function ChannelList() {
},
{ key: "families", label: "Families", render: (val: any) => val || 0 },
{ key: "products", label: "Products", render: (val: any) => val ? val.toLocaleString() : 0 },
{
key: "syndicate",
label: "Syndication",
render: (_: any, row: Channel) => (
<button
type="button"
onClick={async () => {
try {
notify.info(`Triggering syndication for ${row.name}...`);
const res = await channelsApi.triggerSyndication(row.id);
if (res.status === 'completed') {
notify.success(`Syndication for ${row.name} completed! (${res.success_count} synced)`);
} else {
notify.warning(`Syndication for ${row.name} completed with ${res.failed_count} errors`);
}
} catch {
notify.error("Failed to trigger syndication");
}
}}
className="inline-flex items-center gap-1 px-2.5 py-1 text-xs font-semibold text-primary bg-primary/10 hover:bg-primary/20 rounded transition-colors"
>
<Play className="w-3 h-3" /> Trigger Sync
</button>
),
},
{
key: "createdAt",
label: "Updated",