@memberjunction/ng-kanban 6.1.4 → 6.2.0-edge.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.
@@ -32,27 +32,57 @@ export declare class MjKanbanBoardComponent {
32
32
  /** Emitted when a card is double-clicked. */
33
33
  CardDoubleClicked: EventEmitter<KanbanCardData>;
34
34
  /** @internal */
35
- dragCardID: string | null;
35
+ DragCardID: string | null;
36
+ /** @deprecated Use {@link DragCardID}. */
37
+ get dragCardID(): string | null;
38
+ /** @deprecated Use {@link DragCardID}. */
39
+ set dragCardID(value: string | null);
36
40
  /** @internal */
37
- dragCard: KanbanCardData | null;
41
+ DragCard: KanbanCardData | null;
42
+ /** @deprecated Use {@link DragCard}. */
43
+ get dragCard(): KanbanCardData | null;
44
+ /** @deprecated Use {@link DragCard}. */
45
+ set dragCard(value: KanbanCardData | null);
38
46
  /** @internal */
39
- dragSourceColumn: string | null;
47
+ DragSourceColumn: string | null;
48
+ /** @deprecated Use {@link DragSourceColumn}. */
49
+ get dragSourceColumn(): string | null;
50
+ /** @deprecated Use {@link DragSourceColumn}. */
51
+ set dragSourceColumn(value: string | null);
40
52
  /** @internal */
41
- dragOverColumn: string | null;
53
+ DragOverColumn: string | null;
54
+ /** @deprecated Use {@link DragOverColumn}. */
55
+ get dragOverColumn(): string | null;
56
+ /** @deprecated Use {@link DragOverColumn}. */
57
+ set dragOverColumn(value: string | null);
42
58
  private cdr;
43
59
  /** @internal Returns true if the given card is currently being dragged. */
60
+ IsDragging(cardID: string): boolean;
61
+ /** @deprecated Use {@link IsDragging}. */
44
62
  isDragging(cardID: string): boolean;
45
63
  /** Returns cards belonging to a specific column. */
64
+ GetColumnCards(columnKey: string): KanbanCardData[];
65
+ /** @deprecated Use {@link GetColumnCards}. */
46
66
  getColumnCards(columnKey: string): KanbanCardData[];
47
67
  /** @internal */
68
+ OnDragStart(event: DragEvent, card: KanbanCardData, columnKey: string): void;
69
+ /** @deprecated Use {@link OnDragStart}. */
48
70
  onDragStart(event: DragEvent, card: KanbanCardData, columnKey: string): void;
49
71
  /** @internal */
72
+ OnDragEnd(): void;
73
+ /** @deprecated Use {@link OnDragEnd}. */
50
74
  onDragEnd(): void;
51
75
  /** @internal */
76
+ OnDragOver(event: DragEvent, columnKey: string): void;
77
+ /** @deprecated Use {@link OnDragOver}. */
52
78
  onDragOver(event: DragEvent, columnKey: string): void;
53
79
  /** @internal */
80
+ OnDragLeave(columnKey: string): void;
81
+ /** @deprecated Use {@link OnDragLeave}. */
54
82
  onDragLeave(columnKey: string): void;
55
83
  /** @internal */
84
+ OnDrop(event: DragEvent, targetColumn: string): void;
85
+ /** @deprecated Use {@link OnDrop}. */
56
86
  onDrop(event: DragEvent, targetColumn: string): void;
57
87
  static ɵfac: i0.ɵɵFactoryDeclaration<MjKanbanBoardComponent, never>;
58
88
  static ɵcmp: i0.ɵɵComponentDeclaration<MjKanbanBoardComponent, "mj-kanban-board", never, { "Columns": { "alias": "Columns"; "required": false; }; "Cards": { "alias": "Cards"; "required": false; }; "ReadOnly": { "alias": "ReadOnly"; "required": false; }; }, { "CardMoved": "CardMoved"; "CardClicked": "CardClicked"; "CardDoubleClicked": "CardDoubleClicked"; }, never, never, true, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"kanban-board.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/kanban-board.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAsD,MAAM,eAAe,CAAC;AAG3H,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;;AAEhG;;;;;;;;;;;;;;;;GAgBG;AACH,qBAqLa,sBAAsB;IAC/B,0DAA0D;IACjD,OAAO,EAAE,eAAe,EAAE,CAAM;IAEzC,2FAA2F;IAClF,KAAK,EAAE,cAAc,EAAE,CAAM;IAEtC,wCAAwC;IAC/B,QAAQ,UAAS;IAE1B,4DAA4D;IAClD,SAAS,qCAA4C;IAE/D,sCAAsC;IAC5B,WAAW,+BAAsC;IAE3D,6CAA6C;IACnC,iBAAiB,+BAAsC;IAEjE,gBAAgB;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IACjC,gBAAgB;IAChB,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAQ;IACvC,gBAAgB;IAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACvC,gBAAgB;IAChB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAErC,OAAO,CAAC,GAAG,CAA6B;IAExC,2EAA2E;IAC3E,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAInC,oDAAoD;IACpD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,EAAE;IAInD,gBAAgB;IAChB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAU5E,gBAAgB;IAChB,SAAS,IAAI,IAAI;IAQjB,gBAAgB;IAChB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAWrD,gBAAgB;IAChB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOpC,gBAAgB;IAChB,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;yCAjF3C,sBAAsB;2CAAtB,sBAAsB;CAkGlC"}
