@tolle_/tolle-ui 18.2.28 → 18.2.30
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/esm2022/lib/accordion-item.component.mjs +5 -11
- package/esm2022/lib/accordion.component.mjs +4 -9
- package/esm2022/lib/alert-dialog-dynamic.component.mjs +5 -10
- package/esm2022/lib/alert-dialog.component.mjs +44 -59
- package/esm2022/lib/alert.component.mjs +5 -11
- package/esm2022/lib/aspect-ratio.component.mjs +119 -0
- package/esm2022/lib/attachment.component.mjs +334 -0
- package/esm2022/lib/avatar-fallback.component.mjs +3 -3
- package/esm2022/lib/avatar.component.mjs +4 -9
- package/esm2022/lib/badge.component.mjs +4 -9
- package/esm2022/lib/breadcrumb-item.component.mjs +3 -3
- package/esm2022/lib/breadcrumb-link.component.mjs +3 -3
- package/esm2022/lib/breadcrumb-separator.component.mjs +3 -3
- package/esm2022/lib/breadcrumb.component.mjs +3 -3
- package/esm2022/lib/bubble.component.mjs +301 -0
- package/esm2022/lib/button.component.mjs +5 -11
- package/esm2022/lib/calendar.component.mjs +5 -11
- package/esm2022/lib/card.component.mjs +14 -43
- package/esm2022/lib/carousel/carousel.component.mjs +5 -12
- package/esm2022/lib/chain-of-thought.component.mjs +380 -0
- package/esm2022/lib/chart-pie.component.mjs +386 -0
- package/esm2022/lib/chart.component.mjs +1146 -0
- package/esm2022/lib/chart.service.mjs +555 -0
- package/esm2022/lib/checkbox.component.mjs +5 -11
- package/esm2022/lib/checkpoint.component.mjs +134 -0
- package/esm2022/lib/collapsible.component.mjs +4 -11
- package/esm2022/lib/combobox.component.mjs +372 -0
- package/esm2022/lib/command-dialog.component.mjs +164 -0
- package/esm2022/lib/command.component.mjs +514 -0
- package/esm2022/lib/command.service.mjs +130 -0
- package/esm2022/lib/confirmation.component.mjs +219 -0
- package/esm2022/lib/context-menu-trigger.directive.mjs +36 -0
- package/esm2022/lib/context-menu.component.mjs +460 -0
- package/esm2022/lib/context-menu.service.mjs +121 -0
- package/esm2022/lib/context.component.mjs +377 -0
- package/esm2022/lib/conversation.component.mjs +442 -0
- package/esm2022/lib/country-selector.component.mjs +5 -11
- package/esm2022/lib/data-table.component.mjs +63 -12
- package/esm2022/lib/date-picker.component.mjs +251 -198
- package/esm2022/lib/date-range-picker.component.mjs +224 -116
- package/esm2022/lib/date-time-picker.component.mjs +506 -0
- package/esm2022/lib/direction.component.mjs +79 -0
- package/esm2022/lib/dropdown-item.component.mjs +3 -3
- package/esm2022/lib/dropdown-label.component.mjs +3 -3
- package/esm2022/lib/dropdown-menu.component.mjs +3 -3
- package/esm2022/lib/dropdown-separator.component.mjs +3 -3
- package/esm2022/lib/dropdown-trigger.directive.mjs +6 -4
- package/esm2022/lib/empty-state.component.mjs +4 -9
- package/esm2022/lib/field.component.mjs +394 -0
- package/esm2022/lib/hover-card.component.mjs +6 -16
- package/esm2022/lib/inline-citation.component.mjs +263 -0
- package/esm2022/lib/input-group.component.mjs +418 -0
- package/esm2022/lib/input.component.mjs +5 -11
- package/esm2022/lib/item.component.mjs +243 -0
- package/esm2022/lib/kbd.component.mjs +82 -0
- package/esm2022/lib/label.component.mjs +4 -9
- package/esm2022/lib/marker.component.mjs +135 -0
- package/esm2022/lib/masked-input.component.mjs +5 -11
- package/esm2022/lib/menubar.component.mjs +683 -0
- package/esm2022/lib/message-scroller.component.mjs +353 -0
- package/esm2022/lib/message-scroller.service.mjs +157 -0
- package/esm2022/lib/message.component.mjs +228 -0
- package/esm2022/lib/model-selector.component.mjs +310 -0
- package/esm2022/lib/multi-select.component.mjs +155 -72
- package/esm2022/lib/native-select.component.mjs +201 -0
- package/esm2022/lib/navigation-menu.component.mjs +642 -0
- package/esm2022/lib/otp-group.component.mjs +3 -3
- package/esm2022/lib/otp-slot.component.mjs +4 -9
- package/esm2022/lib/otp.component.mjs +5 -11
- package/esm2022/lib/pagination.component.mjs +7 -10
- package/esm2022/lib/plan.component.mjs +335 -0
- package/esm2022/lib/popover-content.component.mjs +4 -9
- package/esm2022/lib/popover.component.mjs +15 -13
- package/esm2022/lib/progress.component.mjs +4 -9
- package/esm2022/lib/prompt-input.component.mjs +526 -0
- package/esm2022/lib/queue.component.mjs +280 -0
- package/esm2022/lib/radio-group.component.mjs +6 -13
- package/esm2022/lib/radio-item.component.mjs +4 -9
- package/esm2022/lib/range-calendar.component.mjs +5 -11
- package/esm2022/lib/reasoning.component.mjs +335 -0
- package/esm2022/lib/resizable.component.mjs +219 -0
- package/esm2022/lib/segment.component.mjs +17 -7
- package/esm2022/lib/select-group.component.mjs +4 -8
- package/esm2022/lib/select-item.component.mjs +4 -9
- package/esm2022/lib/select-separator.component.mjs +4 -8
- package/esm2022/lib/select.component.mjs +133 -49
- package/esm2022/lib/separator.component.mjs +4 -9
- package/esm2022/lib/sheet.component.mjs +38 -56
- package/esm2022/lib/shimmer.component.mjs +84 -0
- package/esm2022/lib/sidebar.component.mjs +11 -1
- package/esm2022/lib/skeleton.component.mjs +4 -9
- package/esm2022/lib/sources.component.mjs +452 -0
- package/esm2022/lib/spinner.component.mjs +68 -0
- package/esm2022/lib/suggestion.component.mjs +207 -0
- package/esm2022/lib/switch.component.mjs +5 -11
- package/esm2022/lib/table.component.mjs +213 -0
- package/esm2022/lib/tabs.component.mjs +4 -11
- package/esm2022/lib/tag-input.component.mjs +5 -11
- package/esm2022/lib/task.component.mjs +359 -0
- package/esm2022/lib/textarea.component.mjs +5 -11
- package/esm2022/lib/theme.service.mjs +17 -6
- package/esm2022/lib/time-picker.component.mjs +923 -0
- package/esm2022/lib/toast.service.mjs +3 -2
- package/esm2022/lib/toaster.component.mjs +76 -39
- package/esm2022/lib/toggle-group.component.mjs +4 -9
- package/esm2022/lib/toggle.component.mjs +5 -11
- package/esm2022/lib/tool.component.mjs +462 -0
- package/esm2022/lib/typography.component.mjs +83 -0
- package/esm2022/lib/utils/color.mjs +140 -19
- package/esm2022/public-api.mjs +61 -1
- package/fesm2022/tolle-ui.mjs +16457 -1024
- package/fesm2022/tolle-ui.mjs.map +1 -1
- package/lib/alert-dialog.component.d.ts +10 -2
- package/lib/aspect-ratio.component.d.ts +20 -0
- package/lib/attachment.component.d.ts +101 -0
- package/lib/bubble.component.d.ts +112 -0
- package/lib/chain-of-thought.component.d.ts +166 -0
- package/lib/chart-pie.component.d.ts +108 -0
- package/lib/chart.component.d.ts +369 -0
- package/lib/chart.service.d.ts +222 -0
- package/lib/checkpoint.component.d.ts +51 -0
- package/lib/combobox.component.d.ts +90 -0
- package/lib/command-dialog.component.d.ts +53 -0
- package/lib/command.component.d.ts +189 -0
- package/lib/command.service.d.ts +67 -0
- package/lib/confirmation.component.d.ts +70 -0
- package/lib/context-menu-trigger.directive.d.ts +12 -0
- package/lib/context-menu.component.d.ts +41 -0
- package/lib/context-menu.service.d.ts +38 -0
- package/lib/context.component.d.ts +134 -0
- package/lib/conversation.component.d.ts +165 -0
- package/lib/data-table.component.d.ts +27 -1
- package/lib/date-picker.component.d.ts +72 -11
- package/lib/date-range-picker.component.d.ts +63 -6
- package/lib/date-time-picker.component.d.ts +119 -0
- package/lib/direction.component.d.ts +45 -0
- package/lib/field.component.d.ts +201 -0
- package/lib/inline-citation.component.d.ts +103 -0
- package/lib/input-group.component.d.ts +150 -0
- package/lib/item.component.d.ts +154 -0
- package/lib/kbd.component.d.ts +50 -0
- package/lib/marker.component.d.ts +58 -0
- package/lib/menubar.component.d.ts +247 -0
- package/lib/message-scroller.component.d.ts +159 -0
- package/lib/message-scroller.service.d.ts +73 -0
- package/lib/message.component.d.ts +128 -0
- package/lib/model-selector.component.d.ts +103 -0
- package/lib/multi-select.component.d.ts +66 -14
- package/lib/native-select.component.d.ts +57 -0
- package/lib/navigation-menu.component.d.ts +230 -0
- package/lib/plan.component.d.ts +120 -0
- package/lib/popover.component.d.ts +1 -0
- package/lib/prompt-input.component.d.ts +194 -0
- package/lib/queue.component.d.ts +106 -0
- package/lib/reasoning.component.d.ts +127 -0
- package/lib/resizable.component.d.ts +43 -0
- package/lib/segment.component.d.ts +13 -3
- package/lib/select.component.d.ts +37 -5
- package/lib/sheet.component.d.ts +3 -0
- package/lib/shimmer.component.d.ts +38 -0
- package/lib/sidebar.component.d.ts +2 -0
- package/lib/sources.component.d.ts +156 -0
- package/lib/spinner.component.d.ts +29 -0
- package/lib/suggestion.component.d.ts +96 -0
- package/lib/table.component.d.ts +106 -0
- package/lib/task.component.d.ts +151 -0
- package/lib/theme.service.d.ts +9 -0
- package/lib/time-picker.component.d.ts +243 -0
- package/lib/toast.service.d.ts +3 -1
- package/lib/toaster.component.d.ts +26 -9
- package/lib/tool.component.d.ts +158 -0
- package/lib/typography.component.d.ts +32 -0
- package/lib/utils/color.d.ts +19 -5
- package/package.json +1 -1
- package/public-api.d.ts +50 -0
- package/registry/docs-content.json +8497 -1553
- package/registry/llms-full.txt +2679 -318
- package/registry/llms.txt +43 -4
- package/registry/manifest.json +9093 -1739
- package/registry/r/accordion-item.json +1 -1
- package/registry/r/accordion.json +1 -1
- package/registry/r/alert-dialog-dynamic.json +1 -1
- package/registry/r/alert-dialog.json +1 -1
- package/registry/r/alert.json +1 -1
- package/registry/r/attachment.json +23 -0
- package/registry/r/avatar-fallback.json +1 -1
- package/registry/r/avatar.json +1 -1
- package/registry/r/badge.json +1 -1
- package/registry/r/breadcrumb-item.json +1 -1
- package/registry/r/breadcrumb-link.json +1 -1
- package/registry/r/breadcrumb-separator.json +1 -1
- package/registry/r/breadcrumb.json +1 -1
- package/registry/r/bubble.json +23 -0
- package/registry/r/button.json +1 -1
- package/registry/r/calendar.json +1 -1
- package/registry/r/card.json +1 -1
- package/registry/r/carousel.json +1 -1
- package/registry/r/chain-of-thought.json +23 -0
- package/registry/r/chart-pie.json +30 -0
- package/registry/r/chart.json +28 -0
- package/registry/r/checkbox.json +1 -1
- package/registry/r/checkpoint.json +23 -0
- package/registry/r/collapsible.json +1 -1
- package/registry/r/combobox.json +31 -0
- package/registry/r/command-dialog.json +21 -0
- package/registry/r/command.json +26 -0
- package/registry/r/confirmation.json +23 -0
- package/registry/r/context.json +26 -0
- package/registry/r/conversation.json +23 -0
- package/registry/r/country-selector.json +1 -1
- package/registry/r/data-table.json +1 -1
- package/registry/r/date-picker.json +4 -4
- package/registry/r/date-range-picker.json +3 -3
- package/registry/r/date-time-picker.json +28 -0
- package/registry/r/direction.json +16 -0
- package/registry/r/dropdown-item.json +1 -1
- package/registry/r/dropdown-label.json +1 -1
- package/registry/r/dropdown-menu.json +1 -1
- package/registry/r/dropdown-separator.json +1 -1
- package/registry/r/dropdown-trigger.json +1 -1
- package/registry/r/empty-state.json +1 -1
- package/registry/r/field.json +23 -0
- package/registry/r/hover-card.json +1 -1
- package/registry/r/inline-citation.json +26 -0
- package/registry/r/input-group.json +23 -0
- package/registry/r/input.json +1 -1
- package/registry/r/item.json +23 -0
- package/registry/r/kbd.json +23 -0
- package/registry/r/label.json +1 -1
- package/registry/r/marker.json +23 -0
- package/registry/r/masked-input.json +1 -1
- package/registry/r/menubar.json +24 -0
- package/registry/r/message-scroller.json +26 -0
- package/registry/r/message.json +23 -0
- package/registry/r/model-selector.json +32 -0
- package/registry/r/multi-select.json +2 -2
- package/registry/r/native-select.json +23 -0
- package/registry/r/navigation-menu.json +24 -0
- package/registry/r/otp-group.json +1 -1
- package/registry/r/otp-slot.json +1 -1
- package/registry/r/otp.json +1 -1
- package/registry/r/pagination.json +3 -2
- package/registry/r/plan.json +23 -0
- package/registry/r/popover-content.json +1 -1
- package/registry/r/popover.json +1 -1
- package/registry/r/progress.json +1 -1
- package/registry/r/prompt-input.json +23 -0
- package/registry/r/queue.json +23 -0
- package/registry/r/radio-group.json +1 -1
- package/registry/r/radio-item.json +1 -1
- package/registry/r/range-calendar.json +1 -1
- package/registry/r/reasoning.json +23 -0
- package/registry/r/segment.json +1 -1
- package/registry/r/select-group.json +1 -1
- package/registry/r/select-item.json +1 -1
- package/registry/r/select-separator.json +1 -1
- package/registry/r/select.json +4 -3
- package/registry/r/separator.json +1 -1
- package/registry/r/sheet.json +1 -1
- package/registry/r/shimmer.json +23 -0
- package/registry/r/sidebar.json +1 -1
- package/registry/r/skeleton.json +1 -1
- package/registry/r/sources.json +23 -0
- package/registry/r/spinner.json +23 -0
- package/registry/r/suggestion.json +23 -0
- package/registry/r/switch.json +1 -1
- package/registry/r/table.json +21 -0
- package/registry/r/tabs.json +1 -1
- package/registry/r/tag-input.json +1 -1
- package/registry/r/task.json +23 -0
- package/registry/r/textarea.json +1 -1
- package/registry/r/time-picker.json +24 -0
- package/registry/r/toaster.json +2 -2
- package/registry/r/toggle-group.json +1 -1
- package/registry/r/toggle.json +1 -1
- package/registry/r/tool.json +23 -0
- package/registry/r/typography.json +23 -0
- package/registry/registry.json +915 -22
- package/theme.css +109 -8
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject, Subject } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Coordinates a `tolle-command` and its descendants: owns the query, decides
|
|
6
|
+
* which items survive filtering, and tracks the active (highlighted) item for
|
|
7
|
+
* `aria-activedescendant`.
|
|
8
|
+
*
|
|
9
|
+
* Provided on `CommandComponent`, so each command menu gets its own instance.
|
|
10
|
+
*/
|
|
11
|
+
export class CommandService {
|
|
12
|
+
items = new Map();
|
|
13
|
+
nextOrder = 0;
|
|
14
|
+
querySubject = new BehaviorSubject('');
|
|
15
|
+
/** Current search query. */
|
|
16
|
+
query$ = this.querySubject.asObservable();
|
|
17
|
+
visibleSubject = new BehaviorSubject([]);
|
|
18
|
+
/** Ids of the items surviving the current query, in DOM order. */
|
|
19
|
+
visible$ = this.visibleSubject.asObservable();
|
|
20
|
+
activeIdSubject = new BehaviorSubject(null);
|
|
21
|
+
/** Id of the highlighted item, or null when nothing matches. */
|
|
22
|
+
activeId$ = this.activeIdSubject.asObservable();
|
|
23
|
+
selectedSubject = new Subject();
|
|
24
|
+
/** Emits the value of the item the user chose. */
|
|
25
|
+
selected$ = this.selectedSubject.asObservable();
|
|
26
|
+
/**
|
|
27
|
+
* When set, filtering is left entirely to the consumer — every registered
|
|
28
|
+
* item stays visible regardless of the query. Use for server-side search.
|
|
29
|
+
*/
|
|
30
|
+
shouldFilter = true;
|
|
31
|
+
get query() {
|
|
32
|
+
return this.querySubject.value;
|
|
33
|
+
}
|
|
34
|
+
get visibleIds() {
|
|
35
|
+
return this.visibleSubject.value;
|
|
36
|
+
}
|
|
37
|
+
get activeId() {
|
|
38
|
+
return this.activeIdSubject.value;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* True when there is nothing to show.
|
|
42
|
+
*
|
|
43
|
+
* With built-in filtering that means items exist but the query excluded them
|
|
44
|
+
* all. With `shouldFilter = false` the consumer renders the result set itself,
|
|
45
|
+
* so "no items registered" IS the empty result — requiring items to exist
|
|
46
|
+
* would make `tolle-command-empty` permanently invisible in that mode.
|
|
47
|
+
*/
|
|
48
|
+
get isEmpty() {
|
|
49
|
+
if (!this.shouldFilter)
|
|
50
|
+
return this.items.size === 0;
|
|
51
|
+
return this.items.size > 0 && this.visibleSubject.value.length === 0;
|
|
52
|
+
}
|
|
53
|
+
register(item) {
|
|
54
|
+
this.items.set(item.id, { ...item, order: this.nextOrder++ });
|
|
55
|
+
this.recompute();
|
|
56
|
+
}
|
|
57
|
+
/** Keeps the stored search text/value in sync when an item's inputs change. */
|
|
58
|
+
update(id, patch) {
|
|
59
|
+
const existing = this.items.get(id);
|
|
60
|
+
if (!existing)
|
|
61
|
+
return;
|
|
62
|
+
this.items.set(id, { ...existing, ...patch });
|
|
63
|
+
this.recompute();
|
|
64
|
+
}
|
|
65
|
+
unregister(id) {
|
|
66
|
+
this.items.delete(id);
|
|
67
|
+
this.recompute();
|
|
68
|
+
}
|
|
69
|
+
setQuery(query) {
|
|
70
|
+
this.querySubject.next(query);
|
|
71
|
+
this.recompute();
|
|
72
|
+
}
|
|
73
|
+
isVisible(id) {
|
|
74
|
+
return this.visibleSubject.value.includes(id);
|
|
75
|
+
}
|
|
76
|
+
/** Moves the highlight by `delta` positions, wrapping at both ends. */
|
|
77
|
+
move(delta) {
|
|
78
|
+
const ids = this.visibleSubject.value;
|
|
79
|
+
if (!ids.length)
|
|
80
|
+
return;
|
|
81
|
+
const current = ids.indexOf(this.activeIdSubject.value ?? '');
|
|
82
|
+
// From "nothing active", ArrowUp should land on the last item, not the second.
|
|
83
|
+
const start = current < 0 ? (delta > 0 ? -1 : 0) : current;
|
|
84
|
+
const next = (start + delta + ids.length) % ids.length;
|
|
85
|
+
this.activeIdSubject.next(ids[next]);
|
|
86
|
+
}
|
|
87
|
+
setActive(id) {
|
|
88
|
+
if (id !== null && !this.isVisible(id))
|
|
89
|
+
return;
|
|
90
|
+
this.activeIdSubject.next(id);
|
|
91
|
+
}
|
|
92
|
+
/** Selects the highlighted item, if there is one. */
|
|
93
|
+
selectActive() {
|
|
94
|
+
const id = this.activeIdSubject.value;
|
|
95
|
+
if (!id)
|
|
96
|
+
return;
|
|
97
|
+
const item = this.items.get(id);
|
|
98
|
+
if (!item || item.disabled)
|
|
99
|
+
return;
|
|
100
|
+
this.selectedSubject.next(item.value);
|
|
101
|
+
}
|
|
102
|
+
selectById(id) {
|
|
103
|
+
const item = this.items.get(id);
|
|
104
|
+
if (!item || item.disabled)
|
|
105
|
+
return;
|
|
106
|
+
this.selectedSubject.next(item.value);
|
|
107
|
+
}
|
|
108
|
+
/** Recomputes the visible set and keeps the highlight on something valid. */
|
|
109
|
+
recompute() {
|
|
110
|
+
const q = this.querySubject.value.trim().toLowerCase();
|
|
111
|
+
const visible = [...this.items.values()]
|
|
112
|
+
.filter((item) => !this.shouldFilter || !q || item.searchText.toLowerCase().includes(q))
|
|
113
|
+
.sort((a, b) => a.order - b.order)
|
|
114
|
+
.map((item) => item.id);
|
|
115
|
+
this.visibleSubject.next(visible);
|
|
116
|
+
// If the highlight fell out of the visible set (or there was none), move it
|
|
117
|
+
// to the first selectable item so Enter always has a sensible target.
|
|
118
|
+
const active = this.activeIdSubject.value;
|
|
119
|
+
if (!active || !visible.includes(active)) {
|
|
120
|
+
const firstEnabled = visible.find((id) => !this.items.get(id)?.disabled) ?? null;
|
|
121
|
+
this.activeIdSubject.next(firstEnabled);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CommandService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
125
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CommandService });
|
|
126
|
+
}
|
|
127
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CommandService, decorators: [{
|
|
128
|
+
type: Injectable
|
|
129
|
+
}] });
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9jb21tYW5kLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFhaEQ7Ozs7OztHQU1HO0FBRUgsTUFBTSxPQUFPLGNBQWM7SUFDUixLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFDckQsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUVMLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUNoRSw0QkFBNEI7SUFDbkIsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFbEMsY0FBYyxHQUFHLElBQUksZUFBZSxDQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLGtFQUFrRTtJQUN6RCxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUV0QyxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBQzVFLGdFQUFnRTtJQUN2RCxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUV4QyxlQUFlLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztJQUN0RCxrREFBa0Q7SUFDekMsU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFekQ7OztPQUdHO0lBQ0gsWUFBWSxHQUFHLElBQUksQ0FBQztJQUVwQixJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElB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QUFLLENBQUM7YUFDakMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbEMsNEVBQTRFO1FBQzVFLHNFQUFzRTtRQUN0RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDO1lBQ2pGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO3dHQS9IVSxjQUFjOzRHQUFkLGNBQWM7OzRGQUFkLGNBQWM7a0JBRDFCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuLyoqIE9uZSByZWdpc3RlcmVkIGB0b2xsZS1jb21tYW5kLWl0ZW1gLCBhcyBzZWVuIGJ5IHRoZSBzZXJ2aWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kSXRlbVN0YXRlIHtcbiAgaWQ6IHN0cmluZztcbiAgLyoqIFRleHQgdGhlIHF1ZXJ5IGlzIG1hdGNoZWQgYWdhaW5zdCDigJQgdGhlIGl0ZW0ncyBsYWJlbCBwbHVzIGFueSBga2V5d29yZHNgLiAqL1xuICBzZWFyY2hUZXh0OiBzdHJpbmc7XG4gIHZhbHVlOiBhbnk7XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICAvKiogUmVnaXN0cmF0aW9uIG9yZGVyLCB1c2VkIHRvIGtlZXAgdGhlIHZpc2libGUgbGlzdCBpbiBET00gb3JkZXIuICovXG4gIG9yZGVyOiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29vcmRpbmF0ZXMgYSBgdG9sbGUtY29tbWFuZGAgYW5kIGl0cyBkZXNjZW5kYW50czogb3ducyB0aGUgcXVlcnksIGRlY2lkZXNcbiAqIHdoaWNoIGl0ZW1zIHN1cnZpdmUgZmlsdGVyaW5nLCBhbmQgdHJhY2tzIHRoZSBhY3RpdmUgKGhpZ2hsaWdodGVkKSBpdGVtIGZvclxuICogYGFyaWEtYWN0aXZlZGVzY2VuZGFudGAuXG4gKlxuICogUHJvdmlkZWQgb24gYENvbW1hbmRDb21wb25lbnRgLCBzbyBlYWNoIGNvbW1hbmQgbWVudSBnZXRzIGl0cyBvd24gaW5zdGFuY2UuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb21tYW5kU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXRlbXMgPSBuZXcgTWFwPHN0cmluZywgQ29tbWFuZEl0ZW1TdGF0ZT4oKTtcbiAgcHJpdmF0ZSBuZXh0T3JkZXIgPSAwO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcXVlcnlTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgLyoqIEN1cnJlbnQgc2VhcmNoIHF1ZXJ5LiAqL1xuICByZWFkb25seSBxdWVyeSQgPSB0aGlzLnF1ZXJ5U3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZpc2libGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xuICAvKiogSWRzIG9mIHRoZSBpdGVtcyBzdXJ2aXZpbmcgdGhlIGN1cnJlbnQgcXVlcnksIGluIERPTSBvcmRlci4gKi9cbiAgcmVhZG9ubHkgdmlzaWJsZSQgPSB0aGlzLnZpc2libGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZlSWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgLyoqIElkIG9mIHRoZSBoaWdobGlnaHRlZCBpdGVtLCBvciBudWxsIHdoZW4gbm90aGluZyBtYXRjaGVzLiAqL1xuICByZWFkb25seSBhY3RpdmVJZCQgPSB0aGlzLmFjdGl2ZUlkU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdGVkU3ViamVjdCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgLyoqIEVtaXRzIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbSB0aGUgdXNlciBjaG9zZS4gKi9cbiAgcmVhZG9ubHkgc2VsZWN0ZWQkID0gdGhpcy5zZWxlY3RlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBmaWx0ZXJpbmcgaXMgbGVmdCBlbnRpcmVseSB0byB0aGUgY29uc3VtZXIg4oCUIGV2ZXJ5IHJlZ2lzdGVyZWRcbiAgICogaXRlbSBzdGF5cyB2aXNpYmxlIHJlZ2FyZGxlc3Mgb2YgdGhlIHF1ZXJ5LiBVc2UgZm9yIHNlcnZlci1zaWRlIHNlYXJjaC5cbiAgICovXG4gIHNob3VsZEZpbHRlciA9IHRydWU7XG5cbiAgZ2V0IHF1ZXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgZ2V0IHZpc2libGVJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUlkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUlkU3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBzaG93LlxuICAgKlxuICAgKiBXaXRoIGJ1aWx0LWluIGZpbHRlcmluZyB0aGF0IG1lYW5zIGl0ZW1zIGV4aXN0IGJ1dCB0aGUgcXVlcnkgZXhjbHVkZWQgdGhlbVxuICAgKiBhbGwuIFdpdGggYHNob3VsZEZpbHRlciA9IGZhbHNlYCB0aGUgY29uc3VtZXIgcmVuZGVycyB0aGUgcmVzdWx0IHNldCBpdHNlbGYsXG4gICAqIHNvIFwibm8gaXRlbXMgcmVnaXN0ZXJlZFwiIElTIHRoZSBlbXB0eSByZXN1bHQg4oCUIHJlcXVpcmluZyBpdGVtcyB0byBleGlzdFxuICAgKiB3b3VsZCBtYWtlIGB0b2xsZS1jb21tYW5kLWVtcHR5YCBwZXJtYW5lbnRseSBpbnZpc2libGUgaW4gdGhhdCBtb2RlLlxuICAgKi9cbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnNob3VsZEZpbHRlcikgcmV0dXJuIHRoaXMuaXRlbXMuc2l6ZSA9PT0gMDtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5zaXplID4gMCAmJiB0aGlzLnZpc2libGVTdWJqZWN0LnZhbHVlLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIHJlZ2lzdGVyKGl0ZW06IE9taXQ8Q29tbWFuZEl0ZW1TdGF0ZSwgJ29yZGVyJz4pOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1zLnNldChpdGVtLmlkLCB7IC4uLml0ZW0sIG9yZGVyOiB0aGlzLm5leHRPcmRlcisrIH0pO1xuICAgIHRoaXMucmVjb21wdXRlKCk7XG4gIH1cblxuICAvKiogS2VlcHMgdGhlIHN0b3JlZCBzZWFyY2ggdGV4dC92YWx1ZSBpbiBzeW5jIHdoZW4gYW4gaXRlbSdzIGlucHV0cyBjaGFuZ2UuICovXG4gIHVwZGF0ZShpZDogc3RyaW5nLCBwYXRjaDogUGFydGlhbDxPbWl0PENvbW1hbmRJdGVtU3RhdGUsICdpZCcgfCAnb3JkZXInPj4pOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuaXRlbXMuZ2V0KGlkKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm47XG4gICAgdGhpcy5pdGVtcy5zZXQoaWQsIHsgLi4uZXhpc3RpbmcsIC4uLnBhdGNoIH0pO1xuICAgIHRoaXMucmVjb21wdXRlKCk7XG4gIH1cblxuICB1bnJlZ2lzdGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1zLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5yZWNvbXB1dGUoKTtcbiAgfVxuXG4gIHNldFF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXJ5U3ViamVjdC5uZXh0KHF1ZXJ5KTtcbiAgICB0aGlzLnJlY29tcHV0ZSgpO1xuICB9XG5cbiAgaXNWaXNpYmxlKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlU3ViamVjdC52YWx1ZS5pbmNsdWRlcyhpZCk7XG4gIH1cblxuICAvKiogTW92ZXMgdGhlIGhpZ2hsaWdodCBieSBgZGVsdGFgIHBvc2l0aW9ucywgd3JhcHBpbmcgYXQgYm90aCBlbmRzLiAqL1xuICBtb3ZlKGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpZHMgPSB0aGlzLnZpc2libGVTdWJqZWN0LnZhbHVlO1xuICAgIGlmICghaWRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBpZHMuaW5kZXhPZih0aGlzLmFjdGl2ZUlkU3ViamVjdC52YWx1ZSA/PyAnJyk7XG4gICAgLy8gRnJvbSBcIm5vdGhpbmcgYWN0aXZlXCIsIEFycm93VXAgc2hvdWxkIGxhbmQgb24gdGhlIGxhc3QgaXRlbSwgbm90IHRoZSBzZWNvbmQuXG4gICAgY29uc3Qgc3RhcnQgPSBjdXJyZW50IDwgMCA/IChkZWx0YSA+IDAgPyAtMSA6IDApIDogY3VycmVudDtcbiAgICBjb25zdCBuZXh0ID0gKHN0YXJ0ICsgZGVsdGEgKyBpZHMubGVuZ3RoKSAlIGlkcy5sZW5ndGg7XG4gICAgdGhpcy5hY3RpdmVJZFN1YmplY3QubmV4dChpZHNbbmV4dF0pO1xuICB9XG5cbiAgc2V0QWN0aXZlKGlkOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKGlkICE9PSBudWxsICYmICF0aGlzLmlzVmlzaWJsZShpZCkpIHJldHVybjtcbiAgICB0aGlzLmFjdGl2ZUlkU3ViamVjdC5uZXh0KGlkKTtcbiAgfVxuXG4gIC8qKiBTZWxlY3RzIHRoZSBoaWdobGlnaHRlZCBpdGVtLCBpZiB0aGVyZSBpcyBvbmUuICovXG4gIHNlbGVjdEFjdGl2ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuYWN0aXZlSWRTdWJqZWN0LnZhbHVlO1xuICAgIGlmICghaWQpIHJldHVybjtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtcy5nZXQoaWQpO1xuICAgIGlmICghaXRlbSB8fCBpdGVtLmRpc2FibGVkKSByZXR1cm47XG4gICAgdGhpcy5zZWxlY3RlZFN1YmplY3QubmV4dChpdGVtLnZhbHVlKTtcbiAgfVxuXG4gIHNlbGVjdEJ5SWQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zLmdldChpZCk7XG4gICAgaWYgKCFpdGVtIHx8IGl0ZW0uZGlzYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLnNlbGVjdGVkU3ViamVjdC5uZXh0KGl0ZW0udmFsdWUpO1xuICB9XG5cbiAgLyoqIFJlY29tcHV0ZXMgdGhlIHZpc2libGUgc2V0IGFuZCBrZWVwcyB0aGUgaGlnaGxpZ2h0IG9uIHNvbWV0aGluZyB2YWxpZC4gKi9cbiAgcHJpdmF0ZSByZWNvbXB1dGUoKTogdm9pZCB7XG4gICAgY29uc3QgcSA9IHRoaXMucXVlcnlTdWJqZWN0LnZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgY29uc3QgdmlzaWJsZSA9IFsuLi50aGlzLml0ZW1zLnZhbHVlcygpXVxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gIXRoaXMuc2hvdWxkRmlsdGVyIHx8ICFxIHx8IGl0ZW0uc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5pZCk7XG5cbiAgICB0aGlzLnZpc2libGVTdWJqZWN0Lm5leHQodmlzaWJsZSk7XG5cbiAgICAvLyBJZiB0aGUgaGlnaGxpZ2h0IGZlbGwgb3V0IG9mIHRoZSB2aXNpYmxlIHNldCAob3IgdGhlcmUgd2FzIG5vbmUpLCBtb3ZlIGl0XG4gICAgLy8gdG8gdGhlIGZpcnN0IHNlbGVjdGFibGUgaXRlbSBzbyBFbnRlciBhbHdheXMgaGFzIGEgc2Vuc2libGUgdGFyZ2V0LlxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuYWN0aXZlSWRTdWJqZWN0LnZhbHVlO1xuICAgIGlmICghYWN0aXZlIHx8ICF2aXNpYmxlLmluY2x1ZGVzKGFjdGl2ZSkpIHtcbiAgICAgIGNvbnN0IGZpcnN0RW5hYmxlZCA9IHZpc2libGUuZmluZCgoaWQpID0+ICF0aGlzLml0ZW1zLmdldChpZCk/LmRpc2FibGVkKSA/PyBudWxsO1xuICAgICAgdGhpcy5hY3RpdmVJZFN1YmplY3QubmV4dChmaXJzdEVuYWJsZWQpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ChangeDetectorRef, inject } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { cn } from './utils/cn';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
const confirmationVariants = cva('w-full rounded-lg border p-3 text-sm transition-colors', {
|
|
8
|
+
variants: {
|
|
9
|
+
state: {
|
|
10
|
+
pending: 'border-border bg-card text-card-foreground',
|
|
11
|
+
confirmed: 'border-success/40 bg-success/5 text-card-foreground',
|
|
12
|
+
cancelled: 'border-destructive/40 bg-destructive/5 text-card-foreground',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
defaultVariants: { state: 'pending' },
|
|
16
|
+
});
|
|
17
|
+
const confirmationIconVariants = cva('mt-0.5 shrink-0 text-base leading-none', {
|
|
18
|
+
variants: {
|
|
19
|
+
state: {
|
|
20
|
+
pending: 'text-warning',
|
|
21
|
+
confirmed: 'text-success',
|
|
22
|
+
cancelled: 'text-destructive',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: { state: 'pending' },
|
|
26
|
+
});
|
|
27
|
+
const confirmationResolvedVariants = cva('inline-flex shrink-0 items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium', {
|
|
28
|
+
variants: {
|
|
29
|
+
state: {
|
|
30
|
+
pending: 'border-border text-muted-foreground',
|
|
31
|
+
confirmed: 'border-success/40 bg-success/10 text-success',
|
|
32
|
+
cancelled: 'border-destructive/40 bg-destructive/10 text-destructive',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
defaultVariants: { state: 'pending' },
|
|
36
|
+
});
|
|
37
|
+
/** Remixicon class shown beside the prompt for each state. */
|
|
38
|
+
const CONFIRMATION_ICONS = {
|
|
39
|
+
pending: 'ri-shield-check-line',
|
|
40
|
+
confirmed: 'ri-checkbox-circle-fill',
|
|
41
|
+
cancelled: 'ri-close-circle-fill',
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* An inline approve / deny prompt for an agent action that needs a human to
|
|
45
|
+
* sign off. While `state` is `'pending'` it shows both buttons; once the user
|
|
46
|
+
* answers — or the host sets `state` — the buttons collapse into a compact
|
|
47
|
+
* resolved row.
|
|
48
|
+
*
|
|
49
|
+
* ```html
|
|
50
|
+
* <tolle-confirmation
|
|
51
|
+
* title="Delete 12 rows from the orders table?"
|
|
52
|
+
* description="This cannot be undone."
|
|
53
|
+
* (confirmed)="run()"
|
|
54
|
+
* (cancelled)="skip()"
|
|
55
|
+
* ></tolle-confirmation>
|
|
56
|
+
* ```
|
|
57
|
+
* @new
|
|
58
|
+
*/
|
|
59
|
+
export class ConfirmationComponent {
|
|
60
|
+
cdr = inject(ChangeDetectorRef);
|
|
61
|
+
/** Headline describing the action awaiting approval. @default '' */
|
|
62
|
+
title = '';
|
|
63
|
+
/** Supporting detail shown under the title. @default '' */
|
|
64
|
+
description = '';
|
|
65
|
+
/** Label of the approve button. @default 'Approve' */
|
|
66
|
+
confirmLabel = 'Approve';
|
|
67
|
+
/** Label of the deny button. @default 'Deny' */
|
|
68
|
+
cancelLabel = 'Deny';
|
|
69
|
+
/** Text shown in the resolved row after approval. @default 'Approved' */
|
|
70
|
+
confirmedLabel = 'Approved';
|
|
71
|
+
/** Text shown in the resolved row after denial. @default 'Denied' */
|
|
72
|
+
cancelledLabel = 'Denied';
|
|
73
|
+
/** Whether the prompt is still open, and how it was answered. @default 'pending' */
|
|
74
|
+
state = 'pending';
|
|
75
|
+
/** Blocks both buttons without resolving the prompt. @default false */
|
|
76
|
+
disabled = false;
|
|
77
|
+
/** Extra Tailwind classes merged onto the prompt via `cn()` (last-wins). */
|
|
78
|
+
class = '';
|
|
79
|
+
/** Emitted when the user approves the action. */
|
|
80
|
+
confirmed = new EventEmitter();
|
|
81
|
+
/** Emitted when the user denies the action. */
|
|
82
|
+
cancelled = new EventEmitter();
|
|
83
|
+
/**
|
|
84
|
+
* Set when the user answers, so the prompt resolves on its own without the
|
|
85
|
+
* host having to bind `state` back. Cleared whenever `state` is pushed in.
|
|
86
|
+
*/
|
|
87
|
+
answer = null;
|
|
88
|
+
ngOnChanges(changes) {
|
|
89
|
+
if (changes['state'])
|
|
90
|
+
this.answer = null;
|
|
91
|
+
// A bound `class` input is written through Angular's styling path,
|
|
92
|
+
// which does not mark an OnPush view dirty on its own.
|
|
93
|
+
this.cdr.markForCheck();
|
|
94
|
+
}
|
|
95
|
+
/** The state actually rendered: the user's answer if there is one, else `state`. */
|
|
96
|
+
get currentState() {
|
|
97
|
+
return this.answer ?? this.state;
|
|
98
|
+
}
|
|
99
|
+
get resolvedLabel() {
|
|
100
|
+
return this.currentState === 'confirmed' ? this.confirmedLabel : this.cancelledLabel;
|
|
101
|
+
}
|
|
102
|
+
get iconName() {
|
|
103
|
+
return CONFIRMATION_ICONS[this.currentState];
|
|
104
|
+
}
|
|
105
|
+
get computedClass() {
|
|
106
|
+
return cn(confirmationVariants({ state: this.currentState }), this.class);
|
|
107
|
+
}
|
|
108
|
+
get iconClass() {
|
|
109
|
+
return cn(confirmationIconVariants({ state: this.currentState }), this.iconName);
|
|
110
|
+
}
|
|
111
|
+
get resolvedClass() {
|
|
112
|
+
return cn(confirmationResolvedVariants({ state: this.currentState }));
|
|
113
|
+
}
|
|
114
|
+
get confirmButtonClass() {
|
|
115
|
+
return cn('inline-flex h-8 items-center gap-1.5 rounded-md bg-primary px-3 text-xs font-medium text-primary-foreground transition-colors', 'hover:bg-primary/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50');
|
|
116
|
+
}
|
|
117
|
+
get cancelButtonClass() {
|
|
118
|
+
return cn('inline-flex h-8 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground transition-colors', 'hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50');
|
|
119
|
+
}
|
|
120
|
+
confirm() {
|
|
121
|
+
if (this.disabled || this.currentState !== 'pending')
|
|
122
|
+
return;
|
|
123
|
+
this.answer = 'confirmed';
|
|
124
|
+
this.confirmed.emit();
|
|
125
|
+
}
|
|
126
|
+
cancel() {
|
|
127
|
+
if (this.disabled || this.currentState !== 'pending')
|
|
128
|
+
return;
|
|
129
|
+
this.answer = 'cancelled';
|
|
130
|
+
this.cancelled.emit();
|
|
131
|
+
}
|
|
132
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ConfirmationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
133
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ConfirmationComponent, isStandalone: true, selector: "tolle-confirmation", inputs: { title: "title", description: "description", confirmLabel: "confirmLabel", cancelLabel: "cancelLabel", confirmedLabel: "confirmedLabel", cancelledLabel: "cancelledLabel", state: "state", disabled: "disabled", class: "class" }, outputs: { confirmed: "confirmed", cancelled: "cancelled" }, usesOnChanges: true, ngImport: i0, template: `
|
|
134
|
+
<div [class]="computedClass" [attr.data-state]="currentState" role="group" [attr.aria-label]="title">
|
|
135
|
+
<div class="flex items-start gap-3">
|
|
136
|
+
<i [class]="iconClass" aria-hidden="true"></i>
|
|
137
|
+
|
|
138
|
+
<div class="min-w-0 flex-1">
|
|
139
|
+
<p class="font-medium text-foreground">{{ title }}</p>
|
|
140
|
+
<p *ngIf="description" class="mt-0.5 text-sm text-muted-foreground">{{ description }}</p>
|
|
141
|
+
|
|
142
|
+
<div class="empty:hidden"><ng-content></ng-content></div>
|
|
143
|
+
|
|
144
|
+
<div *ngIf="currentState === 'pending'" class="mt-3 flex flex-wrap items-center gap-2">
|
|
145
|
+
<button type="button" [disabled]="disabled" [class]="confirmButtonClass" (click)="confirm()">
|
|
146
|
+
<i class="ri-check-line" aria-hidden="true"></i>
|
|
147
|
+
{{ confirmLabel }}
|
|
148
|
+
</button>
|
|
149
|
+
<button type="button" [disabled]="disabled" [class]="cancelButtonClass" (click)="cancel()">
|
|
150
|
+
<i class="ri-close-line" aria-hidden="true"></i>
|
|
151
|
+
{{ cancelLabel }}
|
|
152
|
+
</button>
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
|
|
156
|
+
<span *ngIf="currentState !== 'pending'" [class]="resolvedClass">
|
|
157
|
+
<i [class]="iconName" aria-hidden="true"></i>
|
|
158
|
+
{{ resolvedLabel }}
|
|
159
|
+
</span>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
163
|
+
}
|
|
164
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ConfirmationComponent, decorators: [{
|
|
165
|
+
type: Component,
|
|
166
|
+
args: [{ selector: 'tolle-confirmation', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
167
|
+
<div [class]="computedClass" [attr.data-state]="currentState" role="group" [attr.aria-label]="title">
|
|
168
|
+
<div class="flex items-start gap-3">
|
|
169
|
+
<i [class]="iconClass" aria-hidden="true"></i>
|
|
170
|
+
|
|
171
|
+
<div class="min-w-0 flex-1">
|
|
172
|
+
<p class="font-medium text-foreground">{{ title }}</p>
|
|
173
|
+
<p *ngIf="description" class="mt-0.5 text-sm text-muted-foreground">{{ description }}</p>
|
|
174
|
+
|
|
175
|
+
<div class="empty:hidden"><ng-content></ng-content></div>
|
|
176
|
+
|
|
177
|
+
<div *ngIf="currentState === 'pending'" class="mt-3 flex flex-wrap items-center gap-2">
|
|
178
|
+
<button type="button" [disabled]="disabled" [class]="confirmButtonClass" (click)="confirm()">
|
|
179
|
+
<i class="ri-check-line" aria-hidden="true"></i>
|
|
180
|
+
{{ confirmLabel }}
|
|
181
|
+
</button>
|
|
182
|
+
<button type="button" [disabled]="disabled" [class]="cancelButtonClass" (click)="cancel()">
|
|
183
|
+
<i class="ri-close-line" aria-hidden="true"></i>
|
|
184
|
+
{{ cancelLabel }}
|
|
185
|
+
</button>
|
|
186
|
+
</div>
|
|
187
|
+
</div>
|
|
188
|
+
|
|
189
|
+
<span *ngIf="currentState !== 'pending'" [class]="resolvedClass">
|
|
190
|
+
<i [class]="iconName" aria-hidden="true"></i>
|
|
191
|
+
{{ resolvedLabel }}
|
|
192
|
+
</span>
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
`, styles: [":host{display:block}\n"] }]
|
|
196
|
+
}], propDecorators: { title: [{
|
|
197
|
+
type: Input
|
|
198
|
+
}], description: [{
|
|
199
|
+
type: Input
|
|
200
|
+
}], confirmLabel: [{
|
|
201
|
+
type: Input
|
|
202
|
+
}], cancelLabel: [{
|
|
203
|
+
type: Input
|
|
204
|
+
}], confirmedLabel: [{
|
|
205
|
+
type: Input
|
|
206
|
+
}], cancelledLabel: [{
|
|
207
|
+
type: Input
|
|
208
|
+
}], state: [{
|
|
209
|
+
type: Input
|
|
210
|
+
}], disabled: [{
|
|
211
|
+
type: Input
|
|
212
|
+
}], class: [{
|
|
213
|
+
type: Input
|
|
214
|
+
}], confirmed: [{
|
|
215
|
+
type: Output
|
|
216
|
+
}], cancelled: [{
|
|
217
|
+
type: Output
|
|
218
|
+
}] } });
|
|
219
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybWF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvY29uZmlybWF0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckosT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7O0FBS2hDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDLHdEQUF3RCxFQUFFO0lBQ3pGLFFBQVEsRUFBRTtRQUNSLEtBQUssRUFBRTtZQUNMLE9BQU8sRUFBRSw0Q0FBNEM7WUFDckQsU0FBUyxFQUFFLHFEQUFxRDtZQUNoRSxTQUFTLEVBQUUsNkRBQTZEO1NBQ3pFO0tBQ0Y7SUFDRCxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQ3RDLENBQUMsQ0FBQztBQUVILE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFDLHdDQUF3QyxFQUFFO0lBQzdFLFFBQVEsRUFBRTtRQUNSLEtBQUssRUFBRTtZQUNMLE9BQU8sRUFBRSxjQUFjO1lBQ3ZCLFNBQVMsRUFBRSxjQUFjO1lBQ3pCLFNBQVMsRUFBRSxrQkFBa0I7U0FDOUI7S0FDRjtJQUNELGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7Q0FDdEMsQ0FBQyxDQUFDO0FBRUgsTUFBTSw0QkFBNEIsR0FBRyxHQUFHLENBQ3RDLDZGQUE2RixFQUM3RjtJQUNFLFFBQVEsRUFBRTtRQUNSLEtBQUssRUFBRTtZQUNMLE9BQU8s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T0FBTztRQUNMLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVM7WUFBRSxPQUFPO1FBQzdELElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTO1lBQUUsT0FBTztRQUM3RCxJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7d0dBMUZVLHFCQUFxQjs0RkFBckIscUJBQXFCLDRZQS9CdEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJULCtGQS9CUyxZQUFZOzs0RkFpQ1gscUJBQXFCO2tCQXJDakMsU0FBUzsrQkFDRSxvQkFBb0IsY0FFbEIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUNOLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJUOzhCQU1RLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUdJLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUcsU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZiwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgY3ZhLCB0eXBlIFZhcmlhbnRQcm9wcyB9IGZyb20gJ2NsYXNzLXZhcmlhbmNlLWF1dGhvcml0eSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuXG4vKiogV2hldGhlciB0aGUgdXNlciBoYXMgYW5zd2VyZWQgdGhlIHByb21wdCB5ZXQsIGFuZCBob3cuICovXG5leHBvcnQgdHlwZSBDb25maXJtYXRpb25TdGF0ZSA9ICdwZW5kaW5nJyB8ICdjb25maXJtZWQnIHwgJ2NhbmNlbGxlZCc7XG5cbmNvbnN0IGNvbmZpcm1hdGlvblZhcmlhbnRzID0gY3ZhKCd3LWZ1bGwgcm91bmRlZC1sZyBib3JkZXIgcC0zIHRleHQtc20gdHJhbnNpdGlvbi1jb2xvcnMnLCB7XG4gIHZhcmlhbnRzOiB7XG4gICAgc3RhdGU6IHtcbiAgICAgIHBlbmRpbmc6ICdib3JkZXItYm9yZGVyIGJnLWNhcmQgdGV4dC1jYXJkLWZvcmVncm91bmQnLFxuICAgICAgY29uZmlybWVkOiAnYm9yZGVyLXN1Y2Nlc3MvNDAgYmctc3VjY2Vzcy81IHRleHQtY2FyZC1mb3JlZ3JvdW5kJyxcbiAgICAgIGNhbmNlbGxlZDogJ2JvcmRlci1kZXN0cnVjdGl2ZS80MCBiZy1kZXN0cnVjdGl2ZS81IHRleHQtY2FyZC1mb3JlZ3JvdW5kJyxcbiAgICB9LFxuICB9LFxuICBkZWZhdWx0VmFyaWFudHM6IHsgc3RhdGU6ICdwZW5kaW5nJyB9LFxufSk7XG5cbmNvbnN0IGNvbmZpcm1hdGlvbkljb25WYXJpYW50cyA9IGN2YSgnbXQtMC41IHNocmluay0wIHRleHQtYmFzZSBsZWFkaW5nLW5vbmUnLCB7XG4gIHZhcmlhbnRzOiB7XG4gICAgc3RhdGU6IHtcbiAgICAgIHBlbmRpbmc6ICd0ZXh0LXdhcm5pbmcnLFxuICAgICAgY29uZmlybWVkOiAndGV4dC1zdWNjZXNzJyxcbiAgICAgIGNhbmNlbGxlZDogJ3RleHQtZGVzdHJ1Y3RpdmUnLFxuICAgIH0sXG4gIH0sXG4gIGRlZmF1bHRWYXJpYW50czogeyBzdGF0ZTogJ3BlbmRpbmcnIH0sXG59KTtcblxuY29uc3QgY29uZmlybWF0aW9uUmVzb2x2ZWRWYXJpYW50cyA9IGN2YShcbiAgJ2lubGluZS1mbGV4IHNocmluay0wIGl0ZW1zLWNlbnRlciBnYXAtMSByb3VuZGVkLWZ1bGwgYm9yZGVyIHB4LTIgcHktMC41IHRleHQteHMgZm9udC1tZWRpdW0nLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIHBlbmRpbmc6ICdib3JkZXItYm9yZGVyIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCcsXG4gICAgICAgIGNvbmZpcm1lZDogJ2JvcmRlci1zdWNjZXNzLzQwIGJnLXN1Y2Nlc3MvMTAgdGV4dC1zdWNjZXNzJyxcbiAgICAgICAgY2FuY2VsbGVkOiAnYm9yZGVyLWRlc3RydWN0aXZlLzQwIGJnLWRlc3RydWN0aXZlLzEwIHRleHQtZGVzdHJ1Y3RpdmUnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czogeyBzdGF0ZTogJ3BlbmRpbmcnIH0sXG4gIH1cbik7XG5cbmV4cG9ydCB0eXBlIENvbmZpcm1hdGlvblByb3BzID0gVmFyaWFudFByb3BzPHR5cGVvZiBjb25maXJtYXRpb25WYXJpYW50cz47XG5cbi8qKiBSZW1peGljb24gY2xhc3Mgc2hvd24gYmVzaWRlIHRoZSBwcm9tcHQgZm9yIGVhY2ggc3RhdGUuICovXG5jb25zdCBDT05GSVJNQVRJT05fSUNPTlM6IFJlY29yZDxDb25maXJtYXRpb25TdGF0ZSwgc3RyaW5nPiA9IHtcbiAgcGVuZGluZzogJ3JpLXNoaWVsZC1jaGVjay1saW5lJyxcbiAgY29uZmlybWVkOiAncmktY2hlY2tib3gtY2lyY2xlLWZpbGwnLFxuICBjYW5jZWxsZWQ6ICdyaS1jbG9zZS1jaXJjbGUtZmlsbCcsXG59O1xuXG4vKipcbiAqIEFuIGlubGluZSBhcHByb3ZlIC8gZGVueSBwcm9tcHQgZm9yIGFuIGFnZW50IGFjdGlvbiB0aGF0IG5lZWRzIGEgaHVtYW4gdG9cbiAqIHNpZ24gb2ZmLiBXaGlsZSBgc3RhdGVgIGlzIGAncGVuZGluZydgIGl0IHNob3dzIGJvdGggYnV0dG9uczsgb25jZSB0aGUgdXNlclxuICogYW5zd2VycyDigJQgb3IgdGhlIGhvc3Qgc2V0cyBgc3RhdGVgIOKAlCB0aGUgYnV0dG9ucyBjb2xsYXBzZSBpbnRvIGEgY29tcGFjdFxuICogcmVzb2x2ZWQgcm93LlxuICpcbiAqIGBgYGh0bWxcbiAqIDx0b2xsZS1jb25maXJtYXRpb25cbiAqICAgdGl0bGU9XCJEZWxldGUgMTIgcm93cyBmcm9tIHRoZSBvcmRlcnMgdGFibGU/XCJcbiAqICAgZGVzY3JpcHRpb249XCJUaGlzIGNhbm5vdCBiZSB1bmRvbmUuXCJcbiAqICAgKGNvbmZpcm1lZCk9XCJydW4oKVwiXG4gKiAgIChjYW5jZWxsZWQpPVwic2tpcCgpXCJcbiAqID48L3RvbGxlLWNvbmZpcm1hdGlvbj5cbiAqIGBgYFxuICogQG5ld1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1jb25maXJtYXRpb24nLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiIFthdHRyLmRhdGEtc3RhdGVdPVwiY3VycmVudFN0YXRlXCIgcm9sZT1cImdyb3VwXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0aXRsZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtc3RhcnQgZ2FwLTNcIj5cbiAgICAgICAgPGkgW2NsYXNzXT1cImljb25DbGFzc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWluLXctMCBmbGV4LTFcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZFwiPnt7IHRpdGxlIH19PC9wPlxuICAgICAgICAgIDxwICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBjbGFzcz1cIm10LTAuNSB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IGRlc2NyaXB0aW9uIH19PC9wPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5OmhpZGRlblwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RhdGUgPT09ICdwZW5kaW5nJ1wiIGNsYXNzPVwibXQtMyBmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFtjbGFzc109XCJjb25maXJtQnV0dG9uQ2xhc3NcIiAoY2xpY2spPVwiY29uZmlybSgpXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicmktY2hlY2stbGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAge3sgY29uZmlybUxhYmVsIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFtjbGFzc109XCJjYW5jZWxCdXR0b25DbGFzc1wiIChjbGljayk9XCJjYW5jZWwoKVwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInJpLWNsb3NlLWxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIHt7IGNhbmNlbExhYmVsIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJjdXJyZW50U3RhdGUgIT09ICdwZW5kaW5nJ1wiIFtjbGFzc109XCJyZXNvbHZlZENsYXNzXCI+XG4gICAgICAgICAgPGkgW2NsYXNzXT1cImljb25OYW1lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgIHt7IHJlc29sdmVkTGFiZWwgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIENvbmZpcm1hdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKiogSGVhZGxpbmUgZGVzY3JpYmluZyB0aGUgYWN0aW9uIGF3YWl0aW5nIGFwcHJvdmFsLiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSB0aXRsZSA9ICcnO1xuICAvKiogU3VwcG9ydGluZyBkZXRhaWwgc2hvd24gdW5kZXIgdGhlIHRpdGxlLiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbiA9ICcnO1xuICAvKiogTGFiZWwgb2YgdGhlIGFwcHJvdmUgYnV0dG9uLiBAZGVmYXVsdCAnQXBwcm92ZScgKi9cbiAgQElucHV0KCkgY29uZmlybUxhYmVsID0gJ0FwcHJvdmUnO1xuICAvKiogTGFiZWwgb2YgdGhlIGRlbnkgYnV0dG9uLiBAZGVmYXVsdCAnRGVueScgKi9cbiAgQElucHV0KCkgY2FuY2VsTGFiZWwgPSAnRGVueSc7XG4gIC8qKiBUZXh0IHNob3duIGluIHRoZSByZXNvbHZlZCByb3cgYWZ0ZXIgYXBwcm92YWwuIEBkZWZhdWx0ICdBcHByb3ZlZCcgKi9cbiAgQElucHV0KCkgY29uZmlybWVkTGFiZWwgPSAnQXBwcm92ZWQnO1xuICAvKiogVGV4dCBzaG93biBpbiB0aGUgcmVzb2x2ZWQgcm93IGFmdGVyIGRlbmlhbC4gQGRlZmF1bHQgJ0RlbmllZCcgKi9cbiAgQElucHV0KCkgY2FuY2VsbGVkTGFiZWwgPSAnRGVuaWVkJztcbiAgLyoqIFdoZXRoZXIgdGhlIHByb21wdCBpcyBzdGlsbCBvcGVuLCBhbmQgaG93IGl0IHdhcyBhbnN3ZXJlZC4gQGRlZmF1bHQgJ3BlbmRpbmcnICovXG4gIEBJbnB1dCgpIHN0YXRlOiBDb25maXJtYXRpb25TdGF0ZSA9ICdwZW5kaW5nJztcbiAgLyoqIEJsb2NrcyBib3RoIGJ1dHRvbnMgd2l0aG91dCByZXNvbHZpbmcgdGhlIHByb21wdC4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHByb21wdCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgYXBwcm92ZXMgdGhlIGFjdGlvbi4gKi9cbiAgQE91dHB1dCgpIGNvbmZpcm1lZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBkZW5pZXMgdGhlIGFjdGlvbi4gKi9cbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogU2V0IHdoZW4gdGhlIHVzZXIgYW5zd2Vycywgc28gdGhlIHByb21wdCByZXNvbHZlcyBvbiBpdHMgb3duIHdpdGhvdXQgdGhlXG4gICAqIGhvc3QgaGF2aW5nIHRvIGJpbmQgYHN0YXRlYCBiYWNrLiBDbGVhcmVkIHdoZW5ldmVyIGBzdGF0ZWAgaXMgcHVzaGVkIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBhbnN3ZXI6IENvbmZpcm1hdGlvblN0YXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzdGF0ZSddKSB0aGlzLmFuc3dlciA9IG51bGw7XG4gIFxuICAgIC8vIEEgYm91bmQgYGNsYXNzYCBpbnB1dCBpcyB3cml0dGVuIHRocm91Z2ggQW5ndWxhcidzIHN0eWxpbmcgcGF0aCxcbiAgICAvLyB3aGljaCBkb2VzIG5vdCBtYXJrIGFuIE9uUHVzaCB2aWV3IGRpcnR5IG9uIGl0cyBvd24uXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogVGhlIHN0YXRlIGFjdHVhbGx5IHJlbmRlcmVkOiB0aGUgdXNlcidzIGFuc3dlciBpZiB0aGVyZSBpcyBvbmUsIGVsc2UgYHN0YXRlYC4gKi9cbiAgZ2V0IGN1cnJlbnRTdGF0ZSgpOiBDb25maXJtYXRpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuYW5zd2VyID8/IHRoaXMuc3RhdGU7XG4gIH1cblxuICBnZXQgcmVzb2x2ZWRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZSA9PT0gJ2NvbmZpcm1lZCcgPyB0aGlzLmNvbmZpcm1lZExhYmVsIDogdGhpcy5jYW5jZWxsZWRMYWJlbDtcbiAgfVxuXG4gIGdldCBpY29uTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBDT05GSVJNQVRJT05fSUNPTlNbdGhpcy5jdXJyZW50U3RhdGVdO1xuICB9XG5cbiAgZ2V0IGNvbXB1dGVkQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKGNvbmZpcm1hdGlvblZhcmlhbnRzKHsgc3RhdGU6IHRoaXMuY3VycmVudFN0YXRlIH0pLCB0aGlzLmNsYXNzKTtcbiAgfVxuXG4gIGdldCBpY29uQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKGNvbmZpcm1hdGlvbkljb25WYXJpYW50cyh7IHN0YXRlOiB0aGlzLmN1cnJlbnRTdGF0ZSB9KSwgdGhpcy5pY29uTmFtZSk7XG4gIH1cblxuICBnZXQgcmVzb2x2ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oY29uZmlybWF0aW9uUmVzb2x2ZWRWYXJpYW50cyh7IHN0YXRlOiB0aGlzLmN1cnJlbnRTdGF0ZSB9KSk7XG4gIH1cblxuICBnZXQgY29uZmlybUJ1dHRvbkNsYXNzKCkge1xuICAgIHJldHVybiBjbihcbiAgICAgICdpbmxpbmUtZmxleCBoLTggaXRlbXMtY2VudGVyIGdhcC0xLjUgcm91bmRlZC1tZCBiZy1wcmltYXJ5IHB4LTMgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycycsXG4gICAgICAnaG92ZXI6YmctcHJpbWFyeS85MCBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAnXG4gICAgKTtcbiAgfVxuXG4gIGdldCBjYW5jZWxCdXR0b25DbGFzcygpIHtcbiAgICByZXR1cm4gY24oXG4gICAgICAnaW5saW5lLWZsZXggaC04IGl0ZW1zLWNlbnRlciBnYXAtMS41IHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctYmFja2dyb3VuZCBweC0zIHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICdob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAnXG4gICAgKTtcbiAgfVxuXG4gIGNvbmZpcm0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5jdXJyZW50U3RhdGUgIT09ICdwZW5kaW5nJykgcmV0dXJuO1xuICAgIHRoaXMuYW5zd2VyID0gJ2NvbmZpcm1lZCc7XG4gICAgdGhpcy5jb25maXJtZWQuZW1pdCgpO1xuICB9XG5cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMuY3VycmVudFN0YXRlICE9PSAncGVuZGluZycpIHJldHVybjtcbiAgICB0aGlzLmFuc3dlciA9ICdjYW5jZWxsZWQnO1xuICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Directive, ElementRef, EventEmitter, HostListener, inject, Input, Output } from '@angular/core';
|
|
2
|
+
import { ContextMenuService } from './context-menu.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class ContextMenuTriggerDirective {
|
|
5
|
+
elementRef = inject(ElementRef);
|
|
6
|
+
contextMenuService = inject(ContextMenuService);
|
|
7
|
+
items = [];
|
|
8
|
+
action = new EventEmitter();
|
|
9
|
+
onContextMenu(event) {
|
|
10
|
+
event.stopPropagation();
|
|
11
|
+
this.contextMenuService.open({
|
|
12
|
+
event,
|
|
13
|
+
items: this.items,
|
|
14
|
+
triggerElement: this.elementRef.nativeElement,
|
|
15
|
+
onAction: (actionId) => this.action.emit(actionId)
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContextMenuTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
19
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: ContextMenuTriggerDirective, isStandalone: true, selector: "[tolleContextMenuTrigger]", inputs: { items: ["tolleContextMenuTrigger", "items"] }, outputs: { action: "action" }, host: { listeners: { "contextmenu": "onContextMenu($event)" } }, ngImport: i0 });
|
|
20
|
+
}
|
|
21
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContextMenuTriggerDirective, decorators: [{
|
|
22
|
+
type: Directive,
|
|
23
|
+
args: [{
|
|
24
|
+
selector: '[tolleContextMenuTrigger]',
|
|
25
|
+
standalone: true
|
|
26
|
+
}]
|
|
27
|
+
}], propDecorators: { items: [{
|
|
28
|
+
type: Input,
|
|
29
|
+
args: ['tolleContextMenuTrigger']
|
|
30
|
+
}], action: [{
|
|
31
|
+
type: Output
|
|
32
|
+
}], onContextMenu: [{
|
|
33
|
+
type: HostListener,
|
|
34
|
+
args: ['contextmenu', ['$event']]
|
|
35
|
+
}] } });
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LXRyaWdnZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9jb250ZXh0LW1lbnUtdHJpZ2dlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsa0JBQWtCLEVBQW1CLE1BQU0sd0JBQXdCLENBQUM7O0FBTTdFLE1BQU0sT0FBTywyQkFBMkI7SUFDOUIsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoQyxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUV0QixLQUFLLEdBQXNCLEVBQUUsQ0FBQztJQUN0RCxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUc5QyxhQUFhLENBQUMsS0FBaUI7UUFDN0IsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFDM0IsS0FBSztZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhO1lBQzdDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUM7d0dBaEJVLDJCQUEyQjs0RkFBM0IsMkJBQTJCOzs0RkFBM0IsMkJBQTJCO2tCQUp2QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7b0JBQ3JDLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs4QkFLbUMsS0FBSztzQkFBdEMsS0FBSzt1QkFBQyx5QkFBeUI7Z0JBQ3RCLE1BQU07c0JBQWYsTUFBTTtnQkFHUCxhQUFhO3NCQURaLFlBQVk7dUJBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgaW5qZWN0LCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250ZXh0TWVudVNlcnZpY2UsIENvbnRleHRNZW51SXRlbSB9IGZyb20gJy4vY29udGV4dC1tZW51LnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdG9sbGVDb250ZXh0TWVudVRyaWdnZXJdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBDb250ZXh0TWVudVRyaWdnZXJEaXJlY3RpdmUge1xuICBwcml2YXRlIGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgY29udGV4dE1lbnVTZXJ2aWNlID0gaW5qZWN0KENvbnRleHRNZW51U2VydmljZSk7XG5cbiAgQElucHV0KCd0b2xsZUNvbnRleHRNZW51VHJpZ2dlcicpIGl0ZW1zOiBDb250ZXh0TWVudUl0ZW1bXSA9IFtdO1xuICBAT3V0cHV0KCkgYWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignY29udGV4dG1lbnUnLCBbJyRldmVudCddKVxuICBvbkNvbnRleHRNZW51KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5jb250ZXh0TWVudVNlcnZpY2Uub3Blbih7XG4gICAgICBldmVudCxcbiAgICAgIGl0ZW1zOiB0aGlzLml0ZW1zLFxuICAgICAgdHJpZ2dlckVsZW1lbnQ6IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgb25BY3Rpb246IChhY3Rpb25JZCkgPT4gdGhpcy5hY3Rpb24uZW1pdChhY3Rpb25JZClcbiAgICB9KTtcbiAgfVxufVxuIl19
|