epiq 1.1.0 → 1.2.1

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/gui/main.js CHANGED
@@ -24911,7 +24911,7 @@ var User = ({
24911
24911
  );
24912
24912
 
24913
24913
  // source/version.ts
24914
- var EPIQ_VERSION = "1.1.0";
24914
+ var EPIQ_VERSION = "1.2.1";
24915
24915
 
24916
24916
  // source/gui/client/components/Header.tsx
24917
24917
  var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
@@ -25070,7 +25070,7 @@ var FormHeader = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
25070
25070
  style: {
25071
25071
  display: "flex",
25072
25072
  justifyContent: "space-between",
25073
- alignItems: "center",
25073
+ alignItems: "flex-start",
25074
25074
  gap: 12,
25075
25075
  marginBottom: 18
25076
25076
  },
@@ -25101,7 +25101,7 @@ var Input = (props) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
25101
25101
  var Textarea = (props) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
25102
25102
  "textarea",
25103
25103
  {
25104
- maxLength: props.maxLength ?? 100,
25104
+ maxLength: props.maxLength ?? 1500,
25105
25105
  ...props,
25106
25106
  style: {
25107
25107
  width: "100%",
@@ -25452,7 +25452,7 @@ var IssueDetails = ({
25452
25452
  textTransform: "uppercase",
25453
25453
  letterSpacing: "0.08em"
25454
25454
  },
25455
- children: "Issue Details"
25455
+ children: issue.ref && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: { fontFamily: "monospace", color: GUI_THEME.dim }, children: "#" + issue.ref })
25456
25456
  }
25457
25457
  ),
25458
25458
  /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Button, { variant: "ghost", onClick: onClose, children: "\xD7" })
