epiq 1.0.1 → 1.2.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/gui/main.js CHANGED
@@ -24911,7 +24911,7 @@ var User = ({
24911
24911
  );
24912
24912
 
24913
24913
  // source/version.ts
24914
- var EPIQ_VERSION = "1.0.1";
24914
+ var EPIQ_VERSION = "1.2.0";
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,19 @@ var getResultValue = (payload) => {
26195
26226
  }
26196
26227
  return payload;
26197
26228
  };
26198
- var findIssue = (state, issueId) => {
26229
+ var matchesRefOrId = (node, refOrId) => node.id === refOrId || node.ref === refOrId.replace(/-/g, "").toUpperCase();
26230
+ var findIssue = (state, issueRefOrId) => {
26199
26231
  for (const board of state.boards) {
26200
26232
  for (const swimlane of board.swimlanes) {
26201
- const issue = swimlane.issues.find((issue2) => issue2.id === issueId);
26233
+ const issue = swimlane.issues.find(
26234
+ (issue2) => matchesRefOrId(issue2, issueRefOrId)
26235
+ );
26202
26236
  if (issue) return issue;
26203
26237
  }
26204
26238
  }
26205
26239
  return null;
26206
26240
  };
26241
+ var findBoard = (state, boardRefOrId) => state.boards.find((board) => matchesRefOrId(board, boardRefOrId)) ?? null;
26207
26242
  var updateIssueInGuiState = (state, issueId, updateIssue) => ({
26208
26243
  ...state,
26209
26244
  boards: state.boards.map((board) => ({
@@ -26248,15 +26283,15 @@ var App = () => {
26248
26283
  const [createIssueModal, setCreateIssueModal] = (0, import_react7.useState)(null);
26249
26284
  const boardMenuRef = (0, import_react7.useRef)(null);
26250
26285
  const socketRef = (0, import_react7.useRef)(null);
26251
- const selectedIssueId = issueId ?? null;
26252
26286
  const selectedTab = searchParams.get("tab") === "comments" ? "comments" : "overview";
26253
26287
  const navigate = useNavigate();
26288
+ const selectedBoard = (state && boardId ? findBoard(state, boardId) : null) ?? state?.boards[0] ?? null;
26289
+ const boardSlug = selectedBoard?.ref ?? boardId;
26290
+ const selectedIssue = state && issueId ? findIssue(state, issueId) : null;
26254
26291
  const closeIssueDetails = () => {
26255
- if (!boardId) return;
26256
- void navigate(`/board/${boardId}`);
26292
+ if (!boardSlug) return;
26293
+ void navigate(`/board/${boardSlug}`);
26257
26294
  };
26258
- const selectedBoard = state?.boards.find((board) => board.id === boardId) ?? state?.boards[0] ?? null;
26259
- const selectedIssue = state && selectedIssueId ? findIssue(state, selectedIssueId) : null;
26260
26295
  const commentsByIssueId = state?.commentsByIssueId ?? {};
26261
26296
  const requestState = () => {
26262
26297
  socketRef.current?.send(JSON.stringify({ type: "state:get" }));
@@ -26285,7 +26320,9 @@ var App = () => {
26285
26320
  if (message.type === "issue:created") {
26286
26321
  const created = getResultValue(message.payload);
26287
26322
  if (created && boardId) {
26288
- void navigate(`/board/${boardId}/${created.id}?tab=overview`);
26323
+ void navigate(
26324
+ `/board/${boardId}/${nodeRef(created.id)}?tab=overview`
26325
+ );
26289
26326
  }
26290
26327
  }
26291
26328
  if (message.type === "failed") {
@@ -26305,7 +26342,7 @@ var App = () => {
26305
26342
  }, [boardId, navigate]);
26306
26343
  (0, import_react7.useEffect)(() => {
26307
26344
  if (!boardId && state?.boards[0]) {
26308
- navigate(`/board/${state.boards[0].id}`, { replace: true });
26345
+ void navigate(`/board/${state.boards[0].ref}`, { replace: true });
26309
26346
  }
26310
26347
  }, [boardId, state, navigate]);
26311
26348
  (0, import_react7.useEffect)(() => {
@@ -26325,12 +26362,12 @@ var App = () => {
26325
26362
  socketRef.current?.send(JSON.stringify({ type, payload }));
26326
26363
  };
26327
26364
  const selectIssue = (nextIssueId) => {
26328
- if (!boardId) return;
26329
- void navigate(`/board/${boardId}/${nextIssueId}?tab=overview`);
26365
+ if (!boardSlug) return;
26366
+ void navigate(`/board/${boardSlug}/${nodeRef(nextIssueId)}?tab=overview`);
26330
26367
  };
26331
26368
  const selectIssueComments = (nextIssueId) => {
26332
- if (!boardId) return;
26333
- void navigate(`/board/${boardId}/${nextIssueId}?tab=comments`);
26369
+ if (!boardSlug) return;
26370
+ void navigate(`/board/${boardSlug}/${nodeRef(nextIssueId)}?tab=comments`);
26334
26371
  };
26335
26372
  const changeIssueDetailsTab = (nextTab) => {
26336
26373
  setSearchParams(
@@ -26449,7 +26486,7 @@ var App = () => {
26449
26486
  const selectBoard = (nextBoardId) => {
26450
26487
  setBoardMenuOpen(false);
26451
26488
  clearDragState();
26452
- void navigate(`/board/${nextBoardId}`);
26489
+ void navigate(`/board/${nodeRef(nextBoardId)}`);
26453
26490
  };
26454
26491
  const openCreateIssueModal = (swimlaneId) => {
26455
26492
  setCreateIssueModal({
@@ -26550,7 +26587,7 @@ var App = () => {
26550
26587
  {
26551
26588
  swimlane,
26552
26589
  selected: false,
26553
- selectedIssueId,
26590
+ selectedIssueId: selectedIssue?.id ?? null,
26554
26591
  commentsByIssueId,
26555
26592
  dragOver: dragOverSwimlaneId === swimlane.id,
26556
26593
  dropIndex: dropTarget?.swimlaneId === swimlane.id ? dropTarget.index : null,