@trops/dash-core 0.1.104 → 0.1.106

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
@@ -31077,13 +31077,16 @@ var PublishDashboardModal = function PublishDashboardModal(_ref) {
31077
31077
  children: authorName || "—"
31078
31078
  })]
31079
31079
  }), preview && preview.componentNames && preview.componentNames.length > 0 && /*#__PURE__*/jsxs("div", {
31080
- className: "bg-white/5 border border-white/10 rounded-lg p-3 text-sm",
31081
- children: [/*#__PURE__*/jsxs("span", {
31082
- className: "opacity-50",
31083
- children: ["This dashboard contains ", preview.componentNames.length, " ", "widget", preview.componentNames.length !== 1 ? "s" : "", ":", " "]
31084
- }), /*#__PURE__*/jsx("span", {
31085
- className: "opacity-80",
31086
- children: preview.componentNames.join(", ")
31080
+ children: [/*#__PURE__*/jsx("label", {
31081
+ className: "block text-sm font-medium opacity-70 mb-2",
31082
+ children: "Widgets Included"
31083
+ }), /*#__PURE__*/jsx("div", {
31084
+ className: "flex flex-wrap gap-1.5",
31085
+ children: preview.componentNames.map(function (name) {
31086
+ return /*#__PURE__*/jsx(Tag3, {
31087
+ text: name
31088
+ }, name);
31089
+ })
31087
31090
  })]
31088
31091
  }), /*#__PURE__*/jsx(TextArea, {
31089
31092
  label: "Description",
@@ -31175,8 +31178,13 @@ var PublishDashboardModal = function PublishDashboardModal(_ref) {
31175
31178
  children: [/*#__PURE__*/jsx("span", {
31176
31179
  className: "opacity-50 w-20 flex-shrink-0",
31177
31180
  children: "Widgets"
31178
- }), /*#__PURE__*/jsx("span", {
31179
- children: preview.componentNames.join(", ")
31181
+ }), /*#__PURE__*/jsx("div", {
31182
+ className: "flex flex-wrap gap-1",
31183
+ children: preview.componentNames.map(function (name) {
31184
+ return /*#__PURE__*/jsx(Tag3, {
31185
+ text: name
31186
+ }, name);
31187
+ })
31180
31188
  })]
31181
31189
  })]
31182
31190
  })]
@@ -31248,12 +31256,22 @@ var PublishDashboardModal = function PublishDashboardModal(_ref) {
31248
31256
  className: "text-xs text-amber-300/90",
31249
31257
  children: "The following widgets are not currently on the registry. This may be intentional if they are private. Dashboards referencing these widgets can only be installed by users who already have them."
31250
31258
  })]
31251
- }), /*#__PURE__*/jsx("ul", {
31252
- className: "text-xs opacity-60 pl-5 list-disc space-y-0.5",
31259
+ }), /*#__PURE__*/jsx("div", {
31260
+ className: "space-y-2 mt-1",
31253
31261
  children: result.warnings.map(function (w) {
31254
- return /*#__PURE__*/jsx("li", {
31255
- children: w
31256
- }, w);
31262
+ return /*#__PURE__*/jsxs("div", {
31263
+ children: [/*#__PURE__*/jsx("div", {
31264
+ className: "text-xs font-semibold opacity-60",
31265
+ children: w["package"]
31266
+ }), /*#__PURE__*/jsx("div", {
31267
+ className: "flex flex-wrap gap-1 mt-1",
31268
+ children: w.widgets.map(function (name) {
31269
+ return /*#__PURE__*/jsx(Tag3, {
31270
+ text: name
31271
+ }, name);
31272
+ })
31273
+ })]
31274
+ }, w["package"]);
31257
31275
  })
31258
31276
  })]
31259
31277
  }), result.registryCheckFailed && /*#__PURE__*/jsx("div", {
@@ -36366,6 +36384,23 @@ var RegistryPackageDetail = function RegistryPackageDetail(_ref) {
36366
36384
  }, idx);
36367
36385
  })
36368
36386
  })]
