@design.estate/dees-catalog 12.5.0 → 13.0.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_bundle/bundle.js +340 -177
- package/dist_bundle/bundle.js.map +1 -1
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/elements/00group-chart/dees-chart-area/component.d.ts +26 -16
- package/dist_ts_web/elements/00group-chart/dees-chart-area/component.js +161 -72
- package/dist_ts_web/elements/00group-chart/dees-chart-area/realtime-updates.d.ts +2 -1
- package/dist_ts_web/elements/00group-chart/dees-chart-area/realtime-updates.js +3 -2
- package/dist_ts_web/elements/00group-chart/dees-chart-area/template.js +4 -3
- package/dist_ts_web/elements/00group-input/dees-input-reference/dees-input-reference.js +4 -4
- package/dist_ts_web/elements/00group-kanban/dees-kanban/dees-kanban.js +32 -18
- package/dist_ts_web/elements/00group-kanban/dees-kanban-card/dees-kanban-card.js +37 -21
- package/dist_ts_web/elements/00group-kanban/dees-kanban-column/dees-kanban-column.js +16 -12
- package/dist_ts_web/elements/00group-kanban/dees-kanban-discussion/dees-kanban-discussion.js +26 -15
- package/dist_ts_web/elements/00group-kanban/dees-kanban-ticket-detail/dees-kanban-ticket-detail.d.ts +2 -0
- package/dist_ts_web/elements/00group-kanban/dees-kanban-ticket-detail/dees-kanban-ticket-detail.js +73 -40
- package/dist_ts_web/elements/00group-kanban/kanban.helpers.d.ts +3 -1
- package/dist_ts_web/elements/00group-kanban/kanban.helpers.js +3 -1
- package/dist_ts_web/elements/00group-kanban/kanban.styles.js +11 -3
- package/package.json +1 -1
- package/readme.md +19 -1
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/00group-chart/dees-chart-area/component.ts +195 -79
- package/ts_web/elements/00group-chart/dees-chart-area/realtime-updates.ts +4 -2
- package/ts_web/elements/00group-chart/dees-chart-area/template.ts +3 -2
- package/ts_web/elements/00group-input/dees-input-reference/dees-input-reference.ts +3 -3
- package/ts_web/elements/00group-kanban/dees-kanban/dees-kanban.ts +31 -17
- package/ts_web/elements/00group-kanban/dees-kanban-card/dees-kanban-card.ts +36 -20
- package/ts_web/elements/00group-kanban/dees-kanban-column/dees-kanban-column.ts +15 -11
- package/ts_web/elements/00group-kanban/dees-kanban-discussion/dees-kanban-discussion.ts +25 -14
- package/ts_web/elements/00group-kanban/dees-kanban-ticket-detail/dees-kanban-ticket-detail.ts +64 -38
- package/ts_web/elements/00group-kanban/kanban.helpers.ts +5 -1
- package/ts_web/elements/00group-kanban/kanban.styles.ts +10 -2
package/dist_bundle/bundle.js
CHANGED
|
@@ -140107,7 +140107,7 @@ var renderChartArea = /* @__PURE__ */ __name((component) => {
|
|
|
140107
140107
|
<div class="chartContainer">
|
|
140108
140108
|
<div class="rangeSelectionOverlay" aria-hidden="true"></div>
|
|
140109
140109
|
</div>
|
|
140110
|
-
${!component.chartSeries.some((series) => series.data.
|
|
140110
|
+
${!component.chartSeries.some((series) => series.data.some((point4) => point4.y !== null)) ? b2`<div class="chartState" role="status">No data for this period</div>` : ""}
|
|
140111
140111
|
${component.seriesStats.length > 0 && !component.hideLegend ? b2`
|
|
140112
140112
|
<div slot="footer" class="statsBar">
|
|
140113
140113
|
${component.seriesStats.map((s9) => b2`
|
|
@@ -140115,7 +140115,7 @@ var renderChartArea = /* @__PURE__ */ __name((component) => {
|
|
|
140115
140115
|
<span class="statsColor" style="background:${s9.color}"></span>
|
|
140116
140116
|
<span class="statsName">${s9.name}</span>
|
|
140117
140117
|
${component.legendStats.filter((key2) => key2 === "latest" || key2 === "min" || key2 === "max" || key2 === "avg").map((key2) => b2`
|
|
140118
|
-
<span class="statsItem">${key2} <strong>${component.yAxisFormatter(s9[key2])}</strong></span>
|
|
140118
|
+
<span class="statsItem">${key2} <strong>${s9[key2] === null ? "\u2014" : component.yAxisFormatter(s9[key2])}</strong></span>
|
|
140119
140119
|
`)}
|
|
140120
140120
|
</div>
|
|
140121
140121
|
`)}
|
|
@@ -140173,7 +140173,7 @@ var planRealtimeChartUpdates = /* @__PURE__ */ __name((renderedData, canonicalDa
|
|
|
140173
140173
|
updates.push({ point: canonicalPoint, historicalUpdate: false });
|
|
140174
140174
|
continue;
|
|
140175
140175
|
}
|
|
140176
|
-
if (renderedPoint.value !== canonicalPoint.value) {
|
|
140176
|
+
if (renderedPoint.value !== canonicalPoint.value || "value" in renderedPoint !== "value" in canonicalPoint) {
|
|
140177
140177
|
updates.push({
|
|
140178
140178
|
point: canonicalPoint,
|
|
140179
140179
|
historicalUpdate: canonicalPoint.time < renderedLastTime
|
|
@@ -140302,6 +140302,9 @@ var _DeesChartArea = class _DeesChartArea extends (_a35 = DeesElement, _chart_de
|
|
|
140302
140302
|
__publicField(this, "autoScrollTimer", null);
|
|
140303
140303
|
__publicField(this, "lcBundle", null);
|
|
140304
140304
|
__publicField(this, "seriesApis", /* @__PURE__ */ new Map());
|
|
140305
|
+
/** LC's data() omits whitespace; this mirrors the exact points sent to each series API. */
|
|
140306
|
+
__publicField(this, "renderedSeriesData", /* @__PURE__ */ new Map());
|
|
140307
|
+
__publicField(this, "renderedSegments", []);
|
|
140305
140308
|
__publicField(this, "priceLines", /* @__PURE__ */ new Map());
|
|
140306
140309
|
__publicField(this, "tooltipEl", null);
|
|
140307
140310
|
__publicField(this, "crosshairActive", false);
|
|
@@ -140404,6 +140407,8 @@ var _DeesChartArea = class _DeesChartArea extends (_a35 = DeesElement, _chart_de
|
|
|
140404
140407
|
console.error("Error destroying chart:", error);
|
|
140405
140408
|
} finally {
|
|
140406
140409
|
this.seriesApis.clear();
|
|
140410
|
+
this.renderedSeriesData.clear();
|
|
140411
|
+
this.renderedSegments = [];
|
|
140407
140412
|
this.priceLines.clear();
|
|
140408
140413
|
}
|
|
140409
140414
|
});
|
|
@@ -140498,8 +140503,8 @@ var _DeesChartArea = class _DeesChartArea extends (_a35 = DeesElement, _chart_de
|
|
|
140498
140503
|
for (const point4 of data) {
|
|
140499
140504
|
const ms = typeof point4.x === "number" ? point4.x : new Date(point4.x).getTime();
|
|
140500
140505
|
const time = Math.floor(ms / 1e3);
|
|
140501
|
-
if (!Number.isFinite(time) || !Number.isFinite(point4.y)) continue;
|
|
140502
|
-
pointsByTime.set(time, { time, value: point4.y });
|
|
140506
|
+
if (!Number.isFinite(time) || point4.y !== null && !Number.isFinite(point4.y)) continue;
|
|
140507
|
+
pointsByTime.set(time, point4.y === null ? { time } : { time, value: point4.y });
|
|
140503
140508
|
}
|
|
140504
140509
|
return [...pointsByTime.values()].sort((a4, b4) => a4.time - b4.time);
|
|
140505
140510
|
}
|
|
@@ -140509,6 +140514,41 @@ var _DeesChartArea = class _DeesChartArea extends (_a35 = DeesElement, _chart_de
|
|
|
140509
140514
|
getSeriesKey(series, index3) {
|
|
140510
140515
|
return `${index3}:${this.getSeriesName(series, index3)}`;
|
|
140511
140516
|
}
|
|
140517
|
+
/**
|
|
140518
|
+
* Lightweight Charts joins Area points across whitespace. Render each
|
|
140519
|
+
* uninterrupted numeric run as its own Area series instead. All missing
|
|
140520
|
+
* timestamps stay on the first real series so the time scale keeps them;
|
|
140521
|
+
* there is no synthetic numeric value or extra public legend series.
|
|
140522
|
+
*/
|
|
140523
|
+
getRenderedSegments(chartSeries) {
|
|
140524
|
+
const renderedSegments = [];
|
|
140525
|
+
chartSeries.forEach((series, logicalIndex) => {
|
|
140526
|
+
const points = this.convertDataToLC(series.data);
|
|
140527
|
+
const missingPoints = points.filter((point4) => !("value" in point4));
|
|
140528
|
+
const numericRuns = [];
|
|
140529
|
+
let currentRun = [];
|
|
140530
|
+
for (const point4 of points) {
|
|
140531
|
+
if ("value" in point4) {
|
|
140532
|
+
currentRun.push(point4);
|
|
140533
|
+
} else if (currentRun.length > 0) {
|
|
140534
|
+
numericRuns.push(currentRun);
|
|
140535
|
+
currentRun = [];
|
|
140536
|
+
}
|
|
140537
|
+
}
|
|
140538
|
+
if (currentRun.length > 0) numericRuns.push(currentRun);
|
|
140539
|
+
if (numericRuns.length === 0) numericRuns.push([]);
|
|
140540
|
+
const baseKey = this.getSeriesKey(series, logicalIndex);
|
|
140541
|
+
numericRuns.forEach((run3, segmentIndex) => {
|
|
140542
|
+
const data = segmentIndex === 0 ? [...run3, ...missingPoints].sort((left, right) => left.time - right.time) : run3;
|
|
140543
|
+
renderedSegments.push({
|
|
140544
|
+
key: segmentIndex === 0 ? baseKey : `${baseKey}#${segmentIndex}`,
|
|
140545
|
+
logicalIndex,
|
|
140546
|
+
data
|
|
140547
|
+
});
|
|
140548
|
+
});
|
|
140549
|
+
});
|
|
140550
|
+
return renderedSegments;
|
|
140551
|
+
}
|
|
140512
140552
|
getCanonicalChartSeries(chartSeries) {
|
|
140513
140553
|
const cutoffTime = Date.now() - this.rollingWindow;
|
|
140514
140554
|
return chartSeries.map((series) => ({
|
|
@@ -140519,12 +140559,27 @@ var _DeesChartArea = class _DeesChartArea extends (_a35 = DeesElement, _chart_de
|
|
|
140519
140559
|
return ms > cutoffTime;
|
|
140520
140560
|
})).map((point4) => ({
|
|
140521
140561
|
x: point4.time * 1e3,
|
|
140522
|
-
y: point4.value
|
|
140562
|
+
y: "value" in point4 ? point4.value : null
|
|
140523
140563
|
}))
|
|
140524
140564
|
}));
|
|
140525
140565
|
}
|
|
140526
|
-
getRenderedSeriesData(
|
|
140527
|
-
|
|
140566
|
+
getRenderedSeriesData(segmentKey) {
|
|
140567
|
+
const renderedData = this.renderedSeriesData.get(segmentKey);
|
|
140568
|
+
if (!renderedData) throw new Error(`Missing rendered chart data for ${segmentKey}`);
|
|
140569
|
+
return renderedData;
|
|
140570
|
+
}
|
|
140571
|
+
rememberRenderedSeriesData(segmentKey, data) {
|
|
140572
|
+
this.renderedSeriesData.set(segmentKey, data.map((point4) => "value" in point4 ? { time: point4.time, value: point4.value } : { time: point4.time }));
|
|
140573
|
+
}
|
|
140574
|
+
rememberIncrementalUpdate(segmentKey, point4) {
|
|
140575
|
+
const renderedData = this.getRenderedSeriesData(segmentKey);
|
|
140576
|
+
const existingIndex = renderedData.findIndex((entry) => entry.time === point4.time);
|
|
140577
|
+
if (existingIndex >= 0) renderedData[existingIndex] = point4;
|
|
140578
|
+
else renderedData.push(point4);
|
|
140579
|
+
}
|
|
140580
|
+
toLcPoint(point4) {
|
|
140581
|
+
const time = point4.time;
|
|
140582
|
+
return point4.value === void 0 ? { time } : { time, value: point4.value };
|
|
140528
140583
|
}
|
|
140529
140584
|
colorToRgba(color2, alpha2) {
|
|
140530
140585
|
if (/^#[0-9a-fA-F]{6}$/.test(color2)) {
|
|
@@ -140583,27 +140638,34 @@ var _DeesChartArea = class _DeesChartArea extends (_a35 = DeesElement, _chart_de
|
|
|
140583
140638
|
horzLines: { color: getThemeColors(this.goBright).borderSubtle }
|
|
140584
140639
|
}
|
|
140585
140640
|
});
|
|
140586
|
-
|
|
140587
|
-
|
|
140588
|
-
|
|
140641
|
+
for (const segment of this.renderedSegments) {
|
|
140642
|
+
const api = this.seriesApis.get(segment.key);
|
|
140643
|
+
if (!api) continue;
|
|
140644
|
+
const color2 = this.resolveSeriesColor(
|
|
140645
|
+
this.chartSeries[segment.logicalIndex],
|
|
140646
|
+
segment.logicalIndex,
|
|
140647
|
+
isDark
|
|
140648
|
+
);
|
|
140589
140649
|
api.applyOptions({
|
|
140590
140650
|
topColor: this.colorToRgba(color2, isDark ? 0.4 : 0.5),
|
|
140591
140651
|
bottomColor: this.colorToRgba(color2, 0),
|
|
140592
140652
|
lineColor: color2
|
|
140593
140653
|
});
|
|
140594
|
-
idx++;
|
|
140595
140654
|
}
|
|
140596
140655
|
}
|
|
140597
|
-
recreateSeries(chartSeries) {
|
|
140656
|
+
recreateSeries(chartSeries, renderedSegments = this.getRenderedSegments(chartSeries)) {
|
|
140598
140657
|
if (!this.chart || !this.lcBundle) return;
|
|
140599
140658
|
const isDark = !this.goBright;
|
|
140600
140659
|
for (const [, api] of this.seriesApis) {
|
|
140601
140660
|
this.chart.removeSeries(api);
|
|
140602
140661
|
}
|
|
140603
140662
|
this.seriesApis.clear();
|
|
140663
|
+
this.renderedSeriesData.clear();
|
|
140604
140664
|
this.priceLines.clear();
|
|
140605
|
-
|
|
140606
|
-
|
|
140665
|
+
this.renderedSegments = renderedSegments;
|
|
140666
|
+
renderedSegments.forEach((segment) => {
|
|
140667
|
+
const series = chartSeries[segment.logicalIndex];
|
|
140668
|
+
const color2 = this.resolveSeriesColor(series, segment.logicalIndex, isDark);
|
|
140607
140669
|
const api = this.chart.addSeries(this.lcBundle.AreaSeries, {
|
|
140608
140670
|
topColor: this.colorToRgba(color2, isDark ? 0.4 : 0.5),
|
|
140609
140671
|
bottomColor: this.colorToRgba(color2, 0),
|
|
@@ -140615,9 +140677,12 @@ var _DeesChartArea = class _DeesChartArea extends (_a35 = DeesElement, _chart_de
|
|
|
140615
140677
|
crosshairMarkerVisible: true,
|
|
140616
140678
|
crosshairMarkerRadius: 4
|
|
140617
140679
|
});
|
|
140618
|
-
api.setData(
|
|
140619
|
-
this.
|
|
140620
|
-
this.
|
|
140680
|
+
api.setData(segment.data);
|
|
140681
|
+
this.seriesApis.set(segment.key, api);
|
|
140682
|
+
this.rememberRenderedSeriesData(segment.key, segment.data);
|
|
140683
|
+
if (segment.key === this.getSeriesKey(series, segment.logicalIndex)) {
|
|
140684
|
+
this.updatePriceLines(segment.key, api, series.data, color2);
|
|
140685
|
+
}
|
|
140621
140686
|
});
|
|
140622
140687
|
this.applyYAxisScale(chartSeries);
|
|
140623
140688
|
this.computeStats(chartSeries);
|
|
@@ -140630,17 +140695,19 @@ var _DeesChartArea = class _DeesChartArea extends (_a35 = DeesElement, _chart_de
|
|
|
140630
140695
|
}
|
|
140631
140696
|
updateSeriesPresentation(chartSeries) {
|
|
140632
140697
|
const isDark = !this.goBright;
|
|
140633
|
-
|
|
140634
|
-
const
|
|
140635
|
-
const api = this.seriesApis.get(
|
|
140698
|
+
this.renderedSegments.forEach((segment) => {
|
|
140699
|
+
const series = chartSeries[segment.logicalIndex];
|
|
140700
|
+
const api = this.seriesApis.get(segment.key);
|
|
140636
140701
|
if (!api) return;
|
|
140637
|
-
const color2 = this.resolveSeriesColor(series,
|
|
140702
|
+
const color2 = this.resolveSeriesColor(series, segment.logicalIndex, isDark);
|
|
140638
140703
|
api.applyOptions({
|
|
140639
140704
|
topColor: this.colorToRgba(color2, isDark ? 0.4 : 0.5),
|
|
140640
140705
|
bottomColor: this.colorToRgba(color2, 0),
|
|
140641
140706
|
lineColor: color2
|
|
140642
140707
|
});
|
|
140643
|
-
this.
|
|
140708
|
+
if (segment.key === this.getSeriesKey(series, segment.logicalIndex)) {
|
|
140709
|
+
this.updatePriceLines(segment.key, api, series.data, color2);
|
|
140710
|
+
}
|
|
140644
140711
|
});
|
|
140645
140712
|
this.computeStats(chartSeries);
|
|
140646
140713
|
this.applyYAxisScale(chartSeries);
|
|
@@ -140651,7 +140718,7 @@ var _DeesChartArea = class _DeesChartArea extends (_a35 = DeesElement, _chart_de
|
|
|
140651
140718
|
if (this.yAxisScaling === "dynamic") {
|
|
140652
140719
|
maxValue = 1;
|
|
140653
140720
|
for (const entry of series) for (const point4 of entry.data) {
|
|
140654
|
-
if (!Number.isFinite(point4.y)) continue;
|
|
140721
|
+
if (point4.y === null || !Number.isFinite(point4.y)) continue;
|
|
140655
140722
|
minValue = Math.min(minValue, Math.floor(point4.y * 1.1));
|
|
140656
140723
|
maxValue = Math.max(maxValue, Math.ceil(point4.y * 1.1));
|
|
140657
140724
|
}
|
|
@@ -140674,21 +140741,37 @@ var _DeesChartArea = class _DeesChartArea extends (_a35 = DeesElement, _chart_de
|
|
|
140674
140741
|
flushPendingRealtimePrune() {
|
|
140675
140742
|
if (!this.pendingRealtimePrune || this.crosshairActive || !this.chart || !this.realtimeMode || this.rollingWindow <= 0) return;
|
|
140676
140743
|
const canonicalSeries = this.getCanonicalChartSeries(this.internalChartData);
|
|
140677
|
-
|
|
140678
|
-
|
|
140679
|
-
|
|
140744
|
+
const canonicalSegments = this.getRenderedSegments(canonicalSeries);
|
|
140745
|
+
if (!haveSameSeriesLayout(
|
|
140746
|
+
[...this.seriesApis.keys()],
|
|
140747
|
+
canonicalSegments.map((segment) => segment.key)
|
|
140748
|
+
)) {
|
|
140749
|
+
this.clearCrosshairForDataReplacement();
|
|
140750
|
+
this.internalChartData = canonicalSeries;
|
|
140751
|
+
this.recreateSeries(canonicalSeries, canonicalSegments);
|
|
140752
|
+
return;
|
|
140753
|
+
}
|
|
140754
|
+
canonicalSegments.forEach((segment) => {
|
|
140755
|
+
const api = this.seriesApis.get(segment.key);
|
|
140756
|
+
if (api) {
|
|
140757
|
+
api.setData(segment.data);
|
|
140758
|
+
this.rememberRenderedSeriesData(segment.key, segment.data);
|
|
140759
|
+
}
|
|
140680
140760
|
});
|
|
140761
|
+
this.internalChartData = canonicalSeries;
|
|
140762
|
+
this.renderedSegments = canonicalSegments;
|
|
140681
140763
|
this.pendingRealtimePrune = false;
|
|
140764
|
+
this.updateSeriesPresentation(canonicalSeries);
|
|
140682
140765
|
}
|
|
140683
140766
|
computeStats(chartSeries) {
|
|
140684
140767
|
const isDark = !this.goBright;
|
|
140685
140768
|
this.seriesStats = chartSeries.map((s9, index3) => {
|
|
140686
140769
|
const color2 = this.resolveSeriesColor(s9, index3, isDark);
|
|
140687
|
-
const values = s9.data.map((
|
|
140770
|
+
const values = s9.data.map((point4) => point4.y).filter((value2) => value2 !== null && Number.isFinite(value2));
|
|
140771
|
+
const latest = s9.data.length > 0 ? s9.data[s9.data.length - 1].y : null;
|
|
140688
140772
|
if (values.length === 0) {
|
|
140689
|
-
return { name: s9.name || `series-${index3}`, latest:
|
|
140773
|
+
return { name: s9.name || `series-${index3}`, latest: null, min: null, max: null, avg: null, color: color2 };
|
|
140690
140774
|
}
|
|
140691
|
-
const latest = values[values.length - 1];
|
|
140692
140775
|
const min3 = Math.min(...values);
|
|
140693
140776
|
const max3 = Math.max(...values);
|
|
140694
140777
|
const avg = Math.round(values.reduce((sum, v4) => sum + v4, 0) / values.length * 100) / 100;
|
|
@@ -140702,11 +140785,11 @@ var _DeesChartArea = class _DeesChartArea extends (_a35 = DeesElement, _chart_de
|
|
|
140702
140785
|
api.removePriceLine(line);
|
|
140703
140786
|
}
|
|
140704
140787
|
}
|
|
140705
|
-
|
|
140788
|
+
const values = data.map((point4) => point4.y).filter((value2) => value2 !== null && Number.isFinite(value2));
|
|
140789
|
+
if (values.length === 0) {
|
|
140706
140790
|
this.priceLines.set(name, []);
|
|
140707
140791
|
return;
|
|
140708
140792
|
}
|
|
140709
|
-
const values = data.map((d5) => d5.y);
|
|
140710
140793
|
const avg = values.reduce((sum, v4) => sum + v4, 0) / values.length;
|
|
140711
140794
|
const max3 = Math.max(...values);
|
|
140712
140795
|
const lines = [];
|
|
@@ -140754,23 +140837,24 @@ var _DeesChartArea = class _DeesChartArea extends (_a35 = DeesElement, _chart_de
|
|
|
140754
140837
|
const textColor = isDark ? "hsl(0 0% 95%)" : "hsl(0 0% 9%)";
|
|
140755
140838
|
const borderColor = isDark ? "hsl(0 0% 14.9%)" : "hsl(0 0% 89.8%)";
|
|
140756
140839
|
let html8 = "";
|
|
140757
|
-
let idx = 0;
|
|
140758
140840
|
let hasData = false;
|
|
140759
|
-
for (const
|
|
140841
|
+
for (const segment of this.renderedSegments) {
|
|
140842
|
+
const api = this.seriesApis.get(segment.key);
|
|
140843
|
+
if (!api) continue;
|
|
140760
140844
|
const data = param.seriesData.get(api);
|
|
140761
|
-
if (data && "value" in data && data.value
|
|
140845
|
+
if (data && "value" in data && typeof data.value === "number") {
|
|
140846
|
+
const marginTop = hasData ? "6px" : "0";
|
|
140762
140847
|
hasData = true;
|
|
140763
|
-
const series = this.internalChartData[
|
|
140764
|
-
const name =
|
|
140765
|
-
const color2 = this.resolveSeriesColor(series,
|
|
140848
|
+
const series = this.internalChartData[segment.logicalIndex];
|
|
140849
|
+
const name = this.getSeriesName(series, segment.logicalIndex);
|
|
140850
|
+
const color2 = this.resolveSeriesColor(series, segment.logicalIndex, isDark);
|
|
140766
140851
|
const formatted = this.yAxisFormatter(data.value);
|
|
140767
|
-
html8 += `<div style="display:flex;align-items:center;gap:8px;margin:${
|
|
140852
|
+
html8 += `<div style="display:flex;align-items:center;gap:8px;margin:${marginTop} 0;">
|
|
140768
140853
|
<span style="display:inline-block;width:10px;height:10px;background:${color2};border-radius:2px;"></span>
|
|
140769
140854
|
<span style="font-weight:500;">${name}:</span>
|
|
140770
140855
|
<span style="margin-left:auto;font-weight:600;">${formatted}</span>
|
|
140771
140856
|
</div>`;
|
|
140772
140857
|
}
|
|
140773
|
-
idx++;
|
|
140774
140858
|
}
|
|
140775
140859
|
if (!hasData) {
|
|
140776
140860
|
this.tooltipEl.style.display = "none";
|
|
@@ -140887,69 +140971,65 @@ var _DeesChartArea = class _DeesChartArea extends (_a35 = DeesElement, _chart_de
|
|
|
140887
140971
|
try {
|
|
140888
140972
|
void animate;
|
|
140889
140973
|
const canonicalSeries = this.getCanonicalChartSeries(newSeries);
|
|
140974
|
+
const renderedSegments = this.getRenderedSegments(canonicalSeries);
|
|
140890
140975
|
this.internalChartData = canonicalSeries;
|
|
140891
140976
|
const renderedKeys = [...this.seriesApis.keys()];
|
|
140892
|
-
const canonicalKeys =
|
|
140977
|
+
const canonicalKeys = renderedSegments.map((segment) => segment.key);
|
|
140893
140978
|
if (!haveSameSeriesLayout(renderedKeys, canonicalKeys)) {
|
|
140894
140979
|
this.clearCrosshairForDataReplacement();
|
|
140895
|
-
this.recreateSeries(canonicalSeries);
|
|
140980
|
+
this.recreateSeries(canonicalSeries, renderedSegments);
|
|
140896
140981
|
this.updateSeriesPresentation(canonicalSeries);
|
|
140897
140982
|
return;
|
|
140898
140983
|
}
|
|
140984
|
+
this.renderedSegments = renderedSegments;
|
|
140899
140985
|
if (!this.realtimeMode || this.rollingWindow <= 0) {
|
|
140900
140986
|
this.clearCrosshairForDataReplacement();
|
|
140901
|
-
|
|
140902
|
-
this.seriesApis.get(
|
|
140987
|
+
renderedSegments.forEach((segment) => {
|
|
140988
|
+
this.seriesApis.get(segment.key).setData(segment.data);
|
|
140989
|
+
this.rememberRenderedSeriesData(segment.key, segment.data);
|
|
140903
140990
|
});
|
|
140904
140991
|
this.pendingRealtimePrune = false;
|
|
140905
140992
|
this.updateSeriesPresentation(canonicalSeries);
|
|
140906
140993
|
return;
|
|
140907
140994
|
}
|
|
140908
|
-
const plannedUpdates =
|
|
140909
|
-
const api = this.seriesApis.get(
|
|
140910
|
-
const canonicalData =
|
|
140995
|
+
const plannedUpdates = renderedSegments.map((segment) => {
|
|
140996
|
+
const api = this.seriesApis.get(segment.key);
|
|
140997
|
+
const canonicalData = segment.data.map((point4) => "value" in point4 ? { time: point4.time, value: point4.value } : { time: point4.time });
|
|
140911
140998
|
return {
|
|
140999
|
+
key: segment.key,
|
|
140912
141000
|
api,
|
|
140913
141001
|
canonicalData,
|
|
140914
|
-
plan: planRealtimeChartUpdates(this.getRenderedSeriesData(
|
|
141002
|
+
plan: planRealtimeChartUpdates(this.getRenderedSeriesData(segment.key), canonicalData)
|
|
140915
141003
|
};
|
|
140916
141004
|
});
|
|
140917
141005
|
if (plannedUpdates.some(({ plan }) => plan.replacementRequired)) {
|
|
140918
141006
|
this.clearCrosshairForDataReplacement();
|
|
140919
|
-
for (const { api, canonicalData } of plannedUpdates) {
|
|
140920
|
-
api.setData(canonicalData.map((point4) => (
|
|
140921
|
-
|
|
140922
|
-
value: point4.value
|
|
140923
|
-
})));
|
|
141007
|
+
for (const { key: key2, api, canonicalData } of plannedUpdates) {
|
|
141008
|
+
api.setData(canonicalData.map((point4) => this.toLcPoint(point4)));
|
|
141009
|
+
this.renderedSeriesData.set(key2, [...canonicalData]);
|
|
140924
141010
|
}
|
|
140925
141011
|
this.pendingRealtimePrune = false;
|
|
140926
141012
|
} else {
|
|
140927
|
-
for (const { api, plan } of plannedUpdates) {
|
|
141013
|
+
for (const { key: key2, api, plan } of plannedUpdates) {
|
|
140928
141014
|
for (const update of plan.updates) {
|
|
140929
|
-
api.update(
|
|
140930
|
-
|
|
140931
|
-
value: update.point.value
|
|
140932
|
-
}, update.historicalUpdate);
|
|
141015
|
+
api.update(this.toLcPoint(update.point), update.historicalUpdate);
|
|
141016
|
+
this.rememberIncrementalUpdate(key2, update.point);
|
|
140933
141017
|
}
|
|
140934
141018
|
}
|
|
140935
141019
|
const pruneRequired = plannedUpdates.some(({ plan }) => plan.pruneRequired);
|
|
140936
141020
|
const pruneRecommended = plannedUpdates.some(({ plan }) => plan.pruneRecommended);
|
|
140937
141021
|
if (pruneRequired) {
|
|
140938
141022
|
this.clearCrosshairForDataReplacement();
|
|
140939
|
-
for (const { api, canonicalData } of plannedUpdates) {
|
|
140940
|
-
api.setData(canonicalData.map((point4) => (
|
|
140941
|
-
|
|
140942
|
-
value: point4.value
|
|
140943
|
-
})));
|
|
141023
|
+
for (const { key: key2, api, canonicalData } of plannedUpdates) {
|
|
141024
|
+
api.setData(canonicalData.map((point4) => this.toLcPoint(point4)));
|
|
141025
|
+
this.renderedSeriesData.set(key2, [...canonicalData]);
|
|
140944
141026
|
}
|
|
140945
141027
|
} else if (pruneRecommended && this.crosshairActive) {
|
|
140946
141028
|
this.pendingRealtimePrune = true;
|
|
140947
141029
|
} else if (pruneRecommended) {
|
|
140948
|
-
for (const { api, canonicalData } of plannedUpdates) {
|
|
140949
|
-
api.setData(canonicalData.map((point4) => (
|
|
140950
|
-
|
|
140951
|
-
value: point4.value
|
|
140952
|
-
})));
|
|
141030
|
+
for (const { key: key2, api, canonicalData } of plannedUpdates) {
|
|
141031
|
+
api.setData(canonicalData.map((point4) => this.toLcPoint(point4)));
|
|
141032
|
+
this.renderedSeriesData.set(key2, [...canonicalData]);
|
|
140953
141033
|
}
|
|
140954
141034
|
this.pendingRealtimePrune = false;
|
|
140955
141035
|
}
|
|
@@ -183699,7 +183779,7 @@ var DeesTerminalView = _DeesTerminalView;
|
|
|
183699
183779
|
init_dist_ts26();
|
|
183700
183780
|
init_theme();
|
|
183701
183781
|
var kanbanStyles = [themeDefaultStyles, cssManager.defaultStyles, i`
|
|
183702
|
-
:host { display: block; min-width: 0; font-family: var(--dees-font-family); color: var(--dees-color-text-primary); font-size: var(--dees-font-
|
|
183782
|
+
:host { display: block; min-width: 0; font-family: var(--dees-font-family); color: var(--dees-color-text-primary); font-size: var(--dees-font-subhead-size); line-height: 1.5; }
|
|
183703
183783
|
* { box-sizing: border-box; }
|
|
183704
183784
|
h2, h3, p { margin: 0; }
|
|
183705
183785
|
.muted { color: var(--dees-color-text-secondary); }
|
|
@@ -183711,10 +183791,20 @@ var kanbanStyles = [themeDefaultStyles, cssManager.defaultStyles, i`
|
|
|
183711
183791
|
button.link { border: 0; background: transparent; font: inherit; color: var(--dees-color-link); padding: 2px 0; text-align: left; cursor: pointer; overflow-wrap: anywhere; }
|
|
183712
183792
|
button:focus-visible, summary:focus-visible { outline: 2px solid var(--dees-color-focus-ring); outline-offset: 3px; border-radius: var(--dees-radius-sm); }
|
|
183713
183793
|
dees-icon { font-size: 16px; }
|
|
183714
|
-
.badge { display: inline-flex; align-items: center; gap: 4px; background: var(--dees-color-
|
|
183794
|
+
.badge { display: inline-flex; align-items: center; gap: 4px; background: var(--dees-color-fill-tertiary); padding: 3px 7px; border-radius: var(--dees-radius-sm); font-size: var(--dees-font-caption1-size); color: var(--dees-color-text-secondary); }
|
|
183795
|
+
.avatar { flex: 0 0 auto; width: 24px; height: 24px; border-radius: 50%; background: var(--dees-color-fill-secondary); color: var(--dees-color-text-secondary); display: inline-grid; place-items: center; font-size: 10px; font-weight: 600; line-height: 1; }
|
|
183796
|
+
.priority { display: inline-flex; align-items: center; gap: 3px; font-size: var(--dees-font-caption1-size); color: var(--dees-color-text-secondary); text-transform: capitalize; }
|
|
183797
|
+
.priority[data-priority=urgent] { color: var(--dees-color-text-error); }
|
|
183798
|
+
.priority[data-priority=high] { color: var(--dees-color-text-warning); }
|
|
183799
|
+
.priority dees-icon { font-size: 13px; }
|
|
183800
|
+
.section-title { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
|
|
183801
|
+
.section-title h3 { font-size: var(--dees-font-footnote-size); font-weight: 600; }
|
|
183802
|
+
.count { display: inline-grid; place-items: center; min-width: 20px; height: 20px; padding: 0 5px; border-radius: var(--dees-radius-sm); background: var(--dees-color-fill-tertiary); color: var(--dees-color-text-secondary); font-size: var(--dees-font-caption1-size); font-weight: 500; font-variant-numeric: tabular-nums; }
|
|
183715
183803
|
`];
|
|
183716
183804
|
|
|
183717
183805
|
// ts_web/elements/00group-kanban/kanban.helpers.ts
|
|
183806
|
+
var kanbanInitials = /* @__PURE__ */ __name((name) => name.trim().split(/\s+/).map((part) => part[0]).join("").slice(0, 2), "kanbanInitials");
|
|
183807
|
+
var kanbanPriorityIcon = /* @__PURE__ */ __name((priority) => priority === "urgent" ? "lucide:ChevronsUp" : priority === "high" ? "lucide:ChevronUp" : priority === "low" ? "lucide:ChevronDown" : "lucide:Minus", "kanbanPriorityIcon");
|
|
183718
183808
|
var sortKanbanTickets = /* @__PURE__ */ __name((tickets) => [...tickets].sort((a4, b4) => a4.order - b4.order || a4.id.localeCompare(b4.id)), "sortKanbanTickets");
|
|
183719
183809
|
var ticketLabel = /* @__PURE__ */ __name((ticket) => `#${ticket.key} ${ticket.title}`, "ticketLabel");
|
|
183720
183810
|
var ticketDraft = /* @__PURE__ */ __name((ticket) => ({
|
|
@@ -183808,7 +183898,7 @@ var _DeesInputReference = class _DeesInputReference extends (_a104 = DeesElement
|
|
|
183808
183898
|
__publicField(this, "serializedValue", "");
|
|
183809
183899
|
}
|
|
183810
183900
|
render() {
|
|
183811
|
-
return b2`<div class="editor"></div>${this.loadError ? b2`<p class="error" role="alert">${this.loadError}</p>` : ""}`;
|
|
183901
|
+
return b2`<div class="editor" part="editor"></div>${this.loadError ? b2`<p class="error" role="alert">${this.loadError}</p>` : ""}`;
|
|
183812
183902
|
}
|
|
183813
183903
|
async connectedCallback() {
|
|
183814
183904
|
const connection = super.connectedCallback();
|
|
@@ -184022,11 +184112,11 @@ __publicField(_DeesInputReference, "styles", [themeDefaultStyles, cssManager.def
|
|
|
184022
184112
|
:host { display: block; min-width: 0; color: var(--dees-color-text-primary); font-family: var(--dees-font-family); }
|
|
184023
184113
|
.editor { border: 1px solid var(--dees-color-border-default); border-radius: var(--dees-radius-lg); background: var(--dees-color-bg-primary); }
|
|
184024
184114
|
.editor:focus-within { outline: 2px solid var(--dees-color-focus-ring); outline-offset: 1px; }
|
|
184025
|
-
.ProseMirror { padding: 12px; min-height: 84px; max-height: 260px; overflow: auto; outline: none; white-space: pre-wrap; overflow-wrap: anywhere; font-size: var(--dees-font-body-size); line-height: 1.6; }
|
|
184115
|
+
.ProseMirror { padding: 12px; min-height: var(--dees-reference-min-height, 84px); max-height: 260px; overflow: auto; outline: none; white-space: pre-wrap; overflow-wrap: anywhere; font-size: var(--dees-reference-font-size, var(--dees-font-body-size)); line-height: 1.6; }
|
|
184026
184116
|
.ProseMirror p { margin: 0; }
|
|
184027
184117
|
.ProseMirror p + p { margin-top: 0; }
|
|
184028
184118
|
.ProseMirror:has(> p:only-child > br:only-child)::before { content: attr(data-placeholder); float: left; color: var(--dees-color-text-muted); pointer-events: none; height: 0; }
|
|
184029
|
-
.ProseMirror [data-reference-id] { display: inline; padding: 1px 5px; border-radius: var(--dees-radius-sm); color: var(--dees-color-link); background: var(--dees-color-
|
|
184119
|
+
.ProseMirror [data-reference-id] { display: inline; padding: 1px 5px; border-radius: var(--dees-radius-sm); color: var(--dees-color-link); background: var(--dees-color-fill-tertiary); cursor: pointer; font-weight: 500; }
|
|
184030
184120
|
.ProseMirror [data-reference-id]:focus-visible, .ProseMirror .ProseMirror-selectednode { outline: 2px solid var(--dees-color-focus-ring); }
|
|
184031
184121
|
.ProseMirror[contenteditable=false] { opacity: .65; }
|
|
184032
184122
|
.error { color: var(--dees-color-text-error); font-size: var(--dees-font-footnote-size); }
|
|
@@ -184056,16 +184146,17 @@ var _DeesKanbanDiscussion = class _DeesKanbanDiscussion extends (_a105 = DeesEle
|
|
|
184056
184146
|
render() {
|
|
184057
184147
|
const pending = this.pending.has(this.ticketId);
|
|
184058
184148
|
const comments = this.comments.filter((comment3) => comment3.ticketId === this.ticketId).slice().sort((a4, b4) => Date.parse(a4.createdAt) - Date.parse(b4.createdAt));
|
|
184059
|
-
return b2`<header><h3>Discussion
|
|
184060
|
-
<dees-button size="
|
|
184149
|
+
return b2`<header><h3>Discussion</h3><span class="count">${comments.length}</span><span class="spacer"></span>
|
|
184150
|
+
<dees-button class="refresh" size="icon" type="ghost" icon="lucide:RefreshCw" text="Refresh" .disabled=${this.loading}
|
|
184061
184151
|
@clicked=${() => kanbanEvent(this, "kanban-comments-refresh", { ticketId: this.ticketId })}></dees-button></header>
|
|
184062
184152
|
${this.loading ? b2`<p class="caption" role="status">Loading comments…</p>` : ""}
|
|
184063
184153
|
${this.error ? b2`<p class="error" role="alert">${this.error}</p>` : ""}
|
|
184064
184154
|
<ol aria-label="Comments">${comments.map((comment3) => b2`<li>
|
|
184065
|
-
<
|
|
184155
|
+
<span class="avatar" aria-hidden="true">${kanbanInitials(comment3.author.name)}</span><div>
|
|
184156
|
+
<div class="row meta"><span class="author">${comment3.author.name}</span><time datetime=${comment3.createdAt} title=${comment3.createdAt}>${new Date(comment3.createdAt).toLocaleString(void 0, { dateStyle: "medium", timeStyle: "short" })}</time></div>
|
|
184066
184157
|
<div class="message">${comment3.body.map((part) => part.type === "text" ? part.text : b2`<button class="reference"
|
|
184067
184158
|
@click=${() => kanbanEvent(this, "kanban-ticket-open", { ticketId: part.id })}>${part.label}</button>`)}</div>
|
|
184068
|
-
</li>`)}</ol>
|
|
184159
|
+
</div></li>`)}</ol>
|
|
184069
184160
|
${!comments.length && !this.loading && !this.error ? b2`<p class="empty">Start the conversation.</p>` : ""}
|
|
184070
184161
|
${this.addComment && !this.readOnly ? b2`<div class="compose">
|
|
184071
184162
|
<dees-input-reference label="Comment" placeholder="Write a comment…" .documentKey=${this.ticketId} .value=${this.draft} .disabled=${pending}
|
|
@@ -184078,7 +184169,7 @@ var _DeesKanbanDiscussion = class _DeesKanbanDiscussion extends (_a105 = DeesEle
|
|
|
184078
184169
|
@reference-submit=${() => {
|
|
184079
184170
|
void this.submit();
|
|
184080
184171
|
}}></dees-input-reference>
|
|
184081
|
-
<div class="row"><span class="caption">Type
|
|
184172
|
+
<div class="row"><span class="caption">Type <strong>#_</strong> to link a ticket · <span class="shortcut">Ctrl/⌘ Enter to send</span></span><span class="spacer"></span>
|
|
184082
184173
|
<dees-button type="accent" size="sm" text="Comment" .disabled=${pending || !referenceText(this.draft).trim()}
|
|
184083
184174
|
.status=${pending ? "pending" : "normal"} @clicked=${() => {
|
|
184084
184175
|
void this.submit();
|
|
@@ -184130,16 +184221,26 @@ __decorateElement(_init107, 4, "failures", _failures_dec, _DeesKanbanDiscussion,
|
|
|
184130
184221
|
_DeesKanbanDiscussion = __decorateElement(_init107, 0, "DeesKanbanDiscussion", _DeesKanbanDiscussion_decorators, _DeesKanbanDiscussion);
|
|
184131
184222
|
__name(_DeesKanbanDiscussion, "DeesKanbanDiscussion");
|
|
184132
184223
|
__publicField(_DeesKanbanDiscussion, "styles", [...kanbanStyles, i`
|
|
184133
|
-
header { display: flex; align-items: center; margin-bottom:
|
|
184134
|
-
h3 { font-size: var(--dees-font-
|
|
184224
|
+
header { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
|
|
184225
|
+
h3 { font-size: var(--dees-font-footnote-size); font-weight: 600; }
|
|
184226
|
+
.refresh::part(button) { width: 28px; height: 28px; min-height: 28px; }
|
|
184135
184227
|
ol { list-style: none; padding: 0; margin: 0; }
|
|
184136
|
-
li {
|
|
184137
|
-
.
|
|
184228
|
+
li { display: grid; grid-template-columns: 28px minmax(0, 1fr); gap: 10px; padding: 10px 0; }
|
|
184229
|
+
li > .avatar { width: 28px; height: 28px; margin-top: 1px; }
|
|
184230
|
+
.author { font-weight: 600; font-size: var(--dees-font-footnote-size); }
|
|
184231
|
+
.meta { gap: 4px 10px; }
|
|
184138
184232
|
time { font-size: var(--dees-font-caption1-size); color: var(--dees-color-text-secondary); }
|
|
184139
|
-
.message { white-space: pre-wrap; overflow-wrap: anywhere; line-height:
|
|
184140
|
-
.reference { display: inline; border: 0; border-radius: var(--dees-radius-sm); padding: 1px
|
|
184141
|
-
.compose { padding-
|
|
184142
|
-
.compose
|
|
184233
|
+
.message { white-space: pre-wrap; overflow-wrap: anywhere; font-size: var(--dees-font-subhead-size); line-height: 22px; margin-top: 2px; }
|
|
184234
|
+
.reference { display: inline; border: 0; border-radius: var(--dees-radius-sm); padding: 1px 5px; color: var(--dees-color-link); background: var(--dees-color-fill-tertiary); font: inherit; font-weight: 500; cursor: pointer; text-align: left; overflow-wrap: anywhere; }
|
|
184235
|
+
.compose { margin: 14px 0 0 38px; padding: 0; border: 1px solid var(--dees-color-control-border); border-radius: var(--dees-radius-xl); corner-shape: var(--dees-corner-shape); background: var(--dees-color-control-bg); }
|
|
184236
|
+
.compose:has(dees-input-reference:focus-within) { outline: 2px solid var(--dees-color-focus-ring); outline-offset: 1px; }
|
|
184237
|
+
dees-input-reference { --dees-reference-min-height: 64px; --dees-reference-font-size: var(--dees-font-subhead-size); }
|
|
184238
|
+
dees-input-reference::part(editor) { border: 0; background: transparent; outline: none; }
|
|
184239
|
+
.compose .row { padding: 4px 10px 10px; gap: 8px; }
|
|
184240
|
+
.compose .caption { font-size: var(--dees-font-caption1-size); }
|
|
184241
|
+
.shortcut { white-space: nowrap; }
|
|
184242
|
+
.compose .error { padding: 0 12px 10px; }
|
|
184243
|
+
@media (max-width: 600px) { .compose { margin-left: 0; } .compose .caption { flex-basis: 100%; } }
|
|
184143
184244
|
`]);
|
|
184144
184245
|
__runInitializers(_init107, 1, _DeesKanbanDiscussion);
|
|
184145
184246
|
var DeesKanbanDiscussion = _DeesKanbanDiscussion;
|
|
@@ -184147,9 +184248,9 @@ var DeesKanbanDiscussion = _DeesKanbanDiscussion;
|
|
|
184147
184248
|
// ts_web/elements/00group-kanban/dees-kanban-ticket-detail/dees-kanban-ticket-detail.ts
|
|
184148
184249
|
init_dist_ts26();
|
|
184149
184250
|
init_dees_input_text();
|
|
184150
|
-
var _editing_dec3, _canGoBack_dec, _saving_dec2, _error_dec3, _commentsError_dec, _loadingComments_dec, _searchTickets_dec2, _comments_dec2, _commentDraft_dec, _draft_dec3, _provider_dec2, _people_dec, _columns_dec3, _tickets_dec, _ticket_dec, _a106, _DeesKanbanTicketDetail_decorators, _init108, _ticket, _tickets, _columns3, _people, _provider2, _draft3, _commentDraft, _comments2, _searchTickets2, _loadingComments, _commentsError, _error3, _saving2, _canGoBack, _editing3;
|
|
184251
|
+
var _editing_dec3, _showTicketKey_dec, _canGoBack_dec, _saving_dec2, _error_dec3, _commentsError_dec, _loadingComments_dec, _searchTickets_dec2, _comments_dec2, _commentDraft_dec, _draft_dec3, _provider_dec2, _people_dec, _columns_dec3, _tickets_dec, _ticket_dec, _a106, _DeesKanbanTicketDetail_decorators, _init108, _ticket, _tickets, _columns3, _people, _provider2, _draft3, _commentDraft, _comments2, _searchTickets2, _loadingComments, _commentsError, _error3, _saving2, _canGoBack, _showTicketKey, _editing3;
|
|
184151
184252
|
_DeesKanbanTicketDetail_decorators = [customElement("dees-kanban-ticket-detail")];
|
|
184152
|
-
var _DeesKanbanTicketDetail = class _DeesKanbanTicketDetail extends (_a106 = DeesElement, _ticket_dec = [n5({ attribute: false })], _tickets_dec = [n5({ attribute: false })], _columns_dec3 = [n5({ attribute: false })], _people_dec = [n5({ attribute: false })], _provider_dec2 = [n5({ attribute: false })], _draft_dec3 = [n5({ attribute: false })], _commentDraft_dec = [n5({ attribute: false })], _comments_dec2 = [n5({ attribute: false })], _searchTickets_dec2 = [n5({ attribute: false })], _loadingComments_dec = [n5({ type: Boolean })], _commentsError_dec = [n5({ type: String })], _error_dec3 = [n5({ type: String })], _saving_dec2 = [n5({ type: Boolean })], _canGoBack_dec = [n5({ type: Boolean })], _editing_dec3 = [r5()], _a106) {
|
|
184253
|
+
var _DeesKanbanTicketDetail = class _DeesKanbanTicketDetail extends (_a106 = DeesElement, _ticket_dec = [n5({ attribute: false })], _tickets_dec = [n5({ attribute: false })], _columns_dec3 = [n5({ attribute: false })], _people_dec = [n5({ attribute: false })], _provider_dec2 = [n5({ attribute: false })], _draft_dec3 = [n5({ attribute: false })], _commentDraft_dec = [n5({ attribute: false })], _comments_dec2 = [n5({ attribute: false })], _searchTickets_dec2 = [n5({ attribute: false })], _loadingComments_dec = [n5({ type: Boolean })], _commentsError_dec = [n5({ type: String })], _error_dec3 = [n5({ type: String })], _saving_dec2 = [n5({ type: Boolean })], _canGoBack_dec = [n5({ type: Boolean })], _showTicketKey_dec = [n5({ type: Boolean })], _editing_dec3 = [r5()], _a106) {
|
|
184153
184254
|
constructor() {
|
|
184154
184255
|
super(...arguments);
|
|
184155
184256
|
__privateAdd(this, _ticket, __runInitializers(_init108, 8, this)), __runInitializers(_init108, 11, this);
|
|
@@ -184166,7 +184267,8 @@ var _DeesKanbanTicketDetail = class _DeesKanbanTicketDetail extends (_a106 = Dee
|
|
|
184166
184267
|
__privateAdd(this, _error3, __runInitializers(_init108, 52, this, "")), __runInitializers(_init108, 55, this);
|
|
184167
184268
|
__privateAdd(this, _saving2, __runInitializers(_init108, 56, this, false)), __runInitializers(_init108, 59, this);
|
|
184168
184269
|
__privateAdd(this, _canGoBack, __runInitializers(_init108, 60, this, false)), __runInitializers(_init108, 63, this);
|
|
184169
|
-
__privateAdd(this,
|
|
184270
|
+
__privateAdd(this, _showTicketKey, __runInitializers(_init108, 64, this, true)), __runInitializers(_init108, 67, this);
|
|
184271
|
+
__privateAdd(this, _editing3, __runInitializers(_init108, 68, this, false)), __runInitializers(_init108, 71, this);
|
|
184170
184272
|
__publicField(this, "addComment", /* @__PURE__ */ __name((input) => this.provider.addComment(input), "addComment"));
|
|
184171
184273
|
}
|
|
184172
184274
|
updated(changed2) {
|
|
@@ -184188,15 +184290,16 @@ var _DeesKanbanTicketDetail = class _DeesKanbanTicketDetail extends (_a106 = Dee
|
|
|
184188
184290
|
const parents = this.tickets.filter((item) => item.kind === (ticket.kind === "subtask" ? "task" : "epic"));
|
|
184189
184291
|
return b2`<div class="toolbar row">
|
|
184190
184292
|
${this.canGoBack ? b2`<dees-button size="sm" type="ghost" icon="lucide:ArrowLeft" text="Back" @clicked=${() => kanbanEvent(this, "kanban-detail-back", {})}></dees-button>` : ""}
|
|
184191
|
-
<span class="badge">${ticket.kind}</span
|
|
184192
|
-
${
|
|
184293
|
+
<span class="badge">${ticket.kind}</span>
|
|
184294
|
+
${this.showTicketKey ? b2`<span class="caption ticket-key">${ticket.key}</span>` : ""}
|
|
184295
|
+
${parent ? b2`<span class="caption" aria-hidden="true">/</span><button class="link parent" title=${parent.title} @click=${() => kanbanEvent(this, "kanban-ticket-open", { ticketId: parent.id })}>${parent.title}</button>` : ""}
|
|
184193
184296
|
<span class="spacer"></span>${editable && !this.editing ? b2`<dees-button size="sm" type="ghost" text="Edit ticket" icon="lucide:Pencil" @clicked=${() => {
|
|
184194
184297
|
this.editing = true;
|
|
184195
184298
|
this.changeDraft({});
|
|
184196
184299
|
}}></dees-button>` : ""}
|
|
184197
184300
|
</div>
|
|
184198
184301
|
${this.error ? b2`<p class="error" role="alert">${this.error}</p>` : ""}
|
|
184199
|
-
<div class="layout"><
|
|
184302
|
+
<div class="layout"><section class="lead">
|
|
184200
184303
|
${this.editing && editable ? b2`<div class="edit">
|
|
184201
184304
|
<dees-input-text label="Title" .value=${draft.title} .disabled=${this.saving}
|
|
184202
184305
|
@input=${(event) => this.changeDraft({ title: String(event.currentTarget.value ?? "") })}></dees-input-text>
|
|
@@ -184210,33 +184313,36 @@ var _DeesKanbanTicketDetail = class _DeesKanbanTicketDetail extends (_a106 = Dee
|
|
|
184210
184313
|
kanbanEvent(this, "kanban-ticket-draft", { ticketId: ticket.id, draft: void 0 });
|
|
184211
184314
|
}}></dees-button></div>
|
|
184212
184315
|
</div>` : b2`<h2>${ticket.title}</h2><div class="description ${ticket.description ? "" : "muted"}">${ticket.description || "No description yet."}</div>`}
|
|
184213
|
-
|
|
184214
|
-
|
|
184215
|
-
@clicked=${() => kanbanEvent(this, "kanban-ticket-create", { kind: ticket.kind === "epic" ? "task" : "subtask", parentId: ticket.id, columnId: this.columns[0]?.id ?? ticket.columnId })}></dees-button>` : ""}</div>
|
|
184216
|
-
${children2.map((child) => b2`<div class="child"><button class="link" @click=${() => kanbanEvent(this, "kanban-ticket-open", { ticketId: child.id })}>${ticketLabel(child)}</button>
|
|
184217
|
-
<span class="badge">${this.columns.find((column) => column.id === child.columnId)?.title ?? child.columnId}</span></div>`)}
|
|
184218
|
-
${!children2.length ? b2`<p class="caption">No ${ticket.kind === "epic" ? "tasks" : "subtasks"} yet.</p>` : ""}</section>` : ""}
|
|
184219
|
-
<dees-kanban-discussion class="discussion" .ticketId=${ticket.id} .comments=${this.comments} .draft=${this.commentDraft}
|
|
184220
|
-
.loading=${this.loadingComments} .error=${this.commentsError} .readOnly=${ticket.permissions?.comment === false}
|
|
184221
|
-
.searchTickets=${this.searchTickets} .addComment=${this.provider.addComment ? this.addComment : void 0}></dees-kanban-discussion>
|
|
184222
|
-
</div><aside><div class="fields">
|
|
184223
|
-
<dees-input-dropdown label="Status" .options=${this.columns.map((column) => ({ key: column.id, option: column.title }))}
|
|
184316
|
+
</section><aside><div class="fields">
|
|
184317
|
+
<div><label class="caption">Status</label><dees-input-dropdown label="Status" .labelPosition=${"none"} .options=${this.columns.map((column) => ({ key: column.id, option: column.title }))}
|
|
184224
184318
|
.value=${{ key: ticket.columnId, option: this.columns.find((column) => column.id === ticket.columnId)?.title ?? ticket.columnId }}
|
|
184225
|
-
.disabled=${!movable || this.saving} @selectedOption=${(event) => kanbanEvent(this, "kanban-ticket-move", { ticketId: ticket.id, columnId: event.detail.key })}></dees-input-dropdown>
|
|
184319
|
+
.disabled=${!movable || this.saving} @selectedOption=${(event) => kanbanEvent(this, "kanban-ticket-move", { ticketId: ticket.id, columnId: event.detail.key })}></dees-input-dropdown></div>
|
|
184226
184320
|
${this.editing && editable ? b2`
|
|
184227
|
-
<dees-input-dropdown label="Priority" .disabled=${this.saving} .value=${{ key: draft.priority, option: draft.priority }}
|
|
184321
|
+
<div><label class="caption">Priority</label><dees-input-dropdown label="Priority" .labelPosition=${"none"} .disabled=${this.saving} .value=${{ key: draft.priority, option: draft.priority }}
|
|
184228
184322
|
.options=${["none", "low", "normal", "high", "urgent"].map((key2) => ({ key: key2, option: key2 }))}
|
|
184229
|
-
@selectedOption=${(event) => this.changeDraft({ priority: event.detail.key })}></dees-input-dropdown>
|
|
184230
|
-
<dees-input-dropdown label="Assignee" .disabled=${this.saving} .value=${{ key: draft.assigneeId, option: this.people.find((person) => person.id === draft.assigneeId)?.name ?? ticket.assignee?.name ?? "Unassigned" }}
|
|
184323
|
+
@selectedOption=${(event) => this.changeDraft({ priority: event.detail.key })}></dees-input-dropdown></div>
|
|
184324
|
+
<div><label class="caption">Assignee</label><dees-input-dropdown label="Assignee" .labelPosition=${"none"} .disabled=${this.saving} .value=${{ key: draft.assigneeId, option: this.people.find((person) => person.id === draft.assigneeId)?.name ?? ticket.assignee?.name ?? "Unassigned" }}
|
|
184231
184325
|
.options=${[{ key: "", option: "Unassigned" }, ...this.people.map((person) => ({ key: person.id, option: person.name }))]}
|
|
184232
|
-
@selectedOption=${(event) => this.changeDraft({ assigneeId: event.detail.key })}></dees-input-dropdown>
|
|
184233
|
-
${ticket.kind !== "epic" ? b2`<dees-input-dropdown label=${ticket.kind === "task" ? "Epic" : "Parent task"} .disabled=${this.saving}
|
|
184326
|
+
@selectedOption=${(event) => this.changeDraft({ assigneeId: event.detail.key })}></dees-input-dropdown></div>
|
|
184327
|
+
${ticket.kind !== "epic" ? b2`<div><label class="caption">${ticket.kind === "task" ? "Epic" : "Parent task"}</label><dees-input-dropdown label=${ticket.kind === "task" ? "Epic" : "Parent task"} .labelPosition=${"none"} .disabled=${this.saving}
|
|
184234
184328
|
.value=${{ key: draft.parentId, option: parents.find((item) => item.id === draft.parentId)?.title ?? "None" }}
|
|
184235
184329
|
.options=${[...ticket.kind === "task" ? [{ key: "", option: "None" }] : [], ...parents.map((item) => ({ key: item.id, option: ticketLabel(item) }))]}
|
|
184236
|
-
@selectedOption=${(event) => this.changeDraft({ parentId: event.detail.key })}></dees-input-dropdown>` : ""}
|
|
184237
|
-
` : b2`<div><label class="caption">Priority</label
|
|
184238
|
-
|
|
184239
|
-
|
|
184330
|
+
@selectedOption=${(event) => this.changeDraft({ parentId: event.detail.key })}></dees-input-dropdown></div>` : ""}
|
|
184331
|
+
` : b2`<div><label class="caption">Priority</label><span class="priority value" data-priority=${ticket.priority ?? "none"}><dees-icon .icon=${kanbanPriorityIcon(ticket.priority)} iconSize="13" aria-hidden="true"></dees-icon>${ticket.priority ?? "none"}</span></div>
|
|
184332
|
+
<div><label class="caption">Assignee</label><span class="person value"><span class="avatar" aria-hidden="true">${ticket.assignee ? kanbanInitials(ticket.assignee.name) : "\u2013"}</span>${ticket.assignee?.name ?? "Unassigned"}</span></div>`}
|
|
184333
|
+
${ticket.labels?.length ? b2`<div><label class="caption">Labels</label><div class="row value">${ticket.labels.map((label) => b2`<span class="badge">${label}</span>`)}</div></div>` : ""}
|
|
184334
|
+
</div></aside><div class="body">
|
|
184335
|
+
${ticket.kind !== "subtask" ? b2`<section class="children"><div class="section-title"><h3>${ticket.kind === "epic" ? "Tasks" : "Subtasks"}</h3><span class="count">${children2.length}</span><span class="spacer"></span>
|
|
184336
|
+
${this.provider.createTicket && ticket.permissions?.createChild !== false ? b2`<dees-button size="sm" type="ghost" icon="lucide:Plus" text=${ticket.kind === "epic" ? "Add task" : "Add subtask"}
|
|
184337
|
+
@clicked=${() => kanbanEvent(this, "kanban-ticket-create", { kind: ticket.kind === "epic" ? "task" : "subtask", parentId: ticket.id, columnId: this.columns[0]?.id ?? ticket.columnId })}></dees-button>` : ""}</div>
|
|
184338
|
+
<div class="child-list">${children2.map((child) => b2`<button class="child" @click=${() => kanbanEvent(this, "kanban-ticket-open", { ticketId: child.id })}>
|
|
184339
|
+
<span class="child-key">${child.key}</span><span class="child-title">${child.title}</span>
|
|
184340
|
+
<span class="badge">${this.columns.find((column) => column.id === child.columnId)?.title ?? child.columnId}</span></button>`)}</div>
|
|
184341
|
+
${!children2.length ? b2`<p class="caption">No ${ticket.kind === "epic" ? "tasks" : "subtasks"} yet.</p>` : ""}</section>` : ""}
|
|
184342
|
+
<dees-kanban-discussion class="discussion" .ticketId=${ticket.id} .comments=${this.comments} .draft=${this.commentDraft}
|
|
184343
|
+
.loading=${this.loadingComments} .error=${this.commentsError} .readOnly=${ticket.permissions?.comment === false}
|
|
184344
|
+
.searchTickets=${this.searchTickets} .addComment=${this.provider.addComment ? this.addComment : void 0}></dees-kanban-discussion>
|
|
184345
|
+
</div></div>`;
|
|
184240
184346
|
}
|
|
184241
184347
|
finishEditing() {
|
|
184242
184348
|
this.editing = false;
|
|
@@ -184257,6 +184363,7 @@ _commentsError = new WeakMap();
|
|
|
184257
184363
|
_error3 = new WeakMap();
|
|
184258
184364
|
_saving2 = new WeakMap();
|
|
184259
184365
|
_canGoBack = new WeakMap();
|
|
184366
|
+
_showTicketKey = new WeakMap();
|
|
184260
184367
|
_editing3 = new WeakMap();
|
|
184261
184368
|
__decorateElement(_init108, 4, "ticket", _ticket_dec, _DeesKanbanTicketDetail, _ticket);
|
|
184262
184369
|
__decorateElement(_init108, 4, "tickets", _tickets_dec, _DeesKanbanTicketDetail, _tickets);
|
|
@@ -184272,24 +184379,45 @@ __decorateElement(_init108, 4, "commentsError", _commentsError_dec, _DeesKanbanT
|
|
|
184272
184379
|
__decorateElement(_init108, 4, "error", _error_dec3, _DeesKanbanTicketDetail, _error3);
|
|
184273
184380
|
__decorateElement(_init108, 4, "saving", _saving_dec2, _DeesKanbanTicketDetail, _saving2);
|
|
184274
184381
|
__decorateElement(_init108, 4, "canGoBack", _canGoBack_dec, _DeesKanbanTicketDetail, _canGoBack);
|
|
184382
|
+
__decorateElement(_init108, 4, "showTicketKey", _showTicketKey_dec, _DeesKanbanTicketDetail, _showTicketKey);
|
|
184275
184383
|
__decorateElement(_init108, 4, "editing", _editing_dec3, _DeesKanbanTicketDetail, _editing3);
|
|
184276
184384
|
_DeesKanbanTicketDetail = __decorateElement(_init108, 0, "DeesKanbanTicketDetail", _DeesKanbanTicketDetail_decorators, _DeesKanbanTicketDetail);
|
|
184277
184385
|
__name(_DeesKanbanTicketDetail, "DeesKanbanTicketDetail");
|
|
184278
184386
|
__publicField(_DeesKanbanTicketDetail, "styles", [...kanbanStyles, i`
|
|
184279
|
-
|
|
184280
|
-
.
|
|
184281
|
-
.
|
|
184282
|
-
|
|
184283
|
-
.
|
|
184284
|
-
|
|
184285
|
-
.
|
|
184286
|
-
.
|
|
184287
|
-
|
|
184387
|
+
:host { padding: 24px; }
|
|
184388
|
+
.layout { display: grid; grid-template-columns: minmax(0, 1fr) 248px; grid-template-areas: 'lead props' 'body props'; gap: 24px; align-items: start; }
|
|
184389
|
+
.lead { grid-area: lead; min-width: 0; }
|
|
184390
|
+
.body { grid-area: body; min-width: 0; }
|
|
184391
|
+
.toolbar { margin-bottom: 20px; flex-wrap: nowrap; min-width: 0; }
|
|
184392
|
+
.toolbar .badge { text-transform: capitalize; flex-shrink: 0; }
|
|
184393
|
+
.ticket-key { flex-shrink: 0; font-variant-numeric: tabular-nums; }
|
|
184394
|
+
.link.parent { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--dees-font-footnote-size); }
|
|
184395
|
+
.toolbar dees-button { flex-shrink: 0; }
|
|
184396
|
+
h2 { font-size: var(--dees-font-title2-size); line-height: 1.3; font-weight: 600; margin-bottom: 12px; letter-spacing: -.015em; overflow-wrap: anywhere; }
|
|
184397
|
+
.description { white-space: pre-wrap; font-size: var(--dees-font-subhead-size); line-height: 22px; overflow-wrap: anywhere; max-width: 64ch; }
|
|
184398
|
+
aside { grid-area: props; min-width: 0; padding: 14px 16px; border-radius: var(--dees-radius-xl); corner-shape: var(--dees-corner-shape); background: var(--dees-color-settings-group); }
|
|
184399
|
+
.fields { display: grid; gap: 14px; font-size: var(--dees-font-footnote-size); font-weight: 500; }
|
|
184400
|
+
.fields label { display: block; margin-bottom: 5px; font-size: var(--dees-font-caption1-size); font-weight: 400; }
|
|
184401
|
+
.value { min-height: var(--dees-control-height-lg); display: flex; align-items: center; }
|
|
184402
|
+
.person { display: flex; align-items: center; gap: 7px; }
|
|
184288
184403
|
.children { margin-bottom: 24px; }
|
|
184289
|
-
.child {
|
|
184290
|
-
.
|
|
184291
|
-
.
|
|
184292
|
-
|
|
184404
|
+
.child-list { border-radius: var(--dees-radius-xl); corner-shape: var(--dees-corner-shape); background: var(--dees-color-settings-group); overflow: hidden; }
|
|
184405
|
+
.child { display: flex; width: 100%; align-items: center; gap: 10px; min-height: 44px; padding: 10px 12px; border: 0; background: transparent; color: inherit; font: inherit; text-align: left; cursor: pointer; }
|
|
184406
|
+
.child + .child { border-top: 1px solid var(--dees-color-border-subtle); }
|
|
184407
|
+
.child:hover { background: var(--dees-color-row-hover); }
|
|
184408
|
+
.child:focus-visible { outline-offset: -3px; }
|
|
184409
|
+
.child-key { font-size: var(--dees-font-caption1-size); color: var(--dees-color-text-secondary); font-variant-numeric: tabular-nums; flex-shrink: 0; }
|
|
184410
|
+
.child-title { flex: 1; min-width: 0; font-size: var(--dees-font-footnote-size); font-weight: 500; overflow-wrap: anywhere; }
|
|
184411
|
+
.child .badge { flex-shrink: 0; }
|
|
184412
|
+
.discussion { border-top: 1px solid var(--dees-color-border-subtle); padding-top: 20px; }
|
|
184413
|
+
.edit { display: grid; gap: 14px; }
|
|
184414
|
+
@media (max-width: 700px) {
|
|
184415
|
+
:host { padding: 16px; }
|
|
184416
|
+
.layout { grid-template-columns: minmax(0, 1fr); grid-template-areas: 'lead' 'props' 'body'; gap: 20px; }
|
|
184417
|
+
.fields { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
184418
|
+
.toolbar { gap: 6px; margin-bottom: 16px; }
|
|
184419
|
+
.child { gap: 7px; }
|
|
184420
|
+
}
|
|
184293
184421
|
`]);
|
|
184294
184422
|
__runInitializers(_init108, 1, _DeesKanbanTicketDetail);
|
|
184295
184423
|
var DeesKanbanTicketDetail = _DeesKanbanTicketDetail;
|
|
@@ -184399,18 +184527,19 @@ var _DeesKanbanCard = class _DeesKanbanCard extends (_a107 = DeesElement, _ticke
|
|
|
184399
184527
|
event.dataTransfer.effectAllowed = "move";
|
|
184400
184528
|
kanbanEvent(this, "kanban-drag-start", { ticketId: ticket.id });
|
|
184401
184529
|
}} @dragend=${() => kanbanEvent(this, "kanban-drag-end", {})}>
|
|
184402
|
-
|
|
184403
|
-
|
|
184404
|
-
${
|
|
184405
|
-
<button class="title" @click=${() => this.open(ticket.id)}>${ticket.title}</button>
|
|
184406
|
-
${ticket.labels?.length ? b2`<div class="row labels">${ticket.labels.map((label) => b2`<span class="badge">${label}</span>`)}</div>` : ""}
|
|
184407
|
-
<div class="row caption"><span class="avatar" title=${ticket.assignee?.name ?? "Unassigned"}>${ticket.assignee?.name.split(/\s+/).map((part) => part[0]).join("").slice(0, 2) ?? "\u2013"}</span>
|
|
184408
|
-
<span>${ticket.assignee?.name ?? "Unassigned"}</span><span class="spacer"></span>
|
|
184409
|
-
${this.movable ? b2`<dees-button size="icon" type="ghost" icon="lucide:Ellipsis" text="Move ticket" .disabled=${this.pending}
|
|
184530
|
+
<div class="meta"><span class="key">${ticket.key}</span>
|
|
184531
|
+
${this.epic ? b2`<button class="link epic" title=${this.epic.title} @click=${() => this.open(this.epic.id)}>${this.epic.title}</button>` : ""}
|
|
184532
|
+
${this.movable ? b2`<dees-button class="move" size="icon" type="ghost" icon="lucide:Ellipsis" text="Move ticket" .disabled=${this.pending}
|
|
184410
184533
|
@clicked=${(event) => kanbanEvent(this, "kanban-move-menu", { ticketId: ticket.id, anchor: event.currentTarget })}></dees-button>` : ""}
|
|
184411
184534
|
</div>
|
|
184412
|
-
|
|
184413
|
-
|
|
184535
|
+
<button class="title" @click=${() => this.open(ticket.id)}>${ticket.title}</button>
|
|
184536
|
+
<div class="row footer">
|
|
184537
|
+
${ticket.priority && ticket.priority !== "none" ? b2`<span class="priority" data-priority=${ticket.priority}><dees-icon .icon=${kanbanPriorityIcon(ticket.priority)} iconSize="13" aria-hidden="true"></dees-icon>${ticket.priority}</span>` : ""}
|
|
184538
|
+
${ticket.labels?.map((label) => b2`<span class="badge">${label}</span>`)}
|
|
184539
|
+
<span class="assignee" title=${ticket.assignee?.name ?? "Unassigned"}><span class="avatar" aria-hidden="true">${ticket.assignee ? kanbanInitials(ticket.assignee.name) : "\u2013"}</span><span class="assignee-name">${ticket.assignee?.name ?? "Unassigned"}</span></span>
|
|
184540
|
+
</div>
|
|
184541
|
+
${this.subtasks.length ? b2`<details><summary><dees-icon icon="lucide:ListChecks" iconSize="14" aria-hidden="true"></dees-icon>${completed}/${this.subtasks.length} subtasks complete<dees-icon class="disclosure" icon="lucide:ChevronRight" iconSize="14" aria-hidden="true"></dees-icon></summary>
|
|
184542
|
+
${this.subtasks.map((task) => b2`<div class="subtask"><dees-icon .icon=${this.columns.some((column) => column.id === task.columnId && column.done) ? "lucide:CircleCheck" : "lucide:Circle"} iconSize="14" aria-hidden="true"></dees-icon>
|
|
184414
184543
|
<button class="link" @click=${() => this.open(task.id)}>${task.title}</button></div>`)}</details>` : ""}
|
|
184415
184544
|
</article>`;
|
|
184416
184545
|
}
|
|
@@ -184431,17 +184560,32 @@ __decorateElement(_init109, 4, "pending", _pending_dec3, _DeesKanbanCard, _pendi
|
|
|
184431
184560
|
_DeesKanbanCard = __decorateElement(_init109, 0, "DeesKanbanCard", _DeesKanbanCard_decorators, _DeesKanbanCard);
|
|
184432
184561
|
__name(_DeesKanbanCard, "DeesKanbanCard");
|
|
184433
184562
|
__publicField(_DeesKanbanCard, "styles", [...kanbanStyles, i`
|
|
184434
|
-
article { padding:
|
|
184563
|
+
article { padding: 12px; border: 1px solid var(--dees-color-border-subtle); border-radius: var(--dees-radius-xl); corner-shape: var(--dees-corner-shape); background: var(--dees-color-bg-primary); box-shadow: var(--dees-shadow-xs); }
|
|
184435
184564
|
article:hover { border-color: var(--dees-color-border-strong); }
|
|
184436
184565
|
article[aria-busy=true] { opacity: .65; }
|
|
184437
|
-
.
|
|
184438
|
-
.key { font-variant-numeric: tabular-nums; }
|
|
184439
|
-
.link.epic {
|
|
184440
|
-
.
|
|
184441
|
-
.
|
|
184442
|
-
.
|
|
184443
|
-
|
|
184444
|
-
.
|
|
184566
|
+
.meta { display: flex; align-items: center; gap: 8px; min-height: 24px; font-size: var(--dees-font-caption1-size); color: var(--dees-color-text-secondary); }
|
|
184567
|
+
.key { flex-shrink: 0; font-weight: 500; font-variant-numeric: tabular-nums; }
|
|
184568
|
+
.link.epic { min-width: 0; color: var(--dees-color-text-secondary); font-size: var(--dees-font-caption1-size); overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
|
|
184569
|
+
.link.epic:hover { color: var(--dees-color-link); text-decoration: underline; }
|
|
184570
|
+
.move { flex-shrink: 0; margin-left: auto; }
|
|
184571
|
+
.move::part(button) { width: 24px; height: 24px; min-height: 24px; }
|
|
184572
|
+
.title { display: block; width: 100%; border: 0; background: transparent; padding: 4px 0 0; color: inherit; text-align: left; cursor: pointer; font: inherit; font-weight: 600; line-height: 22px; overflow-wrap: anywhere; }
|
|
184573
|
+
.title:hover { color: var(--dees-color-link); }
|
|
184574
|
+
.footer { margin-top: 10px; gap: 6px; }
|
|
184575
|
+
.badge { padding: 1px 6px; }
|
|
184576
|
+
.assignee { display: flex; align-items: center; gap: 5px; margin-left: auto; min-width: 0; color: var(--dees-color-text-secondary); font-size: var(--dees-font-caption1-size); }
|
|
184577
|
+
.assignee-name { max-width: 110px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
184578
|
+
.avatar { width: 20px; height: 20px; font-size: 9px; }
|
|
184579
|
+
details { border-top: 1px solid var(--dees-color-border-subtle); margin-top: 10px; }
|
|
184580
|
+
summary { cursor: pointer; display: flex; align-items: center; gap: 6px; padding: 9px 0 0; font-size: var(--dees-font-caption1-size); color: var(--dees-color-text-secondary); list-style: none; }
|
|
184581
|
+
summary::-webkit-details-marker { display: none; }
|
|
184582
|
+
summary .disclosure { margin-left: auto; }
|
|
184583
|
+
details[open] summary .disclosure { transform: rotate(90deg); }
|
|
184584
|
+
.subtask { display: flex; gap: 7px; align-items: center; padding-top: 8px; font-size: var(--dees-font-footnote-size); }
|
|
184585
|
+
.subtask dees-icon { flex-shrink: 0; color: var(--dees-color-text-secondary); font-size: 14px; }
|
|
184586
|
+
.subtask .link { color: var(--dees-color-text-primary); }
|
|
184587
|
+
.subtask .link:hover { color: var(--dees-color-link); }
|
|
184588
|
+
@media (pointer: coarse) { .move::part(button) { width: 32px; height: 32px; min-height: 32px; } summary { min-height: 36px; } }
|
|
184445
184589
|
`]);
|
|
184446
184590
|
__runInitializers(_init109, 1, _DeesKanbanCard);
|
|
184447
184591
|
var DeesKanbanCard = _DeesKanbanCard;
|
|
@@ -184486,11 +184630,11 @@ var _DeesKanbanColumn = class _DeesKanbanColumn extends (_a108 = DeesElement, _c
|
|
|
184486
184630
|
if (this.movable && this.draggingTicketId && event.dataTransfer?.getData("application/x-dees-kanban-ticket") === this.draggingTicketId)
|
|
184487
184631
|
kanbanEvent(this, "kanban-ticket-move", { ticketId: this.draggingTicketId, columnId: this.column.id, beforeTicketId: this.dropBefore });
|
|
184488
184632
|
}}>
|
|
184489
|
-
<header><h3>${this.column.title}</h3><span class="count">${this.tickets.length}</span><span class="spacer"></span>
|
|
184633
|
+
<header><span class="status ${this.column.done ? "done" : ""}" aria-hidden="true"></span><h3>${this.column.title}</h3><span class="count">${this.tickets.length}</span><span class="spacer"></span>
|
|
184490
184634
|
${this.canCreate ? b2`<dees-button type="ghost" size="icon" icon="lucide:Plus" text=${`Add task to ${this.column.title}`}
|
|
184491
184635
|
@clicked=${() => kanbanEvent(this, "kanban-ticket-create", { kind: "task", columnId: this.column.id })}></dees-button>` : ""}</header>
|
|
184492
184636
|
<div class="stack">${sortKanbanTickets(this.tickets).map((ticket) => b2`
|
|
184493
|
-
<div class="target ${this.draggingOver && this.dropBefore === ticket.id ? "before" : ""}"
|
|
184637
|
+
<div class="target ${this.draggingOver && this.dropBefore === ticket.id ? "before" : ""} ${this.draggingTicketId === ticket.id ? "dragging" : ""}"
|
|
184494
184638
|
@dragover=${() => {
|
|
184495
184639
|
this.dropBefore = ticket.id;
|
|
184496
184640
|
}}>
|
|
@@ -184533,16 +184677,20 @@ __decorateElement(_init110, 4, "draggingOver", _draggingOver_dec, _DeesKanbanCol
|
|
|
184533
184677
|
_DeesKanbanColumn = __decorateElement(_init110, 0, "DeesKanbanColumn", _DeesKanbanColumn_decorators, _DeesKanbanColumn);
|
|
184534
184678
|
__name(_DeesKanbanColumn, "DeesKanbanColumn");
|
|
184535
184679
|
__publicField(_DeesKanbanColumn, "styles", [...kanbanStyles, i`
|
|
184536
|
-
:host { display: flex; flex-direction: column; width:
|
|
184537
|
-
section { min-height: 220px; height: 100%; border-radius: var(--dees-radius-
|
|
184538
|
-
header { display: flex; align-items: center; gap: 8px; padding:
|
|
184539
|
-
h3 { font-size: var(--dees-font-
|
|
184540
|
-
|
|
184541
|
-
.
|
|
184680
|
+
:host { display: flex; flex-direction: column; min-width: 272px; max-width: 360px; flex: 1 0 272px; }
|
|
184681
|
+
section { min-height: 220px; height: 100%; border-radius: var(--dees-radius-xl); }
|
|
184682
|
+
header { display: flex; align-items: center; gap: 8px; min-height: 40px; margin-bottom: 10px; padding: 0 2px 8px; border-bottom: 1px solid var(--dees-color-border-subtle); }
|
|
184683
|
+
h3 { font-size: var(--dees-font-footnote-size); font-weight: 600; }
|
|
184684
|
+
header dees-button::part(button) { width: 24px; height: 24px; min-height: 24px; }
|
|
184685
|
+
.status { width: 8px; height: 8px; border: 1.5px solid var(--dees-color-text-secondary); border-radius: 50%; flex-shrink: 0; }
|
|
184686
|
+
.status.done { background: var(--dees-color-accent-success); border-color: var(--dees-color-accent-success); }
|
|
184687
|
+
.stack { display: grid; gap: 8px; min-height: 120px; align-content: start; }
|
|
184542
184688
|
.target { position: relative; }
|
|
184543
|
-
.target.
|
|
184544
|
-
.end-target {
|
|
184545
|
-
|
|
184689
|
+
.target.dragging { opacity: .4; }
|
|
184690
|
+
.target.before::before, .end-target.before::before { content: ''; position: absolute; top: -5px; left: 0; right: 0; height: 2px; background: var(--dees-color-accent-primary); border-radius: 2px; }
|
|
184691
|
+
.end-target { position: relative; min-height: 32px; margin-top: 8px; }
|
|
184692
|
+
section.over { background: var(--dees-color-row-hover); }
|
|
184693
|
+
@media (pointer: coarse) { header dees-button::part(button) { width: 32px; height: 32px; min-height: 32px; } }
|
|
184546
184694
|
`]);
|
|
184547
184695
|
__runInitializers(_init110, 1, _DeesKanbanColumn);
|
|
184548
184696
|
var DeesKanbanColumn = _DeesKanbanColumn;
|
|
@@ -184672,28 +184820,28 @@ var _DeesKanban = class _DeesKanban extends (_a109 = DeesElement, _heading_dec8
|
|
|
184672
184820
|
...this.tickets.filter((child) => child.parentId === ticket.id).map((child) => `${child.key} ${child.title}`)
|
|
184673
184821
|
].join(" ").toLocaleLowerCase().includes(query3)));
|
|
184674
184822
|
const epic = epics.find((ticket) => ticket.id === this.epicId);
|
|
184675
|
-
return b2`<header class="heading"><h2>${this.heading}</h2><span class="
|
|
184676
|
-
|
|
184677
|
-
@clicked=${() => {
|
|
184678
|
-
void this.createTicket({ kind: "epic", columnId: this.columns[0].id });
|
|
184679
|
-
}}></dees-button>
|
|
184680
|
-
<dees-button type="accent" size="sm" icon="lucide:Plus" text="New task" .disabled=${!this.columns.length}
|
|
184681
|
-
@clicked=${() => {
|
|
184682
|
-
void this.createTicket({ kind: "task", columnId: this.columns[0].id, parentId: this.epicId || void 0 });
|
|
184683
|
-
}}></dees-button>` : ""}</header>
|
|
184684
|
-
<div class="filters"><dees-input-text label="Search tickets" placeholder="Title, ticket number, assignee…" .value=${this.query}
|
|
184823
|
+
return b2`<header class="heading"><div class="identity"><h2>${this.heading}</h2><span class="totals">${tasks.length} tasks · ${epics.length} epics</span></div>
|
|
184824
|
+
<div class="filters"><dees-input-text label="Search tickets" .labelPosition=${"none"} placeholder="Search tickets…" .value=${this.query}
|
|
184685
184825
|
@input=${(event) => {
|
|
184686
184826
|
this.query = String(event.currentTarget.value ?? "");
|
|
184687
184827
|
}}></dees-input-text>
|
|
184688
|
-
<dees-input-dropdown label="Epic" .value=${{ key: this.epicId, option: epic?.title ?? "All epics" }}
|
|
184828
|
+
<dees-input-dropdown label="Epic" .labelPosition=${"none"} .value=${{ key: this.epicId, option: epic?.title ?? "All epics" }}
|
|
184689
184829
|
.options=${[{ key: "", option: "All epics" }, ...epics.map((ticket) => ({ key: ticket.id, option: ticket.title }))]}
|
|
184690
184830
|
@selectedOption=${(event) => {
|
|
184691
184831
|
this.epicId = event.detail.key;
|
|
184692
184832
|
}}></dees-input-dropdown>
|
|
184693
|
-
${epic ? b2`<dees-button type="ghost"
|
|
184833
|
+
${epic ? b2`<dees-button type="ghost" text="Open epic" @clicked=${() => {
|
|
184694
184834
|
void this.openTicket(epic.id);
|
|
184695
184835
|
}}></dees-button>` : ""}
|
|
184696
184836
|
</div>
|
|
184837
|
+
${this.provider.createTicket ? b2`<div class="actions"><dees-button type="secondary" text="New epic" .disabled=${!this.columns.length}
|
|
184838
|
+
@clicked=${() => {
|
|
184839
|
+
void this.createTicket({ kind: "epic", columnId: this.columns[0].id });
|
|
184840
|
+
}}></dees-button>
|
|
184841
|
+
<dees-button type="accent" icon="lucide:Plus" text="New task" .disabled=${!this.columns.length}
|
|
184842
|
+
@clicked=${() => {
|
|
184843
|
+
void this.createTicket({ kind: "task", columnId: this.columns[0].id, parentId: this.epicId || void 0 });
|
|
184844
|
+
}}></dees-button></div>` : ""}</header>
|
|
184697
184845
|
${this.loading || this.openingTicket ? b2`<p class="caption" role="status">${this.loading ? "Loading board\u2026" : "Opening ticket\u2026"}</p>` : ""}
|
|
184698
184846
|
${this.error || this.operationError ? b2`<p class="error" role="alert">${this.error || this.operationError}</p>` : ""}
|
|
184699
184847
|
${!this.columns.length ? b2`<p class="empty">No columns configured.</p>` : b2`<div class="columns" aria-label=${this.heading}>
|
|
@@ -184721,6 +184869,7 @@ var _DeesKanban = class _DeesKanban extends (_a109 = DeesElement, _heading_dec8
|
|
|
184721
184869
|
this.selectedId = id;
|
|
184722
184870
|
if (!this.detail) {
|
|
184723
184871
|
this.detail = new DeesKanbanTicketDetail();
|
|
184872
|
+
this.detail.showTicketKey = false;
|
|
184724
184873
|
for (const name of interactionEvents) this.detail.addEventListener(name, this.handleInteraction);
|
|
184725
184874
|
}
|
|
184726
184875
|
this.detail.ticket = ticket;
|
|
@@ -184732,6 +184881,7 @@ var _DeesKanban = class _DeesKanban extends (_a109 = DeesElement, _heading_dec8
|
|
|
184732
184881
|
width: 1e3,
|
|
184733
184882
|
maxWidth: 1040,
|
|
184734
184883
|
mobileFullscreen: true,
|
|
184884
|
+
contentPadding: 0,
|
|
184735
184885
|
content: b2`${this.detail}`,
|
|
184736
184886
|
menuOptions: []
|
|
184737
184887
|
});
|
|
@@ -184957,14 +185107,27 @@ __name(_DeesKanban, "DeesKanban");
|
|
|
184957
185107
|
__publicField(_DeesKanban, "demo", demoFunc72);
|
|
184958
185108
|
__publicField(_DeesKanban, "demoGroups", ["Kanban"]);
|
|
184959
185109
|
__publicField(_DeesKanban, "styles", [...kanbanStyles, i`
|
|
184960
|
-
:host { padding: 24px; background: var(--dees-color-bg-canvas); min-height: 100%; }
|
|
184961
|
-
.heading { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; margin-bottom:
|
|
184962
|
-
|
|
184963
|
-
|
|
184964
|
-
.
|
|
184965
|
-
.filters
|
|
184966
|
-
.
|
|
184967
|
-
|
|
185110
|
+
:host { padding: 20px 24px; background: var(--dees-color-bg-canvas); min-height: 100%; }
|
|
185111
|
+
.heading { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; margin-bottom: 16px; }
|
|
185112
|
+
.identity { display: flex; gap: 12px; align-items: baseline; flex: 1; min-width: 220px; flex-wrap: wrap; }
|
|
185113
|
+
h2 { font-size: var(--dees-font-title3-size); font-weight: 600; letter-spacing: -.02em; line-height: 1.3; overflow-wrap: anywhere; }
|
|
185114
|
+
.totals { font-size: var(--dees-font-caption1-size); color: var(--dees-color-text-secondary); white-space: nowrap; }
|
|
185115
|
+
.filters { display: flex; align-items: center; gap: 8px; }
|
|
185116
|
+
.filters dees-input-text { width: 230px; min-width: 140px; }
|
|
185117
|
+
.filters dees-input-dropdown { width: 180px; min-width: 140px; }
|
|
185118
|
+
.actions { display: flex; gap: 8px; margin-left: auto; }
|
|
185119
|
+
.columns { display: flex; gap: 20px; overflow-x: auto; padding: 3px 2px 16px; align-items: stretch; }
|
|
185120
|
+
@media (max-width: 1100px) { .filters { order: 3; flex-basis: 100%; } .filters dees-input-text { flex: 1; max-width: 320px; } }
|
|
185121
|
+
@media (max-width: 600px) {
|
|
185122
|
+
:host { padding: 12px 16px; }
|
|
185123
|
+
.heading { gap: 12px 8px; }
|
|
185124
|
+
.identity { min-width: 100%; gap: 6px 10px; }
|
|
185125
|
+
.actions { margin-left: 0; }
|
|
185126
|
+
.filters { flex-wrap: wrap; }
|
|
185127
|
+
.filters dees-input-text, .filters dees-input-dropdown { flex: 1; width: auto; min-width: 130px; }
|
|
185128
|
+
.columns { margin: 0 -16px; padding: 3px 16px 16px; scroll-snap-type: x proximity; scroll-padding-inline: 16px; gap: 14px; }
|
|
185129
|
+
dees-kanban-column { scroll-snap-align: start; flex: 0 0 86%; min-width: 0; max-width: none; }
|
|
185130
|
+
}
|
|
184968
185131
|
`]);
|
|
184969
185132
|
__runInitializers(_init111, 1, _DeesKanban);
|
|
184970
185133
|
var DeesKanban = _DeesKanban;
|
|
@@ -226370,7 +226533,7 @@ init_group_runtime();
|
|
|
226370
226533
|
// ts_web/00_commitinfo_data.ts
|
|
226371
226534
|
var commitinfo = {
|
|
226372
226535
|
name: "@design.estate/dees-catalog",
|
|
226373
|
-
version: "
|
|
226536
|
+
version: "13.0.1",
|
|
226374
226537
|
description: "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript."
|
|
226375
226538
|
};
|
|
226376
226539
|
|