1
+ {"version":3,"file":"kanban-board.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/kanban-board.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAsD,MAAM,eAAe,CAAC;AAG3H,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;;AAEhG;;;;;;;;;;;;;;;;GAgBG;AACH,qBAqLa,sBAAsB;IAC/B,0DAA0D;IACjD,OAAO,EAAE,eAAe,EAAE,CAAM;IAEzC,2FAA2F;IAClF,KAAK,EAAE,cAAc,EAAE,CAAM;IAEtC,wCAAwC;IAC/B,QAAQ,UAAS;IAE1B,4DAA4D;IAClD,SAAS,qCAA4C;IAE/D,sCAAsC;IAC5B,WAAW,+BAAsC;IAE3D,6CAA6C;IACnC,iBAAiB,+BAAsC;IAEjE,gBAAgB;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEjC,0CAA0C;IAC1C,IAAI,UAAU,IAAI,MAAM,GAAG,IAAI,CAE9B;IACD,0CAA0C;IAC1C,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAElC;IACD,gBAAgB;IAChB,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAQ;IAEvC,wCAAwC;IACxC,IAAI,QAAQ,IAAI,cAAc,GAAG,IAAI,CAEpC;IACD,wCAAwC;IACxC,IAAI,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,EAExC;IACD,gBAAgB;IAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEvC,gDAAgD;IAChD,IAAI,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEpC;IACD,gDAAgD;IAChD,IAAI,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAExC;IACD,gBAAgB;IAChB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAErC,8CAA8C;IAC9C,IAAI,cAAc,IAAI,MAAM,GAAG,IAAI,CAElC;IACD,8CAA8C;IAC9C,IAAI,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAEtC;IAED,OAAO,CAAC,GAAG,CAA6B;IAExC,2EAA2E;IAC3E,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAInC,0CAA0C;IAC1C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAInC,oDAAoD;IACpD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,EAAE;IAInD,8CAA8C;IAC9C,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,EAAE;IAInD,gBAAgB;IAChB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAU5E,2CAA2C;IAC3C,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAI5E,gBAAgB;IAChB,SAAS,IAAI,IAAI;IAQjB,yCAAyC;IACzC,SAAS,IAAI,IAAI;IAIjB,gBAAgB;IAChB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAWrD,0CAA0C;IAC1C,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrD,gBAAgB;IAChB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOpC,2CAA2C;IAC3C,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIpC,gBAAgB;IAChB,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAkBpD,sCAAsC;IACtC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;yCAtK3C,sBAAsB;2CAAtB,sBAAsB;CAyKlC"}
@@ -134,72 +134,132 @@ export class MjKanbanBoardComponent {
134
134
  /** Emitted when a card is double-clicked. */
135
135
  CardDoubleClicked = new EventEmitter();
136
136
  /** @internal */
137
- dragCardID = null;
137
+ DragCardID = null;
138
+ /** @deprecated Use {@link DragCardID}. */
139
+ get dragCardID() {
140
+ return this.DragCardID;
141
+ }
142
+ /** @deprecated Use {@link DragCardID}. */
143
+ set dragCardID(value) {
144
+ this.DragCardID = value;
145
+ }
138
146
  /** @internal */
139
- dragCard = null;
147
+ DragCard = null;
148
+ /** @deprecated Use {@link DragCard}. */
149
+ get dragCard() {
150
+ return this.DragCard;
151
+ }
152
+ /** @deprecated Use {@link DragCard}. */
153
+ set dragCard(value) {
154
+ this.DragCard = value;
155
+ }
140
156
  /** @internal */
141
- dragSourceColumn = null;
157
+ DragSourceColumn = null;
158
+ /** @deprecated Use {@link DragSourceColumn}. */
159
+ get dragSourceColumn() {
160
+ return this.DragSourceColumn;
161
+ }
162
+ /** @deprecated Use {@link DragSourceColumn}. */
163
+ set dragSourceColumn(value) {
164
+ this.DragSourceColumn = value;
165
+ }
142
166
  /** @internal */
143
- dragOverColumn = null;
167
+ DragOverColumn = null;
168
+ /** @deprecated Use {@link DragOverColumn}. */
169
+ get dragOverColumn() {
170
+ return this.DragOverColumn;
171
+ }
172
+ /** @deprecated Use {@link DragOverColumn}. */
173
+ set dragOverColumn(value) {
174
+ this.DragOverColumn = value;
175
+ }
144
176
  cdr = inject(ChangeDetectorRef);
145
177
  /** @internal Returns true if the given card is currently being dragged. */
178
+ IsDragging(cardID) {
179
+ return this.DragCardID != null && UUIDsEqual(this.DragCardID, cardID);
180
+ }
181
+ /** @deprecated Use {@link IsDragging}. */
146
182
  isDragging(cardID) {
147
- return this.dragCardID != null && UUIDsEqual(this.dragCardID, cardID);
183
+ return this.IsDragging(cardID);
148
184
  }
149
185
  /** Returns cards belonging to a specific column. */
150
- getColumnCards(columnKey) {
186
+ GetColumnCards(columnKey) {
151
187
  return this.Cards.filter(c => c.ColumnKey === columnKey);
152
188
  }
189
+ /** @deprecated Use {@link GetColumnCards}. */
190
+ getColumnCards(columnKey) {
191
+ return this.GetColumnCards(columnKey);
192
+ }
153
193
  /** @internal */
154
- onDragStart(event, card, columnKey) {
155
- this.dragCardID = card.ID;
156
- this.dragCard = card;
157
- this.dragSourceColumn = columnKey;
194
+ OnDragStart(event, card, columnKey) {
195
+ this.DragCardID = card.ID;
196
+ this.DragCard = card;
197
+ this.DragSourceColumn = columnKey;
158
198
  event.dataTransfer?.setData('text/plain', card.ID);
159
199
  if (event.dataTransfer) {
160
200
  event.dataTransfer.effectAllowed = 'move';
161
201
  }
162
202
  }
203
+ /** @deprecated Use {@link OnDragStart}. */
204
+ onDragStart(event, card, columnKey) {
205
+ return this.OnDragStart(event, card, columnKey);
206
+ }
163
207
  /** @internal */
164
- onDragEnd() {
165
- this.dragCardID = null;
166
- this.dragCard = null;
167
- this.dragSourceColumn = null;
168
- this.dragOverColumn = null;
208
+ OnDragEnd() {
209
+ this.DragCardID = null;
210
+ this.DragCard = null;
211
+ this.DragSourceColumn = null;
212
+ this.DragOverColumn = null;
169
213
  this.cdr.markForCheck();
170
214
  }
215
+ /** @deprecated Use {@link OnDragEnd}. */
216
+ onDragEnd() {
217
+ return this.OnDragEnd();
218
+ }
171
219
  /** @internal */
172
- onDragOver(event, columnKey) {
220
+ OnDragOver(event, columnKey) {
173
221
  event.preventDefault();
174
222
  if (event.dataTransfer) {
175
223
  event.dataTransfer.dropEffect = 'move';
176
224
  }
177
- if (this.dragOverColumn !== columnKey) {
178
- this.dragOverColumn = columnKey;
225
+ if (this.DragOverColumn !== columnKey) {
226
+ this.DragOverColumn = columnKey;
179
227
  this.cdr.markForCheck();
180
228
  }
181
229
  }
230
+ /** @deprecated Use {@link OnDragOver}. */
231
+ onDragOver(event, columnKey) {
232
+ return this.OnDragOver(event, columnKey);
233
+ }
182
234
  /** @internal */
183
- onDragLeave(columnKey) {
184
- if (this.dragOverColumn === columnKey) {
185
- this.dragOverColumn = null;
235
+ OnDragLeave(columnKey) {
236
+ if (this.DragOverColumn === columnKey) {
237
+ this.DragOverColumn = null;
186
238
  this.cdr.markForCheck();
187
239
  }
188
240
  }
241
+ /** @deprecated Use {@link OnDragLeave}. */
242
+ onDragLeave(columnKey) {
243
+ return this.OnDragLeave(columnKey);
244
+ }
189
245
  /** @internal */
190
- onDrop(event, targetColumn) {
246
+ OnDrop(event, targetColumn) {
191
247
  event.preventDefault();
192
- this.dragOverColumn = null;
193
- if (!this.dragCard || this.dragSourceColumn === targetColumn) {
194
- this.onDragEnd();
248
+ this.DragOverColumn = null;
249
+ if (!this.DragCard || this.DragSourceColumn === targetColumn) {
250
+ this.OnDragEnd();
195
251
  return;
196
252
  }
197
253
  this.CardMoved.emit({
198
- Card: this.dragCard,
199
- FromColumn: this.dragSourceColumn,
254
+ Card: this.DragCard,
255
+ FromColumn: this.DragSourceColumn,
200
256
  ToColumn: targetColumn,
201
257
  });
202
- this.onDragEnd();
258
+ this.OnDragEnd();
259
+ }
260
+ /** @deprecated Use {@link OnDrop}. */
261
+ onDrop(event, targetColumn) {
262
+ return this.OnDrop(event, targetColumn);
203
263
  }
204
264
  static ɵfac = function MjKanbanBoardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MjKanbanBoardComponent)(); };
205
265
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjKanbanBoardComponent, selectors: [["mj-kanban-board"]], inputs: { Columns: "Columns", Cards: "Cards", ReadOnly: "ReadOnly" }, outputs: { CardMoved: "CardMoved", CardClicked: "CardClicked", CardDoubleClicked: "CardDoubleClicked" }, decls: 3, vars: 0, consts: [[1, "mj-kanban-board"], [1, "mj-kanban-column", 3, "drag-over"], [1, "mj-kanban-column", 3, "dragover", "dragleave", "drop"], [1, "column-header"], [1, "column-title"], [1, "column-count"], [1, "column-body"], [1, "mj-kanban-card", 3, "border-left-color", "dragging", "draggable"], [1, "empty-column"], [1, "mj-kanban-card", 3, "dragstart", "dragend", "click", "dblclick", "draggable"], [1, "card-title"], [1, "card-subtitle"], [1, "card-footer"], [1, "card-badge", 3, "background", "color"], [1, "card-footer-text"], [1, "card-badge"]], template: function MjKanbanBoardComponent_Template(rf, ctx) { if (rf & 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"kanban-board.component.js","sourceRoot":"","sources":["../../../src/lib/components/kanban-board.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { KanbanCardData, KanbanColumnDef, KanbanCardMovedEvent } from '../models/kanban.models';\n\n/**\n * Generic Kanban board component with drag-and-drop column management.\n *\n * This component is entity-agnostic — it renders cards and columns from\n * the data you provide and emits events when cards are moved or clicked.\n * It does NOT manage persistence; the consuming application handles saves.\n *\n * @example\n * ```html\n * <mj-kanban-board\n * [Columns]=\"statusColumns\"\n * [Cards]=\"taskCards\"\n * (CardMoved)=\"onCardMoved($event)\"\n * (CardClicked)=\"onCardClicked($event)\">\n * </mj-kanban-board>\n * ```\n */\n@Component({\n selector: 'mj-kanban-board',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"mj-kanban-board\">\n @for (col of Columns; track col.Key) {\n <div class=\"mj-kanban-column\"\n [class.drag-over]=\"dragOverColumn === col.Key\"\n (dragover)=\"onDragOver($event, col.Key)\"\n (dragleave)=\"onDragLeave(col.Key)\"\n (drop)=\"onDrop($event, col.Key)\">\n <div class=\"column-header\" [style.border-top-color]=\"col.Color || 'var(--mj-border-default)'\">\n <span class=\"column-title\">{{ col.Label }}</span>\n <span class=\"column-count\">{{ getColumnCards(col.Key).length }}</span>\n </div>\n <div class=\"column-body\">\n @for (card of getColumnCards(col.Key); track card.ID) {\n <div class=\"mj-kanban-card\"\n [style.border-left-color]=\"card.Color || 'transparent'\"\n [class.dragging]=\"isDragging(card.ID)\"\n [draggable]=\"!ReadOnly\"\n (dragstart)=\"onDragStart($event, card, col.Key)\"\n (dragend)=\"onDragEnd()\"\n (click)=\"CardClicked.emit(card)\"\n (dblclick)=\"CardDoubleClicked.emit(card)\">\n <div class=\"card-title\">{{ card.Title }}</div>\n @if (card.Subtitle) {\n <div class=\"card-subtitle\">{{ card.Subtitle }}</div>\n }\n <div class=\"card-footer\">\n @if (card.BadgeText) {\n <span class=\"card-badge\"\n [style.background]=\"card.BadgeColor || 'var(--mj-bg-surface-sunken)'\"\n [style.color]=\"card.BadgeColor ? 'var(--mj-text-inverse)' : 'var(--mj-text-secondary)'\">\n {{ card.BadgeText }}\n </span>\n }\n @if (card.FooterText) {\n <span class=\"card-footer-text\">{{ card.FooterText }}</span>\n }\n </div>\n </div>\n }\n @if (getColumnCards(col.Key).length === 0) {\n <div class=\"empty-column\">\n @if (!ReadOnly) {\n Drop here\n } @else {\n No items\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host { display: block; font-family: var(--mj-font-family); }\n\n .mj-kanban-board {\n display: flex;\n gap: var(--mj-space-3);\n overflow-x: auto;\n padding: var(--mj-space-1) 0 var(--mj-space-2) 0;\n min-height: 300px;\n }\n\n .mj-kanban-column {\n flex: 0 0 260px;\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-lg);\n display: flex;\n flex-direction: column;\n transition: background var(--mj-transition-fast);\n }\n\n .mj-kanban-column.drag-over {\n background: var(--mj-brand-primary-light);\n }\n\n .column-header {\n padding: var(--mj-space-2-5) var(--mj-space-3-5);\n font-weight: var(--mj-font-semibold);\n font-size: var(--mj-text-sm);\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-top: 3px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg) var(--mj-radius-lg) 0 0;\n color: var(--mj-text-primary);\n }\n\n .column-count {\n background: var(--mj-bg-surface-hover);\n border-radius: var(--mj-radius-lg);\n padding: var(--mj-space-px) var(--mj-space-2);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-secondary);\n }\n\n .column-body {\n flex: 1;\n padding: var(--mj-space-2);\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1-5);\n min-height: 80px;\n }\n\n .mj-kanban-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-left: 3px solid transparent;\n border-radius: var(--mj-radius-md);\n padding: var(--mj-space-2-5) var(--mj-space-3);\n cursor: grab;\n transition: box-shadow var(--mj-transition-fast), opacity var(--mj-transition-fast);\n }\n\n .mj-kanban-card:hover {\n box-shadow: var(--mj-shadow-sm);\n }\n\n .mj-kanban-card:active { cursor: grabbing; }\n\n .mj-kanban-card.dragging {\n opacity: 0.4;\n }\n\n .card-title {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-primary);\n line-height: var(--mj-leading-snug);\n }\n\n .card-subtitle {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n margin-top: var(--mj-space-1);\n line-height: var(--mj-leading-snug);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: var(--mj-space-2);\n gap: var(--mj-space-2);\n }\n\n .card-badge {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n padding: var(--mj-space-0-5) var(--mj-space-2);\n border-radius: var(--mj-radius-sm);\n }\n\n .card-footer-text {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n }\n\n .empty-column {\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: var(--mj-text-sm);\n padding: var(--mj-space-6) var(--mj-space-2);\n border: 2px dashed var(--mj-border-subtle);\n border-radius: var(--mj-radius-md);\n }\n `]\n})\nexport class MjKanbanBoardComponent {\n /** Column definitions. Order determines display order. */\n @Input() Columns: KanbanColumnDef[] = [];\n\n /** All cards to display. Each card's `ColumnKey` determines which column it appears in. */\n @Input() Cards: KanbanCardData[] = [];\n\n /** Disables drag-and-drop when true. */\n @Input() ReadOnly = false;\n\n /** Emitted when a card is dragged to a different column. */\n @Output() CardMoved = new EventEmitter<KanbanCardMovedEvent>();\n\n /** Emitted when a card is clicked. */\n @Output() CardClicked = new EventEmitter<KanbanCardData>();\n\n /** Emitted when a card is double-clicked. */\n @Output() CardDoubleClicked = new EventEmitter<KanbanCardData>();\n\n /** @internal */\n dragCardID: string | null = null;\n /** @internal */\n dragCard: KanbanCardData | null = null;\n /** @internal */\n dragSourceColumn: string | null = null;\n /** @internal */\n dragOverColumn: string | null = null;\n\n private cdr = inject(ChangeDetectorRef);\n\n /** @internal Returns true if the given card is currently being dragged. */\n isDragging(cardID: string): boolean {\n return this.dragCardID != null && UUIDsEqual(this.dragCardID, cardID);\n }\n\n /** Returns cards belonging to a specific column. */\n getColumnCards(columnKey: string): KanbanCardData[] {\n return this.Cards.filter(c => c.ColumnKey === columnKey);\n }\n\n /** @internal */\n onDragStart(event: DragEvent, card: KanbanCardData, columnKey: string): void {\n this.dragCardID = card.ID;\n this.dragCard = card;\n this.dragSourceColumn = columnKey;\n event.dataTransfer?.setData('text/plain', card.ID);\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n }\n }\n\n /** @internal */\n onDragEnd(): void {\n this.dragCardID = null;\n this.dragCard = null;\n this.dragSourceColumn = null;\n this.dragOverColumn = null;\n this.cdr.markForCheck();\n }\n\n /** @internal */\n onDragOver(event: DragEvent, columnKey: string): void {\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n if (this.dragOverColumn !== columnKey) {\n this.dragOverColumn = columnKey;\n this.cdr.markForCheck();\n }\n }\n\n /** @internal */\n onDragLeave(columnKey: string): void {\n if (this.dragOverColumn === columnKey) {\n this.dragOverColumn = null;\n this.cdr.markForCheck();\n }\n }\n\n /** @internal */\n onDrop(event: DragEvent, targetColumn: string): void {\n event.preventDefault();\n this.dragOverColumn = null;\n\n if (!this.dragCard || this.dragSourceColumn === targetColumn) {\n this.onDragEnd();\n return;\n }\n\n this.CardMoved.emit({\n Card: this.dragCard,\n FromColumn: this.dragSourceColumn!,\n ToColumn: targetColumn,\n });\n\n this.onDragEnd();\n }\n}\n"]}
1
+ {"version":3,"file":"kanban-board.component.js","sourceRoot":"","sources":["../../../src/lib/components/kanban-board.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { KanbanCardData, KanbanColumnDef, KanbanCardMovedEvent } from '../models/kanban.models';\n\n/**\n * Generic Kanban board component with drag-and-drop column management.\n *\n * This component is entity-agnostic — it renders cards and columns from\n * the data you provide and emits events when cards are moved or clicked.\n * It does NOT manage persistence; the consuming application handles saves.\n *\n * @example\n * ```html\n * <mj-kanban-board\n * [Columns]=\"statusColumns\"\n * [Cards]=\"taskCards\"\n * (CardMoved)=\"onCardMoved($event)\"\n * (CardClicked)=\"onCardClicked($event)\">\n * </mj-kanban-board>\n * ```\n */\n@Component({\n selector: 'mj-kanban-board',\n standalone: true,\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"mj-kanban-board\">\n @for (col of Columns; track col.Key) {\n <div class=\"mj-kanban-column\"\n [class.drag-over]=\"dragOverColumn === col.Key\"\n (dragover)=\"onDragOver($event, col.Key)\"\n (dragleave)=\"onDragLeave(col.Key)\"\n (drop)=\"onDrop($event, col.Key)\">\n <div class=\"column-header\" [style.border-top-color]=\"col.Color || 'var(--mj-border-default)'\">\n <span class=\"column-title\">{{ col.Label }}</span>\n <span class=\"column-count\">{{ getColumnCards(col.Key).length }}</span>\n </div>\n <div class=\"column-body\">\n @for (card of getColumnCards(col.Key); track card.ID) {\n <div class=\"mj-kanban-card\"\n [style.border-left-color]=\"card.Color || 'transparent'\"\n [class.dragging]=\"isDragging(card.ID)\"\n [draggable]=\"!ReadOnly\"\n (dragstart)=\"onDragStart($event, card, col.Key)\"\n (dragend)=\"onDragEnd()\"\n (click)=\"CardClicked.emit(card)\"\n (dblclick)=\"CardDoubleClicked.emit(card)\">\n <div class=\"card-title\">{{ card.Title }}</div>\n @if (card.Subtitle) {\n <div class=\"card-subtitle\">{{ card.Subtitle }}</div>\n }\n <div class=\"card-footer\">\n @if (card.BadgeText) {\n <span class=\"card-badge\"\n [style.background]=\"card.BadgeColor || 'var(--mj-bg-surface-sunken)'\"\n [style.color]=\"card.BadgeColor ? 'var(--mj-text-inverse)' : 'var(--mj-text-secondary)'\">\n {{ card.BadgeText }}\n </span>\n }\n @if (card.FooterText) {\n <span class=\"card-footer-text\">{{ card.FooterText }}</span>\n }\n </div>\n </div>\n }\n @if (getColumnCards(col.Key).length === 0) {\n <div class=\"empty-column\">\n @if (!ReadOnly) {\n Drop here\n } @else {\n No items\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host { display: block; font-family: var(--mj-font-family); }\n\n .mj-kanban-board {\n display: flex;\n gap: var(--mj-space-3);\n overflow-x: auto;\n padding: var(--mj-space-1) 0 var(--mj-space-2) 0;\n min-height: 300px;\n }\n\n .mj-kanban-column {\n flex: 0 0 260px;\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-lg);\n display: flex;\n flex-direction: column;\n transition: background var(--mj-transition-fast);\n }\n\n .mj-kanban-column.drag-over {\n background: var(--mj-brand-primary-light);\n }\n\n .column-header {\n padding: var(--mj-space-2-5) var(--mj-space-3-5);\n font-weight: var(--mj-font-semibold);\n font-size: var(--mj-text-sm);\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-top: 3px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg) var(--mj-radius-lg) 0 0;\n color: var(--mj-text-primary);\n }\n\n .column-count {\n background: var(--mj-bg-surface-hover);\n border-radius: var(--mj-radius-lg);\n padding: var(--mj-space-px) var(--mj-space-2);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-secondary);\n }\n\n .column-body {\n flex: 1;\n padding: var(--mj-space-2);\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-1-5);\n min-height: 80px;\n }\n\n .mj-kanban-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-left: 3px solid transparent;\n border-radius: var(--mj-radius-md);\n padding: var(--mj-space-2-5) var(--mj-space-3);\n cursor: grab;\n transition: box-shadow var(--mj-transition-fast), opacity var(--mj-transition-fast);\n }\n\n .mj-kanban-card:hover {\n box-shadow: var(--mj-shadow-sm);\n }\n\n .mj-kanban-card:active { cursor: grabbing; }\n\n .mj-kanban-card.dragging {\n opacity: 0.4;\n }\n\n .card-title {\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-primary);\n line-height: var(--mj-leading-snug);\n }\n\n .card-subtitle {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n margin-top: var(--mj-space-1);\n line-height: var(--mj-leading-snug);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: var(--mj-space-2);\n gap: var(--mj-space-2);\n }\n\n .card-badge {\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n padding: var(--mj-space-0-5) var(--mj-space-2);\n border-radius: var(--mj-radius-sm);\n }\n\n .card-footer-text {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-muted);\n }\n\n .empty-column {\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: var(--mj-text-sm);\n padding: var(--mj-space-6) var(--mj-space-2);\n border: 2px dashed var(--mj-border-subtle);\n border-radius: var(--mj-radius-md);\n }\n `]\n})\nexport class MjKanbanBoardComponent {\n /** Column definitions. Order determines display order. */\n @Input() Columns: KanbanColumnDef[] = [];\n\n /** All cards to display. Each card's `ColumnKey` determines which column it appears in. */\n @Input() Cards: KanbanCardData[] = [];\n\n /** Disables drag-and-drop when true. */\n @Input() ReadOnly = false;\n\n /** Emitted when a card is dragged to a different column. */\n @Output() CardMoved = new EventEmitter<KanbanCardMovedEvent>();\n\n /** Emitted when a card is clicked. */\n @Output() CardClicked = new EventEmitter<KanbanCardData>();\n\n /** Emitted when a card is double-clicked. */\n @Output() CardDoubleClicked = new EventEmitter<KanbanCardData>();\n\n /** @internal */\n DragCardID: string | null = null;\n\n /** @deprecated Use {@link DragCardID}. */\n get dragCardID(): string | null {\n return this.DragCardID;\n }\n /** @deprecated Use {@link DragCardID}. */\n set dragCardID(value: string | null) {\n this.DragCardID = value;\n }\n /** @internal */\n DragCard: KanbanCardData | null = null;\n\n /** @deprecated Use {@link DragCard}. */\n get dragCard(): KanbanCardData | null {\n return this.DragCard;\n }\n /** @deprecated Use {@link DragCard}. */\n set dragCard(value: KanbanCardData | null) {\n this.DragCard = value;\n }\n /** @internal */\n DragSourceColumn: string | null = null;\n\n /** @deprecated Use {@link DragSourceColumn}. */\n get dragSourceColumn(): string | null {\n return this.DragSourceColumn;\n }\n /** @deprecated Use {@link DragSourceColumn}. */\n set dragSourceColumn(value: string | null) {\n this.DragSourceColumn = value;\n }\n /** @internal */\n DragOverColumn: string | null = null;\n\n /** @deprecated Use {@link DragOverColumn}. */\n get dragOverColumn(): string | null {\n return this.DragOverColumn;\n }\n /** @deprecated Use {@link DragOverColumn}. */\n set dragOverColumn(value: string | null) {\n this.DragOverColumn = value;\n }\n\n private cdr = inject(ChangeDetectorRef);\n\n /** @internal Returns true if the given card is currently being dragged. */\n IsDragging(cardID: string): boolean {\n return this.DragCardID != null && UUIDsEqual(this.DragCardID, cardID);\n }\n\n /** @deprecated Use {@link IsDragging}. */\n isDragging(cardID: string): boolean {\n return this.IsDragging(cardID);\n }\n\n /** Returns cards belonging to a specific column. */\n GetColumnCards(columnKey: string): KanbanCardData[] {\n return this.Cards.filter(c => c.ColumnKey === columnKey);\n }\n\n /** @deprecated Use {@link GetColumnCards}. */\n getColumnCards(columnKey: string): KanbanCardData[] {\n return this.GetColumnCards(columnKey);\n }\n\n /** @internal */\n OnDragStart(event: DragEvent, card: KanbanCardData, columnKey: string): void {\n this.DragCardID = card.ID;\n this.DragCard = card;\n this.DragSourceColumn = columnKey;\n event.dataTransfer?.setData('text/plain', card.ID);\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n }\n }\n\n /** @deprecated Use {@link OnDragStart}. */\n onDragStart(event: DragEvent, card: KanbanCardData, columnKey: string): void {\n return this.OnDragStart(event, card, columnKey);\n }\n\n /** @internal */\n OnDragEnd(): void {\n this.DragCardID = null;\n this.DragCard = null;\n this.DragSourceColumn = null;\n this.DragOverColumn = null;\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link OnDragEnd}. */\n onDragEnd(): void {\n return this.OnDragEnd();\n }\n\n /** @internal */\n OnDragOver(event: DragEvent, columnKey: string): void {\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n if (this.DragOverColumn !== columnKey) {\n this.DragOverColumn = columnKey;\n this.cdr.markForCheck();\n }\n }\n\n /** @deprecated Use {@link OnDragOver}. */\n onDragOver(event: DragEvent, columnKey: string): void {\n return this.OnDragOver(event, columnKey);\n }\n\n /** @internal */\n OnDragLeave(columnKey: string): void {\n if (this.DragOverColumn === columnKey) {\n this.DragOverColumn = null;\n this.cdr.markForCheck();\n }\n }\n\n /** @deprecated Use {@link OnDragLeave}. */\n onDragLeave(columnKey: string): void {\n return this.OnDragLeave(columnKey);\n }\n\n /** @internal */\n OnDrop(event: DragEvent, targetColumn: string): void {\n event.preventDefault();\n this.DragOverColumn = null;\n\n if (!this.DragCard || this.DragSourceColumn === targetColumn) {\n this.OnDragEnd();\n return;\n }\n\n this.CardMoved.emit({\n Card: this.DragCard,\n FromColumn: this.DragSourceColumn!,\n ToColumn: targetColumn,\n });\n\n this.OnDragEnd();\n }\n\n /** @deprecated Use {@link OnDrop}. */\n onDrop(event: DragEvent, targetColumn: string): void {\n return this.OnDrop(event, targetColumn);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-kanban",
3
- "version": "6.1.4",
3
+ "version": "6.2.0-edge.1",
4
4
  "description": "MemberJunction: Generic Kanban board component with drag-and-drop column management",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -13,7 +13,7 @@
13
13
  "devDependencies": {
14
14
  "@angular/compiler": "21.2.22",
15
15
  "@angular/compiler-cli": "21.2.22",
16
- "@memberjunction/ng-test-utils": "6.1.4",
16
+ "@memberjunction/ng-test-utils": "6.2.0-edge.1",
17
17
  "vitest": "^4.0.18"
18
18
  },
19
19
  "peerDependencies": {
@@ -21,7 +21,7 @@
21
21
  "@angular/core": "^21.2.22"
22
22
  },
23
23
  "dependencies": {
24
- "@memberjunction/global": "6.1.4",
24
+ "@memberjunction/global": "6.2.0-edge.1",
25
25
  "tslib": "^2.8.1"
26
26
  },
27
27
  "sideEffects": false,