@brickclay-org/ui 0.1.90 → 0.1.92
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/fesm2022/brickclay-org-ui.mjs +442 -13
- package/fesm2022/brickclay-org-ui.mjs.map +1 -1
- package/index.d.ts +415 -5
- package/package.json +1 -1
- package/src/lib/toastr/toastr.css +4 -2
- package/src/styles.css +1 -0
package/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import * as rxjs from 'rxjs';
|
|
|
7
7
|
import { Observable } from 'rxjs';
|
|
8
8
|
import * as i1 from '@angular/common';
|
|
9
9
|
import * as i1$3 from '@angular/cdk/drag-drop';
|
|
10
|
-
import { CdkDragDrop, CdkDragMove, CdkDragStart } from '@angular/cdk/drag-drop';
|
|
10
|
+
import { CdkDragDrop, CdkDragMove, CdkDragStart, CdkDragEnter } from '@angular/cdk/drag-drop';
|
|
11
11
|
import { NgxMaskDirective } from 'ngx-mask';
|
|
12
12
|
import * as i1$2 from '@angular/cdk/dialog';
|
|
13
13
|
import { CdkDialogContainer, DialogRef } from '@angular/cdk/dialog';
|
|
@@ -1868,6 +1868,19 @@ declare class BkInput implements OnInit, OnDestroy, AfterViewInit, ControlValueA
|
|
|
1868
1868
|
phoneOverlay?: CdkConnectedOverlay;
|
|
1869
1869
|
isFocused: boolean;
|
|
1870
1870
|
inputValue: string;
|
|
1871
|
+
/**
|
|
1872
|
+
* What the template's `[value]` binding actually renders. Deliberately a separate property
|
|
1873
|
+
* from `inputValue` (which still mirrors the live text for `isFilled`/bookkeeping on every
|
|
1874
|
+
* keystroke): re-applying `[value]` to an element that already displays that exact text is a
|
|
1875
|
+
* no-op on most inputs, but on `type="number"` it isn't - Chromium doesn't skip the write just
|
|
1876
|
+
* because the string is unchanged, and since `type="number"` also refuses `setSelectionRange`
|
|
1877
|
+
* (it throws), we have no way to put the caret back afterwards. So `displayValue` is only ever
|
|
1878
|
+
* written by genuinely external changes (writeValue(), the phone country-prefix swap) - never
|
|
1879
|
+
* from handleInput() or the "parent mutated the native value" resync, both of which are only
|
|
1880
|
+
* echoing back text the DOM already has. That keeps every self-originated edit from re-touching
|
|
1881
|
+
* `.value` at all, which is the only reliable fix here given number inputs can't be caret-restored.
|
|
1882
|
+
*/
|
|
1883
|
+
displayValue: string;
|
|
1871
1884
|
isDropdownOpen: boolean;
|
|
1872
1885
|
private pendingMaskedValue;
|
|
1873
1886
|
private isPropagatingViewValue;
|
|
@@ -3719,7 +3732,7 @@ declare class BkPopover implements OnDestroy {
|
|
|
3719
3732
|
* anything interactive. `hover` opens on the way in and closes on the way
|
|
3720
3733
|
* out, with a grace period so the pointer can travel into the panel.
|
|
3721
3734
|
*/
|
|
3722
|
-
trigger: _angular_core.InputSignal<"
|
|
3735
|
+
trigger: _angular_core.InputSignal<"click" | "hover">;
|
|
3723
3736
|
/** Optional heading. Empty hides the header row entirely. */
|
|
3724
3737
|
title: _angular_core.InputSignal<string>;
|
|
3725
3738
|
/** Show the × in the header. Ignored without a `title` to put it in. */
|
|
@@ -4566,7 +4579,7 @@ declare class BkTd extends BkCellBase implements AfterViewInit, OnDestroy {
|
|
|
4566
4579
|
*/
|
|
4567
4580
|
protected readonly truncatedTooltip: _angular_core.WritableSignal<string>;
|
|
4568
4581
|
/** Forwarded to the content wrapper's `bkTooltip`. Override on a column whose default 'right' would run into its neighbour. */
|
|
4569
|
-
tooltipPosition: _angular_core.InputSignal<"
|
|
4582
|
+
tooltipPosition: _angular_core.InputSignal<"left" | "right" | "top" | "bottom">;
|
|
4570
4583
|
/** Only present when `ellipsis()` is true — see the `@else` branch in the template. */
|
|
4571
4584
|
private ellipsisTextRef?;
|
|
4572
4585
|
checkbox: _angular_core.InputSignal<boolean>;
|
|
@@ -4883,5 +4896,402 @@ declare class BkTreeDrag<T = any> extends BkTableDrag implements OnDestroy {
|
|
|
4883
4896
|
|
|
4884
4897
|
declare const BK_TABLE: readonly [typeof BkTable, typeof BkTableTitle, typeof BkTableFooter, typeof BkVirtualScroll, typeof BkTh, typeof BkTd, typeof BkTrExpand, typeof BkTableSummary, typeof BkTableDrag, typeof BkDragHandle, typeof BkTreeDrag];
|
|
4885
4898
|
|
|
4886
|
-
|
|
4887
|
-
|
|
4899
|
+
/**
|
|
4900
|
+
* Types for bk-kanban.
|
|
4901
|
+
*
|
|
4902
|
+
* The board is content-agnostic by design (see the component's own doc
|
|
4903
|
+
* comment): it only ever moves opaque `T` values between columns and reports
|
|
4904
|
+
* what happened. Every type here describes either a column, or one of the
|
|
4905
|
+
* events the board reports — never anything about what a card renders as.
|
|
4906
|
+
*/
|
|
4907
|
+
/** One column/status definition. Any number of columns — no fixed status set
|
|
4908
|
+
* assumed; a workflow with two lanes and one with fifteen both just pass a
|
|
4909
|
+
* `columns` array of the size they need. */
|
|
4910
|
+
interface BkKanbanColumn {
|
|
4911
|
+
id: string;
|
|
4912
|
+
label: string;
|
|
4913
|
+
/** Cap on cards in this column. Omit for no limit — see `wipLimitBehavior`. */
|
|
4914
|
+
wipLimit?: number;
|
|
4915
|
+
/**
|
|
4916
|
+
* Extra class(es) appended to this column's header bar — the row holding
|
|
4917
|
+
* the label, the count badge, and `columnHeaderActionsTemplate`, if any.
|
|
4918
|
+
* Named `colHeaderClass` (not `headerClass`) so it reads unambiguously as
|
|
4919
|
+
* "this column's header" once a column is nested inside `bk-kanban`. Same
|
|
4920
|
+
* idea as `panelClass` on `bk-dialog`/`bk-popover`, or `headerClass` on
|
|
4921
|
+
* `bk-grid`'s `TableColumn`: it only adds to the header's own classes,
|
|
4922
|
+
* bk-kanban's own layout still stands, and nothing stops you passing
|
|
4923
|
+
* whatever you'd pass any other element — a single class, several, a
|
|
4924
|
+
* whole Tailwind utility stack.
|
|
4925
|
+
*
|
|
4926
|
+
* For properties the header doesn't already declare (a `border`,
|
|
4927
|
+
* `box-shadow`, rounded corners) a plain class works exactly as you'd
|
|
4928
|
+
* expect. For its **background** specifically, set the
|
|
4929
|
+
* `--bk-kanban-header-bg` custom property instead of a `bg-*` utility —
|
|
4930
|
+
* Angular injects this component's own stylesheet after the page's
|
|
4931
|
+
* global one, so a same-specificity utility class can never outrank the
|
|
4932
|
+
* header's own background declaration; the custom property exists
|
|
4933
|
+
* precisely so `colHeaderClass` still has a reliable way to change it.
|
|
4934
|
+
*/
|
|
4935
|
+
colHeaderClass?: string;
|
|
4936
|
+
/**
|
|
4937
|
+
* Extra class(es) appended to this column's own wrapper — the element
|
|
4938
|
+
* `wipLimit` feedback (`bk-kanban-column-warn`/`bk-kanban-column-live-over`)
|
|
4939
|
+
* already lands on, and the ancestor `colHeaderClass` reaches the header
|
|
4940
|
+
* through. Same idea as `colHeaderClass` one level up: it only adds to the
|
|
4941
|
+
* wrapper's own classes, nothing here replaces bk-kanban's own layout.
|
|
4942
|
+
*
|
|
4943
|
+
* Same background caveat as `colHeaderClass` too — set the
|
|
4944
|
+
* `--bk-kanban-column-bg` custom property rather than a `bg-*` utility to
|
|
4945
|
+
* change the wrapper's background reliably; see `colHeaderClass`'s doc
|
|
4946
|
+
* comment for why.
|
|
4947
|
+
*/
|
|
4948
|
+
columnClass?: string;
|
|
4949
|
+
/**
|
|
4950
|
+
* Placeholder text shown in this column's body when it holds no cards,
|
|
4951
|
+
* overriding the board-wide `noDataText` input for this column alone.
|
|
4952
|
+
* Ignored once `emptyStateTemplate` is supplied — a template is a bigger
|
|
4953
|
+
* override than swapping in different words, so it wins outright rather
|
|
4954
|
+
* than being handed a piece of text it may not even render.
|
|
4955
|
+
*/
|
|
4956
|
+
noDataText?: string;
|
|
4957
|
+
}
|
|
4958
|
+
/**
|
|
4959
|
+
* How far a drag is allowed to travel.
|
|
4960
|
+
*
|
|
4961
|
+
* `'same'` only reorders within a column (manual prioritization on a board
|
|
4962
|
+
* whose statuses shouldn't change from a drag). `'cross'` only moves cards
|
|
4963
|
+
* between columns, with no in-column reordering. `'both'` (the default)
|
|
4964
|
+
* allows either.
|
|
4965
|
+
*/
|
|
4966
|
+
type BkKanbanDragScope = 'same' | 'cross' | 'both';
|
|
4967
|
+
/**
|
|
4968
|
+
* What happens when a drop would push a column's card count past its
|
|
4969
|
+
* `wipLimit`.
|
|
4970
|
+
*
|
|
4971
|
+
* `'block'` rejects the drop — nothing is mutated, so the card returns to
|
|
4972
|
+
* its origin the same way any cancelled CDK drag does. `'warn'` lets the
|
|
4973
|
+
* drop through but flags the column. `'none'` ignores limits at drop time
|
|
4974
|
+
* entirely (they still show in the header, purely as information).
|
|
4975
|
+
* `columnLimitExceeded` fires whenever a drop *would* exceed the limit,
|
|
4976
|
+
* regardless of which of the three is active.
|
|
4977
|
+
*/
|
|
4978
|
+
type BkKanbanWipLimitBehavior = 'block' | 'warn' | 'none';
|
|
4979
|
+
/**
|
|
4980
|
+
* When WIP-limit feedback appears relative to the drop.
|
|
4981
|
+
*
|
|
4982
|
+
* `'live'` (default) highlights the hovered column the moment it would go
|
|
4983
|
+
* over, while the drag is still in progress. `'on-drop'` says nothing until
|
|
4984
|
+
* release, when `wipLimitBehavior` takes over. See the component doc for why
|
|
4985
|
+
* `'live'` is the recommended default.
|
|
4986
|
+
*/
|
|
4987
|
+
type BkKanbanDragPreviewMode = 'live' | 'on-drop';
|
|
4988
|
+
/**
|
|
4989
|
+
* Where *vertical* scrolling lives once content outgrows the board's given
|
|
4990
|
+
* height (see the doc comment on `.bk-kanban` in `kanban.css` for how that
|
|
4991
|
+
* height is resolved from the host in the first place). Horizontal
|
|
4992
|
+
* scrolling — across columns — always lives on the board itself
|
|
4993
|
+
* (`.bk-kanban`'s own `overflow-x: auto`) regardless of this setting; only
|
|
4994
|
+
* the vertical axis moves.
|
|
4995
|
+
*
|
|
4996
|
+
* `'body'` (default): each column is stretched to the board's height and
|
|
4997
|
+
* scrolls *independently* — its own header stays fixed, only
|
|
4998
|
+
* `.bk-kanban-column-body` (the card list beneath it) scrolls, so a long
|
|
4999
|
+
* column never pushes its own header out of view, and every column can be
|
|
5000
|
+
* at a different scroll position at once.
|
|
5001
|
+
*
|
|
5002
|
+
* `'wrapper'`: the board itself — `.bk-kanban`, the element containing every
|
|
5003
|
+
* column — is what scrolls vertically, all columns together as a single
|
|
5004
|
+
* region (headers included). Columns fall back to their own natural height
|
|
5005
|
+
* here rather than being stretched, since nothing needs bounding
|
|
5006
|
+
* individually any more once the board is the one doing the scrolling.
|
|
5007
|
+
*/
|
|
5008
|
+
type BkKanbanColumnScrollMode = 'body' | 'wrapper';
|
|
5009
|
+
/** Emitted once a drag-and-drop completes — a same-column reorder or a
|
|
5010
|
+
* cross-column move. `fromColumnId === toColumnId` for the former. */
|
|
5011
|
+
interface BkKanbanCardMovedEvent<T = any> {
|
|
5012
|
+
card: T;
|
|
5013
|
+
fromColumnId: string;
|
|
5014
|
+
toColumnId: string;
|
|
5015
|
+
newIndex: number;
|
|
5016
|
+
}
|
|
5017
|
+
/** Emitted once a column reorder completes — see `columnDragEnabled`. Unlike
|
|
5018
|
+
* `cardMoved`, there's only one axis to report: columns don't nest inside
|
|
5019
|
+
* one another, so a move is always "this column, from this index, to this
|
|
5020
|
+
* one" rather than needing a from/to pair of containers. */
|
|
5021
|
+
interface BkKanbanColumnMovedEvent {
|
|
5022
|
+
columnId: string;
|
|
5023
|
+
fromIndex: number;
|
|
5024
|
+
toIndex: number;
|
|
5025
|
+
}
|
|
5026
|
+
/**
|
|
5027
|
+
* Emitted when a card (or a region inside it) is clicked.
|
|
5028
|
+
*
|
|
5029
|
+
* `target` is `'card'` for a click anywhere on the card that isn't a more
|
|
5030
|
+
* specific region, or whatever name was given to a
|
|
5031
|
+
* `[bkKanbanClickTarget]="'…'"` element the click landed inside.
|
|
5032
|
+
*/
|
|
5033
|
+
interface BkKanbanCardClickedEvent<T = any> {
|
|
5034
|
+
card: T;
|
|
5035
|
+
target: string;
|
|
5036
|
+
}
|
|
5037
|
+
/** Emitted when a drop would put a column over its `wipLimit` — see
|
|
5038
|
+
* `BkKanbanWipLimitBehavior` for when the drop itself still succeeds. */
|
|
5039
|
+
interface BkKanbanColumnLimitExceededEvent {
|
|
5040
|
+
columnId: string;
|
|
5041
|
+
wipLimit: number;
|
|
5042
|
+
attemptedCount: number;
|
|
5043
|
+
}
|
|
5044
|
+
/** Reserved: see `columnActionTriggered` on `BkKanban` and
|
|
5045
|
+
* `BkKanbanColumnActionsContext.trigger`. */
|
|
5046
|
+
interface BkKanbanColumnActionTriggeredEvent {
|
|
5047
|
+
columnId: string;
|
|
5048
|
+
}
|
|
5049
|
+
/**
|
|
5050
|
+
* Template context for `columnHeaderActionsTemplate`.
|
|
5051
|
+
*
|
|
5052
|
+
* `$implicit` and `column` are the same value — both are provided so the
|
|
5053
|
+
* template can use either `let-column` or the more explicit
|
|
5054
|
+
* `let-column="column"`. `trigger()` is there purely for
|
|
5055
|
+
* `columnActionTriggered`; most consumers bind their own click handler on
|
|
5056
|
+
* their own template instead and never call it.
|
|
5057
|
+
*/
|
|
5058
|
+
interface BkKanbanColumnActionsContext {
|
|
5059
|
+
$implicit: BkKanbanColumn;
|
|
5060
|
+
column: BkKanbanColumn;
|
|
5061
|
+
trigger: () => void;
|
|
5062
|
+
}
|
|
5063
|
+
/** Template context for `emptyStateTemplate`. */
|
|
5064
|
+
interface BkKanbanEmptyStateContext {
|
|
5065
|
+
$implicit: BkKanbanColumn;
|
|
5066
|
+
column: BkKanbanColumn;
|
|
5067
|
+
}
|
|
5068
|
+
/** Template context for `cardTemplate`. */
|
|
5069
|
+
interface BkKanbanCardContext<T = any> {
|
|
5070
|
+
$implicit: T;
|
|
5071
|
+
card: T;
|
|
5072
|
+
column: BkKanbanColumn;
|
|
5073
|
+
index: number;
|
|
5074
|
+
}
|
|
5075
|
+
|
|
5076
|
+
/**
|
|
5077
|
+
* Content-agnostic kanban board: column layout, card positioning and
|
|
5078
|
+
* drag-and-drop, and nothing about what a card contains or what a click on
|
|
5079
|
+
* one should do.
|
|
5080
|
+
*
|
|
5081
|
+
* The board never renders a card's insides itself — `cardTemplate` does that,
|
|
5082
|
+
* receiving the card and its column as context:
|
|
5083
|
+
*
|
|
5084
|
+
* <bk-kanban
|
|
5085
|
+
* [columns]="columns"
|
|
5086
|
+
* [cards]="cards()"
|
|
5087
|
+
* [cardTemplate]="card"
|
|
5088
|
+
* (cardMoved)="onCardMoved($event)"
|
|
5089
|
+
* (cardClicked)="onCardClicked($event)"
|
|
5090
|
+
* ></bk-kanban>
|
|
5091
|
+
*
|
|
5092
|
+
* <ng-template #card let-card let-column="column">
|
|
5093
|
+
* <div [bkKanbanClickTarget]="'hours'">{{ card.hours }}h</div>
|
|
5094
|
+
* {{ card.title }}
|
|
5095
|
+
* </ng-template>
|
|
5096
|
+
*
|
|
5097
|
+
* That is deliberate, not an oversight — see the package spec's Design
|
|
5098
|
+
* Principles. Three consequences fall out of it directly:
|
|
5099
|
+
*
|
|
5100
|
+
* - **Data ownership stays with the caller.** A move is reported through
|
|
5101
|
+
* `cardMoved`, not applied to some copy of `cards` this component keeps to
|
|
5102
|
+
* itself. Internally it *does* mutate the card objects it was handed
|
|
5103
|
+
* (`columnIdField`'s field, and an `order` field used to remember position
|
|
5104
|
+
* within a column) so the board redraws in the right place immediately,
|
|
5105
|
+
* exactly the way `bk-grid`'s own row-drag mutates `result` in place and
|
|
5106
|
+
* renumbers `sortOrder` — but persistence, and reverting the view if a
|
|
5107
|
+
* save fails, are the host's job. Reverting is just handing back a
|
|
5108
|
+
* `cards` array (or updated objects) that reflect the pre-move state; nothing
|
|
5109
|
+
* further to undo on this end.
|
|
5110
|
+
* - **Clicks are reported, never acted on.** `cardClicked` says which card and
|
|
5111
|
+
* which named region (see `[bkKanbanClickTarget]`); opening a popup or
|
|
5112
|
+
* doing nothing at all is entirely up to whoever is listening.
|
|
5113
|
+
* - **A card's own shape is never inspected**, beyond the two fields above.
|
|
5114
|
+
* Tags, hours, avatars, due dates — the board doesn't know they exist.
|
|
5115
|
+
*/
|
|
5116
|
+
declare class BkKanban<T = any> {
|
|
5117
|
+
/** Column/status definitions. Unlimited — the board renders whatever it's given. */
|
|
5118
|
+
columns: _angular_core.InputSignal<BkKanbanColumn[]>;
|
|
5119
|
+
/** Flat card list. Grouped into columns via `columnIdField`, ordered within
|
|
5120
|
+
* a column by an `order` field when the cards carry one, otherwise left in
|
|
5121
|
+
* the sequence they appear here. */
|
|
5122
|
+
cards: _angular_core.InputSignal<readonly T[]>;
|
|
5123
|
+
/** Renders a card's body. Receives `{ $implicit: card, card, column, index }`. */
|
|
5124
|
+
cardTemplate: _angular_core.InputSignal<TemplateRef<BkKanbanCardContext<T>>>;
|
|
5125
|
+
/** Field name, or a resolver function, that gives a card's column id.
|
|
5126
|
+
*
|
|
5127
|
+
* A field name can be both read and written, so a cross-column drop
|
|
5128
|
+
* updates it directly. A resolver function is read-only — the board still
|
|
5129
|
+
* reports the move via `cardMoved`, but leaves updating the source data to
|
|
5130
|
+
* the host, since there's nowhere on a function to write the new value. */
|
|
5131
|
+
columnIdField: _angular_core.InputSignal<string | ((card: T) => string)>;
|
|
5132
|
+
dragEnabled: _angular_core.InputSignal<boolean>;
|
|
5133
|
+
dragScope: _angular_core.InputSignal<BkKanbanDragScope>;
|
|
5134
|
+
wipLimitBehavior: _angular_core.InputSignal<BkKanbanWipLimitBehavior>;
|
|
5135
|
+
/** Lets columns themselves be dragged into a new order, via their header
|
|
5136
|
+
* (`.bk-kanban-column-header` is the drag handle — a card's own drag
|
|
5137
|
+
* keeps working independently, since it's a separate, unconnected drop
|
|
5138
|
+
* list one level down). Off by default: reordering the board's own
|
|
5139
|
+
* columns is a bigger commitment than reordering cards within it, and not
|
|
5140
|
+
* every consumer wants a "To do / In progress / Done" pipeline to be
|
|
5141
|
+
* rearrangeable. `columns` is mutated in place the same way `cards` is
|
|
5142
|
+
* (see the component doc) — persisting the new order, if it needs to be,
|
|
5143
|
+
* is the host's job, done from `columnMoved`. */
|
|
5144
|
+
columnDragEnabled: _angular_core.InputSignal<boolean>;
|
|
5145
|
+
/** See `BkKanbanColumnScrollMode`. */
|
|
5146
|
+
columnScrollMode: _angular_core.InputSignal<BkKanbanColumnScrollMode>;
|
|
5147
|
+
/** Extra class(es) appended to the board's own wrapper — `.bk-kanban-board`
|
|
5148
|
+
* in `kanban.html`, the element that directly contains the scrollable
|
|
5149
|
+
* region holding every column. Same idea as `columnClass`/`colHeaderClass`
|
|
5150
|
+
* one level down: it only adds classes, nothing here replaces bk-kanban's
|
|
5151
|
+
* own layout.
|
|
5152
|
+
*
|
|
5153
|
+
* Deliberately kept off the *scrolling* element itself
|
|
5154
|
+
* (`.bk-kanban`, one level further in): a `padding` or `border` in here
|
|
5155
|
+
* would otherwise become part of what has to be scrolled past, and change
|
|
5156
|
+
* where the scrollbar itself ends up sitting relative to the columns —
|
|
5157
|
+
* this wrapper exists specifically so `boardClass` can decorate (a
|
|
5158
|
+
* background, a border, padding around the whole board) without ever
|
|
5159
|
+
* touching the box CDK and `columnScrollMode` are actually scrolling. */
|
|
5160
|
+
boardClass: _angular_core.InputSignal<string>;
|
|
5161
|
+
/** Identity for `@for`'s `track`. Defaults to position in the rendered column. */
|
|
5162
|
+
trackBy: _angular_core.InputSignal<((card: T) => string | number) | null>;
|
|
5163
|
+
/** Rendered in a fixed slot in every column's header — e.g. an "add card"
|
|
5164
|
+
* button. Receives `BkKanbanColumnActionsContext`. The board owns where it
|
|
5165
|
+
* sits; the consumer owns what it does. */
|
|
5166
|
+
columnHeaderActionsTemplate: _angular_core.InputSignal<TemplateRef<BkKanbanColumnActionsContext> | null>;
|
|
5167
|
+
/** Overrides the built-in "No cards" placeholder for an empty column.
|
|
5168
|
+
* Receives `BkKanbanEmptyStateContext`. Takes priority over both
|
|
5169
|
+
* `noDataText` and a column's own `noDataText` — see `emptyStateText`. */
|
|
5170
|
+
emptyStateTemplate: _angular_core.InputSignal<TemplateRef<BkKanbanEmptyStateContext> | null>;
|
|
5171
|
+
/** Board-wide placeholder text for an empty column, used whenever a column
|
|
5172
|
+
* doesn't set its own `noDataText`. Only read when `emptyStateTemplate`
|
|
5173
|
+
* isn't supplied — see `emptyStateText`. */
|
|
5174
|
+
noDataText: _angular_core.InputSignal<string>;
|
|
5175
|
+
/** Whether a column flags an over-limit drop while still dragging (`'live'`)
|
|
5176
|
+
* or only once the drop is attempted (`'on-drop'`). See the doc block on
|
|
5177
|
+
* `isLiveOverLimit` for how the two relate to `wipLimitBehavior`. */
|
|
5178
|
+
dragPreviewMode: _angular_core.InputSignal<BkKanbanDragPreviewMode>;
|
|
5179
|
+
cardMoved: _angular_core.OutputEmitterRef<BkKanbanCardMovedEvent<T>>;
|
|
5180
|
+
cardClicked: _angular_core.OutputEmitterRef<BkKanbanCardClickedEvent<T>>;
|
|
5181
|
+
columnLimitExceeded: _angular_core.OutputEmitterRef<BkKanbanColumnLimitExceededEvent>;
|
|
5182
|
+
/** A column reorder completed — see `columnDragEnabled`. */
|
|
5183
|
+
columnMoved: _angular_core.OutputEmitterRef<BkKanbanColumnMovedEvent>;
|
|
5184
|
+
/** Reserved — see `BkKanbanColumnActionsContext.trigger`. Most consumers
|
|
5185
|
+
* bind a click handler directly on their own header-actions template and
|
|
5186
|
+
* never reach for this. */
|
|
5187
|
+
columnActionTriggered: _angular_core.OutputEmitterRef<BkKanbanColumnActionTriggeredEvent>;
|
|
5188
|
+
/**
|
|
5189
|
+
* Bumped after every in-place mutation (`setColumnId`, `renumber`) so
|
|
5190
|
+
* `grouped` re-runs even though neither `cards()`'s array identity nor any
|
|
5191
|
+
* card's object identity changed — the same trick as the table demo's
|
|
5192
|
+
* `pgSelectionTick`, needed for exactly the same reason: signals only
|
|
5193
|
+
* notice a new reference, and mutating fields in place is what lets a drop
|
|
5194
|
+
* redraw in the right place without waiting on the host to hand back a
|
|
5195
|
+
* whole new array.
|
|
5196
|
+
*/
|
|
5197
|
+
private readonly structureTick;
|
|
5198
|
+
/** Cards grouped by column id, each group in `order` order when present
|
|
5199
|
+
* (falling back to their sequence in `cards()` otherwise). Cards whose
|
|
5200
|
+
* resolved column id matches no known column are dropped silently rather
|
|
5201
|
+
* than rendered nowhere. */
|
|
5202
|
+
private readonly grouped;
|
|
5203
|
+
/** The cards to render for one column, in display order. */
|
|
5204
|
+
cardsFor(columnId: string): T[];
|
|
5205
|
+
private resolveColumnId;
|
|
5206
|
+
private cardOrder;
|
|
5207
|
+
resolveTrackBy(card: T, index: number): string | number;
|
|
5208
|
+
/** Column-header count badge, flagged once the column is over its limit —
|
|
5209
|
+
* only while `wipLimitBehavior` is `'warn'`; `'block'` should never let a
|
|
5210
|
+
* column get there and `'none'` treats the number as pure information. */
|
|
5211
|
+
isColumnOverLimit(column: BkKanbanColumn): boolean;
|
|
5212
|
+
/** "3" with no limit, "3 / 5" with one — the header count badge's label. */
|
|
5213
|
+
columnCountLabel(column: BkKanbanColumn): string;
|
|
5214
|
+
columnActionsContext(column: BkKanbanColumn): BkKanbanColumnActionsContext;
|
|
5215
|
+
emptyStateContext(column: BkKanbanColumn): BkKanbanEmptyStateContext;
|
|
5216
|
+
/** Text for the built-in empty-column placeholder: a column's own
|
|
5217
|
+
* `noDataText` when it sets one, else the board-wide `noDataText` input.
|
|
5218
|
+
* Only consulted when `emptyStateTemplate` isn't supplied — the template
|
|
5219
|
+
* wins outright once given, exactly like `emptyStateContext` itself. */
|
|
5220
|
+
emptyStateText(column: BkKanbanColumn): string;
|
|
5221
|
+
cardContext(card: T, column: BkKanbanColumn, index: number): BkKanbanCardContext<T>;
|
|
5222
|
+
/** Which columns a column's drop list connects to, per `dragScope`. */
|
|
5223
|
+
connectedListIds(columnId: string): string[];
|
|
5224
|
+
/** `'cross'` means *only* moves between columns — reordering within one has
|
|
5225
|
+
* to be switched off at the list level, since a scoped-out `connectedTo`
|
|
5226
|
+
* alone still leaves the list free to sort itself. */
|
|
5227
|
+
readonly sortingDisabled: _angular_core.Signal<boolean>;
|
|
5228
|
+
/**
|
|
5229
|
+
* `columns` is reordered in place — same trick as `cards` (see the
|
|
5230
|
+
* component doc): the array reference the host handed in is mutated
|
|
5231
|
+
* directly (`moveItemInArray`) rather than swapped for a new one, so the
|
|
5232
|
+
* next render just reflects the new order. There's no `structureTick`-style
|
|
5233
|
+
* signal to bump here the way card moves need one — nothing derives
|
|
5234
|
+
* columns through a `computed()` the way `cardsFor` derives through
|
|
5235
|
+
* `grouped`; the template reads `columns()` directly in its `@for`, so the
|
|
5236
|
+
* drop event's own change detection pass is enough.
|
|
5237
|
+
*/
|
|
5238
|
+
onColumnDrop(event: CdkDragDrop<BkKanbanColumn[]>): void;
|
|
5239
|
+
private readonly dragSourceColumnId;
|
|
5240
|
+
private readonly hoveredOverLimitColumnId;
|
|
5241
|
+
onDragStarted(column: BkKanbanColumn): void;
|
|
5242
|
+
onDragEnded(): void;
|
|
5243
|
+
/**
|
|
5244
|
+
* Live WIP-limit preview (§12 of the spec): as the dragged card enters a
|
|
5245
|
+
* column, work out whether *landing* here would exceed its `wipLimit` and
|
|
5246
|
+
* flag it immediately — before release, and independent of
|
|
5247
|
+
* `wipLimitBehavior`, which only governs what happens once the card is
|
|
5248
|
+
* actually dropped. A card re-entering its own source column doesn't grow
|
|
5249
|
+
* that column's count, so only a genuine cross-column entry counts as +1.
|
|
5250
|
+
*/
|
|
5251
|
+
onListEntered(event: CdkDragEnter<T[]>, column: BkKanbanColumn): void;
|
|
5252
|
+
onListExited(column: BkKanbanColumn): void;
|
|
5253
|
+
isLiveOverLimit(column: BkKanbanColumn): boolean;
|
|
5254
|
+
onDrop(event: CdkDragDrop<T[]>, column: BkKanbanColumn): void;
|
|
5255
|
+
private setColumnId;
|
|
5256
|
+
private renumber;
|
|
5257
|
+
/**
|
|
5258
|
+
* One listener per card resolves both the whole-card click and every
|
|
5259
|
+
* `[bkKanbanClickTarget]` region: `closest()` from the actual event target
|
|
5260
|
+
* finds the nearest marked ancestor within this card, or there isn't one
|
|
5261
|
+
* and it's a plain card click. Either way this fires exactly once — never
|
|
5262
|
+
* once for the region and again for the card underneath it.
|
|
5263
|
+
*/
|
|
5264
|
+
onCardClick(event: MouseEvent, card: T): void;
|
|
5265
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkKanban<any>, never>;
|
|
5266
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<BkKanban<any>, "bk-kanban", ["bkKanban"], { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "cards": { "alias": "cards"; "required": true; "isSignal": true; }; "cardTemplate": { "alias": "cardTemplate"; "required": true; "isSignal": true; }; "columnIdField": { "alias": "columnIdField"; "required": false; "isSignal": true; }; "dragEnabled": { "alias": "dragEnabled"; "required": false; "isSignal": true; }; "dragScope": { "alias": "dragScope"; "required": false; "isSignal": true; }; "wipLimitBehavior": { "alias": "wipLimitBehavior"; "required": false; "isSignal": true; }; "columnDragEnabled": { "alias": "columnDragEnabled"; "required": false; "isSignal": true; }; "columnScrollMode": { "alias": "columnScrollMode"; "required": false; "isSignal": true; }; "boardClass": { "alias": "boardClass"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; "columnHeaderActionsTemplate": { "alias": "columnHeaderActionsTemplate"; "required": false; "isSignal": true; }; "emptyStateTemplate": { "alias": "emptyStateTemplate"; "required": false; "isSignal": true; }; "noDataText": { "alias": "noDataText"; "required": false; "isSignal": true; }; "dragPreviewMode": { "alias": "dragPreviewMode"; "required": false; "isSignal": true; }; }, { "cardMoved": "cardMoved"; "cardClicked": "cardClicked"; "columnLimitExceeded": "columnLimitExceeded"; "columnMoved": "columnMoved"; "columnActionTriggered": "columnActionTriggered"; }, never, never, true, never>;
|
|
5267
|
+
}
|
|
5268
|
+
|
|
5269
|
+
/**
|
|
5270
|
+
* Marks an element inside a `cardTemplate` as its own click region.
|
|
5271
|
+
*
|
|
5272
|
+
* `bk-kanban` never attaches a listener to this element directly — it puts
|
|
5273
|
+
* one listener on the whole card and, on click, walks up from
|
|
5274
|
+
* `event.target` (`Element.closest`) looking for the nearest marked
|
|
5275
|
+
* ancestor. That single-listener design is what makes a click on a marked
|
|
5276
|
+
* region resolve to *just* that region's name, instead of firing once for
|
|
5277
|
+
* the region and once more, as a duplicate, for the card underneath it.
|
|
5278
|
+
* This directive's only job is to leave something that walk can find: a
|
|
5279
|
+
* `data-bk-kanban-click-target` attribute carrying the name you gave it.
|
|
5280
|
+
*
|
|
5281
|
+
* <div [bkKanbanClickTarget]="'hours'">{{ card.hours }}h</div>
|
|
5282
|
+
* <div [bkKanbanClickTarget]="'assignee'">
|
|
5283
|
+
* <bk-ui-avatar [name]="card.assignee"></bk-ui-avatar>
|
|
5284
|
+
* </div>
|
|
5285
|
+
*
|
|
5286
|
+
* A click on either fires `cardClicked` with `target: 'hours'` /
|
|
5287
|
+
* `'assignee'`; a click anywhere else on the card falls back to the default
|
|
5288
|
+
* `target: 'card'`. See `BkKanbanCardClickedEvent`.
|
|
5289
|
+
*/
|
|
5290
|
+
declare class BkKanbanClickTarget {
|
|
5291
|
+
target: _angular_core.InputSignal<string>;
|
|
5292
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BkKanbanClickTarget, never>;
|
|
5293
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BkKanbanClickTarget, "[bkKanbanClickTarget]", never, { "target": { "alias": "bkKanbanClickTarget"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
5294
|
+
}
|
|
5295
|
+
|
|
5296
|
+
export { ARROW_CORNER_GAP, BKTooltipDirective, BK_DEFAULT_DIALOG_CONFIG, BK_DIALOG_DATA, BK_DIALOG_GLOBAL_CONFIG, BK_TABLE, BkAvatar, BkAvatarGroup, BkAvatarUploader, BkBadge, BkBreadcrumb, BkButton, BkButtonGroup, BkCalendarManagerService, BkCheckbox, BkColumnFilterService, BkColumnSelect, BkCustomCalendar, BkDialogActions, BkDialogClose, BkDialogContent, BkDialogModule, BkDialogRef, BkDialogService, BkDialogTitle, BkDragHandle, BkDropdown, BkFileCard, BkFilePicker, BkGrid, BkHierarchicalSelect, BkIconButton, BkInput, BkInputChips, BkKanban, BkKanbanClickTarget, BkLoader, BkMenu, BkPagination, BkPill, BkPopover, BkRadioButton, BkScheduledDatePicker, BkSelect, BkSpinner, BkTable, BkTableDrag, BkTableFooter, BkTableSummary, BkTableTitle, BkTabs, BkTd, BkTextarea, BkTh, BkTimePicker, BkToastr, BkToastrService, BkToggle, BkTooltipInteractionService, BkTrExpand, BkTreeDrag, BkValidator, BkVirtualScroll, BrickclayIcons, BrickclayLib, CalendarModule, CalendarMonth, CalendarSelection, CalendarWeekday, ColumnFilterOption, DEFAULT_COUNTRY_OPTIONS, NEUTRAL_APPEARANCE, OPPOSITE_SIDE, POPOVER_PLACEMENTS, clamp, containsBkTreeNode, deriveAppearance, flattenBkTreeData, getDialogBackdropAnimation, getDialogPanelAnimation, joinPlacement, moveBkTreeNode, normalizeBkTableSize, parseColor, splitPlacement };
|
|
5297
|
+
export type { AvatarFallback, AvatarGroupItem, AvatarSize, AvatarVariant, BadgeColor, BadgeSize, BadgeVariant, BkAnimationKeyframes, BkAvatarFallback, BkAvatarSize, BkCellAlign, BkColumnRef, BkColumnSelectPosition, BkDialogAnimation, BkDialogConfig, BkDialogPosition, BkFilterFn, BkFilterOption, BkInputAutoCapitalize, BkInputAutoComplete, BkInputMode, BkInputSize, BkInputType, BkKanbanCardClickedEvent, BkKanbanCardContext, BkKanbanCardMovedEvent, BkKanbanColumn, BkKanbanColumnActionTriggeredEvent, BkKanbanColumnActionsContext, BkKanbanColumnLimitExceededEvent, BkKanbanColumnMovedEvent, BkKanbanColumnScrollMode, BkKanbanDragPreviewMode, BkKanbanDragScope, BkKanbanEmptyStateContext, BkKanbanWipLimitBehavior, BkLoaderVariant, BkPageSize, BkPageSizeVisibility, BkSelectGridColumn, BkSortDirection, BkSortFn, BkSortOrder, BkTableNoResult, BkTableQueryParams, BkTableScroll, BkTableSelection, BkTableSize, BkTableSizeToken, BkTextAreaAutoCapitalize, BkTextAreaAutoComplete, BkTextAreaInputMode, BkTooltipDismissible, BkTreeDragScope, BkTreeDropEvent, BkTreeDropPosition, BkTreeRow, BreadcrumbItem, ButtonSize, ButtonVariant, CalendarRange, ColorAppearance, ColorFill, CountryOption, CustomRangesConfig, DotPosition, DotStatus, DropdownItem, DropdownPlacement, DropdownSize, DropdownTrigger, DropdownVariant, FileState, GroupItem, GroupMode, HierarchicalNode, IconButtonSize, IconButtonVariant, IconOrientation, MenuItem, MenuOrientation, MenuPopupSide, MenuSize, MenuSubmenuMode, MenuTrigger, PillColor, PillSize, PillVariant, PopoverAlign, PopoverPlacement, PopoverSide, ScheduledDateSelection, SortDirection, SpinnerSize, TabIconDirection, TabItem, TableAction, TableBadge, TableColumn, TableIcon, TableRows, TabsColors, TabsOrientation, TabsVariant, TimeConfiguration, ToastConfig, ToastMessage, ToastMethodOptions, ToastPosition, ToastSeverity };
|
package/package.json
CHANGED
|
@@ -14,8 +14,10 @@
|
|
|
14
14
|
pointer-events: none;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
/*
|
|
18
|
-
|
|
17
|
+
/* Belt-and-braces: pins the pane itself in case some future overlay ever nests a pane inside
|
|
18
|
+
this one's wrapper. The stacking fight against *other* overlays (dialogs, selects, popovers)
|
|
19
|
+
actually happens one level up, at the wrapper CDK puts around the pane — see the
|
|
20
|
+
`hostElement.style.zIndex` line in toastr.service.ts, which is the real fix for that. */
|
|
19
21
|
.cdk-overlay-pane.bk-toastr-panel {
|
|
20
22
|
z-index: 2147483647 !important;
|
|
21
23
|
}
|
package/src/styles.css
CHANGED
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
@import './lib/menu/menu.css';
|
|
45
45
|
@import './lib/ui-avatar-group/ui-avatar-group.css';
|
|
46
46
|
@import './lib/table/table.css';
|
|
47
|
+
@import './lib/kanban/kanban.css';
|
|
47
48
|
@import './lib/calender/components/custom-calendar/custom-calendar.component.css';
|
|
48
49
|
@import './lib/calender/components/scheduled-date-picker/scheduled-date-picker.component.css';
|
|
49
50
|
@import './lib/calender/components/time-picker/time-picker.component.css';
|