| Server IP : 35.80.110.71 / Your IP : 216.73.216.221 Web Server : Apache/2.4.58 (Ubuntu) System : Linux ip-172-31-21-44 6.17.0-1019-aws #19~24.04.1-Ubuntu SMP Tue Jun 23 18:53:06 UTC 2026 x86_64 User : ubuntu ( 1000) PHP Version : 8.3.31 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/elite-events-storybook/ |
Upload File : |
"use strict";(self.webpackChunkelite_events_nextjs=self.webpackChunkelite_events_nextjs||[]).push([[516],{"./src/components/features/admin/segments/SegmentBuilder/index.tsx":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{__webpack_require__.d(__webpack_exports__,{A:()=>SegmentBuilder});var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/next/dist/compiled/react/jsx-runtime.js"),react__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/next/dist/compiled/react/index.js"),_components_ui__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./src/components/ui/index.ts"),_components_ui_icons__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./src/components/ui/icons/index.ts");const FIELD_OPTIONS=[{value:"total_spent",label:"Total Spent ($)",type:"number"},{value:"orders_count",label:"Order Count",type:"number"},{value:"lifetime_points",label:"Lifetime Points",type:"number"},{value:"current_tier",label:"Loyalty Tier",type:"select"},{value:"created_at",label:"Account Created",type:"date"},{value:"email_domain",label:"Email Domain",type:"text"},{value:"has_reviewed",label:"Has Reviewed",type:"boolean"}],OPERATOR_OPTIONS={number:[{value:"equals",label:"Equals"},{value:"not_equals",label:"Does not equal"},{value:"greater_than",label:"Greater than"},{value:"less_than",label:"Less than"},{value:"greater_than_or_equal",label:"Greater than or equal"},{value:"less_than_or_equal",label:"Less than or equal"}],text:[{value:"equals",label:"Equals"},{value:"not_equals",label:"Does not equal"},{value:"contains",label:"Contains"},{value:"not_contains",label:"Does not contain"}],select:[{value:"equals",label:"Is"},{value:"not_equals",label:"Is not"},{value:"in",label:"Is one of"},{value:"not_in",label:"Is not one of"}],date:[{value:"greater_than",label:"After"},{value:"less_than",label:"Before"},{value:"greater_than_or_equal",label:"On or after"},{value:"less_than_or_equal",label:"On or before"}],boolean:[{value:"equals",label:"Is"}]},TIER_OPTIONS=[{value:"bronze",label:"Bronze"},{value:"silver",label:"Silver"},{value:"gold",label:"Gold"},{value:"platinum",label:"Platinum"}];function SegmentBuilder({segment,onSave,onCancel}){const[name,setName]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(segment?.name||""),[description,setDescription]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(segment?.description||""),[isActive,setIsActive]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(segment?.isActive??!0),[ruleGroups,setRuleGroups]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(segment?.rules||[{conditions:[],logic:"AND"}]),[saving,setSaving]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(!1),[previewCount,setPreviewCount]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null),[loadingPreview,setLoadingPreview]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(!1),getFieldType=field=>{const fieldOption=FIELD_OPTIONS.find(f=>f.value===field);return fieldOption?.type||"text"},updateCondition=(groupIndex,conditionIndex,field,value)=>{const updated=[...ruleGroups],condition=updated[groupIndex].conditions[conditionIndex];if("field"===field){const fieldType=getFieldType(value),operators=OPERATOR_OPTIONS[fieldType];condition.field=value,condition.operator=operators[0]?.value||"equals",condition.value="number"===fieldType?0:"boolean"===fieldType?"true":""}else"operator"===field?condition.operator=value:condition.value=value;setRuleGroups(updated)},previewSegment=(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(async()=>{setLoadingPreview(!0);try{const res=await fetch("/api/admin/segments/preview",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({rules:ruleGroups})}),result=await res.json();result.success&&setPreviewCount(result.count)}catch{}finally{setLoadingPreview(!1)}},[ruleGroups]);(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{if(ruleGroups.some(g=>g.conditions.length>0)){const timer=setTimeout(()=>{previewSegment()},500);return()=>clearTimeout(timer)}setPreviewCount(null)},[ruleGroups,previewSegment]);const renderValueInput=(groupIndex,conditionIndex,condition)=>{const fieldType=getFieldType(condition.field);return"current_tier"===condition.field?"in"===condition.operator||"not_in"===condition.operator?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("select",{multiple:!0,value:Array.isArray(condition.value)?condition.value.map(String):[],onChange:e=>{const selected=Array.from(e.target.selectedOptions).map(opt=>opt.value);updateCondition(groupIndex,conditionIndex,"value",selected)},className:"flex-1 min-w-[150px] px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100",children:TIER_OPTIONS.map(tier=>(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option",{value:tier.value,children:tier.label},tier.value))}):(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("select",{value:String(condition.value),onChange:e=>updateCondition(groupIndex,conditionIndex,"value",e.target.value),className:"flex-1 min-w-[150px] px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100",children:TIER_OPTIONS.map(tier=>(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option",{value:tier.value,children:tier.label},tier.value))}):"boolean"===fieldType?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("select",{value:String(condition.value),onChange:e=>updateCondition(groupIndex,conditionIndex,"value",e.target.value),className:"flex-1 min-w-[150px] px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option",{value:"true",children:"Yes"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option",{value:"false",children:"No"})]}):"date"===fieldType?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("input",{type:"date",value:String(condition.value),onChange:e=>updateCondition(groupIndex,conditionIndex,"value",e.target.value),className:"flex-1 min-w-[150px] px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100"}):"number"===fieldType?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("input",{type:"number",value:Number(condition.value),onChange:e=>updateCondition(groupIndex,conditionIndex,"value",parseFloat(e.target.value)||0),className:"flex-1 min-w-[150px] px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100"}):(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("input",{type:"text",value:String(condition.value),onChange:e=>updateCondition(groupIndex,conditionIndex,"value",e.target.value),placeholder:"Enter value...",className:"flex-1 min-w-[150px] px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100"})};return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"bg-white dark:bg-gray-800 rounded-lg shadow-lg",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"px-6 py-4 border-b border-gray-200 dark:border-gray-700",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h2",{className:"text-xl font-semibold text-gray-900 dark:text-white",children:segment?"Edit Segment":"Create Segment"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p",{className:"text-sm text-gray-600 dark:text-gray-400 mt-1",children:"Define rules to group customers based on their attributes and behavior"})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"p-6 space-y-6",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:"Segment Name *"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("input",{type:"text",value:name,onChange:e=>setName(e.target.value),placeholder:"e.g., VIP Customers",className:"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-primary focus:border-transparent"})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:"Status"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-center gap-4 h-[42px]",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("label",{className:"flex items-center gap-2 cursor-pointer",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("input",{type:"radio",checked:isActive,onChange:()=>setIsActive(!0),className:"text-primary focus:ring-primary"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("span",{className:"text-gray-700 dark:text-gray-300",children:"Active"})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("label",{className:"flex items-center gap-2 cursor-pointer",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("input",{type:"radio",checked:!isActive,onChange:()=>setIsActive(!1),className:"text-primary focus:ring-primary"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("span",{className:"text-gray-700 dark:text-gray-300",children:"Inactive"})]})]})]})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("label",{className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1",children:"Description"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("textarea",{value:description,onChange:e=>setDescription(e.target.value),placeholder:"Describe this segment...",rows:2,className:"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-primary focus:border-transparent resize-none"})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("h3",{className:"text-lg font-medium text-gray-900 dark:text-white",children:"Segment Rules"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p",{className:"text-sm text-gray-600 dark:text-gray-400",children:"Customers must match all rule groups (AND between groups)"})]}),null!==previewCount&&(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-center gap-2 px-3 py-1.5 bg-blue-50 dark:bg-blue-900/30 rounded-lg",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_icons__WEBPACK_IMPORTED_MODULE_3__.In,{name:"users",size:16,className:"text-blue-600 dark:text-blue-400"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("span",{className:"text-sm font-medium text-blue-600 dark:text-blue-400",children:loadingPreview?"...":`${previewCount.toLocaleString()} matching customers`})]})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"space-y-4",children:ruleGroups.map((group,groupIndex)=>(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"px-4 py-3 bg-gray-50 dark:bg-gray-700/50 flex items-center justify-between",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-center gap-3",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("span",{className:"text-sm font-medium text-gray-700 dark:text-gray-300",children:["Rule Group ",groupIndex+1]}),group.conditions.length>1&&(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-center gap-2",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("span",{className:"text-xs text-gray-500 dark:text-gray-400",children:"Match:"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("select",{value:group.logic,onChange:e=>((groupIndex,logic)=>{const updated=[...ruleGroups];updated[groupIndex].logic=logic,setRuleGroups(updated)})(groupIndex,e.target.value),className:"text-xs px-2 py-1 border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option",{value:"AND",children:"All conditions (AND)"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option",{value:"OR",children:"Any condition (OR)"})]})]})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-center gap-2",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_components_ui__WEBPACK_IMPORTED_MODULE_2__.$n,{variant:"ghost",size:"sm",onClick:()=>(groupIndex=>{const updated=[...ruleGroups];updated[groupIndex].conditions.push({field:"total_spent",operator:"greater_than",value:0}),setRuleGroups(updated)})(groupIndex),children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_icons__WEBPACK_IMPORTED_MODULE_3__.In,{name:"plus",size:14,className:"mr-1"}),"Add Condition"]}),ruleGroups.length>1&&(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("button",{onClick:()=>(groupIndex=>{1!==ruleGroups.length&&setRuleGroups(ruleGroups.filter((_,i)=>i!==groupIndex))})(groupIndex),className:"p-1 text-gray-400 hover:text-red-500 dark:text-gray-500 dark:hover:text-red-400",title:"Remove group",children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_icons__WEBPACK_IMPORTED_MODULE_3__.In,{name:"trash",size:16})})]})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("div",{className:"p-4 space-y-3",children:0===group.conditions.length?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("p",{className:"text-sm text-gray-500 dark:text-gray-400 italic text-center py-4",children:"No conditions. Add a condition to define this rule group."}):group.conditions.map((condition,condIndex)=>(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"flex items-center gap-3 flex-wrap",children:[condIndex>0&&(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("span",{className:"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase w-10",children:group.logic}),0===condIndex&&(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("span",{className:"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase w-10",children:"Where"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("select",{value:condition.field,onChange:e=>updateCondition(groupIndex,condIndex,"field",e.target.value),className:"min-w-[160px] px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100",children:FIELD_OPTIONS.map(field=>(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option",{value:field.value,children:field.label},field.value))}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("select",{value:condition.operator,onChange:e=>updateCondition(groupIndex,condIndex,"operator",e.target.value),className:"min-w-[160px] px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100",children:OPERATOR_OPTIONS[getFieldType(condition.field)]?.map(op=>(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("option",{value:op.value,children:op.label},op.value))}),renderValueInput(groupIndex,condIndex,condition),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("button",{onClick:()=>((groupIndex,conditionIndex)=>{const updated=[...ruleGroups];updated[groupIndex].conditions=updated[groupIndex].conditions.filter((_,i)=>i!==conditionIndex),setRuleGroups(updated)})(groupIndex,condIndex),className:"p-1.5 text-gray-400 hover:text-red-500 dark:text-gray-500 dark:hover:text-red-400",title:"Remove condition",children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_icons__WEBPACK_IMPORTED_MODULE_3__.In,{name:"x",size:16})})]},condIndex))})]},groupIndex))}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_components_ui__WEBPACK_IMPORTED_MODULE_2__.$n,{variant:"outline",className:"mt-4",onClick:()=>{setRuleGroups([...ruleGroups,{conditions:[],logic:"AND"}])},children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_icons__WEBPACK_IMPORTED_MODULE_3__.In,{name:"plus",size:16,className:"mr-2"}),"Add Rule Group (OR)"]})]})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("div",{className:"px-6 py-4 border-t border-gray-200 dark:border-gray-700 flex items-center justify-end gap-3",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui__WEBPACK_IMPORTED_MODULE_2__.$n,{variant:"ghost",onClick:onCancel,disabled:saving,children:"Cancel"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui__WEBPACK_IMPORTED_MODULE_2__.$n,{variant:"primary",onClick:async()=>{if(name.trim()){setSaving(!0);try{await onSave({name:name.trim(),description:description.trim(),rules:ruleGroups,isActive})}finally{setSaving(!1)}}},disabled:saving||!name.trim(),children:saving?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,{children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_icons__WEBPACK_IMPORTED_MODULE_3__.In,{name:"reload",size:16,className:"mr-2 animate-spin"}),"Saving..."]}):(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment,{children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_components_ui_icons__WEBPACK_IMPORTED_MODULE_3__.In,{name:"check",size:16,className:"mr-2"}),segment?"Update Segment":"Create Segment"]})})]})]})}}}]);