@aquera/ngx-smart-table 0.0.13-alpha → 0.0.15-alpha
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/esm2020/lib/editors/nile-select-editor.mjs +164 -64
- package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +2 -2
- package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +44 -1
- package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +30 -4
- package/fesm2015/aquera-ngx-smart-table.mjs +239 -69
- package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -1
- package/fesm2020/aquera-ngx-smart-table.mjs +235 -67
- package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -1
- package/lib/editors/nile-select-editor.d.ts +8 -0
- package/lib/renderer/components/st-table/st-table.component.d.ts +11 -0
- package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +16 -0
- package/package.json +1 -1
|
@@ -3534,6 +3534,8 @@ class NileSelectEditor {
|
|
|
3534
3534
|
this.eventListeners = [];
|
|
3535
3535
|
this.currentOptions = [];
|
|
3536
3536
|
this.isInitializing = false; // Flag to prevent immediate close during initialization
|
|
3537
|
+
this.hasSaved = false; // Flag to prevent double-save
|
|
3538
|
+
this.lastSelectedValue = ''; // Track the last selected value
|
|
3537
3539
|
// Handle Observable options
|
|
3538
3540
|
if (isObservable(options.options)) {
|
|
3539
3541
|
this.optionsSubscription = options.options.subscribe(opts => {
|
|
@@ -3552,6 +3554,77 @@ class NileSelectEditor {
|
|
|
3552
3554
|
}
|
|
3553
3555
|
}
|
|
3554
3556
|
}
|
|
3557
|
+
/**
|
|
3558
|
+
* Inject global styles to remove border from nile-select combobox
|
|
3559
|
+
* Uses ::part selector which works across shadow DOM boundaries
|
|
3560
|
+
*/
|
|
3561
|
+
injectBorderlessStyles() {
|
|
3562
|
+
if (NileSelectEditor.stylesInjected)
|
|
3563
|
+
return;
|
|
3564
|
+
const styleId = 'nile-select-borderless-styles';
|
|
3565
|
+
if (document.getElementById(styleId)) {
|
|
3566
|
+
NileSelectEditor.stylesInjected = true;
|
|
3567
|
+
return;
|
|
3568
|
+
}
|
|
3569
|
+
const style = document.createElement('style');
|
|
3570
|
+
style.id = styleId;
|
|
3571
|
+
style.textContent = `
|
|
3572
|
+
.st-cell-editor::part(combobox) {
|
|
3573
|
+
border: none !important;
|
|
3574
|
+
outline: none !important;
|
|
3575
|
+
box-shadow: none !important;
|
|
3576
|
+
min-height: unset !important;
|
|
3577
|
+
height: 100% !important;
|
|
3578
|
+
padding: 0 !important;
|
|
3579
|
+
}
|
|
3580
|
+
.st-cell-editor::part(combobox):hover {
|
|
3581
|
+
border: none !important;
|
|
3582
|
+
outline: none !important;
|
|
3583
|
+
box-shadow: none !important;
|
|
3584
|
+
}
|
|
3585
|
+
.st-cell-editor::part(combobox):focus {
|
|
3586
|
+
border: none !important;
|
|
3587
|
+
outline: none !important;
|
|
3588
|
+
box-shadow: none !important;
|
|
3589
|
+
}
|
|
3590
|
+
// .st-cell-editor::part(tag) {
|
|
3591
|
+
// margin: 1px 2px !important;
|
|
3592
|
+
// border-radius: 3px !important;
|
|
3593
|
+
// background-color: #e2e8f0 !important;
|
|
3594
|
+
// font-size: 12px !important;
|
|
3595
|
+
// height: auto !important;
|
|
3596
|
+
// }
|
|
3597
|
+
// .st-cell-editor::part(tag__base) {
|
|
3598
|
+
// border: none !important;
|
|
3599
|
+
// outline: none !important;
|
|
3600
|
+
// padding: 0 2px !important;
|
|
3601
|
+
// height: auto !important;
|
|
3602
|
+
// }
|
|
3603
|
+
// .st-cell-editor::part(tag__content) {
|
|
3604
|
+
// padding: 0 !important;
|
|
3605
|
+
// }
|
|
3606
|
+
.st-cell-editor::part(tags) {
|
|
3607
|
+
gap: 2px !important;
|
|
3608
|
+
align-items: center !important;
|
|
3609
|
+
}
|
|
3610
|
+
.st-cell-editor::part(tags-count) {
|
|
3611
|
+
margin: 0 !important;
|
|
3612
|
+
}
|
|
3613
|
+
.st-cell-editor::part(footer) {
|
|
3614
|
+
height: 35px !important;
|
|
3615
|
+
min-height: 35px !important;
|
|
3616
|
+
padding: 8px !important;
|
|
3617
|
+
padding-bottom: 30px !important;
|
|
3618
|
+
box-sizing: border-box !important;
|
|
3619
|
+
}
|
|
3620
|
+
.st-cell-editor::part(listbox) {
|
|
3621
|
+
margin-bottom: 0 !important;
|
|
3622
|
+
padding-bottom: 0 !important;
|
|
3623
|
+
}
|
|
3624
|
+
`;
|
|
3625
|
+
document.head.appendChild(style);
|
|
3626
|
+
NileSelectEditor.stylesInjected = true;
|
|
3627
|
+
}
|
|
3555
3628
|
edit(context) {
|
|
3556
3629
|
if (!context.container) {
|
|
3557
3630
|
console.warn('NileSelectEditor requires a container element');
|
|
@@ -3559,13 +3632,23 @@ class NileSelectEditor {
|
|
|
3559
3632
|
}
|
|
3560
3633
|
// Set initializing flag to prevent immediate close
|
|
3561
3634
|
this.isInitializing = true;
|
|
3635
|
+
this.hasSaved = false;
|
|
3636
|
+
this.lastSelectedValue = '';
|
|
3562
3637
|
// Create NileSelect custom element using document.createElement
|
|
3563
3638
|
this.select = document.createElement('nile-select');
|
|
3564
3639
|
this.select.className = 'st-cell-editor';
|
|
3565
|
-
// Apply inline styles for proper cell fitting
|
|
3566
|
-
this.select.style.width = '100%';
|
|
3567
|
-
this.select.style.height = '
|
|
3640
|
+
// Apply inline styles for proper cell fitting - prevent height changes
|
|
3641
|
+
this.select.style.width = 'calc(100% - 4px)';
|
|
3642
|
+
this.select.style.height = '100%';
|
|
3643
|
+
this.select.style.maxHeight = '100%';
|
|
3568
3644
|
this.select.style.boxSizing = 'border-box';
|
|
3645
|
+
this.select.style.margin = '0 2px';
|
|
3646
|
+
this.select.style.overflow = 'hidden';
|
|
3647
|
+
// Inject styles to remove border using ::part selector
|
|
3648
|
+
this.injectBorderlessStyles();
|
|
3649
|
+
// Also try removing outline on host element
|
|
3650
|
+
this.select.style.outline = 'none';
|
|
3651
|
+
this.select.style.border = 'none';
|
|
3569
3652
|
// Set initial value
|
|
3570
3653
|
this.setInitialValue(context.value);
|
|
3571
3654
|
// Apply all configuration options
|
|
@@ -3577,27 +3660,22 @@ class NileSelectEditor {
|
|
|
3577
3660
|
// Clear container and append select
|
|
3578
3661
|
context.container.innerHTML = '';
|
|
3579
3662
|
context.container.appendChild(this.select);
|
|
3580
|
-
// Focus after render
|
|
3663
|
+
// Focus and auto-open after render
|
|
3581
3664
|
setTimeout(() => {
|
|
3582
3665
|
var _a;
|
|
3583
3666
|
(_a = this.select) === null || _a === void 0 ? void 0 : _a.focus();
|
|
3584
|
-
//
|
|
3667
|
+
// Auto-open the dropdown
|
|
3585
3668
|
if (this.select) {
|
|
3586
3669
|
this.select.open = true;
|
|
3587
3670
|
}
|
|
3588
|
-
//
|
|
3589
|
-
|
|
3590
|
-
|
|
3671
|
+
// Clear initializing flag after dropdown has opened
|
|
3672
|
+
setTimeout(() => {
|
|
3673
|
+
this.isInitializing = false;
|
|
3674
|
+
// For multi-select, find the portal div for click detection
|
|
3675
|
+
if (this.options.multiple) {
|
|
3591
3676
|
this.portalDiv = document.querySelector('.nile-select-portal-append');
|
|
3592
|
-
|
|
3593
|
-
|
|
3594
|
-
}
|
|
3595
|
-
else {
|
|
3596
|
-
// Clear initializing flag after dropdown has time to open
|
|
3597
|
-
setTimeout(() => {
|
|
3598
|
-
this.isInitializing = false;
|
|
3599
|
-
}, 100);
|
|
3600
|
-
}
|
|
3677
|
+
}
|
|
3678
|
+
}, 100);
|
|
3601
3679
|
}, 0);
|
|
3602
3680
|
}
|
|
3603
3681
|
/**
|
|
@@ -3762,6 +3840,31 @@ class NileSelectEditor {
|
|
|
3762
3840
|
if (!this.select)
|
|
3763
3841
|
return;
|
|
3764
3842
|
const validateOnSave = this.options.validateOnSave !== false;
|
|
3843
|
+
// Prevent click events from bubbling up to the cell container
|
|
3844
|
+
const selectClickHandler = (e) => {
|
|
3845
|
+
e.stopPropagation();
|
|
3846
|
+
};
|
|
3847
|
+
this.select.addEventListener('click', selectClickHandler);
|
|
3848
|
+
this.eventListeners.push({ event: 'click', handler: selectClickHandler });
|
|
3849
|
+
// For single-select with portal, listen to document mousedown to detect option selection
|
|
3850
|
+
// Use mousedown because it fires before blur
|
|
3851
|
+
if (!this.options.multiple) {
|
|
3852
|
+
const documentMouseDownHandler = (e) => {
|
|
3853
|
+
var _a, _b;
|
|
3854
|
+
const composedPath = ((_a = e.composedPath) === null || _a === void 0 ? void 0 : _a.call(e)) || [];
|
|
3855
|
+
// Look for nile-option in the event path
|
|
3856
|
+
for (const el of composedPath) {
|
|
3857
|
+
if (el instanceof HTMLElement && ((_b = el.tagName) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === 'nile-option') {
|
|
3858
|
+
const optionValue = el.getAttribute('value') || el.value || '';
|
|
3859
|
+
this.lastSelectedValue = optionValue;
|
|
3860
|
+
return;
|
|
3861
|
+
}
|
|
3862
|
+
}
|
|
3863
|
+
};
|
|
3864
|
+
// Add listener immediately (mousedown fires before blur, so no need for delay)
|
|
3865
|
+
document.addEventListener('mousedown', documentMouseDownHandler, true); // capture phase
|
|
3866
|
+
this.eventListeners.push({ event: 'document-mousedown', handler: documentMouseDownHandler });
|
|
3867
|
+
}
|
|
3765
3868
|
// Handle keyboard events (keydown is not replaced by custom events)
|
|
3766
3869
|
const keydownHandler = (e) => {
|
|
3767
3870
|
const keyEvent = e;
|
|
@@ -3773,57 +3876,46 @@ class NileSelectEditor {
|
|
|
3773
3876
|
};
|
|
3774
3877
|
this.select.addEventListener('keydown', keydownHandler);
|
|
3775
3878
|
this.eventListeners.push({ event: 'keydown', handler: keydownHandler });
|
|
3776
|
-
// Use nile-
|
|
3777
|
-
|
|
3778
|
-
|
|
3779
|
-
//
|
|
3780
|
-
|
|
3781
|
-
|
|
3782
|
-
}
|
|
3783
|
-
const customEvent = e;
|
|
3784
|
-
if (validateOnSave && !((_a = this.select) === null || _a === void 0 ? void 0 : _a.checkValidity())) {
|
|
3785
|
-
(_b = this.select) === null || _b === void 0 ? void 0 : _b.reportValidity();
|
|
3879
|
+
// Use nile-blur event as save trigger for single-select
|
|
3880
|
+
// Add a small delay to allow the value to update before reading
|
|
3881
|
+
const singleSelectSaveHandler = (e) => {
|
|
3882
|
+
// Don't save again if already saved
|
|
3883
|
+
// Ignore events that fire during initialization (e.g. when setting initial value)
|
|
3884
|
+
if (this.hasSaved || this.isInitializing) {
|
|
3786
3885
|
return;
|
|
3787
3886
|
}
|
|
3788
|
-
// Only save
|
|
3789
|
-
// Multi-select saves on outside click
|
|
3887
|
+
// Only save for single-select
|
|
3790
3888
|
if (!this.options.multiple) {
|
|
3791
|
-
|
|
3792
|
-
}
|
|
3793
|
-
};
|
|
3794
|
-
this.select.addEventListener('nile-change', changeHandler);
|
|
3795
|
-
this.eventListeners.push({ event: 'nile-change', handler: changeHandler });
|
|
3796
|
-
// Handle blur as secondary save trigger
|
|
3797
|
-
const blurHandler = (e) => {
|
|
3798
|
-
var _a, _b;
|
|
3799
|
-
// Ignore blur during initialization
|
|
3800
|
-
if (this.isInitializing) {
|
|
3801
|
-
return;
|
|
3802
|
-
}
|
|
3803
|
-
if (validateOnSave && !((_a = this.select) === null || _a === void 0 ? void 0 : _a.checkValidity())) {
|
|
3804
|
-
(_b = this.select) === null || _b === void 0 ? void 0 : _b.reportValidity();
|
|
3805
|
-
return;
|
|
3806
|
-
}
|
|
3807
|
-
// context.onSave(this.getCurrentValue());
|
|
3808
|
-
};
|
|
3809
|
-
this.select.addEventListener('nile-blur', blurHandler);
|
|
3810
|
-
this.eventListeners.push({ event: 'nile-blur', handler: blurHandler });
|
|
3811
|
-
// Handle nile-hide event to prevent unwanted closing during initialization
|
|
3812
|
-
const hideHandler = (e) => {
|
|
3813
|
-
// If dropdown closes during initialization, re-open it (for both single and multi-select)
|
|
3814
|
-
if (this.isInitializing) {
|
|
3815
|
-
e.preventDefault();
|
|
3816
|
-
e.stopPropagation();
|
|
3817
|
-
// Re-open the dropdown after a brief delay using the open property
|
|
3889
|
+
// Add a small delay to let the value update after selection
|
|
3818
3890
|
setTimeout(() => {
|
|
3819
|
-
|
|
3820
|
-
|
|
3891
|
+
var _a, _b, _c;
|
|
3892
|
+
// Check again after timeout in case saved by another handler
|
|
3893
|
+
if (this.hasSaved) {
|
|
3894
|
+
return;
|
|
3821
3895
|
}
|
|
3822
|
-
|
|
3896
|
+
if (validateOnSave && !((_a = this.select) === null || _a === void 0 ? void 0 : _a.checkValidity())) {
|
|
3897
|
+
(_b = this.select) === null || _b === void 0 ? void 0 : _b.reportValidity();
|
|
3898
|
+
return;
|
|
3899
|
+
}
|
|
3900
|
+
// Use lastSelectedValue if available, otherwise get from element
|
|
3901
|
+
const target = e.target;
|
|
3902
|
+
const value = this.lastSelectedValue || (target === null || target === void 0 ? void 0 : target.value) || ((_c = this.select) === null || _c === void 0 ? void 0 : _c.value) || '';
|
|
3903
|
+
this.hasSaved = true;
|
|
3904
|
+
context.onSave(this.parseValue(value));
|
|
3905
|
+
}, 50); // 50ms delay to allow value to update
|
|
3823
3906
|
}
|
|
3824
3907
|
};
|
|
3825
|
-
|
|
3826
|
-
|
|
3908
|
+
// Listen to blur and nile-blur events for focus loss detection
|
|
3909
|
+
// Nile web components emit nile-blur custom event instead of native blur
|
|
3910
|
+
this.select.addEventListener('blur', singleSelectSaveHandler);
|
|
3911
|
+
this.eventListeners.push({ event: 'blur', handler: singleSelectSaveHandler });
|
|
3912
|
+
this.select.addEventListener('nile-blur', singleSelectSaveHandler);
|
|
3913
|
+
this.eventListeners.push({ event: 'nile-blur', handler: singleSelectSaveHandler });
|
|
3914
|
+
// Also listen to change events as fallback
|
|
3915
|
+
this.select.addEventListener('nile-change', singleSelectSaveHandler);
|
|
3916
|
+
this.eventListeners.push({ event: 'nile-change', handler: singleSelectSaveHandler });
|
|
3917
|
+
this.select.addEventListener('change', singleSelectSaveHandler);
|
|
3918
|
+
this.eventListeners.push({ event: 'change', handler: singleSelectSaveHandler });
|
|
3827
3919
|
// Handle clear button if enabled
|
|
3828
3920
|
if (this.options.clearable) {
|
|
3829
3921
|
const clearHandler = (e) => {
|
|
@@ -3871,7 +3963,8 @@ class NileSelectEditor {
|
|
|
3871
3963
|
setTimeout(() => {
|
|
3872
3964
|
// Only add if select still exists (editor not destroyed)
|
|
3873
3965
|
if (this.select) {
|
|
3874
|
-
|
|
3966
|
+
// Use bubbling phase (false) instead of capture to not interfere with nile-select's toggle
|
|
3967
|
+
document.addEventListener('click', documentClickHandler, false);
|
|
3875
3968
|
this.eventListeners.push({
|
|
3876
3969
|
event: 'document-click',
|
|
3877
3970
|
handler: documentClickHandler
|
|
@@ -3898,8 +3991,10 @@ class NileSelectEditor {
|
|
|
3898
3991
|
return value;
|
|
3899
3992
|
}
|
|
3900
3993
|
destroy() {
|
|
3901
|
-
// Reset
|
|
3994
|
+
// Reset flags
|
|
3902
3995
|
this.isInitializing = false;
|
|
3996
|
+
this.hasSaved = false;
|
|
3997
|
+
this.lastSelectedValue = '';
|
|
3903
3998
|
// Unsubscribe from options Observable
|
|
3904
3999
|
if (this.optionsSubscription) {
|
|
3905
4000
|
this.optionsSubscription.unsubscribe();
|
|
@@ -3910,8 +4005,12 @@ class NileSelectEditor {
|
|
|
3910
4005
|
this.eventListeners.forEach(({ event, handler }) => {
|
|
3911
4006
|
var _a;
|
|
3912
4007
|
if (event === 'document-click') {
|
|
3913
|
-
// Remove from document for multi-select click handler
|
|
3914
|
-
document.removeEventListener('click', handler,
|
|
4008
|
+
// Remove from document for multi-select click handler (bubbling phase)
|
|
4009
|
+
document.removeEventListener('click', handler, false);
|
|
4010
|
+
}
|
|
4011
|
+
else if (event === 'document-mousedown') {
|
|
4012
|
+
// Remove from document for single-select option mousedown handler (capture phase)
|
|
4013
|
+
document.removeEventListener('mousedown', handler, true);
|
|
3915
4014
|
}
|
|
3916
4015
|
else {
|
|
3917
4016
|
// Remove from select element
|
|
@@ -3941,6 +4040,7 @@ class NileSelectEditor {
|
|
|
3941
4040
|
return (Array.isArray(value) ? (value.length > 0 ? value[0] : '') : value);
|
|
3942
4041
|
}
|
|
3943
4042
|
}
|
|
4043
|
+
NileSelectEditor.stylesInjected = false;
|
|
3944
4044
|
|
|
3945
4045
|
/**
|
|
3946
4046
|
* Custom editor using NileAutoComplete from @aquera/nile-elements
|
|
@@ -5156,10 +5256,10 @@ class StCellComponent {
|
|
|
5156
5256
|
}
|
|
5157
5257
|
}
|
|
5158
5258
|
StCellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
5159
|
-
StCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StCellComponent, selector: "st-cell", inputs: { cell: "cell", editMode: "editMode", tableState: "tableState", tableConfig: "tableConfig", columnIndex: "columnIndex" }, outputs: { cellChange: "cellChange", cellEdit: "cellEdit", cellSave: "cellSave", cellCancel: "cellCancel", cellSaveAndNavigate: "cellSaveAndNavigate" }, host: { listeners: { "keydown": "onCellKeyDown($event)" } }, viewQueries: [{ propertyName: "editorContainer", first: true, predicate: ["editorContainer"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"st-cell\" \n [ngClass]=\"{\n 'editing': cell.isEditing(),\n 'dirty': cell.isDirty(),\n 'invalid': !cell.isValid(),\n 'readonly': !isEditable\n }\"\n (click)=\"onCellClick()\" \n (dblclick)=\"onCellDoubleClick()\">\n\n <!-- Display Mode with Template Support -->\n <ng-container *ngIf=\"!cell.isEditing()\">\n <!-- Custom Template -->\n <ng-container *ngIf=\"hasCellTemplate\">\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: templateContext\"></ng-container>\n </ng-container>\n\n <!-- Default Text Rendering -->\n <span *ngIf=\"!hasCellTemplate\" class=\"cell-display\">\n {{ cell.render() }}\n </span>\n </ng-container>\n\n <!-- Edit Mode -->\n <div *ngIf=\"cell.isEditing()\" class=\"cell-editor\" #editorContainer>\n </div>\n</div>", styles: [".st-cell{position:relative;cursor:pointer;transition:background-color .2s;min-height:28px;display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;box-sizing:border-box}.st-cell.invalid{border-left:2px solid #e53e3e}.st-cell.readonly{cursor:default}.cell-display{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;align-content:center;width:100%;height:100%;padding-left:8px;padding-right:8px;font-size:12px;font-weight:300;letter-spacing:.2px;line-height:14px}.cell-editor{display:flex;height:100%;width:100%}.cell-editor input,.cell-editor select,.cell-editor textarea{width:100%;border:none;outline:none;font:inherit;padding:0;background:transparent;color:inherit}.cell-editor input[type=number]{text-align:inherit}.cell-error{position:absolute;right:4px;top:50%;transform:translateY(-50%);color:#e53e3e;font-weight:700;cursor:help;font-size:14px}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
|
|
5259
|
+
StCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StCellComponent, selector: "st-cell", inputs: { cell: "cell", editMode: "editMode", tableState: "tableState", tableConfig: "tableConfig", columnIndex: "columnIndex" }, outputs: { cellChange: "cellChange", cellEdit: "cellEdit", cellSave: "cellSave", cellCancel: "cellCancel", cellSaveAndNavigate: "cellSaveAndNavigate" }, host: { listeners: { "keydown": "onCellKeyDown($event)" } }, viewQueries: [{ propertyName: "editorContainer", first: true, predicate: ["editorContainer"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"st-cell\" \n [ngClass]=\"{\n 'editing': cell.isEditing(),\n 'dirty': cell.isDirty(),\n 'invalid': !cell.isValid(),\n 'readonly': !isEditable\n }\"\n (click)=\"onCellClick()\" \n (dblclick)=\"onCellDoubleClick()\">\n\n <!-- Display Mode with Template Support -->\n <ng-container *ngIf=\"!cell.isEditing()\">\n <!-- Custom Template -->\n <ng-container *ngIf=\"hasCellTemplate\">\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: templateContext\"></ng-container>\n </ng-container>\n\n <!-- Default Text Rendering -->\n <span *ngIf=\"!hasCellTemplate\" class=\"cell-display\">\n {{ cell.render() }}\n </span>\n </ng-container>\n\n <!-- Edit Mode -->\n <div *ngIf=\"cell.isEditing()\" class=\"cell-editor\" #editorContainer>\n </div>\n</div>", styles: [".st-cell{position:relative;cursor:pointer;transition:background-color .2s;min-height:28px;display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;box-sizing:border-box}.st-cell.invalid{border-left:2px solid #e53e3e}.st-cell.readonly{cursor:default}.cell-display{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;align-content:center;width:100%;height:100%;padding-left:8px;padding-right:8px;font-size:12px;font-weight:300;letter-spacing:.2px;line-height:14px}.cell-editor{display:flex;height:100%;width:100%}.cell-editor input,.cell-editor select,.cell-editor textarea{width:100%;border:none;outline:none;font:inherit;padding:0;background:transparent;color:inherit}.cell-editor input[type=number]{text-align:inherit}.cell-editor nile-select::part(combobox){border:none!important;outline:none!important;box-shadow:none!important}.cell-editor nile-select::part(tag){border:none!important;outline:none!important}.cell-editor nile-select::part(listbox){border:none!important}.cell-error{position:absolute;right:4px;top:50%;transform:translateY(-50%);color:#e53e3e;font-weight:700;cursor:help;font-size:14px}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
|
|
5160
5260
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StCellComponent, decorators: [{
|
|
5161
5261
|
type: Component,
|
|
5162
|
-
args: [{ selector: 'st-cell', template: "<div class=\"st-cell\" \n [ngClass]=\"{\n 'editing': cell.isEditing(),\n 'dirty': cell.isDirty(),\n 'invalid': !cell.isValid(),\n 'readonly': !isEditable\n }\"\n (click)=\"onCellClick()\" \n (dblclick)=\"onCellDoubleClick()\">\n\n <!-- Display Mode with Template Support -->\n <ng-container *ngIf=\"!cell.isEditing()\">\n <!-- Custom Template -->\n <ng-container *ngIf=\"hasCellTemplate\">\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: templateContext\"></ng-container>\n </ng-container>\n\n <!-- Default Text Rendering -->\n <span *ngIf=\"!hasCellTemplate\" class=\"cell-display\">\n {{ cell.render() }}\n </span>\n </ng-container>\n\n <!-- Edit Mode -->\n <div *ngIf=\"cell.isEditing()\" class=\"cell-editor\" #editorContainer>\n </div>\n</div>", styles: [".st-cell{position:relative;cursor:pointer;transition:background-color .2s;min-height:28px;display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;box-sizing:border-box}.st-cell.invalid{border-left:2px solid #e53e3e}.st-cell.readonly{cursor:default}.cell-display{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;align-content:center;width:100%;height:100%;padding-left:8px;padding-right:8px;font-size:12px;font-weight:300;letter-spacing:.2px;line-height:14px}.cell-editor{display:flex;height:100%;width:100%}.cell-editor input,.cell-editor select,.cell-editor textarea{width:100%;border:none;outline:none;font:inherit;padding:0;background:transparent;color:inherit}.cell-editor input[type=number]{text-align:inherit}.cell-error{position:absolute;right:4px;top:50%;transform:translateY(-50%);color:#e53e3e;font-weight:700;cursor:help;font-size:14px}\n"] }]
|
|
5262
|
+
args: [{ selector: 'st-cell', template: "<div class=\"st-cell\" \n [ngClass]=\"{\n 'editing': cell.isEditing(),\n 'dirty': cell.isDirty(),\n 'invalid': !cell.isValid(),\n 'readonly': !isEditable\n }\"\n (click)=\"onCellClick()\" \n (dblclick)=\"onCellDoubleClick()\">\n\n <!-- Display Mode with Template Support -->\n <ng-container *ngIf=\"!cell.isEditing()\">\n <!-- Custom Template -->\n <ng-container *ngIf=\"hasCellTemplate\">\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: templateContext\"></ng-container>\n </ng-container>\n\n <!-- Default Text Rendering -->\n <span *ngIf=\"!hasCellTemplate\" class=\"cell-display\">\n {{ cell.render() }}\n </span>\n </ng-container>\n\n <!-- Edit Mode -->\n <div *ngIf=\"cell.isEditing()\" class=\"cell-editor\" #editorContainer>\n </div>\n</div>", styles: [".st-cell{position:relative;cursor:pointer;transition:background-color .2s;min-height:28px;display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;box-sizing:border-box}.st-cell.invalid{border-left:2px solid #e53e3e}.st-cell.readonly{cursor:default}.cell-display{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;align-content:center;width:100%;height:100%;padding-left:8px;padding-right:8px;font-size:12px;font-weight:300;letter-spacing:.2px;line-height:14px}.cell-editor{display:flex;height:100%;width:100%}.cell-editor input,.cell-editor select,.cell-editor textarea{width:100%;border:none;outline:none;font:inherit;padding:0;background:transparent;color:inherit}.cell-editor input[type=number]{text-align:inherit}.cell-editor nile-select::part(combobox){border:none!important;outline:none!important;box-shadow:none!important}.cell-editor nile-select::part(tag){border:none!important;outline:none!important}.cell-editor nile-select::part(listbox){border:none!important}.cell-error{position:absolute;right:4px;top:50%;transform:translateY(-50%);color:#e53e3e;font-weight:700;cursor:help;font-size:14px}\n"] }]
|
|
5163
5263
|
}], ctorParameters: function () { return []; }, propDecorators: { cell: [{
|
|
5164
5264
|
type: Input
|
|
5165
5265
|
}], editMode: [{
|
|
@@ -8757,6 +8857,51 @@ class StTableComponent {
|
|
|
8757
8857
|
scrollContainer.scrollTop += (cellRect.bottom - visibleBottom);
|
|
8758
8858
|
}
|
|
8759
8859
|
}
|
|
8860
|
+
/**
|
|
8861
|
+
* Scroll to a specific row by index and optionally focus it
|
|
8862
|
+
* @param rowIndex - The index of the row to scroll to
|
|
8863
|
+
* @param focusFirstCell - Whether to focus the first editable cell (default: false)
|
|
8864
|
+
*/
|
|
8865
|
+
scrollToRowAndFocus(rowIndex, focusFirstCell = false) {
|
|
8866
|
+
setTimeout(() => {
|
|
8867
|
+
var _a;
|
|
8868
|
+
const hostElement = (_a = this.elementRef) === null || _a === void 0 ? void 0 : _a.nativeElement;
|
|
8869
|
+
if (!hostElement)
|
|
8870
|
+
return;
|
|
8871
|
+
// Find the target row
|
|
8872
|
+
const rows = hostElement.querySelectorAll('tbody tr');
|
|
8873
|
+
const targetRow = rows[rowIndex];
|
|
8874
|
+
if (targetRow) {
|
|
8875
|
+
// Scroll the row into view
|
|
8876
|
+
targetRow.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
|
8877
|
+
// Optionally focus the first editable cell
|
|
8878
|
+
if (focusFirstCell) {
|
|
8879
|
+
const cells = targetRow.querySelectorAll('td:not(.settings-column):not(.row-number-cell)');
|
|
8880
|
+
const firstCell = cells[0];
|
|
8881
|
+
if (firstCell && typeof firstCell.focus === 'function') {
|
|
8882
|
+
setTimeout(() => {
|
|
8883
|
+
firstCell.focus();
|
|
8884
|
+
// Update table state focus position
|
|
8885
|
+
if (this.tableState) {
|
|
8886
|
+
this.tableState.focusCell(rowIndex, 0);
|
|
8887
|
+
}
|
|
8888
|
+
}, 100);
|
|
8889
|
+
}
|
|
8890
|
+
}
|
|
8891
|
+
}
|
|
8892
|
+
}, 0);
|
|
8893
|
+
}
|
|
8894
|
+
/**
|
|
8895
|
+
* Scroll to the last row in the table
|
|
8896
|
+
* @param focusFirstCell - Whether to focus the first editable cell (default: true)
|
|
8897
|
+
*/
|
|
8898
|
+
scrollToLastRow(focusFirstCell = true) {
|
|
8899
|
+
var _a;
|
|
8900
|
+
const rowCount = ((_a = this.data) === null || _a === void 0 ? void 0 : _a.length) || 0;
|
|
8901
|
+
if (rowCount > 0) {
|
|
8902
|
+
this.scrollToRowAndFocus(rowCount - 1, focusFirstCell);
|
|
8903
|
+
}
|
|
8904
|
+
}
|
|
8760
8905
|
/**
|
|
8761
8906
|
* Get the scroll container element
|
|
8762
8907
|
*/
|
|
@@ -10294,12 +10439,34 @@ class StWorkbookComponent {
|
|
|
10294
10439
|
};
|
|
10295
10440
|
window.addEventListener('beforeunload', this.beforeUnloadHandler);
|
|
10296
10441
|
}
|
|
10442
|
+
// ===================================================
|
|
10443
|
+
// Public API Methods
|
|
10444
|
+
// ===================================================
|
|
10445
|
+
/**
|
|
10446
|
+
* Scroll to a specific row in the current table
|
|
10447
|
+
* @param rowIndex - The index of the row to scroll to
|
|
10448
|
+
* @param focusFirstCell - Whether to focus the first editable cell (default: false)
|
|
10449
|
+
*/
|
|
10450
|
+
scrollToRow(rowIndex, focusFirstCell = false) {
|
|
10451
|
+
if (this.tableComponent) {
|
|
10452
|
+
this.tableComponent.scrollToRowAndFocus(rowIndex, focusFirstCell);
|
|
10453
|
+
}
|
|
10454
|
+
}
|
|
10455
|
+
/**
|
|
10456
|
+
* Scroll to the last row in the current table
|
|
10457
|
+
* @param focusFirstCell - Whether to focus the first editable cell (default: true)
|
|
10458
|
+
*/
|
|
10459
|
+
scrollToLastRow(focusFirstCell = true) {
|
|
10460
|
+
if (this.tableComponent) {
|
|
10461
|
+
this.tableComponent.scrollToLastRow(focusFirstCell);
|
|
10462
|
+
}
|
|
10463
|
+
}
|
|
10297
10464
|
}
|
|
10298
10465
|
StWorkbookComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StWorkbookComponent, deps: [{ token: AutosaveService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
10299
|
-
StWorkbookComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StWorkbookComponent, selector: "st-workbook", inputs: { config: "config", sheetsData: "sheetsData", state: "state" }, outputs: { sheetChanged: "sheetChanged", addSheet: "addSheet", sheetTabAction: "sheetTabAction", workbookAction: "workbookAction", cellChange: "cellChange", cellSave: "cellSave", tableStateChange: "tableStateChange", fullscreenToggle: "fullscreenToggle", requestAddRow: "requestAddRow" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"workbook-container\" [class.fullscreen]=\"isFullscreen$ | async\">\n <nile-tab-group [activeIndex]=\"activeSheetIndex\">\n \n <!-- Sheet Tabs (one per sheet) -->\n <nile-tab *ngFor=\"let sheet of sheets; let i = index\"\n slot=\"nav\" \n panel=\"shared-panel\"\n [class.active]=\"i === activeSheetIndex\"\n (click)=\"onTabChange(i)\">\n <div class=\"sheet-tab-content\">\n <span class=\"sheet-name\">{{ sheet.name }}</span>\n \n <!-- Tab actions dropdown button -->\n <button class=\"tab-actions-button\"\n (click)=\"openTabActions($event, sheet, i)\"\n *ngIf=\"hasTabActions(sheet)\">\n <nile-icon name=\"arrowdown\" size=\"14\"></nile-icon>\n </button>\n </div>\n </nile-tab>\n \n <!-- Toolbar Tab (for workbook controls) -->\n <nile-tab slot=\"nav\" \n panel=\"shared-panel\"\n class=\"workbook-toolbar-tab\"\n [disabled]=\"true\">\n <div class=\"workbook-toolbar-content\">\n <!-- Autosave Indicator -->\n <div class=\"autosave-indicator\" *ngIf=\"autosaveEnabled\">\n <nile-icon \n *ngIf=\"!isSaving && lastSaveTime\" \n name=\"save\" \n size=\"14\"\n [title]=\"'Saved at ' + (lastSaveTime | date:'HH:mm:ss')\">\n </nile-icon>\n <nile-icon \n *ngIf=\"isSaving\" \n name=\"loader\" \n size=\"14\"\n title=\"Saving...\">\n </nile-icon>\n </div>\n\n <!-- Workbook Actions Dropdown -->\n <button class=\"workbook-actions-button\"\n *ngIf=\"config.workbookActions && config.workbookActions.length > 0\"\n (click)=\"toggleWorkbookActions($event)\"\n title=\"Workbook Actions\">\n <nile-icon name=\"settings\"></nile-icon>\n </button>\n \n <!-- Add Sheet Button -->\n <button class=\"add-sheet-button\"\n *ngIf=\"canAddSheet\"\n (click)=\"onAddSheet()\"\n title=\"Add Sheet\">\n <nile-icon name=\"plus\"></nile-icon>\n </button>\n \n <!-- Fullscreen Button -->\n <button class=\"fullscreen-button\"\n *ngIf=\"config.display?.allowFullscreen !== false\"\n (click)=\"toggleFullscreen()\"\n [title]=\"(isFullscreen$ | async) ? 'Exit Fullscreen' : 'Fullscreen'\">\n <nile-icon [name]=\"(isFullscreen$ | async) ? 'collapse' : 'expand-06'\"></nile-icon>\n </button>\n </div>\n </nile-tab>\n \n <!-- Single Shared Tab Panel -->\n <nile-tab-panel name=\"shared-panel\">\n <!-- Lazy loading strategy: table is destroyed and recreated with new config/state when sheet changes -->\n <!-- Using ngFor with trackBy to force complete reinitialization when tableComponentKey changes -->\n <ng-container *ngFor=\"let key of [tableComponentKey]; trackBy: trackByKey\">\n <st-table *ngIf=\"currentTableConfig && currentTableState\"\n [attr.data-sheet-key]=\"key\"\n [tableConfig]=\"currentTableConfig\"\n [data$]=\"currentTableData$\"\n [tableState]=\"currentTableState\"\n (cellChange)=\"onCellChange($event)\"\n (cellSave)=\"onCellSave($event)\"\n (stateChange)=\"onTableStateChange($event)\"\n (requestAddRow)=\"onRequestAddRow($event)\">\n </st-table>\n </ng-container>\n </nile-tab-panel>\n \n </nile-tab-group>\n</div>\n\n<!-- Tab Actions Dropdown -->\n<div class=\"tab-actions-dropdown\" \n *ngIf=\"tabActionsOpen\"\n [ngStyle]=\"tabActionsPosition\">\n <div class=\"dropdown-backdrop\" (click)=\"closeTabActions()\"></div>\n <div class=\"dropdown-menu\">\n <nile-menu>\n <nile-menu-item *ngFor=\"let action of selectedSheet?.tabActions\" \n (click)=\"onTabActionClick(action, $event)\">\n <nile-icon *ngIf=\"action.icon\" slot=\"prefix\" size=\"14\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n<!-- Workbook Actions Dropdown -->\n<div class=\"workbook-actions-dropdown\"\n *ngIf=\"workbookActionsOpen\"\n [ngStyle]=\"workbookActionsPosition\">\n <div class=\"dropdown-backdrop\" (click)=\"closeWorkbookActions()\"></div>\n <div class=\"dropdown-menu\">\n <nile-menu>\n <nile-menu-item *ngFor=\"let action of visibleWorkbookActions\"\n [class.disabled]=\"isActionDisabled(action)\"\n (click)=\"onWorkbookActionClick(action, $event)\">\n <nile-icon *ngIf=\"action.icon\" slot=\"prefix\" size=\"14\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n<!-- Fullscreen Backdrop -->\n<div class=\"fullscreen-backdrop\" \n *ngIf=\"isFullscreen$ | async\"\n (click)=\"toggleFullscreen()\">\n</div>\n\n", styles: ["@import\"@aquera/nile/lib/styles/variables.css\";:host{display:block;width:100%;height:100%}.workbook-container{display:flex;flex-direction:column;height:100%;background:white;border:1px solid var(--nile-color-neutral-200);border-radius:4px;overflow:hidden}.workbook-container.fullscreen{position:fixed;inset:0;z-index:2000;border:none;border-radius:0}.workbook-container nile-tab-group{height:100%;display:flex;flex-direction:column}.sheet-tab-content{display:flex;align-items:center;gap:8px;padding:0 4px}.sheet-tab-content .sheet-name{font-size:12px;font-weight:500;font-family:var(--nile-font-family-sans-serif);color:#000}.sheet-tab-content .tab-actions-button{width:20px;height:20px;padding:0;background:transparent;border:none;cursor:pointer}.workbook-toolbar-tab{margin-left:auto!important;pointer-events:auto!important;border-left:1px solid var(--nile-color-neutral-200)}.workbook-toolbar-tab .workbook-toolbar-content{display:flex;gap:4px;align-items:center;padding:0 8px}.workbook-toolbar-tab .workbook-toolbar-content .autosave-indicator{display:flex;align-items:center;margin-right:8px;color:var(--nile-color-success-500)}.workbook-toolbar-tab button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s;color:var(--nile-color-neutral-600)}.workbook-toolbar-tab button:hover{background-color:var(--nile-color-neutral-100);color:var(--nile-color-neutral-900)}.workbook-toolbar-tab button:active{background-color:var(--nile-color-neutral-200)}.workbook-toolbar-tab button nile-icon{font-size:16px}.tab-actions-dropdown{position:fixed;z-index:1001}.tab-actions-dropdown .dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:1000}.tab-actions-dropdown .dropdown-menu{position:relative;min-width:180px;background:white;border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:1001;overflow:hidden}.tab-actions-dropdown .dropdown-menu nile-menu{display:block}.workbook-actions-dropdown{position:fixed;z-index:1001}.workbook-actions-dropdown .dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:1000}.workbook-actions-dropdown .dropdown-menu{position:relative;min-width:200px;background:white;border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:1001;overflow:hidden}.workbook-actions-dropdown .dropdown-menu nile-menu{display:block}.fullscreen-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:1999;cursor:pointer}nile-tab-group::part(nav){background-color:#fafafa}nile-tab-group::part(active-tab-indicator-path){background:none}nile-tab-group::part(active-tab-indicator){border-bottom:none}nile-tab-group::part(tabs){gap:0}nile-tab-group nile-tab{border:1px solid #e0e0e0;border-top-left-radius:6px;border-top-right-radius:6px}nile-tab-group nile-tab::part(base){padding-left:.5rem;padding-top:.5rem;padding-bottom:.5rem;border-bottom-left-radius:0;border-bottom-right-radius:0}nile-tab-group nile-tab.active{background-color:#fff;color:#000}nile-tab-group nile-tab-panel::part(base){padding:0;max-height:30rem}\n"], components: [{ type: StTableComponent, selector: "st-table", inputs: ["tableConfig", "data", "data$", "tableState", "enableSorting", "enableFiltering", "validateConfig"], outputs: ["stateChange", "dataChange", "cellEdit", "cellSave", "cellCancel", "cellChange", "columnResized", "columnMoved", "configValidationErrors", "columnAdded", "rowAction", "validationStateChange", "requestAddRow"] }], directives: [{ type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], pipes: { "async": i1.AsyncPipe, "date": i1.DatePipe } });
|
|
10466
|
+
StWorkbookComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StWorkbookComponent, selector: "st-workbook", inputs: { config: "config", sheetsData: "sheetsData", state: "state" }, outputs: { sheetChanged: "sheetChanged", addSheet: "addSheet", sheetTabAction: "sheetTabAction", workbookAction: "workbookAction", cellChange: "cellChange", cellSave: "cellSave", tableStateChange: "tableStateChange", fullscreenToggle: "fullscreenToggle", requestAddRow: "requestAddRow" }, viewQueries: [{ propertyName: "tableComponent", first: true, predicate: StTableComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"workbook-container\" [class.fullscreen]=\"isFullscreen$ | async\">\n <nile-tab-group [activeIndex]=\"activeSheetIndex\">\n \n <!-- Sheet Tabs (one per sheet) -->\n <nile-tab *ngFor=\"let sheet of sheets; let i = index\"\n slot=\"nav\" \n panel=\"shared-panel\"\n [class.active]=\"i === activeSheetIndex\"\n (click)=\"onTabChange(i)\">\n <div class=\"sheet-tab-content\">\n <span class=\"sheet-name\">{{ sheet.name }}</span>\n \n <!-- Tab actions dropdown button -->\n <button class=\"tab-actions-button\"\n (click)=\"openTabActions($event, sheet, i)\"\n *ngIf=\"hasTabActions(sheet)\">\n <nile-icon name=\"arrowdown\" size=\"14\"></nile-icon>\n </button>\n </div>\n </nile-tab>\n \n <!-- Toolbar Tab (for workbook controls) -->\n <nile-tab slot=\"nav\" \n panel=\"shared-panel\"\n class=\"workbook-toolbar-tab\"\n [disabled]=\"true\">\n <div class=\"workbook-toolbar-content\">\n <!-- Autosave Indicator -->\n <div class=\"autosave-indicator\" *ngIf=\"autosaveEnabled\">\n <nile-icon \n *ngIf=\"!isSaving && lastSaveTime\" \n name=\"save\" \n size=\"14\"\n [title]=\"'Saved at ' + (lastSaveTime | date:'HH:mm:ss')\">\n </nile-icon>\n <nile-icon \n *ngIf=\"isSaving\" \n name=\"loader\" \n size=\"14\"\n title=\"Saving...\">\n </nile-icon>\n </div>\n\n <!-- Workbook Actions Dropdown -->\n <button class=\"workbook-actions-button\"\n *ngIf=\"config.workbookActions && config.workbookActions.length > 0\"\n (click)=\"toggleWorkbookActions($event)\"\n title=\"Workbook Actions\">\n <nile-icon name=\"settings\"></nile-icon>\n </button>\n \n <!-- Add Sheet Button -->\n <button class=\"add-sheet-button\"\n *ngIf=\"canAddSheet\"\n (click)=\"onAddSheet()\"\n title=\"Add Sheet\">\n <nile-icon name=\"plus\"></nile-icon>\n </button>\n \n <!-- Fullscreen Button -->\n <button class=\"fullscreen-button\"\n *ngIf=\"config.display?.allowFullscreen !== false\"\n (click)=\"toggleFullscreen()\"\n [title]=\"(isFullscreen$ | async) ? 'Exit Fullscreen' : 'Fullscreen'\">\n <nile-icon [name]=\"(isFullscreen$ | async) ? 'collapse' : 'expand-06'\"></nile-icon>\n </button>\n </div>\n </nile-tab>\n \n <!-- Single Shared Tab Panel -->\n <nile-tab-panel name=\"shared-panel\">\n <!-- Lazy loading strategy: table is destroyed and recreated with new config/state when sheet changes -->\n <!-- Using ngFor with trackBy to force complete reinitialization when tableComponentKey changes -->\n <ng-container *ngFor=\"let key of [tableComponentKey]; trackBy: trackByKey\">\n <st-table *ngIf=\"currentTableConfig && currentTableState\"\n [attr.data-sheet-key]=\"key\"\n [tableConfig]=\"currentTableConfig\"\n [data$]=\"currentTableData$\"\n [tableState]=\"currentTableState\"\n (cellChange)=\"onCellChange($event)\"\n (cellSave)=\"onCellSave($event)\"\n (stateChange)=\"onTableStateChange($event)\"\n (requestAddRow)=\"onRequestAddRow($event)\">\n </st-table>\n </ng-container>\n </nile-tab-panel>\n \n </nile-tab-group>\n</div>\n\n<!-- Tab Actions Dropdown -->\n<div class=\"tab-actions-dropdown\" \n *ngIf=\"tabActionsOpen\"\n [ngStyle]=\"tabActionsPosition\">\n <div class=\"dropdown-backdrop\" (click)=\"closeTabActions()\"></div>\n <div class=\"dropdown-menu\">\n <nile-menu>\n <nile-menu-item *ngFor=\"let action of selectedSheet?.tabActions\" \n (click)=\"onTabActionClick(action, $event)\">\n <nile-icon *ngIf=\"action.icon\" slot=\"prefix\" size=\"14\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n<!-- Workbook Actions Dropdown -->\n<div class=\"workbook-actions-dropdown\"\n *ngIf=\"workbookActionsOpen\"\n [ngStyle]=\"workbookActionsPosition\">\n <div class=\"dropdown-backdrop\" (click)=\"closeWorkbookActions()\"></div>\n <div class=\"dropdown-menu\">\n <nile-menu>\n <nile-menu-item *ngFor=\"let action of visibleWorkbookActions\"\n [class.disabled]=\"isActionDisabled(action)\"\n (click)=\"onWorkbookActionClick(action, $event)\">\n <nile-icon *ngIf=\"action.icon\" slot=\"prefix\" size=\"14\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n<!-- Fullscreen Backdrop -->\n<div class=\"fullscreen-backdrop\" \n *ngIf=\"isFullscreen$ | async\"\n (click)=\"toggleFullscreen()\">\n</div>\n\n", styles: ["@import\"@aquera/nile/lib/styles/variables.css\";:host{display:block;width:100%;height:100%}.workbook-container{display:flex;flex-direction:column;height:100%;background:white;border:1px solid var(--nile-color-neutral-200);border-radius:4px;overflow:hidden}.workbook-container.fullscreen{position:fixed;inset:0;z-index:2000;border:none;border-radius:0}.workbook-container nile-tab-group{height:100%;display:flex;flex-direction:column}.sheet-tab-content{display:flex;align-items:center;gap:8px;padding:0 4px}.sheet-tab-content .sheet-name{font-size:12px;font-weight:500;font-family:var(--nile-font-family-sans-serif);color:#000}.sheet-tab-content .tab-actions-button{width:20px;height:20px;padding:0;background:transparent;border:none;cursor:pointer}.workbook-toolbar-tab{margin-left:auto!important;pointer-events:auto!important;border-left:1px solid var(--nile-color-neutral-200)}.workbook-toolbar-tab .workbook-toolbar-content{display:flex;gap:4px;align-items:center;padding:0 8px}.workbook-toolbar-tab .workbook-toolbar-content .autosave-indicator{display:flex;align-items:center;margin-right:8px;color:var(--nile-color-success-500)}.workbook-toolbar-tab button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s;color:var(--nile-color-neutral-600)}.workbook-toolbar-tab button:hover{background-color:var(--nile-color-neutral-100);color:var(--nile-color-neutral-900)}.workbook-toolbar-tab button:active{background-color:var(--nile-color-neutral-200)}.workbook-toolbar-tab button nile-icon{font-size:16px}.tab-actions-dropdown{position:fixed;z-index:1001}.tab-actions-dropdown .dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:1000}.tab-actions-dropdown .dropdown-menu{position:relative;min-width:180px;background:white;border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:1001;overflow:hidden}.tab-actions-dropdown .dropdown-menu nile-menu{display:block}.workbook-actions-dropdown{position:fixed;z-index:1001}.workbook-actions-dropdown .dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:1000}.workbook-actions-dropdown .dropdown-menu{position:relative;min-width:200px;background:white;border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:1001;overflow:hidden}.workbook-actions-dropdown .dropdown-menu nile-menu{display:block}.fullscreen-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:1999;cursor:pointer}nile-tab-group::part(nav){background-color:#fafafa}nile-tab-group::part(active-tab-indicator-path){background:none}nile-tab-group::part(active-tab-indicator){border-bottom:none}nile-tab-group::part(tabs){gap:0}nile-tab-group nile-tab{border:1px solid #e0e0e0;border-top-left-radius:6px;border-top-right-radius:6px}nile-tab-group nile-tab::part(base){padding-left:.5rem;padding-top:.5rem;padding-bottom:.5rem;border-bottom-left-radius:0;border-bottom-right-radius:0}nile-tab-group nile-tab.active{background-color:#fff;color:#000}nile-tab-group nile-tab.active .sheet-name{font-weight:600}nile-tab-group nile-tab-panel::part(base){padding:0;max-height:30rem}\n"], components: [{ type: StTableComponent, selector: "st-table", inputs: ["tableConfig", "data", "data$", "tableState", "enableSorting", "enableFiltering", "validateConfig"], outputs: ["stateChange", "dataChange", "cellEdit", "cellSave", "cellCancel", "cellChange", "columnResized", "columnMoved", "configValidationErrors", "columnAdded", "rowAction", "validationStateChange", "requestAddRow"] }], directives: [{ type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], pipes: { "async": i1.AsyncPipe, "date": i1.DatePipe } });
|
|
10300
10467
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StWorkbookComponent, decorators: [{
|
|
10301
10468
|
type: Component,
|
|
10302
|
-
args: [{ selector: 'st-workbook', template: "<div class=\"workbook-container\" [class.fullscreen]=\"isFullscreen$ | async\">\n <nile-tab-group [activeIndex]=\"activeSheetIndex\">\n \n <!-- Sheet Tabs (one per sheet) -->\n <nile-tab *ngFor=\"let sheet of sheets; let i = index\"\n slot=\"nav\" \n panel=\"shared-panel\"\n [class.active]=\"i === activeSheetIndex\"\n (click)=\"onTabChange(i)\">\n <div class=\"sheet-tab-content\">\n <span class=\"sheet-name\">{{ sheet.name }}</span>\n \n <!-- Tab actions dropdown button -->\n <button class=\"tab-actions-button\"\n (click)=\"openTabActions($event, sheet, i)\"\n *ngIf=\"hasTabActions(sheet)\">\n <nile-icon name=\"arrowdown\" size=\"14\"></nile-icon>\n </button>\n </div>\n </nile-tab>\n \n <!-- Toolbar Tab (for workbook controls) -->\n <nile-tab slot=\"nav\" \n panel=\"shared-panel\"\n class=\"workbook-toolbar-tab\"\n [disabled]=\"true\">\n <div class=\"workbook-toolbar-content\">\n <!-- Autosave Indicator -->\n <div class=\"autosave-indicator\" *ngIf=\"autosaveEnabled\">\n <nile-icon \n *ngIf=\"!isSaving && lastSaveTime\" \n name=\"save\" \n size=\"14\"\n [title]=\"'Saved at ' + (lastSaveTime | date:'HH:mm:ss')\">\n </nile-icon>\n <nile-icon \n *ngIf=\"isSaving\" \n name=\"loader\" \n size=\"14\"\n title=\"Saving...\">\n </nile-icon>\n </div>\n\n <!-- Workbook Actions Dropdown -->\n <button class=\"workbook-actions-button\"\n *ngIf=\"config.workbookActions && config.workbookActions.length > 0\"\n (click)=\"toggleWorkbookActions($event)\"\n title=\"Workbook Actions\">\n <nile-icon name=\"settings\"></nile-icon>\n </button>\n \n <!-- Add Sheet Button -->\n <button class=\"add-sheet-button\"\n *ngIf=\"canAddSheet\"\n (click)=\"onAddSheet()\"\n title=\"Add Sheet\">\n <nile-icon name=\"plus\"></nile-icon>\n </button>\n \n <!-- Fullscreen Button -->\n <button class=\"fullscreen-button\"\n *ngIf=\"config.display?.allowFullscreen !== false\"\n (click)=\"toggleFullscreen()\"\n [title]=\"(isFullscreen$ | async) ? 'Exit Fullscreen' : 'Fullscreen'\">\n <nile-icon [name]=\"(isFullscreen$ | async) ? 'collapse' : 'expand-06'\"></nile-icon>\n </button>\n </div>\n </nile-tab>\n \n <!-- Single Shared Tab Panel -->\n <nile-tab-panel name=\"shared-panel\">\n <!-- Lazy loading strategy: table is destroyed and recreated with new config/state when sheet changes -->\n <!-- Using ngFor with trackBy to force complete reinitialization when tableComponentKey changes -->\n <ng-container *ngFor=\"let key of [tableComponentKey]; trackBy: trackByKey\">\n <st-table *ngIf=\"currentTableConfig && currentTableState\"\n [attr.data-sheet-key]=\"key\"\n [tableConfig]=\"currentTableConfig\"\n [data$]=\"currentTableData$\"\n [tableState]=\"currentTableState\"\n (cellChange)=\"onCellChange($event)\"\n (cellSave)=\"onCellSave($event)\"\n (stateChange)=\"onTableStateChange($event)\"\n (requestAddRow)=\"onRequestAddRow($event)\">\n </st-table>\n </ng-container>\n </nile-tab-panel>\n \n </nile-tab-group>\n</div>\n\n<!-- Tab Actions Dropdown -->\n<div class=\"tab-actions-dropdown\" \n *ngIf=\"tabActionsOpen\"\n [ngStyle]=\"tabActionsPosition\">\n <div class=\"dropdown-backdrop\" (click)=\"closeTabActions()\"></div>\n <div class=\"dropdown-menu\">\n <nile-menu>\n <nile-menu-item *ngFor=\"let action of selectedSheet?.tabActions\" \n (click)=\"onTabActionClick(action, $event)\">\n <nile-icon *ngIf=\"action.icon\" slot=\"prefix\" size=\"14\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n<!-- Workbook Actions Dropdown -->\n<div class=\"workbook-actions-dropdown\"\n *ngIf=\"workbookActionsOpen\"\n [ngStyle]=\"workbookActionsPosition\">\n <div class=\"dropdown-backdrop\" (click)=\"closeWorkbookActions()\"></div>\n <div class=\"dropdown-menu\">\n <nile-menu>\n <nile-menu-item *ngFor=\"let action of visibleWorkbookActions\"\n [class.disabled]=\"isActionDisabled(action)\"\n (click)=\"onWorkbookActionClick(action, $event)\">\n <nile-icon *ngIf=\"action.icon\" slot=\"prefix\" size=\"14\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n<!-- Fullscreen Backdrop -->\n<div class=\"fullscreen-backdrop\" \n *ngIf=\"isFullscreen$ | async\"\n (click)=\"toggleFullscreen()\">\n</div>\n\n", styles: ["@import\"@aquera/nile/lib/styles/variables.css\";:host{display:block;width:100%;height:100%}.workbook-container{display:flex;flex-direction:column;height:100%;background:white;border:1px solid var(--nile-color-neutral-200);border-radius:4px;overflow:hidden}.workbook-container.fullscreen{position:fixed;inset:0;z-index:2000;border:none;border-radius:0}.workbook-container nile-tab-group{height:100%;display:flex;flex-direction:column}.sheet-tab-content{display:flex;align-items:center;gap:8px;padding:0 4px}.sheet-tab-content .sheet-name{font-size:12px;font-weight:500;font-family:var(--nile-font-family-sans-serif);color:#000}.sheet-tab-content .tab-actions-button{width:20px;height:20px;padding:0;background:transparent;border:none;cursor:pointer}.workbook-toolbar-tab{margin-left:auto!important;pointer-events:auto!important;border-left:1px solid var(--nile-color-neutral-200)}.workbook-toolbar-tab .workbook-toolbar-content{display:flex;gap:4px;align-items:center;padding:0 8px}.workbook-toolbar-tab .workbook-toolbar-content .autosave-indicator{display:flex;align-items:center;margin-right:8px;color:var(--nile-color-success-500)}.workbook-toolbar-tab button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s;color:var(--nile-color-neutral-600)}.workbook-toolbar-tab button:hover{background-color:var(--nile-color-neutral-100);color:var(--nile-color-neutral-900)}.workbook-toolbar-tab button:active{background-color:var(--nile-color-neutral-200)}.workbook-toolbar-tab button nile-icon{font-size:16px}.tab-actions-dropdown{position:fixed;z-index:1001}.tab-actions-dropdown .dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:1000}.tab-actions-dropdown .dropdown-menu{position:relative;min-width:180px;background:white;border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:1001;overflow:hidden}.tab-actions-dropdown .dropdown-menu nile-menu{display:block}.workbook-actions-dropdown{position:fixed;z-index:1001}.workbook-actions-dropdown .dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:1000}.workbook-actions-dropdown .dropdown-menu{position:relative;min-width:200px;background:white;border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:1001;overflow:hidden}.workbook-actions-dropdown .dropdown-menu nile-menu{display:block}.fullscreen-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:1999;cursor:pointer}nile-tab-group::part(nav){background-color:#fafafa}nile-tab-group::part(active-tab-indicator-path){background:none}nile-tab-group::part(active-tab-indicator){border-bottom:none}nile-tab-group::part(tabs){gap:0}nile-tab-group nile-tab{border:1px solid #e0e0e0;border-top-left-radius:6px;border-top-right-radius:6px}nile-tab-group nile-tab::part(base){padding-left:.5rem;padding-top:.5rem;padding-bottom:.5rem;border-bottom-left-radius:0;border-bottom-right-radius:0}nile-tab-group nile-tab.active{background-color:#fff;color:#000}nile-tab-group nile-tab-panel::part(base){padding:0;max-height:30rem}\n"] }]
|
|
10469
|
+
args: [{ selector: 'st-workbook', template: "<div class=\"workbook-container\" [class.fullscreen]=\"isFullscreen$ | async\">\n <nile-tab-group [activeIndex]=\"activeSheetIndex\">\n \n <!-- Sheet Tabs (one per sheet) -->\n <nile-tab *ngFor=\"let sheet of sheets; let i = index\"\n slot=\"nav\" \n panel=\"shared-panel\"\n [class.active]=\"i === activeSheetIndex\"\n (click)=\"onTabChange(i)\">\n <div class=\"sheet-tab-content\">\n <span class=\"sheet-name\">{{ sheet.name }}</span>\n \n <!-- Tab actions dropdown button -->\n <button class=\"tab-actions-button\"\n (click)=\"openTabActions($event, sheet, i)\"\n *ngIf=\"hasTabActions(sheet)\">\n <nile-icon name=\"arrowdown\" size=\"14\"></nile-icon>\n </button>\n </div>\n </nile-tab>\n \n <!-- Toolbar Tab (for workbook controls) -->\n <nile-tab slot=\"nav\" \n panel=\"shared-panel\"\n class=\"workbook-toolbar-tab\"\n [disabled]=\"true\">\n <div class=\"workbook-toolbar-content\">\n <!-- Autosave Indicator -->\n <div class=\"autosave-indicator\" *ngIf=\"autosaveEnabled\">\n <nile-icon \n *ngIf=\"!isSaving && lastSaveTime\" \n name=\"save\" \n size=\"14\"\n [title]=\"'Saved at ' + (lastSaveTime | date:'HH:mm:ss')\">\n </nile-icon>\n <nile-icon \n *ngIf=\"isSaving\" \n name=\"loader\" \n size=\"14\"\n title=\"Saving...\">\n </nile-icon>\n </div>\n\n <!-- Workbook Actions Dropdown -->\n <button class=\"workbook-actions-button\"\n *ngIf=\"config.workbookActions && config.workbookActions.length > 0\"\n (click)=\"toggleWorkbookActions($event)\"\n title=\"Workbook Actions\">\n <nile-icon name=\"settings\"></nile-icon>\n </button>\n \n <!-- Add Sheet Button -->\n <button class=\"add-sheet-button\"\n *ngIf=\"canAddSheet\"\n (click)=\"onAddSheet()\"\n title=\"Add Sheet\">\n <nile-icon name=\"plus\"></nile-icon>\n </button>\n \n <!-- Fullscreen Button -->\n <button class=\"fullscreen-button\"\n *ngIf=\"config.display?.allowFullscreen !== false\"\n (click)=\"toggleFullscreen()\"\n [title]=\"(isFullscreen$ | async) ? 'Exit Fullscreen' : 'Fullscreen'\">\n <nile-icon [name]=\"(isFullscreen$ | async) ? 'collapse' : 'expand-06'\"></nile-icon>\n </button>\n </div>\n </nile-tab>\n \n <!-- Single Shared Tab Panel -->\n <nile-tab-panel name=\"shared-panel\">\n <!-- Lazy loading strategy: table is destroyed and recreated with new config/state when sheet changes -->\n <!-- Using ngFor with trackBy to force complete reinitialization when tableComponentKey changes -->\n <ng-container *ngFor=\"let key of [tableComponentKey]; trackBy: trackByKey\">\n <st-table *ngIf=\"currentTableConfig && currentTableState\"\n [attr.data-sheet-key]=\"key\"\n [tableConfig]=\"currentTableConfig\"\n [data$]=\"currentTableData$\"\n [tableState]=\"currentTableState\"\n (cellChange)=\"onCellChange($event)\"\n (cellSave)=\"onCellSave($event)\"\n (stateChange)=\"onTableStateChange($event)\"\n (requestAddRow)=\"onRequestAddRow($event)\">\n </st-table>\n </ng-container>\n </nile-tab-panel>\n \n </nile-tab-group>\n</div>\n\n<!-- Tab Actions Dropdown -->\n<div class=\"tab-actions-dropdown\" \n *ngIf=\"tabActionsOpen\"\n [ngStyle]=\"tabActionsPosition\">\n <div class=\"dropdown-backdrop\" (click)=\"closeTabActions()\"></div>\n <div class=\"dropdown-menu\">\n <nile-menu>\n <nile-menu-item *ngFor=\"let action of selectedSheet?.tabActions\" \n (click)=\"onTabActionClick(action, $event)\">\n <nile-icon *ngIf=\"action.icon\" slot=\"prefix\" size=\"14\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n<!-- Workbook Actions Dropdown -->\n<div class=\"workbook-actions-dropdown\"\n *ngIf=\"workbookActionsOpen\"\n [ngStyle]=\"workbookActionsPosition\">\n <div class=\"dropdown-backdrop\" (click)=\"closeWorkbookActions()\"></div>\n <div class=\"dropdown-menu\">\n <nile-menu>\n <nile-menu-item *ngFor=\"let action of visibleWorkbookActions\"\n [class.disabled]=\"isActionDisabled(action)\"\n (click)=\"onWorkbookActionClick(action, $event)\">\n <nile-icon *ngIf=\"action.icon\" slot=\"prefix\" size=\"14\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </nile-menu>\n </div>\n</div>\n\n<!-- Fullscreen Backdrop -->\n<div class=\"fullscreen-backdrop\" \n *ngIf=\"isFullscreen$ | async\"\n (click)=\"toggleFullscreen()\">\n</div>\n\n", styles: ["@import\"@aquera/nile/lib/styles/variables.css\";:host{display:block;width:100%;height:100%}.workbook-container{display:flex;flex-direction:column;height:100%;background:white;border:1px solid var(--nile-color-neutral-200);border-radius:4px;overflow:hidden}.workbook-container.fullscreen{position:fixed;inset:0;z-index:2000;border:none;border-radius:0}.workbook-container nile-tab-group{height:100%;display:flex;flex-direction:column}.sheet-tab-content{display:flex;align-items:center;gap:8px;padding:0 4px}.sheet-tab-content .sheet-name{font-size:12px;font-weight:500;font-family:var(--nile-font-family-sans-serif);color:#000}.sheet-tab-content .tab-actions-button{width:20px;height:20px;padding:0;background:transparent;border:none;cursor:pointer}.workbook-toolbar-tab{margin-left:auto!important;pointer-events:auto!important;border-left:1px solid var(--nile-color-neutral-200)}.workbook-toolbar-tab .workbook-toolbar-content{display:flex;gap:4px;align-items:center;padding:0 8px}.workbook-toolbar-tab .workbook-toolbar-content .autosave-indicator{display:flex;align-items:center;margin-right:8px;color:var(--nile-color-success-500)}.workbook-toolbar-tab button{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s;color:var(--nile-color-neutral-600)}.workbook-toolbar-tab button:hover{background-color:var(--nile-color-neutral-100);color:var(--nile-color-neutral-900)}.workbook-toolbar-tab button:active{background-color:var(--nile-color-neutral-200)}.workbook-toolbar-tab button nile-icon{font-size:16px}.tab-actions-dropdown{position:fixed;z-index:1001}.tab-actions-dropdown .dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:1000}.tab-actions-dropdown .dropdown-menu{position:relative;min-width:180px;background:white;border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:1001;overflow:hidden}.tab-actions-dropdown .dropdown-menu nile-menu{display:block}.workbook-actions-dropdown{position:fixed;z-index:1001}.workbook-actions-dropdown .dropdown-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background:transparent;z-index:1000}.workbook-actions-dropdown .dropdown-menu{position:relative;min-width:200px;background:white;border-radius:8px;box-shadow:0 4px 12px #00000026;z-index:1001;overflow:hidden}.workbook-actions-dropdown .dropdown-menu nile-menu{display:block}.fullscreen-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:1999;cursor:pointer}nile-tab-group::part(nav){background-color:#fafafa}nile-tab-group::part(active-tab-indicator-path){background:none}nile-tab-group::part(active-tab-indicator){border-bottom:none}nile-tab-group::part(tabs){gap:0}nile-tab-group nile-tab{border:1px solid #e0e0e0;border-top-left-radius:6px;border-top-right-radius:6px}nile-tab-group nile-tab::part(base){padding-left:.5rem;padding-top:.5rem;padding-bottom:.5rem;border-bottom-left-radius:0;border-bottom-right-radius:0}nile-tab-group nile-tab.active{background-color:#fff;color:#000}nile-tab-group nile-tab.active .sheet-name{font-weight:600}nile-tab-group nile-tab-panel::part(base){padding:0;max-height:30rem}\n"] }]
|
|
10303
10470
|
}], ctorParameters: function () { return [{ type: AutosaveService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
|
|
10304
10471
|
type: Input
|
|
10305
10472
|
}], sheetsData: [{
|
|
@@ -10324,6 +10491,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
10324
10491
|
type: Output
|
|
10325
10492
|
}], requestAddRow: [{
|
|
10326
10493
|
type: Output
|
|
10494
|
+
}], tableComponent: [{
|
|
10495
|
+
type: ViewChild,
|
|
10496
|
+
args: [StTableComponent]
|
|
10327
10497
|
}] } });
|
|
10328
10498
|
|
|
10329
10499
|
/**
|