@veiag/payload-enhanced-sidebar 0.1.1 → 0.2.0

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.
Files changed (45) hide show
  1. package/README.md +182 -5
  2. package/dist/components/EnhancedSidebar/Badge/index.d.ts +22 -0
  3. package/dist/components/EnhancedSidebar/Badge/index.js +30 -0
  4. package/dist/components/EnhancedSidebar/Badge/index.js.map +1 -0
  5. package/dist/components/EnhancedSidebar/Badge/index.scss +65 -0
  6. package/dist/components/EnhancedSidebar/BadgeProvider/index.d.ts +64 -0
  7. package/dist/components/EnhancedSidebar/BadgeProvider/index.js +66 -0
  8. package/dist/components/EnhancedSidebar/BadgeProvider/index.js.map +1 -0
  9. package/dist/components/EnhancedSidebar/InternalBadgeProvider/index.d.ts +15 -0
  10. package/dist/components/EnhancedSidebar/InternalBadgeProvider/index.js +132 -0
  11. package/dist/components/EnhancedSidebar/InternalBadgeProvider/index.js.map +1 -0
  12. package/dist/components/EnhancedSidebar/NavItem/index.d.ts +11 -0
  13. package/dist/components/EnhancedSidebar/NavItem/index.js +46 -0
  14. package/dist/components/EnhancedSidebar/NavItem/index.js.map +1 -0
  15. package/dist/components/EnhancedSidebar/SettingsMenuButton/index.d.ts +6 -0
  16. package/dist/components/EnhancedSidebar/SettingsMenuButton/index.js +33 -0
  17. package/dist/components/EnhancedSidebar/SettingsMenuButton/index.js.map +1 -0
  18. package/dist/components/EnhancedSidebar/SettingsMenuButton/index.scss +25 -0
  19. package/dist/components/EnhancedSidebar/SidebarContent.d.ts +2 -0
  20. package/dist/components/EnhancedSidebar/SidebarContent.js +117 -99
  21. package/dist/components/EnhancedSidebar/SidebarContent.js.map +1 -1
  22. package/dist/components/EnhancedSidebar/TabsBar/TabItem.d.ts +15 -0
  23. package/dist/components/EnhancedSidebar/TabsBar/TabItem.js +56 -0
  24. package/dist/components/EnhancedSidebar/TabsBar/TabItem.js.map +1 -0
  25. package/dist/components/EnhancedSidebar/TabsBar/index.d.ts +1 -0
  26. package/dist/components/EnhancedSidebar/TabsBar/index.js +58 -52
  27. package/dist/components/EnhancedSidebar/TabsBar/index.js.map +1 -1
  28. package/dist/components/EnhancedSidebar/TabsBar/index.scss +2 -2
  29. package/dist/components/EnhancedSidebar/hooks/useBadge.d.ts +11 -0
  30. package/dist/components/EnhancedSidebar/hooks/useBadge.js +31 -0
  31. package/dist/components/EnhancedSidebar/hooks/useBadge.js.map +1 -0
  32. package/dist/components/EnhancedSidebar/index.client.d.ts +2 -1
  33. package/dist/components/EnhancedSidebar/index.client.js +18 -31
  34. package/dist/components/EnhancedSidebar/index.client.js.map +1 -1
  35. package/dist/components/EnhancedSidebar/index.js +17 -1
  36. package/dist/components/EnhancedSidebar/index.js.map +1 -1
  37. package/dist/exports/client.d.ts +1 -0
  38. package/dist/exports/client.js +2 -1
  39. package/dist/exports/client.js.map +1 -1
  40. package/dist/index.d.ts +2 -1
  41. package/dist/index.js +16 -0
  42. package/dist/index.js.map +1 -1
  43. package/dist/types.d.ts +104 -1
  44. package/dist/types.js.map +1 -1
  45. package/package.json +10 -10
@@ -6,51 +6,40 @@ import { usePathname } from 'next/navigation';
6
6
  import { formatAdminURL } from 'payload/shared';
7
7
  import React from 'react';
8
8
  import { Icon } from '../Icon';
9
+ import { SettingsMenuButton } from '../SettingsMenuButton';
10
+ import { TabButton, TabLink } from './TabItem';
9
11
  import './index.scss';
10
12
  const tabsBaseClass = 'tabs-bar';
