@clickview/curator 1.100.0-rc.2 → 1.100.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7345,7 +7345,7 @@
7345
7345
  ]
7346
7346
  },
7347
7347
  "src/app.ts": {
7348
- "file": "Assets/js/dist/scripts/app-DfBVQxB2.js",
7348
+ "file": "Assets/js/dist/scripts/app-snxXiZp3.js",
7349
7349
  "name": "app",
7350
7350
  "src": "src/app.ts",
7351
7351
  "isEntry": true,
@@ -8943,7 +8943,7 @@
8943
8943
  ]
8944
8944
  },
8945
8945
  "src/apps/content-partners/views/manage-featured-channels/ManageFeaturedChannelsView.tsx": {
8946
- "file": "Assets/js/dist/scripts/n7lzp_Mc2.chunk.js",
8946
+ "file": "Assets/js/dist/scripts/BOcBiydK2.chunk.js",
8947
8947
  "name": "ManageFeaturedChannelsView",
8948
8948
  "src": "src/apps/content-partners/views/manage-featured-channels/ManageFeaturedChannelsView.tsx",
8949
8949
  "isDynamicEntry": true,
@@ -1,2 +1,2 @@
1
- import{a as e,i as t,ln as n}from"./rp704-Pm.chunk.js";import{n as r,r as i,t as a}from"./Crs6pJ2h.chunk.js";import{t as o}from"./UCDGupVs.chunk.js";import{S as s}from"./DxW67uUT.chunk.js";import{lt as c}from"./a9Q9HOAR2.chunk.js";import{s as l,u}from"./Dgk5cBBe.chunk.js";import"./Oh4_zGIH.chunk.js";import{n as d,t as f}from"./DyKk_C_Y.chunk.js";import{t as p}from"./Bwpvc7Th2.chunk.js";import{t as m}from"./Broadxiw.chunk.js";import{t as h}from"./BhWPGAdN2.chunk.js";import{t as g}from"./GWw4zEXk2.chunk.js";import{t as _}from"./2NdfwDHB.chunk.js";import{d as v,i as y,n as b,r as x}from"./Ta_RhTv-.chunk.js";import{t as S}from"./D7Azbq7u.chunk.js";import{t as C}from"./CrF0fWIm.chunk.js";import{t as w}from"./BcwM0but2.chunk.js";import{t as T}from"./CoqIP93V2.chunk.js";import{t as E}from"./ogE6FIPU2.chunk.js";import{t as D}from"./DZthp5T62.chunk.js";var O=n(e(),1),k=n(c(),1),A={row:`_row_18op7_1`,index:`_index_18op7_1`,handle:`_handle_18op7_4`,name:`_name_18op7_17`},j=t();function M(e){let{partner:t,onRemove:n,index:a}=e,{setNodeRef:o,transform:s,transition:c,listeners:l,attributes:u}=y({id:t.id});return(0,j.jsxs)(`div`,{ref:o,style:{transform:v.Transform.toString(s),transition:c,touchAction:`none`},className:(0,k.default)(A.row,`d-flex align-items-center py-2 bg-white border-bottom`),...u,...l,children:[(0,j.jsx)(`span`,{className:(0,k.default)(A.handle,`user-select-none mb-3 me-1`),children:(0,j.jsx)(r,{svg:C,size:i.XXS})}),(0,j.jsx)(`span`,{className:(0,k.default)(A.index,`me-2`),children:a+1}),(0,j.jsx)(`span`,{className:(0,k.default)(A.name,`flex-grow-1 text-truncate px-1`),children:t.name}),(0,j.jsx)(m,{svg:_,className:`text-danger`,onClick:()=>n(t.id)})]})}var N={sidebar:`_sidebar_1mh5y_1`,regionItem:`_regionItem_1mh5y_4`,active:`_active_1mh5y_7`,main:`_main_1mh5y_10`,dragOverlay:`_dragOverlay_1mh5y_14`},P=18,F=6;function I(e,t){return t.map((t,n)=>({contentRegion:e,index:n,partnerProfileId:t.id}))}function L(){let e=u(),t=E(),n=p(),i=l(T.contentRegions()),c=[...i.data?.data??[]].sort((e,t)=>e.name.localeCompare(t.name))??[],m=l(o.currentUser()),[_,v]=(0,O.useState)([]),[y,C]=(0,O.useState)(null),A=l(y&&w.getFeaturedChannelsForRegion(y));if(O.useEffect(()=>{A.hasCompleted&&v(A.data??[])},[A.hasCompleted,y]),O.useEffect(()=>{y||C(i.data?.data?.[0]?.systemName??null)},[i.hasCompleted]),!i.hasCompleted||!m.hasCompleted)return(0,j.jsx)(h,{});let L=c.find(e=>e.systemName===y)??null,R=new Set(_.map(e=>e.id)),z=_.length>=P,B=_.length<F;function V(e){C(e),v([])}async function H(t){if(R.has(t.id))return;let n=await e(w.getContentPartner(t.id));v(e=>[...e,n])}function U(e){v(t=>t.filter(t=>t.id!==e))}function W(e){let{active:t,over:n}=e;!n||t.id===n.id||v(e=>{let r=e.findIndex(e=>e.id?.toString()===t.id.toString()),i=e.findIndex(e=>e.id?.toString()===n.id.toString());return r===-1||i===-1?e:x(e,r,i)})}async function G(){if(!(!y||B))try{await e(w.updateFeaturedChannelsForRegion(y,I(y,_))),n.success(`Featured channels updated successfully`)}catch{n.error(`Failed to update featured channels`)}}return(0,j.jsxs)(`div`,{className:`d-flex gap-3`,children:[(0,j.jsxs)(`div`,{className:(0,k.default)(N.sidebar,`flex-shrink-0`),children:[(0,j.jsx)(`div`,{className:`mb-2`,children:(0,j.jsxs)(a,{appLink:t.contentPartners(),className:`text-secondary d-flex align-items-center`,children:[(0,j.jsx)(r,{svg:S}),`Channels`]})}),(0,j.jsx)(`h6`,{className:`mb-3`,children:`Regions`}),(0,j.jsx)(`ul`,{className:`list-unstyled m-0`,children:c.map(e=>(0,j.jsx)(`li`,{className:(0,k.default)(N.regionItem,{[N.active]:e.systemName===y},`cursor-pointer d-flex align-items-center rounded-1 user-select-none p-2`),onClick:()=>V(e.systemName),children:e.name},e.id))})]}),(0,j.jsx)(`div`,{className:N.main,children:L?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(`h3`,{className:`mb-3`,children:[`Featured Channels — `,L.name]}),(0,j.jsxs)(`div`,{className:`my-3`,children:[(0,j.jsx)(g,{disabled:z,placeholder:`Search for a channel to add`,onSuggestionSelected:H,getRemoteUrl:()=>`/api/search/v4/search?userId=${m.data?.id}&customerId=${m.data?.customerId}&searchAllChannels=true`,getRemotePostBody:e=>({query:e,indices:[{index:`partner_profile`}],searchType:`content`,filters:{contentRegion:[y]}}),formatRemoteSuggestions:e=>e.results,activationLength:0,clearQueryOnSelect:!0,shouldUpdateQueryOnSelection:!1,renderAsForm:!1}),z&&(0,j.jsxs)(`p`,{className:`text-secondary mt-2 mb-0 small`,children:[`Maximum of `,P,` featured channels reached. Remove a channel before adding a new one.`]})]}),_.length>0?(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`p`,{className:`text-secondary mb-0`,children:`Drag and drop to reorder`}),(0,j.jsx)(b,{ids:_.map(e=>e.id),onSortEnd:W,getDragOverlay:e=>{let t=_.find(t=>t.id===e);return(0,j.jsx)(`div`,{className:(0,k.default)(N.dragOverlay,`bg-white rounded-1 border`),children:t?.name})},children:_.map((e,t)=>(0,j.jsx)(M,{partner:e,index:t,onRemove:U},e.id))})]}):(0,j.jsx)(`p`,{className:`text-secondary mt-2`,children:`No featured channels. Add one using the search above.`}),(0,j.jsxs)(`div`,{className:`mt-4`,children:[(0,j.jsx)(`h4`,{className:`mb-4`,children:`Preview`}),_.length>0?(0,j.jsx)(D,{content:_,templateId:d.RectangularLogoSlidingList,widgetTypeId:f.SpotlightContentPartners,description:``,name:``,id:`featured-channels`,metadata:{},location:`curator`}):(0,j.jsx)(s,{isPreviewing:!0})]}),(0,j.jsxs)(`div`,{className:`mt-3 text-end`,children:[B&&(0,j.jsxs)(`p`,{className:`text-secondary mb-2 small`,children:[`A minimum of `,F,` featured channels is required.`]}),(0,j.jsx)(`button`,{type:`button`,className:`btn btn-dark`,disabled:B,onClick:G,children:`Save`})]})]}):(0,j.jsx)(`p`,{className:`text-secondary mt-2`,children:`Select a region to manage its featured channels.`})})]})}export{L as ManageFeaturedChannelsView};
2
- //# sourceMappingURL=n7lzp_Mc2.chunk.js.map
1
+ import{a as e,i as t,ln as n}from"./rp704-Pm.chunk.js";import{n as r,r as i,t as a}from"./Crs6pJ2h.chunk.js";import{t as o}from"./UCDGupVs.chunk.js";import{S as s}from"./DxW67uUT.chunk.js";import{lt as c}from"./a9Q9HOAR2.chunk.js";import{s as l,u}from"./Dgk5cBBe.chunk.js";import"./Oh4_zGIH.chunk.js";import{n as d,t as f}from"./DyKk_C_Y.chunk.js";import{t as p}from"./Bwpvc7Th2.chunk.js";import{t as m}from"./Broadxiw.chunk.js";import{t as h}from"./BhWPGAdN2.chunk.js";import{t as g}from"./GWw4zEXk2.chunk.js";import{t as _}from"./2NdfwDHB.chunk.js";import{d as v,i as y,n as b,r as x}from"./Ta_RhTv-.chunk.js";import{t as S}from"./D7Azbq7u.chunk.js";import{t as C}from"./CrF0fWIm.chunk.js";import{t as w}from"./BcwM0but2.chunk.js";import{t as T}from"./CoqIP93V2.chunk.js";import{t as E}from"./ogE6FIPU2.chunk.js";import{t as D}from"./DZthp5T62.chunk.js";var O=n(e(),1),k=n(c(),1),A={row:`_row_18op7_1`,index:`_index_18op7_1`,handle:`_handle_18op7_4`,name:`_name_18op7_17`},j=t();function M(e){let{partner:t,onRemove:n,index:a}=e,{setNodeRef:o,transform:s,transition:c,listeners:l,attributes:u}=y({id:t.id});return(0,j.jsxs)(`div`,{ref:o,style:{transform:v.Transform.toString(s),transition:c,touchAction:`none`},className:(0,k.default)(A.row,`d-flex align-items-center py-2 bg-white border-bottom`),...u,...l,children:[(0,j.jsx)(`span`,{className:(0,k.default)(A.handle,`user-select-none mb-3 me-1`),children:(0,j.jsx)(r,{svg:C,size:i.XXS})}),(0,j.jsx)(`span`,{className:(0,k.default)(A.index,`me-2`),children:a+1}),(0,j.jsx)(`span`,{className:(0,k.default)(A.name,`flex-grow-1 text-truncate px-1`),children:t.name}),(0,j.jsx)(m,{svg:_,className:`text-danger`,onClick:()=>n(t.id)})]})}var N={sidebar:`_sidebar_1mh5y_1`,regionItem:`_regionItem_1mh5y_4`,active:`_active_1mh5y_7`,main:`_main_1mh5y_10`,dragOverlay:`_dragOverlay_1mh5y_14`},P=18,F=6;function I(e,t){return t.map((t,n)=>({contentRegion:e,index:n,partnerProfileId:t.id}))}function L(){let e=u(),t=E(),n=p(),i=l(T.contentRegions()),c=[...i.data?.data??[]].sort((e,t)=>e.name.localeCompare(t.name))??[],m=l(o.currentUser()),[_,v]=(0,O.useState)([]),[y,C]=(0,O.useState)(null),A=l(y&&w.getFeaturedChannelsForRegion(y));if(O.useEffect(()=>{A.hasCompleted&&v(A.data??[])},[A.hasCompleted,y]),O.useEffect(()=>{y||C(i.data?.data?.[0]?.systemName??null)},[i.hasCompleted]),!i.hasCompleted||!m.hasCompleted)return(0,j.jsx)(h,{});let L=c.find(e=>e.systemName===y)??null,R=new Set(_.map(e=>e.id)),z=_.length>=P,B=_.length<F;function V(e){C(e),v([])}async function H(t){if(R.has(t.id))return;let n=await e(w.getContentPartner(t.id));v(e=>[...e,n])}function U(e){v(t=>t.filter(t=>t.id!==e))}function W(e){let{active:t,over:n}=e;!n||t.id===n.id||v(e=>{let r=e.findIndex(e=>e.id?.toString()===t.id.toString()),i=e.findIndex(e=>e.id?.toString()===n.id.toString());return r===-1||i===-1?e:x(e,r,i)})}async function G(){if(!(!y||B))try{await e(w.updateFeaturedChannelsForRegion(y,I(y,_))),n.success(`Featured channels updated successfully`)}catch{n.error(`Failed to update featured channels`)}}return(0,j.jsxs)(`div`,{className:`d-flex gap-3`,children:[(0,j.jsxs)(`div`,{className:(0,k.default)(N.sidebar,`flex-shrink-0`),children:[(0,j.jsx)(`div`,{className:`mb-2`,children:(0,j.jsxs)(a,{appLink:t.contentPartners(),className:`text-secondary d-flex align-items-center`,children:[(0,j.jsx)(r,{svg:S}),`Channels`]})}),(0,j.jsx)(`h6`,{className:`mb-3`,children:`Regions`}),(0,j.jsx)(`ul`,{className:`list-unstyled m-0`,children:c.map(e=>(0,j.jsx)(`li`,{className:(0,k.default)(N.regionItem,{[N.active]:e.systemName===y},`cursor-pointer d-flex align-items-center rounded-1 user-select-none p-2`),onClick:()=>V(e.systemName),children:e.name},e.id))})]}),(0,j.jsx)(`div`,{className:N.main,children:L?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(`h3`,{className:`mb-3`,children:[`Featured Channels — `,L.name]}),(0,j.jsxs)(`div`,{className:`my-3`,children:[(0,j.jsx)(g,{disabled:z,placeholder:`Search for a channel to add`,onSuggestionSelected:H,getRemoteUrl:()=>`/api/search/v4/search?userId=${m.data?.id}&customerId=${m.data?.customerId}&searchAllChannels=true`,getRemotePostBody:e=>({query:e,indices:[{index:`partner_profile`}],searchType:`content`}),formatRemoteSuggestions:e=>e.results,activationLength:0,clearQueryOnSelect:!0,shouldUpdateQueryOnSelection:!1,renderAsForm:!1}),z&&(0,j.jsxs)(`p`,{className:`text-secondary mt-2 mb-0 small`,children:[`Maximum of `,P,` featured channels reached. Remove a channel before adding a new one.`]})]}),_.length>0?(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`p`,{className:`text-secondary mb-0`,children:`Drag and drop to reorder`}),(0,j.jsx)(b,{ids:_.map(e=>e.id),onSortEnd:W,getDragOverlay:e=>{let t=_.find(t=>t.id===e);return(0,j.jsx)(`div`,{className:(0,k.default)(N.dragOverlay,`bg-white rounded-1 border`),children:t?.name})},children:_.map((e,t)=>(0,j.jsx)(M,{partner:e,index:t,onRemove:U},e.id))})]}):(0,j.jsx)(`p`,{className:`text-secondary mt-2`,children:`No featured channels. Add one using the search above.`}),(0,j.jsxs)(`div`,{className:`mt-4`,children:[(0,j.jsx)(`h4`,{className:`mb-4`,children:`Preview`}),_.length>0?(0,j.jsx)(D,{content:_,templateId:d.RectangularLogoSlidingList,widgetTypeId:f.SpotlightContentPartners,description:``,name:``,id:`featured-channels`,metadata:{},location:`curator`}):(0,j.jsx)(s,{isPreviewing:!0})]}),(0,j.jsxs)(`div`,{className:`mt-3 text-end`,children:[B&&(0,j.jsxs)(`p`,{className:`text-secondary mb-2 small`,children:[`A minimum of `,F,` featured channels is required.`]}),(0,j.jsx)(`button`,{type:`button`,className:`btn btn-dark`,disabled:B,onClick:G,children:`Save`})]})]}):(0,j.jsx)(`p`,{className:`text-secondary mt-2`,children:`Select a region to manage its featured channels.`})})]})}export{L as ManageFeaturedChannelsView};
2
+ //# sourceMappingURL=BOcBiydK2.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"n7lzp_Mc2.chunk.js","names":[],"sources":["../../../../../src/apps/content-partners/views/manage-featured-channels/components/featured-channel-row.module.scss","../../../../../src/apps/content-partners/views/manage-featured-channels/components/FeaturedChannelRow.tsx","../../../../../src/apps/content-partners/views/manage-featured-channels/manage-featured-channels-view.module.scss","../../../../../src/apps/content-partners/views/manage-featured-channels/ManageFeaturedChannelsView.tsx"],"sourcesContent":[":local {\n .row {\n &:hover .index {\n display: none;\n }\n\n &:hover .handle {\n display: flex;\n }\n }\n\n .index {\n display: flex;\n }\n\n .handle {\n display: none;\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n }\n\n .name {\n min-width: 0;\n }\n}","import React from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport classnames from 'classnames';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { DeleteSvg } from 'libs/shared/images/svg/actions/DeleteSvg';\nimport { HandleSvg } from 'libs/shared/images/svg/objects/HandleSvg';\nimport { PartnerProfile } from 'libs/shared/interfaces';\n\nimport styles from './featured-channel-row.module.scss';\n\ninterface FeaturedChannelRowProps {\n partner: PartnerProfile;\n onRemove: (id: string) => void;\n index: number;\n}\n\nexport function FeaturedChannelRow(props: FeaturedChannelRowProps): JSX.Element {\n const { partner, onRemove, index } = props;\n const { setNodeRef, transform, transition, listeners, attributes } = useSortable({ id: partner.id });\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n touchAction: 'none'\n };\n\n return (\n <div ref={setNodeRef} style={style} className={classnames(styles.row, 'd-flex align-items-center py-2 bg-white border-bottom')} {...attributes} {...listeners}>\n <span className={classnames(styles.handle, 'user-select-none mb-3 me-1')}>\n <SvgContainer svg={HandleSvg} size={SvgContainerSize.XXS} />\n </span>\n <span className={classnames(styles.index, 'me-2')}>{index + 1}</span>\n <span className={classnames(styles.name, 'flex-grow-1 text-truncate px-1')}>{partner.name}</span>\n <IconButton\n svg={DeleteSvg}\n className='text-danger'\n onClick={() => onRemove(partner.id)}\n />\n </div>\n );\n}\n",":local {\n .sidebar {\n width: 12rem;\n }\n\n .regionItem {\n &:hover {\n background-color: $white;\n }\n\n &.active {\n background-color: $gray-100;\n }\n }\n\n .main {\n flex: 1;\n min-width: 0;\n }\n\n .dragOverlay {\n padding: 0.5rem 0.75rem;\n box-shadow: 0 0.25rem 1.3rem rgba($black, 0.1);\n opacity: 0.9;\n }\n}","import React, { useState } from 'react';\nimport { DragEndEvent } from '@dnd-kit/core';\nimport { arrayMove } from '@dnd-kit/sortable';\nimport classnames from 'classnames';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PopupLoadingSpinner } from 'libs/shared/components/popup/PopupLoadingSpinner';\nimport { SearchBar } from 'libs/shared/components/search-bar/SearchBar';\nimport { SortableContainerWrapper } from 'libs/shared/components/sortable/SortableContainerWrapper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PartialRectangularLogoSlidingListWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/rectangular-logo-sliding-list/partial-loading/PartialRectangularLogoSlidingList';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { ChevronLeftSvg } from 'libs/shared/images/svg/arrows/ChevronLeftSvg';\nimport {\n ContentRegionCollection,\n ContentRegionObject,\n CurrentUser,\n PartnerProfile\n} from 'libs/shared/interfaces';\n\nimport { ContentRegionRequests } from 'shared/flight-requests/ContentRegionRequests';\n\nimport { ContentPartnerRequests } from 'apps/content-partners/flight-requests/ContentPartnerRequests';\nimport { PinnedContentPartner } from 'apps/content-partners/interfaces/PinnedContentPartner';\nimport { getContentPartnerAppLinks } from 'apps/content-partners/utils/getContentPartnerAppLinks';\n\nimport { FeaturedChannelRow } from './components/FeaturedChannelRow';\n\nimport styles from './manage-featured-channels-view.module.scss';\n\nconst MAX_FEATURED_CHANNELS = 18;\nconst MIN_FEATURED_CHANNELS = 6;\n\nfunction buildSortedChannels(contentRegion: string, channels: PartnerProfile[]): PinnedContentPartner[] {\n return channels.map((channel, index) => ({\n contentRegion,\n index,\n partnerProfileId: channel.id\n }));\n}\n\nexport function ManageFeaturedChannelsView(): JSX.Element {\n const fetchAsync = Flight.useGetFetchAsync();\n const appLinks = getContentPartnerAppLinks();\n const alerts = useAlerts();\n\n const regionsResponse = Flight.useBasicFetch<ContentRegionCollection>(\n ContentRegionRequests.contentRegions()\n );\n const regions: ContentRegionObject[] = [...(regionsResponse.data?.data ?? [])]\n .sort((a, b) => a.name.localeCompare(b.name)) ?? [];\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const [ featuredChannels, setFeaturedChannels ] = useState<PartnerProfile[]>([]);\n const [ selectedRegionSystemName, setSelectedRegionSystemName ] = useState<string | null>(null);\n const pinnedPartners = Flight.useBasicFetch<PartnerProfile[]>(\n selectedRegionSystemName && ContentPartnerRequests.getFeaturedChannelsForRegion(selectedRegionSystemName)\n );\n\n React.useEffect(() => {\n if (!pinnedPartners.hasCompleted) return;\n setFeaturedChannels(pinnedPartners.data ?? []);\n }, [ pinnedPartners.hasCompleted, selectedRegionSystemName ]);\n\n React.useEffect(() => {\n if (!selectedRegionSystemName) {\n setSelectedRegionSystemName(regionsResponse.data?.data?.[0]?.systemName ?? null);\n }\n }, [regionsResponse.hasCompleted]);\n\n if (!regionsResponse.hasCompleted || !currentUser.hasCompleted) {\n return <PopupLoadingSpinner />;\n }\n\n const selectedRegion = regions.find(r => r.systemName === selectedRegionSystemName) ?? null;\n const featuredIds = new Set(featuredChannels.map(p => p.id));\n const isAtMaxCapacity = featuredChannels.length >= MAX_FEATURED_CHANNELS;\n const isBelowMinCapacity = featuredChannels.length < MIN_FEATURED_CHANNELS;\n\n function handleSelectRegion(systemName: string): void {\n setSelectedRegionSystemName(systemName);\n setFeaturedChannels([]);\n }\n\n async function handleAddPartner(partner: PartnerProfile): Promise<void> {\n if (featuredIds.has(partner.id)) return;\n // fetch the full content partner object to render the preview\n const fullProfile = await fetchAsync<PartnerProfile>(ContentPartnerRequests.getContentPartner(partner.id));\n setFeaturedChannels(prev => [ ...prev, fullProfile ]);\n }\n\n function handleRemove(partnerId: string): void {\n setFeaturedChannels(prev => prev.filter(p => p.id !== partnerId));\n }\n\n function handleSortEnd(event: DragEndEvent): void {\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n\n setFeaturedChannels(prev => {\n const oldIndex = prev.findIndex(p => p.id?.toString() === active.id.toString());\n const newIndex = prev.findIndex(p => p.id?.toString() === over.id.toString());\n if (oldIndex === -1 || newIndex === -1) return prev;\n return arrayMove(prev, oldIndex, newIndex);\n });\n }\n\n async function handleSave(): Promise<void> {\n if (!selectedRegionSystemName || isBelowMinCapacity) return;\n try {\n await fetchAsync(ContentPartnerRequests.updateFeaturedChannelsForRegion(\n selectedRegionSystemName,\n buildSortedChannels(selectedRegionSystemName, featuredChannels)\n ));\n alerts.success('Featured channels updated successfully');\n } catch {\n alerts.error('Failed to update featured channels');\n }\n }\n\n return (\n <div className='d-flex gap-3'>\n <div className={classnames(styles.sidebar, 'flex-shrink-0')}>\n <div className='mb-2'>\n <AppLink appLink={appLinks.contentPartners()} className='text-secondary d-flex align-items-center'>\n <SvgContainer svg={ChevronLeftSvg} />\n Channels\n </AppLink>\n </div>\n <h6 className='mb-3'>Regions</h6>\n <ul className='list-unstyled m-0'>\n {regions.map(region => (\n <li\n key={region.id}\n className={classnames(styles.regionItem, { [styles.active]: region.systemName === selectedRegionSystemName }, 'cursor-pointer d-flex align-items-center rounded-1 user-select-none p-2')}\n onClick={() => handleSelectRegion(region.systemName)}\n >\n {region.name}\n </li>\n ))}\n </ul>\n </div>\n\n <div className={styles.main}>\n {selectedRegion ? (\n <>\n <h3 className='mb-3'>Featured Channels — {selectedRegion.name}</h3>\n\n <div className='my-3'>\n <SearchBar<PartnerProfile>\n disabled={isAtMaxCapacity}\n placeholder='Search for a channel to add'\n onSuggestionSelected={handleAddPartner}\n getRemoteUrl={() => `/api/search/v4/search?userId=${currentUser.data?.id}&customerId=${currentUser.data?.customerId}&searchAllChannels=true`}\n getRemotePostBody={(q: string) => ({\n query: q,\n indices: [{ index: 'partner_profile' }],\n searchType: 'content',\n filters: { contentRegion: [selectedRegionSystemName]}\n })}\n formatRemoteSuggestions={data => data.results}\n activationLength={0}\n clearQueryOnSelect\n shouldUpdateQueryOnSelection={false}\n renderAsForm={false}\n />\n {isAtMaxCapacity && (\n <p className='text-secondary mt-2 mb-0 small'>\n Maximum of {MAX_FEATURED_CHANNELS} featured channels reached. Remove a channel before adding a new\n one.\n </p>\n )}\n </div>\n\n {featuredChannels.length > 0 ? (\n <div>\n <p className='text-secondary mb-0'>Drag and drop to reorder</p>\n <SortableContainerWrapper\n ids={featuredChannels.map(p => p.id)}\n onSortEnd={handleSortEnd}\n getDragOverlay={id => {\n const partner = featuredChannels.find(p => p.id === id);\n return <div className={classnames(styles.dragOverlay, 'bg-white rounded-1 border')}>{partner?.name}</div>;\n }}\n >\n {featuredChannels.map((partner, i) => (\n <FeaturedChannelRow key={partner.id} partner={partner} index={i} onRemove={handleRemove} />\n ))}\n </SortableContainerWrapper>\n </div>\n ) : (\n <p className='text-secondary mt-2'>No featured channels. Add one using the search above.</p>\n )}\n\n <div className='mt-4'>\n <h4 className='mb-4'>Preview</h4>\n {featuredChannels.length > 0 ? (\n <WidgetContainerView\n content={featuredChannels}\n templateId={WidgetTemplate.RectangularLogoSlidingList}\n widgetTypeId={WidgetTypeId.SpotlightContentPartners}\n // mocking a widget here\n description=''\n name=''\n id='featured-channels'\n metadata={{}}\n location='curator'\n />\n ) : (\n <PartialRectangularLogoSlidingListWidgetTemplate isPreviewing />\n )}\n </div>\n\n <div className='mt-3 text-end'>\n {isBelowMinCapacity && (\n <p className='text-secondary mb-2 small'>\n A minimum of {MIN_FEATURED_CHANNELS} featured channels is required.\n </p>\n )}\n <button type='button' className='btn btn-dark' disabled={isBelowMinCapacity} onClick={handleSave}>\n Save\n </button>\n </div>\n </>\n ) : (\n <p className='text-secondary mt-2'>Select a region to manage its featured channels.</p>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"BOcBiydK2.chunk.js","names":[],"sources":["../../../../../src/apps/content-partners/views/manage-featured-channels/components/featured-channel-row.module.scss","../../../../../src/apps/content-partners/views/manage-featured-channels/components/FeaturedChannelRow.tsx","../../../../../src/apps/content-partners/views/manage-featured-channels/manage-featured-channels-view.module.scss","../../../../../src/apps/content-partners/views/manage-featured-channels/ManageFeaturedChannelsView.tsx"],"sourcesContent":[":local {\n .row {\n &:hover .index {\n display: none;\n }\n\n &:hover .handle {\n display: flex;\n }\n }\n\n .index {\n display: flex;\n }\n\n .handle {\n display: none;\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n }\n\n .name {\n min-width: 0;\n }\n}","import React from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport classnames from 'classnames';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { DeleteSvg } from 'libs/shared/images/svg/actions/DeleteSvg';\nimport { HandleSvg } from 'libs/shared/images/svg/objects/HandleSvg';\nimport { PartnerProfile } from 'libs/shared/interfaces';\n\nimport styles from './featured-channel-row.module.scss';\n\ninterface FeaturedChannelRowProps {\n partner: PartnerProfile;\n onRemove: (id: string) => void;\n index: number;\n}\n\nexport function FeaturedChannelRow(props: FeaturedChannelRowProps): JSX.Element {\n const { partner, onRemove, index } = props;\n const { setNodeRef, transform, transition, listeners, attributes } = useSortable({ id: partner.id });\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n touchAction: 'none'\n };\n\n return (\n <div ref={setNodeRef} style={style} className={classnames(styles.row, 'd-flex align-items-center py-2 bg-white border-bottom')} {...attributes} {...listeners}>\n <span className={classnames(styles.handle, 'user-select-none mb-3 me-1')}>\n <SvgContainer svg={HandleSvg} size={SvgContainerSize.XXS} />\n </span>\n <span className={classnames(styles.index, 'me-2')}>{index + 1}</span>\n <span className={classnames(styles.name, 'flex-grow-1 text-truncate px-1')}>{partner.name}</span>\n <IconButton\n svg={DeleteSvg}\n className='text-danger'\n onClick={() => onRemove(partner.id)}\n />\n </div>\n );\n}\n",":local {\n .sidebar {\n width: 12rem;\n }\n\n .regionItem {\n &:hover {\n background-color: $white;\n }\n\n &.active {\n background-color: $gray-100;\n }\n }\n\n .main {\n flex: 1;\n min-width: 0;\n }\n\n .dragOverlay {\n padding: 0.5rem 0.75rem;\n box-shadow: 0 0.25rem 1.3rem rgba($black, 0.1);\n opacity: 0.9;\n }\n}","import React, { useState } from 'react';\nimport { DragEndEvent } from '@dnd-kit/core';\nimport { arrayMove } from '@dnd-kit/sortable';\nimport classnames from 'classnames';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { PopupLoadingSpinner } from 'libs/shared/components/popup/PopupLoadingSpinner';\nimport { SearchBar } from 'libs/shared/components/search-bar/SearchBar';\nimport { SortableContainerWrapper } from 'libs/shared/components/sortable/SortableContainerWrapper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { PartialRectangularLogoSlidingListWidgetTemplate } from 'libs/shared/components/widgets/curated-widgets/templates/rectangular-logo-sliding-list/partial-loading/PartialRectangularLogoSlidingList';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { ChevronLeftSvg } from 'libs/shared/images/svg/arrows/ChevronLeftSvg';\nimport {\n ContentRegionCollection,\n ContentRegionObject,\n CurrentUser,\n PartnerProfile\n} from 'libs/shared/interfaces';\n\nimport { ContentRegionRequests } from 'shared/flight-requests/ContentRegionRequests';\n\nimport { ContentPartnerRequests } from 'apps/content-partners/flight-requests/ContentPartnerRequests';\nimport { PinnedContentPartner } from 'apps/content-partners/interfaces/PinnedContentPartner';\nimport { getContentPartnerAppLinks } from 'apps/content-partners/utils/getContentPartnerAppLinks';\n\nimport { FeaturedChannelRow } from './components/FeaturedChannelRow';\n\nimport styles from './manage-featured-channels-view.module.scss';\n\nconst MAX_FEATURED_CHANNELS = 18;\nconst MIN_FEATURED_CHANNELS = 6;\n\nfunction buildSortedChannels(contentRegion: string, channels: PartnerProfile[]): PinnedContentPartner[] {\n return channels.map((channel, index) => ({\n contentRegion,\n index,\n partnerProfileId: channel.id\n }));\n}\n\nexport function ManageFeaturedChannelsView(): JSX.Element {\n const fetchAsync = Flight.useGetFetchAsync();\n const appLinks = getContentPartnerAppLinks();\n const alerts = useAlerts();\n\n const regionsResponse = Flight.useBasicFetch<ContentRegionCollection>(\n ContentRegionRequests.contentRegions()\n );\n const regions: ContentRegionObject[] = [...(regionsResponse.data?.data ?? [])]\n .sort((a, b) => a.name.localeCompare(b.name)) ?? [];\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const [ featuredChannels, setFeaturedChannels ] = useState<PartnerProfile[]>([]);\n const [ selectedRegionSystemName, setSelectedRegionSystemName ] = useState<string | null>(null);\n const pinnedPartners = Flight.useBasicFetch<PartnerProfile[]>(\n selectedRegionSystemName && ContentPartnerRequests.getFeaturedChannelsForRegion(selectedRegionSystemName)\n );\n\n React.useEffect(() => {\n if (!pinnedPartners.hasCompleted) return;\n setFeaturedChannels(pinnedPartners.data ?? []);\n }, [ pinnedPartners.hasCompleted, selectedRegionSystemName ]);\n\n React.useEffect(() => {\n if (!selectedRegionSystemName) {\n setSelectedRegionSystemName(regionsResponse.data?.data?.[0]?.systemName ?? null);\n }\n }, [regionsResponse.hasCompleted]);\n\n if (!regionsResponse.hasCompleted || !currentUser.hasCompleted) {\n return <PopupLoadingSpinner />;\n }\n\n const selectedRegion = regions.find(r => r.systemName === selectedRegionSystemName) ?? null;\n const featuredIds = new Set(featuredChannels.map(p => p.id));\n const isAtMaxCapacity = featuredChannels.length >= MAX_FEATURED_CHANNELS;\n const isBelowMinCapacity = featuredChannels.length < MIN_FEATURED_CHANNELS;\n\n function handleSelectRegion(systemName: string): void {\n setSelectedRegionSystemName(systemName);\n setFeaturedChannels([]);\n }\n\n async function handleAddPartner(partner: PartnerProfile): Promise<void> {\n if (featuredIds.has(partner.id)) return;\n // fetch the full content partner object to render the preview\n const fullProfile = await fetchAsync<PartnerProfile>(ContentPartnerRequests.getContentPartner(partner.id));\n setFeaturedChannels(prev => [ ...prev, fullProfile ]);\n }\n\n function handleRemove(partnerId: string): void {\n setFeaturedChannels(prev => prev.filter(p => p.id !== partnerId));\n }\n\n function handleSortEnd(event: DragEndEvent): void {\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n\n setFeaturedChannels(prev => {\n const oldIndex = prev.findIndex(p => p.id?.toString() === active.id.toString());\n const newIndex = prev.findIndex(p => p.id?.toString() === over.id.toString());\n if (oldIndex === -1 || newIndex === -1) return prev;\n return arrayMove(prev, oldIndex, newIndex);\n });\n }\n\n async function handleSave(): Promise<void> {\n if (!selectedRegionSystemName || isBelowMinCapacity) return;\n try {\n await fetchAsync(ContentPartnerRequests.updateFeaturedChannelsForRegion(\n selectedRegionSystemName,\n buildSortedChannels(selectedRegionSystemName, featuredChannels)\n ));\n alerts.success('Featured channels updated successfully');\n } catch {\n alerts.error('Failed to update featured channels');\n }\n }\n\n return (\n <div className='d-flex gap-3'>\n <div className={classnames(styles.sidebar, 'flex-shrink-0')}>\n <div className='mb-2'>\n <AppLink appLink={appLinks.contentPartners()} className='text-secondary d-flex align-items-center'>\n <SvgContainer svg={ChevronLeftSvg} />\n Channels\n </AppLink>\n </div>\n <h6 className='mb-3'>Regions</h6>\n <ul className='list-unstyled m-0'>\n {regions.map(region => (\n <li\n key={region.id}\n className={classnames(styles.regionItem, { [styles.active]: region.systemName === selectedRegionSystemName }, 'cursor-pointer d-flex align-items-center rounded-1 user-select-none p-2')}\n onClick={() => handleSelectRegion(region.systemName)}\n >\n {region.name}\n </li>\n ))}\n </ul>\n </div>\n\n <div className={styles.main}>\n {selectedRegion ? (\n <>\n <h3 className='mb-3'>Featured Channels — {selectedRegion.name}</h3>\n\n <div className='my-3'>\n <SearchBar<PartnerProfile>\n disabled={isAtMaxCapacity}\n placeholder='Search for a channel to add'\n onSuggestionSelected={handleAddPartner}\n getRemoteUrl={() => `/api/search/v4/search?userId=${currentUser.data?.id}&customerId=${currentUser.data?.customerId}&searchAllChannels=true`}\n getRemotePostBody={(q: string) => ({\n query: q,\n indices: [{ index: 'partner_profile' }],\n searchType: 'content'\n })}\n formatRemoteSuggestions={data => data.results}\n activationLength={0}\n clearQueryOnSelect\n shouldUpdateQueryOnSelection={false}\n renderAsForm={false}\n />\n {isAtMaxCapacity && (\n <p className='text-secondary mt-2 mb-0 small'>\n Maximum of {MAX_FEATURED_CHANNELS} featured channels reached. Remove a channel before adding a new\n one.\n </p>\n )}\n </div>\n\n {featuredChannels.length > 0 ? (\n <div>\n <p className='text-secondary mb-0'>Drag and drop to reorder</p>\n <SortableContainerWrapper\n ids={featuredChannels.map(p => p.id)}\n onSortEnd={handleSortEnd}\n getDragOverlay={id => {\n const partner = featuredChannels.find(p => p.id === id);\n return <div className={classnames(styles.dragOverlay, 'bg-white rounded-1 border')}>{partner?.name}</div>;\n }}\n >\n {featuredChannels.map((partner, i) => (\n <FeaturedChannelRow key={partner.id} partner={partner} index={i} onRemove={handleRemove} />\n ))}\n </SortableContainerWrapper>\n </div>\n ) : (\n <p className='text-secondary mt-2'>No featured channels. Add one using the search above.</p>\n )}\n\n <div className='mt-4'>\n <h4 className='mb-4'>Preview</h4>\n {featuredChannels.length > 0 ? (\n <WidgetContainerView\n content={featuredChannels}\n templateId={WidgetTemplate.RectangularLogoSlidingList}\n widgetTypeId={WidgetTypeId.SpotlightContentPartners}\n // mocking a widget here\n description=''\n name=''\n id='featured-channels'\n metadata={{}}\n location='curator'\n />\n ) : (\n <PartialRectangularLogoSlidingListWidgetTemplate isPreviewing />\n )}\n </div>\n\n <div className='mt-3 text-end'>\n {isBelowMinCapacity && (\n <p className='text-secondary mb-2 small'>\n A minimum of {MIN_FEATURED_CHANNELS} featured channels is required.\n </p>\n )}\n <button type='button' className='btn btn-dark' disabled={isBelowMinCapacity} onClick={handleSave}>\n Save\n </button>\n </div>\n </>\n ) : (\n <p className='text-secondary mt-2'>Select a region to manage its featured channels.</p>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}