cloud-ide-element 1.0.2 → 1.0.5
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/README.md +63 -271
- package/fesm2022/cloud-ide-element.mjs +614 -618
- package/fesm2022/cloud-ide-element.mjs.map +1 -1
- package/index.d.ts +1362 -3
- package/package.json +4 -31
- package/esm2022/cloud-ide-element.mjs +0 -5
- package/esm2022/lib/components/confirmation-modal/confirmation-modal.component.mjs +0 -182
- package/esm2022/lib/components/data-grid/data-grid.component.mjs +0 -1363
- package/esm2022/lib/components/data-grid/data-grid.types.mjs +0 -37
- package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -396
- package/esm2022/lib/components/global-notifications/global-notifications.component.mjs +0 -30
- package/esm2022/lib/components/json-editor/json-editor.component.mjs +0 -521
- package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +0 -33
- package/esm2022/lib/components/toast-notification/toast-notification.component.mjs +0 -152
- package/esm2022/lib/elements/button/cide-ele-button.component.mjs +0 -249
- package/esm2022/lib/elements/file-input/file-input.component.mjs +0 -83
- package/esm2022/lib/elements/icon/icon.component.mjs +0 -26
- package/esm2022/lib/elements/input/input.component.mjs +0 -467
- package/esm2022/lib/elements/select/select.component.mjs +0 -471
- package/esm2022/lib/elements/spinner/spinner.component.mjs +0 -32
- package/esm2022/lib/elements/tab/cide-ele-tab.component.mjs +0 -74
- package/esm2022/lib/elements/textarea/textarea.component.mjs +0 -157
- package/esm2022/lib/services/confirmation.service.mjs +0 -151
- package/esm2022/lib/services/dropdown-manager.service.mjs +0 -93
- package/esm2022/lib/services/notification.service.mjs +0 -196
- package/esm2022/lib/utils/directives/resizer/resizer.directive.mjs +0 -231
- package/esm2022/lib/utils/directives/tooltip/tooltip.directive.mjs +0 -294
- package/esm2022/lib/utils/pipes/capitalize/capitalize.pipe.mjs +0 -38
- package/esm2022/lib/utils/services/elements/elements.service.mjs +0 -39
- package/esm2022/public-api.mjs +0 -31
- package/lib/components/confirmation-modal/confirmation-modal.component.d.ts +0 -16
- package/lib/components/data-grid/data-grid.component.d.ts +0 -244
- package/lib/components/data-grid/data-grid.types.d.ts +0 -146
- package/lib/components/dropdown/dropdown.component.d.ts +0 -75
- package/lib/components/global-notifications/global-notifications.component.d.ts +0 -5
- package/lib/components/json-editor/json-editor.component.d.ts +0 -116
- package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +0 -11
- package/lib/components/toast-notification/toast-notification.component.d.ts +0 -13
- package/lib/elements/button/cide-ele-button.component.d.ts +0 -85
- package/lib/elements/file-input/file-input.component.d.ts +0 -25
- package/lib/elements/icon/icon.component.d.ts +0 -9
- package/lib/elements/input/input.component.d.ts +0 -182
- package/lib/elements/select/select.component.d.ts +0 -91
- package/lib/elements/spinner/spinner.component.d.ts +0 -19
- package/lib/elements/tab/cide-ele-tab.component.d.ts +0 -26
- package/lib/elements/textarea/textarea.component.d.ts +0 -47
- package/lib/services/confirmation.service.d.ts +0 -65
- package/lib/services/dropdown-manager.service.d.ts +0 -22
- package/lib/services/notification.service.d.ts +0 -81
- package/lib/utils/directives/resizer/resizer.directive.d.ts +0 -44
- package/lib/utils/directives/tooltip/tooltip.directive.d.ts +0 -43
- package/lib/utils/pipes/capitalize/capitalize.pipe.d.ts +0 -7
- package/lib/utils/services/elements/elements.service.d.ts +0 -12
- package/public-api.d.ts +0 -22
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import { Injectable, signal, computed } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class NotificationService {
|
|
4
|
-
constructor() {
|
|
5
|
-
this.notifications = signal([]);
|
|
6
|
-
this.maxNotifications = 5; // Maximum notifications to show at once
|
|
7
|
-
// Computed signals
|
|
8
|
-
this.activeNotifications = computed(() => this.notifications().filter(n => n.isVisible));
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Show a success notification
|
|
12
|
-
*/
|
|
13
|
-
success(message, options) {
|
|
14
|
-
return this.show({
|
|
15
|
-
message,
|
|
16
|
-
type: 'success',
|
|
17
|
-
icon: 'check_circle',
|
|
18
|
-
duration: 3000,
|
|
19
|
-
...options
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Show an error notification
|
|
24
|
-
*/
|
|
25
|
-
error(message, options) {
|
|
26
|
-
return this.show({
|
|
27
|
-
message,
|
|
28
|
-
type: 'error',
|
|
29
|
-
icon: 'error',
|
|
30
|
-
duration: 5000,
|
|
31
|
-
...options
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Show a warning notification
|
|
36
|
-
*/
|
|
37
|
-
warning(message, options) {
|
|
38
|
-
return this.show({
|
|
39
|
-
message,
|
|
40
|
-
type: 'warning',
|
|
41
|
-
icon: 'warning',
|
|
42
|
-
duration: 4000,
|
|
43
|
-
...options
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Show an info notification
|
|
48
|
-
*/
|
|
49
|
-
info(message, options) {
|
|
50
|
-
return this.show({
|
|
51
|
-
message,
|
|
52
|
-
type: 'info',
|
|
53
|
-
icon: 'info',
|
|
54
|
-
duration: 3000,
|
|
55
|
-
...options
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Show a notification with undo functionality
|
|
60
|
-
*/
|
|
61
|
-
showWithUndo(message, undoAction, options) {
|
|
62
|
-
return this.show({
|
|
63
|
-
message,
|
|
64
|
-
type: 'info',
|
|
65
|
-
icon: 'info',
|
|
66
|
-
duration: 8000,
|
|
67
|
-
showUndo: true,
|
|
68
|
-
undoAction,
|
|
69
|
-
undoText: 'Undo',
|
|
70
|
-
...options
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Show a notification for reversible destructive actions
|
|
75
|
-
*/
|
|
76
|
-
showReversibleAction(action, itemName, undoAction, options) {
|
|
77
|
-
return this.showWithUndo(`${action} "${itemName}"`, undoAction, {
|
|
78
|
-
type: 'warning',
|
|
79
|
-
icon: 'delete',
|
|
80
|
-
title: `${action} completed`,
|
|
81
|
-
...options
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Show a notification for background tasks
|
|
86
|
-
*/
|
|
87
|
-
showBackgroundTask(taskName, isComplete = true, options) {
|
|
88
|
-
return this.show({
|
|
89
|
-
message: isComplete ? `${taskName} completed successfully` : `${taskName} in progress...`,
|
|
90
|
-
type: isComplete ? 'success' : 'info',
|
|
91
|
-
icon: isComplete ? 'check_circle' : 'sync',
|
|
92
|
-
duration: isComplete ? 3000 : 0, // Don't auto-dismiss for in-progress tasks
|
|
93
|
-
...options
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Core show method
|
|
98
|
-
*/
|
|
99
|
-
show(options) {
|
|
100
|
-
const notification = {
|
|
101
|
-
id: this.generateId(),
|
|
102
|
-
message: options.message,
|
|
103
|
-
type: options.type || 'info',
|
|
104
|
-
duration: options.duration || 3000,
|
|
105
|
-
showUndo: options.showUndo || false,
|
|
106
|
-
undoAction: options.undoAction,
|
|
107
|
-
undoText: options.undoText || 'Undo',
|
|
108
|
-
icon: options.icon || this.getDefaultIcon(options.type || 'info'),
|
|
109
|
-
title: options.title,
|
|
110
|
-
timestamp: Date.now(),
|
|
111
|
-
isVisible: true
|
|
112
|
-
};
|
|
113
|
-
this.addNotification(notification);
|
|
114
|
-
return notification.id;
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Remove a specific notification
|
|
118
|
-
*/
|
|
119
|
-
remove(id) {
|
|
120
|
-
this.notifications.update(notifications => notifications.map(n => n.id === id ? { ...n, isVisible: false } : n));
|
|
121
|
-
// Remove from array after animation
|
|
122
|
-
setTimeout(() => {
|
|
123
|
-
this.notifications.update(notifications => notifications.filter(n => n.id !== id));
|
|
124
|
-
}, 300);
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Remove all notifications
|
|
128
|
-
*/
|
|
129
|
-
clearAll() {
|
|
130
|
-
this.notifications.update(notifications => notifications.map(n => ({ ...n, isVisible: false })));
|
|
131
|
-
setTimeout(() => {
|
|
132
|
-
this.notifications.set([]);
|
|
133
|
-
}, 300);
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Execute undo action for a notification
|
|
137
|
-
*/
|
|
138
|
-
executeUndo(id) {
|
|
139
|
-
const notification = this.notifications().find(n => n.id === id);
|
|
140
|
-
if (notification && notification.undoAction) {
|
|
141
|
-
notification.undoAction();
|
|
142
|
-
this.remove(id);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
// Internal methods
|
|
146
|
-
addNotification(notification) {
|
|
147
|
-
this.notifications.update(notifications => {
|
|
148
|
-
const newNotifications = [...notifications, notification];
|
|
149
|
-
// Limit the number of visible notifications
|
|
150
|
-
if (newNotifications.length > this.maxNotifications) {
|
|
151
|
-
// Remove oldest notifications
|
|
152
|
-
const toRemove = newNotifications.length - this.maxNotifications;
|
|
153
|
-
for (let i = 0; i < toRemove; i++) {
|
|
154
|
-
if (newNotifications[i]) {
|
|
155
|
-
newNotifications[i] = { ...newNotifications[i], isVisible: false };
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return newNotifications;
|
|
160
|
-
});
|
|
161
|
-
// Auto-remove after duration (if not 0)
|
|
162
|
-
if (notification.duration > 0) {
|
|
163
|
-
setTimeout(() => {
|
|
164
|
-
this.remove(notification.id);
|
|
165
|
-
}, notification.duration);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
generateId() {
|
|
169
|
-
return `notification-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
170
|
-
}
|
|
171
|
-
getDefaultIcon(type) {
|
|
172
|
-
const iconMap = {
|
|
173
|
-
success: 'check_circle',
|
|
174
|
-
error: 'error',
|
|
175
|
-
warning: 'warning',
|
|
176
|
-
info: 'info'
|
|
177
|
-
};
|
|
178
|
-
return iconMap[type];
|
|
179
|
-
}
|
|
180
|
-
// Public getters for components
|
|
181
|
-
getNotifications() {
|
|
182
|
-
return this.notifications;
|
|
183
|
-
}
|
|
184
|
-
getActiveNotifications() {
|
|
185
|
-
return this.activeNotifications;
|
|
186
|
-
}
|
|
187
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: NotificationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
188
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: NotificationService, providedIn: 'root' }); }
|
|
189
|
-
}
|
|
190
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: NotificationService, decorators: [{
|
|
191
|
-
type: Injectable,
|
|
192
|
-
args: [{
|
|
193
|
-
providedIn: 'root'
|
|
194
|
-
}]
|
|
195
|
-
}], ctorParameters: () => [] });
|
|
196
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtZWxlbWVudC9zcmMvbGliL3NlcnZpY2VzL25vdGlmaWNhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUErQjdELE1BQU0sT0FBTyxtQkFBbUI7SUFTOUI7UUFSUSxrQkFBYSxHQUFHLE1BQU0sQ0FBcUIsRUFBRSxDQUFDLENBQUM7UUFDL0MscUJBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsd0NBQXdDO1FBRXRFLG1CQUFtQjtRQUNuQix3QkFBbUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ2xDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQzlDLENBQUM7SUFFYSxDQUFDO0lBRWhCOztPQUVHO0lBQ0gsT0FBTyxDQUFDLE9BQWUsRUFBRSxPQUFzQztRQUM3RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDZixPQUFPO1lBQ1AsSUFBSSxFQUFFLFNBQVM7WUFDZixJQUFJLEVBQUUsY0FBYztZQUNwQixRQUFRLEVBQUUsSUFBSTtZQUNkLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxPQUFlLEVBQUUsT0FBc0M7UUFDM0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ2YsT0FBTztZQUNQLElBQUksRUFBRSxPQUFPO1lBQ2IsSUFBSSxFQUFFLE9BQU87WUFDYixRQUFRLEVBQUUsSUFBSTtZQUNkLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU8sQ0FB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O1lBQy9CLENBQUMsRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVO1FBQ2hCLE9BQU8sZ0JBQWdCLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNqRixDQUFDO0lBRU8sY0FBYyxDQUFDLElBQThDO1FBQ25FLE1BQU0sT0FBTyxHQUFHO1lBQ2QsT0FBTyxFQUFFLGNBQWM7WUFDdkIsS0FBSyxFQUFFLE9BQU87WUFDZCxPQUFPLEVBQUUsU0FBUztZQUNsQixJQUFJLEVBQUUsTUFBTTtTQUNiLENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0NBQWdDO0lBQ2hDLGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7OEdBek9VLG1CQUFtQjtrSEFBbkIsbUJBQW1CLGNBRmxCLE1BQU07OzJGQUVQLG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwsIGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uT3B0aW9ucyB7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIHR5cGU/OiAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ3dhcm5pbmcnIHwgJ2luZm8nO1xyXG4gIGR1cmF0aW9uPzogbnVtYmVyO1xyXG4gIHNob3dVbmRvPzogYm9vbGVhbjtcclxuICB1bmRvQWN0aW9uPzogKCkgPT4gdm9pZDtcclxuICB1bmRvVGV4dD86IHN0cmluZztcclxuICBpY29uPzogc3RyaW5nO1xyXG4gIHRpdGxlPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbkl0ZW0ge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbWVzc2FnZTogc3RyaW5nO1xyXG4gIHR5cGU6ICdzdWNjZXNzJyB8ICdlcnJvcicgfCAnd2FybmluZycgfCAnaW5mbyc7XHJcbiAgZHVyYXRpb246IG51bWJlcjtcclxuICBzaG93VW5kbzogYm9vbGVhbjtcclxuICB1bmRvQWN0aW9uPzogKCkgPT4gdm9pZDtcclxuICB1bmRvVGV4dDogc3RyaW5nO1xyXG4gIGljb246IHN0cmluZztcclxuICB0aXRsZT86IHN0cmluZztcclxuICB0aW1lc3RhbXA6IG51bWJlcjtcclxuICBpc1Zpc2libGU6IGJvb2xlYW47XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgbm90aWZpY2F0aW9ucyA9IHNpZ25hbDxOb3RpZmljYXRpb25JdGVtW10+KFtdKTtcclxuICBwcml2YXRlIG1heE5vdGlmaWNhdGlvbnMgPSA1OyAvLyBNYXhpbXVtIG5vdGlmaWNhdGlvbnMgdG8gc2hvdyBhdCBvbmNlXHJcblxyXG4gIC8vIENvbXB1dGVkIHNpZ25hbHNcclxuICBhY3RpdmVOb3RpZmljYXRpb25zID0gY29tcHV0ZWQoKCkgPT4gXHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMoKS5maWx0ZXIobiA9PiBuLmlzVmlzaWJsZSlcclxuICApO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgYSBzdWNjZXNzIG5vdGlmaWNhdGlvblxyXG4gICAqL1xyXG4gIHN1Y2Nlc3MobWVzc2FnZTogc3RyaW5nLCBvcHRpb25zPzogUGFydGlhbDxOb3RpZmljYXRpb25PcHRpb25zPik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93KHtcclxuICAgICAgbWVzc2FnZSxcclxuICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxyXG4gICAgICBpY29uOiAnY2hlY2tfY2lyY2xlJyxcclxuICAgICAgZHVyYXRpb246IDMwMDAsXHJcbiAgICAgIC4uLm9wdGlvbnNcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhbiBlcnJvciBub3RpZmljYXRpb25cclxuICAgKi9cclxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBQYXJ0aWFsPE5vdGlmaWNhdGlvbk9wdGlvbnM+KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNob3coe1xyXG4gICAgICBtZXNzYWdlLFxyXG4gICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICBpY29uOiAnZXJyb3InLFxyXG4gICAgICBkdXJhdGlvbjogNTAwMCxcclxuICAgICAgLi4ub3B0aW9uc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IGEgd2FybmluZyBub3RpZmljYXRpb25cclxuICAgKi9cclxuICB3YXJuaW5nKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IFBhcnRpYWw8Tm90aWZpY2F0aW9uT3B0aW9ucz4pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hvdyh7XHJcbiAgICAgIG1lc3NhZ2UsXHJcbiAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgaWNvbjogJ3dhcm5pbmcnLFxyXG4gICAgICBkdXJhdGlvbjogNDAwMCxcclxuICAgICAgLi4ub3B0aW9uc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93IGFuIGluZm8gbm90aWZpY2F0aW9uXHJcbiAgICovXHJcbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBQYXJ0aWFsPE5vdGlmaWNhdGlvbk9wdGlvbnM+KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNob3coe1xyXG4gICAgICBtZXNzYWdlLFxyXG4gICAgICB0eXBlOiAnaW5mbycsXHJcbiAgICAgIGljb246ICdpbmZvJyxcclxuICAgICAgZHVyYXRpb246IDMwMDAsXHJcbiAgICAgIC4uLm9wdGlvbnNcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhIG5vdGlmaWNhdGlvbiB3aXRoIHVuZG8gZnVuY3Rpb25hbGl0eVxyXG4gICAqL1xyXG4gIHNob3dXaXRoVW5kbyhcclxuICAgIG1lc3NhZ2U6IHN0cmluZywgXHJcbiAgICB1bmRvQWN0aW9uOiAoKSA9PiB2b2lkLCBcclxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPE5vdGlmaWNhdGlvbk9wdGlvbnM+XHJcbiAgKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNob3coe1xyXG4gICAgICBtZXNzYWdlLFxyXG4gICAgICB0eXBlOiAnaW5mbycsXHJcbiAgICAgIGljb246ICdpbmZvJyxcclxuICAgICAgZHVyYXRpb246IDgwMDAsXHJcbiAgICAgIHNob3dVbmRvOiB0cnVlLFxyXG4gICAgICB1bmRvQWN0aW9uLFxyXG4gICAgICB1bmRvVGV4dDogJ1VuZG8nLFxyXG4gICAgICAuLi5vcHRpb25zXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgYSBub3RpZmljYXRpb24gZm9yIHJldmVyc2libGUgZGVzdHJ1Y3RpdmUgYWN0aW9uc1xyXG4gICAqL1xyXG4gIHNob3dSZXZlcnNpYmxlQWN0aW9uKFxyXG4gICAgYWN0aW9uOiBzdHJpbmcsXHJcbiAgICBpdGVtTmFtZTogc3RyaW5nLFxyXG4gICAgdW5kb0FjdGlvbjogKCkgPT4gdm9pZCxcclxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPE5vdGlmaWNhdGlvbk9wdGlvbnM+XHJcbiAgKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNob3dXaXRoVW5kbyhcclxuICAgICAgYCR7YWN0aW9ufSBcIiR7aXRlbU5hbWV9XCJgLFxyXG4gICAgICB1bmRvQWN0aW9uLFxyXG4gICAgICB7XHJcbiAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICAgIGljb246ICdkZWxldGUnLFxyXG4gICAgICAgIHRpdGxlOiBgJHthY3Rpb259IGNvbXBsZXRlZGAsXHJcbiAgICAgICAgLi4ub3B0aW9uc1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhIG5vdGlmaWNhdGlvbiBmb3IgYmFja2dyb3VuZCB0YXNrc1xyXG4gICAqL1xyXG4gIHNob3dCYWNrZ3JvdW5kVGFzayhcclxuICAgIHRhc2tOYW1lOiBzdHJpbmcsXHJcbiAgICBpc0NvbXBsZXRlOiBib29sZWFuID0gdHJ1ZSxcclxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPE5vdGlmaWNhdGlvbk9wdGlvbnM+XHJcbiAgKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNob3coe1xyXG4gICAgICBtZXNzYWdlOiBpc0NvbXBsZXRlID8gYCR7dGFza05hbWV9IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgIDogYCR7dGFza05hbWV9IGluIHByb2dyZXNzLi4uYCxcclxuICAgICAgdHlwZTogaXNDb21wbGV0ZSA/ICdzdWNjZXNzJyA6ICdpbmZvJyxcclxuICAgICAgaWNvbjogaXNDb21wbGV0ZSA/ICdjaGVja19jaXJjbGUnIDogJ3N5bmMnLFxyXG4gICAgICBkdXJhdGlvbjogaXNDb21wbGV0ZSA/IDMwMDAgOiAwLCAvLyBEb24ndCBhdXRvLWRpc21pc3MgZm9yIGluLXByb2dyZXNzIHRhc2tzXHJcbiAgICAgIC4uLm9wdGlvbnNcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29yZSBzaG93IG1ldGhvZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2hvdyhvcHRpb25zOiBOb3RpZmljYXRpb25PcHRpb25zKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uSXRlbSA9IHtcclxuICAgICAgaWQ6IHRoaXMuZ2VuZXJhdGVJZCgpLFxyXG4gICAgICBtZXNzYWdlOiBvcHRpb25zLm1lc3NhZ2UsXHJcbiAgICAgIHR5cGU6IG9wdGlvbnMudHlwZSB8fCAnaW5mbycsXHJcbiAgICAgIGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uIHx8IDMwMDAsXHJcbiAgICAgIHNob3dVbmRvOiBvcHRpb25zLnNob3dVbmRvIHx8IGZhbHNlLFxyXG4gICAgICB1bmRvQWN0aW9uOiBvcHRpb25zLnVuZG9BY3Rpb24sXHJcbiAgICAgIHVuZG9UZXh0OiBvcHRpb25zLnVuZG9UZXh0IHx8ICdVbmRvJyxcclxuICAgICAgaWNvbjogb3B0aW9ucy5pY29uIHx8IHRoaXMuZ2V0RGVmYXVsdEljb24ob3B0aW9ucy50eXBlIHx8ICdpbmZvJyksXHJcbiAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxyXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXHJcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmFkZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xyXG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbi5pZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBhIHNwZWNpZmljIG5vdGlmaWNhdGlvblxyXG4gICAqL1xyXG4gIHJlbW92ZShpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMudXBkYXRlKG5vdGlmaWNhdGlvbnMgPT4gXHJcbiAgICAgIG5vdGlmaWNhdGlvbnMubWFwKG4gPT4gXHJcbiAgICAgICAgbi5pZCA9PT0gaWQgPyB7IC4uLm4sIGlzVmlzaWJsZTogZmFsc2UgfSA6IG5cclxuICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBSZW1vdmUgZnJvbSBhcnJheSBhZnRlciBhbmltYXRpb25cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbnMudXBkYXRlKG5vdGlmaWNhdGlvbnMgPT4gXHJcbiAgICAgICAgbm90aWZpY2F0aW9ucy5maWx0ZXIobiA9PiBuLmlkICE9PSBpZClcclxuICAgICAgKTtcclxuICAgIH0sIDMwMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYWxsIG5vdGlmaWNhdGlvbnNcclxuICAgKi9cclxuICBjbGVhckFsbCgpOiB2b2lkIHtcclxuICAgIHRoaXMubm90aWZpY2F0aW9ucy51cGRhdGUobm90aWZpY2F0aW9ucyA9PiBcclxuICAgICAgbm90aWZpY2F0aW9ucy5tYXAobiA9PiAoeyAuLi5uLCBpc1Zpc2libGU6IGZhbHNlIH0pKVxyXG4gICAgKTtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnNldChbXSk7XHJcbiAgICB9LCAzMDApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhlY3V0ZSB1bmRvIGFjdGlvbiBmb3IgYSBub3RpZmljYXRpb25cclxuICAgKi9cclxuICBleGVjdXRlVW5kbyhpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBub3RpZmljYXRpb24gPSB0aGlzLm5vdGlmaWNhdGlvbnMoKS5maW5kKG4gPT4gbi5pZCA9PT0gaWQpO1xyXG4gICAgaWYgKG5vdGlmaWNhdGlvbiAmJiBub3RpZmljYXRpb24udW5kb0FjdGlvbikge1xyXG4gICAgICBub3RpZmljYXRpb24udW5kb0FjdGlvbigpO1xyXG4gICAgICB0aGlzLnJlbW92ZShpZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBJbnRlcm5hbCBtZXRob2RzXHJcbiAgcHJpdmF0ZSBhZGROb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb25JdGVtKTogdm9pZCB7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMudXBkYXRlKG5vdGlmaWNhdGlvbnMgPT4ge1xyXG4gICAgICBjb25zdCBuZXdOb3RpZmljYXRpb25zID0gWy4uLm5vdGlmaWNhdGlvbnMsIG5vdGlmaWNhdGlvbl07XHJcbiAgICAgIFxyXG4gICAgICAvLyBMaW1pdCB0aGUgbnVtYmVyIG9mIHZpc2libGUgbm90aWZpY2F0aW9uc1xyXG4gICAgICBpZiAobmV3Tm90aWZpY2F0aW9ucy5sZW5ndGggPiB0aGlzLm1heE5vdGlmaWNhdGlvbnMpIHtcclxuICAgICAgICAvLyBSZW1vdmUgb2xkZXN0IG5vdGlmaWNhdGlvbnNcclxuICAgICAgICBjb25zdCB0b1JlbW92ZSA9IG5ld05vdGlmaWNhdGlvbnMubGVuZ3RoIC0gdGhpcy5tYXhOb3RpZmljYXRpb25zO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9SZW1vdmU7IGkrKykge1xyXG4gICAgICAgICAgaWYgKG5ld05vdGlmaWNhdGlvbnNbaV0pIHtcclxuICAgICAgICAgICAgbmV3Tm90aWZpY2F0aW9uc1tpXSA9IHsgLi4ubmV3Tm90aWZpY2F0aW9uc1tpXSwgaXNWaXNpYmxlOiBmYWxzZSB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgcmV0dXJuIG5ld05vdGlmaWNhdGlvbnM7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBBdXRvLXJlbW92ZSBhZnRlciBkdXJhdGlvbiAoaWYgbm90IDApXHJcbiAgICBpZiAobm90aWZpY2F0aW9uLmR1cmF0aW9uID4gMCkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnJlbW92ZShub3RpZmljYXRpb24uaWQpO1xyXG4gICAgICB9LCBub3RpZmljYXRpb24uZHVyYXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUlkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYG5vdGlmaWNhdGlvbi0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERlZmF1bHRJY29uKHR5cGU6ICdzdWNjZXNzJyB8ICdlcnJvcicgfCAnd2FybmluZycgfCAnaW5mbycpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaWNvbk1hcCA9IHtcclxuICAgICAgc3VjY2VzczogJ2NoZWNrX2NpcmNsZScsXHJcbiAgICAgIGVycm9yOiAnZXJyb3InLFxyXG4gICAgICB3YXJuaW5nOiAnd2FybmluZycsXHJcbiAgICAgIGluZm86ICdpbmZvJ1xyXG4gICAgfTtcclxuICAgIHJldHVybiBpY29uTWFwW3R5cGVdO1xyXG4gIH1cclxuXHJcbiAgLy8gUHVibGljIGdldHRlcnMgZm9yIGNvbXBvbmVudHNcclxuICBnZXROb3RpZmljYXRpb25zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9ucztcclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZU5vdGlmaWNhdGlvbnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVOb3RpZmljYXRpb25zO1xyXG4gIH1cclxufVxyXG5cclxuIl19
|
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
/**
|
|
4
|
-
<!-- Basic horizontal (left-right) layout -->
|
|
5
|
-
<div class="panel-container">
|
|
6
|
-
<div class="left-panel">
|
|
7
|
-
Left Panel Content
|
|
8
|
-
</div>
|
|
9
|
-
|
|
10
|
-
<div cideEleResizer direction="horizontal" [minPrevSize]="100" [minNextSize]="100">resize
|
|
11
|
-
</div>
|
|
12
|
-
|
|
13
|
-
<div class="right-panel">
|
|
14
|
-
Right Panel Content
|
|
15
|
-
</div>
|
|
16
|
-
</div>
|
|
17
|
-
|
|
18
|
-
<!-- Basic vertical (top-bottom) layout -->
|
|
19
|
-
<div class="panel-container-vertical">
|
|
20
|
-
<div class="top-panel">
|
|
21
|
-
Top Panel Content
|
|
22
|
-
</div>
|
|
23
|
-
|
|
24
|
-
<div cideEleResizer direction="vertical" [minPrevSize]="50" [minNextSize]="50">resize
|
|
25
|
-
</div>
|
|
26
|
-
|
|
27
|
-
<div class="bottom-panel">
|
|
28
|
-
Bottom Panel Content
|
|
29
|
-
</div>
|
|
30
|
-
</div>
|
|
31
|
-
|
|
32
|
-
<!-- Using with custom selectors -->
|
|
33
|
-
<div class="complex-layout">
|
|
34
|
-
<div id="panel1">Panel 1</div>
|
|
35
|
-
<div id="panel2">Panel 2</div>
|
|
36
|
-
|
|
37
|
-
<div cideEleResizer direction="horizontal" prevElementSelector="#panel1" nextElementSelector="#panel2"
|
|
38
|
-
[usePercentage]="true">resize
|
|
39
|
-
</div>
|
|
40
|
-
|
|
41
|
-
<div id="panel3">Panel 3</div>
|
|
42
|
-
</div>
|
|
43
|
-
*/
|
|
44
|
-
export class CideEleResizerDirective {
|
|
45
|
-
constructor(el, renderer) {
|
|
46
|
-
this.el = el;
|
|
47
|
-
this.renderer = renderer;
|
|
48
|
-
this.direction = 'horizontal';
|
|
49
|
-
this.to = "";
|
|
50
|
-
this.prevElementSelector = ''; // Selector for previous element
|
|
51
|
-
this.nextElementSelector = ''; // Selector for next element
|
|
52
|
-
this.parentElementSelector = ''; // Selector for parent element
|
|
53
|
-
this.minPrevSize = 0; // Minimum size of previous element (px)
|
|
54
|
-
this.minNextSize = 0; // Minimum size of next element (px)
|
|
55
|
-
this.usePercentage = false; // Use percentage instead of pixels
|
|
56
|
-
this.resizeStart = new EventEmitter();
|
|
57
|
-
this.resizing = new EventEmitter();
|
|
58
|
-
this.resizeEnd = new EventEmitter();
|
|
59
|
-
this.isResizing = false;
|
|
60
|
-
this.startPosition = 0;
|
|
61
|
-
this.prevElement = null;
|
|
62
|
-
this.nextElement = null;
|
|
63
|
-
this.prevSize = 0;
|
|
64
|
-
this.nextSize = 0;
|
|
65
|
-
this.containerSize = 0;
|
|
66
|
-
this.startPrevSize = 0;
|
|
67
|
-
this.startNextSize = 0;
|
|
68
|
-
this.onMouseMove = (event) => {
|
|
69
|
-
if (!this.isResizing)
|
|
70
|
-
return;
|
|
71
|
-
// Calculate movement
|
|
72
|
-
const currentPosition = this.direction === 'horizontal' ? event.clientX : event.clientY;
|
|
73
|
-
const delta = currentPosition - this.startPosition;
|
|
74
|
-
// Calculate new sizes
|
|
75
|
-
let newPrevSize = this.startPrevSize + delta;
|
|
76
|
-
let newNextSize = this.startNextSize - delta;
|
|
77
|
-
// Apply constraints
|
|
78
|
-
if (newPrevSize < this.minPrevSize) {
|
|
79
|
-
const diff = this.minPrevSize - newPrevSize;
|
|
80
|
-
newPrevSize = this.minPrevSize;
|
|
81
|
-
newNextSize = this.startNextSize - delta + diff;
|
|
82
|
-
// skip if previsus size is equal to the minimum size, note above code is dark code which will not be executed
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
if (newNextSize < this.minNextSize) {
|
|
86
|
-
const diff = this.minNextSize - newNextSize;
|
|
87
|
-
newNextSize = this.minNextSize;
|
|
88
|
-
newPrevSize = this.startPrevSize + delta - diff;
|
|
89
|
-
// skip if next size is equal to the minimum size, note above code is dark code which will not be executed
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
// Update sizes
|
|
93
|
-
this.prevSize = newPrevSize;
|
|
94
|
-
this.nextSize = newNextSize;
|
|
95
|
-
// Apply new sizes
|
|
96
|
-
if (this.usePercentage) {
|
|
97
|
-
const prevPercent = (newPrevSize / this.containerSize) * 100;
|
|
98
|
-
const nextPercent = (newNextSize / this.containerSize) * 100;
|
|
99
|
-
this.renderer.setStyle(this.prevElement, this.getSizeProperty(), `${prevPercent}%`);
|
|
100
|
-
this.renderer.setStyle(this.nextElement, this.getSizeProperty(), `${nextPercent}%`);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
this.renderer.setStyle(this.prevElement, this.getSizeProperty(), `${newPrevSize}px`);
|
|
104
|
-
this.renderer.setStyle(this.nextElement, this.getSizeProperty(), `${newNextSize}px`);
|
|
105
|
-
}
|
|
106
|
-
// Emit resizing event
|
|
107
|
-
this.resizing.emit({ prevSize: newPrevSize, nextSize: newNextSize });
|
|
108
|
-
};
|
|
109
|
-
this.onMouseUp = () => {
|
|
110
|
-
this.isResizing = false;
|
|
111
|
-
// Remove event listeners
|
|
112
|
-
document.removeEventListener('mousemove', this.onMouseMove);
|
|
113
|
-
document.removeEventListener('mouseup', this.onMouseUp);
|
|
114
|
-
// Restore text selection
|
|
115
|
-
document.body.style.userSelect = '';
|
|
116
|
-
// Emit resizeEnd event
|
|
117
|
-
if (this.prevElement && this.nextElement) {
|
|
118
|
-
this.resizeEnd.emit({ prevSize: this.prevSize, nextSize: this.nextSize });
|
|
119
|
-
}
|
|
120
|
-
// Remove visual feedback
|
|
121
|
-
this.renderer.removeClass(this.el.nativeElement, 'resizing');
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
ngOnInit() {
|
|
125
|
-
// Set cursor style based on direction
|
|
126
|
-
this.renderer.setStyle(this.el.nativeElement, 'cursor', this.direction === 'horizontal' ? 'ew-resize' : 'ns-resize');
|
|
127
|
-
// Add a class to help with styling
|
|
128
|
-
this.renderer.addClass(this.el.nativeElement, 'panel-resizer');
|
|
129
|
-
this.renderer.addClass(this.el.nativeElement, `panel-resizer-${this.direction}`);
|
|
130
|
-
this.renderer.addClass(this.el.nativeElement, `cide-lyt-devider-${this.direction}`);
|
|
131
|
-
if (this.to) {
|
|
132
|
-
this.renderer.addClass(this.el.nativeElement, `cide-lyt-devider-${this.direction}-${this.to}`);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
onMouseDown(event) {
|
|
136
|
-
event.preventDefault();
|
|
137
|
-
// Get the elements to resize
|
|
138
|
-
this.prevElement = this.getPrevElement();
|
|
139
|
-
this.nextElement = this.getNextElement();
|
|
140
|
-
// if (!this.prevElement || !this.nextElement) {
|
|
141
|
-
// console.error('Could not find elements to resize');
|
|
142
|
-
// return;
|
|
143
|
-
// }
|
|
144
|
-
// Get container size
|
|
145
|
-
const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;
|
|
146
|
-
if (parent) {
|
|
147
|
-
console.log(parent.offsetWidth, "parent.offsetWidth");
|
|
148
|
-
this.containerSize = this.direction === 'horizontal'
|
|
149
|
-
? parent.offsetWidth
|
|
150
|
-
: parent.offsetHeight;
|
|
151
|
-
}
|
|
152
|
-
// Store initial positions and sizes
|
|
153
|
-
this.startPosition = this.direction === 'horizontal' ? event.clientX : event.clientY;
|
|
154
|
-
if (this.prevElement) {
|
|
155
|
-
console.log(this.prevElement.offsetWidth, "this.prevElement.offsetWidth");
|
|
156
|
-
this.startPrevSize = this.direction === 'horizontal'
|
|
157
|
-
? this.prevElement.offsetWidth
|
|
158
|
-
: this.prevElement.offsetHeight;
|
|
159
|
-
}
|
|
160
|
-
if (this.nextElement) {
|
|
161
|
-
console.log(this.nextElement.offsetWidth, "this.nextElement.offsetWidth");
|
|
162
|
-
this.startNextSize = this.direction === 'horizontal'
|
|
163
|
-
? this.nextElement.offsetWidth
|
|
164
|
-
: this.nextElement.offsetHeight;
|
|
165
|
-
}
|
|
166
|
-
this.prevSize = this.startPrevSize;
|
|
167
|
-
this.nextSize = this.startNextSize;
|
|
168
|
-
this.isResizing = true;
|
|
169
|
-
// Add event listeners
|
|
170
|
-
document.addEventListener('mousemove', this.onMouseMove);
|
|
171
|
-
document.addEventListener('mouseup', this.onMouseUp);
|
|
172
|
-
// Disable text selection
|
|
173
|
-
document.body.style.userSelect = 'none';
|
|
174
|
-
// Emit resizeStart event
|
|
175
|
-
this.resizeStart.emit();
|
|
176
|
-
// Add visual feedback
|
|
177
|
-
this.renderer.addClass(this.el.nativeElement, 'resizing');
|
|
178
|
-
}
|
|
179
|
-
getPrevElement() {
|
|
180
|
-
if (this.prevElementSelector) {
|
|
181
|
-
const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;
|
|
182
|
-
return parent?.querySelector(this.prevElementSelector) || null;
|
|
183
|
-
}
|
|
184
|
-
return this.el.nativeElement.previousElementSibling;
|
|
185
|
-
}
|
|
186
|
-
getNextElement() {
|
|
187
|
-
if (this.nextElementSelector) {
|
|
188
|
-
const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;
|
|
189
|
-
return parent?.querySelector(this.nextElementSelector) || null;
|
|
190
|
-
}
|
|
191
|
-
return this.el.nativeElement.nextElementSibling;
|
|
192
|
-
}
|
|
193
|
-
getSizeProperty() {
|
|
194
|
-
return this.direction === 'horizontal' ? 'width' : 'height';
|
|
195
|
-
}
|
|
196
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideEleResizerDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
197
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: CideEleResizerDirective, isStandalone: true, selector: "[cideEleResizer]", inputs: { direction: "direction", to: "to", prevElementSelector: "prevElementSelector", nextElementSelector: "nextElementSelector", parentElementSelector: "parentElementSelector", minPrevSize: "minPrevSize", minNextSize: "minNextSize", usePercentage: "usePercentage" }, outputs: { resizeStart: "resizeStart", resizing: "resizing", resizeEnd: "resizeEnd" }, host: { listeners: { "mousedown": "onMouseDown($event)" } }, ngImport: i0 }); }
|
|
198
|
-
}
|
|
199
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideEleResizerDirective, decorators: [{
|
|
200
|
-
type: Directive,
|
|
201
|
-
args: [{
|
|
202
|
-
selector: '[cideEleResizer]',
|
|
203
|
-
standalone: true
|
|
204
|
-
}]
|
|
205
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { direction: [{
|
|
206
|
-
type: Input
|
|
207
|
-
}], to: [{
|
|
208
|
-
type: Input
|
|
209
|
-
}], prevElementSelector: [{
|
|
210
|
-
type: Input
|
|
211
|
-
}], nextElementSelector: [{
|
|
212
|
-
type: Input
|
|
213
|
-
}], parentElementSelector: [{
|
|
214
|
-
type: Input
|
|
215
|
-
}], minPrevSize: [{
|
|
216
|
-
type: Input
|
|
217
|
-
}], minNextSize: [{
|
|
218
|
-
type: Input
|
|
219
|
-
}], usePercentage: [{
|
|
220
|
-
type: Input
|
|
221
|
-
}], resizeStart: [{
|
|
222
|
-
type: Output
|
|
223
|
-
}], resizing: [{
|
|
224
|
-
type: Output
|
|
225
|
-
}], resizeEnd: [{
|
|
226
|
-
type: Output
|
|
227
|
-
}], onMouseDown: [{
|
|
228
|
-
type: HostListener,
|
|
229
|
-
args: ['mousedown', ['$event']]
|
|
230
|
-
}] } });
|
|
231
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtZWxlbWVudC9zcmMvbGliL3V0aWxzL2RpcmVjdGl2ZXMvcmVzaXplci9yZXNpemVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBYSxNQUFNLGVBQWUsQ0FBQzs7QUFVcEg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7QUFDSCxNQUFNLE9BQU8sdUJBQXVCO0lBdUJsQyxZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUF0QnRELGNBQVMsR0FBNEIsWUFBWSxDQUFDO1FBQ2xELE9BQUUsR0FBOEIsRUFBRSxDQUFDO1FBQ25DLHdCQUFtQixHQUFHLEVBQUUsQ0FBQyxDQUFFLGdDQUFnQztRQUMzRCx3QkFBbUIsR0FBRyxFQUFFLENBQUMsQ0FBRSw0QkFBNEI7UUFDdkQsMEJBQXFCLEdBQUcsRUFBRSxDQUFDLENBQUUsOEJBQThCO1FBQzNELGdCQUFXLEdBQUcsQ0FBQyxDQUFDLENBQVcsd0NBQXdDO1FBQ25FLGdCQUFXLEdBQUcsQ0FBQyxDQUFDLENBQVcsb0NBQW9DO1FBQy9ELGtCQUFhLEdBQUcsS0FBSyxDQUFDLENBQUssbUNBQW1DO1FBQzdELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUN2QyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQTBDLENBQUM7UUFDdEUsY0FBUyxHQUFHLElBQUksWUFBWSxFQUEwQyxDQUFDO1FBRXpFLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsZ0JBQVcs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YUFBYSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLElBQUksQ0FBQztRQUNqRSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxrQkFBaUMsQ0FBQztJQUNqRSxDQUFDO0lBRU8sZUFBZTtRQUNyQixPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUM5RCxDQUFDOzhHQXpMVSx1QkFBdUI7a0dBQXZCLHVCQUF1Qjs7MkZBQXZCLHVCQUF1QjtrQkE5Q25DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCO3VHQTRDVSxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFnQ1AsV0FBVztzQkFEVixZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgdHlwZSBDaWRlRWxlUmVzaXplckRpcmVjdGlvbiA9ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCc7XHJcbmV4cG9ydCB0eXBlIENpZGVFbGVSZXNpemVyRGlyZWN0aW9uVG8gPSBcInJpZ2h0LXRvLWxlZnRcIiB8IFwibGVmdC10by1yaWdodFwiIHwgXCJcIjtcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2NpZGVFbGVSZXNpemVyXScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZVxyXG59KVxyXG5cclxuLyoqXHJcbjwhLS0gQmFzaWMgaG9yaXpvbnRhbCAobGVmdC1yaWdodCkgbGF5b3V0IC0tPlxyXG48ZGl2IGNsYXNzPVwicGFuZWwtY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGVmdC1wYW5lbFwiPlxyXG4gICAgICAgIExlZnQgUGFuZWwgQ29udGVudFxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjaWRlRWxlUmVzaXplciBkaXJlY3Rpb249XCJob3Jpem9udGFsXCIgW21pblByZXZTaXplXT1cIjEwMFwiIFttaW5OZXh0U2l6ZV09XCIxMDBcIj5yZXNpemVcclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1wYW5lbFwiPlxyXG4gICAgICAgIFJpZ2h0IFBhbmVsIENvbnRlbnRcclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gQmFzaWMgdmVydGljYWwgKHRvcC1ib3R0b20pIGxheW91dCAtLT5cclxuPGRpdiBjbGFzcz1cInBhbmVsLWNvbnRhaW5lci12ZXJ0aWNhbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRvcC1wYW5lbFwiPlxyXG4gICAgICAgIFRvcCBQYW5lbCBDb250ZW50XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNpZGVFbGVSZXNpemVyIGRpcmVjdGlvbj1cInZlcnRpY2FsXCIgW21pblByZXZTaXplXT1cIjUwXCIgW21pbk5leHRTaXplXT1cIjUwXCI+cmVzaXplXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYm90dG9tLXBhbmVsXCI+XHJcbiAgICAgICAgQm90dG9tIFBhbmVsIENvbnRlbnRcclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gVXNpbmcgd2l0aCBjdXN0b20gc2VsZWN0b3JzIC0tPlxyXG48ZGl2IGNsYXNzPVwiY29tcGxleC1sYXlvdXRcIj5cclxuICAgIDxkaXYgaWQ9XCJwYW5lbDFcIj5QYW5lbCAxPC9kaXY+XHJcbiAgICA8ZGl2IGlkPVwicGFuZWwyXCI+UGFuZWwgMjwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2lkZUVsZVJlc2l6ZXIgZGlyZWN0aW9uPVwiaG9yaXpvbnRhbFwiIHByZXZFbGVtZW50U2VsZWN0b3I9XCIjcGFuZWwxXCIgbmV4dEVsZW1lbnRTZWxlY3Rvcj1cIiNwYW5lbDJcIlxyXG4gICAgICAgIFt1c2VQZXJjZW50YWdlXT1cInRydWVcIj5yZXNpemVcclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgaWQ9XCJwYW5lbDNcIj5QYW5lbCAzPC9kaXY+XHJcbjwvZGl2PlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENpZGVFbGVSZXNpemVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBkaXJlY3Rpb246IENpZGVFbGVSZXNpemVyRGlyZWN0aW9uID0gJ2hvcml6b250YWwnO1xyXG4gIEBJbnB1dCgpIHRvOiBDaWRlRWxlUmVzaXplckRpcmVjdGlvblRvID0gXCJcIjtcclxuICBASW5wdXQoKSBwcmV2RWxlbWVudFNlbGVjdG9yID0gJyc7ICAvLyBTZWxlY3RvciBmb3IgcHJldmlvdXMgZWxlbWVudFxyXG4gIEBJbnB1dCgpIG5leHRFbGVtZW50U2VsZWN0b3IgPSAnJzsgIC8vIFNlbGVjdG9yIGZvciBuZXh0IGVsZW1lbnRcclxuICBASW5wdXQoKSBwYXJlbnRFbGVtZW50U2VsZWN0b3IgPSAnJzsgIC8vIFNlbGVjdG9yIGZvciBwYXJlbnQgZWxlbWVudFxyXG4gIEBJbnB1dCgpIG1pblByZXZTaXplID0gMDsgICAgICAgICAgIC8vIE1pbmltdW0gc2l6ZSBvZiBwcmV2aW91cyBlbGVtZW50IChweClcclxuICBASW5wdXQoKSBtaW5OZXh0U2l6ZSA9IDA7ICAgICAgICAgICAvLyBNaW5pbXVtIHNpemUgb2YgbmV4dCBlbGVtZW50IChweClcclxuICBASW5wdXQoKSB1c2VQZXJjZW50YWdlID0gZmFsc2U7ICAgICAvLyBVc2UgcGVyY2VudGFnZSBpbnN0ZWFkIG9mIHBpeGVsc1xyXG4gIEBPdXRwdXQoKSByZXNpemVTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgcmVzaXppbmcgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcHJldlNpemU6IG51bWJlciwgbmV4dFNpemU6IG51bWJlciB9PigpO1xyXG4gIEBPdXRwdXQoKSByZXNpemVFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcHJldlNpemU6IG51bWJlciwgbmV4dFNpemU6IG51bWJlciB9PigpO1xyXG5cclxuICBwcml2YXRlIGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIHN0YXJ0UG9zaXRpb24gPSAwO1xyXG4gIHByaXZhdGUgcHJldkVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBuZXh0RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHByZXZTaXplID0gMDtcclxuICBwcml2YXRlIG5leHRTaXplID0gMDtcclxuICBwcml2YXRlIGNvbnRhaW5lclNpemUgPSAwO1xyXG4gIHByaXZhdGUgc3RhcnRQcmV2U2l6ZSA9IDA7XHJcbiAgcHJpdmF0ZSBzdGFydE5leHRTaXplID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyBTZXQgY3Vyc29yIHN0eWxlIGJhc2VkIG9uIGRpcmVjdGlvblxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAnY3Vyc29yJyxcclxuICAgICAgdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/ICdldy1yZXNpemUnIDogJ25zLXJlc2l6ZSdcclxuICAgICk7XHJcblxyXG4gICAgLy8gQWRkIGEgY2xhc3MgdG8gaGVscCB3aXRoIHN0eWxpbmdcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAncGFuZWwtcmVzaXplcicpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIGBwYW5lbC1yZXNpemVyLSR7dGhpcy5kaXJlY3Rpb259YCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgYGNpZGUtbHl0LWRldmlkZXItJHt0aGlzLmRpcmVjdGlvbn1gKTtcclxuICAgIGlmICh0aGlzLnRvKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCBgY2lkZS1seXQtZGV2aWRlci0ke3RoaXMuZGlyZWN0aW9ufS0ke3RoaXMudG99YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxyXG4gIG9uTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgIC8vIEdldCB0aGUgZWxlbWVudHMgdG8gcmVzaXplXHJcbiAgICB0aGlzLnByZXZFbGVtZW50ID0gdGhpcy5nZXRQcmV2RWxlbWVudCgpO1xyXG4gICAgdGhpcy5uZXh0RWxlbWVudCA9IHRoaXMuZ2V0TmV4dEVsZW1lbnQoKTtcclxuXHJcbiAgICAvLyBpZiAoIXRoaXMucHJldkVsZW1lbnQgfHwgIXRoaXMubmV4dEVsZW1lbnQpIHtcclxuICAgIC8vICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGZpbmQgZWxlbWVudHMgdG8gcmVzaXplJyk7XHJcbiAgICAvLyAgIHJldHVybjtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBHZXQgY29udGFpbmVyIHNpemVcclxuXHJcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudEVsZW1lbnRTZWxlY3RvciA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5wYXJlbnRFbGVtZW50U2VsZWN0b3IpIDogdGhpcy5lbC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHBhcmVudC5vZmZzZXRXaWR0aCwgXCJwYXJlbnQub2Zmc2V0V2lkdGhcIilcclxuICAgICAgdGhpcy5jb250YWluZXJTaXplID0gdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJ1xyXG4gICAgICAgID8gcGFyZW50Lm9mZnNldFdpZHRoXHJcbiAgICAgICAgOiBwYXJlbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIFxyXG4gICAgLy8gU3RvcmUgaW5pdGlhbCBwb3NpdGlvbnMgYW5kIHNpemVzXHJcbiAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0aGlzLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XHJcbiAgICBpZiAodGhpcy5wcmV2RWxlbWVudCkge1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLnByZXZFbGVtZW50Lm9mZnNldFdpZHRoLCBcInRoaXMucHJldkVsZW1lbnQub2Zmc2V0V2lkdGhcIilcclxuICAgICAgdGhpcy5zdGFydFByZXZTaXplID0gdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJ1xyXG4gICAgICAgID8gdGhpcy5wcmV2RWxlbWVudC5vZmZzZXRXaWR0aFxyXG4gICAgICAgIDogdGhpcy5wcmV2RWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5uZXh0RWxlbWVudCkge1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLm5leHRFbGVtZW50Lm9mZnNldFdpZHRoLCBcInRoaXMubmV4dEVsZW1lbnQub2Zmc2V0V2lkdGhcIilcclxuICAgICAgdGhpcy5zdGFydE5leHRTaXplID0gdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJ1xyXG4gICAgICAgID8gdGhpcy5uZXh0RWxlbWVudC5vZmZzZXRXaWR0aFxyXG4gICAgICAgIDogdGhpcy5uZXh0RWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcmV2U2l6ZSA9IHRoaXMuc3RhcnRQcmV2U2l6ZTtcclxuICAgIHRoaXMubmV4dFNpemUgPSB0aGlzLnN0YXJ0TmV4dFNpemU7XHJcblxyXG4gICAgdGhpcy5pc1Jlc2l6aW5nID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJzXHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XHJcblxyXG4gICAgLy8gRGlzYWJsZSB0ZXh0IHNlbGVjdGlvblxyXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnO1xyXG5cclxuICAgIC8vIEVtaXQgcmVzaXplU3RhcnQgZXZlbnRcclxuICAgIHRoaXMucmVzaXplU3RhcnQuZW1pdCgpO1xyXG5cclxuICAgIC8vIEFkZCB2aXN1YWwgZmVlZGJhY2tcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAncmVzaXppbmcnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgIGlmICghdGhpcy5pc1Jlc2l6aW5nKSByZXR1cm47XHJcblxyXG4gICAgLy8gQ2FsY3VsYXRlIG1vdmVtZW50XHJcbiAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPSB0aGlzLmRpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XHJcbiAgICBjb25zdCBkZWx0YSA9IGN1cnJlbnRQb3NpdGlvbiAtIHRoaXMuc3RhcnRQb3NpdGlvbjtcclxuXHJcbiAgICAvLyBDYWxjdWxhdGUgbmV3IHNpemVzXHJcbiAgICBsZXQgbmV3UHJldlNpemUgPSB0aGlzLnN0YXJ0UHJldlNpemUgKyBkZWx0YTtcclxuICAgIGxldCBuZXdOZXh0U2l6ZSA9IHRoaXMuc3RhcnROZXh0U2l6ZSAtIGRlbHRhO1xyXG5cclxuICAgIC8vIEFwcGx5IGNvbnN0cmFpbnRzXHJcbiAgICBpZiAobmV3UHJldlNpemUgPCB0aGlzLm1pblByZXZTaXplKSB7XHJcbiAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLm1pblByZXZTaXplIC0gbmV3UHJldlNpemU7XHJcbiAgICAgIG5ld1ByZXZTaXplID0gdGhpcy5taW5QcmV2U2l6ZTtcclxuICAgICAgbmV3TmV4dFNpemUgPSB0aGlzLnN0YXJ0TmV4dFNpemUgLSBkZWx0YSArIGRpZmY7XHJcbiAgICAgIC8vIHNraXAgaWYgcHJldmlzdXMgc2l6ZSBpcyBlcXVhbCB0byB0aGUgbWluaW11bSBzaXplLCBub3RlIGFib3ZlIGNvZGUgaXMgZGFyayBjb2RlIHdoaWNoIHdpbGwgbm90IGJlIGV4ZWN1dGVkXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobmV3TmV4dFNpemUgPCB0aGlzLm1pbk5leHRTaXplKSB7XHJcbiAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLm1pbk5leHRTaXplIC0gbmV3TmV4dFNpemU7XHJcbiAgICAgIG5ld05leHRTaXplID0gdGhpcy5taW5OZXh0U2l6ZTtcclxuICAgICAgbmV3UHJldlNpemUgPSB0aGlzLnN0YXJ0UHJldlNpemUgKyBkZWx0YSAtIGRpZmY7XHJcbiAgICAgIC8vIHNraXAgaWYgbmV4dCBzaXplIGlzIGVxdWFsIHRvIHRoZSBtaW5pbXVtIHNpemUsIG5vdGUgYWJvdmUgY29kZSBpcyBkYXJrIGNvZGUgd2hpY2ggd2lsbCBub3QgYmUgZXhlY3V0ZWRcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSBzaXplc1xyXG4gICAgdGhpcy5wcmV2U2l6ZSA9IG5ld1ByZXZTaXplO1xyXG4gICAgdGhpcy5uZXh0U2l6ZSA9IG5ld05leHRTaXplO1xyXG5cclxuICAgIC8vIEFwcGx5IG5ldyBzaXplc1xyXG4gICAgaWYgKHRoaXMudXNlUGVyY2VudGFnZSkge1xyXG4gICAgICBjb25zdCBwcmV2UGVyY2VudCA9IChuZXdQcmV2U2l6ZSAvIHRoaXMuY29udGFpbmVyU2l6ZSkgKiAxMDA7XHJcbiAgICAgIGNvbnN0IG5leHRQZXJjZW50ID0gKG5ld05leHRTaXplIC8gdGhpcy5jb250YWluZXJTaXplKSAqIDEwMDtcclxuXHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2RWxlbWVudCwgdGhpcy5nZXRTaXplUHJvcGVydHkoKSwgYCR7cHJldlBlcmNlbnR9JWApO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMubmV4dEVsZW1lbnQsIHRoaXMuZ2V0U2l6ZVByb3BlcnR5KCksIGAke25leHRQZXJjZW50fSVgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wcmV2RWxlbWVudCwgdGhpcy5nZXRTaXplUHJvcGVydHkoKSwgYCR7bmV3UHJldlNpemV9cHhgKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLm5leHRFbGVtZW50LCB0aGlzLmdldFNpemVQcm9wZXJ0eSgpLCBgJHtuZXdOZXh0U2l6ZX1weGApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEVtaXQgcmVzaXppbmcgZXZlbnRcclxuICAgIHRoaXMucmVzaXppbmcuZW1pdCh7IHByZXZTaXplOiBuZXdQcmV2U2l6ZSwgbmV4dFNpemU6IG5ld05leHRTaXplIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk1vdXNlVXAgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmlzUmVzaXppbmcgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XHJcblxyXG4gICAgLy8gUmVzdG9yZSB0ZXh0IHNlbGVjdGlvblxyXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJyc7XHJcblxyXG4gICAgLy8gRW1pdCByZXNpemVFbmQgZXZlbnRcclxuICAgIGlmICh0aGlzLnByZXZFbGVtZW50ICYmIHRoaXMubmV4dEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5yZXNpemVFbmQuZW1pdCh7IHByZXZTaXplOiB0aGlzLnByZXZTaXplLCBuZXh0U2l6ZTogdGhpcy5uZXh0U2l6ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmUgdmlzdWFsIGZlZWRiYWNrXHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3Jlc2l6aW5nJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFByZXZFbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5wcmV2RWxlbWVudFNlbGVjdG9yKSB7XHJcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50RWxlbWVudFNlbGVjdG9yID8gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLnBhcmVudEVsZW1lbnRTZWxlY3RvcikgOiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgcmV0dXJuIHBhcmVudD8ucXVlcnlTZWxlY3Rvcih0aGlzLnByZXZFbGVtZW50U2VsZWN0b3IpIHx8IG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5leHRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5uZXh0RWxlbWVudFNlbGVjdG9yKSB7XHJcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50RWxlbWVudFNlbGVjdG9yID8gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLnBhcmVudEVsZW1lbnRTZWxlY3RvcikgOiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgcmV0dXJuIHBhcmVudD8ucXVlcnlTZWxlY3Rvcih0aGlzLm5leHRFbGVtZW50U2VsZWN0b3IpIHx8IG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2l6ZVByb3BlcnR5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcclxuICB9XHJcbn0iXX0=
|