@bbearai/react 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1543,7 +1543,16 @@ var import_jsx_runtime4 = require("react/jsx-runtime");
1543
1543
  function TestListScreen({ nav }) {
1544
1544
  const { assignments, currentAssignment, refreshAssignments } = useBugBear();
1545
1545
  const [filter, setFilter] = (0, import_react5.useState)("all");
1546
+ const [roleFilter, setRoleFilter] = (0, import_react5.useState)(null);
1546
1547
  const [collapsedFolders, setCollapsedFolders] = (0, import_react5.useState)(/* @__PURE__ */ new Set());
1548
+ const availableRoles = (0, import_react5.useMemo)(() => {
1549
+ const roleMap = /* @__PURE__ */ new Map();
1550
+ for (const a of assignments) {
1551
+ if (a.testCase.role) roleMap.set(a.testCase.role.id, a.testCase.role);
1552
+ }
1553
+ return Array.from(roleMap.values());
1554
+ }, [assignments]);
1555
+ const selectedRole = availableRoles.find((r) => r.id === roleFilter);
1547
1556
  const groupedAssignments = (0, import_react5.useMemo)(() => {
1548
1557
  const groups = /* @__PURE__ */ new Map();
1549
1558
  for (const assignment of assignments) {
@@ -1597,6 +1606,7 @@ function TestListScreen({ nav }) {
1597
1606
  });
1598
1607
  }, []);
1599
1608
  const filterAssignment = (a) => {
1609
+ if (roleFilter && a.testCase.role?.id !== roleFilter) return false;
1600
1610
  if (filter === "pending") return a.status === "pending" || a.status === "in_progress";
1601
1611
  if (filter === "completed") return a.status === "passed" || a.status === "failed";
1602
1612
  return true;
@@ -1629,7 +1639,7 @@ function TestListScreen({ nav }) {
1629
1639
  }
1630
1640
  };
1631
1641
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { children: [
1632
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { display: "flex", gap: 8, marginBottom: 16 }, children: filters.map((f) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1642
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { display: "flex", gap: 8, marginBottom: availableRoles.length >= 2 ? 8 : 16 }, children: filters.map((f) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1633
1643
  "button",
1634
1644
  {
1635
1645
  type: "button",
@@ -1656,6 +1666,79 @@ function TestListScreen({ nav }) {
1656
1666
  },
1657
1667
  f.key
1658
1668
  )) }),
1669
+ availableRoles.length >= 2 && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { marginBottom: 12 }, children: [
1670
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", gap: 6, flexWrap: "wrap", marginBottom: selectedRole?.loginHint ? 8 : 0 }, children: [
1671
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1672
+ "button",
1673
+ {
1674
+ type: "button",
1675
+ onClick: () => setRoleFilter(null),
1676
+ style: {
1677
+ paddingLeft: 10,
1678
+ paddingRight: 10,
1679
+ paddingTop: 4,
1680
+ paddingBottom: 4,
1681
+ borderRadius: 6,
1682
+ backgroundColor: !roleFilter ? colors.card : "transparent",
1683
+ border: !roleFilter ? `1px solid ${colors.border}` : "1px solid transparent",
1684
+ cursor: "pointer",
1685
+ fontSize: 11,
1686
+ color: !roleFilter ? colors.textPrimary : colors.textMuted,
1687
+ fontWeight: !roleFilter ? 600 : 400
1688
+ },
1689
+ children: "All Roles"
1690
+ }
1691
+ ),
1692
+ availableRoles.map((role) => {
1693
+ const isActive = roleFilter === role.id;
1694
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
1695
+ "button",
1696
+ {
1697
+ type: "button",
1698
+ onClick: () => setRoleFilter(isActive ? null : role.id),
1699
+ style: {
1700
+ display: "flex",
1701
+ alignItems: "center",
1702
+ gap: 5,
1703
+ paddingLeft: 10,
1704
+ paddingRight: 10,
1705
+ paddingTop: 4,
1706
+ paddingBottom: 4,
1707
+ borderRadius: 6,
1708
+ backgroundColor: isActive ? role.color + "20" : "transparent",
1709
+ border: isActive ? `1px solid ${role.color}60` : "1px solid transparent",
1710
+ cursor: "pointer",
1711
+ fontSize: 11,
1712
+ color: isActive ? role.color : colors.textMuted,
1713
+ fontWeight: isActive ? 600 : 400
1714
+ },
1715
+ children: [
1716
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: {
1717
+ width: 6,
1718
+ height: 6,
1719
+ borderRadius: 3,
1720
+ backgroundColor: role.color,
1721
+ flexShrink: 0
1722
+ } }),
1723
+ role.name
1724
+ ]
1725
+ },
1726
+ role.id
1727
+ );
1728
+ })
1729
+ ] }),
1730
+ selectedRole?.loginHint && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: {
1731
+ fontSize: 11,
1732
+ color: colors.textSecondary,
1733
+ backgroundColor: selectedRole.color + "10",
1734
+ border: `1px solid ${selectedRole.color}30`,
1735
+ borderRadius: 6,
1736
+ padding: "6px 10px"
1737
+ }, children: [
1738
+ "Log in as: ",
1739
+ selectedRole.loginHint
1740
+ ] })
1741
+ ] }),
1659
1742
  groupedAssignments.map((folder) => {
1660
1743
  const folderId = folder.group?.id || "ungrouped";
1661
1744
  const isCollapsed = collapsedFolders.has(folderId);
@@ -1828,7 +1911,26 @@ function TestListScreen({ nav }) {
1828
1911
  },
1829
1912
  children: assignment.testCase.priority
1830
1913
  }
1831
- )
1914
+ ),
1915
+ assignment.testCase.role && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
1916
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
1917
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { style: {
1918
+ display: "inline-flex",
1919
+ alignItems: "center",
1920
+ gap: 3,
1921
+ fontSize: 10,
1922
+ color: assignment.testCase.role.color,
1923
+ fontWeight: 500
1924
+ }, children: [
1925
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: {
1926
+ width: 5,
1927
+ height: 5,
1928
+ borderRadius: 3,
1929
+ backgroundColor: assignment.testCase.role.color
1930
+ } }),
1931
+ assignment.testCase.role.name
1932
+ ] })
1933
+ ] })
1832
1934
  ] })