11
- export const TabsBar = ({ activeTabId, onTabChange, sidebarConfig })=>{
13
+ export const TabsBar = ({ activeTabId, onTabChange, settingsMenu, sidebarConfig })=>{
12
14
  const { i18n } = useTranslation();
13
15
  const pathname = usePathname();
14
- const { config: { admin: { routes: { logout: logoutRoute } }, routes: { admin: adminRoute } } } = useConfig();
16
+ const { config: { admin: { routes: { browseByFolder: foldersRoute, logout: logoutRoute } }, folders, routes: { admin: adminRoute } } } = useConfig();
15
17
  const showLogout = sidebarConfig.showLogout !== false;
16
- const renderTab = (tab)=>{
17
- const label = getTranslation(tab.label, i18n);
18
- const isActive = activeTabId === tab.id;
19
- return /*#__PURE__*/ _jsx("button", {
20
- className: `${tabsBaseClass}__tab ${isActive ? `${tabsBaseClass}__tab--active` : ''}`,
21
- onClick: ()=>onTabChange(tab.id),
22
- title: label,
23
- type: "button",
24
- children: /*#__PURE__*/ _jsx(Icon, {
25
- name: tab.icon,
26
- size: 20
27
- })
28
- }, tab.id);
29
- };
30
- const renderLink = (link)=>{
31
- const label = getTranslation(link.label, i18n);
32
- const href = link.isExternal ? link.href : formatAdminURL({
33
- adminRoute,
34
- path: link.href
35
- });
36
- // Check if this link is active
37
- const isActive = pathname === href || link.href === '/' && pathname === adminRoute;
38
- return /*#__PURE__*/ _jsx(Link, {
39
- className: `${tabsBaseClass}__link ${isActive ? `${tabsBaseClass}__link--active` : ''}`,
40
- href: href,
41
- target: link.isExternal ? '_blank' : undefined,
42
- title: label,
43
- children: /*#__PURE__*/ _jsx(Icon, {
44
- name: link.icon,
45
- size: 20
46
- })
47
- }, link.id);
48
- };
18
+ const showFolders = folders && folders.browseByFolder;
19
+ const folderURL = formatAdminURL({
20
+ adminRoute,
21
+ path: foldersRoute
22
+ });
23
+ const isFoldersActive = pathname.startsWith(folderURL);
49
24
  const renderTabItem = (item)=>{
50
25
  if (item.type === 'tab') {
51
- return renderTab(item);
26
+ return /*#__PURE__*/ _jsx(TabButton, {
27
+ isActive: activeTabId === item.id,
28
+ onTabChange: onTabChange,
29
+ tab: item
30
+ }, item.id);
52
31
  }
53
- return renderLink(item);
32
+ // Check if link is active
33
+ const href = item.isExternal ? item.href : formatAdminURL({
34
+ adminRoute,
35
+ path: item.href
36
+ });
37
+ const isActive = pathname === href || item.href === '/' && pathname === adminRoute;
38
+ return /*#__PURE__*/ _jsx(TabLink, {
39
+ href: href,
40
+ isActive: isActive,
41
+ link: item
42
+ }, item.id);
54
43
  };
55
44
  const tabItems = sidebarConfig.tabs ?? [];
56
45
  return /*#__PURE__*/ _jsxs("div", {
@@ -60,24 +49,41 @@ export const TabsBar = ({ activeTabId, onTabChange, sidebarConfig })=>{
60
49
  className: `${tabsBaseClass}__tabs`,
61
50
  children: tabItems.map(renderTabItem)
62
51
  }),
63
- showLogout && /*#__PURE__*/ _jsx("div", {
52
+ /*#__PURE__*/ _jsxs("div", {
64
53
  className: `${tabsBaseClass}__actions`,
65
- children: /*#__PURE__*/ _jsx(Link, {
66
- className: `${tabsBaseClass}__action`,
67
- href: formatAdminURL({
68
- adminRoute,
69
- path: logoutRoute
54
+ children: [
55
+ showFolders && /*#__PURE__*/ _jsx(Link, {
56
+ className: `${tabsBaseClass}__action ${isFoldersActive ? `${tabsBaseClass}__link--active` : ''}`,
57
+ href: folderURL,
58
+ title: getTranslation({
59
+ en: 'Browse by Folder',
60
+ uk: 'Переглянути по папках'
61
+ }, i18n),
62
+ children: /*#__PURE__*/ _jsx(Icon, {
63
+ name: "Folder",
64
+ size: 20
65
+ })
66
+ }),
67
+ /*#__PURE__*/ _jsx(SettingsMenuButton, {
68
+ settingsMenu: settingsMenu
70
69
  }),
71
- title: getTranslation({
72
- en: 'Logout',
73
- uk: 'Вийти'
74
- }, i18n),
75
- type: "button",
76
- children: /*#__PURE__*/ _jsx(Icon, {
77
- name: "LogOut",
78
- size: 20
70
+ showLogout && /*#__PURE__*/ _jsx(Link, {
71
+ className: `${tabsBaseClass}__action`,
72
+ href: formatAdminURL({
73
+ adminRoute,
74
+ path: logoutRoute
75
+ }),
76
+ title: getTranslation({
77
+ en: 'Logout',
78
+ uk: 'Вийти'
79
+ }, i18n),
80
+ type: "button",
81
+ children: /*#__PURE__*/ _jsx(Icon, {
82
+ name: "LogOut",
83
+ size: 20
84
+ })
79
85
  })
80
- })
86
+ ]
81
87
  })
82
88
  ]
83
89
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/EnhancedSidebar/TabsBar/index.tsx"],"sourcesContent":["'use client'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { Link, useConfig, useTranslation } from '@payloadcms/ui'\nimport { usePathname } from 'next/navigation'\nimport { formatAdminURL } from 'payload/shared'\nimport React from 'react'\n\nimport type { EnhancedSidebarConfig, SidebarTabContent, SidebarTabLink } from '../../../types'\n\nimport { Icon } from '../Icon'\nimport './index.scss'\n\nconst tabsBaseClass = 'tabs-bar'\n\nexport type TabsBarProps = {\n activeTabId: string\n onTabChange: (tabId: string) => void\n sidebarConfig: EnhancedSidebarConfig\n}\n\nexport const TabsBar: React.FC<TabsBarProps> = ({ activeTabId, onTabChange, sidebarConfig }) => {\n const { i18n } = useTranslation()\n const pathname = usePathname()\n\n const {\n config: {\n admin: {\n routes: { logout: logoutRoute },\n },\n routes: { admin: adminRoute },\n },\n } = useConfig()\n\n const showLogout = sidebarConfig.showLogout !== false\n\n const renderTab = (tab: SidebarTabContent) => {\n const label = getTranslation(tab.label, i18n)\n const isActive = activeTabId === tab.id\n\n return (\n <button\n className={`${tabsBaseClass}__tab ${isActive ? `${tabsBaseClass}__tab--active` : ''}`}\n key={tab.id}\n onClick={() => onTabChange(tab.id)}\n title={label}\n type=\"button\"\n >\n <Icon name={tab.icon} size={20} />\n </button>\n )\n }\n\n const renderLink = (link: SidebarTabLink) => {\n const label = getTranslation(link.label, i18n)\n const href = link.isExternal ? link.href : formatAdminURL({ adminRoute, path: link.href })\n\n // Check if this link is active\n const isActive = pathname === href || (link.href === '/' && pathname === adminRoute)\n\n return (\n <Link\n className={`${tabsBaseClass}__link ${isActive ? `${tabsBaseClass}__link--active` : ''}`}\n href={href}\n key={link.id}\n target={link.isExternal ? '_blank' : undefined}\n title={label}\n >\n <Icon name={link.icon} size={20} />\n </Link>\n )\n }\n\n const renderTabItem = (item: SidebarTabContent | SidebarTabLink) => {\n if (item.type === 'tab') {\n return renderTab(item)\n }\n return renderLink(item)\n }\n\n const tabItems = sidebarConfig.tabs ?? []\n\n return (\n <div className={tabsBaseClass}>\n <div className={`${tabsBaseClass}__tabs`}>{tabItems.map(renderTabItem)}</div>\n\n {showLogout && (\n <div className={`${tabsBaseClass}__actions`}>\n <Link\n className={`${tabsBaseClass}__action`}\n href={formatAdminURL({\n adminRoute,\n path: logoutRoute,\n })}\n title={getTranslation({ en: 'Logout', uk: 'Вийти' }, i18n)}\n type=\"button\"\n >\n <Icon name=\"LogOut\" size={20} />\n </Link>\n </div>\n )}\n </div>\n )\n}\n"],"names":["getTranslation","Link","useConfig","useTranslation","usePathname","formatAdminURL","React","Icon","tabsBaseClass","TabsBar","activeTabId","onTabChange","sidebarConfig","i18n","pathname","config","admin","routes","logout","logoutRoute","adminRoute","showLogout","renderTab","tab","label","isActive","id","button","className","onClick","title","type","name","icon","size","renderLink","link","href","isExternal","path","target","undefined","renderTabItem","item","tabItems","tabs","div","map","en","uk"],"mappings":"AAAA;;AAEA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SAASC,IAAI,EAAEC,SAAS,EAAEC,cAAc,QAAQ,iBAAgB;AAChE,SAASC,WAAW,QAAQ,kBAAiB;AAC7C,SAASC,cAAc,QAAQ,iBAAgB;AAC/C,OAAOC,WAAW,QAAO;AAIzB,SAASC,IAAI,QAAQ,UAAS;AAC9B,OAAO,eAAc;AAErB,MAAMC,gBAAgB;AAQtB,OAAO,MAAMC,UAAkC,CAAC,EAAEC,WAAW,EAAEC,WAAW,EAAEC,aAAa,EAAE;IACzF,MAAM,EAAEC,IAAI,EAAE,GAAGV;IACjB,MAAMW,WAAWV;IAEjB,MAAM,EACJW,QAAQ,EACNC,OAAO,EACLC,QAAQ,EAAEC,QAAQC,WAAW,EAAE,EAChC,EACDF,QAAQ,EAAED,OAAOI,UAAU,EAAE,EAC9B,EACF,GAAGlB;IAEJ,MAAMmB,aAAaT,cAAcS,UAAU,KAAK;IAEhD,MAAMC,YAAY,CAACC;QACjB,MAAMC,QAAQxB,eAAeuB,IAAIC,KAAK,EAAEX;QACxC,MAAMY,WAAWf,gBAAgBa,IAAIG,EAAE;QAEvC,qBACE,KAACC;YACCC,WAAW,GAAGpB,cAAc,MAAM,EAAEiB,WAAW,GAAGjB,cAAc,aAAa,CAAC,GAAG,IAAI;YAErFqB,SAAS,IAAMlB,YAAYY,IAAIG,EAAE;YACjCI,OAAON;YACPO,MAAK;sBAEL,cAAA,KAACxB;gBAAKyB,MAAMT,IAAIU,IAAI;gBAAEC,MAAM;;WALvBX,IAAIG,EAAE;IAQjB;IAEA,MAAMS,aAAa,CAACC;QAClB,MAAMZ,QAAQxB,eAAeoC,KAAKZ,KAAK,EAAEX;QACzC,MAAMwB,OAAOD,KAAKE,UAAU,GAAGF,KAAKC,IAAI,GAAGhC,eAAe;YAAEe;YAAYmB,MAAMH,KAAKC,IAAI;QAAC;QAExF,+BAA+B;QAC/B,MAAMZ,WAAWX,aAAauB,QAASD,KAAKC,IAAI,KAAK,OAAOvB,aAAaM;QAEzE,qBACE,KAACnB;YACC2B,WAAW,GAAGpB,cAAc,OAAO,EAAEiB,WAAW,GAAGjB,cAAc,cAAc,CAAC,GAAG,IAAI;YACvF6B,MAAMA;YAENG,QAAQJ,KAAKE,UAAU,GAAG,WAAWG;YACrCX,OAAON;sBAEP,cAAA,KAACjB;gBAAKyB,MAAMI,KAAKH,IAAI;gBAAEC,MAAM;;WAJxBE,KAAKV,EAAE;IAOlB;IAEA,MAAMgB,gBAAgB,CAACC;QACrB,IAAIA,KAAKZ,IAAI,KAAK,OAAO;YACvB,OAAOT,UAAUqB;QACnB;QACA,OAAOR,WAAWQ;IACpB;IAEA,MAAMC,WAAWhC,cAAciC,IAAI,IAAI,EAAE;IAEzC,qBACE,MAACC;QAAIlB,WAAWpB;;0BACd,KAACsC;gBAAIlB,WAAW,GAAGpB,cAAc,MAAM,CAAC;0BAAGoC,SAASG,GAAG,CAACL;;YAEvDrB,4BACC,KAACyB;gBAAIlB,WAAW,GAAGpB,cAAc,SAAS,CAAC;0BACzC,cAAA,KAACP;oBACC2B,WAAW,GAAGpB,cAAc,QAAQ,CAAC;oBACrC6B,MAAMhC,eAAe;wBACnBe;wBACAmB,MAAMpB;oBACR;oBACAW,OAAO9B,eAAe;wBAAEgD,IAAI;wBAAUC,IAAI;oBAAQ,GAAGpC;oBACrDkB,MAAK;8BAEL,cAAA,KAACxB;wBAAKyB,MAAK;wBAASE,MAAM;;;;;;AAMtC,EAAC"}
1
+ {"version":3,"sources":["../../../../src/components/EnhancedSidebar/TabsBar/index.tsx"],"sourcesContent":["'use client'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { Link, useConfig, useTranslation } from '@payloadcms/ui'\nimport { usePathname } from 'next/navigation'\nimport { formatAdminURL } from 'payload/shared'\nimport React from 'react'\n\nimport type { EnhancedSidebarConfig, SidebarTabContent, SidebarTabLink } from '../../../types'\n\nimport { Icon } from '../Icon'\nimport { SettingsMenuButton } from '../SettingsMenuButton'\nimport { TabButton, TabLink } from './TabItem'\nimport './index.scss'\n\nconst tabsBaseClass = 'tabs-bar'\n\nexport type TabsBarProps = {\n activeTabId: string\n onTabChange: (tabId: string) => void\n settingsMenu?: React.ReactNode[]\n sidebarConfig: EnhancedSidebarConfig\n}\n\nexport const TabsBar: React.FC<TabsBarProps> = ({\n activeTabId,\n onTabChange,\n settingsMenu,\n sidebarConfig,\n}) => {\n const { i18n } = useTranslation()\n const pathname = usePathname()\n\n const {\n config: {\n admin: {\n routes: { browseByFolder: foldersRoute, logout: logoutRoute },\n },\n folders,\n routes: { admin: adminRoute },\n },\n } = useConfig()\n\n const showLogout = sidebarConfig.showLogout !== false\n const showFolders = folders && folders.browseByFolder\n\n const folderURL = formatAdminURL({\n adminRoute,\n path: foldersRoute,\n })\n const isFoldersActive = pathname.startsWith(folderURL)\n\n const renderTabItem = (item: SidebarTabContent | SidebarTabLink) => {\n if (item.type === 'tab') {\n return (\n <TabButton\n isActive={activeTabId === item.id}\n key={item.id}\n onTabChange={onTabChange}\n tab={item}\n />\n )\n }\n\n // Check if link is active\n const href = item.isExternal\n ? item.href\n : formatAdminURL({ adminRoute, path: item.href })\n const isActive = pathname === href || (item.href === '/' && pathname === adminRoute)\n\n return <TabLink href={href} isActive={isActive} key={item.id} link={item} />\n }\n\n const tabItems = sidebarConfig.tabs ?? []\n\n return (\n <div className={tabsBaseClass}>\n <div className={`${tabsBaseClass}__tabs`}>{tabItems.map(renderTabItem)}</div>\n\n <div className={`${tabsBaseClass}__actions`}>\n {showFolders && (\n <Link\n className={`${tabsBaseClass}__action ${isFoldersActive ? `${tabsBaseClass}__link--active` : ''}`}\n href={folderURL}\n title={getTranslation({ en: 'Browse by Folder', uk: 'Переглянути по папках' }, i18n)}\n >\n <Icon name=\"Folder\" size={20} />\n </Link>\n )}\n <SettingsMenuButton settingsMenu={settingsMenu} />\n {showLogout && (\n <Link\n className={`${tabsBaseClass}__action`}\n href={formatAdminURL({\n adminRoute,\n path: logoutRoute,\n })}\n title={getTranslation({ en: 'Logout', uk: 'Вийти' }, i18n)}\n type=\"button\"\n >\n <Icon name=\"LogOut\" size={20} />\n </Link>\n )}\n </div>\n </div>\n )\n}\n"],"names":["getTranslation","Link","useConfig","useTranslation","usePathname","formatAdminURL","React","Icon","SettingsMenuButton","TabButton","TabLink","tabsBaseClass","TabsBar","activeTabId","onTabChange","settingsMenu","sidebarConfig","i18n","pathname","config","admin","routes","browseByFolder","foldersRoute","logout","logoutRoute","folders","adminRoute","showLogout","showFolders","folderURL","path","isFoldersActive","startsWith","renderTabItem","item","type","isActive","id","tab","href","isExternal","link","tabItems","tabs","div","className","map","title","en","uk","name","size"],"mappings":"AAAA;;AAEA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SAASC,IAAI,EAAEC,SAAS,EAAEC,cAAc,QAAQ,iBAAgB;AAChE,SAASC,WAAW,QAAQ,kBAAiB;AAC7C,SAASC,cAAc,QAAQ,iBAAgB;AAC/C,OAAOC,WAAW,QAAO;AAIzB,SAASC,IAAI,QAAQ,UAAS;AAC9B,SAASC,kBAAkB,QAAQ,wBAAuB;AAC1D,SAASC,SAAS,EAAEC,OAAO,QAAQ,YAAW;AAC9C,OAAO,eAAc;AAErB,MAAMC,gBAAgB;AAStB,OAAO,MAAMC,UAAkC,CAAC,EAC9CC,WAAW,EACXC,WAAW,EACXC,YAAY,EACZC,aAAa,EACd;IACC,MAAM,EAAEC,IAAI,EAAE,GAAGd;IACjB,MAAMe,WAAWd;IAEjB,MAAM,EACJe,QAAQ,EACNC,OAAO,EACLC,QAAQ,EAAEC,gBAAgBC,YAAY,EAAEC,QAAQC,WAAW,EAAE,EAC9D,EACDC,OAAO,EACPL,QAAQ,EAAED,OAAOO,UAAU,EAAE,EAC9B,EACF,GAAGzB;IAEJ,MAAM0B,aAAaZ,cAAcY,UAAU,KAAK;IAChD,MAAMC,cAAcH,WAAWA,QAAQJ,cAAc;IAErD,MAAMQ,YAAYzB,eAAe;QAC/BsB;QACAI,MAAMR;IACR;IACA,MAAMS,kBAAkBd,SAASe,UAAU,CAACH;IAE5C,MAAMI,gBAAgB,CAACC;QACrB,IAAIA,KAAKC,IAAI,KAAK,OAAO;YACvB,qBACE,KAAC3B;gBACC4B,UAAUxB,gBAAgBsB,KAAKG,EAAE;gBAEjCxB,aAAaA;gBACbyB,KAAKJ;eAFAA,KAAKG,EAAE;QAKlB;QAEA,0BAA0B;QAC1B,MAAME,OAAOL,KAAKM,UAAU,GACxBN,KAAKK,IAAI,GACTnC,eAAe;YAAEsB;YAAYI,MAAMI,KAAKK,IAAI;QAAC;QACjD,MAAMH,WAAWnB,aAAasB,QAASL,KAAKK,IAAI,KAAK,OAAOtB,aAAaS;QAEzE,qBAAO,KAACjB;YAAQ8B,MAAMA;YAAMH,UAAUA;YAAwBK,MAAMP;WAAfA,KAAKG,EAAE;IAC9D;IAEA,MAAMK,WAAW3B,cAAc4B,IAAI,IAAI,EAAE;IAEzC,qBACE,MAACC;QAAIC,WAAWnC;;0BACd,KAACkC;gBAAIC,WAAW,GAAGnC,cAAc,MAAM,CAAC;0BAAGgC,SAASI,GAAG,CAACb;;0BAExD,MAACW;gBAAIC,WAAW,GAAGnC,cAAc,SAAS,CAAC;;oBACxCkB,6BACC,KAAC5B;wBACC6C,WAAW,GAAGnC,cAAc,SAAS,EAAEqB,kBAAkB,GAAGrB,cAAc,cAAc,CAAC,GAAG,IAAI;wBAChG6B,MAAMV;wBACNkB,OAAOhD,eAAe;4BAAEiD,IAAI;4BAAoBC,IAAI;wBAAwB,GAAGjC;kCAE/E,cAAA,KAACV;4BAAK4C,MAAK;4BAASC,MAAM;;;kCAG9B,KAAC5C;wBAAmBO,cAAcA;;oBACjCa,4BACC,KAAC3B;wBACC6C,WAAW,GAAGnC,cAAc,QAAQ,CAAC;wBACrC6B,MAAMnC,eAAe;4BACnBsB;4BACAI,MAAMN;wBACR;wBACAuB,OAAOhD,eAAe;4BAAEiD,IAAI;4BAAUC,IAAI;wBAAQ,GAAGjC;wBACrDmB,MAAK;kCAEL,cAAA,KAAC7B;4BAAK4C,MAAK;4BAASC,MAAM;;;;;;;AAMtC,EAAC"}
@@ -27,6 +27,7 @@
27
27
 
28
28
  &__tab,
29
29
  &__link {
30
+ position: relative;
30
31
  display: flex;
31
32
  align-items: center;
32
33
  justify-content: center;
@@ -52,8 +53,6 @@
52
53
  }
53
54
 
54
55
  &__link {
55
- position: relative;
56
-
57
56
  &--active {
58
57
  color: var(--theme-text);
59
58
 
@@ -86,6 +85,7 @@
86
85
  }
87
86
 
88
87
  &__action {
88
+ position: relative;
89
89
  display: flex;
90
90
  align-items: center;
91
91
  justify-content: center;
@@ -0,0 +1,11 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { BadgeConfig } from '../../../types';
3
+ type UseBadgeResult = {
4
+ value: number | ReactNode | undefined;
5
+ };
6
+ /**
7
+ * Hook to get badge value based on config.
8
+ * All badge values are read from context (populated by InternalBadgeProvider or BadgeProvider).
9
+ */
10
+ export declare const useBadge: (config: BadgeConfig | undefined, defaultSlug: string) => UseBadgeResult;
11
+ export {};
@@ -0,0 +1,31 @@
1
+ 'use client';
2
+ import { useBadgeValue } from '../BadgeProvider';
3
+ /**
4
+ * Hook to get badge value based on config.
5
+ * All badge values are read from context (populated by InternalBadgeProvider or BadgeProvider).
6
+ */ export const useBadge = (config, /**
7
+ * Default slug to use for context lookup if not specified in config
8
+ */ defaultSlug)=>{
9
+ // Determine the slug to look up in context
10
+ let slug = defaultSlug;
11
+ if (config?.type === 'provider' && config.slug) {
12
+ slug = config.slug;
13
+ } else if (config?.type === 'collection-count' && config.collectionSlug) {
14
+ // For collection-count, the InternalBadgeProvider uses the item slug as key
15
+ // but if collectionSlug is different, we might need to handle this
16
+ // For now, defaultSlug is used (which is the tab/item id)
17
+ slug = defaultSlug;
18
+ }
19
+ // Get value from context (populated by InternalBadgeProvider or user's BadgeProvider)
20
+ const contextValue = useBadgeValue(slug);
21
+ if (!config) {
22
+ return {
23
+ value: undefined
24
+ };
25
+ }
26
+ return {
27
+ value: contextValue
28
+ };
29
+ };
30
+
31
+ //# sourceMappingURL=useBadge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/EnhancedSidebar/hooks/useBadge.ts"],"sourcesContent":["'use client'\n\nimport type { ReactNode } from 'react'\n\nimport type { BadgeConfig } from '../../../types'\n\nimport { useBadgeValue } from '../BadgeProvider'\n\ntype UseBadgeResult = {\n value: number | ReactNode | undefined\n}\n\n/**\n * Hook to get badge value based on config.\n * All badge values are read from context (populated by InternalBadgeProvider or BadgeProvider).\n */\nexport const useBadge = (\n config: BadgeConfig | undefined,\n /**\n * Default slug to use for context lookup if not specified in config\n */\n defaultSlug: string,\n): UseBadgeResult => {\n // Determine the slug to look up in context\n let slug = defaultSlug\n\n if (config?.type === 'provider' && config.slug) {\n slug = config.slug\n } else if (config?.type === 'collection-count' && config.collectionSlug) {\n // For collection-count, the InternalBadgeProvider uses the item slug as key\n // but if collectionSlug is different, we might need to handle this\n // For now, defaultSlug is used (which is the tab/item id)\n slug = defaultSlug\n }\n\n // Get value from context (populated by InternalBadgeProvider or user's BadgeProvider)\n const contextValue = useBadgeValue(slug)\n\n if (!config) {\n return { value: undefined }\n }\n\n return { value: contextValue }\n}\n"],"names":["useBadgeValue","useBadge","config","defaultSlug","slug","type","collectionSlug","contextValue","value","undefined"],"mappings":"AAAA;AAMA,SAASA,aAAa,QAAQ,mBAAkB;AAMhD;;;CAGC,GACD,OAAO,MAAMC,WAAW,CACtBC,QACA;;GAEC,GACDC;IAEA,2CAA2C;IAC3C,IAAIC,OAAOD;IAEX,IAAID,QAAQG,SAAS,cAAcH,OAAOE,IAAI,EAAE;QAC9CA,OAAOF,OAAOE,IAAI;IACpB,OAAO,IAAIF,QAAQG,SAAS,sBAAsBH,OAAOI,cAAc,EAAE;QACvE,4EAA4E;QAC5E,mEAAmE;QACnE,0DAA0D;QAC1DF,OAAOD;IACT;IAEA,sFAAsF;IACtF,MAAMI,eAAeP,cAAcI;IAEnC,IAAI,CAACF,QAAQ;QACX,OAAO;YAAEM,OAAOC;QAAU;IAC5B;IAEA,OAAO;QAAED,OAAOD;IAAa;AAC/B,EAAC"}
@@ -1,7 +1,8 @@
1
1
  import type { NavPreferences } from 'payload';
2
- import type { ExtendedGroup } from 'src/types';
3
2
  import React from 'react';
3
+ import type { BadgeConfig, ExtendedGroup } from '../../types';
4
4
  export declare const EnhancedSidebarClient: React.FC<{
5
+ badges?: Record<string, BadgeConfig>;
5
6
  groups: ExtendedGroup[];
6
7
  navPreferences: NavPreferences | null;
7
8
  }>;
@@ -1,13 +1,13 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { getTranslation } from '@payloadcms/translations';
4
- import { Link, NavGroup, useConfig, useTranslation } from '@payloadcms/ui';
4
+ import { NavGroup, useConfig, useTranslation } from '@payloadcms/ui';
5
5
  import { EntityType } from '@payloadcms/ui/shared';
6
6
  import { usePathname } from 'next/navigation.js';
7
7
  import { formatAdminURL } from 'payload/shared';
8
8
  import React, { Fragment } from 'react';
9
- const baseClass = 'enhanced-sidebar';
10
- export const EnhancedSidebarClient = ({ groups, navPreferences })=>{
9
+ import { NavItem } from './NavItem';
10
+ export const EnhancedSidebarClient = ({ badges, groups, navPreferences })=>{
11
11
  const pathname = usePathname();
12
12
  const { config: { routes: { admin: adminRoute } } } = useConfig();
13
13
  const { i18n } = useTranslation();
@@ -16,8 +16,10 @@ export const EnhancedSidebarClient = ({ groups, navPreferences })=>{
16
16
  // Handle empty label (ungrouped items)
17
17
  const groupLabel = label || '';
18
18
  const isUngrouped = !label || typeof label === 'string' && label === '';
19
+ const translatedLabel = getTranslation(groupLabel, i18n);
20
+ const properKey = `${translatedLabel}-${key}`;
19
21
  const content = entities.map((entity, i)=>{
20
- const { slug, label: entityLabel } = entity;
22
+ const { slug } = entity;
21
23
  const entityType = entity.type;
22
24
  let href;
23
25
  let id;
@@ -54,45 +56,30 @@ export const EnhancedSidebarClient = ({ groups, navPreferences })=>{
54
56
  '/',
55
57
  undefined
56
58
  ].includes(pathname[href.length]);
57
- const Label = /*#__PURE__*/ _jsxs(_Fragment, {
58
- children: [
59
- isActive && /*#__PURE__*/ _jsx("div", {
60
- className: `${baseClass}__link-indicator`
61
- }),
62
- /*#__PURE__*/ _jsx("span", {
63
- className: `${baseClass}__link-label`,
64
- children: getTranslation(entityLabel, i18n)
65
- })
66
- ]
67
- });
68
- if (pathname === href) {
69
- return /*#__PURE__*/ _jsx("div", {
70
- className: `${baseClass}__link`,
71
- id: id,
72
- children: Label
73
- }, i);
74
- }
75
- return /*#__PURE__*/ _jsx(Link, {
76
- className: `${baseClass}__link`,
59
+ const isCurrentPage = pathname === href;
60
+ // Get badge config for this entity
61
+ const badgeConfig = badges?.[slug];
62
+ return /*#__PURE__*/ _jsx(NavItem, {
63
+ badgeConfig: badgeConfig,
64
+ entity: entity,
77
65
  href: href,
78
66
  id: id,
79
- prefetch: false,
80
- children: Label
67
+ isActive: isActive,
68
+ isCurrentPage: isCurrentPage
81
69
  }, i);
82
70
  });
83
71
  // For ungrouped items, render without NavGroup wrapper
84
72
  if (isUngrouped) {
85
73
  return /*#__PURE__*/ _jsx(Fragment, {
86
74
  children: content
87
- }, key);
75
+ }, properKey);
88
76
  }
89
- // Get translated label for NavGroup
90
- const translatedLabel = getTranslation(groupLabel, i18n);
77
+ //TODO:
91
78
  return /*#__PURE__*/ _jsx(NavGroup, {
92
79
  isOpen: navPreferences?.groups?.[translatedLabel]?.open,
93
80
  label: translatedLabel,
94
81
  children: content
95
- }, key);
82
+ }, properKey);
96
83
  })
97
84
  });
98
85
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/EnhancedSidebar/index.client.tsx"],"sourcesContent":["'use client'\nimport type { NavPreferences } from 'payload'\nimport type { ExtendedGroup } from 'src/types'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { Link, NavGroup, useConfig, useTranslation } from '@payloadcms/ui'\nimport { EntityType } from '@payloadcms/ui/shared'\nimport { usePathname } from 'next/navigation.js'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { Fragment } from 'react'\n\nconst baseClass = 'enhanced-sidebar'\n\nexport const EnhancedSidebarClient: React.FC<{\n groups: ExtendedGroup[]\n navPreferences: NavPreferences | null\n}> = ({ groups, navPreferences }) => {\n const pathname = usePathname()\n\n const {\n config: {\n routes: { admin: adminRoute },\n },\n } = useConfig()\n\n const { i18n } = useTranslation()\n\n return (\n <Fragment>\n {groups.map(({ entities, label }, key) => {\n // Handle empty label (ungrouped items)\n const groupLabel = label || ''\n const isUngrouped = !label || (typeof label === 'string' && label === '')\n\n const content = entities.map((entity, i) => {\n const { slug, label: entityLabel } = entity\n const entityType = entity.type\n let href: string\n let id: string\n\n // Check for collection\n //@ts-expect-error Idk why typescript is complaining here\n if (entityType === EntityType.collection) {\n href = formatAdminURL({ adminRoute, path: `/collections/${slug}` })\n id = `nav-${slug}`\n //@ts-expect-error Idk why typescript is complaining here\n } else if (entityType === EntityType.global) {\n href = formatAdminURL({ adminRoute, path: `/globals/${slug}` })\n id = `nav-global-${slug}`\n } else if (entityType === 'custom' && entity.href) {\n // Custom item with href\n id = `nav-custom-${slug}`\n if (entity.isExternal) {\n href = entity.href\n } else {\n href = formatAdminURL({ adminRoute, path: entity.href })\n }\n } else {\n return null\n }\n\n const isActive =\n pathname.startsWith(href) && ['/', undefined].includes(pathname[href.length])\n\n const Label = (\n <>\n {isActive && <div className={`${baseClass}__link-indicator`} />}\n <span className={`${baseClass}__link-label`}>\n {getTranslation(entityLabel, i18n)}\n </span>\n </>\n )\n\n if (pathname === href) {\n return (\n <div className={`${baseClass}__link`} id={id} key={i}>\n {Label}\n </div>\n )\n }\n\n return (\n <Link className={`${baseClass}__link`} href={href} id={id} key={i} prefetch={false}>\n {Label}\n </Link>\n )\n })\n\n // For ungrouped items, render without NavGroup wrapper\n if (isUngrouped) {\n return <Fragment key={key}>{content}</Fragment>\n }\n\n // Get translated label for NavGroup\n const translatedLabel = getTranslation(groupLabel, i18n)\n\n return (\n <NavGroup\n isOpen={navPreferences?.groups?.[translatedLabel]?.open}\n key={key}\n label={translatedLabel}\n >\n {content}\n </NavGroup>\n )\n })}\n </Fragment>\n )\n}\n"],"names":["getTranslation","Link","NavGroup","useConfig","useTranslation","EntityType","usePathname","formatAdminURL","React","Fragment","baseClass","EnhancedSidebarClient","groups","navPreferences","pathname","config","routes","admin","adminRoute","i18n","map","entities","label","key","groupLabel","isUngrouped","content","entity","i","slug","entityLabel","entityType","type","href","id","collection","path","global","isExternal","isActive","startsWith","undefined","includes","length","Label","div","className","span","prefetch","translatedLabel","isOpen","open"],"mappings":"AAAA;;AAIA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SAASC,IAAI,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,cAAc,QAAQ,iBAAgB;AAC1E,SAASC,UAAU,QAAQ,wBAAuB;AAClD,SAASC,WAAW,QAAQ,qBAAoB;AAChD,SAASC,cAAc,QAAQ,iBAAgB;AAC/C,OAAOC,SAASC,QAAQ,QAAQ,QAAO;AAEvC,MAAMC,YAAY;AAElB,OAAO,MAAMC,wBAGR,CAAC,EAAEC,MAAM,EAAEC,cAAc,EAAE;IAC9B,MAAMC,WAAWR;IAEjB,MAAM,EACJS,QAAQ,EACNC,QAAQ,EAAEC,OAAOC,UAAU,EAAE,EAC9B,EACF,GAAGf;IAEJ,MAAM,EAAEgB,IAAI,EAAE,GAAGf;IAEjB,qBACE,KAACK;kBACEG,OAAOQ,GAAG,CAAC,CAAC,EAAEC,QAAQ,EAAEC,KAAK,EAAE,EAAEC;YAChC,uCAAuC;YACvC,MAAMC,aAAaF,SAAS;YAC5B,MAAMG,cAAc,CAACH,SAAU,OAAOA,UAAU,YAAYA,UAAU;YAEtE,MAAMI,UAAUL,SAASD,GAAG,CAAC,CAACO,QAAQC;gBACpC,MAAM,EAAEC,IAAI,EAAEP,OAAOQ,WAAW,EAAE,GAAGH;gBACrC,MAAMI,aAAaJ,OAAOK,IAAI;gBAC9B,IAAIC;gBACJ,IAAIC;gBAEJ,uBAAuB;gBACvB,yDAAyD;gBACzD,IAAIH,eAAe1B,WAAW8B,UAAU,EAAE;oBACxCF,OAAO1B,eAAe;wBAAEW;wBAAYkB,MAAM,CAAC,aAAa,EAAEP,MAAM;oBAAC;oBACjEK,KAAK,CAAC,IAAI,EAAEL,MAAM;gBAClB,yDAAyD;gBAC3D,OAAO,IAAIE,eAAe1B,WAAWgC,MAAM,EAAE;oBAC3CJ,OAAO1B,eAAe;wBAAEW;wBAAYkB,MAAM,CAAC,SAAS,EAAEP,MAAM;oBAAC;oBAC7DK,KAAK,CAAC,WAAW,EAAEL,MAAM;gBAC3B,OAAO,IAAIE,eAAe,YAAYJ,OAAOM,IAAI,EAAE;oBACjD,wBAAwB;oBACxBC,KAAK,CAAC,WAAW,EAAEL,MAAM;oBACzB,IAAIF,OAAOW,UAAU,EAAE;wBACrBL,OAAON,OAAOM,IAAI;oBACpB,OAAO;wBACLA,OAAO1B,eAAe;4BAAEW;4BAAYkB,MAAMT,OAAOM,IAAI;wBAAC;oBACxD;gBACF,OAAO;oBACL,OAAO;gBACT;gBAEA,MAAMM,WACJzB,SAAS0B,UAAU,CAACP,SAAS;oBAAC;oBAAKQ;iBAAU,CAACC,QAAQ,CAAC5B,QAAQ,CAACmB,KAAKU,MAAM,CAAC;gBAE9E,MAAMC,sBACJ;;wBACGL,0BAAY,KAACM;4BAAIC,WAAW,GAAGpC,UAAU,gBAAgB,CAAC;;sCAC3D,KAACqC;4BAAKD,WAAW,GAAGpC,UAAU,YAAY,CAAC;sCACxCV,eAAe8B,aAAaX;;;;gBAKnC,IAAIL,aAAamB,MAAM;oBACrB,qBACE,KAACY;wBAAIC,WAAW,GAAGpC,UAAU,MAAM,CAAC;wBAAEwB,IAAIA;kCACvCU;uBADgDhB;gBAIvD;gBAEA,qBACE,KAAC3B;oBAAK6C,WAAW,GAAGpC,UAAU,MAAM,CAAC;oBAAEuB,MAAMA;oBAAMC,IAAIA;oBAAYc,UAAU;8BAC1EJ;mBAD6DhB;YAIpE;YAEA,uDAAuD;YACvD,IAAIH,aAAa;gBACf,qBAAO,KAAChB;8BAAoBiB;mBAANH;YACxB;YAEA,oCAAoC;YACpC,MAAM0B,kBAAkBjD,eAAewB,YAAYL;YAEnD,qBACE,KAACjB;gBACCgD,QAAQrC,gBAAgBD,QAAQ,CAACqC,gBAAgB,EAAEE;gBAEnD7B,OAAO2B;0BAENvB;eAHIH;QAMX;;AAGN,EAAC"}
1
+ {"version":3,"sources":["../../../src/components/EnhancedSidebar/index.client.tsx"],"sourcesContent":["'use client'\nimport type { NavPreferences } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { NavGroup, useConfig, useTranslation } from '@payloadcms/ui'\nimport { EntityType } from '@payloadcms/ui/shared'\nimport { usePathname } from 'next/navigation.js'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { Fragment } from 'react'\n\nimport type { BadgeConfig, ExtendedGroup } from '../../types'\n\nimport { NavItem } from './NavItem'\n\nexport const EnhancedSidebarClient: React.FC<{\n badges?: Record<string, BadgeConfig>\n groups: ExtendedGroup[]\n navPreferences: NavPreferences | null\n}> = ({ badges, groups, navPreferences }) => {\n const pathname = usePathname()\n\n const {\n config: {\n routes: { admin: adminRoute },\n },\n } = useConfig()\n\n const { i18n } = useTranslation()\n\n return (\n <Fragment>\n {groups.map(({ entities, label }, key) => {\n // Handle empty label (ungrouped items)\n const groupLabel = label || ''\n const isUngrouped = !label || (typeof label === 'string' && label === '')\n const translatedLabel = getTranslation(groupLabel, i18n)\n\n const properKey = `${translatedLabel}-${key}`\n\n const content = entities.map((entity, i) => {\n const { slug } = entity\n const entityType = entity.type\n let href: string\n let id: string\n\n // Check for collection\n //@ts-expect-error Idk why typescript is complaining here\n if (entityType === EntityType.collection) {\n href = formatAdminURL({ adminRoute, path: `/collections/${slug}` })\n id = `nav-${slug}`\n //@ts-expect-error Idk why typescript is complaining here\n } else if (entityType === EntityType.global) {\n href = formatAdminURL({ adminRoute, path: `/globals/${slug}` })\n id = `nav-global-${slug}`\n } else if (entityType === 'custom' && entity.href) {\n // Custom item with href\n id = `nav-custom-${slug}`\n if (entity.isExternal) {\n href = entity.href\n } else {\n href = formatAdminURL({ adminRoute, path: entity.href })\n }\n } else {\n return null\n }\n\n const isActive =\n pathname.startsWith(href) && ['/', undefined].includes(pathname[href.length])\n const isCurrentPage = pathname === href\n\n // Get badge config for this entity\n const badgeConfig = badges?.[slug]\n\n return (\n <NavItem\n badgeConfig={badgeConfig}\n entity={entity}\n href={href}\n id={id}\n isActive={isActive}\n isCurrentPage={isCurrentPage}\n key={i}\n />\n )\n })\n\n // For ungrouped items, render without NavGroup wrapper\n if (isUngrouped) {\n return <Fragment key={properKey}>{content}</Fragment>\n }\n //TODO:\n return (\n <NavGroup\n isOpen={navPreferences?.groups?.[translatedLabel]?.open}\n key={properKey}\n label={translatedLabel}\n >\n {content}\n </NavGroup>\n )\n })}\n </Fragment>\n )\n}\n"],"names":["getTranslation","NavGroup","useConfig","useTranslation","EntityType","usePathname","formatAdminURL","React","Fragment","NavItem","EnhancedSidebarClient","badges","groups","navPreferences","pathname","config","routes","admin","adminRoute","i18n","map","entities","label","key","groupLabel","isUngrouped","translatedLabel","properKey","content","entity","i","slug","entityType","type","href","id","collection","path","global","isExternal","isActive","startsWith","undefined","includes","length","isCurrentPage","badgeConfig","isOpen","open"],"mappings":"AAAA;;AAGA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SAASC,QAAQ,EAAEC,SAAS,EAAEC,cAAc,QAAQ,iBAAgB;AACpE,SAASC,UAAU,QAAQ,wBAAuB;AAClD,SAASC,WAAW,QAAQ,qBAAoB;AAChD,SAASC,cAAc,QAAQ,iBAAgB;AAC/C,OAAOC,SAASC,QAAQ,QAAQ,QAAO;AAIvC,SAASC,OAAO,QAAQ,YAAW;AAEnC,OAAO,MAAMC,wBAIR,CAAC,EAAEC,MAAM,EAAEC,MAAM,EAAEC,cAAc,EAAE;IACtC,MAAMC,WAAWT;IAEjB,MAAM,EACJU,QAAQ,EACNC,QAAQ,EAAEC,OAAOC,UAAU,EAAE,EAC9B,EACF,GAAGhB;IAEJ,MAAM,EAAEiB,IAAI,EAAE,GAAGhB;IAEjB,qBACE,KAACK;kBACEI,OAAOQ,GAAG,CAAC,CAAC,EAAEC,QAAQ,EAAEC,KAAK,EAAE,EAAEC;YAChC,uCAAuC;YACvC,MAAMC,aAAaF,SAAS;YAC5B,MAAMG,cAAc,CAACH,SAAU,OAAOA,UAAU,YAAYA,UAAU;YACtE,MAAMI,kBAAkB1B,eAAewB,YAAYL;YAEnD,MAAMQ,YAAY,GAAGD,gBAAgB,CAAC,EAAEH,KAAK;YAE7C,MAAMK,UAAUP,SAASD,GAAG,CAAC,CAACS,QAAQC;gBACpC,MAAM,EAAEC,IAAI,EAAE,GAAGF;gBACjB,MAAMG,aAAaH,OAAOI,IAAI;gBAC9B,IAAIC;gBACJ,IAAIC;gBAEJ,uBAAuB;gBACvB,yDAAyD;gBACzD,IAAIH,eAAe5B,WAAWgC,UAAU,EAAE;oBACxCF,OAAO5B,eAAe;wBAAEY;wBAAYmB,MAAM,CAAC,aAAa,EAAEN,MAAM;oBAAC;oBACjEI,KAAK,CAAC,IAAI,EAAEJ,MAAM;gBAClB,yDAAyD;gBAC3D,OAAO,IAAIC,eAAe5B,WAAWkC,MAAM,EAAE;oBAC3CJ,OAAO5B,eAAe;wBAAEY;wBAAYmB,MAAM,CAAC,SAAS,EAAEN,MAAM;oBAAC;oBAC7DI,KAAK,CAAC,WAAW,EAAEJ,MAAM;gBAC3B,OAAO,IAAIC,eAAe,YAAYH,OAAOK,IAAI,EAAE;oBACjD,wBAAwB;oBACxBC,KAAK,CAAC,WAAW,EAAEJ,MAAM;oBACzB,IAAIF,OAAOU,UAAU,EAAE;wBACrBL,OAAOL,OAAOK,IAAI;oBACpB,OAAO;wBACLA,OAAO5B,eAAe;4BAAEY;4BAAYmB,MAAMR,OAAOK,IAAI;wBAAC;oBACxD;gBACF,OAAO;oBACL,OAAO;gBACT;gBAEA,MAAMM,WACJ1B,SAAS2B,UAAU,CAACP,SAAS;oBAAC;oBAAKQ;iBAAU,CAACC,QAAQ,CAAC7B,QAAQ,CAACoB,KAAKU,MAAM,CAAC;gBAC9E,MAAMC,gBAAgB/B,aAAaoB;gBAEnC,mCAAmC;gBACnC,MAAMY,cAAcnC,QAAQ,CAACoB,KAAK;gBAElC,qBACE,KAACtB;oBACCqC,aAAaA;oBACbjB,QAAQA;oBACRK,MAAMA;oBACNC,IAAIA;oBACJK,UAAUA;oBACVK,eAAeA;mBACVf;YAGX;YAEA,uDAAuD;YACvD,IAAIL,aAAa;gBACf,qBAAO,KAACjB;8BAA0BoB;mBAAZD;YACxB;YACA,OAAO;YACP,qBACE,KAAC1B;gBACC8C,QAAQlC,gBAAgBD,QAAQ,CAACc,gBAAgB,EAAEsB;gBAEnD1B,OAAOI;0BAENE;eAHID;QAMX;;AAGN,EAAC"}
@@ -1,7 +1,9 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent';
3
3
  import { EntityType, groupNavItems } from '@payloadcms/ui/shared';
4
+ import { cookies } from 'next/headers';
4
5
  import React from 'react';
6
+ const COOKIE_KEY = 'payload-enhanced-sidebar-active-tab';
5
7
  import { getNavPrefs } from './getNavPrefs';
6
8
  import { SidebarContent } from './SidebarContent';
7
9
  import './index.scss';
@@ -10,7 +12,7 @@ export const EnhancedSidebar = async (props)=>{
10
12
  if (!payload?.config) {
11
13
  return null;
12
14
  }
13
- const { admin: { components: { afterNavLinks, beforeNavLinks } }, collections, globals } = payload.config;
15
+ const { admin: { components: { afterNavLinks, beforeNavLinks, settingsMenu } }, collections, globals } = payload.config;
14
16
  const groups = groupNavItems([
15
17
  ...collections.filter(({ slug })=>visibleEntities?.collections.includes(slug)).map((collection)=>({
16
18
  type: EntityType.collection,
@@ -41,6 +43,12 @@ export const EnhancedSidebar = async (props)=>{
41
43
  importMap: payload.importMap,
42
44
  serverProps
43
45
  });
46
+ const renderedSettingsMenu = settingsMenu && Array.isArray(settingsMenu) ? settingsMenu.map((item, index)=>RenderServerComponent({
47
+ Component: item,
48
+ importMap: payload.importMap,
49
+ key: `settings-menu-item-${index}`,
50
+ serverProps
51
+ })) : [];
44
52
  // Default config if not provided
45
53
  const config = sidebarConfig ?? {
46
54
  tabs: [
@@ -52,11 +60,19 @@ export const EnhancedSidebar = async (props)=>{
52
60
  }
53
61
  ]
54
62
  };
63
+ // Read active tab from cookie
64
+ const cookieStore = await cookies();
65
+ const storedTabId = cookieStore.get(COOKIE_KEY)?.value;
66
+ const tabs = config.tabs?.filter((t)=>t.type === 'tab') ?? [];
67
+ const defaultTabId = tabs[0]?.id ?? 'default';
68
+ const initialActiveTabId = storedTabId && tabs.some((t)=>t.id === storedTabId) ? storedTabId : defaultTabId;
55
69
  return /*#__PURE__*/ _jsx(SidebarContent, {
56
70
  afterNavLinks: afterNavLinksRendered,
57
71
  beforeNavLinks: beforeNavLinksRendered,
58
72
  groups: groups,
73
+ initialActiveTabId: initialActiveTabId,
59
74
  navPreferences: navPreferences,
75
+ settingsMenu: renderedSettingsMenu,
60
76
  sidebarConfig: config
61
77
  });
62
78
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/EnhancedSidebar/index.tsx"],"sourcesContent":["import type { EntityToGroup } from '@payloadcms/ui/shared'\nimport type { PayloadRequest, ServerProps } from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { EntityType, groupNavItems } from '@payloadcms/ui/shared'\nimport React from 'react'\n\nimport type { EnhancedSidebarConfig, ExtendedGroup } from '../../types'\n\nimport { getNavPrefs } from './getNavPrefs'\nimport { SidebarContent } from './SidebarContent'\nimport './index.scss'\n\nexport type EnhancedSidebarProps = {\n req?: PayloadRequest\n sidebarConfig?: EnhancedSidebarConfig\n} & ServerProps\n\nexport const EnhancedSidebar: React.FC<EnhancedSidebarProps> = async (props) => {\n const {\n i18n,\n locale,\n params,\n payload,\n permissions,\n req,\n searchParams,\n sidebarConfig,\n user,\n visibleEntities,\n } = props\n\n if (!payload?.config) {\n return null\n }\n\n const {\n admin: {\n components: { afterNavLinks, beforeNavLinks },\n },\n collections,\n globals,\n } = payload.config\n\n const groups = groupNavItems(\n [\n ...collections\n .filter(({ slug }) => visibleEntities?.collections.includes(slug))\n .map(\n (collection) =>\n ({\n type: EntityType.collection,\n entity: collection,\n }) satisfies EntityToGroup,\n ),\n ...globals\n .filter(({ slug }) => visibleEntities?.globals.includes(slug))\n .map(\n (global) =>\n ({\n type: EntityType.global,\n entity: global,\n }) satisfies EntityToGroup,\n ),\n ],\n permissions || {},\n i18n,\n ) as unknown as ExtendedGroup[]\n\n const navPreferences = await getNavPrefs(req)\n\n const serverProps = {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n }\n\n const beforeNavLinksRendered = RenderServerComponent({\n Component: beforeNavLinks,\n importMap: payload.importMap,\n serverProps,\n })\n\n const afterNavLinksRendered = RenderServerComponent({\n Component: afterNavLinks,\n importMap: payload.importMap,\n serverProps,\n })\n\n // Default config if not provided\n const config: EnhancedSidebarConfig = sidebarConfig ?? {\n tabs: [\n {\n id: 'default',\n type: 'tab',\n icon: 'LayoutGrid',\n label: 'Collections',\n },\n ],\n }\n\n return (\n <SidebarContent\n afterNavLinks={afterNavLinksRendered}\n beforeNavLinks={beforeNavLinksRendered}\n groups={groups}\n navPreferences={navPreferences}\n sidebarConfig={config}\n />\n )\n}\n\nexport default EnhancedSidebar\n"],"names":["RenderServerComponent","EntityType","groupNavItems","React","getNavPrefs","SidebarContent","EnhancedSidebar","props","i18n","locale","params","payload","permissions","req","searchParams","sidebarConfig","user","visibleEntities","config","admin","components","afterNavLinks","beforeNavLinks","collections","globals","groups","filter","slug","includes","map","collection","type","entity","global","navPreferences","serverProps","beforeNavLinksRendered","Component","importMap","afterNavLinksRendered","tabs","id","icon","label"],"mappings":";AAGA,SAASA,qBAAqB,QAAQ,gDAA+C;AACrF,SAASC,UAAU,EAAEC,aAAa,QAAQ,wBAAuB;AACjE,OAAOC,WAAW,QAAO;AAIzB,SAASC,WAAW,QAAQ,gBAAe;AAC3C,SAASC,cAAc,QAAQ,mBAAkB;AACjD,OAAO,eAAc;AAOrB,OAAO,MAAMC,kBAAkD,OAAOC;IACpE,MAAM,EACJC,IAAI,EACJC,MAAM,EACNC,MAAM,EACNC,OAAO,EACPC,WAAW,EACXC,GAAG,EACHC,YAAY,EACZC,aAAa,EACbC,IAAI,EACJC,eAAe,EAChB,GAAGV;IAEJ,IAAI,CAACI,SAASO,QAAQ;QACpB,OAAO;IACT;IAEA,MAAM,EACJC,OAAO,EACLC,YAAY,EAAEC,aAAa,EAAEC,cAAc,EAAE,EAC9C,EACDC,WAAW,EACXC,OAAO,EACR,GAAGb,QAAQO,MAAM;IAElB,MAAMO,SAASvB,cACb;WACKqB,YACAG,MAAM,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKV,iBAAiBM,YAAYK,SAASD,OAC3DE,GAAG,CACF,CAACC,aACE,CAAA;gBACCC,MAAM9B,WAAW6B,UAAU;gBAC3BE,QAAQF;YACV,CAAA;WAEHN,QACAE,MAAM,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKV,iBAAiBO,QAAQI,SAASD,OACvDE,GAAG,CACF,CAACI,SACE,CAAA;gBACCF,MAAM9B,WAAWgC,MAAM;gBACvBD,QAAQC;YACV,CAAA;KAEP,EACDrB,eAAe,CAAC,GAChBJ;IAGF,MAAM0B,iBAAiB,MAAM9B,YAAYS;IAEzC,MAAMsB,cAAc;QAClB3B;QACAC;QACAC;QACAC;QACAC;QACAE;QACAE;IACF;IAEA,MAAMoB,yBAAyBpC,sBAAsB;QACnDqC,WAAWf;QACXgB,WAAW3B,QAAQ2B,SAAS;QAC5BH;IACF;IAEA,MAAMI,wBAAwBvC,sBAAsB;QAClDqC,WAAWhB;QACXiB,WAAW3B,QAAQ2B,SAAS;QAC5BH;IACF;IAEA,iCAAiC;IACjC,MAAMjB,SAAgCH,iBAAiB;QACrDyB,MAAM;YACJ;gBACEC,IAAI;gBACJV,MAAM;gBACNW,MAAM;gBACNC,OAAO;YACT;SACD;IACH;IAEA,qBACE,KAACtC;QACCgB,eAAekB;QACfjB,gBAAgBc;QAChBX,QAAQA;QACRS,gBAAgBA;QAChBnB,eAAeG;;AAGrB,EAAC;AAED,eAAeZ,gBAAe"}
1
+ {"version":3,"sources":["../../../src/components/EnhancedSidebar/index.tsx"],"sourcesContent":["import type { EntityToGroup } from '@payloadcms/ui/shared'\nimport type { PayloadRequest, ServerProps } from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { EntityType, groupNavItems } from '@payloadcms/ui/shared'\nimport { cookies } from 'next/headers'\nimport React from 'react'\n\nconst COOKIE_KEY = 'payload-enhanced-sidebar-active-tab'\n\nimport type { EnhancedSidebarConfig, ExtendedGroup } from '../../types'\n\nimport { getNavPrefs } from './getNavPrefs'\nimport { SidebarContent } from './SidebarContent'\nimport './index.scss'\n\nexport type EnhancedSidebarProps = {\n req?: PayloadRequest\n sidebarConfig?: EnhancedSidebarConfig\n} & ServerProps\n\nexport const EnhancedSidebar: React.FC<EnhancedSidebarProps> = async (props) => {\n const {\n i18n,\n locale,\n params,\n payload,\n permissions,\n req,\n searchParams,\n sidebarConfig,\n user,\n visibleEntities,\n } = props\n\n if (!payload?.config) {\n return null\n }\n\n const {\n admin: {\n components: { afterNavLinks, beforeNavLinks, settingsMenu },\n },\n collections,\n globals,\n } = payload.config\n\n const groups = groupNavItems(\n [\n ...collections\n .filter(({ slug }) => visibleEntities?.collections.includes(slug))\n .map(\n (collection) =>\n ({\n type: EntityType.collection,\n entity: collection,\n }) satisfies EntityToGroup,\n ),\n ...globals\n .filter(({ slug }) => visibleEntities?.globals.includes(slug))\n .map(\n (global) =>\n ({\n type: EntityType.global,\n entity: global,\n }) satisfies EntityToGroup,\n ),\n ],\n permissions || {},\n i18n,\n ) as unknown as ExtendedGroup[]\n\n const navPreferences = await getNavPrefs(req)\n\n const serverProps = {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n }\n\n const beforeNavLinksRendered = RenderServerComponent({\n Component: beforeNavLinks,\n importMap: payload.importMap,\n serverProps,\n })\n\n const afterNavLinksRendered = RenderServerComponent({\n Component: afterNavLinks,\n importMap: payload.importMap,\n serverProps,\n })\n\n const renderedSettingsMenu =\n settingsMenu && Array.isArray(settingsMenu)\n ? settingsMenu.map((item, index) =>\n RenderServerComponent({\n Component: item,\n importMap: payload.importMap,\n key: `settings-menu-item-${index}`,\n serverProps,\n }),\n )\n : []\n\n // Default config if not provided\n const config: EnhancedSidebarConfig = sidebarConfig ?? {\n tabs: [\n {\n id: 'default',\n type: 'tab',\n icon: 'LayoutGrid',\n label: 'Collections',\n },\n ],\n }\n\n // Read active tab from cookie\n const cookieStore = await cookies()\n const storedTabId = cookieStore.get(COOKIE_KEY)?.value\n const tabs = config.tabs?.filter((t) => t.type === 'tab') ?? []\n const defaultTabId = tabs[0]?.id ?? 'default'\n const initialActiveTabId =\n storedTabId && tabs.some((t) => t.id === storedTabId) ? storedTabId : defaultTabId\n\n return (\n <SidebarContent\n afterNavLinks={afterNavLinksRendered}\n beforeNavLinks={beforeNavLinksRendered}\n groups={groups}\n initialActiveTabId={initialActiveTabId}\n navPreferences={navPreferences}\n settingsMenu={renderedSettingsMenu}\n sidebarConfig={config}\n />\n )\n}\n\nexport default EnhancedSidebar\n"],"names":["RenderServerComponent","EntityType","groupNavItems","cookies","React","COOKIE_KEY","getNavPrefs","SidebarContent","EnhancedSidebar","props","i18n","locale","params","payload","permissions","req","searchParams","sidebarConfig","user","visibleEntities","config","admin","components","afterNavLinks","beforeNavLinks","settingsMenu","collections","globals","groups","filter","slug","includes","map","collection","type","entity","global","navPreferences","serverProps","beforeNavLinksRendered","Component","importMap","afterNavLinksRendered","renderedSettingsMenu","Array","isArray","item","index","key","tabs","id","icon","label","cookieStore","storedTabId","get","value","t","defaultTabId","initialActiveTabId","some"],"mappings":";AAGA,SAASA,qBAAqB,QAAQ,gDAA+C;AACrF,SAASC,UAAU,EAAEC,aAAa,QAAQ,wBAAuB;AACjE,SAASC,OAAO,QAAQ,eAAc;AACtC,OAAOC,WAAW,QAAO;AAEzB,MAAMC,aAAa;AAInB,SAASC,WAAW,QAAQ,gBAAe;AAC3C,SAASC,cAAc,QAAQ,mBAAkB;AACjD,OAAO,eAAc;AAOrB,OAAO,MAAMC,kBAAkD,OAAOC;IACpE,MAAM,EACJC,IAAI,EACJC,MAAM,EACNC,MAAM,EACNC,OAAO,EACPC,WAAW,EACXC,GAAG,EACHC,YAAY,EACZC,aAAa,EACbC,IAAI,EACJC,eAAe,EAChB,GAAGV;IAEJ,IAAI,CAACI,SAASO,QAAQ;QACpB,OAAO;IACT;IAEA,MAAM,EACJC,OAAO,EACLC,YAAY,EAAEC,aAAa,EAAEC,cAAc,EAAEC,YAAY,EAAE,EAC5D,EACDC,WAAW,EACXC,OAAO,EACR,GAAGd,QAAQO,MAAM;IAElB,MAAMQ,SAAS1B,cACb;WACKwB,YACAG,MAAM,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKX,iBAAiBO,YAAYK,SAASD,OAC3DE,GAAG,CACF,CAACC,aACE,CAAA;gBACCC,MAAMjC,WAAWgC,UAAU;gBAC3BE,QAAQF;YACV,CAAA;WAEHN,QACAE,MAAM,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKX,iBAAiBQ,QAAQI,SAASD,OACvDE,GAAG,CACF,CAACI,SACE,CAAA;gBACCF,MAAMjC,WAAWmC,MAAM;gBACvBD,QAAQC;YACV,CAAA;KAEP,EACDtB,eAAe,CAAC,GAChBJ;IAGF,MAAM2B,iBAAiB,MAAM/B,YAAYS;IAEzC,MAAMuB,cAAc;QAClB5B;QACAC;QACAC;QACAC;QACAC;QACAE;QACAE;IACF;IAEA,MAAMqB,yBAAyBvC,sBAAsB;QACnDwC,WAAWhB;QACXiB,WAAW5B,QAAQ4B,SAAS;QAC5BH;IACF;IAEA,MAAMI,wBAAwB1C,sBAAsB;QAClDwC,WAAWjB;QACXkB,WAAW5B,QAAQ4B,SAAS;QAC5BH;IACF;IAEA,MAAMK,uBACJlB,gBAAgBmB,MAAMC,OAAO,CAACpB,gBAC1BA,aAAaO,GAAG,CAAC,CAACc,MAAMC,QACtB/C,sBAAsB;YACpBwC,WAAWM;YACXL,WAAW5B,QAAQ4B,SAAS;YAC5BO,KAAK,CAAC,mBAAmB,EAAED,OAAO;YAClCT;QACF,MAEF,EAAE;IAER,iCAAiC;IACjC,MAAMlB,SAAgCH,iBAAiB;QACrDgC,MAAM;YACJ;gBACEC,IAAI;gBACJhB,MAAM;gBACNiB,MAAM;gBACNC,OAAO;YACT;SACD;IACH;IAEA,8BAA8B;IAC9B,MAAMC,cAAc,MAAMlD;IAC1B,MAAMmD,cAAcD,YAAYE,GAAG,CAAClD,aAAamD;IACjD,MAAMP,OAAO7B,OAAO6B,IAAI,EAAEpB,OAAO,CAAC4B,IAAMA,EAAEvB,IAAI,KAAK,UAAU,EAAE;IAC/D,MAAMwB,eAAeT,IAAI,CAAC,EAAE,EAAEC,MAAM;IACpC,MAAMS,qBACJL,eAAeL,KAAKW,IAAI,CAAC,CAACH,IAAMA,EAAEP,EAAE,KAAKI,eAAeA,cAAcI;IAExE,qBACE,KAACnD;QACCgB,eAAemB;QACflB,gBAAgBe;QAChBX,QAAQA;QACR+B,oBAAoBA;QACpBtB,gBAAgBA;QAChBZ,cAAckB;QACd1B,eAAeG;;AAGrB,EAAC;AAED,eAAeZ,gBAAe"}
@@ -0,0 +1 @@
1
+ export { InternalBadgeProvider } from '../components/EnhancedSidebar/InternalBadgeProvider';
@@ -1,3 +1,4 @@
1
- // Client components will be exported here
1
+ // Client components exported for Payload's component system
2
+ export { InternalBadgeProvider } from '../components/EnhancedSidebar/InternalBadgeProvider';
2
3
 
3
4
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["// Client components will be exported here\n"],"names":[],"mappings":"AAAA,0CAA0C"}
1
+ {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["// Client components exported for Payload's component system\nexport { InternalBadgeProvider } from '../components/EnhancedSidebar/InternalBadgeProvider'\n"],"names":["InternalBadgeProvider"],"mappings":"AAAA,4DAA4D;AAC5D,SAASA,qBAAqB,QAAQ,sDAAqD"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { type Config } from 'payload';
2
2
  import type { EnhancedSidebarConfig } from './types';
3
3
  export declare const payloadEnhancedSidebar: (pluginOptions?: EnhancedSidebarConfig) => (config: Config) => Config;
4
- export type { EnhancedSidebarConfig } from './types';
4
+ export { BadgeProvider, useBadgeContext, useBadgeValue, } from './components/EnhancedSidebar/BadgeProvider';
5
+ export type { BadgeColor, BadgeConfig, BadgeConfigApi, BadgeConfigCollectionCount, BadgeConfigProvider, BadgeValues, EnhancedSidebarConfig, } from './types';
package/dist/index.js CHANGED
@@ -50,6 +50,21 @@ export const payloadEnhancedSidebar = (pluginOptions = {})=>(config)=>{
50
50
  }
51
51
  };
52
52
  }
53
+ // Check if we have any badges to fetch (api or collection-count)
54
+ const hasBadgesToFetch = sidebarConfig.badges || sidebarConfig.tabs?.some((tab)=>tab.badge && tab.badge.type !== 'provider');
55
+ // Add InternalBadgeProvider if we have badges to fetch
56
+ if (hasBadgesToFetch) {
57
+ if (!config.admin.components.providers) {
58
+ config.admin.components.providers = [];
59
+ }
60
+ // Add our internal provider at the beginning (so user providers can override)
61
+ config.admin.components.providers.unshift({
62
+ clientProps: {
63
+ sidebarConfig
64
+ },
65
+ path: '@veiag/payload-enhanced-sidebar/client#InternalBadgeProvider'
66
+ });
67
+ }
53
68
  // Adding translations
54
69
  if (!config.i18n) {
55
70
  config.i18n = {};
@@ -60,5 +75,6 @@ export const payloadEnhancedSidebar = (pluginOptions = {})=>(config)=>{
60
75
  config.i18n.translations = deepMerge(config.i18n.translations, sidebarTranslations);
61
76
  return config;
62
77
  };
78
+ export { BadgeProvider, useBadgeContext, useBadgeValue } from './components/EnhancedSidebar/BadgeProvider';
63
79
 
64
80
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { type Config, deepMerge } from 'payload'\n\nimport type { EnhancedSidebarConfig } from './types'\n\nimport { sidebarTranslations } from './translations'\n\n/**\n * Default configuration for the enhanced sidebar\n */\nconst defaultConfig: EnhancedSidebarConfig = {\n showLogout: true,\n tabs: [\n {\n id: 'dashboard',\n type: 'link',\n href: '/',\n icon: 'House',\n label: { en: 'Dashboard', uk: 'Головна' },\n },\n {\n id: 'default',\n type: 'tab',\n icon: 'LayoutGrid',\n label: { en: 'Collections', uk: 'Колекції' },\n },\n ],\n}\n\nexport const payloadEnhancedSidebar =\n (pluginOptions: EnhancedSidebarConfig = {}) =>\n (config: Config): Config => {\n if (pluginOptions.disabled) {\n return config\n }\n\n // Merge user config with defaults\n const sidebarConfig: EnhancedSidebarConfig = {\n ...defaultConfig,\n ...pluginOptions,\n tabs: pluginOptions.tabs ?? defaultConfig.tabs,\n }\n\n if (!config.admin) {\n config.admin = {}\n }\n\n if (!config.admin.components) {\n config.admin.components = {}\n }\n\n if (!config.admin.components.Nav) {\n config.admin.components.Nav = {\n path: '@veiag/payload-enhanced-sidebar/rsc#EnhancedSidebar',\n serverProps: {\n sidebarConfig,\n },\n }\n }\n\n // Adding translations\n if (!config.i18n) {\n config.i18n = {}\n }\n if (!config.i18n.translations) {\n config.i18n.translations = {}\n }\n\n config.i18n.translations = deepMerge(config.i18n.translations, sidebarTranslations)\n\n return config\n }\n\nexport type { EnhancedSidebarConfig } from './types'\n"],"names":["deepMerge","sidebarTranslations","defaultConfig","showLogout","tabs","id","type","href","icon","label","en","uk","payloadEnhancedSidebar","pluginOptions","config","disabled","sidebarConfig","admin","components","Nav","path","serverProps","i18n","translations"],"mappings":"AAAA,SAAsBA,SAAS,QAAQ,UAAS;AAIhD,SAASC,mBAAmB,QAAQ,iBAAgB;AAEpD;;CAEC,GACD,MAAMC,gBAAuC;IAC3CC,YAAY;IACZC,MAAM;QACJ;YACEC,IAAI;YACJC,MAAM;YACNC,MAAM;YACNC,MAAM;YACNC,OAAO;gBAAEC,IAAI;gBAAaC,IAAI;YAAU;QAC1C;QACA;YACEN,IAAI;YACJC,MAAM;YACNE,MAAM;YACNC,OAAO;gBAAEC,IAAI;gBAAeC,IAAI;YAAW;QAC7C;KACD;AACH;AAEA,OAAO,MAAMC,yBACX,CAACC,gBAAuC,CAAC,CAAC,GAC1C,CAACC;QACC,IAAID,cAAcE,QAAQ,EAAE;YAC1B,OAAOD;QACT;QAEA,kCAAkC;QAClC,MAAME,gBAAuC;YAC3C,GAAGd,aAAa;YAChB,GAAGW,aAAa;YAChBT,MAAMS,cAAcT,IAAI,IAAIF,cAAcE,IAAI;QAChD;QAEA,IAAI,CAACU,OAAOG,KAAK,EAAE;YACjBH,OAAOG,KAAK,GAAG,CAAC;QAClB;QAEA,IAAI,CAACH,OAAOG,KAAK,CAACC,UAAU,EAAE;YAC5BJ,OAAOG,KAAK,CAACC,UAAU,GAAG,CAAC;QAC7B;QAEA,IAAI,CAACJ,OAAOG,KAAK,CAACC,UAAU,CAACC,GAAG,EAAE;YAChCL,OAAOG,KAAK,CAACC,UAAU,CAACC,GAAG,GAAG;gBAC5BC,MAAM;gBACNC,aAAa;oBACXL;gBACF;YACF;QACF;QAEA,sBAAsB;QACtB,IAAI,CAACF,OAAOQ,IAAI,EAAE;YAChBR,OAAOQ,IAAI,GAAG,CAAC;QACjB;QACA,IAAI,CAACR,OAAOQ,IAAI,CAACC,YAAY,EAAE;YAC7BT,OAAOQ,IAAI,CAACC,YAAY,GAAG,CAAC;QAC9B;QAEAT,OAAOQ,IAAI,CAACC,YAAY,GAAGvB,UAAUc,OAAOQ,IAAI,CAACC,YAAY,EAAEtB;QAE/D,OAAOa;IACT,EAAC"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { type Config, deepMerge } from 'payload'\n\nimport type { EnhancedSidebarConfig } from './types'\n\nimport { sidebarTranslations } from './translations'\n\n/**\n * Default configuration for the enhanced sidebar\n */\nconst defaultConfig: EnhancedSidebarConfig = {\n showLogout: true,\n tabs: [\n {\n id: 'dashboard',\n type: 'link',\n href: '/',\n icon: 'House',\n label: { en: 'Dashboard', uk: 'Головна' },\n },\n {\n id: 'default',\n type: 'tab',\n icon: 'LayoutGrid',\n label: { en: 'Collections', uk: 'Колекції' },\n },\n ],\n}\n\nexport const payloadEnhancedSidebar =\n (pluginOptions: EnhancedSidebarConfig = {}) =>\n (config: Config): Config => {\n if (pluginOptions.disabled) {\n return config\n }\n\n // Merge user config with defaults\n const sidebarConfig: EnhancedSidebarConfig = {\n ...defaultConfig,\n ...pluginOptions,\n tabs: pluginOptions.tabs ?? defaultConfig.tabs,\n }\n\n if (!config.admin) {\n config.admin = {}\n }\n\n if (!config.admin.components) {\n config.admin.components = {}\n }\n\n if (!config.admin.components.Nav) {\n config.admin.components.Nav = {\n path: '@veiag/payload-enhanced-sidebar/rsc#EnhancedSidebar',\n serverProps: {\n sidebarConfig,\n },\n }\n }\n\n // Check if we have any badges to fetch (api or collection-count)\n const hasBadgesToFetch =\n sidebarConfig.badges ||\n sidebarConfig.tabs?.some((tab) => tab.badge && tab.badge.type !== 'provider')\n\n // Add InternalBadgeProvider if we have badges to fetch\n if (hasBadgesToFetch) {\n if (!config.admin.components.providers) {\n config.admin.components.providers = []\n }\n\n // Add our internal provider at the beginning (so user providers can override)\n config.admin.components.providers.unshift({\n clientProps: {\n sidebarConfig,\n },\n path: '@veiag/payload-enhanced-sidebar/client#InternalBadgeProvider',\n })\n }\n\n // Adding translations\n if (!config.i18n) {\n config.i18n = {}\n }\n if (!config.i18n.translations) {\n config.i18n.translations = {}\n }\n\n config.i18n.translations = deepMerge(config.i18n.translations, sidebarTranslations)\n\n return config\n }\n\nexport {\n BadgeProvider,\n useBadgeContext,\n useBadgeValue,\n} from './components/EnhancedSidebar/BadgeProvider'\n\nexport type {\n BadgeColor,\n BadgeConfig,\n BadgeConfigApi,\n BadgeConfigCollectionCount,\n BadgeConfigProvider,\n BadgeValues,\n EnhancedSidebarConfig,\n} from './types'\n"],"names":["deepMerge","sidebarTranslations","defaultConfig","showLogout","tabs","id","type","href","icon","label","en","uk","payloadEnhancedSidebar","pluginOptions","config","disabled","sidebarConfig","admin","components","Nav","path","serverProps","hasBadgesToFetch","badges","some","tab","badge","providers","unshift","clientProps","i18n","translations","BadgeProvider","useBadgeContext","useBadgeValue"],"mappings":"AAAA,SAAsBA,SAAS,QAAQ,UAAS;AAIhD,SAASC,mBAAmB,QAAQ,iBAAgB;AAEpD;;CAEC,GACD,MAAMC,gBAAuC;IAC3CC,YAAY;IACZC,MAAM;QACJ;YACEC,IAAI;YACJC,MAAM;YACNC,MAAM;YACNC,MAAM;YACNC,OAAO;gBAAEC,IAAI;gBAAaC,IAAI;YAAU;QAC1C;QACA;YACEN,IAAI;YACJC,MAAM;YACNE,MAAM;YACNC,OAAO;gBAAEC,IAAI;gBAAeC,IAAI;YAAW;QAC7C;KACD;AACH;AAEA,OAAO,MAAMC,yBACX,CAACC,gBAAuC,CAAC,CAAC,GAC1C,CAACC;QACC,IAAID,cAAcE,QAAQ,EAAE;YAC1B,OAAOD;QACT;QAEA,kCAAkC;QAClC,MAAME,gBAAuC;YAC3C,GAAGd,aAAa;YAChB,GAAGW,aAAa;YAChBT,MAAMS,cAAcT,IAAI,IAAIF,cAAcE,IAAI;QAChD;QAEA,IAAI,CAACU,OAAOG,KAAK,EAAE;YACjBH,OAAOG,KAAK,GAAG,CAAC;QAClB;QAEA,IAAI,CAACH,OAAOG,KAAK,CAACC,UAAU,EAAE;YAC5BJ,OAAOG,KAAK,CAACC,UAAU,GAAG,CAAC;QAC7B;QAEA,IAAI,CAACJ,OAAOG,KAAK,CAACC,UAAU,CAACC,GAAG,EAAE;YAChCL,OAAOG,KAAK,CAACC,UAAU,CAACC,GAAG,GAAG;gBAC5BC,MAAM;gBACNC,aAAa;oBACXL;gBACF;YACF;QACF;QAEA,iEAAiE;QACjE,MAAMM,mBACJN,cAAcO,MAAM,IACpBP,cAAcZ,IAAI,EAAEoB,KAAK,CAACC,MAAQA,IAAIC,KAAK,IAAID,IAAIC,KAAK,CAACpB,IAAI,KAAK;QAEpE,uDAAuD;QACvD,IAAIgB,kBAAkB;YACpB,IAAI,CAACR,OAAOG,KAAK,CAACC,UAAU,CAACS,SAAS,EAAE;gBACtCb,OAAOG,KAAK,CAACC,UAAU,CAACS,SAAS,GAAG,EAAE;YACxC;YAEA,8EAA8E;YAC9Eb,OAAOG,KAAK,CAACC,UAAU,CAACS,SAAS,CAACC,OAAO,CAAC;gBACxCC,aAAa;oBACXb;gBACF;gBACAI,MAAM;YACR;QACF;QAEA,sBAAsB;QACtB,IAAI,CAACN,OAAOgB,IAAI,EAAE;YAChBhB,OAAOgB,IAAI,GAAG,CAAC;QACjB;QACA,IAAI,CAAChB,OAAOgB,IAAI,CAACC,YAAY,EAAE;YAC7BjB,OAAOgB,IAAI,CAACC,YAAY,GAAG,CAAC;QAC9B;QAEAjB,OAAOgB,IAAI,CAACC,YAAY,GAAG/B,UAAUc,OAAOgB,IAAI,CAACC,YAAY,EAAE9B;QAE/D,OAAOa;IACT,EAAC;AAEH,SACEkB,aAAa,EACbC,eAAe,EACfC,aAAa,QACR,6CAA4C"}