taskproof 0.3.0__py3-none-any.whl
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.
- taskproof/__init__.py +23 -0
- taskproof/__main__.py +8 -0
- taskproof/adapters/__init__.py +101 -0
- taskproof/adapters/base.py +228 -0
- taskproof/adapters/claude.py +46 -0
- taskproof/adapters/codex.py +140 -0
- taskproof/adapters/custom.py +61 -0
- taskproof/adapters/gemini.py +45 -0
- taskproof/adapters/opencode.py +46 -0
- taskproof/api/__init__.py +1 -0
- taskproof/api/server.py +822 -0
- taskproof/cli.py +1400 -0
- taskproof/concurrency.py +329 -0
- taskproof/dispatch.py +2289 -0
- taskproof/errors.py +55 -0
- taskproof/ledger.py +185 -0
- taskproof/models.py +155 -0
- taskproof/registry.py +1585 -0
- taskproof/schemas/result.json +58 -0
- taskproof/sql/schema.sql +70 -0
- taskproof/storage.py +372 -0
- taskproof/verify.py +615 -0
- taskproof/web/assets/MatrixView-BM8nu9s2.css +446 -0
- taskproof/web/assets/MatrixView-BM8nu9s2.css.gz +0 -0
- taskproof/web/assets/MatrixView-BMsawnxh.js +475 -0
- taskproof/web/assets/MatrixView-BMsawnxh.js.gz +0 -0
- taskproof/web/assets/ProjectsView-BcXcx5Gw.js +302 -0
- taskproof/web/assets/ProjectsView-BcXcx5Gw.js.gz +0 -0
- taskproof/web/assets/ProjectsView-CqNFL-fi.css +23 -0
- taskproof/web/assets/SettingsView-D_-waf0s.js +585 -0
- taskproof/web/assets/SettingsView-D_-waf0s.js.gz +0 -0
- taskproof/web/assets/SettingsView-aqTS3ubB.css +19 -0
- taskproof/web/assets/TaskDrawer-6JoGTH0s.js +597 -0
- taskproof/web/assets/TaskDrawer-6JoGTH0s.js.gz +0 -0
- taskproof/web/assets/TaskDrawer-N299VKzd.css +465 -0
- taskproof/web/assets/TaskDrawer-N299VKzd.css.gz +0 -0
- taskproof/web/assets/TasksView-BWhSHCHi.js +114 -0
- taskproof/web/assets/TasksView-BWhSHCHi.js.gz +0 -0
- taskproof/web/assets/TasksView-Bn08731V.css +30 -0
- taskproof/web/assets/icon-Dw-ohsdc.png +0 -0
- taskproof/web/assets/index-B-PLdDbR.js +75421 -0
- taskproof/web/assets/index-B-PLdDbR.js.gz +0 -0
- taskproof/web/assets/index-NKj7kbYl.css +1234 -0
- taskproof/web/assets/index-NKj7kbYl.css.gz +0 -0
- taskproof/web/index.html +23 -0
- taskproof-0.3.0.dist-info/METADATA +470 -0
- taskproof-0.3.0.dist-info/RECORD +51 -0
- taskproof-0.3.0.dist-info/WHEEL +5 -0
- taskproof-0.3.0.dist-info/entry_points.txt +2 -0
- taskproof-0.3.0.dist-info/licenses/LICENSE +201 -0
- taskproof-0.3.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
import { d as defineComponent, u as useI18n, o as openBlock, c as createElementBlock, w as withKeys, a as withModifiers, b as createBaseVNode, e as createVNode, t as toDisplayString, f as unref, g as createCommentVNode, n as normalizeClass, h as computed, _ as _export_sfc, i as useBoardStore, j as useSettingsStore, k as watch, l as withCtx, m as normalizeStyle, F as Fragment, r as renderList, p as resolveComponent, q as boardQuery, s as useRoute, v as useRouter, H as HIDE_KEY, x as createBlock, R as RANGES, y as createTextVNode, z as columnLabelKey, I as ICONS, A as mergeProps, B as toHandlers, C as owningProject, D as parseBoardFilter, E as visibleProjects, G as visibleColumns, J as gridTracks, K as COLUMNS, L as capChipLabel, M as capMenuFor, N as hiddenTally, O as canGrowBudget, P as groupColumns, Q as filterBoard, S as DEFAULT_CAPS, T as columnWindow } from "./index-B-PLdDbR.js";
|
|
2
|
+
import { S as StatusMark, d as duration, T as TaskDrawer } from "./TaskDrawer-6JoGTH0s.js";
|
|
3
|
+
function acceptancePassed(task) {
|
|
4
|
+
return task.status === "blocked" && task.verify_exit === 0;
|
|
5
|
+
}
|
|
6
|
+
function laneLabel(task) {
|
|
7
|
+
return task.project;
|
|
8
|
+
}
|
|
9
|
+
const _hoisted_1$1 = ["data-status", "aria-expanded"];
|
|
10
|
+
const _hoisted_2$1 = { class: "line-1" };
|
|
11
|
+
const _hoisted_3$1 = { class: "cid" };
|
|
12
|
+
const _hoisted_4$1 = { class: "tail" };
|
|
13
|
+
const _hoisted_5$1 = {
|
|
14
|
+
key: 0,
|
|
15
|
+
class: "stamp good"
|
|
16
|
+
};
|
|
17
|
+
const _hoisted_6$1 = { class: "line-2" };
|
|
18
|
+
const _hoisted_7$1 = { class: "meta" };
|
|
19
|
+
const _hoisted_8$1 = ["title"];
|
|
20
|
+
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
21
|
+
__name: "TaskCard",
|
|
22
|
+
props: {
|
|
23
|
+
task: {},
|
|
24
|
+
expanded: { type: Boolean }
|
|
25
|
+
},
|
|
26
|
+
emits: ["open"],
|
|
27
|
+
setup(__props, { emit: __emit }) {
|
|
28
|
+
const props = __props;
|
|
29
|
+
const emit = __emit;
|
|
30
|
+
const { t } = useI18n();
|
|
31
|
+
const stamp = computed(() => {
|
|
32
|
+
const exit = props.task.verify_exit;
|
|
33
|
+
if (exit == null) return null;
|
|
34
|
+
return { text: exit === 0 ? "✓ 0" : `✗ ${exit}`, cls: exit === 0 ? "good" : "bad" };
|
|
35
|
+
});
|
|
36
|
+
const passBadge = computed(() => acceptancePassed(props.task));
|
|
37
|
+
const lane = computed(() => laneLabel(props.task));
|
|
38
|
+
return (_ctx, _cache) => {
|
|
39
|
+
return openBlock(), createElementBlock("div", {
|
|
40
|
+
class: "tp-card",
|
|
41
|
+
role: "button",
|
|
42
|
+
tabindex: "0",
|
|
43
|
+
"data-status": __props.task.status,
|
|
44
|
+
"aria-expanded": __props.expanded ? "true" : "false",
|
|
45
|
+
onClick: _cache[0] || (_cache[0] = ($event) => emit("open", __props.task.id)),
|
|
46
|
+
onKeydown: [
|
|
47
|
+
_cache[1] || (_cache[1] = withKeys(withModifiers(($event) => emit("open", __props.task.id), ["prevent"]), ["enter"])),
|
|
48
|
+
_cache[2] || (_cache[2] = withKeys(withModifiers(($event) => emit("open", __props.task.id), ["prevent"]), ["space"]))
|
|
49
|
+
]
|
|
50
|
+
}, [
|
|
51
|
+
createBaseVNode("span", _hoisted_2$1, [
|
|
52
|
+
createVNode(StatusMark, {
|
|
53
|
+
status: __props.task.status
|
|
54
|
+
}, null, 8, ["status"]),
|
|
55
|
+
createBaseVNode("span", _hoisted_3$1, toDisplayString(__props.task.id), 1),
|
|
56
|
+
createBaseVNode("span", _hoisted_4$1, [
|
|
57
|
+
passBadge.value ? (openBlock(), createElementBlock("span", _hoisted_5$1, toDisplayString(unref(t)("card.acceptancePassed")), 1)) : createCommentVNode("", true),
|
|
58
|
+
stamp.value ? (openBlock(), createElementBlock("span", {
|
|
59
|
+
key: 1,
|
|
60
|
+
class: normalizeClass(["stamp", stamp.value.cls])
|
|
61
|
+
}, toDisplayString(stamp.value.text), 3)) : createCommentVNode("", true),
|
|
62
|
+
_cache[3] || (_cache[3] = createBaseVNode("span", { class: "chev" }, "▸", -1))
|
|
63
|
+
])
|
|
64
|
+
]),
|
|
65
|
+
createBaseVNode("span", _hoisted_6$1, toDisplayString(__props.task.brief), 1),
|
|
66
|
+
createBaseVNode("span", _hoisted_7$1, [
|
|
67
|
+
createBaseVNode("span", null, toDisplayString(__props.task.adapter ?? "—"), 1),
|
|
68
|
+
createBaseVNode("span", null, toDisplayString(unref(t)("card.attempt")) + " " + toDisplayString(__props.task.attempt ?? 0), 1),
|
|
69
|
+
createBaseVNode("span", null, toDisplayString(unref(duration)(__props.task.started_at, __props.task.finished_at)), 1),
|
|
70
|
+
createBaseVNode("span", null, toDisplayString(unref(t)("card.files")) + " " + toDisplayString(__props.task.files_changed_live ?? __props.task.files_changed ?? 0), 1),
|
|
71
|
+
createBaseVNode("span", {
|
|
72
|
+
class: "lane",
|
|
73
|
+
title: unref(t)("card.lane")
|
|
74
|
+
}, toDisplayString(lane.value), 9, _hoisted_8$1)
|
|
75
|
+
])
|
|
76
|
+
], 40, _hoisted_1$1);
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
const TaskCard = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-695467c5"]]);
|
|
81
|
+
const _hoisted_1 = { class: "matrix-view" };
|
|
82
|
+
const _hoisted_2 = { class: "boardbar" };
|
|
83
|
+
const _hoisted_3 = { class: "fld" };
|
|
84
|
+
const _hoisted_4 = { class: "sel-head" };
|
|
85
|
+
const _hoisted_5 = ["disabled"];
|
|
86
|
+
const _hoisted_6 = ["disabled"];
|
|
87
|
+
const _hoisted_7 = ["title"];
|
|
88
|
+
const _hoisted_8 = { class: "fld" };
|
|
89
|
+
const _hoisted_9 = { class: "rest" };
|
|
90
|
+
const _hoisted_10 = ["title"];
|
|
91
|
+
const _hoisted_11 = {
|
|
92
|
+
key: 1,
|
|
93
|
+
class: "cap"
|
|
94
|
+
};
|
|
95
|
+
const _hoisted_12 = {
|
|
96
|
+
key: 1,
|
|
97
|
+
class: "cap-reached"
|
|
98
|
+
};
|
|
99
|
+
const _hoisted_13 = { class: "matrix" };
|
|
100
|
+
const _hoisted_14 = { class: "hd corner" };
|
|
101
|
+
const _hoisted_15 = ["data-status"];
|
|
102
|
+
const _hoisted_16 = { class: "lb" };
|
|
103
|
+
const _hoisted_17 = { class: "rt" };
|
|
104
|
+
const _hoisted_18 = ["title", "aria-label", "onClick"];
|
|
105
|
+
const _hoisted_19 = ["innerHTML"];
|
|
106
|
+
const _hoisted_20 = { class: "hdctl" };
|
|
107
|
+
const _hoisted_21 = ["data-col", "title"];
|
|
108
|
+
const _hoisted_22 = { class: "cap-chip-label" };
|
|
109
|
+
const _hoisted_23 = ["innerHTML"];
|
|
110
|
+
const _hoisted_24 = { class: "cap-option-label" };
|
|
111
|
+
const _hoisted_25 = {
|
|
112
|
+
key: 0,
|
|
113
|
+
class: "cap-check",
|
|
114
|
+
"aria-hidden": "true"
|
|
115
|
+
};
|
|
116
|
+
const _hoisted_26 = { class: "lane" };
|
|
117
|
+
const _hoisted_27 = ["title"];
|
|
118
|
+
const _hoisted_28 = { class: "pth" };
|
|
119
|
+
const _hoisted_29 = { class: "tally" };
|
|
120
|
+
const _hoisted_30 = { key: 0 };
|
|
121
|
+
const _hoisted_31 = {
|
|
122
|
+
key: 1,
|
|
123
|
+
class: "bad"
|
|
124
|
+
};
|
|
125
|
+
const _hoisted_32 = {
|
|
126
|
+
key: 0,
|
|
127
|
+
class: "dash"
|
|
128
|
+
};
|
|
129
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
130
|
+
__name: "MatrixView",
|
|
131
|
+
setup(__props) {
|
|
132
|
+
const store = useBoardStore();
|
|
133
|
+
const settings = useSettingsStore();
|
|
134
|
+
const route = useRoute();
|
|
135
|
+
const router = useRouter();
|
|
136
|
+
const { t } = useI18n();
|
|
137
|
+
const filter = computed(() => parseBoardFilter(route.query));
|
|
138
|
+
const projects = computed(() => visibleProjects(store.projectGroups, filter.value));
|
|
139
|
+
const lanes = computed(() => visibleColumns(filter.value));
|
|
140
|
+
const gridStyle = computed(() => ({ gridTemplateColumns: gridTracks(lanes.value.length) }));
|
|
141
|
+
const allProjectIds = computed(() => store.projectGroups.map((group) => group.id));
|
|
142
|
+
const selectedProjects = computed(() => filter.value.projects ?? allProjectIds.value);
|
|
143
|
+
const columns = computed(
|
|
144
|
+
() => groupColumns(filterBoard(store.tasks, filter.value, Date.now(), store.laneProject))
|
|
145
|
+
);
|
|
146
|
+
function capFor(key) {
|
|
147
|
+
return settings.settings.columnCaps[key] ?? DEFAULT_CAPS[key] ?? 0;
|
|
148
|
+
}
|
|
149
|
+
const windows = computed(() => {
|
|
150
|
+
const out = {};
|
|
151
|
+
for (const column of COLUMNS) {
|
|
152
|
+
out[column.key] = columnWindow(columns.value[column.key] ?? [], capFor(column.key));
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
});
|
|
156
|
+
const capChips = computed(() => {
|
|
157
|
+
const out = {};
|
|
158
|
+
for (const column of COLUMNS) {
|
|
159
|
+
out[column.key] = capChipLabel(
|
|
160
|
+
windows.value[column.key],
|
|
161
|
+
capFor(column.key)
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
return out;
|
|
165
|
+
});
|
|
166
|
+
const capMenus = computed(() => {
|
|
167
|
+
const out = {};
|
|
168
|
+
for (const column of COLUMNS) {
|
|
169
|
+
out[column.key] = capMenuFor(capFor(column.key));
|
|
170
|
+
}
|
|
171
|
+
return out;
|
|
172
|
+
});
|
|
173
|
+
const hidden = computed(() => hiddenTally(filter.value, columns.value));
|
|
174
|
+
const canGrow = computed(() => canGrowBudget(store.fetchBudget));
|
|
175
|
+
const shown = computed(() => {
|
|
176
|
+
const out = { ...columns.value };
|
|
177
|
+
for (const column of COLUMNS) out[column.key] = windows.value[column.key].visible;
|
|
178
|
+
return out;
|
|
179
|
+
});
|
|
180
|
+
function tasksIn(projectId, columnKey) {
|
|
181
|
+
return (shown.value[columnKey] ?? []).filter(
|
|
182
|
+
(task) => owningProject(task, store.laneProject) === projectId
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
function laneCount(group) {
|
|
186
|
+
return group.taskgroups.length;
|
|
187
|
+
}
|
|
188
|
+
function groupTasks(group) {
|
|
189
|
+
return Object.values(group.summary).reduce((sum, n) => sum + (n || 0), 0);
|
|
190
|
+
}
|
|
191
|
+
function groupFlying(group) {
|
|
192
|
+
return (group.summary.running ?? 0) + (group.summary.verifying ?? 0);
|
|
193
|
+
}
|
|
194
|
+
function groupFailed(group) {
|
|
195
|
+
return (group.summary.failed ?? 0) + (group.summary.timeout ?? 0);
|
|
196
|
+
}
|
|
197
|
+
function aliasHint(group) {
|
|
198
|
+
return group.aliases.join(", ");
|
|
199
|
+
}
|
|
200
|
+
function onCapCommand(key, command) {
|
|
201
|
+
if (typeof command === "number") settings.setColumnCap(key, command);
|
|
202
|
+
}
|
|
203
|
+
function isExpanded(id) {
|
|
204
|
+
return route.params.taskId === id;
|
|
205
|
+
}
|
|
206
|
+
function openTask(id) {
|
|
207
|
+
void router.push({ name: "matrix", params: { taskId: id }, query: route.query });
|
|
208
|
+
}
|
|
209
|
+
const BOARD_KEYS = /* @__PURE__ */ new Set(["range", "projects", "project", HIDE_KEY]);
|
|
210
|
+
function applyFilter(patch) {
|
|
211
|
+
const next = { ...filter.value, ...patch };
|
|
212
|
+
const produced = Object.fromEntries(new URLSearchParams(boardQuery(next)));
|
|
213
|
+
const query = {};
|
|
214
|
+
for (const [key, value] of Object.entries(route.query)) {
|
|
215
|
+
if (!BOARD_KEYS.has(key) && value !== void 0) query[key] = value;
|
|
216
|
+
}
|
|
217
|
+
Object.assign(query, produced);
|
|
218
|
+
void router.push({ query });
|
|
219
|
+
}
|
|
220
|
+
function onRange(value) {
|
|
221
|
+
applyFilter({ range: value });
|
|
222
|
+
}
|
|
223
|
+
function hideLane(key) {
|
|
224
|
+
applyFilter({ hidden: [...filter.value.hidden, key] });
|
|
225
|
+
}
|
|
226
|
+
function showAllLanes() {
|
|
227
|
+
applyFilter({ hidden: [] });
|
|
228
|
+
}
|
|
229
|
+
function onProjects(value) {
|
|
230
|
+
const all = allProjectIds.value;
|
|
231
|
+
const isAll = value.length === all.length && all.every((id) => value.includes(id));
|
|
232
|
+
applyFilter({ projects: isAll ? null : [...value] });
|
|
233
|
+
}
|
|
234
|
+
const allProjectsSelected = computed(() => filter.value.projects === null);
|
|
235
|
+
const noProjectsSelected = computed(
|
|
236
|
+
() => filter.value.projects !== null && filter.value.projects.length === 0
|
|
237
|
+
);
|
|
238
|
+
function selectAllProjects() {
|
|
239
|
+
applyFilter({ projects: null });
|
|
240
|
+
}
|
|
241
|
+
function clearProjects() {
|
|
242
|
+
applyFilter({ projects: [] });
|
|
243
|
+
}
|
|
244
|
+
watch(filter, (next) => store.setRange(next.range), { immediate: true });
|
|
245
|
+
return (_ctx, _cache) => {
|
|
246
|
+
const _component_el_option = resolveComponent("el-option");
|
|
247
|
+
const _component_el_select = resolveComponent("el-select");
|
|
248
|
+
const _component_el_dropdown_item = resolveComponent("el-dropdown-item");
|
|
249
|
+
const _component_el_dropdown_menu = resolveComponent("el-dropdown-menu");
|
|
250
|
+
const _component_el_dropdown = resolveComponent("el-dropdown");
|
|
251
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [
|
|
252
|
+
createBaseVNode("div", _hoisted_2, [
|
|
253
|
+
createBaseVNode("label", _hoisted_3, [
|
|
254
|
+
createBaseVNode("span", null, toDisplayString(unref(t)("board.project")), 1),
|
|
255
|
+
createVNode(_component_el_select, {
|
|
256
|
+
class: "sel sel-projects",
|
|
257
|
+
"popper-class": "sel-projects-popper",
|
|
258
|
+
size: "small",
|
|
259
|
+
multiple: "",
|
|
260
|
+
filterable: "",
|
|
261
|
+
"collapse-tags": "",
|
|
262
|
+
"collapse-tags-tooltip": "",
|
|
263
|
+
"model-value": selectedProjects.value,
|
|
264
|
+
onChange: onProjects
|
|
265
|
+
}, {
|
|
266
|
+
header: withCtx(() => [
|
|
267
|
+
createBaseVNode("div", _hoisted_4, [
|
|
268
|
+
createBaseVNode("button", {
|
|
269
|
+
type: "button",
|
|
270
|
+
disabled: allProjectsSelected.value,
|
|
271
|
+
onClick: withModifiers(selectAllProjects, ["stop", "prevent"])
|
|
272
|
+
}, toDisplayString(unref(t)("rail.all")), 9, _hoisted_5),
|
|
273
|
+
createBaseVNode("button", {
|
|
274
|
+
type: "button",
|
|
275
|
+
disabled: noProjectsSelected.value,
|
|
276
|
+
onClick: withModifiers(clearProjects, ["stop", "prevent"])
|
|
277
|
+
}, toDisplayString(unref(t)("rail.none")), 9, _hoisted_6)
|
|
278
|
+
])
|
|
279
|
+
]),
|
|
280
|
+
default: withCtx(() => [
|
|
281
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(unref(store).projectGroups, (group) => {
|
|
282
|
+
return openBlock(), createBlock(_component_el_option, {
|
|
283
|
+
key: group.id,
|
|
284
|
+
value: group.id,
|
|
285
|
+
label: group.id
|
|
286
|
+
}, {
|
|
287
|
+
default: withCtx(() => [
|
|
288
|
+
createBaseVNode("span", {
|
|
289
|
+
title: aliasHint(group) || void 0
|
|
290
|
+
}, toDisplayString(group.id), 9, _hoisted_7)
|
|
291
|
+
]),
|
|
292
|
+
_: 2
|
|
293
|
+
}, 1032, ["value", "label"]);
|
|
294
|
+
}), 128))
|
|
295
|
+
]),
|
|
296
|
+
_: 1
|
|
297
|
+
}, 8, ["model-value"])
|
|
298
|
+
]),
|
|
299
|
+
createBaseVNode("label", _hoisted_8, [
|
|
300
|
+
createBaseVNode("span", null, toDisplayString(unref(t)("board.range")), 1),
|
|
301
|
+
createVNode(_component_el_select, {
|
|
302
|
+
class: "sel",
|
|
303
|
+
size: "small",
|
|
304
|
+
"model-value": filter.value.range,
|
|
305
|
+
onChange: onRange
|
|
306
|
+
}, {
|
|
307
|
+
default: withCtx(() => [
|
|
308
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(unref(RANGES), (r) => {
|
|
309
|
+
return openBlock(), createBlock(_component_el_option, {
|
|
310
|
+
key: r,
|
|
311
|
+
value: r,
|
|
312
|
+
label: unref(t)(`board.ranges.${r}`)
|
|
313
|
+
}, null, 8, ["value", "label"]);
|
|
314
|
+
}), 128))
|
|
315
|
+
]),
|
|
316
|
+
_: 1
|
|
317
|
+
}, 8, ["model-value"])
|
|
318
|
+
]),
|
|
319
|
+
createBaseVNode("div", _hoisted_9, [
|
|
320
|
+
hidden.value.count > 0 ? (openBlock(), createElementBlock("button", {
|
|
321
|
+
key: 0,
|
|
322
|
+
type: "button",
|
|
323
|
+
class: "hidden-lanes",
|
|
324
|
+
title: unref(t)("board.showAllLanes"),
|
|
325
|
+
onClick: showAllLanes
|
|
326
|
+
}, toDisplayString(unref(t)("board.hiddenLanes", { n: hidden.value.count, m: hidden.value.cards })), 9, _hoisted_10)) : createCommentVNode("", true),
|
|
327
|
+
unref(store).capped ? (openBlock(), createElementBlock("div", _hoisted_11, [
|
|
328
|
+
createBaseVNode("span", null, toDisplayString(unref(t)("board.capped", { n: unref(store).tasks.length })), 1),
|
|
329
|
+
canGrow.value ? (openBlock(), createElementBlock("button", {
|
|
330
|
+
key: 0,
|
|
331
|
+
type: "button",
|
|
332
|
+
class: "grow",
|
|
333
|
+
onClick: _cache[0] || (_cache[0] = ($event) => unref(store).growBudget())
|
|
334
|
+
}, toDisplayString(unref(t)("board.continue")), 1)) : (openBlock(), createElementBlock("span", _hoisted_12, toDisplayString(unref(t)("board.capReached")), 1))
|
|
335
|
+
])) : createCommentVNode("", true)
|
|
336
|
+
])
|
|
337
|
+
]),
|
|
338
|
+
createBaseVNode("div", _hoisted_13, [
|
|
339
|
+
createBaseVNode("div", {
|
|
340
|
+
class: "grid",
|
|
341
|
+
style: normalizeStyle(gridStyle.value)
|
|
342
|
+
}, [
|
|
343
|
+
createBaseVNode("div", _hoisted_14, toDisplayString(unref(t)("rail.title")), 1),
|
|
344
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(lanes.value, (column, index) => {
|
|
345
|
+
return openBlock(), createElementBlock("div", {
|
|
346
|
+
key: column.key,
|
|
347
|
+
class: normalizeClass(["hd", { zcol: index % 2 === 1 }]),
|
|
348
|
+
"data-status": column.key
|
|
349
|
+
}, [
|
|
350
|
+
createBaseVNode("span", _hoisted_16, [
|
|
351
|
+
createVNode(StatusMark, {
|
|
352
|
+
status: column.key,
|
|
353
|
+
shape: "dot"
|
|
354
|
+
}, null, 8, ["status"]),
|
|
355
|
+
createTextVNode(" " + toDisplayString(unref(t)(unref(columnLabelKey)(column.key))), 1)
|
|
356
|
+
]),
|
|
357
|
+
createBaseVNode("span", _hoisted_17, [
|
|
358
|
+
createBaseVNode("button", {
|
|
359
|
+
type: "button",
|
|
360
|
+
class: "lane-hide",
|
|
361
|
+
title: unref(t)("board.hideLane", { name: unref(t)(unref(columnLabelKey)(column.key)) }),
|
|
362
|
+
"aria-label": unref(t)("board.hideLane", { name: unref(t)(unref(columnLabelKey)(column.key)) }),
|
|
363
|
+
onClick: ($event) => hideLane(column.key)
|
|
364
|
+
}, [
|
|
365
|
+
createBaseVNode("span", {
|
|
366
|
+
innerHTML: unref(ICONS).eyeOff
|
|
367
|
+
}, null, 8, _hoisted_19)
|
|
368
|
+
], 8, _hoisted_18)
|
|
369
|
+
]),
|
|
370
|
+
createBaseVNode("div", _hoisted_20, [
|
|
371
|
+
createVNode(_component_el_dropdown, {
|
|
372
|
+
class: "cap-dd",
|
|
373
|
+
trigger: "click",
|
|
374
|
+
placement: "bottom-end",
|
|
375
|
+
"popper-class": "cap-menu-popper",
|
|
376
|
+
teleported: true,
|
|
377
|
+
onCommand: (value) => onCapCommand(column.key, value)
|
|
378
|
+
}, {
|
|
379
|
+
dropdown: withCtx(() => [
|
|
380
|
+
createVNode(_component_el_dropdown_menu, null, {
|
|
381
|
+
default: withCtx(() => [
|
|
382
|
+
createVNode(_component_el_dropdown_item, {
|
|
383
|
+
disabled: "",
|
|
384
|
+
class: "cap-menu-title"
|
|
385
|
+
}, {
|
|
386
|
+
default: withCtx(() => [
|
|
387
|
+
createTextVNode(toDisplayString(unref(t)("board.capMenu.title")), 1)
|
|
388
|
+
]),
|
|
389
|
+
_: 1
|
|
390
|
+
}),
|
|
391
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(capMenus.value[column.key].options, (option) => {
|
|
392
|
+
return openBlock(), createBlock(_component_el_dropdown_item, {
|
|
393
|
+
key: option.value,
|
|
394
|
+
command: option.value
|
|
395
|
+
}, {
|
|
396
|
+
default: withCtx(() => [
|
|
397
|
+
createBaseVNode("span", _hoisted_24, toDisplayString(unref(t)(option.label.key, option.label.params)), 1),
|
|
398
|
+
option.checked ? (openBlock(), createElementBlock("span", _hoisted_25, "✓")) : createCommentVNode("", true)
|
|
399
|
+
]),
|
|
400
|
+
_: 2
|
|
401
|
+
}, 1032, ["command"]);
|
|
402
|
+
}), 128))
|
|
403
|
+
]),
|
|
404
|
+
_: 2
|
|
405
|
+
}, 1024)
|
|
406
|
+
]),
|
|
407
|
+
default: withCtx(() => [
|
|
408
|
+
createBaseVNode("button", {
|
|
409
|
+
type: "button",
|
|
410
|
+
class: "cap-chip",
|
|
411
|
+
"data-col": column.key,
|
|
412
|
+
title: unref(t)("board.capMenu.title"),
|
|
413
|
+
onClick: _cache[1] || (_cache[1] = withModifiers(() => {
|
|
414
|
+
}, ["stop"])),
|
|
415
|
+
onDblclick: _cache[2] || (_cache[2] = withModifiers(() => {
|
|
416
|
+
}, ["stop"]))
|
|
417
|
+
}, [
|
|
418
|
+
createBaseVNode("span", _hoisted_22, toDisplayString(unref(t)(capChips.value[column.key].key, capChips.value[column.key].params)), 1),
|
|
419
|
+
createBaseVNode("span", {
|
|
420
|
+
class: "cap-caret",
|
|
421
|
+
"aria-hidden": "true",
|
|
422
|
+
innerHTML: unref(ICONS).caret
|
|
423
|
+
}, null, 8, _hoisted_23)
|
|
424
|
+
], 40, _hoisted_21)
|
|
425
|
+
]),
|
|
426
|
+
_: 2
|
|
427
|
+
}, 1032, ["onCommand"])
|
|
428
|
+
])
|
|
429
|
+
], 10, _hoisted_15);
|
|
430
|
+
}), 128)),
|
|
431
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(projects.value, (group) => {
|
|
432
|
+
return openBlock(), createElementBlock(Fragment, {
|
|
433
|
+
key: group.id
|
|
434
|
+
}, [
|
|
435
|
+
createBaseVNode("div", _hoisted_26, [
|
|
436
|
+
createBaseVNode("div", {
|
|
437
|
+
class: "name",
|
|
438
|
+
title: aliasHint(group) || void 0
|
|
439
|
+
}, toDisplayString(group.id), 9, _hoisted_27),
|
|
440
|
+
createBaseVNode("div", _hoisted_28, toDisplayString(group.path), 1),
|
|
441
|
+
createBaseVNode("div", _hoisted_29, [
|
|
442
|
+
createBaseVNode("span", null, toDisplayString(laneCount(group)) + " " + toDisplayString(unref(t)("rail.lanes")), 1),
|
|
443
|
+
createBaseVNode("span", null, toDisplayString(groupTasks(group)) + " " + toDisplayString(unref(t)("rail.tasks")), 1),
|
|
444
|
+
groupFlying(group) ? (openBlock(), createElementBlock("span", _hoisted_30, toDisplayString(groupFlying(group)) + " " + toDisplayString(unref(t)("tally.flying")), 1)) : createCommentVNode("", true),
|
|
445
|
+
groupFailed(group) ? (openBlock(), createElementBlock("span", _hoisted_31, toDisplayString(groupFailed(group)) + " " + toDisplayString(unref(t)("tally.failed")), 1)) : createCommentVNode("", true)
|
|
446
|
+
])
|
|
447
|
+
]),
|
|
448
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(lanes.value, (column, index) => {
|
|
449
|
+
return openBlock(), createElementBlock("div", {
|
|
450
|
+
key: column.key,
|
|
451
|
+
class: normalizeClass(["mcell", { zcol: index % 2 === 1 }])
|
|
452
|
+
}, [
|
|
453
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(tasksIn(group.id, column.key), (task) => {
|
|
454
|
+
return openBlock(), createBlock(TaskCard, mergeProps({
|
|
455
|
+
key: task.id,
|
|
456
|
+
task,
|
|
457
|
+
expanded: isExpanded(task.id)
|
|
458
|
+
}, toHandlers({ open: openTask })), null, 16, ["task", "expanded"]);
|
|
459
|
+
}), 128)),
|
|
460
|
+
!tasksIn(group.id, column.key).length ? (openBlock(), createElementBlock("div", _hoisted_32, "—")) : createCommentVNode("", true)
|
|
461
|
+
], 2);
|
|
462
|
+
}), 128))
|
|
463
|
+
], 64);
|
|
464
|
+
}), 128))
|
|
465
|
+
], 4)
|
|
466
|
+
]),
|
|
467
|
+
createVNode(TaskDrawer)
|
|
468
|
+
]);
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
const MatrixView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-6af3c04d"]]);
|
|
473
|
+
export {
|
|
474
|
+
MatrixView as default
|
|
475
|
+
};
|
|
Binary file
|