@ng-atomic/common 19.50.0 → 19.80.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ng-atomic-common-directives-active-control.mjs +51 -60
- package/fesm2022/ng-atomic-common-directives-active-control.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-directives-ios-safari-scroll-buggyfill.mjs +0 -3
- package/fesm2022/ng-atomic-common-directives-ios-safari-scroll-buggyfill.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-directives-prevent-browser-zoom.mjs +0 -3
- package/fesm2022/ng-atomic-common-directives-prevent-browser-zoom.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-interceptors-authorization.mjs +0 -1
- package/fesm2022/ng-atomic-common-interceptors-authorization.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-pipes-columns.mjs +0 -1
- package/fesm2022/ng-atomic-common-pipes-columns.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-pipes-domain.mjs +0 -9
- package/fesm2022/ng-atomic-common-pipes-domain.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-pipes-smart-field.mjs +0 -3
- package/fesm2022/ng-atomic-common-pipes-smart-field.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-app.mjs +1 -3
- package/fesm2022/ng-atomic-common-services-app.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-auth.mjs +14 -25
- package/fesm2022/ng-atomic-common-services-auth.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-editing.mjs +0 -16
- package/fesm2022/ng-atomic-common-services-editing.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-form-_index.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-form-json-schema.mjs +1 -25
- package/fesm2022/ng-atomic-common-services-form-json-schema.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-form.mjs +0 -5
- package/fesm2022/ng-atomic-common-services-form.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-query-resolver.mjs +0 -2
- package/fesm2022/ng-atomic-common-services-query-resolver.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-sheets-actions.mjs +0 -1
- package/fesm2022/ng-atomic-common-services-sheets-actions.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-side-app.mjs +0 -1
- package/fesm2022/ng-atomic-common-services-side-app.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-side-nav-mode.mjs +0 -1
- package/fesm2022/ng-atomic-common-services-side-nav-mode.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-spreadsheet.mjs +2 -39
- package/fesm2022/ng-atomic-common-services-spreadsheet.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-services-ui.mjs +0 -2
- package/fesm2022/ng-atomic-common-services-ui.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-stores-entities.mjs +0 -18
- package/fesm2022/ng-atomic-common-stores-entities.mjs.map +1 -1
- package/fesm2022/ng-atomic-common-utils.mjs +2 -34
- package/fesm2022/ng-atomic-common-utils.mjs.map +1 -1
- package/fesm2022/ng-atomic-common.mjs +56 -121
- package/fesm2022/ng-atomic-common.mjs.map +1 -1
- package/package.json +3 -3
- package/types/ng-atomic-common-directives-active-control.d.ts +2 -27
- package/types/ng-atomic-common-directives-active-control.d.ts.map +1 -1
- package/types/ng-atomic-common-directives-prevent-browser-zoom.d.ts +0 -3
- package/types/ng-atomic-common-directives-prevent-browser-zoom.d.ts.map +1 -1
- package/types/ng-atomic-common-interceptors-authorization.d.ts +0 -1
- package/types/ng-atomic-common-interceptors-authorization.d.ts.map +1 -1
- package/types/ng-atomic-common-pipes-columns.d.ts +0 -1
- package/types/ng-atomic-common-pipes-columns.d.ts.map +1 -1
- package/types/ng-atomic-common-pipes-domain.d.ts +0 -9
- package/types/ng-atomic-common-pipes-domain.d.ts.map +1 -1
- package/types/ng-atomic-common-pipes-smart-field.d.ts +0 -3
- package/types/ng-atomic-common-pipes-smart-field.d.ts.map +1 -1
- package/types/ng-atomic-common-services-auth.d.ts +4 -2
- package/types/ng-atomic-common-services-auth.d.ts.map +1 -1
- package/types/ng-atomic-common-services-editing.d.ts +0 -16
- package/types/ng-atomic-common-services-editing.d.ts.map +1 -1
- package/types/ng-atomic-common-services-form.d.ts +0 -5
- package/types/ng-atomic-common-services-form.d.ts.map +1 -1
- package/types/ng-atomic-common-services-side-nav-mode.d.ts +0 -1
- package/types/ng-atomic-common-services-side-nav-mode.d.ts.map +1 -1
- package/types/ng-atomic-common-services-spreadsheet.d.ts +0 -4
- package/types/ng-atomic-common-services-spreadsheet.d.ts.map +1 -1
- package/types/ng-atomic-common-stores-entities.d.ts +0 -3
- package/types/ng-atomic-common-stores-entities.d.ts.map +1 -1
- package/types/ng-atomic-common-utils.d.ts +0 -24
- package/types/ng-atomic-common-utils.d.ts.map +1 -1
- package/types/ng-atomic-common.d.ts +2 -77
- package/types/ng-atomic-common.d.ts.map +1 -1
|
@@ -35,23 +35,12 @@ function provideNgAtomicCommon() {
|
|
|
35
35
|
return importProvidersFrom(NgAtomicCommonModule.forRoot());
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
/**
|
|
39
|
-
* EditingStateManager Service
|
|
40
|
-
*
|
|
41
|
-
* Manages global editing state for preventing data updates during cell editing.
|
|
42
|
-
* Uses Angular Signals for reactive state management.
|
|
43
|
-
*/
|
|
44
38
|
class EditingStateManager {
|
|
45
39
|
constructor() {
|
|
46
40
|
this.editingCells = signal([], ...(ngDevMode ? [{ debugName: "editingCells" }] : []));
|
|
47
41
|
this.isEditing = computed(() => this.editingCells().length > 0, ...(ngDevMode ? [{ debugName: "isEditing" }] : []));
|
|
48
42
|
this.isEditing$ = toObservable(this.isEditing);
|
|
49
43
|
}
|
|
50
|
-
/**
|
|
51
|
-
* Start editing a cell
|
|
52
|
-
* @param rowId Row identifier
|
|
53
|
-
* @param columnId Column identifier
|
|
54
|
-
*/
|
|
55
44
|
startEditing(rowId, columnId) {
|
|
56
45
|
const cellKey = `${rowId}-${columnId}`;
|
|
57
46
|
this.editingCells.update(cells => {
|
|
@@ -60,11 +49,6 @@ class EditingStateManager {
|
|
|
60
49
|
return [...newCells];
|
|
61
50
|
});
|
|
62
51
|
}
|
|
63
|
-
/**
|
|
64
|
-
* Stop editing a cell
|
|
65
|
-
* @param rowId Row identifier
|
|
66
|
-
* @param columnId Column identifier
|
|
67
|
-
*/
|
|
68
52
|
stopEditing(rowId, columnId) {
|
|
69
53
|
const cellKey = `${rowId}-${columnId}`;
|
|
70
54
|
this.editingCells.update(cells => {
|
|
@@ -81,55 +65,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImpor
|
|
|
81
65
|
args: [{ providedIn: 'root' }]
|
|
82
66
|
}] });
|
|
83
67
|
|
|
84
|
-
/**
|
|
85
|
-
* Custom RxJS operator that pauses data flow when editing is active.
|
|
86
|
-
*
|
|
87
|
-
* When editing starts, incoming values are buffered.
|
|
88
|
-
* When editing ends, the latest buffered value is emitted.
|
|
89
|
-
*
|
|
90
|
-
* @param editingStateManager The EditingStateManager service instance
|
|
91
|
-
* @returns An operator function that can be used in RxJS pipe
|
|
92
|
-
*
|
|
93
|
-
* @example
|
|
94
|
-
* ```typescript
|
|
95
|
-
* dataStream$.pipe(
|
|
96
|
-
* pauseWhenEditing(this.editingStateManager),
|
|
97
|
-
* // ... other operators
|
|
98
|
-
* )
|
|
99
|
-
* ```
|
|
100
|
-
*/
|
|
101
68
|
function pauseWhenEditing(editingStateManager) {
|
|
102
69
|
return (source) => {
|
|
103
70
|
return new Observable(observer => {
|
|
104
71
|
let pendingValues = [];
|
|
105
72
|
let isEditing = false;
|
|
106
|
-
// Subscribe to editing state changes
|
|
107
73
|
const editingSub = editingStateManager.isEditing$.subscribe(editing => {
|
|
108
74
|
const wasEditing = isEditing;
|
|
109
75
|
isEditing = editing;
|
|
110
76
|
console.debug('[pauseWhenEditing] Editing state changed:', { wasEditing, isEditing, pendingCount: pendingValues.length });
|
|
111
|
-
// When editing ends, emit the latest pending value
|
|
112
77
|
if (wasEditing && !isEditing && pendingValues.length > 0) {
|
|
113
|
-
// Emit only the latest value (discard older updates)
|
|
114
78
|
const latestValue = pendingValues[pendingValues.length - 1];
|
|
115
79
|
pendingValues = [];
|
|
116
80
|
console.debug('[pauseWhenEditing] Emitting pending value after edit end');
|
|
117
81
|
observer.next(latestValue);
|
|
118
82
|
}
|
|
119
83
|
});
|
|
120
|
-
// Subscribe to the source data stream
|
|
121
84
|
const sourceSub = source.subscribe({
|
|
122
85
|
next: value => {
|
|
123
86
|
if (!isEditing) {
|
|
124
|
-
// Pass through immediately when not editing
|
|
125
87
|
console.debug('[pauseWhenEditing] Passing through value (not editing)');
|
|
126
88
|
observer.next(value);
|
|
127
89
|
}
|
|
90
|
+
else {
|
|
91
|
+
pendingValues.push(value);
|
|
92
|
+
console.debug('[pauseWhenEditing] Buffering value (editing)', { pendingCount: pendingValues.length });
|
|
93
|
+
}
|
|
128
94
|
},
|
|
129
95
|
error: err => observer.error(err),
|
|
130
96
|
complete: () => observer.complete()
|
|
131
97
|
});
|
|
132
|
-
// Cleanup subscriptions
|
|
133
98
|
return () => {
|
|
134
99
|
editingSub.unsubscribe();
|
|
135
100
|
sourceSub.unsubscribe();
|
|
@@ -137,39 +102,19 @@ function pauseWhenEditing(editingStateManager) {
|
|
|
137
102
|
});
|
|
138
103
|
};
|
|
139
104
|
}
|
|
140
|
-
/**
|
|
141
|
-
* Alternative operator that buffers ALL updates during editing.
|
|
142
|
-
*
|
|
143
|
-
* When editing ends, all buffered values are emitted in sequence.
|
|
144
|
-
* This preserves the complete update history.
|
|
145
|
-
*
|
|
146
|
-
* @param editingStateManager The EditingStateManager service instance
|
|
147
|
-
* @returns An operator function that can be used in RxJS pipe
|
|
148
|
-
*
|
|
149
|
-
* @example
|
|
150
|
-
* ```typescript
|
|
151
|
-
* dataStream$.pipe(
|
|
152
|
-
* bufferWhenEditing(this.editingStateManager),
|
|
153
|
-
* // ... other operators
|
|
154
|
-
* )
|
|
155
|
-
* ```
|
|
156
|
-
*/
|
|
157
105
|
function bufferWhenEditing(editingStateManager) {
|
|
158
106
|
return (source) => {
|
|
159
107
|
return new Observable(observer => {
|
|
160
108
|
const buffer = [];
|
|
161
109
|
let isEditing = false;
|
|
162
|
-
// Subscribe to editing state changes
|
|
163
110
|
const editingSub = editingStateManager.isEditing$.subscribe(editing => {
|
|
164
111
|
const wasEditing = isEditing;
|
|
165
112
|
isEditing = editing;
|
|
166
|
-
// When editing ends, emit all buffered values
|
|
167
113
|
if (wasEditing && !isEditing && buffer.length > 0) {
|
|
168
114
|
buffer.forEach(value => observer.next(value));
|
|
169
|
-
buffer.length = 0;
|
|
115
|
+
buffer.length = 0;
|
|
170
116
|
}
|
|
171
117
|
});
|
|
172
|
-
// Subscribe to the source data stream
|
|
173
118
|
const sourceSub = source.subscribe({
|
|
174
119
|
next: value => {
|
|
175
120
|
if (!isEditing) {
|
|
@@ -182,7 +127,6 @@ function bufferWhenEditing(editingStateManager) {
|
|
|
182
127
|
error: err => observer.error(err),
|
|
183
128
|
complete: () => observer.complete()
|
|
184
129
|
});
|
|
185
|
-
// Cleanup subscriptions
|
|
186
130
|
return () => {
|
|
187
131
|
editingSub.unsubscribe();
|
|
188
132
|
sourceSub.unsubscribe();
|
|
@@ -205,16 +149,55 @@ class ActiveControlEventHandlers {
|
|
|
205
149
|
return this.cleanupFunctions;
|
|
206
150
|
}
|
|
207
151
|
setupClickHandlers() {
|
|
208
|
-
|
|
152
|
+
const CLICK_MOVE_THRESHOLD_PX = 5;
|
|
153
|
+
let justActivated = false;
|
|
154
|
+
let gestureStart = null;
|
|
155
|
+
const gestureStartHandler = (e) => {
|
|
156
|
+
justActivated = false;
|
|
157
|
+
gestureStart = this.hostElement.contains(e.target)
|
|
158
|
+
? { x: e.screenX, y: e.screenY }
|
|
159
|
+
: null;
|
|
160
|
+
};
|
|
161
|
+
this.addEventListener(window, 'mousedown', gestureStartHandler, { capture: true });
|
|
209
162
|
const mousedownHandler = (e) => {
|
|
210
|
-
this.
|
|
211
|
-
|
|
163
|
+
if (!this.isActive()) {
|
|
164
|
+
this.setActive(true);
|
|
165
|
+
justActivated = true;
|
|
166
|
+
if (this.options.focusTargetSelector) {
|
|
167
|
+
const target = this.hostElement.querySelector(this.options.focusTargetSelector);
|
|
168
|
+
if (target) {
|
|
169
|
+
e.preventDefault();
|
|
170
|
+
target.focus();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
212
174
|
if (!this.options.disableStopPropagation) {
|
|
213
175
|
e.stopPropagation();
|
|
214
176
|
}
|
|
215
177
|
};
|
|
216
178
|
this.addEventListener(this.hostElement, 'mousedown', mousedownHandler);
|
|
217
|
-
|
|
179
|
+
const mouseupHandler = (e) => {
|
|
180
|
+
const start = gestureStart;
|
|
181
|
+
gestureStart = null;
|
|
182
|
+
if (e.button !== 0) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (justActivated) {
|
|
186
|
+
justActivated = false;
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (!start) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const moved = Math.hypot(e.screenX - start.x, e.screenY - start.y) > CLICK_MOVE_THRESHOLD_PX;
|
|
193
|
+
if (moved) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (this.isActive()) {
|
|
197
|
+
this.setActive(false);
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
this.addEventListener(window, 'mouseup', mouseupHandler, { capture: true });
|
|
218
201
|
const documentClickListener = (e) => {
|
|
219
202
|
if (!this.hostElement.contains(e.target) && this.isActive()) {
|
|
220
203
|
this.setActive(false);
|
|
@@ -224,18 +207,13 @@ class ActiveControlEventHandlers {
|
|
|
224
207
|
this.cleanupFunctions.push(() => document.removeEventListener('mousedown', documentClickListener, { capture: true }));
|
|
225
208
|
}
|
|
226
209
|
setupPreventionHandlers() {
|
|
227
|
-
// ホイールイベント(スクロール対象要素以外でのみブロック)
|
|
228
|
-
// ただし、ctrlKey + wheel(トラックパッドのピンチズーム)は常にブロック
|
|
229
|
-
// 非アクティブ時はScrollControlがスクロール位置をリセットするため、ここでは処理しない
|
|
230
210
|
this.addEventListener(this.hostElement, 'wheel', (e) => {
|
|
231
211
|
if (this.isActive()) {
|
|
232
|
-
// ctrlKey + wheel = トラックパッドのピンチズーム → 常にブロック
|
|
233
212
|
if (e.ctrlKey) {
|
|
234
213
|
e.preventDefault();
|
|
235
214
|
e.stopPropagation();
|
|
236
215
|
return;
|
|
237
216
|
}
|
|
238
|
-
// 通常のホイールスクロール: スクロール対象要素からのイベントは許可
|
|
239
217
|
const target = e.target;
|
|
240
218
|
const isScrollableElement = this.options.scrollSelectors?.some(selector => target.closest(selector) !== null);
|
|
241
219
|
if (!isScrollableElement) {
|
|
@@ -244,25 +222,20 @@ class ActiveControlEventHandlers {
|
|
|
244
222
|
}
|
|
245
223
|
}
|
|
246
224
|
}, { passive: false });
|
|
247
|
-
// タッチイベント(ホスト要素レベル)
|
|
248
225
|
const touchHandler = (e) => {
|
|
249
226
|
if (!this.isActive())
|
|
250
227
|
return;
|
|
251
|
-
// スクロール対象要素からのイベントは許可
|
|
252
228
|
const target = e.target;
|
|
253
229
|
const isScrollableElement = this.options.scrollSelectors?.some(selector => target.closest(selector) !== null);
|
|
254
230
|
if (!isScrollableElement) {
|
|
255
231
|
if (e.touches.length > 1) {
|
|
256
|
-
// ピンチズームなどマルチタッチ操作をブロック
|
|
257
232
|
e.preventDefault();
|
|
258
233
|
e.stopPropagation();
|
|
259
234
|
}
|
|
260
|
-
// シングルタッチはデフォルト動作を許可(スクロールなど)
|
|
261
235
|
}
|
|
262
236
|
};
|
|
263
237
|
this.addEventListener(this.hostElement, 'touchstart', touchHandler, { passive: false });
|
|
264
238
|
this.addEventListener(this.hostElement, 'touchmove', touchHandler, { passive: false });
|
|
265
|
-
// ジェスチャーイベント(ホスト要素レベル)
|
|
266
239
|
const gestureHandler = (e) => {
|
|
267
240
|
if (this.isActive()) {
|
|
268
241
|
e.preventDefault();
|
|
@@ -272,16 +245,9 @@ class ActiveControlEventHandlers {
|
|
|
272
245
|
['gesturestart', 'gesturechange', 'gestureend'].forEach(eventName => {
|
|
273
246
|
this.addEventListener(this.hostElement, eventName, gestureHandler, { passive: false });
|
|
274
247
|
});
|
|
275
|
-
// Document-level capture phaseハンドラ
|
|
276
|
-
// ブラウザのピンチズームがデフォルト動作を行う前にキャッチする
|
|
277
248
|
this.setupDocumentLevelPinchZoomPrevention();
|
|
278
249
|
}
|
|
279
|
-
/**
|
|
280
|
-
* Document-levelでcapture phaseを使ってピンチズームを防止
|
|
281
|
-
* ホスト要素内で発生したマルチタッチ/ジェスチャーイベントのみをブロック
|
|
282
|
-
*/
|
|
283
250
|
setupDocumentLevelPinchZoomPrevention() {
|
|
284
|
-
// タッチイベント(capture phase)
|
|
285
251
|
const documentTouchHandler = (e) => {
|
|
286
252
|
if (!this.isActive())
|
|
287
253
|
return;
|
|
@@ -297,7 +263,6 @@ class ActiveControlEventHandlers {
|
|
|
297
263
|
document.removeEventListener('touchstart', documentTouchHandler, { capture: true });
|
|
298
264
|
document.removeEventListener('touchmove', documentTouchHandler, { capture: true });
|
|
299
265
|
});
|
|
300
|
-
// Safari gestureイベント(capture phase)
|
|
301
266
|
const documentGestureHandler = (e) => {
|
|
302
267
|
if (!this.isActive())
|
|
303
268
|
return;
|
|
@@ -333,20 +298,16 @@ class ScrollControl {
|
|
|
333
298
|
}
|
|
334
299
|
setup() {
|
|
335
300
|
const cleanups = [];
|
|
336
|
-
// アクティブ状態の監視
|
|
337
301
|
const checkActiveState = () => {
|
|
338
302
|
const isActiveNow = this.isActive();
|
|
339
303
|
if (!this.options.disableScrollLock) {
|
|
340
304
|
if (!isActiveNow && this.wasActive) {
|
|
341
|
-
// アクティブ → 非アクティブ: 現在位置をロック
|
|
342
305
|
this.lockedScrollTop = this.scrollElement.scrollTop;
|
|
343
306
|
}
|
|
344
307
|
else if (!isActiveNow) {
|
|
345
|
-
// 継続して非アクティブ: ロック位置を維持
|
|
346
308
|
this.scrollElement.scrollTop = this.lockedScrollTop;
|
|
347
309
|
}
|
|
348
310
|
}
|
|
349
|
-
// アクティブ時 or disableScrollLock時: 何もしない(自由スクロール)
|
|
350
311
|
this.wasActive = isActiveNow;
|
|
351
312
|
this.rafId = requestAnimationFrame(checkActiveState);
|
|
352
313
|
};
|
|
@@ -356,7 +317,6 @@ class ScrollControl {
|
|
|
356
317
|
cancelAnimationFrame(this.rafId);
|
|
357
318
|
}
|
|
358
319
|
});
|
|
359
|
-
// スクロールイベント監視
|
|
360
320
|
const scrollHandler = () => {
|
|
361
321
|
if (!this.options.disableScrollLock && !this.isActive()) {
|
|
362
322
|
this.scrollElement.scrollTop = this.lockedScrollTop;
|
|
@@ -368,53 +328,26 @@ class ScrollControl {
|
|
|
368
328
|
}
|
|
369
329
|
}
|
|
370
330
|
|
|
371
|
-
/**
|
|
372
|
-
* アクティブ状態を管理するディレクティブ
|
|
373
|
-
*
|
|
374
|
-
* クリックでアクティブ化、外部クリックで非アクティブ化し、
|
|
375
|
-
* スクロール位置の固定やイベント伝播の制御を行います。
|
|
376
|
-
*
|
|
377
|
-
* @example
|
|
378
|
-
* ```html
|
|
379
|
-
* <!-- 単一セレクタ -->
|
|
380
|
-
* <div appActiveControl
|
|
381
|
-
* [scrollSelector]="'.xterm-viewport'"
|
|
382
|
-
* (activeChange)="onActiveChange($event)">
|
|
383
|
-
* <!-- content -->
|
|
384
|
-
* </div>
|
|
385
|
-
*
|
|
386
|
-
* <!-- 複数セレクタ -->
|
|
387
|
-
* <div appActiveControl
|
|
388
|
-
* [scrollSelectors]="['.xterm-viewport', '.qtp-content']"
|
|
389
|
-
* (activeChange)="onActiveChange($event)">
|
|
390
|
-
* <!-- content -->
|
|
391
|
-
* </div>
|
|
392
|
-
* ```
|
|
393
|
-
*/
|
|
394
331
|
class ActiveControlDirective {
|
|
395
332
|
constructor() {
|
|
396
333
|
this.el = inject(ElementRef);
|
|
397
334
|
this.scrollSelector = input(...(ngDevMode ? [undefined, { debugName: "scrollSelector" }] : []));
|
|
398
335
|
this.scrollSelectors = input(...(ngDevMode ? [undefined, { debugName: "scrollSelectors" }] : []));
|
|
399
|
-
/** mousedownでstopPropagationを呼ばない(React Flowなどのドラッグと共存するため) */
|
|
400
336
|
this.disableStopPropagation = input(false, ...(ngDevMode ? [{ debugName: "disableStopPropagation" }] : []));
|
|
401
|
-
/** スクロール位置のロックを無効化する(常にスクロール可能にする) */
|
|
402
337
|
this.disableScrollLock = input(false, ...(ngDevMode ? [{ debugName: "disableScrollLock" }] : []));
|
|
403
|
-
/** nodragクラスを付与しない(React Flowのノードでドラッグを有効化するため) */
|
|
404
338
|
this.disableNodrag = input(false, ...(ngDevMode ? [{ debugName: "disableNodrag" }] : []));
|
|
339
|
+
this.focusTargetSelector = input(...(ngDevMode ? [undefined, { debugName: "focusTargetSelector" }] : []));
|
|
405
340
|
this.activeChange = output();
|
|
406
341
|
this.isActive = signal(false, ...(ngDevMode ? [{ debugName: "isActive" }] : []));
|
|
407
342
|
this.eventCleanupFunctions = [];
|
|
408
343
|
this.scrollCleanupFunctions = [];
|
|
409
344
|
this.eventHandlersInitialized = false;
|
|
410
|
-
// イベントハンドラーの初期化(一度だけ)
|
|
411
345
|
effect(() => {
|
|
412
346
|
if (!this.eventHandlersInitialized) {
|
|
413
347
|
setTimeout(() => this.initializeEventHandlers(), 100);
|
|
414
348
|
this.eventHandlersInitialized = true;
|
|
415
349
|
}
|
|
416
350
|
}, { allowSignalWrites: true });
|
|
417
|
-
// スクロール制御の初期化(セレクタが変わるたびに再設定)
|
|
418
351
|
effect(() => {
|
|
419
352
|
const selectors = this.getScrollSelectors();
|
|
420
353
|
setTimeout(() => this.setupScrollControls(selectors), 150);
|
|
@@ -427,17 +360,19 @@ class ActiveControlDirective {
|
|
|
427
360
|
initializeEventHandlers() {
|
|
428
361
|
const hostElement = this.el.nativeElement;
|
|
429
362
|
const scrollSelectors = this.getScrollSelectors();
|
|
430
|
-
const eventHandlers = new ActiveControlEventHandlers(hostElement, this.isActive, (active) => this.activeChange.emit(active), {
|
|
363
|
+
const eventHandlers = new ActiveControlEventHandlers(hostElement, this.isActive, (active) => this.activeChange.emit(active), {
|
|
364
|
+
disableStopPropagation: this.disableStopPropagation(),
|
|
365
|
+
scrollSelectors,
|
|
366
|
+
focusTargetSelector: this.focusTargetSelector(),
|
|
367
|
+
});
|
|
431
368
|
this.eventCleanupFunctions.push(...eventHandlers.setupAll());
|
|
432
369
|
}
|
|
433
370
|
setupScrollControls(selectors) {
|
|
434
|
-
// 既存のスクロール制御をクリーンアップ
|
|
435
371
|
this.scrollCleanupFunctions.forEach(cleanup => cleanup());
|
|
436
372
|
this.scrollCleanupFunctions = [];
|
|
437
373
|
const hostElement = this.el.nativeElement;
|
|
438
374
|
const disableScrollLock = this.disableScrollLock();
|
|
439
375
|
for (const selector of selectors) {
|
|
440
|
-
// querySelectorAll を使用して全てのマッチする要素を取得
|
|
441
376
|
const scrollElements = hostElement.querySelectorAll(selector);
|
|
442
377
|
scrollElements.forEach(scrollElement => {
|
|
443
378
|
const scrollControl = new ScrollControl(scrollElement, this.isActive, { disableScrollLock });
|
|
@@ -454,7 +389,7 @@ class ActiveControlDirective {
|
|
|
454
389
|
return single ? [single] : [];
|
|
455
390
|
}
|
|
456
391
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: ActiveControlDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
457
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.6", type: ActiveControlDirective, isStandalone: true, selector: "[appActiveControl]", inputs: { scrollSelector: { classPropertyName: "scrollSelector", publicName: "scrollSelector", isSignal: true, isRequired: false, transformFunction: null }, scrollSelectors: { classPropertyName: "scrollSelectors", publicName: "scrollSelectors", isSignal: true, isRequired: false, transformFunction: null }, disableStopPropagation: { classPropertyName: "disableStopPropagation", publicName: "disableStopPropagation", isSignal: true, isRequired: false, transformFunction: null }, disableScrollLock: { classPropertyName: "disableScrollLock", publicName: "disableScrollLock", isSignal: true, isRequired: false, transformFunction: null }, disableNodrag: { classPropertyName: "disableNodrag", publicName: "disableNodrag", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeChange: "activeChange" }, host: { properties: { "class.active": "isActive()", "class.nodrag": "!disableNodrag()", "class.nowheel": "isActive()" } }, ngImport: i0 }); }
|
|
392
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.6", type: ActiveControlDirective, isStandalone: true, selector: "[appActiveControl]", inputs: { scrollSelector: { classPropertyName: "scrollSelector", publicName: "scrollSelector", isSignal: true, isRequired: false, transformFunction: null }, scrollSelectors: { classPropertyName: "scrollSelectors", publicName: "scrollSelectors", isSignal: true, isRequired: false, transformFunction: null }, disableStopPropagation: { classPropertyName: "disableStopPropagation", publicName: "disableStopPropagation", isSignal: true, isRequired: false, transformFunction: null }, disableScrollLock: { classPropertyName: "disableScrollLock", publicName: "disableScrollLock", isSignal: true, isRequired: false, transformFunction: null }, disableNodrag: { classPropertyName: "disableNodrag", publicName: "disableNodrag", isSignal: true, isRequired: false, transformFunction: null }, focusTargetSelector: { classPropertyName: "focusTargetSelector", publicName: "focusTargetSelector", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeChange: "activeChange" }, host: { properties: { "class.active": "isActive()", "class.nodrag": "!disableNodrag()", "class.nowheel": "isActive()" } }, ngImport: i0 }); }
|
|
458
393
|
}
|
|
459
394
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: ActiveControlDirective, decorators: [{
|
|
460
395
|
type: Directive,
|
|
@@ -467,7 +402,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImpor
|
|
|
467
402
|
'[class.nowheel]': 'isActive()',
|
|
468
403
|
}
|
|
469
404
|
}]
|
|
470
|
-
}], ctorParameters: () => [], propDecorators: { scrollSelector: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollSelector", required: false }] }], scrollSelectors: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollSelectors", required: false }] }], disableStopPropagation: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableStopPropagation", required: false }] }], disableScrollLock: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableScrollLock", required: false }] }], disableNodrag: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableNodrag", required: false }] }], activeChange: [{ type: i0.Output, args: ["activeChange"] }] } });
|
|
405
|
+
}], ctorParameters: () => [], propDecorators: { scrollSelector: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollSelector", required: false }] }], scrollSelectors: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollSelectors", required: false }] }], disableStopPropagation: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableStopPropagation", required: false }] }], disableScrollLock: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableScrollLock", required: false }] }], disableNodrag: [{ type: i0.Input, args: [{ isSignal: true, alias: "disableNodrag", required: false }] }], focusTargetSelector: [{ type: i0.Input, args: [{ isSignal: true, alias: "focusTargetSelector", required: false }] }], activeChange: [{ type: i0.Output, args: ["activeChange"] }] } });
|
|
471
406
|
|
|
472
407
|
/**
|
|
473
408
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-atomic-common.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/common.module.ts","../../../../../packages/@ng-atomic/common/src/lib/services/editing/editing-state-manager.service.ts","../../../../../packages/@ng-atomic/common/src/lib/operators/pause-when-editing.operator.ts","../../../../../packages/@ng-atomic/common/src/lib/directives/active-control/handlers/event-handlers.ts","../../../../../packages/@ng-atomic/common/src/lib/directives/active-control/handlers/scroll-control.ts","../../../../../packages/@ng-atomic/common/src/lib/directives/active-control/active-control.directive.ts","../../../../../packages/@ng-atomic/common/src/lib/ng-atomic-common.ts"],"sourcesContent":["import { EnvironmentProviders, importProvidersFrom, NgModule } from \"@angular/core\";\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { NgAtomicSheetsModule } from \"@ng-atomic/common/services/sheets\";\n\n\n@NgModule({\n imports: [\n MatDialogModule,\n MatSnackBarModule,\n NgAtomicSheetsModule,\n ]\n})\nexport class NgAtomicCommonModule {\n static forRoot() {\n return {\n ngModule: NgAtomicCommonModule,\n providers: [\n ],\n }\n }\n}\n\nexport function provideNgAtomicCommon(): EnvironmentProviders {\n return importProvidersFrom(NgAtomicCommonModule.forRoot());\n}\n","import { Injectable, signal, computed } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { Observable } from 'rxjs';\n\n/**\n * EditingStateManager Service\n * \n * Manages global editing state for preventing data updates during cell editing.\n * Uses Angular Signals for reactive state management.\n */\n@Injectable({ providedIn: 'root' })\nexport class EditingStateManager {\n private readonly editingCells = signal<string[]>([]);\n readonly isEditing = computed(() => this.editingCells().length > 0);\n readonly isEditing$: Observable<boolean> = toObservable(this.isEditing);\n \n /**\n * Start editing a cell\n * @param rowId Row identifier\n * @param columnId Column identifier\n */\n startEditing(rowId: string | number, columnId: string): void {\n const cellKey = `${rowId}-${columnId}`;\n this.editingCells.update(cells => {\n const newCells = new Set(cells);\n newCells.add(cellKey);\n return [...newCells];\n });\n }\n \n /**\n * Stop editing a cell\n * @param rowId Row identifier\n * @param columnId Column identifier\n */\n stopEditing(rowId: string | number, columnId: string): void {\n const cellKey = `${rowId}-${columnId}`;\n this.editingCells.update(cells => {\n const newCells = new Set(cells);\n newCells.delete(cellKey);\n return [...newCells];\n });\n }\n}","import { Observable, MonoTypeOperatorFunction } from 'rxjs';\nimport { EditingStateManager } from '../services/editing/editing-state-manager.service';\n\n/**\n * Custom RxJS operator that pauses data flow when editing is active.\n * \n * When editing starts, incoming values are buffered.\n * When editing ends, the latest buffered value is emitted.\n * \n * @param editingStateManager The EditingStateManager service instance\n * @returns An operator function that can be used in RxJS pipe\n * \n * @example\n * ```typescript\n * dataStream$.pipe(\n * pauseWhenEditing(this.editingStateManager),\n * // ... other operators\n * )\n * ```\n */\nexport function pauseWhenEditing<T>(\n editingStateManager: EditingStateManager\n): MonoTypeOperatorFunction<T> {\n return (source: Observable<T>) => {\n return new Observable<T>(observer => {\n let pendingValues: T[] = [];\n let isEditing = false;\n \n // Subscribe to editing state changes\n const editingSub = editingStateManager.isEditing$.subscribe(editing => {\n const wasEditing = isEditing;\n isEditing = editing;\n console.debug('[pauseWhenEditing] Editing state changed:', { wasEditing, isEditing, pendingCount: pendingValues.length });\n \n // When editing ends, emit the latest pending value\n if (wasEditing && !isEditing && pendingValues.length > 0) {\n // Emit only the latest value (discard older updates)\n const latestValue = pendingValues[pendingValues.length - 1];\n pendingValues = [];\n console.debug('[pauseWhenEditing] Emitting pending value after edit end');\n observer.next(latestValue);\n }\n });\n \n // Subscribe to the source data stream\n const sourceSub = source.subscribe({\n next: value => {\n if (!isEditing) {\n // Pass through immediately when not editing\n console.debug('[pauseWhenEditing] Passing through value (not editing)');\n observer.next(value);\n }\n },\n error: err => observer.error(err),\n complete: () => observer.complete()\n });\n \n // Cleanup subscriptions\n return () => {\n editingSub.unsubscribe();\n sourceSub.unsubscribe();\n };\n });\n };\n}\n\n/**\n * Alternative operator that buffers ALL updates during editing.\n * \n * When editing ends, all buffered values are emitted in sequence.\n * This preserves the complete update history.\n * \n * @param editingStateManager The EditingStateManager service instance\n * @returns An operator function that can be used in RxJS pipe\n * \n * @example\n * ```typescript\n * dataStream$.pipe(\n * bufferWhenEditing(this.editingStateManager),\n * // ... other operators\n * )\n * ```\n */\nexport function bufferWhenEditing<T>(\n editingStateManager: EditingStateManager\n): MonoTypeOperatorFunction<T> {\n return (source: Observable<T>) => {\n return new Observable<T>(observer => {\n const buffer: T[] = [];\n let isEditing = false;\n \n // Subscribe to editing state changes\n const editingSub = editingStateManager.isEditing$.subscribe(editing => {\n const wasEditing = isEditing;\n isEditing = editing;\n \n // When editing ends, emit all buffered values\n if (wasEditing && !isEditing && buffer.length > 0) {\n buffer.forEach(value => observer.next(value));\n buffer.length = 0; // Clear the buffer\n }\n });\n \n // Subscribe to the source data stream\n const sourceSub = source.subscribe({\n next: value => {\n if (!isEditing) {\n observer.next(value);\n } else {\n buffer.push(value);\n }\n },\n error: err => observer.error(err),\n complete: () => observer.complete()\n });\n \n // Cleanup subscriptions\n return () => {\n editingSub.unsubscribe();\n sourceSub.unsubscribe();\n };\n });\n };\n}","import { Signal, WritableSignal } from '@angular/core';\n\nexport type CleanupFunction = () => void;\n\nexport interface ActiveControlOptions {\n /** mousedownでstopPropagationを呼ばない */\n disableStopPropagation?: boolean;\n /** スクロールを許可する要素のセレクタ */\n scrollSelectors?: string[];\n}\n\nexport class ActiveControlEventHandlers {\n private cleanupFunctions: CleanupFunction[] = [];\n\n constructor(\n private hostElement: HTMLElement,\n private isActive: WritableSignal<boolean>,\n private onActiveChange: (active: boolean) => void,\n private options: ActiveControlOptions = {}\n ) {}\n\n setupAll(): CleanupFunction[] {\n this.setupClickHandlers();\n this.setupPreventionHandlers();\n return this.cleanupFunctions;\n }\n\n private setupClickHandlers(): void {\n // ホスト要素クリック\n const mousedownHandler = (e: MouseEvent) => {\n this.toggleActive();\n // React Flowなどのドラッグと共存するため、オプションでstopPropagationを無効化\n if (!this.options.disableStopPropagation) {\n e.stopPropagation();\n }\n };\n this.addEventListener(this.hostElement, 'mousedown', mousedownHandler);\n\n // 外部クリック\n const documentClickListener = (e: MouseEvent) => {\n if (!this.hostElement.contains(e.target as Node) && this.isActive()) {\n this.setActive(false);\n }\n };\n document.addEventListener('mousedown', documentClickListener, { capture: true });\n this.cleanupFunctions.push(() =>\n document.removeEventListener('mousedown', documentClickListener, { capture: true })\n );\n }\n\n private setupPreventionHandlers(): void {\n // ホイールイベント(スクロール対象要素以外でのみブロック)\n // ただし、ctrlKey + wheel(トラックパッドのピンチズーム)は常にブロック\n // 非アクティブ時はScrollControlがスクロール位置をリセットするため、ここでは処理しない\n this.addEventListener(this.hostElement, 'wheel', (e: WheelEvent) => {\n if (this.isActive()) {\n // ctrlKey + wheel = トラックパッドのピンチズーム → 常にブロック\n if (e.ctrlKey) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n // 通常のホイールスクロール: スクロール対象要素からのイベントは許可\n const target = e.target as HTMLElement;\n const isScrollableElement = this.options.scrollSelectors?.some(selector =>\n target.closest(selector) !== null\n );\n if (!isScrollableElement) {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n }, { passive: false });\n\n // タッチイベント(ホスト要素レベル)\n const touchHandler = (e: TouchEvent) => {\n if (!this.isActive()) return;\n\n // スクロール対象要素からのイベントは許可\n const target = e.target as HTMLElement;\n const isScrollableElement = this.options.scrollSelectors?.some(selector =>\n target.closest(selector) !== null\n );\n if (!isScrollableElement) {\n if (e.touches.length > 1) {\n // ピンチズームなどマルチタッチ操作をブロック\n e.preventDefault();\n e.stopPropagation();\n }\n // シングルタッチはデフォルト動作を許可(スクロールなど)\n }\n };\n this.addEventListener(this.hostElement, 'touchstart', touchHandler, { passive: false });\n this.addEventListener(this.hostElement, 'touchmove', touchHandler, { passive: false });\n\n // ジェスチャーイベント(ホスト要素レベル)\n const gestureHandler = (e: Event) => {\n if (this.isActive()) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n ['gesturestart', 'gesturechange', 'gestureend'].forEach(eventName => {\n this.addEventListener(this.hostElement, eventName, gestureHandler, { passive: false });\n });\n\n // Document-level capture phaseハンドラ\n // ブラウザのピンチズームがデフォルト動作を行う前にキャッチする\n this.setupDocumentLevelPinchZoomPrevention();\n }\n\n /**\n * Document-levelでcapture phaseを使ってピンチズームを防止\n * ホスト要素内で発生したマルチタッチ/ジェスチャーイベントのみをブロック\n */\n private setupDocumentLevelPinchZoomPrevention(): void {\n // タッチイベント(capture phase)\n const documentTouchHandler = (e: TouchEvent) => {\n if (!this.isActive()) return;\n if (!this.hostElement.contains(e.target as Node)) return;\n\n if (e.touches.length > 1) {\n e.preventDefault();\n }\n };\n\n document.addEventListener('touchstart', documentTouchHandler, { capture: true, passive: false });\n document.addEventListener('touchmove', documentTouchHandler, { capture: true, passive: false });\n\n this.cleanupFunctions.push(() => {\n document.removeEventListener('touchstart', documentTouchHandler, { capture: true });\n document.removeEventListener('touchmove', documentTouchHandler, { capture: true });\n });\n\n // Safari gestureイベント(capture phase)\n const documentGestureHandler = (e: Event) => {\n if (!this.isActive()) return;\n if (!this.hostElement.contains(e.target as Node)) return;\n e.preventDefault();\n };\n\n ['gesturestart', 'gesturechange', 'gestureend'].forEach(eventName => {\n document.addEventListener(eventName, documentGestureHandler, { capture: true, passive: false });\n this.cleanupFunctions.push(() =>\n document.removeEventListener(eventName, documentGestureHandler, { capture: true })\n );\n });\n }\n\n private addEventListener(\n element: HTMLElement | Document,\n event: string,\n handler: (e: any) => void,\n options?: AddEventListenerOptions\n ): void {\n element.addEventListener(event, handler as EventListener, options);\n this.cleanupFunctions.push(() => element.removeEventListener(event, handler as EventListener, options));\n }\n\n private toggleActive(): void {\n this.setActive(!this.isActive());\n }\n\n private setActive(active: boolean): void {\n this.isActive.set(active);\n this.onActiveChange(active);\n }\n}\n","import { Signal } from '@angular/core';\nimport { CleanupFunction } from './event-handlers';\n\nexport interface ScrollControlOptions {\n /** スクロール位置のロックを無効化する(常にスクロール可能にする) */\n disableScrollLock?: boolean;\n}\n\nexport class ScrollControl {\n private lockedScrollTop = 0;\n private wasActive = false;\n private rafId?: number;\n\n constructor(\n private scrollElement: HTMLElement,\n private isActive: Signal<boolean>,\n private options: ScrollControlOptions = {}\n ) {}\n\n setup(): CleanupFunction[] {\n const cleanups: CleanupFunction[] = [];\n\n // アクティブ状態の監視\n const checkActiveState = () => {\n const isActiveNow = this.isActive();\n\n if (!this.options.disableScrollLock) {\n if (!isActiveNow && this.wasActive) {\n // アクティブ → 非アクティブ: 現在位置をロック\n this.lockedScrollTop = this.scrollElement.scrollTop;\n } else if (!isActiveNow) {\n // 継続して非アクティブ: ロック位置を維持\n this.scrollElement.scrollTop = this.lockedScrollTop;\n }\n }\n // アクティブ時 or disableScrollLock時: 何もしない(自由スクロール)\n\n this.wasActive = isActiveNow;\n this.rafId = requestAnimationFrame(checkActiveState);\n };\n checkActiveState();\n cleanups.push(() => {\n if (this.rafId !== undefined) {\n cancelAnimationFrame(this.rafId);\n }\n });\n\n // スクロールイベント監視\n const scrollHandler = () => {\n if (!this.options.disableScrollLock && !this.isActive()) {\n this.scrollElement.scrollTop = this.lockedScrollTop;\n }\n };\n this.scrollElement.addEventListener('scroll', scrollHandler);\n cleanups.push(() => this.scrollElement.removeEventListener('scroll', scrollHandler));\n\n return cleanups;\n }\n}\n","import { Directive, ElementRef, input, output, effect, signal, OnDestroy, inject } from '@angular/core';\nimport { ActiveControlEventHandlers, ScrollControl } from './handlers';\n\n/**\n * アクティブ状態を管理するディレクティブ\n *\n * クリックでアクティブ化、外部クリックで非アクティブ化し、\n * スクロール位置の固定やイベント伝播の制御を行います。\n *\n * @example\n * ```html\n * <!-- 単一セレクタ -->\n * <div appActiveControl\n * [scrollSelector]=\"'.xterm-viewport'\"\n * (activeChange)=\"onActiveChange($event)\">\n * <!-- content -->\n * </div>\n *\n * <!-- 複数セレクタ -->\n * <div appActiveControl\n * [scrollSelectors]=\"['.xterm-viewport', '.qtp-content']\"\n * (activeChange)=\"onActiveChange($event)\">\n * <!-- content -->\n * </div>\n * ```\n */\n@Directive({\n selector: '[appActiveControl]',\n standalone: true,\n host: {\n '[class.active]': 'isActive()',\n '[class.nodrag]': '!disableNodrag()',\n '[class.nowheel]': 'isActive()',\n }\n})\nexport class ActiveControlDirective implements OnDestroy {\n private readonly el = inject(ElementRef);\n readonly scrollSelector = input<string>();\n readonly scrollSelectors = input<string[]>();\n /** mousedownでstopPropagationを呼ばない(React Flowなどのドラッグと共存するため) */\n readonly disableStopPropagation = input<boolean>(false);\n /** スクロール位置のロックを無効化する(常にスクロール可能にする) */\n readonly disableScrollLock = input<boolean>(false);\n /** nodragクラスを付与しない(React Flowのノードでドラッグを有効化するため) */\n readonly disableNodrag = input<boolean>(false);\n readonly activeChange = output<boolean>();\n readonly isActive = signal<boolean>(false);\n\n private eventCleanupFunctions: (() => void)[] = [];\n private scrollCleanupFunctions: (() => void)[] = [];\n private eventHandlersInitialized = false;\n\n constructor() {\n // イベントハンドラーの初期化(一度だけ)\n effect(() => {\n if (!this.eventHandlersInitialized) {\n setTimeout(() => this.initializeEventHandlers(), 100);\n this.eventHandlersInitialized = true;\n }\n }, { allowSignalWrites: true });\n\n // スクロール制御の初期化(セレクタが変わるたびに再設定)\n effect(() => {\n const selectors = this.getScrollSelectors();\n setTimeout(() => this.setupScrollControls(selectors), 150);\n });\n }\n\n ngOnDestroy(): void {\n this.eventCleanupFunctions.forEach(cleanup => cleanup());\n this.scrollCleanupFunctions.forEach(cleanup => cleanup());\n }\n\n private initializeEventHandlers(): void {\n const hostElement = this.el.nativeElement as HTMLElement;\n const scrollSelectors = this.getScrollSelectors();\n const eventHandlers = new ActiveControlEventHandlers(\n hostElement,\n this.isActive,\n (active) => this.activeChange.emit(active),\n { disableStopPropagation: this.disableStopPropagation(), scrollSelectors }\n );\n this.eventCleanupFunctions.push(...eventHandlers.setupAll());\n }\n\n private setupScrollControls(selectors: string[]): void {\n // 既存のスクロール制御をクリーンアップ\n this.scrollCleanupFunctions.forEach(cleanup => cleanup());\n this.scrollCleanupFunctions = [];\n\n const hostElement = this.el.nativeElement as HTMLElement;\n const disableScrollLock = this.disableScrollLock();\n for (const selector of selectors) {\n // querySelectorAll を使用して全てのマッチする要素を取得\n const scrollElements = hostElement.querySelectorAll<HTMLElement>(selector);\n scrollElements.forEach(scrollElement => {\n const scrollControl = new ScrollControl(scrollElement, this.isActive, { disableScrollLock });\n this.scrollCleanupFunctions.push(...scrollControl.setup());\n });\n }\n }\n\n private getScrollSelectors(): string[] {\n const multiple = this.scrollSelectors();\n if (multiple && multiple.length > 0) {\n return multiple;\n }\n const single = this.scrollSelector();\n return single ? [single] : [];\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ng-atomic-common.mjs","sources":["../../../../../packages/@ng-atomic/common/src/lib/common.module.ts","../../../../../packages/@ng-atomic/common/src/lib/services/editing/editing-state-manager.service.ts","../../../../../packages/@ng-atomic/common/src/lib/operators/pause-when-editing.operator.ts","../../../../../packages/@ng-atomic/common/src/lib/directives/active-control/handlers/event-handlers.ts","../../../../../packages/@ng-atomic/common/src/lib/directives/active-control/handlers/scroll-control.ts","../../../../../packages/@ng-atomic/common/src/lib/directives/active-control/active-control.directive.ts","../../../../../packages/@ng-atomic/common/src/lib/ng-atomic-common.ts"],"sourcesContent":["import { EnvironmentProviders, importProvidersFrom, NgModule } from \"@angular/core\";\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { NgAtomicSheetsModule } from \"@ng-atomic/common/services/sheets\";\n\n\n@NgModule({\n imports: [\n MatDialogModule,\n MatSnackBarModule,\n NgAtomicSheetsModule,\n ]\n})\nexport class NgAtomicCommonModule {\n static forRoot() {\n return {\n ngModule: NgAtomicCommonModule,\n providers: [\n ],\n }\n }\n}\n\nexport function provideNgAtomicCommon(): EnvironmentProviders {\n return importProvidersFrom(NgAtomicCommonModule.forRoot());\n}\n","import { Injectable, signal, computed } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { Observable } from 'rxjs';\n\n\n@Injectable({ providedIn: 'root' })\nexport class EditingStateManager {\n private readonly editingCells = signal<string[]>([]);\n readonly isEditing = computed(() => this.editingCells().length > 0);\n readonly isEditing$: Observable<boolean> = toObservable(this.isEditing);\n \n \n startEditing(rowId: string | number, columnId: string): void {\n const cellKey = `${rowId}-${columnId}`;\n this.editingCells.update(cells => {\n const newCells = new Set(cells);\n newCells.add(cellKey);\n return [...newCells];\n });\n }\n \n \n stopEditing(rowId: string | number, columnId: string): void {\n const cellKey = `${rowId}-${columnId}`;\n this.editingCells.update(cells => {\n const newCells = new Set(cells);\n newCells.delete(cellKey);\n return [...newCells];\n });\n }\n}","import { Observable, MonoTypeOperatorFunction } from 'rxjs';\nimport { EditingStateManager } from '../services/editing/editing-state-manager.service';\n\n\nexport function pauseWhenEditing<T>(\n editingStateManager: EditingStateManager\n): MonoTypeOperatorFunction<T> {\n return (source: Observable<T>) => {\n return new Observable<T>(observer => {\n let pendingValues: T[] = [];\n let isEditing = false;\n \n \n const editingSub = editingStateManager.isEditing$.subscribe(editing => {\n const wasEditing = isEditing;\n isEditing = editing;\n console.debug('[pauseWhenEditing] Editing state changed:', { wasEditing, isEditing, pendingCount: pendingValues.length });\n \n \n if (wasEditing && !isEditing && pendingValues.length > 0) {\n \n const latestValue = pendingValues[pendingValues.length - 1];\n pendingValues = [];\n console.debug('[pauseWhenEditing] Emitting pending value after edit end');\n observer.next(latestValue);\n }\n });\n \n \n const sourceSub = source.subscribe({\n next: value => {\n if (!isEditing) {\n \n console.debug('[pauseWhenEditing] Passing through value (not editing)');\n observer.next(value);\n } else {\n \n pendingValues.push(value);\n console.debug('[pauseWhenEditing] Buffering value (editing)', { pendingCount: pendingValues.length });\n }\n },\n error: err => observer.error(err),\n complete: () => observer.complete()\n });\n\n \n return () => {\n editingSub.unsubscribe();\n sourceSub.unsubscribe();\n };\n });\n };\n}\n\n\nexport function bufferWhenEditing<T>(\n editingStateManager: EditingStateManager\n): MonoTypeOperatorFunction<T> {\n return (source: Observable<T>) => {\n return new Observable<T>(observer => {\n const buffer: T[] = [];\n let isEditing = false;\n \n \n const editingSub = editingStateManager.isEditing$.subscribe(editing => {\n const wasEditing = isEditing;\n isEditing = editing;\n \n \n if (wasEditing && !isEditing && buffer.length > 0) {\n buffer.forEach(value => observer.next(value));\n buffer.length = 0; \n }\n });\n \n \n const sourceSub = source.subscribe({\n next: value => {\n if (!isEditing) {\n observer.next(value);\n } else {\n buffer.push(value);\n }\n },\n error: err => observer.error(err),\n complete: () => observer.complete()\n });\n \n \n return () => {\n editingSub.unsubscribe();\n sourceSub.unsubscribe();\n };\n });\n };\n}","import { Signal, WritableSignal } from '@angular/core';\n\nexport type CleanupFunction = () => void;\n\nexport interface ActiveControlOptions {\n \n disableStopPropagation?: boolean;\n \n scrollSelectors?: string[];\n \n focusTargetSelector?: string;\n}\n\nexport class ActiveControlEventHandlers {\n private cleanupFunctions: CleanupFunction[] = [];\n\n constructor(\n private hostElement: HTMLElement,\n private isActive: WritableSignal<boolean>,\n private onActiveChange: (active: boolean) => void,\n private options: ActiveControlOptions = {}\n ) {}\n\n setupAll(): CleanupFunction[] {\n this.setupClickHandlers();\n this.setupPreventionHandlers();\n return this.cleanupFunctions;\n }\n\n private setupClickHandlers(): void {\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n const CLICK_MOVE_THRESHOLD_PX = 5;\n let justActivated = false;\n let gestureStart: { x: number; y: number } | null = null;\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n const gestureStartHandler = (e: MouseEvent) => {\n justActivated = false;\n gestureStart = this.hostElement.contains(e.target as Node)\n ? { x: e.screenX, y: e.screenY }\n : null;\n };\n this.addEventListener(window, 'mousedown', gestureStartHandler, { capture: true });\n\n const mousedownHandler = (e: MouseEvent) => {\n if (!this.isActive()) {\n this.setActive(true);\n justActivated = true;\n \n \n \n \n \n \n if (this.options.focusTargetSelector) {\n const target = this.hostElement.querySelector<HTMLElement>(this.options.focusTargetSelector);\n if (target) {\n e.preventDefault();\n target.focus();\n }\n }\n }\n \n \n if (!this.options.disableStopPropagation) {\n e.stopPropagation();\n }\n };\n this.addEventListener(this.hostElement, 'mousedown', mousedownHandler);\n\n \n \n \n \n \n \n const mouseupHandler = (e: MouseEvent) => {\n const start = gestureStart;\n gestureStart = null;\n if (e.button !== 0) {\n return; \n }\n if (justActivated) {\n justActivated = false;\n return;\n }\n if (!start) {\n return; \n }\n const moved = Math.hypot(e.screenX - start.x, e.screenY - start.y) > CLICK_MOVE_THRESHOLD_PX;\n if (moved) {\n return; \n }\n if (this.isActive()) {\n this.setActive(false);\n }\n };\n this.addEventListener(window, 'mouseup', mouseupHandler, { capture: true });\n\n \n const documentClickListener = (e: MouseEvent) => {\n if (!this.hostElement.contains(e.target as Node) && this.isActive()) {\n this.setActive(false);\n }\n };\n document.addEventListener('mousedown', documentClickListener, { capture: true });\n this.cleanupFunctions.push(() =>\n document.removeEventListener('mousedown', documentClickListener, { capture: true })\n );\n }\n\n private setupPreventionHandlers(): void {\n \n \n \n this.addEventListener(this.hostElement, 'wheel', (e: WheelEvent) => {\n if (this.isActive()) {\n \n if (e.ctrlKey) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n \n const target = e.target as HTMLElement;\n const isScrollableElement = this.options.scrollSelectors?.some(selector =>\n target.closest(selector) !== null\n );\n if (!isScrollableElement) {\n e.preventDefault();\n e.stopPropagation();\n }\n }\n }, { passive: false });\n\n \n const touchHandler = (e: TouchEvent) => {\n if (!this.isActive()) return;\n\n \n const target = e.target as HTMLElement;\n const isScrollableElement = this.options.scrollSelectors?.some(selector =>\n target.closest(selector) !== null\n );\n if (!isScrollableElement) {\n if (e.touches.length > 1) {\n \n e.preventDefault();\n e.stopPropagation();\n }\n \n }\n };\n this.addEventListener(this.hostElement, 'touchstart', touchHandler, { passive: false });\n this.addEventListener(this.hostElement, 'touchmove', touchHandler, { passive: false });\n\n \n const gestureHandler = (e: Event) => {\n if (this.isActive()) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n ['gesturestart', 'gesturechange', 'gestureend'].forEach(eventName => {\n this.addEventListener(this.hostElement, eventName, gestureHandler, { passive: false });\n });\n\n \n \n this.setupDocumentLevelPinchZoomPrevention();\n }\n\n \n private setupDocumentLevelPinchZoomPrevention(): void {\n \n const documentTouchHandler = (e: TouchEvent) => {\n if (!this.isActive()) return;\n if (!this.hostElement.contains(e.target as Node)) return;\n\n if (e.touches.length > 1) {\n e.preventDefault();\n }\n };\n\n document.addEventListener('touchstart', documentTouchHandler, { capture: true, passive: false });\n document.addEventListener('touchmove', documentTouchHandler, { capture: true, passive: false });\n\n this.cleanupFunctions.push(() => {\n document.removeEventListener('touchstart', documentTouchHandler, { capture: true });\n document.removeEventListener('touchmove', documentTouchHandler, { capture: true });\n });\n\n \n const documentGestureHandler = (e: Event) => {\n if (!this.isActive()) return;\n if (!this.hostElement.contains(e.target as Node)) return;\n e.preventDefault();\n };\n\n ['gesturestart', 'gesturechange', 'gestureend'].forEach(eventName => {\n document.addEventListener(eventName, documentGestureHandler, { capture: true, passive: false });\n this.cleanupFunctions.push(() =>\n document.removeEventListener(eventName, documentGestureHandler, { capture: true })\n );\n });\n }\n\n private addEventListener(\n element: HTMLElement | Document | Window,\n event: string,\n handler: (e: any) => void,\n options?: AddEventListenerOptions\n ): void {\n element.addEventListener(event, handler as EventListener, options);\n this.cleanupFunctions.push(() => element.removeEventListener(event, handler as EventListener, options));\n }\n\n private toggleActive(): void {\n this.setActive(!this.isActive());\n }\n\n private setActive(active: boolean): void {\n this.isActive.set(active);\n this.onActiveChange(active);\n }\n}\n","import { Signal } from '@angular/core';\nimport { CleanupFunction } from './event-handlers';\n\nexport interface ScrollControlOptions {\n \n disableScrollLock?: boolean;\n}\n\nexport class ScrollControl {\n private lockedScrollTop = 0;\n private wasActive = false;\n private rafId?: number;\n\n constructor(\n private scrollElement: HTMLElement,\n private isActive: Signal<boolean>,\n private options: ScrollControlOptions = {}\n ) {}\n\n setup(): CleanupFunction[] {\n const cleanups: CleanupFunction[] = [];\n\n \n const checkActiveState = () => {\n const isActiveNow = this.isActive();\n\n if (!this.options.disableScrollLock) {\n if (!isActiveNow && this.wasActive) {\n \n this.lockedScrollTop = this.scrollElement.scrollTop;\n } else if (!isActiveNow) {\n \n this.scrollElement.scrollTop = this.lockedScrollTop;\n }\n }\n \n\n this.wasActive = isActiveNow;\n this.rafId = requestAnimationFrame(checkActiveState);\n };\n checkActiveState();\n cleanups.push(() => {\n if (this.rafId !== undefined) {\n cancelAnimationFrame(this.rafId);\n }\n });\n\n \n const scrollHandler = () => {\n if (!this.options.disableScrollLock && !this.isActive()) {\n this.scrollElement.scrollTop = this.lockedScrollTop;\n }\n };\n this.scrollElement.addEventListener('scroll', scrollHandler);\n cleanups.push(() => this.scrollElement.removeEventListener('scroll', scrollHandler));\n\n return cleanups;\n }\n}\n","import { Directive, ElementRef, input, output, effect, signal, OnDestroy, inject } from '@angular/core';\nimport { ActiveControlEventHandlers, ScrollControl } from './handlers';\n\n\n@Directive({\n selector: '[appActiveControl]',\n standalone: true,\n host: {\n '[class.active]': 'isActive()',\n '[class.nodrag]': '!disableNodrag()',\n '[class.nowheel]': 'isActive()',\n }\n})\nexport class ActiveControlDirective implements OnDestroy {\n private readonly el = inject(ElementRef);\n readonly scrollSelector = input<string>();\n readonly scrollSelectors = input<string[]>();\n \n readonly disableStopPropagation = input<boolean>(false);\n \n readonly disableScrollLock = input<boolean>(false);\n \n readonly disableNodrag = input<boolean>(false);\n \n readonly focusTargetSelector = input<string>();\n readonly activeChange = output<boolean>();\n readonly isActive = signal<boolean>(false);\n\n private eventCleanupFunctions: (() => void)[] = [];\n private scrollCleanupFunctions: (() => void)[] = [];\n private eventHandlersInitialized = false;\n\n constructor() {\n \n effect(() => {\n if (!this.eventHandlersInitialized) {\n setTimeout(() => this.initializeEventHandlers(), 100);\n this.eventHandlersInitialized = true;\n }\n }, { allowSignalWrites: true });\n\n \n effect(() => {\n const selectors = this.getScrollSelectors();\n setTimeout(() => this.setupScrollControls(selectors), 150);\n });\n }\n\n ngOnDestroy(): void {\n this.eventCleanupFunctions.forEach(cleanup => cleanup());\n this.scrollCleanupFunctions.forEach(cleanup => cleanup());\n }\n\n private initializeEventHandlers(): void {\n const hostElement = this.el.nativeElement as HTMLElement;\n const scrollSelectors = this.getScrollSelectors();\n const eventHandlers = new ActiveControlEventHandlers(\n hostElement,\n this.isActive,\n (active) => this.activeChange.emit(active),\n {\n disableStopPropagation: this.disableStopPropagation(),\n scrollSelectors,\n focusTargetSelector: this.focusTargetSelector(),\n }\n );\n this.eventCleanupFunctions.push(...eventHandlers.setupAll());\n }\n\n private setupScrollControls(selectors: string[]): void {\n \n this.scrollCleanupFunctions.forEach(cleanup => cleanup());\n this.scrollCleanupFunctions = [];\n\n const hostElement = this.el.nativeElement as HTMLElement;\n const disableScrollLock = this.disableScrollLock();\n for (const selector of selectors) {\n \n const scrollElements = hostElement.querySelectorAll<HTMLElement>(selector);\n scrollElements.forEach(scrollElement => {\n const scrollControl = new ScrollControl(scrollElement, this.isActive, { disableScrollLock });\n this.scrollCleanupFunctions.push(...scrollControl.setup());\n });\n }\n }\n\n private getScrollSelectors(): string[] {\n const multiple = this.scrollSelectors();\n if (multiple && multiple.length > 0) {\n return multiple;\n }\n const single = this.scrollSelector();\n return single ? [single] : [];\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ng-atomic/common",
|
|
3
|
-
"version": "19.
|
|
3
|
+
"version": "19.80.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"peerDependencies": {
|
|
6
|
-
"@nx-ddd/core": "19.
|
|
7
|
-
"@nx-ddd/common": "19.
|
|
6
|
+
"@nx-ddd/core": "19.80.0",
|
|
7
|
+
"@nx-ddd/common": "19.80.0"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"tslib": "^2.3.0"
|
|
@@ -1,39 +1,14 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
2
|
import { OnDestroy } from '@angular/core';
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* アクティブ状態を管理するディレクティブ
|
|
6
|
-
*
|
|
7
|
-
* クリックでアクティブ化、外部クリックで非アクティブ化し、
|
|
8
|
-
* スクロール位置の固定やイベント伝播の制御を行います。
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```html
|
|
12
|
-
* <!-- 単一セレクタ -->
|
|
13
|
-
* <div appActiveControl
|
|
14
|
-
* [scrollSelector]="'.xterm-viewport'"
|
|
15
|
-
* (activeChange)="onActiveChange($event)">
|
|
16
|
-
* <!-- content -->
|
|
17
|
-
* </div>
|
|
18
|
-
*
|
|
19
|
-
* <!-- 複数セレクタ -->
|
|
20
|
-
* <div appActiveControl
|
|
21
|
-
* [scrollSelectors]="['.xterm-viewport', '.qtp-content']"
|
|
22
|
-
* (activeChange)="onActiveChange($event)">
|
|
23
|
-
* <!-- content -->
|
|
24
|
-
* </div>
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
4
|
declare class ActiveControlDirective implements OnDestroy {
|
|
28
5
|
private readonly el;
|
|
29
6
|
readonly scrollSelector: _angular_core.InputSignal<string | undefined>;
|
|
30
7
|
readonly scrollSelectors: _angular_core.InputSignal<string[] | undefined>;
|
|
31
|
-
/** mousedownでstopPropagationを呼ばない(React Flowなどのドラッグと共存するため) */
|
|
32
8
|
readonly disableStopPropagation: _angular_core.InputSignal<boolean>;
|
|
33
|
-
/** スクロール位置のロックを無効化する(常にスクロール可能にする) */
|
|
34
9
|
readonly disableScrollLock: _angular_core.InputSignal<boolean>;
|
|
35
|
-
/** nodragクラスを付与しない(React Flowのノードでドラッグを有効化するため) */
|
|
36
10
|
readonly disableNodrag: _angular_core.InputSignal<boolean>;
|
|
11
|
+
readonly focusTargetSelector: _angular_core.InputSignal<string | undefined>;
|
|
37
12
|
readonly activeChange: _angular_core.OutputEmitterRef<boolean>;
|
|
38
13
|
readonly isActive: _angular_core.WritableSignal<boolean>;
|
|
39
14
|
private eventCleanupFunctions;
|
|
@@ -45,7 +20,7 @@ declare class ActiveControlDirective implements OnDestroy {
|
|
|
45
20
|
private setupScrollControls;
|
|
46
21
|
private getScrollSelectors;
|
|
47
22
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ActiveControlDirective, never>;
|
|
48
|
-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ActiveControlDirective, "[appActiveControl]", never, { "scrollSelector": { "alias": "scrollSelector"; "required": false; "isSignal": true; }; "scrollSelectors": { "alias": "scrollSelectors"; "required": false; "isSignal": true; }; "disableStopPropagation": { "alias": "disableStopPropagation"; "required": false; "isSignal": true; }; "disableScrollLock": { "alias": "disableScrollLock"; "required": false; "isSignal": true; }; "disableNodrag": { "alias": "disableNodrag"; "required": false; "isSignal": true; }; }, { "activeChange": "activeChange"; }, never, never, true, never>;
|
|
23
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ActiveControlDirective, "[appActiveControl]", never, { "scrollSelector": { "alias": "scrollSelector"; "required": false; "isSignal": true; }; "scrollSelectors": { "alias": "scrollSelectors"; "required": false; "isSignal": true; }; "disableStopPropagation": { "alias": "disableStopPropagation"; "required": false; "isSignal": true; }; "disableScrollLock": { "alias": "disableScrollLock"; "required": false; "isSignal": true; }; "disableNodrag": { "alias": "disableNodrag"; "required": false; "isSignal": true; }; "focusTargetSelector": { "alias": "focusTargetSelector"; "required": false; "isSignal": true; }; }, { "activeChange": "activeChange"; }, never, never, true, never>;
|
|
49
24
|
}
|
|
50
25
|
|
|
51
26
|
export { ActiveControlDirective };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ng-atomic-common-directives-active-control.d.ts","sources":["../../../../../packages/@ng-atomic/common/src/lib/directives/active-control/active-control.directive.ts"],"sourcesContent":[null],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"ng-atomic-common-directives-active-control.d.ts","sources":["../../../../../packages/@ng-atomic/common/src/lib/directives/active-control/active-control.directive.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAIA,cAAA,sBAAA,YAAA,SAAA;AAUE;6BACuB,aAAA,CAAA,WAAA;8BACC,aAAA,CAAA,WAAA;qCAEO,aAAA,CAAA,WAAA;gCAEL,aAAA,CAAA,WAAA;4BAEJ,aAAA,CAAA,WAAA;kCAEM,aAAA,CAAA,WAAA;2BACP,aAAA,CAAA,gBAAA;uBACJ,aAAA,CAAA,cAAA;;;;;AAsBjB;AAKA;AAgBA;AAiBA;;;AAQD;;;;"}
|
|
@@ -6,11 +6,8 @@ declare class PreventBrowserZoomDirective implements OnDestroy {
|
|
|
6
6
|
private cleanupFns;
|
|
7
7
|
constructor();
|
|
8
8
|
private setupPreventionHandlers;
|
|
9
|
-
/** Ctrl+wheel(トラックパッドのピンチズーム) */
|
|
10
9
|
private preventCtrlWheel;
|
|
11
|
-
/** Ctrl/Cmd + Plus/Minus/0(キーボードズーム) */
|
|
12
10
|
private preventKeyboardZoom;
|
|
13
|
-
/** Safari のジェスチャーイベント */
|
|
14
11
|
private preventGestureZoom;
|
|
15
12
|
ngOnDestroy(): void;
|
|
16
13
|
static ɵfac: i0.ɵɵFactoryDeclaration<PreventBrowserZoomDirective, never>;
|