1833
1935
  ] }),
1834
1936
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
package/dist/index.mjs CHANGED
@@ -1514,7 +1514,16 @@ import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-run
1514
1514
  function TestListScreen({ nav }) {
1515
1515
  const { assignments, currentAssignment, refreshAssignments } = useBugBear();
1516
1516
  const [filter, setFilter] = useState3("all");
1517
+ const [roleFilter, setRoleFilter] = useState3(null);
1517
1518
  const [collapsedFolders, setCollapsedFolders] = useState3(/* @__PURE__ */ new Set());
1519
+ const availableRoles = useMemo(() => {
1520
+ const roleMap = /* @__PURE__ */ new Map();
1521
+ for (const a of assignments) {
1522
+ if (a.testCase.role) roleMap.set(a.testCase.role.id, a.testCase.role);
1523
+ }
1524
+ return Array.from(roleMap.values());
1525
+ }, [assignments]);
1526
+ const selectedRole = availableRoles.find((r) => r.id === roleFilter);
1518
1527
  const groupedAssignments = useMemo(() => {
1519
1528
  const groups = /* @__PURE__ */ new Map();
1520
1529
  for (const assignment of assignments) {
@@ -1568,6 +1577,7 @@ function TestListScreen({ nav }) {
1568
1577
  });
1569
1578
  }, []);
1570
1579
  const filterAssignment = (a) => {
1580
+ if (roleFilter && a.testCase.role?.id !== roleFilter) return false;
1571
1581
  if (filter === "pending") return a.status === "pending" || a.status === "in_progress";
1572
1582
  if (filter === "completed") return a.status === "passed" || a.status === "failed";
1573
1583
  return true;
@@ -1600,7 +1610,7 @@ function TestListScreen({ nav }) {
1600
1610
  }
1601
1611
  };
1602
1612
  return /* @__PURE__ */ jsxs3("div", { children: [
1603
- /* @__PURE__ */ jsx4("div", { style: { display: "flex", gap: 8, marginBottom: 16 }, children: filters.map((f) => /* @__PURE__ */ jsxs3(
1613
+ /* @__PURE__ */ jsx4("div", { style: { display: "flex", gap: 8, marginBottom: availableRoles.length >= 2 ? 8 : 16 }, children: filters.map((f) => /* @__PURE__ */ jsxs3(
1604
1614
  "button",
1605
1615
  {
1606
1616
  type: "button",
@@ -1627,6 +1637,79 @@ function TestListScreen({ nav }) {
1627
1637
  },
1628
1638
  f.key
1629
1639
  )) }),
1640
+ availableRoles.length >= 2 && /* @__PURE__ */ jsxs3("div", { style: { marginBottom: 12 }, children: [
1641
+ /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: 6, flexWrap: "wrap", marginBottom: selectedRole?.loginHint ? 8 : 0 }, children: [
1642
+ /* @__PURE__ */ jsx4(
1643
+ "button",
1644
+ {
1645
+ type: "button",
1646
+ onClick: () => setRoleFilter(null),
1647
+ style: {
1648
+ paddingLeft: 10,
1649
+ paddingRight: 10,
1650
+ paddingTop: 4,
1651
+ paddingBottom: 4,
1652
+ borderRadius: 6,
1653
+ backgroundColor: !roleFilter ? colors.card : "transparent",
1654
+ border: !roleFilter ? `1px solid ${colors.border}` : "1px solid transparent",
1655
+ cursor: "pointer",
1656
+ fontSize: 11,
1657
+ color: !roleFilter ? colors.textPrimary : colors.textMuted,
1658
+ fontWeight: !roleFilter ? 600 : 400
1659
+ },
1660
+ children: "All Roles"
1661
+ }
1662
+ ),
1663
+ availableRoles.map((role) => {
1664
+ const isActive = roleFilter === role.id;
1665
+ return /* @__PURE__ */ jsxs3(
1666
+ "button",
1667
+ {
1668
+ type: "button",
1669
+ onClick: () => setRoleFilter(isActive ? null : role.id),
1670
+ style: {
1671
+ display: "flex",
1672
+ alignItems: "center",
1673
+ gap: 5,
1674
+ paddingLeft: 10,
1675
+ paddingRight: 10,
1676
+ paddingTop: 4,
1677
+ paddingBottom: 4,
1678
+ borderRadius: 6,
1679
+ backgroundColor: isActive ? role.color + "20" : "transparent",
1680
+ border: isActive ? `1px solid ${role.color}60` : "1px solid transparent",
1681
+ cursor: "pointer",
1682
+ fontSize: 11,
1683
+ color: isActive ? role.color : colors.textMuted,
1684
+ fontWeight: isActive ? 600 : 400
1685
+ },
1686
+ children: [
1687
+ /* @__PURE__ */ jsx4("span", { style: {
1688
+ width: 6,
1689
+ height: 6,
1690
+ borderRadius: 3,
1691
+ backgroundColor: role.color,
1692
+ flexShrink: 0
1693
+ } }),
1694
+ role.name
1695
+ ]
1696
+ },
1697
+ role.id
1698
+ );
1699
+ })
1700
+ ] }),
1701
+ selectedRole?.loginHint && /* @__PURE__ */ jsxs3("div", { style: {
1702
+ fontSize: 11,
1703
+ color: colors.textSecondary,
1704
+ backgroundColor: selectedRole.color + "10",
1705
+ border: `1px solid ${selectedRole.color}30`,
1706
+ borderRadius: 6,
1707
+ padding: "6px 10px"
1708
+ }, children: [
1709
+ "Log in as: ",
1710
+ selectedRole.loginHint
1711
+ ] })
1712
+ ] }),
1630
1713
  groupedAssignments.map((folder) => {
1631
1714
  const folderId = folder.group?.id || "ungrouped";
1632
1715
  const isCollapsed = collapsedFolders.has(folderId);
@@ -1799,7 +1882,26 @@ function TestListScreen({ nav }) {
1799
1882
  },
1800
1883
  children: assignment.testCase.priority
1801
1884
  }
1802
- )
1885
+ ),
1886
+ assignment.testCase.role && /* @__PURE__ */ jsxs3(Fragment2, { children: [
1887
+ /* @__PURE__ */ jsx4("span", { style: { fontSize: 11, color: colors.textDim }, children: "\xB7" }),
1888
+ /* @__PURE__ */ jsxs3("span", { style: {
1889
+ display: "inline-flex",
1890
+ alignItems: "center",
1891
+ gap: 3,
1892
+ fontSize: 10,
1893
+ color: assignment.testCase.role.color,
1894
+ fontWeight: 500
1895
+ }, children: [
1896
+ /* @__PURE__ */ jsx4("span", { style: {
1897
+ width: 5,
1898
+ height: 5,
1899
+ borderRadius: 3,
1900
+ backgroundColor: assignment.testCase.role.color
1901
+ } }),
1902
+ assignment.testCase.role.name
1903
+ ] })
1904
+ ] })
1803
1905
  ] })
1804
1906
  ] }),
1805
1907
  /* @__PURE__ */ jsx4(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bbearai/react",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "BugBear React components for web apps",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -41,7 +41,7 @@
41
41
  "prepublishOnly": "npm run build"
42
42
  },
43
43
  "dependencies": {
44
- "@bbearai/core": "^0.3.0"
44
+ "@bbearai/core": "^0.4.0"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "react": "^18.0.0 || ^19.0.0",