@industry-theme/backlogmd-kanban-panel 1.1.1 → 1.1.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"KanbanPanel.d.ts","sourceRoot":"","sources":["../../src/panels/KanbanPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6E,MAAM,OAAO,CAAC;AAelG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAiBtD;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAi4CvD,CAAC"}
1
+ {"version":3,"file":"KanbanPanel.d.ts","sourceRoot":"","sources":["../../src/panels/KanbanPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6E,MAAM,OAAO,CAAC;AAelG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAiBtD;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA+8CvD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TaskDetailPanel.d.ts","sourceRoot":"","sources":["../../src/panels/TaskDetailPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAMxE,OAAO,KAAK,EAAE,yBAAyB,EAAqB,MAAM,UAAU,CAAC;AAsG7E;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,yBAAyB;IACrE,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAiDD;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAovB1D,CAAC"}
1
+ {"version":3,"file":"TaskDetailPanel.d.ts","sourceRoot":"","sources":["../../src/panels/TaskDetailPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAMxE,OAAO,KAAK,EAAE,yBAAyB,EAAqB,MAAM,UAAU,CAAC;AAuG7E;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,yBAAyB;IACrE,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAiDD;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA0yB1D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"BoardEmptyState.d.ts","sourceRoot":"","sources":["../../../../src/panels/kanban/components/BoardEmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAK3C,UAAU,oBAAoB;IAC5B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA2I1D,CAAC"}
1
+ {"version":3,"file":"BoardEmptyState.d.ts","sourceRoot":"","sources":["../../../../src/panels/kanban/components/BoardEmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAK3C,UAAU,oBAAoB;IAC5B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAqJ1D,CAAC"}
@@ -9871,17 +9871,27 @@ const BoardEmptyState = ({
9871
9871
  }) => {
9872
9872
  const { theme: theme2 } = useTheme();
9873
9873
  const handleAddTask = useCallback(() => {
9874
- const activeSpan = getActiveSpan();
9875
- activeSpan == null ? void 0 : activeSpan.addEvent("empty.action.clicked", {
9874
+ const tracer = getTracer();
9875
+ const span = tracer.startSpan("board.interaction", {
9876
+ attributes: { "action.type": "add_task" }
9877
+ });
9878
+ span.addEvent("empty.action.clicked", {
9876
9879
  "action.type": "add_task"
9877
9880
  });
9881
+ span.setStatus({ code: SpanStatusCode.OK });
9882
+ span.end();
9878
9883
  onAddTask();
9879
9884
  }, [onAddTask]);
9880
9885
  const handleAddMilestone = useCallback(() => {
9881
- const activeSpan = getActiveSpan();
9882
- activeSpan == null ? void 0 : activeSpan.addEvent("empty.action.clicked", {
9886
+ const tracer = getTracer();
9887
+ const span = tracer.startSpan("board.interaction", {
9888
+ attributes: { "action.type": "add_milestone" }
9889
+ });
9890
+ span.addEvent("empty.action.clicked", {
9883
9891
  "action.type": "add_milestone"
9884
9892
  });
9893
+ span.setStatus({ code: SpanStatusCode.OK });
9894
+ span.end();
9885
9895
  onAddMilestone();
9886
9896
  }, [onAddMilestone]);
9887
9897
  return /* @__PURE__ */ jsxs(
@@ -11084,26 +11094,68 @@ const KanbanPanel = ({
11084
11094
  const [searchQuery, setSearchQuery] = useState("");
11085
11095
  const [isSearchVisible, setIsSearchVisible] = useState(false);
11086
11096
  const searchDebounceRef = useRef(null);
11097
+ useEffect(() => {
11098
+ var _a2;
11099
+ const tracer = getTracer();
11100
+ const span = tracer.startSpan("panel.lifecycle", {
11101
+ attributes: {
11102
+ "panel.id": "kanban-panel"
11103
+ }
11104
+ });
11105
+ span.addEvent("panel.initialized", {
11106
+ "panel.id": "kanban-panel",
11107
+ "has.file.tree": Boolean((_a2 = context2 == null ? void 0 : context2.fileTree) == null ? void 0 : _a2.data),
11108
+ "has.file.system": Boolean(actions == null ? void 0 : actions.writeFile)
11109
+ });
11110
+ span.setStatus({ code: SpanStatusCode.OK });
11111
+ span.end();
11112
+ }, []);
11087
11113
  const handleSearchChange = useCallback((value) => {
11088
11114
  setSearchQuery(value);
11089
11115
  if (searchDebounceRef.current) {
11090
11116
  clearTimeout(searchDebounceRef.current);
11091
11117
  }
11092
11118
  searchDebounceRef.current = setTimeout(() => {
11093
- const activeSpan = getActiveSpan();
11094
11119
  if (value.trim()) {
11095
- activeSpan == null ? void 0 : activeSpan.addEvent("search.performed", {
11120
+ const tracer = getTracer();
11121
+ const span = tracer.startSpan("board.interaction", {
11122
+ attributes: {
11123
+ "search.query": value.trim()
11124
+ }
11125
+ });
11126
+ span.addEvent("search.performed", {
11096
11127
  "search.query": value.trim()
11097
- // Note: results.count is approximate since filteredTasksByStatus updates async
11098
11128
  });
11129
+ span.setStatus({ code: SpanStatusCode.OK });
11130
+ span.end();
11099
11131
  }
11100
11132
  }, 500);
11101
11133
  }, []);
11102
11134
  const handleClearSearch = useCallback(() => {
11103
11135
  setSearchQuery("");
11104
- const activeSpan = getActiveSpan();
11105
- activeSpan == null ? void 0 : activeSpan.addEvent("filter.cleared");
11136
+ const tracer = getTracer();
11137
+ const span = tracer.startSpan("board.interaction");
11138
+ span.addEvent("filter.cleared");
11139
+ span.setStatus({ code: SpanStatusCode.OK });
11140
+ span.end();
11106
11141
  }, []);
11142
+ const handleTabSelect = useCallback((status) => {
11143
+ const previousTab = selectedTab;
11144
+ setSelectedTab(status);
11145
+ const tracer = getTracer();
11146
+ const span = tracer.startSpan("board.interaction", {
11147
+ attributes: {
11148
+ "column.selected": status,
11149
+ "column.previous": previousTab
11150
+ }
11151
+ });
11152
+ span.addEvent("column.selected", {
11153
+ "column.status": status,
11154
+ "column.previous": previousTab
11155
+ });
11156
+ span.setStatus({ code: SpanStatusCode.OK });
11157
+ span.end();
11158
+ }, [selectedTab]);
11107
11159
  const sensors = useSensors(
11108
11160
  useSensor(PointerSensor, {
11109
11161
  activationConstraint: {
@@ -11176,6 +11228,24 @@ const KanbanPanel = ({
11176
11228
  context: context2,
11177
11229
  actions
11178
11230
  });
11231
+ const hasEmittedSkipped = useRef(false);
11232
+ useEffect(() => {
11233
+ if (!isLoading && !isBacklogProject && !hasEmittedSkipped.current) {
11234
+ hasEmittedSkipped.current = true;
11235
+ const tracer = getTracer();
11236
+ const span = tracer.startSpan("board.interaction", {
11237
+ attributes: { "is.backlog.project": false }
11238
+ });
11239
+ span.addEvent("kanban.skipped", {
11240
+ "reason": "not_backlog_project"
11241
+ });
11242
+ span.setStatus({ code: SpanStatusCode.OK });
11243
+ span.end();
11244
+ }
11245
+ if (isBacklogProject) {
11246
+ hasEmittedSkipped.current = false;
11247
+ }
11248
+ }, [isLoading, isBacklogProject]);
11179
11249
  const filteredTasksByStatus = useMemo(() => {
11180
11250
  if (!searchQuery.trim()) {
11181
11251
  return tasksByStatus;
@@ -11269,11 +11339,19 @@ const KanbanPanel = ({
11269
11339
  }, [getTaskById, moveTaskOptimistic]);
11270
11340
  const handleTaskClick = (task) => {
11271
11341
  setSelectedTaskId(task.id);
11272
- const activeSpan = getActiveSpan();
11273
- activeSpan == null ? void 0 : activeSpan.addEvent("task.selected", {
11342
+ const tracer = getTracer();
11343
+ const span = tracer.startSpan("board.interaction", {
11344
+ attributes: {
11345
+ "task.id": task.id,
11346
+ "task.status": task.status || "unknown"
11347
+ }
11348
+ });
11349
+ span.addEvent("task.selected", {
11274
11350
  "task.id": task.id,
11275
11351
  "task.status": task.status || "unknown"
11276
11352
  });
11353
+ span.setStatus({ code: SpanStatusCode.OK });
11354
+ span.end();
11277
11355
  if (events2) {
11278
11356
  events2.emit({
11279
11357
  type: "task:selected",
@@ -11893,7 +11971,7 @@ const KanbanPanel = ({
11893
11971
  return /* @__PURE__ */ jsxs(
11894
11972
  "button",
11895
11973
  {
11896
- onClick: () => setSelectedTab(status),
11974
+ onClick: () => handleTabSelect(status),
11897
11975
  style: {
11898
11976
  flex: 1,
11899
11977
  padding: "10px 12px",
@@ -56497,6 +56575,16 @@ const TaskDetailPanel = ({ context: context2, events: events2, config }) => {
56497
56575
  const hasClaudeWorkflow = ((_a = repoCapabilities == null ? void 0 : repoCapabilities.data) == null ? void 0 : _a.hasClaudeWorkflow) ?? false;
56498
56576
  const handleAssignToClaude = useCallback(() => {
56499
56577
  if (!events2 || !selectedTask) return;
56578
+ const tracer = getTracer();
56579
+ const span = tracer.startSpan("detail.interaction", {
56580
+ attributes: { "task.id": selectedTask.id }
56581
+ });
56582
+ span.addEvent("task.assign.requested", {
56583
+ "task.id": selectedTask.id,
56584
+ "task.title": selectedTask.title
56585
+ });
56586
+ span.setStatus({ code: SpanStatusCode.OK });
56587
+ span.end();
56500
56588
  setClaudeAssignment({ status: "loading" });
56501
56589
  events2.emit({
56502
56590
  type: "task:assign-to-claude",
@@ -56521,6 +56609,19 @@ const TaskDetailPanel = ({ context: context2, events: events2, config }) => {
56521
56609
  }
56522
56610
  });
56523
56611
  }, [events2, selectedTask]);
56612
+ const handleOpenDeleteModal = useCallback(() => {
56613
+ if (!selectedTask) return;
56614
+ const tracer = getTracer();
56615
+ const span = tracer.startSpan("detail.interaction", {
56616
+ attributes: { "task.id": selectedTask.id }
56617
+ });
56618
+ span.addEvent("delete.modal.opened", {
56619
+ "task.id": selectedTask.id
56620
+ });
56621
+ span.setStatus({ code: SpanStatusCode.OK });
56622
+ span.end();
56623
+ setIsDeleteModalOpen(true);
56624
+ }, [selectedTask]);
56524
56625
  const handleDeleteConfirm = useCallback(() => {
56525
56626
  if (!events2 || !selectedTask) return;
56526
56627
  setDeleteState({ status: "loading" });
@@ -56582,6 +56683,15 @@ const TaskDetailPanel = ({ context: context2, events: events2, config }) => {
56582
56683
  events2.on("task:deleted:success", (event) => {
56583
56684
  const payload = event.payload;
56584
56685
  if (payload.taskId === (selectedTask == null ? void 0 : selectedTask.id)) {
56686
+ const tracer = getTracer();
56687
+ const span = tracer.startSpan("task.mutation", {
56688
+ attributes: { "task.id": payload.taskId }
56689
+ });
56690
+ span.addEvent("task.deleted", {
56691
+ "task.id": payload.taskId
56692
+ });
56693
+ span.setStatus({ code: SpanStatusCode.OK });
56694
+ span.end();
56585
56695
  setDeleteState({ status: "success" });
56586
56696
  setIsDeleteModalOpen(false);
56587
56697
  setTimeout(() => {
@@ -56612,7 +56722,18 @@ const TaskDetailPanel = ({ context: context2, events: events2, config }) => {
56612
56722
  });
56613
56723
  };
56614
56724
  }, [events2, selectedTask == null ? void 0 : selectedTask.id]);
56615
- const handleBack = () => {
56725
+ const handleBack = useCallback(() => {
56726
+ if (selectedTask) {
56727
+ const tracer = getTracer();
56728
+ const span = tracer.startSpan("detail.interaction", {
56729
+ attributes: { "task.id": selectedTask.id }
56730
+ });
56731
+ span.addEvent("task.deselected", {
56732
+ "task.id": selectedTask.id
56733
+ });
56734
+ span.setStatus({ code: SpanStatusCode.OK });
56735
+ span.end();
56736
+ }
56616
56737
  setSelectedTask(null);
56617
56738
  setDeleteState({ status: "idle" });
56618
56739
  setIsDeleteModalOpen(false);
@@ -56624,7 +56745,7 @@ const TaskDetailPanel = ({ context: context2, events: events2, config }) => {
56624
56745
  payload: {}
56625
56746
  });
56626
56747
  }
56627
- };
56748
+ }, [selectedTask, events2]);
56628
56749
  if (!selectedTask) {
56629
56750
  return /* @__PURE__ */ jsxs(
56630
56751
  "div",
@@ -56724,7 +56845,7 @@ const TaskDetailPanel = ({ context: context2, events: events2, config }) => {
56724
56845
  deleteState.status === "idle" && /* @__PURE__ */ jsx(
56725
56846
  "button",
56726
56847
  {
56727
- onClick: () => setIsDeleteModalOpen(true),
56848
+ onClick: handleOpenDeleteModal,
56728
56849
  style: {
56729
56850
  display: "flex",
56730
56851
  alignItems: "center",