@trops/dash-core 0.1.115 → 0.1.117

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.
package/dist/index.esm.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
2
  import * as DashReact from '@trops/dash-react';
3
- import { isObject, ThemeContext, deepCopy, MainSection, getUUID, getStylesForItem, themeObjects, Heading, SearchInput, ButtonIcon, SubHeading3, InputText, Button, FontAwesomeIcon, Tag, Modal, Panel, Stepper, Paragraph, Heading3, MenuItem3, FormLabel, SelectMenu, Switch, CodeEditorInline, Sidebar, SettingsModal, SubHeading2, tailwindHeightFractions, Menu3, Panel3, DropdownPanel, MenuItem2, ButtonIcon2, DragComponent, ConfirmationModal, DropComponent, getStyleName, capitalizeFirstLetter, colorTypes, getCSSStyleForClassname, Panel2, Heading2, SubHeading, Paragraph2, Paragraph3, Button2, Button3, MenuItem, Tag2, Tag3, ButtonIcon3, DashPanel, colorNames, shades, themeVariants, Tabs3, DataList, Checkbox, StatCard, Card, Tabs, Accordion, Alert, Toast, ProgressBar, Toggle, Breadcrumbs, Card2, Tabs2, Accordion2, Alert2, Toast2, ProgressBar2, Toggle2, Breadcrumbs2, Card3, Accordion3, Alert3, Toast3, ProgressBar3, Toggle3, Breadcrumbs3, TextArea, SelectInput, Icon2, AlgoliaSearchBox, CommandPalette, EmptyState, Navbar, withRouter, Menu as Menu$1 } from '@trops/dash-react';
3
+ import { isObject, ThemeContext, deepCopy, MainSection, getUUID, getStylesForItem, themeObjects, Heading, SearchInput, ButtonIcon, SubHeading3, InputText, Button, FontAwesomeIcon, Tag, Sidebar, Paragraph, Modal, Panel, Stepper, Heading3, MenuItem3, FormLabel, SelectMenu, Switch, CodeEditorInline, SettingsModal, SubHeading2, tailwindHeightFractions, Menu3, Panel3, DropdownPanel, MenuItem2, ButtonIcon2, DragComponent, ConfirmationModal, DropComponent, getStyleName, capitalizeFirstLetter, colorTypes, getCSSStyleForClassname, Panel2, Heading2, SubHeading, Paragraph2, Paragraph3, Button2, Button3, MenuItem, Tag2, Tag3, ButtonIcon3, DashPanel, colorNames, shades, themeVariants, Tabs3, DataList, Checkbox, StatCard, Card, Tabs, Accordion, Alert, Toast, ProgressBar, Toggle, Breadcrumbs, Card2, Tabs2, Accordion2, Alert2, Toast2, ProgressBar2, Toggle2, Breadcrumbs2, Card3, Accordion3, Alert3, Toast3, ProgressBar3, Toggle3, Breadcrumbs3, TextArea, SelectInput, Icon2, AlgoliaSearchBox, CommandPalette, EmptyState, Navbar, withRouter, Menu as Menu$1 } from '@trops/dash-react';
4
4
  export * from '@trops/dash-react';
5
5
  export { ThemeContext } from '@trops/dash-react';
6
6
  import _typeof from '@babel/runtime/helpers/typeof';
@@ -13,13 +13,13 @@ import _createClass from '@babel/runtime/helpers/createClass';
13
13
  import * as jsxRuntime from 'react/jsx-runtime';
14
14
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
15
15
  import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
16
+ import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
17
+ import _regeneratorRuntime from '@babel/runtime/regenerator';
16
18
  import { Menu, Transition, Popover, Dialog, Disclosure } from '@headlessui/react';
17
19
  import { EllipsisVerticalIcon } from '@heroicons/react/20/solid';
18
20
  import clsx from 'clsx';
19
21
  import { DndProvider, useDrag, useDrop } from 'react-dnd';
20
22
  import { HTML5Backend } from 'react-dnd-html5-backend';
21
- import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
22
- import _regeneratorRuntime from '@babel/runtime/regenerator';
23
23
  import _possibleConstructorReturn from '@babel/runtime/helpers/possibleConstructorReturn';
24
24
  import _getPrototypeOf from '@babel/runtime/helpers/getPrototypeOf';
25
25
  import _inherits from '@babel/runtime/helpers/inherits';
@@ -30,8 +30,8 @@ import algoliasearch from 'algoliasearch';
30
30
  import { InstantSearch, Hits } from 'react-instantsearch-hooks-web';
31
31
  import { Link } from 'react-router-dom';
32
32
 
