@payloadcms/next 3.79.0-canary.2 → 3.79.0-canary.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardStepNav.d.ts","sourceRoot":"","sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/DashboardStepNav.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAa3C,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,MAAM,EACN,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,OAAO,GACR,EAAE;IACD,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,YAAY,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAA;IAC1C,OAAO,EAAE,YAAY,EAAE,CAAA;CACxB,+BAoCA;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,iBAAiB,EAAE,MAAM,CAAA;CAC1B,+BAyDA"}
1
+ {"version":3,"file":"DashboardStepNav.d.ts","sourceRoot":"","sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/DashboardStepNav.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAa3C,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,MAAM,EACN,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,OAAO,GACR,EAAE;IACD,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,YAAY,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAA;IAC1C,OAAO,EAAE,YAAY,EAAE,CAAA;CACxB,+BAoCA;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,iBAAiB,EAAE,MAAM,CAAA;CAC1B,+BAsDA"}
@@ -76,7 +76,7 @@ export function DashboardStepNav(t0) {
76
76
  return t3;
77
77
  }
78
78
  export function DashboardBreadcrumbDropdown(props) {
79
- const $ = _c(13);
79
+ const $ = _c(12);
80
80
  const {
81
81
  isEditing,
82
82
  onCancel,
@@ -93,8 +93,8 @@ export function DashboardBreadcrumbDropdown(props) {
93
93
  if ($[0] !== onCancel || $[1] !== onSaveChanges || $[2] !== t || $[3] !== widgetsDrawerSlug) {
94
94
  t0 = _jsxs("div", {
95
95
  className: "dashboard-breadcrumb-dropdown__editing",
96
- children: [_jsxs("span", {
97
- children: [t("general:editing"), " ", t("general:dashboard")]
96
+ children: [_jsx("span", {
97
+ children: t("dashboard:editingDashboard")
98
98
  }), _jsxs("div", {
99
99
  className: "dashboard-breadcrumb-dropdown__actions",
100
100
  children: [_jsx(DrawerToggler, {
@@ -104,15 +104,13 @@ export function DashboardBreadcrumbDropdown(props) {
104
104
  buttonStyle: "pill",
105
105
  el: "span",
106
106
  size: "small",
107
- children: t("fields:addLabel", {
108
- label: "+"
109
- })
107
+ children: t("dashboard:addButton")
110
108
  })
111
109
  }), _jsx(Button, {
112
110
  buttonStyle: "pill",
113
111
  onClick: onSaveChanges,
114
112
  size: "small",
115
- children: t("general:saveChanges")
113
+ children: t("fields:saveChanges")
116
114
  }), _jsx(Button, {
117
115
  buttonStyle: "pill",
118
116
  onClick: onCancel,
@@ -131,19 +129,18 @@ export function DashboardBreadcrumbDropdown(props) {
131
129
  }
132
130
  return t0;
133
131
  }
134
- const t0 = `${t("general:edit")} ${t("general:dashboard")}`;
135
- let t1;
136
- if ($[5] !== onEditClick || $[6] !== onResetLayout || $[7] !== t || $[8] !== t0) {
132
+ let t0;
133
+ if ($[5] !== onEditClick || $[6] !== onResetLayout || $[7] !== t) {
137
134
  const options = [{
138
- label: t0,
135
+ label: t("dashboard:editDashboard"),
139
136
  value: "edit"
140
137
  }, {
141
- label: `${t("general:reset")} ${t("general:layout")}`,
138
+ label: t("dashboard:resetLayout"),
142
139
  value: "reset"
143
140
  }];
144
- let t2;
145
- if ($[10] !== onEditClick || $[11] !== onResetLayout) {
146
- t2 = selectedOption => {
141
+ let t1;
142
+ if ($[9] !== onEditClick || $[10] !== onResetLayout) {
143
+ t1 = selectedOption => {
147
144
  const option = Array.isArray(selectedOption) ? selectedOption[0] : selectedOption;
148
145
  if (option?.value === "edit") {
149
146
  onEditClick();
@@ -153,14 +150,14 @@ export function DashboardBreadcrumbDropdown(props) {
153
150
  }
154
151
  }
155
152
  };
156
- $[10] = onEditClick;
157
- $[11] = onResetLayout;
158
- $[12] = t2;
153
+ $[9] = onEditClick;
154
+ $[10] = onResetLayout;
155
+ $[11] = t1;
159
156
  } else {
160
- t2 = $[12];
157
+ t1 = $[11];
161
158
  }
162
- const handleChange = t2;
163
- t1 = _jsx(ReactSelect, {
159
+ const handleChange = t1;
160
+ t0 = _jsx(ReactSelect, {
164
161
  className: "dashboard-breadcrumb-select",
165
162
  isClearable: false,
166
163
  isSearchable: false,
@@ -177,10 +174,9 @@ export function DashboardBreadcrumbDropdown(props) {
177
174
  $[6] = onResetLayout;
178
175
  $[7] = t;
179
176
  $[8] = t0;
180
- $[9] = t1;
181
177
  } else {
182
- t1 = $[9];
178
+ t0 = $[8];
183
179
  }
184
- return t1;
180
+ return t0;
185
181
  }
186
182
  //# sourceMappingURL=DashboardStepNav.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardStepNav.js","names":["c","_c","Button","DrawerToggler","ItemsDrawer","ReactSelect","useStepNav","useTranslation","useEffect","useId","DashboardStepNav","t0","$","addWidget","cancel","isEditing","resetLayout","saveLayout","setIsEditing","widgets","t","setStepNav","uuid","drawerSlug","t1","t2","label","_jsx","DashboardBreadcrumbDropdown","onCancel","onEditClick","onResetLayout","onSaveChanges","widgetsDrawerSlug","t3","_Fragment","children","items","onItemClick","widget","slug","searchPlaceholder","title","props","_jsxs","className","buttonStyle","el","size","onClick","options","value","selectedOption","option","Array","isArray","handleChange","isClearable","isSearchable","menuIsOpen","undefined","onChange","placeholder"],"sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/DashboardStepNav.tsx"],"sourcesContent":["'use client'\nimport type { ClientWidget } from 'payload'\n\nimport {\n Button,\n DrawerToggler,\n ItemsDrawer,\n type ReactSelectOption as Option,\n ReactSelect,\n useStepNav,\n useTranslation,\n} from '@payloadcms/ui'\nimport { useEffect, useId } from 'react'\n\nexport function DashboardStepNav({\n addWidget,\n cancel,\n isEditing,\n resetLayout,\n saveLayout,\n setIsEditing,\n widgets,\n}: {\n addWidget: (slug: string) => void\n cancel: () => void\n isEditing: boolean\n resetLayout: () => Promise<void>\n saveLayout: () => Promise<void>\n setIsEditing: (isEditing: boolean) => void\n widgets: ClientWidget[]\n}) {\n const { t } = useTranslation()\n const { setStepNav } = useStepNav()\n const uuid = useId()\n const drawerSlug = `widgets-drawer-${uuid}`\n\n useEffect(() => {\n setStepNav([\n {\n label: (\n <DashboardBreadcrumbDropdown\n isEditing={isEditing}\n onCancel={cancel}\n onEditClick={() => setIsEditing(true)}\n onResetLayout={resetLayout}\n onSaveChanges={saveLayout}\n widgetsDrawerSlug={drawerSlug}\n />\n ),\n },\n ])\n }, [isEditing, drawerSlug, cancel, resetLayout, saveLayout, setIsEditing, setStepNav])\n\n return (\n <>\n {isEditing && (\n <ItemsDrawer\n drawerSlug={drawerSlug}\n items={widgets}\n onItemClick={(widget) => addWidget(widget.slug)}\n searchPlaceholder={t('dashboard:searchWidgets')}\n title={t('dashboard:addWidget')}\n />\n )}\n </>\n )\n}\n\nexport function DashboardBreadcrumbDropdown(props: {\n isEditing: boolean\n onCancel: () => void\n onEditClick: () => void\n onResetLayout: () => void\n onSaveChanges: () => void\n widgetsDrawerSlug: string\n}) {\n const { isEditing, onCancel, onEditClick, onResetLayout, onSaveChanges, widgetsDrawerSlug } =\n props\n const { t } = useTranslation()\n if (isEditing) {\n return (\n <div className=\"dashboard-breadcrumb-dropdown__editing\">\n <span>\n {t('general:editing')} {t('general:dashboard')}\n </span>\n <div className=\"dashboard-breadcrumb-dropdown__actions\">\n <DrawerToggler className=\"drawer-toggler--unstyled\" slug={widgetsDrawerSlug}>\n <Button buttonStyle=\"pill\" el=\"span\" size=\"small\">\n {t('fields:addLabel', {\n label: '+',\n })}\n </Button>\n </DrawerToggler>\n <Button buttonStyle=\"pill\" onClick={onSaveChanges} size=\"small\">\n {t('general:saveChanges')}\n </Button>\n <Button buttonStyle=\"pill\" onClick={onCancel} size=\"small\">\n {t('general:cancel')}\n </Button>\n </div>\n </div>\n )\n }\n\n const options = [\n { label: `${t('general:edit')} ${t('general:dashboard')}`, value: 'edit' },\n { label: `${t('general:reset')} ${t('general:layout')}`, value: 'reset' },\n ]\n\n const handleChange = (selectedOption: Option | Option[]) => {\n // Since isMulti is false, we expect a single Option\n const option = Array.isArray(selectedOption) ? selectedOption[0] : selectedOption\n\n if (option?.value === 'edit') {\n onEditClick()\n } else if (option?.value === 'reset') {\n onResetLayout()\n }\n }\n\n return (\n <ReactSelect\n className=\"dashboard-breadcrumb-select\"\n isClearable={false}\n isSearchable={false}\n menuIsOpen={undefined} // Let ReactSelect handle open/close\n onChange={handleChange}\n options={options}\n placeholder={t('general:dashboard')}\n value={{ label: t('general:dashboard'), value: 'dashboard' }}\n />\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DashboardStepNav.js","names":["c","_c","Button","DrawerToggler","ItemsDrawer","ReactSelect","useStepNav","useTranslation","useEffect","useId","DashboardStepNav","t0","$","addWidget","cancel","isEditing","resetLayout","saveLayout","setIsEditing","widgets","t","setStepNav","uuid","drawerSlug","t1","t2","label","_jsx","DashboardBreadcrumbDropdown","onCancel","onEditClick","onResetLayout","onSaveChanges","widgetsDrawerSlug","t3","_Fragment","children","items","onItemClick","widget","slug","searchPlaceholder","title","props","_jsxs","className","buttonStyle","el","size","onClick","options","value","selectedOption","option","Array","isArray","handleChange","isClearable","isSearchable","menuIsOpen","undefined","onChange","placeholder"],"sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/DashboardStepNav.tsx"],"sourcesContent":["'use client'\nimport type { ClientWidget } from 'payload'\n\nimport {\n Button,\n DrawerToggler,\n ItemsDrawer,\n type ReactSelectOption as Option,\n ReactSelect,\n useStepNav,\n useTranslation,\n} from '@payloadcms/ui'\nimport { useEffect, useId } from 'react'\n\nexport function DashboardStepNav({\n addWidget,\n cancel,\n isEditing,\n resetLayout,\n saveLayout,\n setIsEditing,\n widgets,\n}: {\n addWidget: (slug: string) => void\n cancel: () => void\n isEditing: boolean\n resetLayout: () => Promise<void>\n saveLayout: () => Promise<void>\n setIsEditing: (isEditing: boolean) => void\n widgets: ClientWidget[]\n}) {\n const { t } = useTranslation()\n const { setStepNav } = useStepNav()\n const uuid = useId()\n const drawerSlug = `widgets-drawer-${uuid}`\n\n useEffect(() => {\n setStepNav([\n {\n label: (\n <DashboardBreadcrumbDropdown\n isEditing={isEditing}\n onCancel={cancel}\n onEditClick={() => setIsEditing(true)}\n onResetLayout={resetLayout}\n onSaveChanges={saveLayout}\n widgetsDrawerSlug={drawerSlug}\n />\n ),\n },\n ])\n }, [isEditing, drawerSlug, cancel, resetLayout, saveLayout, setIsEditing, setStepNav])\n\n return (\n <>\n {isEditing && (\n <ItemsDrawer\n drawerSlug={drawerSlug}\n items={widgets}\n onItemClick={(widget) => addWidget(widget.slug)}\n searchPlaceholder={t('dashboard:searchWidgets')}\n title={t('dashboard:addWidget')}\n />\n )}\n </>\n )\n}\n\nexport function DashboardBreadcrumbDropdown(props: {\n isEditing: boolean\n onCancel: () => void\n onEditClick: () => void\n onResetLayout: () => void\n onSaveChanges: () => void\n widgetsDrawerSlug: string\n}) {\n const { isEditing, onCancel, onEditClick, onResetLayout, onSaveChanges, widgetsDrawerSlug } =\n props\n const { t } = useTranslation()\n\n if (isEditing) {\n return (\n <div className=\"dashboard-breadcrumb-dropdown__editing\">\n <span>{t('dashboard:editingDashboard')}</span>\n <div className=\"dashboard-breadcrumb-dropdown__actions\">\n <DrawerToggler className=\"drawer-toggler--unstyled\" slug={widgetsDrawerSlug}>\n <Button buttonStyle=\"pill\" el=\"span\" size=\"small\">\n {t('dashboard:addButton')}\n </Button>\n </DrawerToggler>\n <Button buttonStyle=\"pill\" onClick={onSaveChanges} size=\"small\">\n {t('fields:saveChanges')}\n </Button>\n <Button buttonStyle=\"pill\" onClick={onCancel} size=\"small\">\n {t('general:cancel')}\n </Button>\n </div>\n </div>\n )\n }\n\n const options = [\n { label: t('dashboard:editDashboard'), value: 'edit' },\n { label: t('dashboard:resetLayout'), value: 'reset' },\n ]\n\n const handleChange = (selectedOption: Option | Option[]) => {\n // Since isMulti is false, we expect a single Option\n const option = Array.isArray(selectedOption) ? selectedOption[0] : selectedOption\n\n if (option?.value === 'edit') {\n onEditClick()\n } else if (option?.value === 'reset') {\n onResetLayout()\n }\n }\n\n return (\n <ReactSelect\n className=\"dashboard-breadcrumb-select\"\n isClearable={false}\n isSearchable={false}\n menuIsOpen={undefined} // Let ReactSelect handle open/close\n onChange={handleChange}\n options={options}\n placeholder={t('general:dashboard')}\n value={{ label: t('general:dashboard'), value: 'dashboard' }}\n />\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/index.client.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAKxD,OAAO,KAA4B,MAAM,OAAO,CAAA;AAwBhD,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,WAAW,CAAA;IACrB,QAAQ,EAAE,WAAW,CAAA;IACrB,KAAK,EAAE,WAAW,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,IAAI,EAAE,UAAU,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC5B,MAAM,EAAE,oBAAoB,CAAA;CAC7B,GAAG,IAAI,CAAA;AAYR,wBAAgB,sBAAsB,CAAC,EACrC,YAAY,EAAE,aAAa,EAC3B,OAAO,GACR,EAAE;IACD,YAAY,EAAE,oBAAoB,EAAE,CAAA;IACpC,OAAO,EAAE,YAAY,EAAE,CAAA;CACxB,qBAiLA"}
1
+ {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/index.client.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAKxD,OAAO,KAA4B,MAAM,OAAO,CAAA;AAwBhD,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,WAAW,CAAA;IACrB,QAAQ,EAAE,WAAW,CAAA;IACrB,KAAK,EAAE,WAAW,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,IAAI,EAAE,UAAU,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC5B,MAAM,EAAE,oBAAoB,CAAA;CAC7B,GAAG,IAAI,CAAA;AAYR,wBAAgB,sBAAsB,CAAC,EACrC,YAAY,EAAE,aAAa,EAC3B,OAAO,GACR,EAAE;IACD,YAAY,EAAE,oBAAoB,EAAE,CAAA;IACpC,OAAO,EAAE,YAAY,EAAE,CAAA;CACxB,qBA8KA"}
@@ -138,7 +138,7 @@ export function ModularDashboardClient(t0) {
138
138
  children: [currentLayout?.length === 0 && _jsx("div", {
139
139
  className: "modular-dashboard__empty",
140
140
  children: _jsx("p", {
141
- children: "There are no widgets on your dashboard. You can add them from the \"Dashboard\" menu located in the top bar."
141
+ children: t("dashboard:noItems")
142
142
  })
143
143
  }), currentLayout?.map((widget_1, _index) => _jsx(React.Fragment, {
144
144
  children: _jsx(DraggableItem, {
@@ -1 +1 @@
1
- {"version":3,"file":"index.client.js","names":["c","_c","DndContext","DragOverlay","useDraggable","useDroppable","snapCenterToCursor","ChevronIcon","Popup","PopupList","useTranslation","XIcon","React","useMemo","useState","snapCenterToCursorOnlyForPointer","args","activatorEvent","transform","DashboardStepNav","useDashboardLayout","closestInXAxis","useDashboardSensors","WidgetEditControl","WIDTH_TO_PERCENTAGE","small","medium","large","full","ModularDashboardClient","t0","$","clientLayout","initialLayout","widgets","t","addWidget","cancel","cancelModal","currentLayout","deleteWidget","isEditing","moveWidget","resetLayout","resizeWidget","saveLayout","setIsEditing","updateWidgetData","activeDragId","setActiveDragId","sensors","t1","t2","Symbol","for","t3","event","over","droppableId","id","i","lastIndexOf","slug","slice","position","active","moveFromIndex","findIndex","widget","item","moveToIndex","widget_0","t4","event_0","_jsxs","children","_jsx","autoScroll","enabled","threshold","x","y","collisionDetection","onDragCancel","onDragEnd","onDragStart","className","style","display","flexWrap","length","map","widget_1","_index","Fragment","DraggableItem","disabled","width","padding","inert","component","onPointerDown","_temp","onSave","data","widgetData","widgetID","WidgetWidthDropdown","currentWidth","maxWidth","minWidth","onResize","onClick","type","dropAnimation","duration","modifiers","draggedWidget","find","widget_2","e","stopPropagation","validOptions","minPercentage","maxPercentage","Object","entries","key","value","percentage","filter","option","isDisabled","button","buttonType","render","close","ButtonGroup","isSelected","Button","toFixed","size","verticalAlign","props","attributes","isDragging","listeners","setNodeRef","mergedStyles","opacity","draggableProps","DroppableItem","ref","height","isOver","t5","t6","t7","t8","left","right","top","bottom","borderRadius","backgroundColor","marginBottom","marginTop","pointerEvents","zIndex"],"sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { Modifier } from '@dnd-kit/core'\nimport type { ClientWidget, WidgetWidth } from 'payload'\n\nimport { DndContext, DragOverlay, useDraggable, useDroppable } from '@dnd-kit/core'\nimport { snapCenterToCursor } from '@dnd-kit/modifiers'\nimport { ChevronIcon, Popup, PopupList, useTranslation, XIcon } from '@payloadcms/ui'\nimport React, { useMemo, useState } from 'react'\n\n/**\n * Custom modifier that only applies snapCenterToCursor for pointer events.\n * During keyboard navigation, we handle positioning ourselves via the coordinate getter.\n */\nconst snapCenterToCursorOnlyForPointer: Modifier = (args) => {\n const { activatorEvent } = args\n\n // Only apply snap for pointer events (mouse/touch), not keyboard\n // Check activatorEvent.type since KeyboardEvent may not exist on server\n if (activatorEvent && 'key' in activatorEvent) {\n return args.transform\n }\n\n return snapCenterToCursor(args)\n}\n\nimport { DashboardStepNav } from './DashboardStepNav.js'\nimport { useDashboardLayout } from './useDashboardLayout.js'\nimport { closestInXAxis } from './utils/collisionDetection.js'\nimport { useDashboardSensors } from './utils/sensors.js'\nimport { WidgetEditControl } from './WidgetEditControl.js'\n\nexport type WidgetItem = {\n data?: Record<string, unknown>\n id: string\n maxWidth: WidgetWidth\n minWidth: WidgetWidth\n width: WidgetWidth\n}\n\nexport type WidgetInstanceClient = {\n component: React.ReactNode\n item: WidgetItem\n}\n\nexport type DropTargetWidget = {\n position: 'after' | 'before'\n widget: WidgetInstanceClient\n} | null\n\n/* eslint-disable perfectionist/sort-objects */\nconst WIDTH_TO_PERCENTAGE = {\n 'x-small': 25,\n small: (1 / 3) * 100,\n medium: 50,\n large: (2 / 3) * 100,\n 'x-large': 75,\n full: 100,\n} as const\n\nexport function ModularDashboardClient({\n clientLayout: initialLayout,\n widgets,\n}: {\n clientLayout: WidgetInstanceClient[]\n widgets: ClientWidget[]\n}) {\n const { t } = useTranslation()\n const {\n addWidget,\n cancel,\n cancelModal,\n currentLayout,\n deleteWidget,\n isEditing,\n moveWidget,\n resetLayout,\n resizeWidget,\n saveLayout,\n setIsEditing,\n updateWidgetData,\n } = useDashboardLayout(initialLayout)\n\n const [activeDragId, setActiveDragId] = useState<null | string>(null)\n const sensors = useDashboardSensors()\n\n return (\n <div>\n <DndContext\n autoScroll={{\n enabled: true,\n threshold: {\n x: 0, // No horizontal scroll\n y: 0.2, // Allow vertical scroll at 20% from edge\n },\n }}\n collisionDetection={closestInXAxis}\n // https://github.com/clauderic/dnd-kit/issues/926#issuecomment-1640115665\n id=\"dashboard-dnd-context\"\n onDragCancel={() => {\n setActiveDragId(null)\n }}\n onDragEnd={(event) => {\n if (!event.over) {\n setActiveDragId(null)\n return\n }\n const droppableId = event.over.id as string\n const i = droppableId.lastIndexOf('-')\n const slug = droppableId.slice(0, i)\n const position = droppableId.slice(i + 1)\n\n if (slug === event.active.id) {\n return\n }\n\n const moveFromIndex = currentLayout?.findIndex(\n (widget) => widget.item.id === event.active.id,\n )\n let moveToIndex = currentLayout?.findIndex((widget) => widget.item.id === slug)\n if (moveFromIndex < moveToIndex) {\n moveToIndex--\n }\n if (position === 'after') {\n moveToIndex++\n }\n moveWidget({ moveFromIndex, moveToIndex })\n setActiveDragId(null)\n }}\n onDragStart={(event) => {\n setActiveDragId(event.active.id as string)\n }}\n sensors={sensors}\n >\n <div\n className={`modular-dashboard ${isEditing ? 'editing' : ''}`}\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n // Don't add gap here! We need to use padding on the widgets instead\n // to make sure all rows have the same width always.\n }}\n >\n {currentLayout?.length === 0 && (\n <div className=\"modular-dashboard__empty\">\n <p>\n There are no widgets on your dashboard. You can add them from the \"Dashboard\" menu\n located in the top bar.\n </p>\n </div>\n )}\n {currentLayout?.map((widget, _index) => (\n <React.Fragment key={widget.item.id}>\n <DraggableItem\n disabled={!isEditing}\n id={widget.item.id}\n style={{\n width: `${WIDTH_TO_PERCENTAGE[widget.item.width]}%`,\n padding: '6px',\n }}\n width={widget.item.width}\n >\n <div className={`widget-wrapper ${isEditing ? 'widget-wrapper--editing' : ''}`}>\n <div aria-hidden={isEditing} className=\"widget-content\" inert={isEditing}>\n {widget.component}\n </div>\n {isEditing && (\n <div\n className=\"widget-wrapper__controls\"\n onPointerDown={(e) => e.stopPropagation()}\n >\n <WidgetEditControl\n onSave={(data) => {\n updateWidgetData(widget.item.id, data)\n }}\n widgetData={widget.item.data}\n widgetID={widget.item.id}\n />\n <WidgetWidthDropdown\n currentWidth={widget.item.width}\n maxWidth={widget.item.maxWidth}\n minWidth={widget.item.minWidth}\n onResize={(width) => resizeWidget(widget.item.id, width)}\n />\n <button\n className=\"widget-wrapper__delete-btn\"\n onClick={() => deleteWidget(widget.item.id)}\n type=\"button\"\n >\n <span className=\"sr-only\">\n {t('dashboard:deleteWidget', { id: widget.item.id })}\n </span>\n <XIcon />\n </button>\n </div>\n )}\n </div>\n </DraggableItem>\n </React.Fragment>\n ))}\n <DragOverlay\n className=\"drag-overlay\"\n dropAnimation={{\n duration: 100,\n }}\n // Uses custom modifier that only applies for pointer, not keyboard navigation.\n modifiers={[snapCenterToCursorOnlyForPointer]}\n >\n {activeDragId\n ? (() => {\n const draggedWidget = currentLayout?.find(\n (widget) => widget.item.id === activeDragId,\n )\n return draggedWidget ? (\n <div\n style={{\n transform: 'scale(0.25)',\n }}\n >\n <div\n className={`widget-wrapper ${isEditing ? 'widget-wrapper--editing' : ''}`}\n >\n <div className=\"widget-content\">{draggedWidget.component}</div>\n </div>\n </div>\n ) : null\n })()\n : null}\n </DragOverlay>\n </div>\n </DndContext>\n <DashboardStepNav\n addWidget={addWidget}\n cancel={cancel}\n isEditing={isEditing}\n resetLayout={resetLayout}\n saveLayout={saveLayout}\n setIsEditing={setIsEditing}\n widgets={widgets}\n />\n {cancelModal}\n </div>\n )\n}\n\nfunction WidgetWidthDropdown({\n currentWidth,\n maxWidth,\n minWidth,\n onResize,\n}: {\n currentWidth: WidgetWidth\n maxWidth: WidgetWidth\n minWidth: WidgetWidth\n onResize: (width: WidgetWidth) => void\n}) {\n // Filter options based on minWidth and maxWidth\n const validOptions = useMemo(() => {\n const minPercentage = WIDTH_TO_PERCENTAGE[minWidth]\n const maxPercentage = WIDTH_TO_PERCENTAGE[maxWidth]\n\n return Object.entries(WIDTH_TO_PERCENTAGE)\n .map(([key, value]) => ({\n width: key as WidgetWidth,\n percentage: value,\n }))\n .filter((option) => option.percentage >= minPercentage && option.percentage <= maxPercentage)\n }, [minWidth, maxWidth])\n\n const isDisabled = validOptions.length <= 1\n\n if (isDisabled) {\n return null\n }\n\n return (\n <Popup\n button={\n <button\n className=\"widget-wrapper__size-btn\"\n onPointerDown={(e) => e.stopPropagation()}\n type=\"button\"\n >\n <span className=\"widget-wrapper__size-btn-text\">{currentWidth}</span>\n <ChevronIcon className=\"widget-wrapper__size-btn-icon\" />\n </button>\n }\n buttonType=\"custom\"\n render={({ close }) => (\n <PopupList.ButtonGroup>\n {validOptions.map((option) => {\n const isSelected = option.width === currentWidth\n return (\n <PopupList.Button\n active={isSelected}\n key={option.width}\n onClick={() => {\n onResize(option.width)\n close()\n }}\n >\n <span className=\"widget-wrapper__size-btn-label\">{option.width}</span>\n <span className=\"widget-wrapper__size-btn-percentage\">\n {option.percentage.toFixed(0)}%\n </span>\n </PopupList.Button>\n )\n })}\n </PopupList.ButtonGroup>\n )}\n size=\"small\"\n verticalAlign=\"bottom\"\n />\n )\n}\n\nfunction DraggableItem(props: {\n children: React.ReactNode\n disabled?: boolean\n id: string\n style?: React.CSSProperties\n width: WidgetWidth\n}) {\n const { attributes, isDragging, listeners, setNodeRef } = useDraggable({\n id: props.id,\n disabled: props.disabled,\n })\n\n const mergedStyles: React.CSSProperties = {\n ...props.style,\n opacity: isDragging ? 0.3 : 1,\n position: 'relative',\n }\n\n // Only apply draggable attributes and listeners when not disabled\n // to prevent disabling interactive elements inside the widget\n const draggableProps = props.disabled ? {} : { ...listeners, ...attributes }\n\n return (\n <div className=\"widget\" data-slug={props.id} data-width={props.width} style={mergedStyles}>\n <DroppableItem id={props.id} position=\"before\" />\n <div\n className=\"draggable\"\n id={props.id}\n ref={setNodeRef}\n {...draggableProps}\n style={{\n width: '100%',\n height: '100%',\n }}\n >\n {props.children}\n </div>\n <DroppableItem id={props.id} position=\"after\" />\n </div>\n )\n}\n\nfunction DroppableItem({ id, position }: { id: string; position: 'after' | 'before' }) {\n const { setNodeRef, isOver } = useDroppable({ id: `${id}-${position}`, data: { position } })\n\n return (\n <div\n className=\"droppable-widget\"\n data-testid={`${id}-${position}`}\n ref={setNodeRef}\n style={{\n position: 'absolute',\n left: position === 'before' ? -2 : 'auto',\n right: position === 'after' ? -2 : 'auto',\n top: 0,\n bottom: 0,\n borderRadius: '1000px',\n width: '4px',\n backgroundColor: isOver ? 'var(--theme-success-400)' : 'transparent',\n marginBottom: '10px',\n marginTop: '10px',\n pointerEvents: 'none',\n zIndex: 1000,\n }}\n />\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.client.js","names":["c","_c","DndContext","DragOverlay","useDraggable","useDroppable","snapCenterToCursor","ChevronIcon","Popup","PopupList","useTranslation","XIcon","React","useMemo","useState","snapCenterToCursorOnlyForPointer","args","activatorEvent","transform","DashboardStepNav","useDashboardLayout","closestInXAxis","useDashboardSensors","WidgetEditControl","WIDTH_TO_PERCENTAGE","small","medium","large","full","ModularDashboardClient","t0","$","clientLayout","initialLayout","widgets","t","addWidget","cancel","cancelModal","currentLayout","deleteWidget","isEditing","moveWidget","resetLayout","resizeWidget","saveLayout","setIsEditing","updateWidgetData","activeDragId","setActiveDragId","sensors","t1","t2","Symbol","for","t3","event","over","droppableId","id","i","lastIndexOf","slug","slice","position","active","moveFromIndex","findIndex","widget","item","moveToIndex","widget_0","t4","event_0","_jsxs","children","_jsx","autoScroll","enabled","threshold","x","y","collisionDetection","onDragCancel","onDragEnd","onDragStart","className","style","display","flexWrap","length","map","widget_1","_index","Fragment","DraggableItem","disabled","width","padding","inert","component","onPointerDown","_temp","onSave","data","widgetData","widgetID","WidgetWidthDropdown","currentWidth","maxWidth","minWidth","onResize","onClick","type","dropAnimation","duration","modifiers","draggedWidget","find","widget_2","e","stopPropagation","validOptions","minPercentage","maxPercentage","Object","entries","key","value","percentage","filter","option","isDisabled","button","buttonType","render","close","ButtonGroup","isSelected","Button","toFixed","size","verticalAlign","props","attributes","isDragging","listeners","setNodeRef","mergedStyles","opacity","draggableProps","DroppableItem","ref","height","isOver","t5","t6","t7","t8","left","right","top","bottom","borderRadius","backgroundColor","marginBottom","marginTop","pointerEvents","zIndex"],"sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { Modifier } from '@dnd-kit/core'\nimport type { ClientWidget, WidgetWidth } from 'payload'\n\nimport { DndContext, DragOverlay, useDraggable, useDroppable } from '@dnd-kit/core'\nimport { snapCenterToCursor } from '@dnd-kit/modifiers'\nimport { ChevronIcon, Popup, PopupList, useTranslation, XIcon } from '@payloadcms/ui'\nimport React, { useMemo, useState } from 'react'\n\n/**\n * Custom modifier that only applies snapCenterToCursor for pointer events.\n * During keyboard navigation, we handle positioning ourselves via the coordinate getter.\n */\nconst snapCenterToCursorOnlyForPointer: Modifier = (args) => {\n const { activatorEvent } = args\n\n // Only apply snap for pointer events (mouse/touch), not keyboard\n // Check activatorEvent.type since KeyboardEvent may not exist on server\n if (activatorEvent && 'key' in activatorEvent) {\n return args.transform\n }\n\n return snapCenterToCursor(args)\n}\n\nimport { DashboardStepNav } from './DashboardStepNav.js'\nimport { useDashboardLayout } from './useDashboardLayout.js'\nimport { closestInXAxis } from './utils/collisionDetection.js'\nimport { useDashboardSensors } from './utils/sensors.js'\nimport { WidgetEditControl } from './WidgetEditControl.js'\n\nexport type WidgetItem = {\n data?: Record<string, unknown>\n id: string\n maxWidth: WidgetWidth\n minWidth: WidgetWidth\n width: WidgetWidth\n}\n\nexport type WidgetInstanceClient = {\n component: React.ReactNode\n item: WidgetItem\n}\n\nexport type DropTargetWidget = {\n position: 'after' | 'before'\n widget: WidgetInstanceClient\n} | null\n\n/* eslint-disable perfectionist/sort-objects */\nconst WIDTH_TO_PERCENTAGE = {\n 'x-small': 25,\n small: (1 / 3) * 100,\n medium: 50,\n large: (2 / 3) * 100,\n 'x-large': 75,\n full: 100,\n} as const\n\nexport function ModularDashboardClient({\n clientLayout: initialLayout,\n widgets,\n}: {\n clientLayout: WidgetInstanceClient[]\n widgets: ClientWidget[]\n}) {\n const { t } = useTranslation()\n const {\n addWidget,\n cancel,\n cancelModal,\n currentLayout,\n deleteWidget,\n isEditing,\n moveWidget,\n resetLayout,\n resizeWidget,\n saveLayout,\n setIsEditing,\n updateWidgetData,\n } = useDashboardLayout(initialLayout)\n\n const [activeDragId, setActiveDragId] = useState<null | string>(null)\n const sensors = useDashboardSensors()\n\n return (\n <div>\n <DndContext\n autoScroll={{\n enabled: true,\n threshold: {\n x: 0, // No horizontal scroll\n y: 0.2, // Allow vertical scroll at 20% from edge\n },\n }}\n collisionDetection={closestInXAxis}\n // https://github.com/clauderic/dnd-kit/issues/926#issuecomment-1640115665\n id=\"dashboard-dnd-context\"\n onDragCancel={() => {\n setActiveDragId(null)\n }}\n onDragEnd={(event) => {\n if (!event.over) {\n setActiveDragId(null)\n return\n }\n const droppableId = event.over.id as string\n const i = droppableId.lastIndexOf('-')\n const slug = droppableId.slice(0, i)\n const position = droppableId.slice(i + 1)\n\n if (slug === event.active.id) {\n return\n }\n\n const moveFromIndex = currentLayout?.findIndex(\n (widget) => widget.item.id === event.active.id,\n )\n let moveToIndex = currentLayout?.findIndex((widget) => widget.item.id === slug)\n if (moveFromIndex < moveToIndex) {\n moveToIndex--\n }\n if (position === 'after') {\n moveToIndex++\n }\n moveWidget({ moveFromIndex, moveToIndex })\n setActiveDragId(null)\n }}\n onDragStart={(event) => {\n setActiveDragId(event.active.id as string)\n }}\n sensors={sensors}\n >\n <div\n className={`modular-dashboard ${isEditing ? 'editing' : ''}`}\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n // Don't add gap here! We need to use padding on the widgets instead\n // to make sure all rows have the same width always.\n }}\n >\n {currentLayout?.length === 0 && (\n <div className=\"modular-dashboard__empty\">\n <p>{t('dashboard:noItems')}</p>\n </div>\n )}\n {currentLayout?.map((widget, _index) => (\n <React.Fragment key={widget.item.id}>\n <DraggableItem\n disabled={!isEditing}\n id={widget.item.id}\n style={{\n width: `${WIDTH_TO_PERCENTAGE[widget.item.width]}%`,\n padding: '6px',\n }}\n width={widget.item.width}\n >\n <div className={`widget-wrapper ${isEditing ? 'widget-wrapper--editing' : ''}`}>\n <div aria-hidden={isEditing} className=\"widget-content\" inert={isEditing}>\n {widget.component}\n </div>\n {isEditing && (\n <div\n className=\"widget-wrapper__controls\"\n onPointerDown={(e) => e.stopPropagation()}\n >\n <WidgetEditControl\n onSave={(data) => {\n updateWidgetData(widget.item.id, data)\n }}\n widgetData={widget.item.data}\n widgetID={widget.item.id}\n />\n <WidgetWidthDropdown\n currentWidth={widget.item.width}\n maxWidth={widget.item.maxWidth}\n minWidth={widget.item.minWidth}\n onResize={(width) => resizeWidget(widget.item.id, width)}\n />\n <button\n className=\"widget-wrapper__delete-btn\"\n onClick={() => deleteWidget(widget.item.id)}\n type=\"button\"\n >\n <span className=\"sr-only\">\n {t('dashboard:deleteWidget', { id: widget.item.id })}\n </span>\n <XIcon />\n </button>\n </div>\n )}\n </div>\n </DraggableItem>\n </React.Fragment>\n ))}\n <DragOverlay\n className=\"drag-overlay\"\n dropAnimation={{\n duration: 100,\n }}\n // Uses custom modifier that only applies for pointer, not keyboard navigation.\n modifiers={[snapCenterToCursorOnlyForPointer]}\n >\n {activeDragId\n ? (() => {\n const draggedWidget = currentLayout?.find(\n (widget) => widget.item.id === activeDragId,\n )\n return draggedWidget ? (\n <div\n style={{\n transform: 'scale(0.25)',\n }}\n >\n <div\n className={`widget-wrapper ${isEditing ? 'widget-wrapper--editing' : ''}`}\n >\n <div className=\"widget-content\">{draggedWidget.component}</div>\n </div>\n </div>\n ) : null\n })()\n : null}\n </DragOverlay>\n </div>\n </DndContext>\n <DashboardStepNav\n addWidget={addWidget}\n cancel={cancel}\n isEditing={isEditing}\n resetLayout={resetLayout}\n saveLayout={saveLayout}\n setIsEditing={setIsEditing}\n widgets={widgets}\n />\n {cancelModal}\n </div>\n )\n}\n\nfunction WidgetWidthDropdown({\n currentWidth,\n maxWidth,\n minWidth,\n onResize,\n}: {\n currentWidth: WidgetWidth\n maxWidth: WidgetWidth\n minWidth: WidgetWidth\n onResize: (width: WidgetWidth) => void\n}) {\n // Filter options based on minWidth and maxWidth\n const validOptions = useMemo(() => {\n const minPercentage = WIDTH_TO_PERCENTAGE[minWidth]\n const maxPercentage = WIDTH_TO_PERCENTAGE[maxWidth]\n\n return Object.entries(WIDTH_TO_PERCENTAGE)\n .map(([key, value]) => ({\n width: key as WidgetWidth,\n percentage: value,\n }))\n .filter((option) => option.percentage >= minPercentage && option.percentage <= maxPercentage)\n }, [minWidth, maxWidth])\n\n const isDisabled = validOptions.length <= 1\n\n if (isDisabled) {\n return null\n }\n\n return (\n <Popup\n button={\n <button\n className=\"widget-wrapper__size-btn\"\n onPointerDown={(e) => e.stopPropagation()}\n type=\"button\"\n >\n <span className=\"widget-wrapper__size-btn-text\">{currentWidth}</span>\n <ChevronIcon className=\"widget-wrapper__size-btn-icon\" />\n </button>\n }\n buttonType=\"custom\"\n render={({ close }) => (\n <PopupList.ButtonGroup>\n {validOptions.map((option) => {\n const isSelected = option.width === currentWidth\n return (\n <PopupList.Button\n active={isSelected}\n key={option.width}\n onClick={() => {\n onResize(option.width)\n close()\n }}\n >\n <span className=\"widget-wrapper__size-btn-label\">{option.width}</span>\n <span className=\"widget-wrapper__size-btn-percentage\">\n {option.percentage.toFixed(0)}%\n </span>\n </PopupList.Button>\n )\n })}\n </PopupList.ButtonGroup>\n )}\n size=\"small\"\n verticalAlign=\"bottom\"\n />\n )\n}\n\nfunction DraggableItem(props: {\n children: React.ReactNode\n disabled?: boolean\n id: string\n style?: React.CSSProperties\n width: WidgetWidth\n}) {\n const { attributes, isDragging, listeners, setNodeRef } = useDraggable({\n id: props.id,\n disabled: props.disabled,\n })\n\n const mergedStyles: React.CSSProperties = {\n ...props.style,\n opacity: isDragging ? 0.3 : 1,\n position: 'relative',\n }\n\n // Only apply draggable attributes and listeners when not disabled\n // to prevent disabling interactive elements inside the widget\n const draggableProps = props.disabled ? {} : { ...listeners, ...attributes }\n\n return (\n <div className=\"widget\" data-slug={props.id} data-width={props.width} style={mergedStyles}>\n <DroppableItem id={props.id} position=\"before\" />\n <div\n className=\"draggable\"\n id={props.id}\n ref={setNodeRef}\n {...draggableProps}\n style={{\n width: '100%',\n height: '100%',\n }}\n >\n {props.children}\n </div>\n <DroppableItem id={props.id} position=\"after\" />\n </div>\n )\n}\n\nfunction DroppableItem({ id, position }: { id: string; position: 'after' | 'before' }) {\n const { setNodeRef, isOver } = useDroppable({ id: `${id}-${position}`, data: { position } })\n\n return (\n <div\n className=\"droppable-widget\"\n data-testid={`${id}-${position}`}\n ref={setNodeRef}\n style={{\n position: 'absolute',\n left: position === 'before' ? -2 : 'auto',\n right: position === 'after' ? -2 : 'auto',\n top: 0,\n bottom: 0,\n borderRadius: '1000px',\n width: '4px',\n backgroundColor: isOver ? 'var(--theme-success-400)' : 'transparent',\n marginBottom: '10px',\n marginTop: '10px',\n pointerEvents: 'none',\n zIndex: 1000,\n }}\n />\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -32,7 +32,7 @@ export async function ModularDashboard(props) {
32
32
  const widgetData = widgetConfig?.fields?.length ? extractLocaleData(layoutItem.data || {}, req.locale || 'en', widgetConfig.fields) : layoutItem.data || {};
33
33
  return {
34
34
  component: RenderServerComponent({
35
- Component: widgetConfig?.ComponentPath,
35
+ Component: widgetConfig?.Component,
36
36
  importMap,
37
37
  serverProps: {
38
38
  cookies,
@@ -49,7 +49,7 @@ export async function ModularDashboard(props) {
49
49
  // Resolve function labels to static labels for client components
50
50
  const clientWidgets = widgets.map(widget => {
51
51
  const {
52
- ComponentPath: _,
52
+ Component: _,
53
53
  fields: __,
54
54
  label,
55
55
  ...rest
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["RenderServerComponent","React","ModularDashboardClient","getItemsFromConfig","getItemsFromPreferences","extractLocaleData","ModularDashboard","props","defaultLayout","widgets","payload","config","admin","dashboard","importMap","user","cookies","locale","permissions","req","initPageResult","i18n","layout","serverLayout","map","layoutItem","widgetSlug","id","slice","lastIndexOf","widgetConfig","find","widget","slug","widgetData","fields","length","data","component","Component","ComponentPath","serverProps","item","clientWidgets","_","__","label","rest","t","_jsx","clientLayout"],"sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/index.tsx"],"sourcesContent":["import type { TFunction } from '@payloadcms/translations'\nimport type { ClientWidget, Field, WidgetServerProps } from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport React from 'react'\n\nimport type { DashboardViewServerProps } from '../index.js'\nimport type { WidgetInstanceClient } from './index.client.js'\n\nimport { ModularDashboardClient } from './index.client.js'\nimport { getItemsFromConfig } from './utils/getItemsFromConfig.js'\nimport { getItemsFromPreferences } from './utils/getItemsFromPreferences.js'\nimport { extractLocaleData } from './utils/localeUtils.js'\nimport './index.scss'\n\ntype ServerLayout = WidgetInstanceClient[]\n\nexport async function ModularDashboard(props: DashboardViewServerProps) {\n const { defaultLayout = [], widgets = [] } = props.payload.config.admin.dashboard || {}\n const { importMap } = props.payload\n const { user } = props\n const { cookies, locale, permissions, req } = props.initPageResult\n const { i18n } = req\n\n const layout =\n (await getItemsFromPreferences(props.payload, user)) ??\n (await getItemsFromConfig(defaultLayout, req, widgets))\n\n const serverLayout: ServerLayout = layout.map((layoutItem) => {\n const widgetSlug = layoutItem.id.slice(0, layoutItem.id.lastIndexOf('-'))\n const widgetConfig = widgets.find((widget) => widget.slug === widgetSlug)\n const widgetData = widgetConfig?.fields?.length\n ? extractLocaleData(layoutItem.data || {}, req.locale || 'en', widgetConfig.fields as Field[])\n : layoutItem.data || {}\n\n return {\n component: RenderServerComponent({\n Component: widgetConfig?.ComponentPath,\n importMap,\n serverProps: {\n cookies,\n locale,\n permissions,\n req,\n widgetData,\n widgetSlug,\n } satisfies WidgetServerProps,\n }),\n item: layoutItem,\n }\n })\n\n // Resolve function labels to static labels for client components\n const clientWidgets: ClientWidget[] = widgets.map((widget) => {\n const { ComponentPath: _, fields: __, label, ...rest } = widget\n return {\n ...rest,\n label: typeof label === 'function' ? label({ i18n, t: i18n.t as TFunction }) : label,\n }\n })\n\n return (\n <div>\n <ModularDashboardClient clientLayout={serverLayout} widgets={clientWidgets} />\n </div>\n )\n}\n"],"mappings":";AAGA,SAASA,qBAAqB,QAAQ;AACtC,OAAOC,KAAA,MAAW;AAKlB,SAASC,sBAAsB,QAAQ;AACvC,SAASC,kBAAkB,QAAQ;AACnC,SAASC,uBAAuB,QAAQ;AACxC,SAASC,iBAAiB,QAAQ;AAKlC,OAAO,eAAeC,iBAAiBC,KAA+B;EACpE,MAAM;IAAEC,aAAA,GAAgB,EAAE;IAAEC,OAAA,GAAU;EAAE,CAAE,GAAGF,KAAA,CAAMG,OAAO,CAACC,MAAM,CAACC,KAAK,CAACC,SAAS,IAAI,CAAC;EACtF,MAAM;IAAEC;EAAS,CAAE,GAAGP,KAAA,CAAMG,OAAO;EACnC,MAAM;IAAEK;EAAI,CAAE,GAAGR,KAAA;EACjB,MAAM;IAAES,OAAO;IAAEC,MAAM;IAAEC,WAAW;IAAEC;EAAG,CAAE,GAAGZ,KAAA,CAAMa,cAAc;EAClE,MAAM;IAAEC;EAAI,CAAE,GAAGF,GAAA;EAEjB,MAAMG,MAAA,GACJ,OAAOlB,uBAAA,CAAwBG,KAAA,CAAMG,OAAO,EAAEK,IAAA,OAC7C,MAAMZ,kBAAA,CAAmBK,aAAA,EAAeW,GAAA,EAAKV,OAAA;EAEhD,MAAMc,YAAA,GAA6BD,MAAA,CAAOE,GAAG,CAAEC,UAAA;IAC7C,MAAMC,UAAA,GAAaD,UAAA,CAAWE,EAAE,CAACC,KAAK,CAAC,GAAGH,UAAA,CAAWE,EAAE,CAACE,WAAW,CAAC;IACpE,MAAMC,YAAA,GAAerB,OAAA,CAAQsB,IAAI,CAAEC,MAAA,IAAWA,MAAA,CAAOC,IAAI,KAAKP,UAAA;IAC9D,MAAMQ,UAAA,GAAaJ,YAAA,EAAcK,MAAA,EAAQC,MAAA,GACrC/B,iBAAA,CAAkBoB,UAAA,CAAWY,IAAI,IAAI,CAAC,GAAGlB,GAAA,CAAIF,MAAM,IAAI,MAAMa,YAAA,CAAaK,MAAM,IAChFV,UAAA,CAAWY,IAAI,IAAI,CAAC;IAExB,OAAO;MACLC,SAAA,EAAWtC,qBAAA,CAAsB;QAC/BuC,SAAA,EAAWT,YAAA,EAAcU,aAAA;QACzB1B,SAAA;QACA2B,WAAA,EAAa;UACXzB,OAAA;UACAC,MAAA;UACAC,WAAA;UACAC,GAAA;UACAe,UAAA;UACAR;QACF;MACF;MACAgB,IAAA,EAAMjB;IACR;EACF;EAEA;EACA,MAAMkB,aAAA,GAAgClC,OAAA,CAAQe,GAAG,CAAEQ,MAAA;IACjD,MAAM;MAAEQ,aAAA,EAAeI,CAAC;MAAET,MAAA,EAAQU,EAAE;MAAEC,KAAK;MAAE,GAAGC;IAAA,CAAM,GAAGf,MAAA;IACzD,OAAO;MACL,GAAGe,IAAI;MACPD,KAAA,EAAO,OAAOA,KAAA,KAAU,aAAaA,KAAA,CAAM;QAAEzB,IAAA;QAAM2B,CAAA,EAAG3B,IAAA,CAAK2B;MAAe,KAAKF;IACjF;EACF;EAEA,oBACEG,IAAA,CAAC;cACC,aAAAA,IAAA,CAAC/C,sBAAA;MAAuBgD,YAAA,EAAc3B,YAAA;MAAcd,OAAA,EAASkC;;;AAGnE","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["RenderServerComponent","React","ModularDashboardClient","getItemsFromConfig","getItemsFromPreferences","extractLocaleData","ModularDashboard","props","defaultLayout","widgets","payload","config","admin","dashboard","importMap","user","cookies","locale","permissions","req","initPageResult","i18n","layout","serverLayout","map","layoutItem","widgetSlug","id","slice","lastIndexOf","widgetConfig","find","widget","slug","widgetData","fields","length","data","component","Component","serverProps","item","clientWidgets","_","__","label","rest","t","_jsx","clientLayout"],"sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/index.tsx"],"sourcesContent":["import type { TFunction } from '@payloadcms/translations'\nimport type { ClientWidget, Field, WidgetServerProps } from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport React from 'react'\n\nimport type { DashboardViewServerProps } from '../index.js'\nimport type { WidgetInstanceClient } from './index.client.js'\n\nimport { ModularDashboardClient } from './index.client.js'\nimport { getItemsFromConfig } from './utils/getItemsFromConfig.js'\nimport { getItemsFromPreferences } from './utils/getItemsFromPreferences.js'\nimport { extractLocaleData } from './utils/localeUtils.js'\nimport './index.scss'\n\ntype ServerLayout = WidgetInstanceClient[]\n\nexport async function ModularDashboard(props: DashboardViewServerProps) {\n const { defaultLayout = [], widgets = [] } = props.payload.config.admin.dashboard || {}\n const { importMap } = props.payload\n const { user } = props\n const { cookies, locale, permissions, req } = props.initPageResult\n const { i18n } = req\n\n const layout =\n (await getItemsFromPreferences(props.payload, user)) ??\n (await getItemsFromConfig(defaultLayout, req, widgets))\n\n const serverLayout: ServerLayout = layout.map((layoutItem) => {\n const widgetSlug = layoutItem.id.slice(0, layoutItem.id.lastIndexOf('-'))\n const widgetConfig = widgets.find((widget) => widget.slug === widgetSlug)\n const widgetData = widgetConfig?.fields?.length\n ? extractLocaleData(layoutItem.data || {}, req.locale || 'en', widgetConfig.fields as Field[])\n : layoutItem.data || {}\n\n return {\n component: RenderServerComponent({\n Component: widgetConfig?.Component,\n importMap,\n serverProps: {\n cookies,\n locale,\n permissions,\n req,\n widgetData,\n widgetSlug,\n } satisfies WidgetServerProps,\n }),\n item: layoutItem,\n }\n })\n\n // Resolve function labels to static labels for client components\n const clientWidgets: ClientWidget[] = widgets.map((widget) => {\n const { Component: _, fields: __, label, ...rest } = widget\n return {\n ...rest,\n label: typeof label === 'function' ? label({ i18n, t: i18n.t as TFunction }) : label,\n }\n })\n\n return (\n <div>\n <ModularDashboardClient clientLayout={serverLayout} widgets={clientWidgets} />\n </div>\n )\n}\n"],"mappings":";AAGA,SAASA,qBAAqB,QAAQ;AACtC,OAAOC,KAAA,MAAW;AAKlB,SAASC,sBAAsB,QAAQ;AACvC,SAASC,kBAAkB,QAAQ;AACnC,SAASC,uBAAuB,QAAQ;AACxC,SAASC,iBAAiB,QAAQ;AAKlC,OAAO,eAAeC,iBAAiBC,KAA+B;EACpE,MAAM;IAAEC,aAAA,GAAgB,EAAE;IAAEC,OAAA,GAAU;EAAE,CAAE,GAAGF,KAAA,CAAMG,OAAO,CAACC,MAAM,CAACC,KAAK,CAACC,SAAS,IAAI,CAAC;EACtF,MAAM;IAAEC;EAAS,CAAE,GAAGP,KAAA,CAAMG,OAAO;EACnC,MAAM;IAAEK;EAAI,CAAE,GAAGR,KAAA;EACjB,MAAM;IAAES,OAAO;IAAEC,MAAM;IAAEC,WAAW;IAAEC;EAAG,CAAE,GAAGZ,KAAA,CAAMa,cAAc;EAClE,MAAM;IAAEC;EAAI,CAAE,GAAGF,GAAA;EAEjB,MAAMG,MAAA,GACJ,OAAOlB,uBAAA,CAAwBG,KAAA,CAAMG,OAAO,EAAEK,IAAA,OAC7C,MAAMZ,kBAAA,CAAmBK,aAAA,EAAeW,GAAA,EAAKV,OAAA;EAEhD,MAAMc,YAAA,GAA6BD,MAAA,CAAOE,GAAG,CAAEC,UAAA;IAC7C,MAAMC,UAAA,GAAaD,UAAA,CAAWE,EAAE,CAACC,KAAK,CAAC,GAAGH,UAAA,CAAWE,EAAE,CAACE,WAAW,CAAC;IACpE,MAAMC,YAAA,GAAerB,OAAA,CAAQsB,IAAI,CAAEC,MAAA,IAAWA,MAAA,CAAOC,IAAI,KAAKP,UAAA;IAC9D,MAAMQ,UAAA,GAAaJ,YAAA,EAAcK,MAAA,EAAQC,MAAA,GACrC/B,iBAAA,CAAkBoB,UAAA,CAAWY,IAAI,IAAI,CAAC,GAAGlB,GAAA,CAAIF,MAAM,IAAI,MAAMa,YAAA,CAAaK,MAAM,IAChFV,UAAA,CAAWY,IAAI,IAAI,CAAC;IAExB,OAAO;MACLC,SAAA,EAAWtC,qBAAA,CAAsB;QAC/BuC,SAAA,EAAWT,YAAA,EAAcS,SAAA;QACzBzB,SAAA;QACA0B,WAAA,EAAa;UACXxB,OAAA;UACAC,MAAA;UACAC,WAAA;UACAC,GAAA;UACAe,UAAA;UACAR;QACF;MACF;MACAe,IAAA,EAAMhB;IACR;EACF;EAEA;EACA,MAAMiB,aAAA,GAAgCjC,OAAA,CAAQe,GAAG,CAAEQ,MAAA;IACjD,MAAM;MAAEO,SAAA,EAAWI,CAAC;MAAER,MAAA,EAAQS,EAAE;MAAEC,KAAK;MAAE,GAAGC;IAAA,CAAM,GAAGd,MAAA;IACrD,OAAO;MACL,GAAGc,IAAI;MACPD,KAAA,EAAO,OAAOA,KAAA,KAAU,aAAaA,KAAA,CAAM;QAAExB,IAAA;QAAM0B,CAAA,EAAG1B,IAAA,CAAK0B;MAAe,KAAKF;IACjF;EACF;EAEA,oBACEG,IAAA,CAAC;cACC,aAAAA,IAAA,CAAC9C,sBAAA;MAAuB+C,YAAA,EAAc1B,YAAA;MAAcd,OAAA,EAASiC;;;AAGnE","ignoreList":[]}
@@ -24,7 +24,7 @@ export const getDefaultLayoutHandler = async ({
24
24
  const widgetSlug = layoutItem.id.slice(0, layoutItem.id.lastIndexOf('-'));
25
25
  return {
26
26
  component: RenderServerComponent({
27
- Component: widgets.find(widget => widget.slug === widgetSlug)?.ComponentPath,
27
+ Component: widgets.find(widget => widget.slug === widgetSlug)?.Component,
28
28
  importMap,
29
29
  serverProps: {
30
30
  cookies,
@@ -1 +1 @@
1
- {"version":3,"file":"getDefaultLayoutServerFn.js","names":["RenderServerComponent","getDefaultLayoutHandler","cookies","locale","permissions","req","user","Error","defaultLayout","widgets","payload","config","admin","dashboard","importMap","layoutItems","getItemsFromConfig","layout","map","layoutItem","widgetSlug","id","slice","lastIndexOf","component","Component","find","widget","slug","ComponentPath","serverProps","widgetData","data","item","widgetInstances","widgetInstance","index","w","maxWidth","minWidth","width"],"sources":["../../../../../../src/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.ts"],"sourcesContent":["import type {\n DashboardConfig,\n PayloadRequest,\n ServerFunction,\n Widget,\n WidgetServerProps,\n} from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\n\nimport type { WidgetInstanceClient, WidgetItem } from '../index.client.js'\n\nexport type GetDefaultLayoutServerFnArgs = Record<string, never>\n\nexport type GetDefaultLayoutServerFnReturnType = {\n layout: WidgetInstanceClient[]\n}\n\n/**\n * Server function to get the default dashboard layout on-demand.\n * Used when resetting the dashboard to its default configuration.\n */\nexport const getDefaultLayoutHandler: ServerFunction<\n GetDefaultLayoutServerFnArgs,\n Promise<GetDefaultLayoutServerFnReturnType>\n> = async ({ cookies, locale, permissions, req }) => {\n if (!req.user) {\n throw new Error('Unauthorized')\n }\n\n const { defaultLayout = [], widgets = [] } = req.payload.config.admin.dashboard || {}\n const { importMap } = req.payload\n\n const layoutItems = await getItemsFromConfig(defaultLayout, req, widgets)\n\n const layout: WidgetInstanceClient[] = layoutItems.map((layoutItem) => {\n const widgetSlug = layoutItem.id.slice(0, layoutItem.id.lastIndexOf('-'))\n return {\n component: RenderServerComponent({\n Component: widgets.find((widget) => widget.slug === widgetSlug)?.ComponentPath,\n importMap,\n serverProps: {\n cookies,\n locale,\n permissions,\n req,\n widgetData: layoutItem.data || {},\n widgetSlug,\n } satisfies WidgetServerProps,\n }),\n item: layoutItem,\n }\n })\n\n return { layout }\n}\n\nasync function getItemsFromConfig(\n defaultLayout: NonNullable<DashboardConfig['defaultLayout']>,\n req: PayloadRequest,\n widgets: Pick<Widget, 'maxWidth' | 'minWidth' | 'slug'>[],\n): Promise<WidgetItem[]> {\n let widgetInstances\n if (typeof defaultLayout === 'function') {\n widgetInstances = await defaultLayout({ req })\n } else {\n widgetInstances = defaultLayout\n }\n\n return widgetInstances.map((widgetInstance, index) => {\n const widget = widgets.find((w) => w.slug === widgetInstance.widgetSlug)\n return {\n id: `${widgetInstance.widgetSlug}-${index}`,\n data: widgetInstance.data,\n maxWidth: widget?.maxWidth ?? 'full',\n minWidth: widget?.minWidth ?? 'x-small',\n width: widgetInstance.width || 'x-small',\n }\n })\n}\n"],"mappings":"AAQA,SAASA,qBAAqB,QAAQ;AAUtC;;;;AAIA,OAAO,MAAMC,uBAAA,GAGT,MAAAA,CAAO;EAAEC,OAAO;EAAEC,MAAM;EAAEC,WAAW;EAAEC;AAAG,CAAE;EAC9C,IAAI,CAACA,GAAA,CAAIC,IAAI,EAAE;IACb,MAAM,IAAIC,KAAA,CAAM;EAClB;EAEA,MAAM;IAAEC,aAAA,GAAgB,EAAE;IAAEC,OAAA,GAAU;EAAE,CAAE,GAAGJ,GAAA,CAAIK,OAAO,CAACC,MAAM,CAACC,KAAK,CAACC,SAAS,IAAI,CAAC;EACpF,MAAM;IAAEC;EAAS,CAAE,GAAGT,GAAA,CAAIK,OAAO;EAEjC,MAAMK,WAAA,GAAc,MAAMC,kBAAA,CAAmBR,aAAA,EAAeH,GAAA,EAAKI,OAAA;EAEjE,MAAMQ,MAAA,GAAiCF,WAAA,CAAYG,GAAG,CAAEC,UAAA;IACtD,MAAMC,UAAA,GAAaD,UAAA,CAAWE,EAAE,CAACC,KAAK,CAAC,GAAGH,UAAA,CAAWE,EAAE,CAACE,WAAW,CAAC;IACpE,OAAO;MACLC,SAAA,EAAWxB,qBAAA,CAAsB;QAC/ByB,SAAA,EAAWhB,OAAA,CAAQiB,IAAI,CAAEC,MAAA,IAAWA,MAAA,CAAOC,IAAI,KAAKR,UAAA,GAAaS,aAAA;QACjEf,SAAA;QACAgB,WAAA,EAAa;UACX5B,OAAA;UACAC,MAAA;UACAC,WAAA;UACAC,GAAA;UACA0B,UAAA,EAAYZ,UAAA,CAAWa,IAAI,IAAI,CAAC;UAChCZ;QACF;MACF;MACAa,IAAA,EAAMd;IACR;EACF;EAEA,OAAO;IAAEF;EAAO;AAClB;AAEA,eAAeD,mBACbR,aAA4D,EAC5DH,GAAmB,EACnBI,OAAyD;EAEzD,IAAIyB,eAAA;EACJ,IAAI,OAAO1B,aAAA,KAAkB,YAAY;IACvC0B,eAAA,GAAkB,MAAM1B,aAAA,CAAc;MAAEH;IAAI;EAC9C,OAAO;IACL6B,eAAA,GAAkB1B,aAAA;EACpB;EAEA,OAAO0B,eAAA,CAAgBhB,GAAG,CAAC,CAACiB,cAAA,EAAgBC,KAAA;IAC1C,MAAMT,MAAA,GAASlB,OAAA,CAAQiB,IAAI,CAAEW,CAAA,IAAMA,CAAA,CAAET,IAAI,KAAKO,cAAA,CAAef,UAAU;IACvE,OAAO;MACLC,EAAA,EAAI,GAAGc,cAAA,CAAef,UAAU,IAAIgB,KAAA,EAAO;MAC3CJ,IAAA,EAAMG,cAAA,CAAeH,IAAI;MACzBM,QAAA,EAAUX,MAAA,EAAQW,QAAA,IAAY;MAC9BC,QAAA,EAAUZ,MAAA,EAAQY,QAAA,IAAY;MAC9BC,KAAA,EAAOL,cAAA,CAAeK,KAAK,IAAI;IACjC;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"file":"getDefaultLayoutServerFn.js","names":["RenderServerComponent","getDefaultLayoutHandler","cookies","locale","permissions","req","user","Error","defaultLayout","widgets","payload","config","admin","dashboard","importMap","layoutItems","getItemsFromConfig","layout","map","layoutItem","widgetSlug","id","slice","lastIndexOf","component","Component","find","widget","slug","serverProps","widgetData","data","item","widgetInstances","widgetInstance","index","w","maxWidth","minWidth","width"],"sources":["../../../../../../src/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.ts"],"sourcesContent":["import type {\n DashboardConfig,\n PayloadRequest,\n ServerFunction,\n Widget,\n WidgetServerProps,\n} from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\n\nimport type { WidgetInstanceClient, WidgetItem } from '../index.client.js'\n\nexport type GetDefaultLayoutServerFnArgs = Record<string, never>\n\nexport type GetDefaultLayoutServerFnReturnType = {\n layout: WidgetInstanceClient[]\n}\n\n/**\n * Server function to get the default dashboard layout on-demand.\n * Used when resetting the dashboard to its default configuration.\n */\nexport const getDefaultLayoutHandler: ServerFunction<\n GetDefaultLayoutServerFnArgs,\n Promise<GetDefaultLayoutServerFnReturnType>\n> = async ({ cookies, locale, permissions, req }) => {\n if (!req.user) {\n throw new Error('Unauthorized')\n }\n\n const { defaultLayout = [], widgets = [] } = req.payload.config.admin.dashboard || {}\n const { importMap } = req.payload\n\n const layoutItems = await getItemsFromConfig(defaultLayout, req, widgets)\n\n const layout: WidgetInstanceClient[] = layoutItems.map((layoutItem) => {\n const widgetSlug = layoutItem.id.slice(0, layoutItem.id.lastIndexOf('-'))\n return {\n component: RenderServerComponent({\n Component: widgets.find((widget) => widget.slug === widgetSlug)?.Component,\n importMap,\n serverProps: {\n cookies,\n locale,\n permissions,\n req,\n widgetData: layoutItem.data || {},\n widgetSlug,\n } satisfies WidgetServerProps,\n }),\n item: layoutItem,\n }\n })\n\n return { layout }\n}\n\nasync function getItemsFromConfig(\n defaultLayout: NonNullable<DashboardConfig['defaultLayout']>,\n req: PayloadRequest,\n widgets: Pick<Widget, 'maxWidth' | 'minWidth' | 'slug'>[],\n): Promise<WidgetItem[]> {\n let widgetInstances\n if (typeof defaultLayout === 'function') {\n widgetInstances = await defaultLayout({ req })\n } else {\n widgetInstances = defaultLayout\n }\n\n return widgetInstances.map((widgetInstance, index) => {\n const widget = widgets.find((w) => w.slug === widgetInstance.widgetSlug)\n return {\n id: `${widgetInstance.widgetSlug}-${index}`,\n data: widgetInstance.data,\n maxWidth: widget?.maxWidth ?? 'full',\n minWidth: widget?.minWidth ?? 'x-small',\n width: widgetInstance.width || 'x-small',\n }\n })\n}\n"],"mappings":"AAQA,SAASA,qBAAqB,QAAQ;AAUtC;;;;AAIA,OAAO,MAAMC,uBAAA,GAGT,MAAAA,CAAO;EAAEC,OAAO;EAAEC,MAAM;EAAEC,WAAW;EAAEC;AAAG,CAAE;EAC9C,IAAI,CAACA,GAAA,CAAIC,IAAI,EAAE;IACb,MAAM,IAAIC,KAAA,CAAM;EAClB;EAEA,MAAM;IAAEC,aAAA,GAAgB,EAAE;IAAEC,OAAA,GAAU;EAAE,CAAE,GAAGJ,GAAA,CAAIK,OAAO,CAACC,MAAM,CAACC,KAAK,CAACC,SAAS,IAAI,CAAC;EACpF,MAAM;IAAEC;EAAS,CAAE,GAAGT,GAAA,CAAIK,OAAO;EAEjC,MAAMK,WAAA,GAAc,MAAMC,kBAAA,CAAmBR,aAAA,EAAeH,GAAA,EAAKI,OAAA;EAEjE,MAAMQ,MAAA,GAAiCF,WAAA,CAAYG,GAAG,CAAEC,UAAA;IACtD,MAAMC,UAAA,GAAaD,UAAA,CAAWE,EAAE,CAACC,KAAK,CAAC,GAAGH,UAAA,CAAWE,EAAE,CAACE,WAAW,CAAC;IACpE,OAAO;MACLC,SAAA,EAAWxB,qBAAA,CAAsB;QAC/ByB,SAAA,EAAWhB,OAAA,CAAQiB,IAAI,CAAEC,MAAA,IAAWA,MAAA,CAAOC,IAAI,KAAKR,UAAA,GAAaK,SAAA;QACjEX,SAAA;QACAe,WAAA,EAAa;UACX3B,OAAA;UACAC,MAAA;UACAC,WAAA;UACAC,GAAA;UACAyB,UAAA,EAAYX,UAAA,CAAWY,IAAI,IAAI,CAAC;UAChCX;QACF;MACF;MACAY,IAAA,EAAMb;IACR;EACF;EAEA,OAAO;IAAEF;EAAO;AAClB;AAEA,eAAeD,mBACbR,aAA4D,EAC5DH,GAAmB,EACnBI,OAAyD;EAEzD,IAAIwB,eAAA;EACJ,IAAI,OAAOzB,aAAA,KAAkB,YAAY;IACvCyB,eAAA,GAAkB,MAAMzB,aAAA,CAAc;MAAEH;IAAI;EAC9C,OAAO;IACL4B,eAAA,GAAkBzB,aAAA;EACpB;EAEA,OAAOyB,eAAA,CAAgBf,GAAG,CAAC,CAACgB,cAAA,EAAgBC,KAAA;IAC1C,MAAMR,MAAA,GAASlB,OAAA,CAAQiB,IAAI,CAAEU,CAAA,IAAMA,CAAA,CAAER,IAAI,KAAKM,cAAA,CAAed,UAAU;IACvE,OAAO;MACLC,EAAA,EAAI,GAAGa,cAAA,CAAed,UAAU,IAAIe,KAAA,EAAO;MAC3CJ,IAAA,EAAMG,cAAA,CAAeH,IAAI;MACzBM,QAAA,EAAUV,MAAA,EAAQU,QAAA,IAAY;MAC9BC,QAAA,EAAUX,MAAA,EAAQW,QAAA,IAAY;MAC9BC,KAAA,EAAOL,cAAA,CAAeK,KAAK,IAAI;IACjC;EACF;AACF","ignoreList":[]}
@@ -50,7 +50,7 @@ export const renderWidgetHandler = ({
50
50
  };
51
51
  // Render the widget server component
52
52
  const component = RenderServerComponent({
53
- Component: widgetConfig.ComponentPath,
53
+ Component: widgetConfig.Component,
54
54
  importMap,
55
55
  serverProps
56
56
  });
@@ -1 +1 @@
1
- {"version":3,"file":"renderWidgetServerFn.js","names":["RenderServerComponent","React","extractLocaleData","renderWidgetHandler","cookies","locale","permissions","req","widgetData","widgetSlug","user","Error","widgets","payload","config","admin","dashboard","importMap","widgetConfig","find","widget","slug","component","createElement","style","background","border","borderRadius","color","padding","textAlign","localeFilteredData","fields","length","serverProps","Component","ComponentPath","error","errorMessage","message","String","logger","err","msg"],"sources":["../../../../../../src/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.ts"],"sourcesContent":["import type { Field, ServerFunction, WidgetServerProps } from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport React from 'react'\n\nimport { extractLocaleData } from '../utils/localeUtils.js'\n\nexport type RenderWidgetServerFnArgs = {\n /**\n * Instance-specific data for this widget\n */\n widgetData?: Record<string, unknown>\n /**\n * The slug of the widget to render\n */\n widgetSlug: string\n}\n\nexport type RenderWidgetServerFnReturnType = {\n component: React.ReactNode\n}\n\n/**\n * Server function to render a widget on-demand.\n * Similar to render-field but specifically for dashboard widgets.\n */\nexport const renderWidgetHandler: ServerFunction<\n RenderWidgetServerFnArgs,\n RenderWidgetServerFnReturnType\n> = ({ cookies, locale, permissions, req, widgetData, widgetSlug }) => {\n if (!req.user) {\n throw new Error('Unauthorized')\n }\n\n const { widgets } = req.payload.config.admin.dashboard\n const { importMap } = req.payload\n\n // Find the widget configuration\n const widgetConfig = widgets.find((widget) => widget.slug === widgetSlug)\n\n if (!widgetConfig) {\n return {\n component: React.createElement(\n 'div',\n {\n style: {\n background: 'var(--theme-elevation-50)',\n border: '1px solid var(--theme-elevation-200)',\n borderRadius: '4px',\n color: 'var(--theme-text)',\n padding: '20px',\n textAlign: 'center',\n },\n },\n `Widget \"${widgetSlug}\" not found`,\n ),\n }\n }\n\n try {\n const localeFilteredData = widgetConfig.fields?.length\n ? extractLocaleData(widgetData || {}, req.locale || 'en', widgetConfig.fields as Field[])\n : widgetData || {}\n\n const serverProps: WidgetServerProps = {\n cookies,\n locale,\n permissions,\n req,\n widgetData: localeFilteredData,\n widgetSlug,\n }\n\n // Render the widget server component\n const component = RenderServerComponent({\n Component: widgetConfig.ComponentPath,\n importMap,\n serverProps,\n })\n\n return { component }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n req.payload.logger.error({\n err: error,\n msg: `Error rendering widget \"${widgetSlug}\": ${errorMessage}`,\n })\n\n return {\n component: React.createElement(\n 'div',\n {\n style: {\n background: 'var(--theme-error-50)',\n border: '1px solid var(--theme-error-200)',\n borderRadius: '4px',\n color: 'var(--theme-error-text)',\n padding: '20px',\n textAlign: 'center',\n },\n },\n 'Error loading widget',\n ),\n }\n }\n}\n"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ;AACtC,OAAOC,KAAA,MAAW;AAElB,SAASC,iBAAiB,QAAQ;AAiBlC;;;;AAIA,OAAO,MAAMC,mBAAA,GAGTA,CAAC;EAAEC,OAAO;EAAEC,MAAM;EAAEC,WAAW;EAAEC,GAAG;EAAEC,UAAU;EAAEC;AAAU,CAAE;EAChE,IAAI,CAACF,GAAA,CAAIG,IAAI,EAAE;IACb,MAAM,IAAIC,KAAA,CAAM;EAClB;EAEA,MAAM;IAAEC;EAAO,CAAE,GAAGL,GAAA,CAAIM,OAAO,CAACC,MAAM,CAACC,KAAK,CAACC,SAAS;EACtD,MAAM;IAAEC;EAAS,CAAE,GAAGV,GAAA,CAAIM,OAAO;EAEjC;EACA,MAAMK,YAAA,GAAeN,OAAA,CAAQO,IAAI,CAAEC,MAAA,IAAWA,MAAA,CAAOC,IAAI,KAAKZ,UAAA;EAE9D,IAAI,CAACS,YAAA,EAAc;IACjB,OAAO;MACLI,SAAA,EAAWrB,KAAA,CAAMsB,aAAa,CAC5B,OACA;QACEC,KAAA,EAAO;UACLC,UAAA,EAAY;UACZC,MAAA,EAAQ;UACRC,YAAA,EAAc;UACdC,KAAA,EAAO;UACPC,OAAA,EAAS;UACTC,SAAA,EAAW;QACb;MACF,GACA,WAAWrB,UAAA,aAAuB;IAEtC;EACF;EAEA,IAAI;IACF,MAAMsB,kBAAA,GAAqBb,YAAA,CAAac,MAAM,EAAEC,MAAA,GAC5C/B,iBAAA,CAAkBM,UAAA,IAAc,CAAC,GAAGD,GAAA,CAAIF,MAAM,IAAI,MAAMa,YAAA,CAAac,MAAM,IAC3ExB,UAAA,IAAc,CAAC;IAEnB,MAAM0B,WAAA,GAAiC;MACrC9B,OAAA;MACAC,MAAA;MACAC,WAAA;MACAC,GAAA;MACAC,UAAA,EAAYuB,kBAAA;MACZtB;IACF;IAEA;IACA,MAAMa,SAAA,GAAYtB,qBAAA,CAAsB;MACtCmC,SAAA,EAAWjB,YAAA,CAAakB,aAAa;MACrCnB,SAAA;MACAiB;IACF;IAEA,OAAO;MAAEZ;IAAU;EACrB,EAAE,OAAOe,KAAA,EAAO;IACd,MAAMC,YAAA,GAAeD,KAAA,YAAiB1B,KAAA,GAAQ0B,KAAA,CAAME,OAAO,GAAGC,MAAA,CAAOH,KAAA;IAErE9B,GAAA,CAAIM,OAAO,CAAC4B,MAAM,CAACJ,KAAK,CAAC;MACvBK,GAAA,EAAKL,KAAA;MACLM,GAAA,EAAK,2BAA2BlC,UAAA,MAAgB6B,YAAA;IAClD;IAEA,OAAO;MACLhB,SAAA,EAAWrB,KAAA,CAAMsB,aAAa,CAC5B,OACA;QACEC,KAAA,EAAO;UACLC,UAAA,EAAY;UACZC,MAAA,EAAQ;UACRC,YAAA,EAAc;UACdC,KAAA,EAAO;UACPC,OAAA,EAAS;UACTC,SAAA,EAAW;QACb;MACF,GACA;IAEJ;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"file":"renderWidgetServerFn.js","names":["RenderServerComponent","React","extractLocaleData","renderWidgetHandler","cookies","locale","permissions","req","widgetData","widgetSlug","user","Error","widgets","payload","config","admin","dashboard","importMap","widgetConfig","find","widget","slug","component","createElement","style","background","border","borderRadius","color","padding","textAlign","localeFilteredData","fields","length","serverProps","Component","error","errorMessage","message","String","logger","err","msg"],"sources":["../../../../../../src/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.ts"],"sourcesContent":["import type { Field, ServerFunction, WidgetServerProps } from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport React from 'react'\n\nimport { extractLocaleData } from '../utils/localeUtils.js'\n\nexport type RenderWidgetServerFnArgs = {\n /**\n * Instance-specific data for this widget\n */\n widgetData?: Record<string, unknown>\n /**\n * The slug of the widget to render\n */\n widgetSlug: string\n}\n\nexport type RenderWidgetServerFnReturnType = {\n component: React.ReactNode\n}\n\n/**\n * Server function to render a widget on-demand.\n * Similar to render-field but specifically for dashboard widgets.\n */\nexport const renderWidgetHandler: ServerFunction<\n RenderWidgetServerFnArgs,\n RenderWidgetServerFnReturnType\n> = ({ cookies, locale, permissions, req, widgetData, widgetSlug }) => {\n if (!req.user) {\n throw new Error('Unauthorized')\n }\n\n const { widgets } = req.payload.config.admin.dashboard\n const { importMap } = req.payload\n\n // Find the widget configuration\n const widgetConfig = widgets.find((widget) => widget.slug === widgetSlug)\n\n if (!widgetConfig) {\n return {\n component: React.createElement(\n 'div',\n {\n style: {\n background: 'var(--theme-elevation-50)',\n border: '1px solid var(--theme-elevation-200)',\n borderRadius: '4px',\n color: 'var(--theme-text)',\n padding: '20px',\n textAlign: 'center',\n },\n },\n `Widget \"${widgetSlug}\" not found`,\n ),\n }\n }\n\n try {\n const localeFilteredData = widgetConfig.fields?.length\n ? extractLocaleData(widgetData || {}, req.locale || 'en', widgetConfig.fields as Field[])\n : widgetData || {}\n\n const serverProps: WidgetServerProps = {\n cookies,\n locale,\n permissions,\n req,\n widgetData: localeFilteredData,\n widgetSlug,\n }\n\n // Render the widget server component\n const component = RenderServerComponent({\n Component: widgetConfig.Component,\n importMap,\n serverProps,\n })\n\n return { component }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n req.payload.logger.error({\n err: error,\n msg: `Error rendering widget \"${widgetSlug}\": ${errorMessage}`,\n })\n\n return {\n component: React.createElement(\n 'div',\n {\n style: {\n background: 'var(--theme-error-50)',\n border: '1px solid var(--theme-error-200)',\n borderRadius: '4px',\n color: 'var(--theme-error-text)',\n padding: '20px',\n textAlign: 'center',\n },\n },\n 'Error loading widget',\n ),\n }\n }\n}\n"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ;AACtC,OAAOC,KAAA,MAAW;AAElB,SAASC,iBAAiB,QAAQ;AAiBlC;;;;AAIA,OAAO,MAAMC,mBAAA,GAGTA,CAAC;EAAEC,OAAO;EAAEC,MAAM;EAAEC,WAAW;EAAEC,GAAG;EAAEC,UAAU;EAAEC;AAAU,CAAE;EAChE,IAAI,CAACF,GAAA,CAAIG,IAAI,EAAE;IACb,MAAM,IAAIC,KAAA,CAAM;EAClB;EAEA,MAAM;IAAEC;EAAO,CAAE,GAAGL,GAAA,CAAIM,OAAO,CAACC,MAAM,CAACC,KAAK,CAACC,SAAS;EACtD,MAAM;IAAEC;EAAS,CAAE,GAAGV,GAAA,CAAIM,OAAO;EAEjC;EACA,MAAMK,YAAA,GAAeN,OAAA,CAAQO,IAAI,CAAEC,MAAA,IAAWA,MAAA,CAAOC,IAAI,KAAKZ,UAAA;EAE9D,IAAI,CAACS,YAAA,EAAc;IACjB,OAAO;MACLI,SAAA,EAAWrB,KAAA,CAAMsB,aAAa,CAC5B,OACA;QACEC,KAAA,EAAO;UACLC,UAAA,EAAY;UACZC,MAAA,EAAQ;UACRC,YAAA,EAAc;UACdC,KAAA,EAAO;UACPC,OAAA,EAAS;UACTC,SAAA,EAAW;QACb;MACF,GACA,WAAWrB,UAAA,aAAuB;IAEtC;EACF;EAEA,IAAI;IACF,MAAMsB,kBAAA,GAAqBb,YAAA,CAAac,MAAM,EAAEC,MAAA,GAC5C/B,iBAAA,CAAkBM,UAAA,IAAc,CAAC,GAAGD,GAAA,CAAIF,MAAM,IAAI,MAAMa,YAAA,CAAac,MAAM,IAC3ExB,UAAA,IAAc,CAAC;IAEnB,MAAM0B,WAAA,GAAiC;MACrC9B,OAAA;MACAC,MAAA;MACAC,WAAA;MACAC,GAAA;MACAC,UAAA,EAAYuB,kBAAA;MACZtB;IACF;IAEA;IACA,MAAMa,SAAA,GAAYtB,qBAAA,CAAsB;MACtCmC,SAAA,EAAWjB,YAAA,CAAaiB,SAAS;MACjClB,SAAA;MACAiB;IACF;IAEA,OAAO;MAAEZ;IAAU;EACrB,EAAE,OAAOc,KAAA,EAAO;IACd,MAAMC,YAAA,GAAeD,KAAA,YAAiBzB,KAAA,GAAQyB,KAAA,CAAME,OAAO,GAAGC,MAAA,CAAOH,KAAA;IAErE7B,GAAA,CAAIM,OAAO,CAAC2B,MAAM,CAACJ,KAAK,CAAC;MACvBK,GAAA,EAAKL,KAAA;MACLM,GAAA,EAAK,2BAA2BjC,UAAA,MAAgB4B,YAAA;IAClD;IAEA,OAAO;MACLf,SAAA,EAAWrB,KAAA,CAAMsB,aAAa,CAC5B,OACA;QACEC,KAAA,EAAO;UACLC,UAAA,EAAY;UACZC,MAAA,EAAQ;UACRC,YAAA,EAAc;UACdC,KAAA,EAAO;UACPC,OAAA,EAAS;UACTC,SAAA,EAAW;QACb;MACF,GACA;IAEJ;EACF;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useDashboardLayout.d.ts","sourceRoot":"","sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/useDashboardLayout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAY1C,OAAO,KAA2C,MAAM,OAAO,CAAA;AAE/D,OAAO,KAAK,EAAE,oBAAoB,EAAc,MAAM,mBAAmB,CAAA;AAKzE,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,oBAAoB,EAAE;4BAsFvD,MAAM;;;;6BAkDR,MAAM;;iDA/DgB;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;;6BAyEpE,MAAM,YAAY,WAAW;;;iCAsB7B,MAAM,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;EA+CnD"}
1
+ {"version":3,"file":"useDashboardLayout.d.ts","sourceRoot":"","sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/useDashboardLayout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAa1C,OAAO,KAA2C,MAAM,OAAO,CAAA;AAE/D,OAAO,KAAK,EAAE,oBAAoB,EAAc,MAAM,mBAAmB,CAAA;AAKzE,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,oBAAoB,EAAE;4BAuFvD,MAAM;;;;6BAkDR,MAAM;;iDA/DgB;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;;6BAyEpE,MAAM,YAAY,WAAW;;;iCAsB7B,MAAM,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;EA+CnD"}
@@ -1,5 +1,5 @@
1
1
  import { arrayMove } from '@dnd-kit/sortable';
2
- import { ConfirmationModal, toast, useConfig, useModal, usePreferences, useServerFunctions } from '@payloadcms/ui';
2
+ import { ConfirmationModal, toast, useConfig, useModal, usePreferences, useServerFunctions, useTranslation } from '@payloadcms/ui';
3
3
  import { PREFERENCE_KEYS } from 'payload/shared';
4
4
  import React, { useCallback, useEffect, useState } from 'react';
5
5
  import { RenderWidget } from './renderWidget/RenderWidget.js';
@@ -17,6 +17,9 @@ export function useDashboardLayout(initialLayout) {
17
17
  const {
18
18
  serverFunction
19
19
  } = useServerFunctions();
20
+ const {
21
+ t
22
+ } = useTranslation();
20
23
  // Sync state when initialLayout prop changes (e.g., when query params change and server component re-renders)
21
24
  useEffect(() => {
22
25
  if (!isEditing) {
@@ -32,7 +35,7 @@ export function useDashboardLayout(initialLayout) {
32
35
  await setLayoutPreference(layoutData);
33
36
  } catch {
34
37
  setIsEditing(true);
35
- toast.error('Failed to save layout');
38
+ toast.error(t('error:failedToSaveLayout'));
36
39
  }
37
40
  }, [setLayoutPreference, currentLayout]);
38
41
  const resetLayout = useCallback(async () => {
@@ -45,7 +48,7 @@ export function useDashboardLayout(initialLayout) {
45
48
  setCurrentLayout(result.layout);
46
49
  setIsEditing(false);
47
50
  } catch {
48
- toast.error('Failed to reset layout');
51
+ toast.error(t('error:failedToResetLayout'));
49
52
  }
50
53
  }, [setLayoutPreference, serverFunction]);
51
54
  const performCancel = useCallback(() => {
@@ -151,9 +154,9 @@ export function useDashboardLayout(initialLayout) {
151
154
  } : item));
152
155
  }, [isEditing]);
153
156
  const cancelModal = React.createElement(ConfirmationModal, {
154
- body: 'You have unsaved changes to your dashboard layout. Are you sure you want to discard them?',
155
- confirmLabel: 'Discard',
156
- heading: 'Discard changes?',
157
+ body: t('dashboard:discardMessage'),
158
+ confirmLabel: t('dashboard:discardConfirmLabel'),
159
+ heading: t('dashboard:discardTitle'),
157
160
  modalSlug: cancelModalSlug,
158
161
  onConfirm: performCancel
159
162
  });
@@ -1 +1 @@
1
- {"version":3,"file":"useDashboardLayout.js","names":["arrayMove","ConfirmationModal","toast","useConfig","useModal","usePreferences","useServerFunctions","PREFERENCE_KEYS","React","useCallback","useEffect","useState","RenderWidget","useDashboardLayout","initialLayout","setLayoutPreference","useSetLayoutPreference","isEditing","setIsEditing","widgets","config","admin","dashboard","currentLayout","setCurrentLayout","openModal","cancelModalSlug","serverFunction","saveLayout","layoutData","map","item","error","resetLayout","result","name","args","layout","performCancel","cancel","hasChanges","length","some","widget","index","initialWidget","id","width","JSON","stringify","data","moveWidget","moveFromIndex","moveToIndex","prev","addWidget","widgetSlug","widgetId","Date","now","find","slug","newWidgetInstance","component","createElement","widgetData","maxWidth","minWidth","setTimeout","element","document","getElementById","scrollIntoView","behavior","block","closest","classList","add","remove","deleteWidget","filter","resizeWidget","newWidth","updateWidgetData","cancelModal","body","confirmLabel","heading","modalSlug","onConfirm","setPreference","DASHBOARD_LAYOUT","layouts"],"sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/useDashboardLayout.ts"],"sourcesContent":["import type { WidgetWidth } from 'payload'\n\nimport { arrayMove } from '@dnd-kit/sortable'\nimport {\n ConfirmationModal,\n toast,\n useConfig,\n useModal,\n usePreferences,\n useServerFunctions,\n} from '@payloadcms/ui'\nimport { PREFERENCE_KEYS } from 'payload/shared'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport type { WidgetInstanceClient, WidgetItem } from './index.client.js'\nimport type { GetDefaultLayoutServerFnReturnType } from './renderWidget/getDefaultLayoutServerFn.js'\n\nimport { RenderWidget } from './renderWidget/RenderWidget.js'\n\nexport function useDashboardLayout(initialLayout: WidgetInstanceClient[]) {\n const setLayoutPreference = useSetLayoutPreference()\n const [isEditing, setIsEditing] = useState(false)\n const { widgets = [] } = useConfig().config.admin.dashboard ?? {}\n const [currentLayout, setCurrentLayout] = useState<WidgetInstanceClient[]>(initialLayout)\n const { openModal } = useModal()\n const cancelModalSlug = 'cancel-dashboard-changes'\n const { serverFunction } = useServerFunctions()\n\n // Sync state when initialLayout prop changes (e.g., when query params change and server component re-renders)\n useEffect(() => {\n if (!isEditing) {\n setCurrentLayout(initialLayout)\n }\n // do not sync while editing. Depending on `isEditing` in this effect causes an\n // unintended rollback when toggling from editing -> view mode after save.\n }, [initialLayout])\n\n const saveLayout = useCallback(async () => {\n try {\n const layoutData: WidgetItem[] = currentLayout.map((item) => item.item)\n setIsEditing(false)\n await setLayoutPreference(layoutData)\n } catch {\n setIsEditing(true)\n toast.error('Failed to save layout')\n }\n }, [setLayoutPreference, currentLayout])\n\n const resetLayout = useCallback(async () => {\n try {\n await setLayoutPreference(null)\n\n const result = (await serverFunction({\n name: 'get-default-layout',\n args: {},\n })) as GetDefaultLayoutServerFnReturnType\n\n setCurrentLayout(result.layout)\n setIsEditing(false)\n } catch {\n toast.error('Failed to reset layout')\n }\n }, [setLayoutPreference, serverFunction])\n\n const performCancel = useCallback(() => {\n setCurrentLayout(initialLayout)\n setIsEditing(false)\n }, [initialLayout])\n\n const cancel = useCallback(() => {\n // Check if layout has changed\n const hasChanges =\n currentLayout.length !== initialLayout.length ||\n currentLayout.some((widget, index) => {\n const initialWidget = initialLayout[index]\n return (\n !initialWidget ||\n widget.item.id !== initialWidget.item.id ||\n widget.item.width !== initialWidget.item.width ||\n JSON.stringify(widget.item.data || {}) !== JSON.stringify(initialWidget.item.data || {})\n )\n })\n\n // If there are changes, show confirmation modal\n if (hasChanges) {\n openModal(cancelModalSlug)\n } else {\n performCancel()\n }\n }, [currentLayout, initialLayout, openModal, cancelModalSlug, performCancel])\n\n const moveWidget = useCallback(\n ({ moveFromIndex, moveToIndex }: { moveFromIndex: number; moveToIndex: number }) => {\n if (moveFromIndex === moveToIndex || moveFromIndex < 0 || moveToIndex < 0) {\n return\n }\n\n setCurrentLayout((prev) => {\n return arrayMove(prev, moveFromIndex, moveToIndex)\n })\n },\n [],\n )\n\n const addWidget = useCallback(\n (widgetSlug: string) => {\n if (!isEditing) {\n return\n }\n\n const widgetId = `${widgetSlug}-${Date.now()}`\n const widget = widgets.find((widget) => widget.slug === widgetSlug)\n\n // Create a new widget instance using RenderWidget\n const newWidgetInstance: WidgetInstanceClient = {\n component: React.createElement(RenderWidget, {\n widgetData: {},\n widgetId,\n }),\n item: {\n id: widgetId,\n data: {},\n maxWidth: widget?.maxWidth ?? 'full',\n minWidth: widget?.minWidth ?? 'x-small',\n width: widget?.minWidth ?? 'x-small',\n },\n }\n\n setCurrentLayout((prev) => [...prev, newWidgetInstance])\n\n // Scroll to the newly added widget after it's rendered and highlight it\n setTimeout(() => {\n const element = document.getElementById(widgetId)\n if (element) {\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n })\n\n // Add highlight animation to the widget element\n const widget = element.closest('.widget')\n if (widget) {\n widget.classList.add('widget--highlight')\n // Remove the class after animation completes (1.5s fade out)\n setTimeout(() => {\n widget.classList.remove('widget--highlight')\n }, 1500)\n }\n }\n }, 100)\n },\n [isEditing, widgets],\n )\n\n const deleteWidget = useCallback(\n (widgetId: string) => {\n if (!isEditing) {\n return\n }\n setCurrentLayout((prev) => prev.filter((item) => item.item.id !== widgetId))\n },\n [isEditing],\n )\n\n const resizeWidget = useCallback(\n (widgetId: string, newWidth: WidgetWidth) => {\n if (!isEditing) {\n return\n }\n setCurrentLayout((prev) =>\n prev.map((item) =>\n item.item.id === widgetId\n ? {\n ...item,\n item: {\n ...item.item,\n width: newWidth,\n } satisfies WidgetItem,\n }\n : item,\n ),\n )\n },\n [isEditing],\n )\n\n const updateWidgetData = useCallback(\n (widgetId: string, data: Record<string, unknown>) => {\n if (!isEditing) {\n return\n }\n\n setCurrentLayout((prev) =>\n prev.map((item) =>\n item.item.id === widgetId\n ? {\n component: React.createElement(RenderWidget, {\n widgetData: data,\n widgetId,\n }),\n item: {\n ...item.item,\n data,\n } satisfies WidgetItem,\n }\n : item,\n ),\n )\n },\n [isEditing],\n )\n\n const cancelModal = React.createElement(ConfirmationModal, {\n body: 'You have unsaved changes to your dashboard layout. Are you sure you want to discard them?',\n confirmLabel: 'Discard',\n heading: 'Discard changes?',\n modalSlug: cancelModalSlug,\n onConfirm: performCancel,\n })\n\n return {\n addWidget,\n cancel,\n cancelModal,\n currentLayout,\n deleteWidget,\n isEditing,\n moveWidget,\n resetLayout,\n resizeWidget,\n saveLayout,\n setIsEditing,\n updateWidgetData,\n }\n}\n\nfunction useSetLayoutPreference() {\n const { setPreference } = usePreferences()\n return useCallback(\n async (layout: null | WidgetItem[]) => {\n await setPreference(PREFERENCE_KEYS.DASHBOARD_LAYOUT, { layouts: layout }, false)\n },\n [setPreference],\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"useDashboardLayout.js","names":["arrayMove","ConfirmationModal","toast","useConfig","useModal","usePreferences","useServerFunctions","useTranslation","PREFERENCE_KEYS","React","useCallback","useEffect","useState","RenderWidget","useDashboardLayout","initialLayout","setLayoutPreference","useSetLayoutPreference","isEditing","setIsEditing","widgets","config","admin","dashboard","currentLayout","setCurrentLayout","openModal","cancelModalSlug","serverFunction","t","saveLayout","layoutData","map","item","error","resetLayout","result","name","args","layout","performCancel","cancel","hasChanges","length","some","widget","index","initialWidget","id","width","JSON","stringify","data","moveWidget","moveFromIndex","moveToIndex","prev","addWidget","widgetSlug","widgetId","Date","now","find","slug","newWidgetInstance","component","createElement","widgetData","maxWidth","minWidth","setTimeout","element","document","getElementById","scrollIntoView","behavior","block","closest","classList","add","remove","deleteWidget","filter","resizeWidget","newWidth","updateWidgetData","cancelModal","body","confirmLabel","heading","modalSlug","onConfirm","setPreference","DASHBOARD_LAYOUT","layouts"],"sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/useDashboardLayout.ts"],"sourcesContent":["import type { WidgetWidth } from 'payload'\n\nimport { arrayMove } from '@dnd-kit/sortable'\nimport {\n ConfirmationModal,\n toast,\n useConfig,\n useModal,\n usePreferences,\n useServerFunctions,\n useTranslation,\n} from '@payloadcms/ui'\nimport { PREFERENCE_KEYS } from 'payload/shared'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport type { WidgetInstanceClient, WidgetItem } from './index.client.js'\nimport type { GetDefaultLayoutServerFnReturnType } from './renderWidget/getDefaultLayoutServerFn.js'\n\nimport { RenderWidget } from './renderWidget/RenderWidget.js'\n\nexport function useDashboardLayout(initialLayout: WidgetInstanceClient[]) {\n const setLayoutPreference = useSetLayoutPreference()\n const [isEditing, setIsEditing] = useState(false)\n const { widgets = [] } = useConfig().config.admin.dashboard ?? {}\n const [currentLayout, setCurrentLayout] = useState<WidgetInstanceClient[]>(initialLayout)\n const { openModal } = useModal()\n const cancelModalSlug = 'cancel-dashboard-changes'\n const { serverFunction } = useServerFunctions()\n const { t } = useTranslation()\n\n // Sync state when initialLayout prop changes (e.g., when query params change and server component re-renders)\n useEffect(() => {\n if (!isEditing) {\n setCurrentLayout(initialLayout)\n }\n // do not sync while editing. Depending on `isEditing` in this effect causes an\n // unintended rollback when toggling from editing -> view mode after save.\n }, [initialLayout])\n\n const saveLayout = useCallback(async () => {\n try {\n const layoutData: WidgetItem[] = currentLayout.map((item) => item.item)\n setIsEditing(false)\n await setLayoutPreference(layoutData)\n } catch {\n setIsEditing(true)\n toast.error(t('error:failedToSaveLayout'))\n }\n }, [setLayoutPreference, currentLayout])\n\n const resetLayout = useCallback(async () => {\n try {\n await setLayoutPreference(null)\n\n const result = (await serverFunction({\n name: 'get-default-layout',\n args: {},\n })) as GetDefaultLayoutServerFnReturnType\n\n setCurrentLayout(result.layout)\n setIsEditing(false)\n } catch {\n toast.error(t('error:failedToResetLayout'))\n }\n }, [setLayoutPreference, serverFunction])\n\n const performCancel = useCallback(() => {\n setCurrentLayout(initialLayout)\n setIsEditing(false)\n }, [initialLayout])\n\n const cancel = useCallback(() => {\n // Check if layout has changed\n const hasChanges =\n currentLayout.length !== initialLayout.length ||\n currentLayout.some((widget, index) => {\n const initialWidget = initialLayout[index]\n return (\n !initialWidget ||\n widget.item.id !== initialWidget.item.id ||\n widget.item.width !== initialWidget.item.width ||\n JSON.stringify(widget.item.data || {}) !== JSON.stringify(initialWidget.item.data || {})\n )\n })\n\n // If there are changes, show confirmation modal\n if (hasChanges) {\n openModal(cancelModalSlug)\n } else {\n performCancel()\n }\n }, [currentLayout, initialLayout, openModal, cancelModalSlug, performCancel])\n\n const moveWidget = useCallback(\n ({ moveFromIndex, moveToIndex }: { moveFromIndex: number; moveToIndex: number }) => {\n if (moveFromIndex === moveToIndex || moveFromIndex < 0 || moveToIndex < 0) {\n return\n }\n\n setCurrentLayout((prev) => {\n return arrayMove(prev, moveFromIndex, moveToIndex)\n })\n },\n [],\n )\n\n const addWidget = useCallback(\n (widgetSlug: string) => {\n if (!isEditing) {\n return\n }\n\n const widgetId = `${widgetSlug}-${Date.now()}`\n const widget = widgets.find((widget) => widget.slug === widgetSlug)\n\n // Create a new widget instance using RenderWidget\n const newWidgetInstance: WidgetInstanceClient = {\n component: React.createElement(RenderWidget, {\n widgetData: {},\n widgetId,\n }),\n item: {\n id: widgetId,\n data: {},\n maxWidth: widget?.maxWidth ?? 'full',\n minWidth: widget?.minWidth ?? 'x-small',\n width: widget?.minWidth ?? 'x-small',\n },\n }\n\n setCurrentLayout((prev) => [...prev, newWidgetInstance])\n\n // Scroll to the newly added widget after it's rendered and highlight it\n setTimeout(() => {\n const element = document.getElementById(widgetId)\n if (element) {\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n })\n\n // Add highlight animation to the widget element\n const widget = element.closest('.widget')\n if (widget) {\n widget.classList.add('widget--highlight')\n // Remove the class after animation completes (1.5s fade out)\n setTimeout(() => {\n widget.classList.remove('widget--highlight')\n }, 1500)\n }\n }\n }, 100)\n },\n [isEditing, widgets],\n )\n\n const deleteWidget = useCallback(\n (widgetId: string) => {\n if (!isEditing) {\n return\n }\n setCurrentLayout((prev) => prev.filter((item) => item.item.id !== widgetId))\n },\n [isEditing],\n )\n\n const resizeWidget = useCallback(\n (widgetId: string, newWidth: WidgetWidth) => {\n if (!isEditing) {\n return\n }\n setCurrentLayout((prev) =>\n prev.map((item) =>\n item.item.id === widgetId\n ? {\n ...item,\n item: {\n ...item.item,\n width: newWidth,\n } satisfies WidgetItem,\n }\n : item,\n ),\n )\n },\n [isEditing],\n )\n\n const updateWidgetData = useCallback(\n (widgetId: string, data: Record<string, unknown>) => {\n if (!isEditing) {\n return\n }\n\n setCurrentLayout((prev) =>\n prev.map((item) =>\n item.item.id === widgetId\n ? {\n component: React.createElement(RenderWidget, {\n widgetData: data,\n widgetId,\n }),\n item: {\n ...item.item,\n data,\n } satisfies WidgetItem,\n }\n : item,\n ),\n )\n },\n [isEditing],\n )\n\n const cancelModal = React.createElement(ConfirmationModal, {\n body: t('dashboard:discardMessage'),\n confirmLabel: t('dashboard:discardConfirmLabel'),\n heading: t('dashboard:discardTitle'),\n modalSlug: cancelModalSlug,\n onConfirm: performCancel,\n })\n\n return {\n addWidget,\n cancel,\n cancelModal,\n currentLayout,\n deleteWidget,\n isEditing,\n moveWidget,\n resetLayout,\n resizeWidget,\n saveLayout,\n setIsEditing,\n updateWidgetData,\n }\n}\n\nfunction useSetLayoutPreference() {\n const { setPreference } = usePreferences()\n return useCallback(\n async (layout: null | WidgetItem[]) => {\n await setPreference(PREFERENCE_KEYS.DASHBOARD_LAYOUT, { layouts: layout }, false)\n },\n [setPreference],\n )\n}\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/next",
3
- "version": "3.79.0-canary.2",
3
+ "version": "3.79.0-canary.3",
4
4
  "homepage": "https://payloadcms.com",
5
5
  "repository": {
6
6
  "type": "git",
@@ -99,9 +99,9 @@
99
99
  "qs-esm": "7.0.2",
100
100
  "sass": "1.77.4",
101
101
  "uuid": "10.0.0",
102
- "@payloadcms/graphql": "3.79.0-canary.2",
103
- "@payloadcms/translations": "3.79.0-canary.2",
104
- "@payloadcms/ui": "3.79.0-canary.2"
102
+ "@payloadcms/graphql": "3.79.0-canary.3",
103
+ "@payloadcms/translations": "3.79.0-canary.3",
104
+ "@payloadcms/ui": "3.79.0-canary.3"
105
105
  },
106
106
  "devDependencies": {
107
107
  "@babel/cli": "7.27.2",
@@ -119,12 +119,12 @@
119
119
  "esbuild-sass-plugin": "3.3.1",
120
120
  "swc-plugin-transform-remove-imports": "8.3.0",
121
121
  "@payloadcms/eslint-config": "3.28.0",
122
- "payload": "3.79.0-canary.2"
122
+ "payload": "3.79.0-canary.3"
123
123
  },
124
124
  "peerDependencies": {
125
125
  "graphql": "^16.8.1",
126
126
  "next": ">=15.2.9 <15.3.0 || >=15.3.9 <15.4.0 || >=15.4.11 <15.5.0 || >=16.2.0-canary.10 <17.0.0",
127
- "payload": "3.79.0-canary.2"
127
+ "payload": "3.79.0-canary.3"
128
128
  },
129
129
  "engines": {
130
130
  "node": "^18.20.2 || >=20.9.0"