@@ -25782,8 +25782,8 @@ var TicketCard = ({
25782
25782
  cursor: ticket.readonly ? "default" : "grab",
25783
25783
  background: isSelected ? "rgba(118,228,255,0.08)" : "rgba(185, 192, 255, 0.06)",
25784
25784
  padding: "12px",
25785
- minHeight: "40px",
25786
- borderRadius: "12px",
25785
+ minHeight: "58px",
25786
+ borderRadius: "8px",
25787
25787
  marginBottom: 4,
25788
25788
  border: `1px solid ${isSelected ? GUI_THEME.accent : "transparent"}`
25789
25789
  },
@@ -25823,6 +25823,32 @@ var TicketCard = ({
25823
25823
  flex: 1
25824
25824
  },
25825
25825
  children: [
25826
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
25827
+ "div",
25828
+ {
25829
+ style: {
25830
+ overflow: "hidden",
25831
+ textOverflow: "ellipsis",
25832
+ whiteSpace: "nowrap",
25833
+ fontWeight: 500,
25834
+ fontSize: 12
25835
+ },
25836
+ children: ticket.ref && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
25837
+ "span",
25838
+ {
25839
+ style: {
25840
+ fontFamily: "monospace",
25841
+ marginRight: 6,
25842
+ color: GUI_THEME.dim
25843
+ },
25844
+ children: [
25845
+ "#",
25846
+ ticket.ref
25847
+ ]
25848
+ }
25849
+ )
25850
+ }
25851
+ ),
25826
25852
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
25827
25853
  "div",
25828
25854
  {
@@ -25927,7 +25953,8 @@ var TicketCard = ({
25927
25953
  display: "flex",
25928
25954
  alignItems: "flex-start",
25929
25955
  flexShrink: 0,
25930
- paddingTop: 2
25956
+ paddingTop: 2,
25957
+ marginTop: "-4px"
25931
25958
  },
25932
25959
  children: ticket.assignees.map((assignee, idx) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(User, { user: assignee, index: idx, isFocus: isSelected }))
25933
25960
  }
@@ -26184,6 +26211,10 @@ var moveIssue = (setState, socketRef) => (issueId, parentId, targetIndex) => {
26184
26211
  );
26185
26212
  };
26186
26213
 
26214
+ // source/lib/utils/node-ref.ts
26215
+ var NODE_REF_LENGTH = 7;
26216
+ var nodeRef = (id) => id.slice(-NODE_REF_LENGTH).toUpperCase();
26217
+
26187
26218
  // source/gui/client/lib/gui-state-helper.tsx
26188
26219
  var getResultValue = (payload) => {
26189
26220
  if (!payload) return void 0;
@@ -26195,15 +26226,20 @@ var getResultValue = (payload) => {
26195
26226
  }
26196
26227
  return payload;
26197
26228
  };
26198
- var findIssue = (state, issueId) => {
26199
- for (const board of state.boards) {
26200
- for (const swimlane of board.swimlanes) {
26201
- const issue = swimlane.issues.find((issue2) => issue2.id === issueId);
26202
- if (issue) return issue;
26203
- }
26204
- }
26205
- return null;
26229
+ var findByRefOrId = (nodes, refOrId) => {
26230
+ const byId = nodes.find((node) => node.id === refOrId);
26231
+ if (byId) return byId;
26232
+ const ref = refOrId.replace(/-/g, "").toUpperCase();
26233
+ const byRef = nodes.filter((node) => node.ref === ref);
26234
+ return byRef.length === 1 ? byRef[0] ?? null : null;
26206
26235
  };
26236
+ var findIssue = (state, issueRefOrId) => findByRefOrId(
26237
+ state.boards.flatMap(
26238
+ (board) => board.swimlanes.flatMap((swimlane) => swimlane.issues)
26239
+ ),
26240
+ issueRefOrId
26241
+ );
26242
+ var findBoard = (state, boardRefOrId) => findByRefOrId(state.boards, boardRefOrId);
26207
26243
  var updateIssueInGuiState = (state, issueId, updateIssue) => ({
26208
26244
  ...state,
26209
26245
  boards: state.boards.map((board) => ({
@@ -26248,15 +26284,15 @@ var App = () => {
26248
26284
  const [createIssueModal, setCreateIssueModal] = (0, import_react7.useState)(null);
26249
26285
  const boardMenuRef = (0, import_react7.useRef)(null);
26250
26286
  const socketRef = (0, import_react7.useRef)(null);
26251
- const selectedIssueId = issueId ?? null;
26252
26287
  const selectedTab = searchParams.get("tab") === "comments" ? "comments" : "overview";
26253
26288
  const navigate = useNavigate();
26289
+ const selectedBoard = (state && boardId ? findBoard(state, boardId) : null) ?? state?.boards[0] ?? null;
26290
+ const boardSlug = selectedBoard?.ref ?? boardId;
26291
+ const selectedIssue = state && issueId ? findIssue(state, issueId) : null;
26254
26292
  const closeIssueDetails = () => {
26255
- if (!boardId) return;
26256
- void navigate(`/board/${boardId}`);
26293
+ if (!boardSlug) return;
26294
+ void navigate(`/board/${boardSlug}`);
26257
26295
  };
26258
- const selectedBoard = state?.boards.find((board) => board.id === boardId) ?? state?.boards[0] ?? null;
26259
- const selectedIssue = state && selectedIssueId ? findIssue(state, selectedIssueId) : null;
26260
26296
  const commentsByIssueId = state?.commentsByIssueId ?? {};
26261
26297
  const requestState = () => {
26262
26298
  socketRef.current?.send(JSON.stringify({ type: "state:get" }));
@@ -26285,7 +26321,9 @@ var App = () => {
26285
26321
  if (message.type === "issue:created") {
26286
26322
  const created = getResultValue(message.payload);
26287
26323
  if (created && boardId) {
26288
- void navigate(`/board/${boardId}/${created.id}?tab=overview`);
26324
+ void navigate(
26325
+ `/board/${boardId}/${nodeRef(created.id)}?tab=overview`
26326
+ );
26289
26327
  }
26290
26328
  }
26291
26329
  if (message.type === "failed") {
@@ -26305,7 +26343,7 @@ var App = () => {
26305
26343
  }, [boardId, navigate]);
26306
26344
  (0, import_react7.useEffect)(() => {
26307
26345
  if (!boardId && state?.boards[0]) {
26308
- navigate(`/board/${state.boards[0].id}`, { replace: true });
26346
+ void navigate(`/board/${state.boards[0].ref}`, { replace: true });
26309
26347
  }
26310
26348
  }, [boardId, state, navigate]);
26311
26349
  (0, import_react7.useEffect)(() => {
@@ -26325,12 +26363,12 @@ var App = () => {
26325
26363
  socketRef.current?.send(JSON.stringify({ type, payload }));
26326
26364
  };
26327
26365
  const selectIssue = (nextIssueId) => {
26328
- if (!boardId) return;
26329
- void navigate(`/board/${boardId}/${nextIssueId}?tab=overview`);
26366
+ if (!boardSlug) return;
26367
+ void navigate(`/board/${boardSlug}/${nodeRef(nextIssueId)}?tab=overview`);
26330
26368
  };
26331
26369
  const selectIssueComments = (nextIssueId) => {
26332
- if (!boardId) return;
26333
- void navigate(`/board/${boardId}/${nextIssueId}?tab=comments`);
26370
+ if (!boardSlug) return;
26371
+ void navigate(`/board/${boardSlug}/${nodeRef(nextIssueId)}?tab=comments`);
26334
26372
  };
26335
26373
  const changeIssueDetailsTab = (nextTab) => {
26336
26374
  setSearchParams(
@@ -26449,7 +26487,7 @@ var App = () => {
26449
26487
  const selectBoard = (nextBoardId) => {
26450
26488
  setBoardMenuOpen(false);
26451
26489
  clearDragState();
26452
- void navigate(`/board/${nextBoardId}`);
26490
+ void navigate(`/board/${nodeRef(nextBoardId)}`);
26453
26491
  };
26454
26492
  const openCreateIssueModal = (swimlaneId) => {
26455
26493
  setCreateIssueModal({
@@ -26550,7 +26588,7 @@ var App = () => {
26550
26588
  {
26551
26589
  swimlane,
26552
26590
  selected: false,
26553
- selectedIssueId,
26591
+ selectedIssueId: selectedIssue?.id ?? null,
26554
26592
  commentsByIssueId,
26555
26593
  dragOver: dragOverSwimlaneId === swimlane.id,
26556
26594
  dropIndex: dropTarget?.swimlaneId === swimlane.id ? dropTarget.index : null,