36387
+ }), widget.appOrigin && /*#__PURE__*/jsxs("div", {
36388
+ className: "flex items-center gap-1.5 text-xs opacity-50",
36389
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
36390
+ icon: "laptop",
36391
+ className: "h-3 w-3"
36392
+ }), /*#__PURE__*/jsxs("span", {
36393
+ children: ["Built for ", widget.appOrigin]
36394
+ })]
36395
+ }), widget.missingApis && widget.missingApis.length > 0 && /*#__PURE__*/jsx("div", {
36396
+ className: "p-2 rounded bg-yellow-900/30 border border-yellow-700",
36397
+ children: /*#__PURE__*/jsxs("p", {
36398
+ className: "text-xs text-yellow-400",
36399
+ children: [/*#__PURE__*/jsx(FontAwesomeIcon, {
36400
+ icon: "triangle-exclamation",
36401
+ className: "mr-1"
36402
+ }), "Incompatible \u2014 requires", " ", widget.missingApis.join(", "), " API", widget.missingApis.length !== 1 ? "s" : ""]
36403
+ })
36369
36404
  }), widget.repository && /*#__PURE__*/jsxs("div", {
36370
36405
  children: [/*#__PURE__*/jsx("span", {
36371
36406
  className: "text-xs font-semibold opacity-50 mb-1 block",
@@ -36411,6 +36446,10 @@ function _arrayLikeToArray$2(r, a) { (null == a || a > r.length) && (a = r.lengt
36411
36446
  * Extracted from EnhancedWidgetDropdown so the same logic can power the
36412
36447
  * Discover tab inside AppSettingsModal (and anywhere else).
36413
36448
  *
36449
+ * Options:
36450
+ * filterByCapabilities – if true (default), only show packages compatible
36451
+ * with the app's API capabilities
36452
+ *
36414
36453
  * Returns:
36415
36454
  * packages – raw package objects from the registry
36416
36455
  * flatWidgets – flattened widget entries with `isRegistry: true`
@@ -36421,8 +36460,13 @@ function _arrayLikeToArray$2(r, a) { (null == a || a > r.length) && (a = r.lengt
36421
36460
  * installError – install error string (or null)
36422
36461
  * search() – manually trigger a search
36423
36462
  * installPackage(widget) – install a specific registry widget
36463
+ * showAllPackages / setShowAllPackages – toggle to show incompatible packages
36464
+ * appCapabilities – the app's API namespaces
36424
36465
  */
36425
36466
  var useRegistrySearch = function useRegistrySearch() {
36467
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
36468
+ _ref$filterByCapabili = _ref.filterByCapabilities,
36469
+ filterByCapabilities = _ref$filterByCapabili === void 0 ? true : _ref$filterByCapabili;
36426
36470
  var _useState = useState(false),
36427
36471
  _useState2 = _slicedToArray(_useState, 2),
36428
36472
  isLoading = _useState2[0],
@@ -36451,10 +36495,22 @@ var useRegistrySearch = function useRegistrySearch() {
36451
36495
  _useState12 = _slicedToArray(_useState11, 2),
36452
36496
  installError = _useState12[0],
36453
36497
  setInstallError = _useState12[1];
36498
+ var _useState13 = useState(false),
36499
+ _useState14 = _slicedToArray(_useState13, 2),
36500
+ showAllPackages = _useState14[0],
36501
+ setShowAllPackages = _useState14[1];
36502
+
36503
+ // Discover app capabilities from window.mainApi
36504
+ var appCapabilities = useMemo(function () {
36505
+ if (typeof window !== "undefined" && window.mainApi) {
36506
+ return Object.keys(window.mainApi);
36507
+ }
36508
+ return [];
36509
+ }, []);
36454
36510
  var search = useCallback(/*#__PURE__*/function () {
36455
- var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(query) {
36511
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(query) {
36456
36512
  var _window$mainApi;
36457
- var result, pkgs, widgets, _iterator, _step, pkg, _iterator2, _step2, widget, _t;
36513
+ var filters, result, pkgs, capSet, widgets, _iterator, _step, pkg, allApiProviders, _iterator2, _step2, p, _iterator3, _step3, w, _iterator5, _step5, _p, missingApis, _iterator4, _step4, widget, _t;
36458
36514
  return _regeneratorRuntime.wrap(function (_context) {
36459
36515
  while (1) switch (_context.prev = _context.next) {
36460
36516
  case 0:
@@ -36469,23 +36525,71 @@ var useRegistrySearch = function useRegistrySearch() {
36469
36525
  setIsLoading(true);
36470
36526
  setError(null);
36471
36527
  _context.prev = 2;
36528
+ filters = {};
36529
+ if (filterByCapabilities && !showAllPackages && appCapabilities.length) {
36530
+ filters.appCapabilities = appCapabilities;
36531
+ }
36472
36532
  _context.next = 3;
36473
- return window.mainApi.registry.search(query !== null && query !== void 0 ? query : searchQuery, {});
36533
+ return window.mainApi.registry.search(query !== null && query !== void 0 ? query : searchQuery, filters);
36474
36534
  case 3:
36475
36535
  result = _context.sent;
36476
36536
  pkgs = result.packages || [];
36477
36537
  setPackages(pkgs);
36478
36538
 
36479
36539
  // Flatten packages into widget entries
36540
+ capSet = new Set(appCapabilities.map(function (c) {
36541
+ return c.toLowerCase();
36542
+ }));
36480
36543
  widgets = [];
36481
36544
  _iterator = _createForOfIteratorHelper$2(pkgs);
36482
36545
  try {
36483
36546
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
36484
36547
  pkg = _step.value;
36485
- _iterator2 = _createForOfIteratorHelper$2(pkg.widgets || []);
36548
+ // Compute missing APIs for the entire package
36549
+ allApiProviders = [];
36550
+ _iterator2 = _createForOfIteratorHelper$2(pkg.providers || []);
36486
36551
  try {
36487
36552
  for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
36488
- widget = _step2.value;
36553
+ p = _step2.value;
36554
+ if (p.providerClass === "api" && p.required !== false) {
36555
+ allApiProviders.push(p.type);
36556
+ }
36557
+ }
36558
+ } catch (err) {
36559
+ _iterator2.e(err);
36560
+ } finally {
36561
+ _iterator2.f();
36562
+ }
36563
+ _iterator3 = _createForOfIteratorHelper$2(pkg.widgets || []);
36564
+ try {
36565
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
36566
+ w = _step3.value;
36567
+ _iterator5 = _createForOfIteratorHelper$2(w.providers || []);
36568
+ try {
36569
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
36570
+ _p = _step5.value;
36571
+ if (_p.providerClass === "api" && _p.required !== false) {
36572
+ allApiProviders.push(_p.type);
36573
+ }
36574
+ }
36575
+ } catch (err) {
36576
+ _iterator5.e(err);
36577
+ } finally {
36578
+ _iterator5.f();
36579
+ }
36580
+ }
36581
+ } catch (err) {
36582
+ _iterator3.e(err);
36583
+ } finally {
36584
+ _iterator3.f();
36585
+ }
36586
+ missingApis = _toConsumableArray(new Set(allApiProviders)).filter(function (api) {
36587
+ return !capSet.has(api.toLowerCase());
36588
+ });
36589
+ _iterator4 = _createForOfIteratorHelper$2(pkg.widgets || []);
36590
+ try {
36591
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
36592
+ widget = _step4.value;
36489
36593
  widgets.push({
36490
36594
  key: "".concat(pkg.name, "/").concat(widget.name),
36491
36595
  name: widget.displayName || widget.name,
@@ -36503,13 +36607,16 @@ var useRegistrySearch = function useRegistrySearch() {
36503
36607
  downloadUrl: pkg.downloadUrl || "",
36504
36608
  repository: pkg.repository || "",
36505
36609
  publishedAt: pkg.publishedAt || "",
36506
- packageWidgets: pkg.widgets || []
36610
+ packageWidgets: pkg.widgets || [],
36611
+ appOrigin: pkg.appOrigin || null,
36612
+ packageProviders: pkg.providers || [],
36613
+ missingApis: missingApis
36507
36614
  });
36508
36615
  }
36509
36616
  } catch (err) {
36510
- _iterator2.e(err);
36617
+ _iterator4.e(err);
36511
36618
  } finally {
36512
- _iterator2.f();
36619
+ _iterator4.f();
36513
36620
  }
36514
36621
  }
36515
36622
  } catch (err) {
@@ -36537,9 +36644,9 @@ var useRegistrySearch = function useRegistrySearch() {
36537
36644
  }, _callee, null, [[2, 4, 5, 6]]);
36538
36645
  }));
36539
36646
  return function (_x) {
36540
- return _ref.apply(this, arguments);
36647
+ return _ref2.apply(this, arguments);
36541
36648
  };
36542
- }(), [searchQuery]);
36649
+ }(), [searchQuery, filterByCapabilities, showAllPackages, appCapabilities]);
36543
36650
 
36544
36651
  // Debounce search on query changes (300ms)
36545
36652
  useEffect(function () {
@@ -36550,9 +36657,9 @@ var useRegistrySearch = function useRegistrySearch() {
36550
36657
  return clearTimeout(timer);
36551
36658
  };
36552
36659
  // eslint-disable-next-line react-hooks/exhaustive-deps
36553
- }, [searchQuery]);
36660
+ }, [searchQuery, showAllPackages]);
36554
36661
  var installPackage = useCallback(/*#__PURE__*/function () {
36555
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(widget) {
36662
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(widget) {
36556
36663
  var packageName, downloadUrl, packageVersion, resolvedUrl, _t2;
36557
36664
  return _regeneratorRuntime.wrap(function (_context2) {
36558
36665
  while (1) switch (_context2.prev = _context2.next) {
@@ -36588,7 +36695,7 @@ var useRegistrySearch = function useRegistrySearch() {
36588
36695
  }, _callee2, null, [[2, 4, 5, 6]]);
36589
36696
  }));
36590
36697
  return function (_x2) {
36591
- return _ref2.apply(this, arguments);
36698
+ return _ref3.apply(this, arguments);
36592
36699
  };
36593
36700
  }(), []);
36594
36701
  var retry = useCallback(function () {
@@ -36605,7 +36712,10 @@ var useRegistrySearch = function useRegistrySearch() {
36605
36712
  installError: installError,
36606
36713
  search: search,
36607
36714
  installPackage: installPackage,
36608
- retry: retry
36715
+ retry: retry,
36716
+ showAllPackages: showAllPackages,
36717
+ setShowAllPackages: setShowAllPackages,
36718
+ appCapabilities: appCapabilities
36609
36719
  };
36610
36720
  };
36611
36721
 
@@ -36631,7 +36741,9 @@ var DiscoverWidgetsDetail = function DiscoverWidgetsDetail(_ref) {
36631
36741
  isInstalling = _useRegistrySearch.isInstalling,
36632
36742
  installError = _useRegistrySearch.installError,
36633
36743
  installPackage = _useRegistrySearch.installPackage,
36634
- retry = _useRegistrySearch.retry;
36744
+ retry = _useRegistrySearch.retry,
36745
+ showAllPackages = _useRegistrySearch.showAllPackages,
36746
+ setShowAllPackages = _useRegistrySearch.setShowAllPackages;
36635
36747
  var _useState = useState(null),
36636
36748
  _useState2 = _slicedToArray(_useState, 2),
36637
36749
  selectedPackageName = _useState2[0],
@@ -36796,10 +36908,15 @@ var DiscoverWidgetsDetail = function DiscoverWidgetsDetail(_ref) {
36796
36908
  className: "space-y-1",
36797
36909
  children: packages.map(function (pkg) {
36798
36910
  var widgetCount = (pkg.widgets || []).length;
36911
+ // Check if this package has incompatible API dependencies
36912
+ var pkgWidget = flatWidgets.find(function (w) {
36913
+ return w.packageName === pkg.name;
36914
+ });
36915
+ var hasIncompatible = (pkgWidget === null || pkgWidget === void 0 ? void 0 : pkgWidget.missingApis) && pkgWidget.missingApis.length > 0;
36799
36916
  return /*#__PURE__*/jsx(Sidebar.Item, {
36800
36917
  icon: /*#__PURE__*/jsx(FontAwesomeIcon, {
36801
- icon: "cube",
36802
- className: "h-3.5 w-3.5"
36918
+ icon: hasIncompatible ? "triangle-exclamation" : "cube",
36919
+ className: "h-3.5 w-3.5 ".concat(hasIncompatible ? "text-yellow-500" : "")
36803
36920
  }),
36804
36921
  onClick: function onClick() {
36805
36922
  return setSelectedPackageName(pkg.name);
@@ -36825,14 +36942,24 @@ var DiscoverWidgetsDetail = function DiscoverWidgetsDetail(_ref) {
36825
36942
  children: "Back"
36826
36943
  })]
36827
36944
  })
36828
- }), /*#__PURE__*/jsx("div", {
36945
+ }), /*#__PURE__*/jsxs("div", {
36829
36946
  className: "flex-shrink-0 px-4 py-3",
36830
- children: /*#__PURE__*/jsx(SearchInput, {
36947
+ children: [/*#__PURE__*/jsx(SearchInput, {
36831
36948
  value: searchQuery,
36832
36949
  onChange: setSearchQuery,
36833
36950
  placeholder: "Search packages...",
36834
36951
  inputClassName: "py-1.5 text-xs"
36835
- })
36952
+ }), /*#__PURE__*/jsxs("label", {
36953
+ className: "flex items-center gap-1.5 mt-2 text-xs opacity-50 cursor-pointer select-none",
36954
+ children: [/*#__PURE__*/jsx("input", {
36955
+ type: "checkbox",
36956
+ checked: showAllPackages,
36957
+ onChange: function onChange(e) {
36958
+ return setShowAllPackages(e.target.checked);
36959
+ },
36960
+ className: "rounded"
36961
+ }), "Show all packages"]
36962
+ })]
36836
36963
  }), /*#__PURE__*/jsx("div", {
36837
36964
  className: "flex-1 min-h-0 overflow-y-auto px-2",
36838
36965
  children: listBody