@beastmode-develeap/beastmode 0.1.205 → 0.1.206
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/web/board.html +94 -4
- package/dist/web/build-commit.txt +1 -1
- package/dist/web/build-stamp.txt +1 -1
- package/package.json +1 -1
package/dist/web/board.html
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
}
|
|
16
16
|
</script>
|
|
17
17
|
<!--BOARD_DATA-->
|
|
18
|
-
<script>window.__BUILD_STAMP__ = "20260509-
|
|
18
|
+
<script>window.__BUILD_STAMP__ = "20260509-103000-fd3a02c";</script>
|
|
19
19
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
20
20
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
21
21
|
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
@@ -4260,7 +4260,7 @@ const STATUSES = [
|
|
|
4260
4260
|
'Waiting for Infra Approval', 'Provisioning Infra', 'Infra Ready',
|
|
4261
4261
|
'Approved & Merge to Main', 'Ready For Review',
|
|
4262
4262
|
'Verifying Prod with Tests', 'Verifying Epic', 'Waiting for Epic Bugs', 'Awaiting Input',
|
|
4263
|
-
'Epic Breakdown Posted', 'Stuck', 'Done',
|
|
4263
|
+
'Epic Breakdown Posted', 'Stuck', 'Done', 'Superseded',
|
|
4264
4264
|
];
|
|
4265
4265
|
|
|
4266
4266
|
const KANBAN_COLUMNS = [
|
|
@@ -5095,12 +5095,88 @@ function DeployModal({ envName, refs, loading, item, selectedProject, onClose })
|
|
|
5095
5095
|
`;
|
|
5096
5096
|
}
|
|
5097
5097
|
|
|
5098
|
+
// ── Superseded Modal ──
|
|
5099
|
+
|
|
5100
|
+
function SupersededModal({ item, onConfirm, onCancel }) {
|
|
5101
|
+
const [supersededBy, setSupersededBy] = useState('');
|
|
5102
|
+
const [reason, setReason] = useState('');
|
|
5103
|
+
const [error, setError] = useState('');
|
|
5104
|
+
const [loading, setLoading] = useState(false);
|
|
5105
|
+
|
|
5106
|
+
const isEpic = (item.task_type || '').toLowerCase() === 'epic';
|
|
5107
|
+
|
|
5108
|
+
useEffect(() => {
|
|
5109
|
+
const handleEsc = (e) => { if (e.key === 'Escape') onCancel(); };
|
|
5110
|
+
document.addEventListener('keydown', handleEsc);
|
|
5111
|
+
return () => document.removeEventListener('keydown', handleEsc);
|
|
5112
|
+
}, []);
|
|
5113
|
+
|
|
5114
|
+
const handleSubmit = async () => {
|
|
5115
|
+
if (isEpic && !supersededBy.trim()) {
|
|
5116
|
+
setError('Epics require a successor item ID (superseded_by).');
|
|
5117
|
+
return;
|
|
5118
|
+
}
|
|
5119
|
+
if (isEpic && !reason.trim()) {
|
|
5120
|
+
setError('Epics require a supersede reason.');
|
|
5121
|
+
return;
|
|
5122
|
+
}
|
|
5123
|
+
setLoading(true);
|
|
5124
|
+
setError('');
|
|
5125
|
+
try {
|
|
5126
|
+
const payload = { status: 'Superseded' };
|
|
5127
|
+
const extra = {};
|
|
5128
|
+
if (supersededBy.trim()) extra.superseded_by = supersededBy.trim();
|
|
5129
|
+
if (reason.trim()) extra.superseded_reason = reason.trim();
|
|
5130
|
+
if (Object.keys(extra).length > 0) payload.extra_columns = extra;
|
|
5131
|
+
await api('PATCH', '/api/board/items/' + item.id, payload);
|
|
5132
|
+
onConfirm();
|
|
5133
|
+
} catch (err) {
|
|
5134
|
+
setError(err.message || 'Failed to update status');
|
|
5135
|
+
} finally {
|
|
5136
|
+
setLoading(false);
|
|
5137
|
+
}
|
|
5138
|
+
};
|
|
5139
|
+
|
|
5140
|
+
return html`
|
|
5141
|
+
<div class="deploy-modal-overlay" data-testid="superseded-modal-overlay"
|
|
5142
|
+
onClick=${(e) => { if (e.target === e.currentTarget) onCancel(); }}>
|
|
5143
|
+
<div class="deploy-modal" data-testid="superseded-modal">
|
|
5144
|
+
<h3>Mark as Superseded</h3>
|
|
5145
|
+
<p style="font-size:13px;color:var(--text-muted);margin:0 0 12px;">
|
|
5146
|
+
This action is permanent. Superseded items cannot be reactivated.
|
|
5147
|
+
</p>
|
|
5148
|
+
${error && html`<div class="error-banner" style="margin-bottom:12px;">${error}</div>`}
|
|
5149
|
+
<label>Successor item ID ${isEpic ? html`<span style="color:var(--danger);">*</span>` : '(optional)'}</label>
|
|
5150
|
+
<input type="text" value=${supersededBy}
|
|
5151
|
+
data-testid="superseded-by-input"
|
|
5152
|
+
placeholder="e.g. 42"
|
|
5153
|
+
onInput=${(e) => setSupersededBy(e.target.value)}
|
|
5154
|
+
style="width:100%;padding:8px;border:1px solid var(--border);border-radius:6px;background:var(--bg);color:var(--text);font-size:13px;box-sizing:border-box;" />
|
|
5155
|
+
<label>Reason ${isEpic ? html`<span style="color:var(--danger);">*</span>` : '(optional)'}</label>
|
|
5156
|
+
<textarea value=${reason}
|
|
5157
|
+
data-testid="superseded-reason-input"
|
|
5158
|
+
placeholder="Why is this item being superseded?"
|
|
5159
|
+
onInput=${(e) => setReason(e.target.value)}
|
|
5160
|
+
style="width:100%;padding:8px;border:1px solid var(--border);border-radius:6px;background:var(--bg);color:var(--text);font-size:13px;box-sizing:border-box;resize:vertical;min-height:60px;" />
|
|
5161
|
+
<div class="deploy-modal-actions">
|
|
5162
|
+
<button onClick=${onCancel} disabled=${loading}>Cancel</button>
|
|
5163
|
+
<button class="btn-primary" onClick=${handleSubmit} disabled=${loading}
|
|
5164
|
+
data-testid="superseded-confirm-btn">
|
|
5165
|
+
${loading ? 'Updating...' : 'Mark Superseded'}
|
|
5166
|
+
</button>
|
|
5167
|
+
</div>
|
|
5168
|
+
</div>
|
|
5169
|
+
</div>
|
|
5170
|
+
`;
|
|
5171
|
+
}
|
|
5172
|
+
|
|
5098
5173
|
// ── Item Detail Sidebar ──
|
|
5099
5174
|
|
|
5100
5175
|
function ItemDetailSidebar({ item, onClose, onStatusChange, selectedProject }) {
|
|
5101
5176
|
const [updates, setUpdates] = useState([]);
|
|
5102
5177
|
const [loadingUpdates, setLoadingUpdates] = useState(true);
|
|
5103
5178
|
const [sortNewest, setSortNewest] = useState(true);
|
|
5179
|
+
const [showSupersededModal, setShowSupersededModal] = useState(false);
|
|
5104
5180
|
// Attachments (Gap 8a — 2026-04-15): list every attachment the
|
|
5105
5181
|
// board service has for this item, render image types as thumbnails
|
|
5106
5182
|
// that open in a new tab when clicked.
|
|
@@ -5300,9 +5376,17 @@ function ItemDetailSidebar({ item, onClose, onStatusChange, selectedProject }) {
|
|
|
5300
5376
|
</div>
|
|
5301
5377
|
<div class="detail-fields">
|
|
5302
5378
|
<label>Status</label>
|
|
5303
|
-
<select value=${item.status || 'New'}
|
|
5379
|
+
<select value=${item.status || 'New'}
|
|
5380
|
+
disabled=${item.status === 'Superseded'}
|
|
5381
|
+
onChange=${async (e) => {
|
|
5382
|
+
const newStatus = e.target.value;
|
|
5383
|
+
if (newStatus === 'Superseded') {
|
|
5384
|
+
e.target.value = item.status || 'New';
|
|
5385
|
+
setShowSupersededModal(true);
|
|
5386
|
+
return;
|
|
5387
|
+
}
|
|
5304
5388
|
try {
|
|
5305
|
-
await api('PATCH', '/api/board/items/' + item.id, { status:
|
|
5389
|
+
await api('PATCH', '/api/board/items/' + item.id, { status: newStatus });
|
|
5306
5390
|
onStatusChange();
|
|
5307
5391
|
} catch (err) { /* ignore */ }
|
|
5308
5392
|
}}>
|
|
@@ -5507,6 +5591,11 @@ function ItemDetailSidebar({ item, onClose, onStatusChange, selectedProject }) {
|
|
|
5507
5591
|
selectedProject=${selectedProject}
|
|
5508
5592
|
onClose=${() => setDeployModal(null)}
|
|
5509
5593
|
/>`}
|
|
5594
|
+
${showSupersededModal && html`<${SupersededModal}
|
|
5595
|
+
item=${item}
|
|
5596
|
+
onConfirm=${() => { setShowSupersededModal(false); onStatusChange(); }}
|
|
5597
|
+
onCancel=${() => setShowSupersededModal(false)}
|
|
5598
|
+
/>`}
|
|
5510
5599
|
`;
|
|
5511
5600
|
}
|
|
5512
5601
|
|
|
@@ -6359,6 +6448,7 @@ function BoardPage({ selectedProject }) {
|
|
|
6359
6448
|
e.preventDefault();
|
|
6360
6449
|
e.currentTarget.classList.remove('drag-over', 'drag-over-invalid');
|
|
6361
6450
|
e.currentTarget.removeAttribute('title');
|
|
6451
|
+
if (status === 'Superseded') return;
|
|
6362
6452
|
const di = dragInfoRef.current;
|
|
6363
6453
|
if (!di) return;
|
|
6364
6454
|
const validStages = (typeof getStagesForType === 'function')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
fd3a02ca51716afc9999e6cc4441295cc82987c0
|
package/dist/web/build-stamp.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
20260509-
|
|
1
|
+
20260509-103000-fd3a02c
|