33
- function ownKeys$A(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
34
- function _objectSpread$A(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$A(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$A(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
33
+ function ownKeys$B(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
34
+ function _objectSpread$B(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$B(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$B(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
35
35
  var event = {
36
36
  list: new Map(),
37
37
  // Map(1) { '<widget-UUID>' => { 'CustomSearchbar[10].searchQueryChanged': [] } }
@@ -93,7 +93,7 @@ var event = {
93
93
  uuid: subscriber["uuid"]
94
94
  };
95
95
  if ("action" in subscriber && subscriber.action !== undefined) {
96
- subscriber["action"](_objectSpread$A({}, objectToSend));
96
+ subscriber["action"](_objectSpread$B({}, objectToSend));
97
97
  }
98
98
  });
99
99
  }
@@ -2533,8 +2533,8 @@ var DashboardWrapper = function DashboardWrapper(_ref) {
2533
2533
  });
2534
2534
  };
2535
2535
 
2536
- function ownKeys$z(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2537
- function _objectSpread$z(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$z(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$z(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2536
+ function ownKeys$A(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2537
+ function _objectSpread$A(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$A(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$A(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2538
2538
  var DashboardThemeProvider = function DashboardThemeProvider(_ref) {
2539
2539
  var themeKey = _ref.themeKey,
2540
2540
  children = _ref.children;
@@ -2546,7 +2546,7 @@ var DashboardThemeProvider = function DashboardThemeProvider(_ref) {
2546
2546
  var dashboardTheme = themes[themeKey];
2547
2547
  var themeValue = dashboardTheme ? dashboardTheme[themeVariant] || null : null;
2548
2548
  if (!themeValue) return null;
2549
- return _objectSpread$z(_objectSpread$z({}, parentContext), {}, {
2549
+ return _objectSpread$A(_objectSpread$A({}, parentContext), {}, {
2550
2550
  currentTheme: themeValue,
2551
2551
  currentThemeKey: themeKey,
2552
2552
  theme: themeValue,
@@ -2564,8 +2564,8 @@ var DashboardThemeProvider = function DashboardThemeProvider(_ref) {
2564
2564
  });
2565
2565
  };
2566
2566
 
2567
- function ownKeys$y(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2568
- function _objectSpread$y(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$y(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$y(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2567
+ function ownKeys$z(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2568
+ function _objectSpread$z(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$z(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$z(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2569
2569
  var AppThemeScope = function AppThemeScope(_ref) {
2570
2570
  var children = _ref.children;
2571
2571
  var ctx = useContext(ThemeContext);
@@ -2573,7 +2573,7 @@ var AppThemeScope = function AppThemeScope(_ref) {
2573
2573
  children: children
2574
2574
  });
2575
2575
  return /*#__PURE__*/jsx(ThemeContext.Provider, {
2576
- value: _objectSpread$y(_objectSpread$y({}, ctx), {}, {
2576
+ value: _objectSpread$z(_objectSpread$z({}, ctx), {}, {
2577
2577
  currentTheme: ctx.appTheme,
2578
2578
  currentThemeKey: ctx.appThemeKey,
2579
2579
  theme: ctx.appTheme,
@@ -2685,8 +2685,8 @@ var LayoutContainer = function LayoutContainer(_ref) {
2685
2685
  });
2686
2686
  };
2687
2687
 
2688
- function ownKeys$x(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2689
- function _objectSpread$x(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$x(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$x(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2688
+ function ownKeys$y(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2689
+ function _objectSpread$y(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$y(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$y(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2690
2690
  function _createForOfIteratorHelper$a(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$a(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
2691
2691
  function _unsupportedIterableToArray$a(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$a(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$a(r, a) : void 0; } }
2692
2692
  function _arrayLikeToArray$a(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
@@ -2930,7 +2930,7 @@ function createLayoutFromTemplate(template) {
2930
2930
  try {
2931
2931
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
2932
2932
  var cell = _step.value;
2933
- grid[cell.key] = _objectSpread$x({
2933
+ grid[cell.key] = _objectSpread$y({
2934
2934
  component: null,
2935
2935
  hide: cell.hide || false
2936
2936
  }, cell.span ? {
@@ -3272,6 +3272,642 @@ var FolderDetail = function FolderDetail(_ref) {
3272
3272
  });
3273
3273
  };
3274
3274
 
3275
+ var OptionCard$1 = function OptionCard(_ref) {
3276
+ var icon = _ref.icon,
3277
+ title = _ref.title,
3278
+ description = _ref.description,
3279
+ onClick = _ref.onClick;
3280
+ return /*#__PURE__*/jsxs("button", {
3281
+ type: "button",
3282
+ onClick: onClick,
3283
+ className: "w-full flex flex-row items-center gap-4 p-4 rounded-lg text-left transition-all bg-gray-700/50 hover:bg-gray-700 hover:ring-1 hover:ring-gray-600",
3284
+ children: [/*#__PURE__*/jsx("div", {
3285
+ className: "flex-shrink-0 h-8 w-8 flex items-center justify-center text-gray-400",
3286
+ children: /*#__PURE__*/jsx(FontAwesomeIcon, {
3287
+ icon: icon,
3288
+ className: "h-5 w-5"
3289
+ })
3290
+ }), /*#__PURE__*/jsxs("div", {
3291
+ className: "flex flex-col min-w-0",
3292
+ children: [/*#__PURE__*/jsx("span", {
3293
+ className: "text-sm font-medium text-gray-200",
3294
+ children: title
3295
+ }), /*#__PURE__*/jsx("span", {
3296
+ className: "text-xs text-gray-500 mt-0.5",
3297
+ children: description
3298
+ })]
3299
+ }), /*#__PURE__*/jsx("div", {
3300
+ className: "flex-shrink-0 ml-auto text-gray-600",
3301
+ children: /*#__PURE__*/jsx(FontAwesomeIcon, {
3302
+ icon: "chevron-right",
3303
+ className: "h-3 w-3"
3304
+ })
3305
+ })]
3306
+ });
3307
+ };
3308
+ var CreationMethodPicker = function CreationMethodPicker(_ref2) {
3309
+ var onSelect = _ref2.onSelect;
3310
+ return /*#__PURE__*/jsxs("div", {
3311
+ className: "flex flex-row w-full h-full",
3312
+ children: [/*#__PURE__*/jsxs("div", {
3313
+ className: "flex flex-col w-1/3 p-6 py-10 space-y-4 justify-start",
3314
+ children: [/*#__PURE__*/jsx(Heading, {
3315
+ title: "New Dashboard",
3316
+ padding: false,
3317
+ textColor: "text-gray-300"
3318
+ }), /*#__PURE__*/jsx("p", {
3319
+ className: "text-base font-normal text-gray-400",
3320
+ children: "Choose how you'd like to create your new dashboard."
3321
+ })]
3322
+ }), /*#__PURE__*/jsxs("div", {
3323
+ className: "flex flex-col w-2/3 p-6 pt-10 space-y-3",
3324
+ children: [/*#__PURE__*/jsx(OptionCard$1, {
3325
+ icon: "plus",
3326
+ title: "New Dashboard",
3327
+ description: "Start from a blank template and customize your layout",
3328
+ onClick: function onClick() {
3329
+ return onSelect("template");
3330
+ }
3331
+ }), /*#__PURE__*/jsx(OptionCard$1, {
3332
+ icon: "file-zipper",
3333
+ title: "Import from File",
3334
+ description: "Import a dashboard from a .zip file on your computer",
3335
+ onClick: function onClick() {
3336
+ return onSelect("import");
3337
+ }
3338
+ }), /*#__PURE__*/jsx(OptionCard$1, {
3339
+ icon: "compass",
3340
+ title: "Search Registry",
3341
+ description: "Browse and install dashboards from the online registry",
3342
+ onClick: function onClick() {
3343
+ return onSelect("registry");
3344
+ }
3345
+ })]
3346
+ })]
3347
+ });
3348
+ };
3349
+
3350
+ var StarRating = function StarRating(_ref) {
3351
+ var appId = _ref.appId,
3352
+ packageName = _ref.packageName,
3353
+ _ref$interactive = _ref.interactive,
3354
+ interactive = _ref$interactive === void 0 ? true : _ref$interactive;
3355
+ var _useContext = useContext(ThemeContext),
3356
+ currentTheme = _useContext.currentTheme;
3357
+ var _useState = useState(0),
3358
+ _useState2 = _slicedToArray(_useState, 2),
3359
+ rating = _useState2[0],
3360
+ setRating = _useState2[1];
3361
+ var _useState3 = useState(0),
3362
+ _useState4 = _slicedToArray(_useState3, 2),
3363
+ hoverRating = _useState4[0],
3364
+ setHoverRating = _useState4[1];
3365
+ var _useState5 = useState(true),
3366
+ _useState6 = _slicedToArray(_useState5, 2),
3367
+ loading = _useState6[0],
3368
+ setLoading = _useState6[1];
3369
+ useEffect(function () {
3370
+ var _window$mainApi;
3371
+ if (!appId || !packageName) return;
3372
+ var cancelled = false;
3373
+ setLoading(true);
3374
+ (_window$mainApi = window.mainApi) === null || _window$mainApi === void 0 || (_window$mainApi = _window$mainApi.dashboardRatings) === null || _window$mainApi === void 0 || _window$mainApi.getDashboardRating(appId, packageName).then(function (result) {
3375
+ if (!cancelled && result !== null && result !== void 0 && result.rating) {
3376
+ setRating(result.rating);
3377
+ }
3378
+ })["catch"](function () {})["finally"](function () {
3379
+ if (!cancelled) setLoading(false);
3380
+ });
3381
+ return function () {
3382
+ cancelled = true;
3383
+ };
3384
+ }, [appId, packageName]);
3385
+ function handleClick(_x) {
3386
+ return _handleClick.apply(this, arguments);
3387
+ }
3388
+ function _handleClick() {
3389
+ _handleClick = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(value) {
3390
+ var newRating, _window$mainApi2;
3391
+ return _regeneratorRuntime.wrap(function (_context) {
3392
+ while (1) switch (_context.prev = _context.next) {
3393
+ case 0:
3394
+ if (!(!interactive || !appId || !packageName)) {
3395
+ _context.next = 1;
3396
+ break;
3397
+ }
3398
+ return _context.abrupt("return");
3399
+ case 1:
3400
+ newRating = value === rating ? 0 : value;
3401
+ setRating(newRating);
3402
+ _context.prev = 2;
3403
+ _context.next = 3;
3404
+ return (_window$mainApi2 = window.mainApi) === null || _window$mainApi2 === void 0 || (_window$mainApi2 = _window$mainApi2.dashboardRatings) === null || _window$mainApi2 === void 0 ? void 0 : _window$mainApi2.saveDashboardRating(appId, packageName, newRating);
3405
+ case 3:
3406
+ _context.next = 5;
3407
+ break;
3408
+ case 4:
3409
+ _context.prev = 4;
3410
+ _context["catch"](2);
3411
+ case 5:
3412
+ case "end":
3413
+ return _context.stop();
3414
+ }
3415
+ }, _callee, null, [[2, 4]]);
3416
+ }));
3417
+ return _handleClick.apply(this, arguments);
3418
+ }
3419
+ if (loading) return null;
3420
+ var displayRating = hoverRating || rating;
3421
+ return /*#__PURE__*/jsx("div", {
3422
+ className: "flex items-center gap-0.5",
3423
+ onMouseLeave: function onMouseLeave() {
3424
+ return setHoverRating(0);
3425
+ },
3426
+ children: [1, 2, 3, 4, 5].map(function (star) {
3427
+ return /*#__PURE__*/jsx("button", {
3428
+ type: "button",
3429
+ disabled: !interactive,
3430
+ onClick: function onClick() {
3431
+ return handleClick(star);
3432
+ },
3433
+ onMouseEnter: function onMouseEnter() {
3434
+ return interactive && setHoverRating(star);
3435
+ },
3436
+ className: "p-0.5 transition-colors ".concat(interactive ? "cursor-pointer hover:scale-110" : "cursor-default"),
3437
+ children: /*#__PURE__*/jsx(FontAwesomeIcon, {
3438
+ icon: star <= displayRating ? "star" : ["far", "star"],
3439
+ className: "h-3.5 w-3.5 ".concat(star <= displayRating ? "text-yellow-400" : currentTheme["text-primary-medium"] || "text-gray-500")
3440
+ })
3441
+ }, star);
3442
+ })
3443
+ });
3444
+ };
3445
+
3446
+ var RegistryDashboardDetail = function RegistryDashboardDetail(_ref) {
3447
+ var dashboardPackage = _ref.dashboardPackage,
3448
+ appId = _ref.appId;
3449
+ var _useContext = useContext(ThemeContext),
3450
+ currentTheme = _useContext.currentTheme;
3451
+ var panelStyles = getStylesForItem(themeObjects.PANEL, currentTheme, {
3452
+ grow: false
3453
+ });
3454
+ var _useState = useState(null),
3455
+ _useState2 = _slicedToArray(_useState, 2),
3456
+ preview = _useState2[0],
3457
+ setPreview = _useState2[1];
3458
+ var _useState3 = useState(false),
3459
+ _useState4 = _slicedToArray(_useState3, 2),
3460
+ previewLoading = _useState4[0],
3461
+ setPreviewLoading = _useState4[1];
3462
+ var _useState5 = useState(false),
3463
+ _useState6 = _slicedToArray(_useState5, 2),
3464
+ isInstalling = _useState6[0],
3465
+ setIsInstalling = _useState6[1];
3466
+ var _useState7 = useState(null),
3467
+ _useState8 = _slicedToArray(_useState7, 2),
3468
+ installResult = _useState8[0],
3469
+ setInstallResult = _useState8[1];
3470
+ var pkg = dashboardPackage;
3471
+ if (!pkg) return null;
3472
+
3473
+ // Load preview data on mount
3474
+ // eslint-disable-next-line react-hooks/rules-of-hooks
3475
+ useEffect(function () {
3476
+ var _window$mainApi;
3477
+ if (!pkg.name) return;
3478
+ var cancelled = false;
3479
+ setPreviewLoading(true);
3480
+ setPreview(null);
3481
+ setInstallResult(null);
3482
+ (_window$mainApi = window.mainApi) === null || _window$mainApi === void 0 || (_window$mainApi = _window$mainApi.dashboardConfig) === null || _window$mainApi === void 0 || _window$mainApi.getDashboardPreview(pkg.name).then(function (result) {
3483
+ if (!cancelled) setPreview(result);
3484
+ })["catch"](function (err) {
3485
+ })["finally"](function () {
3486
+ if (!cancelled) setPreviewLoading(false);
3487
+ });
3488
+ return function () {
3489
+ cancelled = true;
3490
+ };
3491
+ }, [pkg.name]);
3492
+ function handleInstall() {
3493
+ return _handleInstall.apply(this, arguments);
3494
+ }
3495
+ function _handleInstall() {
3496
+ _handleInstall = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
3497
+ var _result$workspace, result, _t;
3498
+ return _regeneratorRuntime.wrap(function (_context) {
3499
+ while (1) switch (_context.prev = _context.next) {
3500
+ case 0:
3501
+ if (!(!appId || !pkg.name)) {
3502
+ _context.next = 1;
3503
+ break;
3504
+ }
3505
+ return _context.abrupt("return");
3506
+ case 1:
3507
+ setIsInstalling(true);
3508
+ setInstallResult(null);
3509
+ _context.prev = 2;
3510
+ _context.next = 3;
3511
+ return window.mainApi.dashboardConfig.installDashboardFromRegistry(appId, pkg.name);
3512
+ case 3:
3513
+ result = _context.sent;
3514
+ setInstallResult({
3515
+ status: result !== null && result !== void 0 && result.success ? "success" : "error",
3516
+ message: result !== null && result !== void 0 && result.success ? "Dashboard \"".concat(((_result$workspace = result.workspace) === null || _result$workspace === void 0 ? void 0 : _result$workspace.name) || pkg.name, "\" installed successfully.") : (result === null || result === void 0 ? void 0 : result.error) || "Installation failed."
3517
+ });
3518
+ _context.next = 5;
3519
+ break;
3520
+ case 4:
3521
+ _context.prev = 4;
3522
+ _t = _context["catch"](2);
3523
+ setInstallResult({
3524
+ status: "error",
3525
+ message: _t.message || "Failed to install dashboard."
3526
+ });
3527
+ case 5:
3528
+ _context.prev = 5;
3529
+ setIsInstalling(false);
3530
+ return _context.finish(5);
3531
+ case 6:
3532
+ case "end":
3533
+ return _context.stop();
3534
+ }
3535
+ }, _callee, null, [[2, 4, 5, 6]]);
3536
+ }));
3537
+ return _handleInstall.apply(this, arguments);
3538
+ }
3539
+ var compatibility = preview === null || preview === void 0 ? void 0 : preview.compatibility;
3540
+ var widgetDeps = (preview === null || preview === void 0 ? void 0 : preview.widgets) || pkg.widgets || [];
3541
+ var providers = (preview === null || preview === void 0 ? void 0 : preview.providers) || [];
3542
+ var wiring = (preview === null || preview === void 0 ? void 0 : preview.wiring) || [];
3543
+ function getCompatIcon(status) {
3544
+ if (status === "installed") return {
3545
+ icon: "circle-check",
3546
+ color: "text-green-400"
3547
+ };
3548
+ if (status === "available") return {
3549
+ icon: "circle-down",
3550
+ color: "text-blue-400"
3551
+ };
3552
+ return {
3553
+ icon: "circle-xmark",
3554
+ color: "text-red-400"
3555
+ };
3556
+ }
3557
+ return /*#__PURE__*/jsxs("div", {
3558
+ className: "flex flex-col flex-1 min-h-0",
3559
+ children: [/*#__PURE__*/jsxs("div", {
3560
+ className: "flex-1 min-h-0 overflow-y-auto p-6 space-y-6 ".concat(panelStyles.textColor || "text-gray-200"),
3561
+ children: [/*#__PURE__*/jsxs("div", {
3562
+ className: "flex flex-row items-center gap-3",
3563
+ children: [/*#__PURE__*/jsx("div", {
3564
+ className: "h-5 w-5 flex-shrink-0 flex items-center justify-center",
3565
+ children: /*#__PURE__*/jsx(FontAwesomeIcon, {
3566
+ icon: pkg.icon || "clone",
3567
+ className: "h-5 w-5"
3568
+ })
3569
+ }), /*#__PURE__*/jsxs("div", {
3570
+ children: [/*#__PURE__*/jsx(SubHeading3, {
3571
+ title: pkg.displayName || pkg.name,
3572
+ padding: false
3573
+ }), /*#__PURE__*/jsxs("div", {
3574
+ className: "flex items-center gap-2 mt-0.5",
3575
+ children: [/*#__PURE__*/jsxs("span", {
3576
+ className: "text-sm opacity-60",
3577
+ children: ["by ", pkg.author || "Unknown"]
3578
+ }), pkg.version && /*#__PURE__*/jsxs("span", {
3579
+ className: "text-xs px-2 py-0.5 rounded ".concat(currentTheme["bg-primary-medium"], " opacity-70"),
3580
+ children: ["v", pkg.version]
3581
+ })]
3582
+ })]
3583
+ })]
3584
+ }), appId && /*#__PURE__*/jsx(StarRating, {
3585
+ appId: appId,
3586
+ packageName: pkg.name,
3587
+ interactive: false
3588
+ }), /*#__PURE__*/jsx("hr", {
3589
+ className: currentTheme["border-primary-medium"]
3590
+ }), pkg.description && /*#__PURE__*/jsx("p", {
3591
+ className: "text-sm",
3592
+ children: pkg.description
3593
+ }), pkg.tags && pkg.tags.length > 0 && /*#__PURE__*/jsx("div", {
3594
+ className: "flex flex-wrap gap-1",
3595
+ children: pkg.tags.map(function (tag) {
3596
+ return /*#__PURE__*/jsx("span", {
3597
+ className: "text-xs px-2 py-0.5 rounded ".concat(currentTheme["bg-primary-medium"], " opacity-60"),
3598
+ children: tag
3599
+ }, tag);
3600
+ })
3601
+ }), /*#__PURE__*/jsxs("div", {
3602
+ children: [/*#__PURE__*/jsx("span", {
3603
+ className: "text-xs font-semibold opacity-50 mb-1 block",
3604
+ children: "REQUIRED WIDGETS"
3605
+ }), previewLoading ? /*#__PURE__*/jsxs("div", {
3606
+ className: "flex items-center gap-2 py-2",
3607
+ children: [/*#__PURE__*/jsx("div", {
3608
+ className: "animate-spin rounded-full h-4 w-4 border-b-2 border-blue-500"
3609
+ }), /*#__PURE__*/jsx("span", {
3610
+ className: "text-xs opacity-50",
3611
+ children: "Checking compatibility..."
3612
+ })]
3613
+ }) : /*#__PURE__*/jsx("div", {
3614
+ className: "space-y-1.5",
3615
+ children: widgetDeps.map(function (w, idx) {
3616
+ var _compatibility$widget;
3617
+ var status = (compatibility === null || compatibility === void 0 || (_compatibility$widget = compatibility.widgets) === null || _compatibility$widget === void 0 ? void 0 : _compatibility$widget[w.name || w.packageName]) || "unknown";
3618
+ var compat = getCompatIcon(status);
3619
+ return /*#__PURE__*/jsxs("div", {
3620
+ className: "p-2 rounded ".concat(currentTheme["bg-primary-medium"], " flex items-center gap-2"),
3621
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
3622
+ icon: compat.icon,
3623
+ className: "h-3.5 w-3.5 ".concat(compat.color)
3624
+ }), /*#__PURE__*/jsx("span", {
3625
+ className: "text-sm",
3626
+ children: w.displayName || w.name || w.packageName
3627
+ }), /*#__PURE__*/jsx("span", {
3628
+ className: "text-xs opacity-40 ml-auto",
3629
+ children: status === "installed" ? "Installed" : status === "available" ? "Will install" : "Unavailable"
3630
+ })]
3631
+ }, idx);
3632
+ })
3633
+ })]
3634
+ }), providers.length > 0 && /*#__PURE__*/jsxs("div", {
3635
+ children: [/*#__PURE__*/jsx("span", {
3636
+ className: "text-xs font-semibold opacity-50 mb-1 block",
3637
+ children: "REQUIRED PROVIDERS"
3638
+ }), /*#__PURE__*/jsx("div", {
3639
+ className: "space-y-1",
3640
+ children: providers.map(function (p, idx) {
3641
+ return /*#__PURE__*/jsxs("div", {
3642
+ className: "flex items-center gap-2",
3643
+ children: [/*#__PURE__*/jsx("span", {
3644
+ className: "text-xs px-1.5 py-0.5 rounded bg-blue-900/30 text-blue-400",
3645
+ children: p.type
3646
+ }), p.required && /*#__PURE__*/jsx("span", {
3647
+ className: "text-[10px] opacity-40",
3648
+ children: "Required"
3649
+ })]
3650
+ }, idx);
3651
+ })
3652
+ })]
3653
+ }), wiring.length > 0 && /*#__PURE__*/jsxs("div", {
3654
+ children: [/*#__PURE__*/jsx("span", {
3655
+ className: "text-xs font-semibold opacity-50 mb-1 block",
3656
+ children: "EVENT WIRING"
3657
+ }), /*#__PURE__*/jsx("div", {
3658
+ className: "space-y-1",
3659
+ children: wiring.map(function (w, idx) {
3660
+ return /*#__PURE__*/jsxs("div", {
3661
+ className: "text-xs p-2 rounded ".concat(currentTheme["bg-primary-medium"], " opacity-70"),
3662
+ children: [/*#__PURE__*/jsx("span", {
3663
+ className: "font-medium",
3664
+ children: w.from || "Source"
3665
+ }), /*#__PURE__*/jsx(FontAwesomeIcon, {
3666
+ icon: "arrow-right",
3667
+ className: "h-2.5 w-2.5 mx-1.5 opacity-50"
3668
+ }), /*#__PURE__*/jsx("span", {
3669
+ className: "font-medium",
3670
+ children: w.to || "Target"
3671
+ }), w.event && /*#__PURE__*/jsxs("span", {
3672
+ className: "opacity-50 ml-1.5",
3673
+ children: ["(", w.event, ")"]
3674
+ })]
3675
+ }, idx);
3676
+ })
3677
+ })]
3678
+ }), installResult && /*#__PURE__*/jsx("div", {
3679
+ className: "p-2 rounded border ".concat(installResult.status === "success" ? "bg-green-900/20 border-green-700" : "bg-red-900/30 border-red-700"),
3680
+ children: /*#__PURE__*/jsxs("div", {
3681
+ className: "flex items-center gap-2",
3682
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
3683
+ icon: installResult.status === "success" ? "circle-check" : "circle-xmark",
3684
+ className: "h-4 w-4 ".concat(installResult.status === "success" ? "text-green-400" : "text-red-400")
3685
+ }), /*#__PURE__*/jsx("span", {
3686
+ className: "text-sm ".concat(installResult.status === "error" ? "text-red-400" : ""),
3687
+ children: installResult.message
3688
+ })]
3689
+ })
3690
+ })]
3691
+ }), (installResult === null || installResult === void 0 ? void 0 : installResult.status) !== "success" && /*#__PURE__*/jsx("div", {
3692
+ className: "flex items-center justify-end px-6 py-3 border-t ".concat(currentTheme["border-primary-medium"]),
3693
+ children: /*#__PURE__*/jsx(Button, {
3694
+ title: isInstalling ? "Installing..." : "Install Dashboard",
3695
+ bgColor: "bg-blue-600",
3696
+ hoverBackgroundColor: isInstalling ? "" : "hover:bg-blue-700",
3697
+ textSize: "text-sm",
3698
+ padding: "py-1.5 px-4",
3699
+ onClick: handleInstall,
3700
+ disabled: isInstalling
3701
+ })
3702
+ })]
3703
+ });
3704
+ };
3705
+
3706
+ var DiscoverDashboardsDetail = function DiscoverDashboardsDetail(_ref) {
3707
+ var onBack = _ref.onBack,
3708
+ appId = _ref.appId;
3709
+ var _useContext = useContext(ThemeContext),
3710
+ currentTheme = _useContext.currentTheme;
3711
+ var panelStyles = getStylesForItem(themeObjects.PANEL, currentTheme, {
3712
+ grow: false
3713
+ });
3714
+ var _useState = useState([]),
3715
+ _useState2 = _slicedToArray(_useState, 2),
3716
+ packages = _useState2[0],
3717
+ setPackages = _useState2[1];
3718
+ var _useState3 = useState(false),
3719
+ _useState4 = _slicedToArray(_useState3, 2),
3720
+ isLoading = _useState4[0],
3721
+ setIsLoading = _useState4[1];
3722
+ var _useState5 = useState(null),
3723
+ _useState6 = _slicedToArray(_useState5, 2),
3724
+ error = _useState6[0],
3725
+ setError = _useState6[1];
3726
+ var _useState7 = useState(""),
3727
+ _useState8 = _slicedToArray(_useState7, 2),
3728
+ searchQuery = _useState8[0],
3729
+ setSearchQuery = _useState8[1];
3730
+ var _useState9 = useState(null),
3731
+ _useState0 = _slicedToArray(_useState9, 2),
3732
+ selectedPackageName = _useState0[0],
3733
+ setSelectedPackageName = _useState0[1];
3734
+ var search = useCallback(/*#__PURE__*/function () {
3735
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(query) {
3736
+ var _window$mainApi;
3737
+ var result, _t;
3738
+ return _regeneratorRuntime.wrap(function (_context) {
3739
+ while (1) switch (_context.prev = _context.next) {
3740
+ case 0:
3741
+ if ((_window$mainApi = window.mainApi) !== null && _window$mainApi !== void 0 && (_window$mainApi = _window$mainApi.registry) !== null && _window$mainApi !== void 0 && _window$mainApi.searchDashboards) {
3742
+ _context.next = 1;
3743
+ break;
3744
+ }
3745
+ setPackages([]);
3746
+ return _context.abrupt("return");
3747
+ case 1:
3748
+ setIsLoading(true);
3749
+ setError(null);
3750
+ _context.prev = 2;
3751
+ _context.next = 3;
3752
+ return window.mainApi.registry.searchDashboards(query || "", {});
3753
+ case 3:
3754
+ result = _context.sent;
3755
+ setPackages((result === null || result === void 0 ? void 0 : result.packages) || []);
3756
+ _context.next = 5;
3757
+ break;
3758
+ case 4:
3759
+ _context.prev = 4;
3760
+ _t = _context["catch"](2);
3761
+ setError(_t.message || "Failed to search dashboard registry");
3762
+ setPackages([]);
3763
+ case 5:
3764
+ _context.prev = 5;
3765
+ setIsLoading(false);
3766
+ return _context.finish(5);
3767
+ case 6:
3768
+ case "end":
3769
+ return _context.stop();
3770
+ }
3771
+ }, _callee, null, [[2, 4, 5, 6]]);
3772
+ }));
3773
+ return function (_x) {
3774
+ return _ref2.apply(this, arguments);
3775
+ };
3776
+ }(), []);
3777
+
3778
+ // Debounce search on query changes
3779
+ useEffect(function () {
3780
+ var timer = setTimeout(function () {
3781
+ search(searchQuery);
3782
+ }, 300);
3783
+ return function () {
3784
+ return clearTimeout(timer);
3785
+ };
3786
+ // eslint-disable-next-line react-hooks/exhaustive-deps
3787
+ }, [searchQuery]);
3788
+ var retry = function retry() {
3789
+ return search(searchQuery);
3790
+ };
3791
+ var selectedPackage = selectedPackageName ? packages.find(function (p) {
3792
+ return p.name === selectedPackageName;
3793
+ }) : null;
3794
+
3795
+ // If a package is selected, show its detail inline
3796
+ if (selectedPackage) {
3797
+ return /*#__PURE__*/jsxs("div", {
3798
+ className: "flex flex-col flex-1 min-h-0",
3799
+ children: [/*#__PURE__*/jsx("div", {
3800
+ className: "flex-shrink-0 px-4 pt-4",
3801
+ children: /*#__PURE__*/jsxs("button", {
3802
+ type: "button",
3803
+ onClick: function onClick() {
3804
+ return setSelectedPackageName(null);
3805
+ },
3806
+ className: "flex items-center gap-1.5 text-sm opacity-60 hover:opacity-100 transition-opacity",
3807
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
3808
+ icon: "arrow-left",
3809
+ className: "h-3 w-3"
3810
+ }), /*#__PURE__*/jsx("span", {
3811
+ children: "Back"
3812
+ })]
3813
+ })
3814
+ }), /*#__PURE__*/jsx(RegistryDashboardDetail, {
3815
+ dashboardPackage: selectedPackage,
3816
+ appId: appId
3817
+ })]
3818
+ });
3819
+ }
3820
+
3821
+ // Package list view
3822
+ var listBody;
3823
+ if (isLoading) {
3824
+ listBody = /*#__PURE__*/jsx("div", {
3825
+ className: "flex items-center justify-center py-12",
3826
+ children: /*#__PURE__*/jsxs("div", {
3827
+ className: "text-center",
3828
+ children: [/*#__PURE__*/jsx("div", {
3829
+ className: "animate-spin rounded-full h-6 w-6 border-b-2 border-blue-500 mx-auto mb-3"
3830
+ }), /*#__PURE__*/jsx(Paragraph, {
3831
+ className: "text-sm opacity-50",
3832
+ children: "Loading dashboards..."
3833
+ })]
3834
+ })
3835
+ });
3836
+ } else if (error) {
3837
+ listBody = /*#__PURE__*/jsxs("div", {
3838
+ className: "px-4 py-8 text-center",
3839
+ children: [/*#__PURE__*/jsx(Paragraph, {
3840
+ className: "text-sm text-red-400 mb-3",
3841
+ children: error
3842
+ }), /*#__PURE__*/jsx(Button, {
3843
+ title: "Retry",
3844
+ bgColor: "bg-gray-700",
3845
+ hoverBackgroundColor: "hover:bg-gray-600",
3846
+ textSize: "text-sm",
3847
+ padding: "py-1 px-3",
3848
+ onClick: retry
3849
+ })]
3850
+ });
3851
+ } else if (packages.length === 0) {
3852
+ listBody = /*#__PURE__*/jsx("div", {
3853
+ className: "px-4 py-8 text-center",
3854
+ children: /*#__PURE__*/jsx(Paragraph, {
3855
+ className: "text-sm opacity-50",
3856
+ children: searchQuery ? "No dashboards match your search." : "No dashboard packages available."
3857
+ })
3858
+ });
3859
+ } else {
3860
+ listBody = /*#__PURE__*/jsx("div", {
3861
+ className: "space-y-1",
3862
+ children: packages.map(function (pkg) {
3863
+ var widgetCount = (pkg.widgets || []).length;
3864
+ return /*#__PURE__*/jsx(Sidebar.Item, {
3865
+ icon: /*#__PURE__*/jsx(FontAwesomeIcon, {
3866
+ icon: pkg.icon || "clone",
3867
+ className: "h-3.5 w-3.5"
3868
+ }),
3869
+ onClick: function onClick() {
3870
+ return setSelectedPackageName(pkg.name);
3871
+ },
3872
+ badge: widgetCount > 0 ? "".concat(widgetCount) : undefined,
3873
+ children: pkg.displayName || pkg.name
3874
+ }, pkg.name);
3875
+ })
3876
+ });
3877
+ }
3878
+ return /*#__PURE__*/jsxs("div", {
3879
+ className: "flex flex-col flex-1 min-h-0 ".concat(panelStyles.textColor || "text-gray-200"),
3880
+ children: [/*#__PURE__*/jsx("div", {
3881
+ className: "flex-shrink-0 px-4 pt-4",
3882
+ children: /*#__PURE__*/jsxs("button", {
3883
+ type: "button",
3884
+ onClick: onBack,
3885
+ className: "flex items-center gap-1.5 text-sm opacity-60 hover:opacity-100 transition-opacity",
3886
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
3887
+ icon: "arrow-left",
3888
+ className: "h-3 w-3"
3889
+ }), /*#__PURE__*/jsx("span", {
3890
+ children: "Back"
3891
+ })]
3892
+ })
3893
+ }), /*#__PURE__*/jsx("div", {
3894
+ className: "flex-shrink-0 px-4 py-3",
3895
+ children: /*#__PURE__*/jsx(SearchInput, {
3896
+ value: searchQuery,
3897
+ onChange: setSearchQuery,
3898
+ placeholder: "Search dashboards...",
3899
+ inputClassName: "py-1.5 text-xs"
3900
+ })
3901
+ }), /*#__PURE__*/jsx("div", {
3902
+ className: "flex-1 min-h-0 overflow-y-auto px-2",
3903
+ children: listBody
3904
+ }), !isLoading && !error && packages.length > 0 && /*#__PURE__*/jsxs("div", {
3905
+ className: "flex-shrink-0 px-4 py-2 text-[10px] opacity-40 border-t border-white/10",
3906
+ children: [packages.length, " dashboard", packages.length !== 1 ? "s" : ""]
3907
+ })]
3908
+ });
3909
+ };
3910
+
3275
3911
  var LayoutManagerModal = function LayoutManagerModal(_ref) {
3276
3912
  var open = _ref.open,
3277
3913
  setIsOpen = _ref.setIsOpen,
@@ -3279,52 +3915,59 @@ var LayoutManagerModal = function LayoutManagerModal(_ref) {
3279
3915
  _ref$menuItems = _ref.menuItems,
3280
3916
  menuItems = _ref$menuItems === void 0 ? [] : _ref$menuItems,
3281
3917
  _ref$onSaveMenuItem = _ref.onSaveMenuItem,
3282
- onSaveMenuItem = _ref$onSaveMenuItem === void 0 ? null : _ref$onSaveMenuItem;
3918
+ onSaveMenuItem = _ref$onSaveMenuItem === void 0 ? null : _ref$onSaveMenuItem,
3919
+ appId = _ref.appId,
3920
+ onReloadWorkspaces = _ref.onReloadWorkspaces;
3283
3921
  var _useContext = useContext(ThemeContext),
3284
3922
  themes = _useContext.themes,
3285
3923
  appThemeKey = _useContext.themeKey;
3286
- var _useState = useState(""),
3924
+ var _useState = useState(null),
3287
3925
  _useState2 = _slicedToArray(_useState, 2),
3288
- dashboardName = _useState2[0],
3289
- setDashboardName = _useState2[1];
3290
- var _useState3 = useState(layoutTemplates[0]),
3926
+ creationMethod = _useState2[0],
3927
+ setCreationMethod = _useState2[1];
3928
+ var _useState3 = useState(""),
3291
3929
  _useState4 = _slicedToArray(_useState3, 2),
3292
- selectedTemplate = _useState4[0],
3293
- setSelectedTemplate = _useState4[1];
3294
- var _useState5 = useState(0),
3930
+ dashboardName = _useState4[0],
3931
+ setDashboardName = _useState4[1];
3932
+ var _useState5 = useState(layoutTemplates[0]),
3295
3933
  _useState6 = _slicedToArray(_useState5, 2),
3296
- activeStep = _useState6[0],
3297
- setActiveStep = _useState6[1];
3298
- var _useState7 = useState(null),
3934
+ selectedTemplate = _useState6[0],
3935
+ setSelectedTemplate = _useState6[1];
3936
+ var _useState7 = useState(0),
3299
3937
  _useState8 = _slicedToArray(_useState7, 2),
3300
- selectedMenuId = _useState8[0],
3301
- setSelectedMenuId = _useState8[1];
3938
+ activeStep = _useState8[0],
3939
+ setActiveStep = _useState8[1];
3302
3940
  var _useState9 = useState(null),
3303
3941
  _useState0 = _slicedToArray(_useState9, 2),
3304
- selectedThemeKey = _useState0[0],
3305
- setSelectedThemeKey = _useState0[1];
3306
- var _useState1 = useState([]),
3942
+ selectedMenuId = _useState0[0],
3943
+ setSelectedMenuId = _useState0[1];
3944
+ var _useState1 = useState(null),
3307
3945
  _useState10 = _slicedToArray(_useState1, 2),
3308
- localMenuItems = _useState10[0],
3309
- setLocalMenuItems = _useState10[1];
3946
+ selectedThemeKey = _useState10[0],
3947
+ setSelectedThemeKey = _useState10[1];
3948
+ var _useState11 = useState([]),
3949
+ _useState12 = _slicedToArray(_useState11, 2),
3950
+ localMenuItems = _useState12[0],
3951
+ setLocalMenuItems = _useState12[1];
3310
3952
 
3311
3953
  // Inline new-folder form state
3312
- var _useState11 = useState(false),
3313
- _useState12 = _slicedToArray(_useState11, 2),
3314
- isCreatingFolder = _useState12[0],
3315
- setIsCreatingFolder = _useState12[1];
3316
- var _useState13 = useState(""),
3954
+ var _useState13 = useState(false),
3317
3955
  _useState14 = _slicedToArray(_useState13, 2),
3318
- newFolderName = _useState14[0],
3319
- setNewFolderName = _useState14[1];
3320
- var _useState15 = useState(null),
3956
+ isCreatingFolder = _useState14[0],
3957
+ setIsCreatingFolder = _useState14[1];
3958
+ var _useState15 = useState(""),
3321
3959
  _useState16 = _slicedToArray(_useState15, 2),
3322
- newFolderIcon = _useState16[0],
3323
- setNewFolderIcon = _useState16[1];
3960
+ newFolderName = _useState16[0],
3961
+ setNewFolderName = _useState16[1];
3962
+ var _useState17 = useState(null),
3963
+ _useState18 = _slicedToArray(_useState17, 2),
3964
+ newFolderIcon = _useState18[0],
3965
+ setNewFolderIcon = _useState18[1];
3324
3966
 
3325
3967
  // Reset state when modal opens
3326
3968
  useEffect(function () {
3327
3969
  if (open) {
3970
+ setCreationMethod(null);
3328
3971
  setDashboardName("");
3329
3972
  setActiveStep(0);
3330
3973
  setLocalMenuItems(menuItems || []);
@@ -3372,16 +4015,85 @@ var LayoutManagerModal = function LayoutManagerModal(_ref) {
3372
4015
  setSelectedTemplate(template);
3373
4016
  setActiveStep(2);
3374
4017
  }
4018
+ function handleMethodSelect(method) {
4019
+ if (method === "import") {
4020
+ handleImportFromFile();
4021
+ } else {
4022
+ setCreationMethod(method);
4023
+ }
4024
+ }
4025
+ function handleImportFromFile() {
4026
+ return _handleImportFromFile.apply(this, arguments);
4027
+ }
4028
+ function _handleImportFromFile() {
4029
+ _handleImportFromFile = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
4030
+ var result;
4031
+ return _regeneratorRuntime.wrap(function (_context) {
4032
+ while (1) switch (_context.prev = _context.next) {
4033
+ case 0:
4034
+ handleClose();
4035
+ _context.prev = 1;
4036
+ _context.next = 2;
4037
+ return window.mainApi.dashboardConfig.importDashboardConfig(appId);
4038
+ case 2:
4039
+ result = _context.sent;
4040
+ if (result && !result.canceled && result.success) {
4041
+ onReloadWorkspaces && onReloadWorkspaces();
4042
+ }
4043
+ _context.next = 4;
4044
+ break;
4045
+ case 3:
4046
+ _context.prev = 3;
4047
+ _context["catch"](1);
4048
+ case 4:
4049
+ case "end":
4050
+ return _context.stop();
4051
+ }
4052
+ }, _callee, null, [[1, 3]]);
4053
+ }));
4054
+ return _handleImportFromFile.apply(this, arguments);
4055
+ }
3375
4056
  var selectedFolder = localMenuItems.find(function (item) {
3376
4057
  return item.id === selectedMenuId;
3377
4058
  });
3378
- return /*#__PURE__*/jsxs(Modal, {
3379
- isOpen: open,
3380
- setIsOpen: setIsOpen,
3381
- width: "w-11/12 xl:w-5/6",
3382
- height: "h-5/6",
3383
- scrollable: false,
3384
- children: [/*#__PURE__*/jsx(Panel, {
4059
+
4060
+ // ─── Render body based on creationMethod ─────────────────────────
4061
+ function renderBody() {
4062
+ if (creationMethod === null) {
4063
+ return /*#__PURE__*/jsx(Panel, {
4064
+ backgroundColor: "bg-slate-800",
4065
+ padding: false,
4066
+ children: /*#__PURE__*/jsx(Panel.Body, {
4067
+ scrollable: false,
4068
+ className: "h-full",
4069
+ children: /*#__PURE__*/jsx("div", {
4070
+ className: "h-full p-6 pb-0",
4071
+ children: /*#__PURE__*/jsx(CreationMethodPicker, {
4072
+ onSelect: handleMethodSelect
4073
+ })
4074
+ })
4075
+ })
4076
+ });
4077
+ }
4078
+ if (creationMethod === "registry") {
4079
+ return /*#__PURE__*/jsx(Panel, {
4080
+ backgroundColor: "bg-slate-800",
4081
+ padding: false,
4082
+ children: /*#__PURE__*/jsx(Panel.Body, {
4083
+ scrollable: false,
4084
+ className: "h-full",
4085
+ children: /*#__PURE__*/jsx(DiscoverDashboardsDetail, {
4086
+ onBack: function onBack() {
4087
+ return setCreationMethod(null);
4088
+ },
4089
+ appId: appId
4090
+ })
4091
+ })
4092
+ });
4093
+ }
4094
+
4095
+ // creationMethod === "template" — existing 4-step wizard
4096
+ return /*#__PURE__*/jsx(Panel, {
3385
4097
  backgroundColor: "bg-slate-800",
3386
4098
  padding: false,
3387
4099
  children: /*#__PURE__*/jsx(Panel.Body, {
@@ -3639,13 +4351,45 @@ var LayoutManagerModal = function LayoutManagerModal(_ref) {
3639
4351
  })]
3640
4352
  })
3641
4353
  })
3642
- }), /*#__PURE__*/jsx(Modal.Footer, {
4354
+ });
4355
+ }
4356
+
4357
+ // ─── Render footer based on creationMethod ───────────────────────
4358
+ function renderFooter() {
4359
+ // Picker screen: just Cancel
4360
+ if (creationMethod === null) {
4361
+ return /*#__PURE__*/jsx(Modal.Footer, {
4362
+ children: /*#__PURE__*/jsx("div", {
4363
+ className: "flex flex-row space-x-2",
4364
+ children: /*#__PURE__*/jsx(Button, {
4365
+ onClick: handleClose,
4366
+ title: "Cancel",
4367
+ textSize: "text-base xl:text-lg",
4368
+ padding: "py-2 px-4",
4369
+ backgroundColor: "bg-gray-700",
4370
+ textColor: "text-gray-300",
4371
+ hoverTextColor: "hover:text-gray-100",
4372
+ hoverBackgroundColor: "hover:bg-gray-600"
4373
+ })
4374
+ })
4375
+ });
4376
+ }
4377
+
4378
+ // Registry screen: no footer (DiscoverDashboardsDetail has its own back button)
4379
+ if (creationMethod === "registry") {
4380
+ return null;
4381
+ }
4382
+
4383
+ // Template wizard footer
4384
+ return /*#__PURE__*/jsx(Modal.Footer, {
3643
4385
  children: /*#__PURE__*/jsxs("div", {
3644
4386
  className: "flex flex-row space-x-2",
3645
4387
  children: [activeStep === 0 && /*#__PURE__*/jsxs(Fragment, {
3646
4388
  children: [/*#__PURE__*/jsx(Button, {
3647
- onClick: handleClose,
3648
- title: "Cancel",
4389
+ onClick: function onClick() {
4390
+ return setCreationMethod(null);
4391
+ },
4392
+ title: "Back",
3649
4393
  textSize: "text-base xl:text-lg",
3650
4394
  padding: "py-2 px-4",
3651
4395
  backgroundColor: "bg-gray-700",
@@ -3738,7 +4482,15 @@ var LayoutManagerModal = function LayoutManagerModal(_ref) {
3738
4482
  })]
3739
4483
  })]
3740
4484
  })
3741
- })]
4485
+ });
4486
+ }
4487
+ return /*#__PURE__*/jsxs(Modal, {
4488
+ isOpen: open,
4489
+ setIsOpen: setIsOpen,
4490
+ width: "w-11/12 xl:w-5/6",
4491
+ height: "h-5/6",
4492
+ scrollable: false,
4493
+ children: [renderBody(), renderFooter()]
3742
4494
  });
3743
4495
  };
3744
4496
 
@@ -8324,8 +9076,8 @@ var deepEqual = function deepEqual(a, b, opts) {
8324
9076
 
8325
9077
  var deepEqual$1 = /*@__PURE__*/getDefaultExportFromCjs(deepEqual);
8326
9078
 
8327
- function ownKeys$w(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
8328
- function _objectSpread$w(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$w(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$w(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
9079
+ function ownKeys$x(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9080
+ function _objectSpread$x(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$x(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$x(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
8329
9081
  var PanelEditItem = function PanelEditItem(_ref) {
8330
9082
  var _ComponentManager$get;
8331
9083
  var workspace = _ref.workspace,
@@ -8351,35 +9103,6 @@ var PanelEditItem = function PanelEditItem(_ref) {
8351
9103
  var widgetConfig = itemSelected ? ComponentManager.config(itemSelected.component, itemSelected) : null;
8352
9104
  var providerRequirements = (widgetConfig === null || widgetConfig === void 0 ? void 0 : widgetConfig.providers) || [];
8353
9105
  var selectedProviders = (itemSelected === null || itemSelected === void 0 ? void 0 : itemSelected.selectedProviders) || {};
8354
- var notificationDefs = (widgetConfig === null || widgetConfig === void 0 ? void 0 : widgetConfig.notifications) || [];
8355
-
8356
- // Notification preferences for this widget instance
8357
- var _useState7 = useState({}),
8358
- _useState8 = _slicedToArray(_useState7, 2),
8359
- notifPrefs = _useState8[0],
8360
- setNotifPrefs = _useState8[1];
8361
- var widgetUuid = (itemSelected === null || itemSelected === void 0 ? void 0 : itemSelected.uuid) || (itemSelected === null || itemSelected === void 0 ? void 0 : itemSelected.uuidString);
8362
- useEffect(function () {
8363
- var _window$mainApi;
8364
- if (notificationDefs.length > 0 && widgetUuid && (_window$mainApi = window.mainApi) !== null && _window$mainApi !== void 0 && (_window$mainApi = _window$mainApi.notifications) !== null && _window$mainApi !== void 0 && _window$mainApi.getPreferences) {
8365
- window.mainApi.notifications.getPreferences().then(function (result) {
8366
- var _result$instances;
8367
- setNotifPrefs(((_result$instances = result.instances) === null || _result$instances === void 0 ? void 0 : _result$instances[widgetUuid]) || {});
8368
- });
8369
- }
8370
- }, [widgetUuid, notificationDefs.length]);
8371
- function handleNotifToggle(typeKey, value) {
8372
- var _window$mainApi2;
8373
- var updated = _objectSpread$w(_objectSpread$w({}, notifPrefs), {}, _defineProperty({}, typeKey, value));
8374
- setNotifPrefs(updated);
8375
- if ((_window$mainApi2 = window.mainApi) !== null && _window$mainApi2 !== void 0 && (_window$mainApi2 = _window$mainApi2.notifications) !== null && _window$mainApi2 !== void 0 && _window$mainApi2.setPreferences && widgetUuid) {
8376
- window.mainApi.notifications.setPreferences(widgetUuid, _defineProperty({}, typeKey, value));
8377
- }
8378
- }
8379
- function getNotifEnabled(typeKey, defaultEnabled) {
8380
- if (typeof notifPrefs[typeKey] === "boolean") return notifPrefs[typeKey];
8381
- return defaultEnabled;
8382
- }
8383
9106
  useEffect(function () {
8384
9107
  if (deepEqual$1(item, itemSelected) === false) {
8385
9108
  setItemSelected(function () {
@@ -8414,7 +9137,7 @@ var PanelEditItem = function PanelEditItem(_ref) {
8414
9137
  var uuid = newItem.uuid || newItem.uuidString;
8415
9138
  if (uuid) {
8416
9139
  workspaceTemp.selectedProviders = workspaceTemp.selectedProviders || {};
8417
- workspaceTemp.selectedProviders[uuid] = _objectSpread$w(_objectSpread$w({}, workspaceTemp.selectedProviders[uuid] || {}), {}, _defineProperty({}, providerType, providerId));
9140
+ workspaceTemp.selectedProviders[uuid] = _objectSpread$x(_objectSpread$x({}, workspaceTemp.selectedProviders[uuid] || {}), {}, _defineProperty({}, providerType, providerId));
8418
9141
  }
8419
9142
  onUpdate(newItem, workspaceTemp);
8420
9143
  forceUpdate();
@@ -8543,7 +9266,7 @@ var PanelEditItem = function PanelEditItem(_ref) {
8543
9266
  var _ref5 = _slicedToArray(_ref4, 2),
8544
9267
  name = _ref5[0],
8545
9268
  p = _ref5[1];
8546
- return _objectSpread$w({
9269
+ return _objectSpread$x({
8547
9270
  name: name
8548
9271
  }, p);
8549
9272
  });
@@ -8580,31 +9303,6 @@ var PanelEditItem = function PanelEditItem(_ref) {
8580
9303
  })]
8581
9304
  }, providerType);
8582
9305
  })]
8583
- }), notificationDefs.length > 0 && /*#__PURE__*/jsxs("div", {
8584
- className: "flex flex-col space-y-3",
8585
- children: [/*#__PURE__*/jsx(SubHeading3, {
8586
- title: "Notifications",
8587
- padding: false
8588
- }), notificationDefs.map(function (notif) {
8589
- return /*#__PURE__*/jsxs("div", {
8590
- className: "flex flex-row items-center justify-between py-1",
8591
- children: [/*#__PURE__*/jsxs("div", {
8592
- className: "flex flex-col",
8593
- children: [/*#__PURE__*/jsx("span", {
8594
- className: "text-sm",
8595
- children: notif.displayName
8596
- }), notif.description && /*#__PURE__*/jsx("span", {
8597
- className: "text-xs opacity-50",
8598
- children: notif.description
8599
- })]
8600
- }), /*#__PURE__*/jsx(Switch, {
8601
- checked: getNotifEnabled(notif.key, notif.defaultEnabled),
8602
- onChange: function onChange(value) {
8603
- return handleNotifToggle(notif.key, value);
8604
- }
8605
- })]
8606
- }, notif.key);
8607
- })]
8608
9306
  })]
8609
9307
  });
8610
9308
  };
@@ -8613,8 +9311,8 @@ var _excluded$5 = ["rows", "cols"];
8613
9311
  function _createForOfIteratorHelper$9(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray$9(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
8614
9312
  function _unsupportedIterableToArray$9(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$9(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$9(r, a) : void 0; } }
8615
9313
  function _arrayLikeToArray$9(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
8616
- function ownKeys$v(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
8617
- function _objectSpread$v(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$v(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$v(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
9314
+ function ownKeys$w(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9315
+ function _objectSpread$w(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$w(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$w(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
8618
9316
  var defaultGrid = {
8619
9317
  rows: 1,
8620
9318
  cols: 1,
@@ -8635,7 +9333,7 @@ function GridEditor(_ref) {
8635
9333
  setGrid = _useState2[1];
8636
9334
  var addRow = function addRow() {
8637
9335
  var newRow = grid.rows;
8638
- var newGrid = _objectSpread$v(_objectSpread$v({}, grid), {}, {
9336
+ var newGrid = _objectSpread$w(_objectSpread$w({}, grid), {}, {
8639
9337
  rows: grid.rows + 1
8640
9338
  });
8641
9339
  for (var col = 0; col < grid.cols; col++) {
@@ -8650,7 +9348,7 @@ function GridEditor(_ref) {
8650
9348
  };
8651
9349
  var addColumn = function addColumn() {
8652
9350
  var newCol = grid.cols;
8653
- var newGrid = _objectSpread$v(_objectSpread$v({}, grid), {}, {
9351
+ var newGrid = _objectSpread$w(_objectSpread$w({}, grid), {}, {
8654
9352
  cols: grid.cols + 1
8655
9353
  });
8656
9354
  for (var row = 0; row < grid.rows; row++) {
@@ -8683,8 +9381,8 @@ function GridEditor(_ref) {
8683
9381
  });
8684
9382
  }
8685
9383
  if (grid[nextKey]) {
8686
- var newGrid = _objectSpread$v({}, grid);
8687
- newGrid[currentKey] = _objectSpread$v(_objectSpread$v({}, newGrid[currentKey]), {}, {
9384
+ var newGrid = _objectSpread$w({}, grid);
9385
+ newGrid[currentKey] = _objectSpread$w(_objectSpread$w({}, newGrid[currentKey]), {}, {
8688
9386
  colSpan: newGrid[currentKey].colSpan + 1
8689
9387
  });
8690
9388
  delete newGrid[nextKey];
@@ -8697,8 +9395,8 @@ function GridEditor(_ref) {
8697
9395
  var currentKey = "".concat(row, ".").concat(col);
8698
9396
  var belowKey = "".concat(row + 1, ".").concat(col);
8699
9397
  if (grid[belowKey]) {
8700
- var newGrid = _objectSpread$v({}, grid);
8701
- newGrid[currentKey] = _objectSpread$v(_objectSpread$v({}, newGrid[currentKey]), {}, {
9398
+ var newGrid = _objectSpread$w({}, grid);
9399
+ newGrid[currentKey] = _objectSpread$w(_objectSpread$w({}, newGrid[currentKey]), {}, {
8702
9400
  rowSpan: newGrid[currentKey].rowSpan + 1
8703
9401
  });
8704
9402
  delete newGrid[belowKey];
@@ -8715,7 +9413,7 @@ function GridEditor(_ref) {
8715
9413
  var splitCell = function splitCell(row, col) {
8716
9414
  var key = "".concat(row, ".").concat(col);
8717
9415
  var cell = grid[key];
8718
- var newGrid = _objectSpread$v({}, grid);
9416
+ var newGrid = _objectSpread$w({}, grid);
8719
9417
 
8720
9418
  // we have to check the colspan, and since the colspan is greater than 1
8721
9419
  // Only handle horizontal split if colSpan > 1
@@ -8731,13 +9429,13 @@ function GridEditor(_ref) {
8731
9429
  var oldKey = "".concat(row, ".").concat(c);
8732
9430
  var newKey = "".concat(row, ".").concat(c + 1);
8733
9431
  if (newGrid[oldKey]) {
8734
- newGrid[newKey] = _objectSpread$v({}, newGrid[oldKey]);
9432
+ newGrid[newKey] = _objectSpread$w({}, newGrid[oldKey]);
8735
9433
  delete newGrid[oldKey];
8736
9434
  }
8737
9435
  }
8738
9436
 
8739
9437
  // Update the original cell's colSpan
8740
- newGrid[key] = _objectSpread$v(_objectSpread$v({}, cell), {}, {
9438
+ newGrid[key] = _objectSpread$w(_objectSpread$w({}, cell), {}, {
8741
9439
  colSpan: cell.colSpan - 1
8742
9440
  });
8743
9441
 
@@ -8749,7 +9447,7 @@ function GridEditor(_ref) {
8749
9447
  };
8750
9448
  }
8751
9449
  if (cell.rowSpan > 1) {
8752
- newGrid[key] = _objectSpread$v(_objectSpread$v({}, newGrid[key]), {}, {
9450
+ newGrid[key] = _objectSpread$w(_objectSpread$w({}, newGrid[key]), {}, {
8753
9451
  rowSpan: cell.rowSpan - 1
8754
9452
  });
8755
9453
  newGrid["".concat(row + 1, ".").concat(col)] = {
@@ -8868,7 +9566,7 @@ function GridEditor(_ref) {
8868
9566
  var fromKey = "".concat(from.row, ".").concat(from.col);
8869
9567
  var toKey = "".concat(to.row, ".").concat(to.col);
8870
9568
  if (fromKey === toKey) return;
8871
- var newGrid = _objectSpread$v({}, grid);
9569
+ var newGrid = _objectSpread$w({}, grid);
8872
9570
 
8873
9571
  // Swap the cells
8874
9572
  var temp = newGrid[fromKey];
@@ -8894,7 +9592,7 @@ function GridEditor(_ref) {
8894
9592
  // console.log("Grid updated:", sequencedGrid);
8895
9593
  }
8896
9594
  function resetGridLayout() {
8897
- var newGrid = _objectSpread$v({}, defaultGrid);
9595
+ var newGrid = _objectSpread$w({}, defaultGrid);
8898
9596
  setGrid(newGrid);
8899
9597
  onUpdate(newGrid);
8900
9598
  }
@@ -9172,6 +9870,72 @@ var PanelEditItemGrid = function PanelEditItemGrid(_ref) {
9172
9870
  });
9173
9871
  };
9174
9872
 
9873
+ function ownKeys$v(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9874
+ function _objectSpread$v(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$v(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$v(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
9875
+ var PanelEditItemNotifications = function PanelEditItemNotifications(_ref) {
9876
+ var item = _ref.item;
9877
+ _ref.workspace;
9878
+ _ref.onUpdate;
9879
+ var widgetConfig = item ? ComponentManager.config(item.component, item) : null;
9880
+ var notificationDefs = (widgetConfig === null || widgetConfig === void 0 ? void 0 : widgetConfig.notifications) || [];
9881
+ var _useState = useState({}),
9882
+ _useState2 = _slicedToArray(_useState, 2),
9883
+ notifPrefs = _useState2[0],
9884
+ setNotifPrefs = _useState2[1];
9885
+ var widgetUuid = (item === null || item === void 0 ? void 0 : item.uuid) || (item === null || item === void 0 ? void 0 : item.uuidString);
9886
+ useEffect(function () {
9887
+ var _window$mainApi;
9888
+ if (notificationDefs.length > 0 && widgetUuid && (_window$mainApi = window.mainApi) !== null && _window$mainApi !== void 0 && (_window$mainApi = _window$mainApi.notifications) !== null && _window$mainApi !== void 0 && _window$mainApi.getPreferences) {
9889
+ window.mainApi.notifications.getPreferences().then(function (result) {
9890
+ var _result$instances;
9891
+ setNotifPrefs(((_result$instances = result.instances) === null || _result$instances === void 0 ? void 0 : _result$instances[widgetUuid]) || {});
9892
+ });
9893
+ }
9894
+ }, [widgetUuid, notificationDefs.length]);
9895
+ function handleNotifToggle(typeKey, value) {
9896
+ var _window$mainApi2;
9897
+ var updated = _objectSpread$v(_objectSpread$v({}, notifPrefs), {}, _defineProperty({}, typeKey, value));
9898
+ setNotifPrefs(updated);
9899
+ if ((_window$mainApi2 = window.mainApi) !== null && _window$mainApi2 !== void 0 && (_window$mainApi2 = _window$mainApi2.notifications) !== null && _window$mainApi2 !== void 0 && _window$mainApi2.setPreferences && widgetUuid) {
9900
+ window.mainApi.notifications.setPreferences(widgetUuid, _defineProperty({}, typeKey, value));
9901
+ }
9902
+ }
9903
+ function getNotifEnabled(typeKey, defaultEnabled) {
9904
+ if (typeof notifPrefs[typeKey] === "boolean") return notifPrefs[typeKey];
9905
+ return defaultEnabled;
9906
+ }
9907
+ if (!item || notificationDefs.length === 0) return null;
9908
+ return /*#__PURE__*/jsx("div", {
9909
+ className: "flex flex-col flex-1 min-h-0 overflow-y-auto p-6 space-y-6",
9910
+ children: /*#__PURE__*/jsxs("div", {
9911
+ className: "flex flex-col space-y-3",
9912
+ children: [/*#__PURE__*/jsx(SubHeading3, {
9913
+ title: "Notifications",
9914
+ padding: false
9915
+ }), notificationDefs.map(function (notif) {
9916
+ return /*#__PURE__*/jsxs("div", {
9917
+ className: "flex flex-row items-center justify-between py-1",
9918
+ children: [/*#__PURE__*/jsxs("div", {
9919
+ className: "flex flex-col",
9920
+ children: [/*#__PURE__*/jsx("span", {
9921
+ className: "text-sm",
9922
+ children: notif.displayName
9923
+ }), notif.description && /*#__PURE__*/jsx("span", {
9924
+ className: "text-xs opacity-50",
9925
+ children: notif.description
9926
+ })]
9927
+ }), /*#__PURE__*/jsx(Switch, {
9928
+ checked: getNotifEnabled(notif.key, notif.defaultEnabled),
9929
+ onChange: function onChange(value) {
9930
+ return handleNotifToggle(notif.key, value);
9931
+ }
9932
+ })]
9933
+ }, notif.key);
9934
+ })]
9935
+ })
9936
+ });
9937
+ };
9938
+
9175
9939
  var PanelCode = function PanelCode(_ref) {
9176
9940
  var workspace = _ref.workspace,
9177
9941
  onUpdate = _ref.onUpdate,
@@ -9505,6 +10269,9 @@ var PanelEditItemHandlers = function PanelEditItemHandlers(_ref) {
9505
10269
  };
9506
10270
 
9507
10271
  var getSections = function getSections(item) {
10272
+ var _widgetConfig$notific;
10273
+ var widgetConfig = item ? ComponentManager.config(item.component, item) : null;
10274
+ var hasNotifications = (widgetConfig === null || widgetConfig === void 0 || (_widgetConfig$notific = widgetConfig.notifications) === null || _widgetConfig$notific === void 0 ? void 0 : _widgetConfig$notific.length) > 0;
9508
10275
  return [{
9509
10276
  key: "edit",
9510
10277
  label: "Settings",
@@ -9513,6 +10280,10 @@ var getSections = function getSections(item) {
9513
10280
  key: "grid_layout",
9514
10281
  label: "Layout",
9515
10282
  icon: "square"
10283
+ }] : []), _toConsumableArray(hasNotifications ? [{
10284
+ key: "notifications",
10285
+ label: "Notifications",
10286
+ icon: "bell"
9516
10287
  }] : []), _toConsumableArray((item === null || item === void 0 ? void 0 : item.workspace) !== "layout" ? [{
9517
10288
  key: "handlers",
9518
10289
  label: "Listeners",
@@ -9627,6 +10398,10 @@ var LayoutBuilderConfigModal = function LayoutBuilderConfigModal(_ref) {
9627
10398
  item: itemSelected,
9628
10399
  onUpdate: handleEditChange,
9629
10400
  workspace: workspaceSelected
10401
+ }), activeSection === "notifications" && /*#__PURE__*/jsx(PanelEditItemNotifications, {
10402
+ item: itemSelected,
10403
+ onUpdate: handleEditChange,
10404
+ workspace: workspaceSelected
9630
10405
  }), activeSection === "handlers" && /*#__PURE__*/jsx(PanelEditItemHandlers, {
9631
10406
  item: itemSelected,
9632
10407
  onUpdate: handleEditChange,
@@ -30618,102 +31393,6 @@ var ThemeManagerModal = function ThemeManagerModal(_ref) {
30618
31393
  });
30619
31394
  };
30620
31395
 
30621
- var StarRating = function StarRating(_ref) {
30622
- var appId = _ref.appId,
30623
- packageName = _ref.packageName,
30624
- _ref$interactive = _ref.interactive,
30625
- interactive = _ref$interactive === void 0 ? true : _ref$interactive;
30626
- var _useContext = useContext(ThemeContext),
30627
- currentTheme = _useContext.currentTheme;
30628
- var _useState = useState(0),
30629
- _useState2 = _slicedToArray(_useState, 2),
30630
- rating = _useState2[0],
30631
- setRating = _useState2[1];
30632
- var _useState3 = useState(0),
30633
- _useState4 = _slicedToArray(_useState3, 2),
30634
- hoverRating = _useState4[0],
30635
- setHoverRating = _useState4[1];
30636
- var _useState5 = useState(true),
30637
- _useState6 = _slicedToArray(_useState5, 2),
30638
- loading = _useState6[0],
30639
- setLoading = _useState6[1];
30640
- useEffect(function () {
30641
- var _window$mainApi;
30642
- if (!appId || !packageName) return;
30643
- var cancelled = false;
30644
- setLoading(true);
30645
- (_window$mainApi = window.mainApi) === null || _window$mainApi === void 0 || (_window$mainApi = _window$mainApi.dashboardRatings) === null || _window$mainApi === void 0 || _window$mainApi.getDashboardRating(appId, packageName).then(function (result) {
30646
- if (!cancelled && result !== null && result !== void 0 && result.rating) {
30647
- setRating(result.rating);
30648
- }
30649
- })["catch"](function () {})["finally"](function () {
30650
- if (!cancelled) setLoading(false);
30651
- });
30652
- return function () {
30653
- cancelled = true;
30654
- };
30655
- }, [appId, packageName]);
30656
- function handleClick(_x) {
30657
- return _handleClick.apply(this, arguments);
30658
- }
30659
- function _handleClick() {
30660
- _handleClick = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(value) {
30661
- var newRating, _window$mainApi2;
30662
- return _regeneratorRuntime.wrap(function (_context) {
30663
- while (1) switch (_context.prev = _context.next) {
30664
- case 0:
30665
- if (!(!interactive || !appId || !packageName)) {
30666
- _context.next = 1;
30667
- break;
30668
- }
30669
- return _context.abrupt("return");
30670
- case 1:
30671
- newRating = value === rating ? 0 : value;
30672
- setRating(newRating);
30673
- _context.prev = 2;
30674
- _context.next = 3;
30675
- return (_window$mainApi2 = window.mainApi) === null || _window$mainApi2 === void 0 || (_window$mainApi2 = _window$mainApi2.dashboardRatings) === null || _window$mainApi2 === void 0 ? void 0 : _window$mainApi2.saveDashboardRating(appId, packageName, newRating);
30676
- case 3:
30677
- _context.next = 5;
30678
- break;
30679
- case 4:
30680
- _context.prev = 4;
30681
- _context["catch"](2);
30682
- case 5:
30683
- case "end":
30684
- return _context.stop();
30685
- }
30686
- }, _callee, null, [[2, 4]]);
30687
- }));
30688
- return _handleClick.apply(this, arguments);
30689
- }
30690
- if (loading) return null;
30691
- var displayRating = hoverRating || rating;
30692
- return /*#__PURE__*/jsx("div", {
30693
- className: "flex items-center gap-0.5",
30694
- onMouseLeave: function onMouseLeave() {
30695
- return setHoverRating(0);
30696
- },
30697
- children: [1, 2, 3, 4, 5].map(function (star) {
30698
- return /*#__PURE__*/jsx("button", {
30699
- type: "button",
30700
- disabled: !interactive,
30701
- onClick: function onClick() {
30702
- return handleClick(star);
30703
- },
30704
- onMouseEnter: function onMouseEnter() {
30705
- return interactive && setHoverRating(star);
30706
- },
30707
- className: "p-0.5 transition-colors ".concat(interactive ? "cursor-pointer hover:scale-110" : "cursor-default"),
30708
- children: /*#__PURE__*/jsx(FontAwesomeIcon, {
30709
- icon: star <= displayRating ? "star" : ["far", "star"],
30710
- className: "h-3.5 w-3.5 ".concat(star <= displayRating ? "text-yellow-400" : currentTheme["text-primary-medium"] || "text-gray-500")
30711
- })
30712
- }, star);
30713
- })
30714
- });
30715
- };
30716
-
30717
31396
  var DASHBOARD_TAGS = ["productivity", "monitoring", "analytics", "communication", "developer", "sales", "marketing", "finance", "project-management", "social", "news", "utilities"];
30718
31397
 
30719
31398
  /**
@@ -31803,471 +32482,6 @@ var DashboardDetail = function DashboardDetail(_ref2) {
31803
32482
  });
31804
32483
  };
31805
32484
 
31806
- var RegistryDashboardDetail = function RegistryDashboardDetail(_ref) {
31807
- var dashboardPackage = _ref.dashboardPackage,
31808
- appId = _ref.appId;
31809
- var _useContext = useContext(ThemeContext),
31810
- currentTheme = _useContext.currentTheme;
31811
- var panelStyles = getStylesForItem(themeObjects.PANEL, currentTheme, {
31812
- grow: false
31813
- });
31814
- var _useState = useState(null),
31815
- _useState2 = _slicedToArray(_useState, 2),
31816
- preview = _useState2[0],
31817
- setPreview = _useState2[1];
31818
- var _useState3 = useState(false),
31819
- _useState4 = _slicedToArray(_useState3, 2),
31820
- previewLoading = _useState4[0],
31821
- setPreviewLoading = _useState4[1];
31822
- var _useState5 = useState(false),
31823
- _useState6 = _slicedToArray(_useState5, 2),
31824
- isInstalling = _useState6[0],
31825
- setIsInstalling = _useState6[1];
31826
- var _useState7 = useState(null),
31827
- _useState8 = _slicedToArray(_useState7, 2),
31828
- installResult = _useState8[0],
31829
- setInstallResult = _useState8[1];
31830
- var pkg = dashboardPackage;
31831
- if (!pkg) return null;
31832
-
31833
- // Load preview data on mount
31834
- // eslint-disable-next-line react-hooks/rules-of-hooks
31835
- useEffect(function () {
31836
- var _window$mainApi;
31837
- if (!pkg.name) return;
31838
- var cancelled = false;
31839
- setPreviewLoading(true);
31840
- setPreview(null);
31841
- setInstallResult(null);
31842
- (_window$mainApi = window.mainApi) === null || _window$mainApi === void 0 || (_window$mainApi = _window$mainApi.dashboardConfig) === null || _window$mainApi === void 0 || _window$mainApi.getDashboardPreview(pkg.name).then(function (result) {
31843
- if (!cancelled) setPreview(result);
31844
- })["catch"](function (err) {
31845
- })["finally"](function () {
31846
- if (!cancelled) setPreviewLoading(false);
31847
- });
31848
- return function () {
31849
- cancelled = true;
31850
- };
31851
- }, [pkg.name]);
31852
- function handleInstall() {
31853
- return _handleInstall.apply(this, arguments);
31854
- }
31855
- function _handleInstall() {
31856
- _handleInstall = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
31857
- var _result$workspace, result, _t;
31858
- return _regeneratorRuntime.wrap(function (_context) {
31859
- while (1) switch (_context.prev = _context.next) {
31860
- case 0:
31861
- if (!(!appId || !pkg.name)) {
31862
- _context.next = 1;
31863
- break;
31864
- }
31865
- return _context.abrupt("return");
31866
- case 1:
31867
- setIsInstalling(true);
31868
- setInstallResult(null);
31869
- _context.prev = 2;
31870
- _context.next = 3;
31871
- return window.mainApi.dashboardConfig.installDashboardFromRegistry(appId, pkg.name);
31872
- case 3:
31873
- result = _context.sent;
31874
- setInstallResult({
31875
- status: result !== null && result !== void 0 && result.success ? "success" : "error",
31876
- message: result !== null && result !== void 0 && result.success ? "Dashboard \"".concat(((_result$workspace = result.workspace) === null || _result$workspace === void 0 ? void 0 : _result$workspace.name) || pkg.name, "\" installed successfully.") : (result === null || result === void 0 ? void 0 : result.error) || "Installation failed."
31877
- });
31878
- _context.next = 5;
31879
- break;
31880
- case 4:
31881
- _context.prev = 4;
31882
- _t = _context["catch"](2);
31883
- setInstallResult({
31884
- status: "error",
31885
- message: _t.message || "Failed to install dashboard."
31886
- });
31887
- case 5:
31888
- _context.prev = 5;
31889
- setIsInstalling(false);
31890
- return _context.finish(5);
31891
- case 6:
31892
- case "end":
31893
- return _context.stop();
31894
- }
31895
- }, _callee, null, [[2, 4, 5, 6]]);
31896
- }));
31897
- return _handleInstall.apply(this, arguments);
31898
- }
31899
- var compatibility = preview === null || preview === void 0 ? void 0 : preview.compatibility;
31900
- var widgetDeps = (preview === null || preview === void 0 ? void 0 : preview.widgets) || pkg.widgets || [];
31901
- var providers = (preview === null || preview === void 0 ? void 0 : preview.providers) || [];
31902
- var wiring = (preview === null || preview === void 0 ? void 0 : preview.wiring) || [];
31903
- function getCompatIcon(status) {
31904
- if (status === "installed") return {
31905
- icon: "circle-check",
31906
- color: "text-green-400"
31907
- };
31908
- if (status === "available") return {
31909
- icon: "circle-down",
31910
- color: "text-blue-400"
31911
- };
31912
- return {
31913
- icon: "circle-xmark",
31914
- color: "text-red-400"
31915
- };
31916
- }
31917
- return /*#__PURE__*/jsxs("div", {
31918
- className: "flex flex-col flex-1 min-h-0",
31919
- children: [/*#__PURE__*/jsxs("div", {
31920
- className: "flex-1 min-h-0 overflow-y-auto p-6 space-y-6 ".concat(panelStyles.textColor || "text-gray-200"),
31921
- children: [/*#__PURE__*/jsxs("div", {
31922
- className: "flex flex-row items-center gap-3",
31923
- children: [/*#__PURE__*/jsx("div", {
31924
- className: "h-5 w-5 flex-shrink-0 flex items-center justify-center",
31925
- children: /*#__PURE__*/jsx(FontAwesomeIcon, {
31926
- icon: pkg.icon || "clone",
31927
- className: "h-5 w-5"
31928
- })
31929
- }), /*#__PURE__*/jsxs("div", {
31930
- children: [/*#__PURE__*/jsx(SubHeading3, {
31931
- title: pkg.displayName || pkg.name,
31932
- padding: false
31933
- }), /*#__PURE__*/jsxs("div", {
31934
- className: "flex items-center gap-2 mt-0.5",
31935
- children: [/*#__PURE__*/jsxs("span", {
31936
- className: "text-sm opacity-60",
31937
- children: ["by ", pkg.author || "Unknown"]
31938
- }), pkg.version && /*#__PURE__*/jsxs("span", {
31939
- className: "text-xs px-2 py-0.5 rounded ".concat(currentTheme["bg-primary-medium"], " opacity-70"),
31940
- children: ["v", pkg.version]
31941
- })]
31942
- })]
31943
- })]
31944
- }), appId && /*#__PURE__*/jsx(StarRating, {
31945
- appId: appId,
31946
- packageName: pkg.name,
31947
- interactive: false
31948
- }), /*#__PURE__*/jsx("hr", {
31949
- className: currentTheme["border-primary-medium"]
31950
- }), pkg.description && /*#__PURE__*/jsx("p", {
31951
- className: "text-sm",
31952
- children: pkg.description
31953
- }), pkg.tags && pkg.tags.length > 0 && /*#__PURE__*/jsx("div", {
31954
- className: "flex flex-wrap gap-1",
31955
- children: pkg.tags.map(function (tag) {
31956
- return /*#__PURE__*/jsx("span", {
31957
- className: "text-xs px-2 py-0.5 rounded ".concat(currentTheme["bg-primary-medium"], " opacity-60"),
31958
- children: tag
31959
- }, tag);
31960
- })
31961
- }), /*#__PURE__*/jsxs("div", {
31962
- children: [/*#__PURE__*/jsx("span", {
31963
- className: "text-xs font-semibold opacity-50 mb-1 block",
31964
- children: "REQUIRED WIDGETS"
31965
- }), previewLoading ? /*#__PURE__*/jsxs("div", {
31966
- className: "flex items-center gap-2 py-2",
31967
- children: [/*#__PURE__*/jsx("div", {
31968
- className: "animate-spin rounded-full h-4 w-4 border-b-2 border-blue-500"
31969
- }), /*#__PURE__*/jsx("span", {
31970
- className: "text-xs opacity-50",
31971
- children: "Checking compatibility..."
31972
- })]
31973
- }) : /*#__PURE__*/jsx("div", {
31974
- className: "space-y-1.5",
31975
- children: widgetDeps.map(function (w, idx) {
31976
- var _compatibility$widget;
31977
- var status = (compatibility === null || compatibility === void 0 || (_compatibility$widget = compatibility.widgets) === null || _compatibility$widget === void 0 ? void 0 : _compatibility$widget[w.name || w.packageName]) || "unknown";
31978
- var compat = getCompatIcon(status);
31979
- return /*#__PURE__*/jsxs("div", {
31980
- className: "p-2 rounded ".concat(currentTheme["bg-primary-medium"], " flex items-center gap-2"),
31981
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
31982
- icon: compat.icon,
31983
- className: "h-3.5 w-3.5 ".concat(compat.color)
31984
- }), /*#__PURE__*/jsx("span", {
31985
- className: "text-sm",
31986
- children: w.displayName || w.name || w.packageName
31987
- }), /*#__PURE__*/jsx("span", {
31988
- className: "text-xs opacity-40 ml-auto",
31989
- children: status === "installed" ? "Installed" : status === "available" ? "Will install" : "Unavailable"
31990
- })]
31991
- }, idx);
31992
- })
31993
- })]
31994
- }), providers.length > 0 && /*#__PURE__*/jsxs("div", {
31995
- children: [/*#__PURE__*/jsx("span", {
31996
- className: "text-xs font-semibold opacity-50 mb-1 block",
31997
- children: "REQUIRED PROVIDERS"
31998
- }), /*#__PURE__*/jsx("div", {
31999
- className: "space-y-1",
32000
- children: providers.map(function (p, idx) {
32001
- return /*#__PURE__*/jsxs("div", {
32002
- className: "flex items-center gap-2",
32003
- children: [/*#__PURE__*/jsx("span", {
32004
- className: "text-xs px-1.5 py-0.5 rounded bg-blue-900/30 text-blue-400",
32005
- children: p.type
32006
- }), p.required && /*#__PURE__*/jsx("span", {
32007
- className: "text-[10px] opacity-40",
32008
- children: "Required"
32009
- })]
32010
- }, idx);
32011
- })
32012
- })]
32013
- }), wiring.length > 0 && /*#__PURE__*/jsxs("div", {
32014
- children: [/*#__PURE__*/jsx("span", {
32015
- className: "text-xs font-semibold opacity-50 mb-1 block",
32016
- children: "EVENT WIRING"
32017
- }), /*#__PURE__*/jsx("div", {
32018
- className: "space-y-1",
32019
- children: wiring.map(function (w, idx) {
32020
- return /*#__PURE__*/jsxs("div", {
32021
- className: "text-xs p-2 rounded ".concat(currentTheme["bg-primary-medium"], " opacity-70"),
32022
- children: [/*#__PURE__*/jsx("span", {
32023
- className: "font-medium",
32024
- children: w.from || "Source"
32025
- }), /*#__PURE__*/jsx(FontAwesomeIcon, {
32026
- icon: "arrow-right",
32027
- className: "h-2.5 w-2.5 mx-1.5 opacity-50"
32028
- }), /*#__PURE__*/jsx("span", {
32029
- className: "font-medium",
32030
- children: w.to || "Target"
32031
- }), w.event && /*#__PURE__*/jsxs("span", {
32032
- className: "opacity-50 ml-1.5",
32033
- children: ["(", w.event, ")"]
32034
- })]
32035
- }, idx);
32036
- })
32037
- })]
32038
- }), installResult && /*#__PURE__*/jsx("div", {
32039
- className: "p-2 rounded border ".concat(installResult.status === "success" ? "bg-green-900/20 border-green-700" : "bg-red-900/30 border-red-700"),
32040
- children: /*#__PURE__*/jsxs("div", {
32041
- className: "flex items-center gap-2",
32042
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
32043
- icon: installResult.status === "success" ? "circle-check" : "circle-xmark",
32044
- className: "h-4 w-4 ".concat(installResult.status === "success" ? "text-green-400" : "text-red-400")
32045
- }), /*#__PURE__*/jsx("span", {
32046
- className: "text-sm ".concat(installResult.status === "error" ? "text-red-400" : ""),
32047
- children: installResult.message
32048
- })]
32049
- })
32050
- })]
32051
- }), (installResult === null || installResult === void 0 ? void 0 : installResult.status) !== "success" && /*#__PURE__*/jsx("div", {
32052
- className: "flex items-center justify-end px-6 py-3 border-t ".concat(currentTheme["border-primary-medium"]),
32053
- children: /*#__PURE__*/jsx(Button, {
32054
- title: isInstalling ? "Installing..." : "Install Dashboard",
32055
- bgColor: "bg-blue-600",
32056
- hoverBackgroundColor: isInstalling ? "" : "hover:bg-blue-700",
32057
- textSize: "text-sm",
32058
- padding: "py-1.5 px-4",
32059
- onClick: handleInstall,
32060
- disabled: isInstalling
32061
- })
32062
- })]
32063
- });
32064
- };
32065
-
32066
- var DiscoverDashboardsDetail = function DiscoverDashboardsDetail(_ref) {
32067
- var onBack = _ref.onBack,
32068
- appId = _ref.appId;
32069
- var _useContext = useContext(ThemeContext),
32070
- currentTheme = _useContext.currentTheme;
32071
- var panelStyles = getStylesForItem(themeObjects.PANEL, currentTheme, {
32072
- grow: false
32073
- });
32074
- var _useState = useState([]),
32075
- _useState2 = _slicedToArray(_useState, 2),
32076
- packages = _useState2[0],
32077
- setPackages = _useState2[1];
32078
- var _useState3 = useState(false),
32079
- _useState4 = _slicedToArray(_useState3, 2),
32080
- isLoading = _useState4[0],
32081
- setIsLoading = _useState4[1];
32082
- var _useState5 = useState(null),
32083
- _useState6 = _slicedToArray(_useState5, 2),
32084
- error = _useState6[0],
32085
- setError = _useState6[1];
32086
- var _useState7 = useState(""),
32087
- _useState8 = _slicedToArray(_useState7, 2),
32088
- searchQuery = _useState8[0],
32089
- setSearchQuery = _useState8[1];
32090
- var _useState9 = useState(null),
32091
- _useState0 = _slicedToArray(_useState9, 2),
32092
- selectedPackageName = _useState0[0],
32093
- setSelectedPackageName = _useState0[1];
32094
- var search = useCallback(/*#__PURE__*/function () {
32095
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(query) {
32096
- var _window$mainApi;
32097
- var result, _t;
32098
- return _regeneratorRuntime.wrap(function (_context) {
32099
- while (1) switch (_context.prev = _context.next) {
32100
- case 0:
32101
- if ((_window$mainApi = window.mainApi) !== null && _window$mainApi !== void 0 && (_window$mainApi = _window$mainApi.registry) !== null && _window$mainApi !== void 0 && _window$mainApi.searchDashboards) {
32102
- _context.next = 1;
32103
- break;
32104
- }
32105
- setPackages([]);
32106
- return _context.abrupt("return");
32107
- case 1:
32108
- setIsLoading(true);
32109
- setError(null);
32110
- _context.prev = 2;
32111
- _context.next = 3;
32112
- return window.mainApi.registry.searchDashboards(query || "", {});
32113
- case 3:
32114
- result = _context.sent;
32115
- setPackages((result === null || result === void 0 ? void 0 : result.packages) || []);
32116
- _context.next = 5;
32117
- break;
32118
- case 4:
32119
- _context.prev = 4;
32120
- _t = _context["catch"](2);
32121
- setError(_t.message || "Failed to search dashboard registry");
32122
- setPackages([]);
32123
- case 5:
32124
- _context.prev = 5;
32125
- setIsLoading(false);
32126
- return _context.finish(5);
32127
- case 6:
32128
- case "end":
32129
- return _context.stop();
32130
- }
32131
- }, _callee, null, [[2, 4, 5, 6]]);
32132
- }));
32133
- return function (_x) {
32134
- return _ref2.apply(this, arguments);
32135
- };
32136
- }(), []);
32137
-
32138
- // Debounce search on query changes
32139
- useEffect(function () {
32140
- var timer = setTimeout(function () {
32141
- search(searchQuery);
32142
- }, 300);
32143
- return function () {
32144
- return clearTimeout(timer);
32145
- };
32146
- // eslint-disable-next-line react-hooks/exhaustive-deps
32147
- }, [searchQuery]);
32148
- var retry = function retry() {
32149
- return search(searchQuery);
32150
- };
32151
- var selectedPackage = selectedPackageName ? packages.find(function (p) {
32152
- return p.name === selectedPackageName;
32153
- }) : null;
32154
-
32155
- // If a package is selected, show its detail inline
32156
- if (selectedPackage) {
32157
- return /*#__PURE__*/jsxs("div", {
32158
- className: "flex flex-col flex-1 min-h-0",
32159
- children: [/*#__PURE__*/jsx("div", {
32160
- className: "flex-shrink-0 px-4 pt-4",
32161
- children: /*#__PURE__*/jsxs("button", {
32162
- type: "button",
32163
- onClick: function onClick() {
32164
- return setSelectedPackageName(null);
32165
- },
32166
- className: "flex items-center gap-1.5 text-sm opacity-60 hover:opacity-100 transition-opacity",
32167
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
32168
- icon: "arrow-left",
32169
- className: "h-3 w-3"
32170
- }), /*#__PURE__*/jsx("span", {
32171
- children: "Back"
32172
- })]
32173
- })
32174
- }), /*#__PURE__*/jsx(RegistryDashboardDetail, {
32175
- dashboardPackage: selectedPackage,
32176
- appId: appId
32177
- })]
32178
- });
32179
- }
32180
-
32181
- // Package list view
32182
- var listBody;
32183
- if (isLoading) {
32184
- listBody = /*#__PURE__*/jsx("div", {
32185
- className: "flex items-center justify-center py-12",
32186
- children: /*#__PURE__*/jsxs("div", {
32187
- className: "text-center",
32188
- children: [/*#__PURE__*/jsx("div", {
32189
- className: "animate-spin rounded-full h-6 w-6 border-b-2 border-blue-500 mx-auto mb-3"
32190
- }), /*#__PURE__*/jsx(Paragraph, {
32191
- className: "text-sm opacity-50",
32192
- children: "Loading dashboards..."
32193
- })]
32194
- })
32195
- });
32196
- } else if (error) {
32197
- listBody = /*#__PURE__*/jsxs("div", {
32198
- className: "px-4 py-8 text-center",
32199
- children: [/*#__PURE__*/jsx(Paragraph, {
32200
- className: "text-sm text-red-400 mb-3",
32201
- children: error
32202
- }), /*#__PURE__*/jsx(Button, {
32203
- title: "Retry",
32204
- bgColor: "bg-gray-700",
32205
- hoverBackgroundColor: "hover:bg-gray-600",
32206
- textSize: "text-sm",
32207
- padding: "py-1 px-3",
32208
- onClick: retry
32209
- })]
32210
- });
32211
- } else if (packages.length === 0) {
32212
- listBody = /*#__PURE__*/jsx("div", {
32213
- className: "px-4 py-8 text-center",
32214
- children: /*#__PURE__*/jsx(Paragraph, {
32215
- className: "text-sm opacity-50",
32216
- children: searchQuery ? "No dashboards match your search." : "No dashboard packages available."
32217
- })
32218
- });
32219
- } else {
32220
- listBody = /*#__PURE__*/jsx("div", {
32221
- className: "space-y-1",
32222
- children: packages.map(function (pkg) {
32223
- var widgetCount = (pkg.widgets || []).length;
32224
- return /*#__PURE__*/jsx(Sidebar.Item, {
32225
- icon: /*#__PURE__*/jsx(FontAwesomeIcon, {
32226
- icon: pkg.icon || "clone",
32227
- className: "h-3.5 w-3.5"
32228
- }),
32229
- onClick: function onClick() {
32230
- return setSelectedPackageName(pkg.name);
32231
- },
32232
- badge: widgetCount > 0 ? "".concat(widgetCount) : undefined,
32233
- children: pkg.displayName || pkg.name
32234
- }, pkg.name);
32235
- })
32236
- });
32237
- }
32238
- return /*#__PURE__*/jsxs("div", {
32239
- className: "flex flex-col flex-1 min-h-0 ".concat(panelStyles.textColor || "text-gray-200"),
32240
- children: [/*#__PURE__*/jsx("div", {
32241
- className: "flex-shrink-0 px-4 pt-4",
32242
- children: /*#__PURE__*/jsxs("button", {
32243
- type: "button",
32244
- onClick: onBack,
32245
- className: "flex items-center gap-1.5 text-sm opacity-60 hover:opacity-100 transition-opacity",
32246
- children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
32247
- icon: "arrow-left",
32248
- className: "h-3 w-3"
32249
- }), /*#__PURE__*/jsx("span", {
32250
- children: "Back"
32251
- })]
32252
- })
32253
- }), /*#__PURE__*/jsx("div", {
32254
- className: "flex-shrink-0 px-4 py-3",
32255
- children: /*#__PURE__*/jsx(SearchInput, {
32256
- value: searchQuery,
32257
- onChange: setSearchQuery,
32258
- placeholder: "Search dashboards...",
32259
- inputClassName: "py-1.5 text-xs"
32260
- })
32261
- }), /*#__PURE__*/jsx("div", {
32262
- className: "flex-1 min-h-0 overflow-y-auto px-2",
32263
- children: listBody
32264
- }), !isLoading && !error && packages.length > 0 && /*#__PURE__*/jsxs("div", {
32265
- className: "flex-shrink-0 px-4 py-2 text-[10px] opacity-40 border-t border-white/10",
32266
- children: [packages.length, " dashboard", packages.length !== 1 ? "s" : ""]
32267
- })]
32268
- });
32269
- };
32270
-
32271
32485
  function ownKeys$9(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
32272
32486
  function _objectSpread$9(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$9(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$9(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
32273
32487
  var DashboardsSection = function DashboardsSection(_ref) {
@@ -40471,9 +40685,21 @@ var DashboardStageInner = function DashboardStageInner(_ref2) {
40471
40685
  _useState36 = _slicedToArray(_useState35, 2),
40472
40686
  appSettingsInitialSection = _useState36[0],
40473
40687
  setAppSettingsInitialSection = _useState36[1];
40688
+ var _useState37 = useState(null),
40689
+ _useState38 = _slicedToArray(_useState37, 2),
40690
+ appSettingsInitialProvider = _useState38[0],
40691
+ setAppSettingsInitialProvider = _useState38[1];
40692
+ var _useState39 = useState(false),
40693
+ _useState40 = _slicedToArray(_useState39, 2),
40694
+ appSettingsCreateProvider = _useState40[0],
40695
+ setAppSettingsCreateProvider = _useState40[1];
40474
40696
  function openAppSettings() {
40475
40697
  var section = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "general";
40698
+ var providerName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
40699
+ var createProvider = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
40476
40700
  setAppSettingsInitialSection(section);
40701
+ setAppSettingsInitialProvider(providerName);
40702
+ setAppSettingsCreateProvider(createProvider);
40477
40703
  setIsAppSettingsOpen(true);
40478
40704
  }
40479
40705
  function handleProfileUpdated() {
@@ -41254,8 +41480,16 @@ var DashboardStageInner = function DashboardStageInner(_ref2) {
41254
41480
  }), !popout && /*#__PURE__*/jsxs(Fragment, {
41255
41481
  children: [/*#__PURE__*/jsx(AppSettingsModal, {
41256
41482
  isOpen: isAppSettingsOpen,
41257
- setIsOpen: setIsAppSettingsOpen,
41483
+ setIsOpen: function setIsOpen(open) {
41484
+ setIsAppSettingsOpen(open);
41485
+ if (!open) {
41486
+ setAppSettingsInitialProvider(null);
41487
+ setAppSettingsCreateProvider(false);
41488
+ }
41489
+ },
41258
41490
  initialSection: appSettingsInitialSection,
41491
+ initialProviderName: appSettingsInitialProvider,
41492
+ initialCreateProvider: appSettingsCreateProvider,
41259
41493
  workspaces: workspaceConfig,
41260
41494
  menuItems: menuItems,
41261
41495
  dashApi: dashApi,
@@ -41295,7 +41529,9 @@ var DashboardStageInner = function DashboardStageInner(_ref2) {
41295
41529
  setIsOpen: setIsLayoutPickerOpen,
41296
41530
  onCreateWorkspace: handleCreateFromTemplate,
41297
41531
  menuItems: menuItems,
41298
- onSaveMenuItem: handleSaveNewMenuItem
41532
+ onSaveMenuItem: handleSaveNewMenuItem,
41533
+ appId: credentials === null || credentials === void 0 ? void 0 : credentials.appId,
41534
+ onReloadWorkspaces: loadWorkspaces
41299
41535
  })]
41300
41536
  })]
41301
41537
  }), !popout && /*#__PURE__*/jsx(DashCommandPalette, {
@@ -41314,7 +41550,10 @@ var DashboardStageInner = function DashboardStageInner(_ref2) {
41314
41550
  },
41315
41551
  providers: (appContext === null || appContext === void 0 ? void 0 : appContext.providers) || {},
41316
41552
  onCreateNewProvider: function onCreateNewProvider() {
41317
- return openAppSettings("providers");
41553
+ return openAppSettings("providers", null, true);
41554
+ },
41555
+ onOpenProviderDetail: function onOpenProviderDetail(name) {
41556
+ return openAppSettings("providers", name);
41318
41557
  },
41319
41558
  themes: themes || {},
41320
41559
  currentThemeKey: themeKey,
@@ -42705,5 +42944,5 @@ var WorkspaceMenu = function WorkspaceMenu(_ref) {
42705
42944
 
42706
42945
  ComponentManager.registerContainerTypes(LayoutContainer, LayoutGridContainer);
42707
42946
 
42708
- export { ALGOLIA_ANALYTICS_FOR_QUERY, ALGOLIA_ANALYTICS_FOR_QUERY_COMPLETE, ALGOLIA_ANALYTICS_FOR_QUERY_ERROR, ALGOLIA_LIST_INDICES, ALGOLIA_LIST_INDICES_COMPLETE, ALGOLIA_LIST_INDICES_ERROR, AVAILABLE_COLORS, AddMenuItemModal, AdvancedMcpConfig, AppContext, AppSettingsModal, AppThemeScope, AppWrapper, CHOOSE_FILE, CHOOSE_FILE_COMPLETE, CHOOSE_FILE_ERROR, ColorModel, ComponentConfigModel, ComponentManager, ContextModel, DATA_JSON_TO_CSV_FILE, DATA_JSON_TO_CSV_FILE_COMPLETE, DATA_JSON_TO_CSV_FILE_ERROR, DATA_JSON_TO_CSV_STRING, DATA_JSON_TO_CSV_STRING_COMPLETE, DATA_JSON_TO_CSV_STRING_ERROR, DATA_READ_FROM_FILE, DATA_READ_FROM_FILE_COMPLETE, DATA_READ_FROM_FILE_ERROR, DATA_SAVE_TO_FILE, DATA_SAVE_TO_FILE_COMPLETE, DATA_SAVE_TO_FILE_ERROR, DashCommandPalette, DashNavbar, DashSidebar, DashTabBar, DashboardStage as Dashboard, DashboardApi, DashboardContext, DashboardFooter, DashboardHeader, DashboardMenuItem, DashboardModel, DashboardMonitor, DashboardPublisher, DashboardStage, DashboardThemeProvider, DashboardWrapper, ElectronDashboardApi, ErrorBoundary, ExternalWidget, GRID_CELL_WIDGET_TYPE, HARMONY_STRATEGIES, LAYOUT_LIST, LAYOUT_LIST_COMPLETE, LAYOUT_LIST_ERROR, LAYOUT_SAVE, LAYOUT_SAVE_COMPLETE, LAYOUT_SAVE_ERROR, Layout, LayoutBuilder, LayoutBuilderAddItemModal, LayoutBuilderConfigContainerMenuItem, LayoutBuilderConfigMenuItem, LayoutBuilderConfigModal, LayoutBuilderEditItemModal, LayoutBuilderEventModal, LayoutBuilderGridItem, LayoutContainer, LayoutDragBuilder, LayoutDragBuilderEdit, LayoutGridContainer, LayoutManagerModal, LayoutModel, LayoutQuickAddMenu, MCP_CALL_TOOL_COMPLETE, MCP_CALL_TOOL_ERROR, MCP_GET_CATALOG_COMPLETE, MCP_GET_CATALOG_ERROR, MCP_LIST_RESOURCES_COMPLETE, MCP_LIST_RESOURCES_ERROR, MCP_LIST_TOOLS_COMPLETE, MCP_LIST_TOOLS_ERROR, MCP_READ_RESOURCE_COMPLETE, MCP_READ_RESOURCE_ERROR, MCP_RUN_AUTH_COMPLETE, MCP_RUN_AUTH_ERROR, MCP_SERVER_STATUS_COMPLETE, MCP_SERVER_STATUS_ERROR, MCP_START_SERVER_COMPLETE, MCP_START_SERVER_ERROR, MCP_STOP_SERVER_COMPLETE, MCP_STOP_SERVER_ERROR, MENU_ITEMS_DELETE, MENU_ITEMS_DELETE_COMPLETE, MENU_ITEMS_DELETE_ERROR, MENU_ITEMS_LIST, MENU_ITEMS_LIST_COMPLETE, MENU_ITEMS_LIST_ERROR, MENU_ITEMS_SAVE, MENU_ITEMS_SAVE_COMPLETE, MENU_ITEMS_SAVE_ERROR, MainMenu, MainMenuItem, MainMenuSection, McpServerPicker, MenuItemModel, MenuSlideOverlay, MergeCellsModal, MissingProviderPrompt, MockDashboardApi, PROVIDER_DELETE_COMPLETE, PROVIDER_DELETE_ERROR, PROVIDER_GET_COMPLETE, PROVIDER_GET_ERROR, PROVIDER_LIST_COMPLETE, PROVIDER_LIST_ERROR, PROVIDER_SAVE_COMPLETE, PROVIDER_SAVE_ERROR, PanelCode, PanelEditItem, PanelEditItemHandlers, ProviderContext, ProviderErrorBoundary, ProviderForm, ProviderSelector, SECURE_STORAGE_ENCRYPT_STRING, SECURE_STORAGE_ENCRYPT_STRING_COMPLETE, SECURE_STORAGE_ENCRYPT_STRING_ERROR, SECURE_STORE_ENCRYPTION_CHECK, SECURE_STORE_ENCRYPTION_CHECK_COMPLETE, SECURE_STORE_ENCRYPTION_CHECK_ERROR, SECURE_STORE_GET_DATA, SECURE_STORE_GET_DATA_COMPLETE, SECURE_STORE_GET_DATA_ERROR, SECURE_STORE_SET_DATA, SECURE_STORE_SET_DATA_COMPLETE, SECURE_STORE_SET_DATA_ERROR, SETTINGS_GET, SETTINGS_GET_COMPLETE, SETTINGS_GET_ERROR, SETTINGS_SAVE, SETTINGS_SAVE_COMPLETE, SETTINGS_SAVE_ERROR, SIDEBAR_WIDGET_TYPE, SettingsModel, SideMenu, SplitCellModal, THEME_DELETE, THEME_DELETE_COMPLETE, THEME_DELETE_ERROR, THEME_LIST, THEME_LIST_COMPLETE, THEME_LIST_ERROR, THEME_SAVE, THEME_SAVE_COMPLETE, THEME_SAVE_ERROR, ThemeApi, ThemeManagerModal, ThemeModel, ThemeWrapper, WORKSPACE_DELETE, WORKSPACE_DELETE_COMPLETE, WORKSPACE_DELETE_ERROR, WORKSPACE_LIST, WORKSPACE_LIST_COMPLETE, WORKSPACE_LIST_ERROR, WORKSPACE_SAVE, WORKSPACE_SAVE_COMPLETE, WORKSPACE_SAVE_ERROR, WebDashboardApi, Widget, WidgetApi, WidgetConfigPanel, WidgetContext, WidgetFactory, WidgetPopoutStage, WidgetProviderWrapper, WidgetSidebar, Workspace, WorkspaceContext, WorkspaceFooter, WorkspaceMenu, WorkspaceModel, addChildToLayoutItem, addItemToItemLayout, buildMcpConfigFromOverrides, canHaveChildren, changeDirectionForLayoutItem, createProviderRegistry, deriveFormFields, envMappingToRows, evaluateBundle, extractWidgetConfigs, formStateToMcpJson, formatFieldName, generateCustomTheme, generateHarmonyTheme, generateRandomTheme, generateThemeName, getBorderStyle, getChildrenForLayoutItem, getComponentInLayout, getContainerBorderColor, getContainerColor, getIndexOfLayoutChildrenForItem, getIndexOfLayoutItem, getLayoutItemById, getLayoutItemForWorkspace, getNearestParentWorkspace, getNextHighestId, getNextHighestItemInLayout, getNextHighestOrder, getNextHighestParentId, getNextLowestItemInLayout, getParentForLayoutItem, getParentWorkspaceForItem, getThemePresets, getWidgetsForWorkspace, getWorkspacesForWorkspace, headerTemplateToRows, isContainer, isLikelySecret, isMaxOrderForItem, isMinOrderForItem, isWidget, isWidgetResolvable, isWorkspace, layoutItemHasWorkspaceAsChild, loadWidgetBundle, mcpJsonToFormState, numChildrenForLayout, removeItemFromLayout, renderComponent, renderGridLayout, renderGridLayoutFlow, _renderLayout as renderLayout, renderLayoutMenu, replaceItemInLayout, resolveIcon, setHostModules, traverseParentTree, updateLayoutItem, updateParentForItem, useDashboard, useMcpProvider, useNotifications, useProvider, useProviderClient, useWidgetEvents, useWidgetProviders, validateCellMerge, validateGridCell, validateGridPlacement, validateWidgetPlacement, withProviderDetection };
42947
+ export { ALGOLIA_ANALYTICS_FOR_QUERY, ALGOLIA_ANALYTICS_FOR_QUERY_COMPLETE, ALGOLIA_ANALYTICS_FOR_QUERY_ERROR, ALGOLIA_LIST_INDICES, ALGOLIA_LIST_INDICES_COMPLETE, ALGOLIA_LIST_INDICES_ERROR, AVAILABLE_COLORS, AddMenuItemModal, AdvancedMcpConfig, AppContext, AppSettingsModal, AppThemeScope, AppWrapper, CHOOSE_FILE, CHOOSE_FILE_COMPLETE, CHOOSE_FILE_ERROR, ColorModel, ComponentConfigModel, ComponentManager, ContextModel, DATA_JSON_TO_CSV_FILE, DATA_JSON_TO_CSV_FILE_COMPLETE, DATA_JSON_TO_CSV_FILE_ERROR, DATA_JSON_TO_CSV_STRING, DATA_JSON_TO_CSV_STRING_COMPLETE, DATA_JSON_TO_CSV_STRING_ERROR, DATA_READ_FROM_FILE, DATA_READ_FROM_FILE_COMPLETE, DATA_READ_FROM_FILE_ERROR, DATA_SAVE_TO_FILE, DATA_SAVE_TO_FILE_COMPLETE, DATA_SAVE_TO_FILE_ERROR, DashCommandPalette, DashNavbar, DashSidebar, DashTabBar, DashboardStage as Dashboard, DashboardApi, DashboardContext, DashboardFooter, DashboardHeader, DashboardMenuItem, DashboardModel, DashboardMonitor, DashboardPublisher, DashboardStage, DashboardThemeProvider, DashboardWrapper, ElectronDashboardApi, ErrorBoundary, ExternalWidget, GRID_CELL_WIDGET_TYPE, HARMONY_STRATEGIES, LAYOUT_LIST, LAYOUT_LIST_COMPLETE, LAYOUT_LIST_ERROR, LAYOUT_SAVE, LAYOUT_SAVE_COMPLETE, LAYOUT_SAVE_ERROR, Layout, LayoutBuilder, LayoutBuilderAddItemModal, LayoutBuilderConfigContainerMenuItem, LayoutBuilderConfigMenuItem, LayoutBuilderConfigModal, LayoutBuilderEditItemModal, LayoutBuilderEventModal, LayoutBuilderGridItem, LayoutContainer, LayoutDragBuilder, LayoutDragBuilderEdit, LayoutGridContainer, LayoutManagerModal, LayoutModel, LayoutQuickAddMenu, MCP_CALL_TOOL_COMPLETE, MCP_CALL_TOOL_ERROR, MCP_GET_CATALOG_COMPLETE, MCP_GET_CATALOG_ERROR, MCP_LIST_RESOURCES_COMPLETE, MCP_LIST_RESOURCES_ERROR, MCP_LIST_TOOLS_COMPLETE, MCP_LIST_TOOLS_ERROR, MCP_READ_RESOURCE_COMPLETE, MCP_READ_RESOURCE_ERROR, MCP_RUN_AUTH_COMPLETE, MCP_RUN_AUTH_ERROR, MCP_SERVER_STATUS_COMPLETE, MCP_SERVER_STATUS_ERROR, MCP_START_SERVER_COMPLETE, MCP_START_SERVER_ERROR, MCP_STOP_SERVER_COMPLETE, MCP_STOP_SERVER_ERROR, MENU_ITEMS_DELETE, MENU_ITEMS_DELETE_COMPLETE, MENU_ITEMS_DELETE_ERROR, MENU_ITEMS_LIST, MENU_ITEMS_LIST_COMPLETE, MENU_ITEMS_LIST_ERROR, MENU_ITEMS_SAVE, MENU_ITEMS_SAVE_COMPLETE, MENU_ITEMS_SAVE_ERROR, MainMenu, MainMenuItem, MainMenuSection, McpServerPicker, MenuItemModel, MenuSlideOverlay, MergeCellsModal, MissingProviderPrompt, MockDashboardApi, PROVIDER_DELETE_COMPLETE, PROVIDER_DELETE_ERROR, PROVIDER_GET_COMPLETE, PROVIDER_GET_ERROR, PROVIDER_LIST_COMPLETE, PROVIDER_LIST_ERROR, PROVIDER_SAVE_COMPLETE, PROVIDER_SAVE_ERROR, PanelCode, PanelEditItem, PanelEditItemHandlers, PanelEditItemNotifications, ProviderContext, ProviderErrorBoundary, ProviderForm, ProviderSelector, SECURE_STORAGE_ENCRYPT_STRING, SECURE_STORAGE_ENCRYPT_STRING_COMPLETE, SECURE_STORAGE_ENCRYPT_STRING_ERROR, SECURE_STORE_ENCRYPTION_CHECK, SECURE_STORE_ENCRYPTION_CHECK_COMPLETE, SECURE_STORE_ENCRYPTION_CHECK_ERROR, SECURE_STORE_GET_DATA, SECURE_STORE_GET_DATA_COMPLETE, SECURE_STORE_GET_DATA_ERROR, SECURE_STORE_SET_DATA, SECURE_STORE_SET_DATA_COMPLETE, SECURE_STORE_SET_DATA_ERROR, SETTINGS_GET, SETTINGS_GET_COMPLETE, SETTINGS_GET_ERROR, SETTINGS_SAVE, SETTINGS_SAVE_COMPLETE, SETTINGS_SAVE_ERROR, SIDEBAR_WIDGET_TYPE, SettingsModel, SideMenu, SplitCellModal, THEME_DELETE, THEME_DELETE_COMPLETE, THEME_DELETE_ERROR, THEME_LIST, THEME_LIST_COMPLETE, THEME_LIST_ERROR, THEME_SAVE, THEME_SAVE_COMPLETE, THEME_SAVE_ERROR, ThemeApi, ThemeManagerModal, ThemeModel, ThemeWrapper, WORKSPACE_DELETE, WORKSPACE_DELETE_COMPLETE, WORKSPACE_DELETE_ERROR, WORKSPACE_LIST, WORKSPACE_LIST_COMPLETE, WORKSPACE_LIST_ERROR, WORKSPACE_SAVE, WORKSPACE_SAVE_COMPLETE, WORKSPACE_SAVE_ERROR, WebDashboardApi, Widget, WidgetApi, WidgetConfigPanel, WidgetContext, WidgetFactory, WidgetPopoutStage, WidgetProviderWrapper, WidgetSidebar, Workspace, WorkspaceContext, WorkspaceFooter, WorkspaceMenu, WorkspaceModel, addChildToLayoutItem, addItemToItemLayout, buildMcpConfigFromOverrides, canHaveChildren, changeDirectionForLayoutItem, createProviderRegistry, deriveFormFields, envMappingToRows, evaluateBundle, extractWidgetConfigs, formStateToMcpJson, formatFieldName, generateCustomTheme, generateHarmonyTheme, generateRandomTheme, generateThemeName, getBorderStyle, getChildrenForLayoutItem, getComponentInLayout, getContainerBorderColor, getContainerColor, getIndexOfLayoutChildrenForItem, getIndexOfLayoutItem, getLayoutItemById, getLayoutItemForWorkspace, getNearestParentWorkspace, getNextHighestId, getNextHighestItemInLayout, getNextHighestOrder, getNextHighestParentId, getNextLowestItemInLayout, getParentForLayoutItem, getParentWorkspaceForItem, getThemePresets, getWidgetsForWorkspace, getWorkspacesForWorkspace, headerTemplateToRows, isContainer, isLikelySecret, isMaxOrderForItem, isMinOrderForItem, isWidget, isWidgetResolvable, isWorkspace, layoutItemHasWorkspaceAsChild, loadWidgetBundle, mcpJsonToFormState, numChildrenForLayout, removeItemFromLayout, renderComponent, renderGridLayout, renderGridLayoutFlow, _renderLayout as renderLayout, renderLayoutMenu, replaceItemInLayout, resolveIcon, setHostModules, traverseParentTree, updateLayoutItem, updateParentForItem, useDashboard, useMcpProvider, useNotifications, useProvider, useProviderClient, useWidgetEvents, useWidgetProviders, validateCellMerge, validateGridCell, validateGridPlacement, validateWidgetPlacement, withProviderDetection };
42709
42948
  //# sourceMappingURL=index.esm.js.map