@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
|
@@ -3613,6 +3613,8 @@ class NileSelectEditor {
|
|
|
3613
3613
|
this.eventListeners = [];
|
|
3614
3614
|
this.currentOptions = [];
|
|
3615
3615
|
this.isInitializing = false; // Flag to prevent immediate close during initialization
|
|
3616
|
+
this.hasSaved = false; // Flag to prevent double-save
|
|
3617
|
+
this.lastSelectedValue = ''; // Track the last selected value
|
|
3616
3618
|
// Handle Observable options
|
|
3617
3619
|
if (isObservable(options.options)) {
|
|
3618
3620
|
this.optionsSubscription = options.options.subscribe(opts => {
|
|
@@ -3631,6 +3633,77 @@ class NileSelectEditor {
|
|
|
3631
3633
|
}
|
|
3632
3634
|
}
|
|
3633
3635
|
}
|
|
3636
|
+
/**
|
|
3637
|
+
* Inject global styles to remove border from nile-select combobox
|
|
3638
|
+
* Uses ::part selector which works across shadow DOM boundaries
|
|
3639
|
+
*/
|
|
3640
|
+
injectBorderlessStyles() {
|
|
3641
|
+
if (NileSelectEditor.stylesInjected)
|
|
3642
|
+
return;
|
|
3643
|
+
const styleId = 'nile-select-borderless-styles';
|
|
3644
|
+
if (document.getElementById(styleId)) {
|
|
3645
|
+
NileSelectEditor.stylesInjected = true;
|
|
3646
|
+
return;
|
|
3647
|
+
}
|
|
3648
|
+
const style = document.createElement('style');
|
|
3649
|
+
style.id = styleId;
|
|
3650
|
+
style.textContent = `
|
|
3651
|
+
.st-cell-editor::part(combobox) {
|
|
3652
|
+
border: none !important;
|
|
3653
|
+
outline: none !important;
|
|
3654
|
+
box-shadow: none !important;
|
|
3655
|
+
min-height: unset !important;
|
|
3656
|
+
height: 100% !important;
|
|
3657
|
+
padding: 0 !important;
|
|
3658
|
+
}
|
|
3659
|
+
.st-cell-editor::part(combobox):hover {
|
|
3660
|
+
border: none !important;
|
|
3661
|
+
outline: none !important;
|
|
3662
|
+
box-shadow: none !important;
|
|
3663
|
+
}
|
|
3664
|
+
.st-cell-editor::part(combobox):focus {
|
|
3665
|
+
border: none !important;
|
|
3666
|
+
outline: none !important;
|
|
3667
|
+
box-shadow: none !important;
|
|
3668
|
+
}
|
|
3669
|
+
// .st-cell-editor::part(tag) {
|
|
3670
|
+
// margin: 1px 2px !important;
|
|
3671
|
+
// border-radius: 3px !important;
|
|
3672
|
+
// background-color: #e2e8f0 !important;
|
|
3673
|
+
// font-size: 12px !important;
|
|
3674
|
+
// height: auto !important;
|
|
3675
|
+
// }
|
|
3676
|
+
// .st-cell-editor::part(tag__base) {
|
|
3677
|
+
// border: none !important;
|
|
3678
|
+
// outline: none !important;
|
|
3679
|
+
// padding: 0 2px !important;
|
|
3680
|
+
// height: auto !important;
|
|
3681
|
+
// }
|
|
3682
|
+
// .st-cell-editor::part(tag__content) {
|
|
3683
|
+
// padding: 0 !important;
|
|
3684
|
+
// }
|
|
3685
|
+
.st-cell-editor::part(tags) {
|
|
3686
|
+
gap: 2px !important;
|
|
3687
|
+
align-items: center !important;
|
|
3688
|
+
}
|
|
3689
|
+
.st-cell-editor::part(tags-count) {
|
|
3690
|
+
margin: 0 !important;
|
|
3691
|
+
}
|
|
3692
|
+
.st-cell-editor::part(footer) {
|
|
3693
|
+
height: 35px !important;
|
|
3694
|
+
min-height: 35px !important;
|
|
3695
|
+
padding: 8px !important;
|
|
3696
|
+
padding-bottom: 30px !important;
|
|
3697
|
+
box-sizing: border-box !important;
|
|
3698
|
+
}
|
|
3699
|
+
.st-cell-editor::part(listbox) {
|
|
3700
|
+
margin-bottom: 0 !important;
|
|
3701
|
+
padding-bottom: 0 !important;
|
|
3702
|
+
}
|
|
3703
|
+
`;
|
|
3704
|
+
document.head.appendChild(style);
|
|
3705
|
+
NileSelectEditor.stylesInjected = true;
|
|
3706
|
+
}
|
|
3634
3707
|
edit(context) {
|
|
3635
3708
|
if (!context.container) {
|
|
3636
3709
|
console.warn('NileSelectEditor requires a container element');
|
|
@@ -3638,13 +3711,23 @@ class NileSelectEditor {
|
|
|
3638
3711
|
}
|
|
3639
3712
|
// Set initializing flag to prevent immediate close
|
|
3640
3713
|
this.isInitializing = true;
|
|
3714
|
+
this.hasSaved = false;
|
|
3715
|
+
this.lastSelectedValue = '';
|
|
3641
3716
|
// Create NileSelect custom element using document.createElement
|
|
3642
3717
|
this.select = document.createElement('nile-select');
|
|
3643
3718
|
this.select.className = 'st-cell-editor';
|
|
3644
|
-
// Apply inline styles for proper cell fitting
|
|
3645
|
-
this.select.style.width = '100%';
|
|
3646
|
-
this.select.style.height = '
|
|
3719
|
+
// Apply inline styles for proper cell fitting - prevent height changes
|
|
3720
|
+
this.select.style.width = 'calc(100% - 4px)';
|
|
3721
|
+
this.select.style.height = '100%';
|
|
3722
|
+
this.select.style.maxHeight = '100%';
|
|
3647
3723
|
this.select.style.boxSizing = 'border-box';
|
|
3724
|
+
this.select.style.margin = '0 2px';
|
|
3725
|
+
this.select.style.overflow = 'hidden';
|
|
3726
|
+
// Inject styles to remove border using ::part selector
|
|
3727
|
+
this.injectBorderlessStyles();
|
|
3728
|
+
// Also try removing outline on host element
|
|
3729
|
+
this.select.style.outline = 'none';
|
|
3730
|
+
this.select.style.border = 'none';
|
|
3648
3731
|
// Set initial value
|
|
3649
3732
|
this.setInitialValue(context.value);
|
|
3650
3733
|
// Apply all configuration options
|
|
@@ -3656,26 +3739,21 @@ class NileSelectEditor {
|
|
|
3656
3739
|
// Clear container and append select
|
|
3657
3740
|
context.container.innerHTML = '';
|
|
3658
3741
|
context.container.appendChild(this.select);
|
|
3659
|
-
// Focus after render
|
|
3742
|
+
// Focus and auto-open after render
|
|
3660
3743
|
setTimeout(() => {
|
|
3661
3744
|
this.select?.focus();
|
|
3662
|
-
//
|
|
3745
|
+
// Auto-open the dropdown
|
|
3663
3746
|
if (this.select) {
|
|
3664
3747
|
this.select.open = true;
|
|
3665
3748
|
}
|
|
3666
|
-
//
|
|
3667
|
-
|
|
3668
|
-
|
|
3749
|
+
// Clear initializing flag after dropdown has opened
|
|
3750
|
+
setTimeout(() => {
|
|
3751
|
+
this.isInitializing = false;
|
|
3752
|
+
// For multi-select, find the portal div for click detection
|
|
3753
|
+
if (this.options.multiple) {
|
|
3669
3754
|
this.portalDiv = document.querySelector('.nile-select-portal-append');
|
|
3670
|
-
|
|
3671
|
-
|
|
3672
|
-
}
|
|
3673
|
-
else {
|
|
3674
|
-
// Clear initializing flag after dropdown has time to open
|
|
3675
|
-
setTimeout(() => {
|
|
3676
|
-
this.isInitializing = false;
|
|
3677
|
-
}, 100);
|
|
3678
|
-
}
|
|
3755
|
+
}
|
|
3756
|
+
}, 100);
|
|
3679
3757
|
}, 0);
|
|
3680
3758
|
}
|
|
3681
3759
|
/**
|
|
@@ -3840,6 +3918,30 @@ class NileSelectEditor {
|
|
|
3840
3918
|
if (!this.select)
|
|
3841
3919
|
return;
|
|
3842
3920
|
const validateOnSave = this.options.validateOnSave !== false;
|
|
3921
|
+
// Prevent click events from bubbling up to the cell container
|
|
3922
|
+
const selectClickHandler = (e) => {
|
|
3923
|
+
e.stopPropagation();
|
|
3924
|
+
};
|
|
3925
|
+
this.select.addEventListener('click', selectClickHandler);
|
|
3926
|
+
this.eventListeners.push({ event: 'click', handler: selectClickHandler });
|
|
3927
|
+
// For single-select with portal, listen to document mousedown to detect option selection
|
|
3928
|
+
// Use mousedown because it fires before blur
|
|
3929
|
+
if (!this.options.multiple) {
|
|
3930
|
+
const documentMouseDownHandler = (e) => {
|
|
3931
|
+
const composedPath = e.composedPath?.() || [];
|
|
3932
|
+
// Look for nile-option in the event path
|
|
3933
|
+
for (const el of composedPath) {
|
|
3934
|
+
if (el instanceof HTMLElement && el.tagName?.toLowerCase() === 'nile-option') {
|
|
3935
|
+
const optionValue = el.getAttribute('value') || el.value || '';
|
|
3936
|
+
this.lastSelectedValue = optionValue;
|
|
3937
|
+
return;
|
|
3938
|
+
}
|
|
3939
|
+
}
|
|
3940
|
+
};
|
|
3941
|
+
// Add listener immediately (mousedown fires before blur, so no need for delay)
|
|
3942
|
+
document.addEventListener('mousedown', documentMouseDownHandler, true); // capture phase
|
|
3943
|
+
this.eventListeners.push({ event: 'document-mousedown', handler: documentMouseDownHandler });
|
|
3944
|
+
}
|
|
3843
3945
|
// Handle keyboard events (keydown is not replaced by custom events)
|
|
3844
3946
|
const keydownHandler = (e) => {
|
|
3845
3947
|
const keyEvent = e;
|
|
@@ -3851,55 +3953,45 @@ class NileSelectEditor {
|
|
|
3851
3953
|
};
|
|
3852
3954
|
this.select.addEventListener('keydown', keydownHandler);
|
|
3853
3955
|
this.eventListeners.push({ event: 'keydown', handler: keydownHandler });
|
|
3854
|
-
// Use nile-
|
|
3855
|
-
|
|
3856
|
-
|
|
3857
|
-
if
|
|
3956
|
+
// Use nile-blur event as save trigger for single-select
|
|
3957
|
+
// Add a small delay to allow the value to update before reading
|
|
3958
|
+
const singleSelectSaveHandler = (e) => {
|
|
3959
|
+
// Don't save again if already saved
|
|
3960
|
+
// Ignore events that fire during initialization (e.g. when setting initial value)
|
|
3961
|
+
if (this.hasSaved || this.isInitializing) {
|
|
3858
3962
|
return;
|
|
3859
3963
|
}
|
|
3860
|
-
|
|
3861
|
-
if (validateOnSave && !this.select?.checkValidity()) {
|
|
3862
|
-
this.select?.reportValidity();
|
|
3863
|
-
return;
|
|
3864
|
-
}
|
|
3865
|
-
// Only save immediately for single-select
|
|
3866
|
-
// Multi-select saves on outside click
|
|
3964
|
+
// Only save for single-select
|
|
3867
3965
|
if (!this.options.multiple) {
|
|
3868
|
-
|
|
3869
|
-
}
|
|
3870
|
-
};
|
|
3871
|
-
this.select.addEventListener('nile-change', changeHandler);
|
|
3872
|
-
this.eventListeners.push({ event: 'nile-change', handler: changeHandler });
|
|
3873
|
-
// Handle blur as secondary save trigger
|
|
3874
|
-
const blurHandler = (e) => {
|
|
3875
|
-
// Ignore blur during initialization
|
|
3876
|
-
if (this.isInitializing) {
|
|
3877
|
-
return;
|
|
3878
|
-
}
|
|
3879
|
-
if (validateOnSave && !this.select?.checkValidity()) {
|
|
3880
|
-
this.select?.reportValidity();
|
|
3881
|
-
return;
|
|
3882
|
-
}
|
|
3883
|
-
// context.onSave(this.getCurrentValue());
|
|
3884
|
-
};
|
|
3885
|
-
this.select.addEventListener('nile-blur', blurHandler);
|
|
3886
|
-
this.eventListeners.push({ event: 'nile-blur', handler: blurHandler });
|
|
3887
|
-
// Handle nile-hide event to prevent unwanted closing during initialization
|
|
3888
|
-
const hideHandler = (e) => {
|
|
3889
|
-
// If dropdown closes during initialization, re-open it (for both single and multi-select)
|
|
3890
|
-
if (this.isInitializing) {
|
|
3891
|
-
e.preventDefault();
|
|
3892
|
-
e.stopPropagation();
|
|
3893
|
-
// Re-open the dropdown after a brief delay using the open property
|
|
3966
|
+
// Add a small delay to let the value update after selection
|
|
3894
3967
|
setTimeout(() => {
|
|
3895
|
-
|
|
3896
|
-
|
|
3968
|
+
// Check again after timeout in case saved by another handler
|
|
3969
|
+
if (this.hasSaved) {
|
|
3970
|
+
return;
|
|
3897
3971
|
}
|
|
3898
|
-
|
|
3972
|
+
if (validateOnSave && !this.select?.checkValidity()) {
|
|
3973
|
+
this.select?.reportValidity();
|
|
3974
|
+
return;
|
|
3975
|
+
}
|
|
3976
|
+
// Use lastSelectedValue if available, otherwise get from element
|
|
3977
|
+
const target = e.target;
|
|
3978
|
+
const value = this.lastSelectedValue || target?.value || this.select?.value || '';
|
|
3979
|
+
this.hasSaved = true;
|
|
3980
|
+
context.onSave(this.parseValue(value));
|
|
3981
|
+
}, 50); // 50ms delay to allow value to update
|
|
3899
3982
|
}
|
|
3900
3983
|
};
|
|
3901
|
-
|
|
3902
|
-
|
|
3984
|
+
// Listen to blur and nile-blur events for focus loss detection
|
|
3985
|
+
// Nile web components emit nile-blur custom event instead of native blur
|
|
3986
|
+
this.select.addEventListener('blur', singleSelectSaveHandler);
|
|
3987
|
+
this.eventListeners.push({ event: 'blur', handler: singleSelectSaveHandler });
|
|
3988
|
+
this.select.addEventListener('nile-blur', singleSelectSaveHandler);
|
|
3989
|
+
this.eventListeners.push({ event: 'nile-blur', handler: singleSelectSaveHandler });
|
|
3990
|
+
// Also listen to change events as fallback
|
|
3991
|
+
this.select.addEventListener('nile-change', singleSelectSaveHandler);
|
|
3992
|
+
this.eventListeners.push({ event: 'nile-change', handler: singleSelectSaveHandler });
|
|
3993
|
+
this.select.addEventListener('change', singleSelectSaveHandler);
|
|
3994
|
+
this.eventListeners.push({ event: 'change', handler: singleSelectSaveHandler });
|
|
3903
3995
|
// Handle clear button if enabled
|
|
3904
3996
|
if (this.options.clearable) {
|
|
3905
3997
|
const clearHandler = (e) => {
|
|
@@ -3946,7 +4038,8 @@ class NileSelectEditor {
|
|
|
3946
4038
|
setTimeout(() => {
|
|
3947
4039
|
// Only add if select still exists (editor not destroyed)
|
|
3948
4040
|
if (this.select) {
|
|
3949
|
-
|
|
4041
|
+
// Use bubbling phase (false) instead of capture to not interfere with nile-select's toggle
|
|
4042
|
+
document.addEventListener('click', documentClickHandler, false);
|
|
3950
4043
|
this.eventListeners.push({
|
|
3951
4044
|
event: 'document-click',
|
|
3952
4045
|
handler: documentClickHandler
|
|
@@ -3973,8 +4066,10 @@ class NileSelectEditor {
|
|
|
3973
4066
|
return value;
|
|
3974
4067
|
}
|
|
3975
4068
|
destroy() {
|
|
3976
|
-
// Reset
|
|
4069
|
+
// Reset flags
|
|
3977
4070
|
this.isInitializing = false;
|
|
4071
|
+
this.hasSaved = false;
|
|
4072
|
+
this.lastSelectedValue = '';
|
|
3978
4073
|
// Unsubscribe from options Observable
|
|
3979
4074
|
if (this.optionsSubscription) {
|
|
3980
4075
|
this.optionsSubscription.unsubscribe();
|
|
@@ -3984,8 +4079,12 @@ class NileSelectEditor {
|
|
|
3984
4079
|
if (this.select) {
|
|
3985
4080
|
this.eventListeners.forEach(({ event, handler }) => {
|
|
3986
4081
|
if (event === 'document-click') {
|
|
3987
|
-
// Remove from document for multi-select click handler
|
|
3988
|
-
document.removeEventListener('click', handler,
|
|
4082
|
+
// Remove from document for multi-select click handler (bubbling phase)
|
|
4083
|
+
document.removeEventListener('click', handler, false);
|
|
4084
|
+
}
|
|
4085
|
+
else if (event === 'document-mousedown') {
|
|
4086
|
+
// Remove from document for single-select option mousedown handler (capture phase)
|
|
4087
|
+
document.removeEventListener('mousedown', handler, true);
|
|
3989
4088
|
}
|
|
3990
4089
|
else {
|
|
3991
4090
|
// Remove from select element
|
|
@@ -4014,6 +4113,7 @@ class NileSelectEditor {
|
|
|
4014
4113
|
return (Array.isArray(value) ? (value.length > 0 ? value[0] : '') : value);
|
|
4015
4114
|
}
|
|
4016
4115
|
}
|
|
4116
|
+
NileSelectEditor.stylesInjected = false;
|
|
4017
4117
|
|
|
4018
4118
|
/**
|
|
4019
4119
|
* Custom editor using NileAutoComplete from @aquera/nile-elements
|
|
@@ -5231,10 +5331,10 @@ class StCellComponent {
|
|
|
5231
5331
|
}
|
|
5232
5332
|
}
|
|
5233
5333
|
StCellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
5234
|
-
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"] }] });
|
|
5334
|
+
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"] }] });
|
|
5235
5335
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StCellComponent, decorators: [{
|
|
5236
5336
|
type: Component,
|
|
5237
|
-
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"] }]
|
|
5337
|
+
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"] }]
|
|
5238
5338
|
}], ctorParameters: function () { return []; }, propDecorators: { cell: [{
|
|
5239
5339
|
type: Input
|
|
5240
5340
|
}], editMode: [{
|
|
@@ -8801,6 +8901,49 @@ class StTableComponent {
|
|
|
8801
8901
|
scrollContainer.scrollTop += (cellRect.bottom - visibleBottom);
|
|
8802
8902
|
}
|
|
8803
8903
|
}
|
|
8904
|
+
/**
|
|
8905
|
+
* Scroll to a specific row by index and optionally focus it
|
|
8906
|
+
* @param rowIndex - The index of the row to scroll to
|
|
8907
|
+
* @param focusFirstCell - Whether to focus the first editable cell (default: false)
|
|
8908
|
+
*/
|
|
8909
|
+
scrollToRowAndFocus(rowIndex, focusFirstCell = false) {
|
|
8910
|
+
setTimeout(() => {
|
|
8911
|
+
const hostElement = this.elementRef?.nativeElement;
|
|
8912
|
+
if (!hostElement)
|
|
8913
|
+
return;
|
|
8914
|
+
// Find the target row
|
|
8915
|
+
const rows = hostElement.querySelectorAll('tbody tr');
|
|
8916
|
+
const targetRow = rows[rowIndex];
|
|
8917
|
+
if (targetRow) {
|
|
8918
|
+
// Scroll the row into view
|
|
8919
|
+
targetRow.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
|
8920
|
+
// Optionally focus the first editable cell
|
|
8921
|
+
if (focusFirstCell) {
|
|
8922
|
+
const cells = targetRow.querySelectorAll('td:not(.settings-column):not(.row-number-cell)');
|
|
8923
|
+
const firstCell = cells[0];
|
|
8924
|
+
if (firstCell && typeof firstCell.focus === 'function') {
|
|
8925
|
+
setTimeout(() => {
|
|
8926
|
+
firstCell.focus();
|
|
8927
|
+
// Update table state focus position
|
|
8928
|
+
if (this.tableState) {
|
|
8929
|
+
this.tableState.focusCell(rowIndex, 0);
|
|
8930
|
+
}
|
|
8931
|
+
}, 100);
|
|
8932
|
+
}
|
|
8933
|
+
}
|
|
8934
|
+
}
|
|
8935
|
+
}, 0);
|
|
8936
|
+
}
|
|
8937
|
+
/**
|
|
8938
|
+
* Scroll to the last row in the table
|
|
8939
|
+
* @param focusFirstCell - Whether to focus the first editable cell (default: true)
|
|
8940
|
+
*/
|
|
8941
|
+
scrollToLastRow(focusFirstCell = true) {
|
|
8942
|
+
const rowCount = this.data?.length || 0;
|
|
8943
|
+
if (rowCount > 0) {
|
|
8944
|
+
this.scrollToRowAndFocus(rowCount - 1, focusFirstCell);
|
|
8945
|
+
}
|
|
8946
|
+
}
|
|
8804
8947
|
/**
|
|
8805
8948
|
* Get the scroll container element
|
|
8806
8949
|
*/
|
|
@@ -10322,12 +10465,34 @@ class StWorkbookComponent {
|
|
|
10322
10465
|
};
|
|
10323
10466
|
window.addEventListener('beforeunload', this.beforeUnloadHandler);
|
|
10324
10467
|
}
|
|
10468
|
+
// ===================================================
|
|
10469
|
+
// Public API Methods
|
|
10470
|
+
// ===================================================
|
|
10471
|
+
/**
|
|
10472
|
+
* Scroll to a specific row in the current table
|
|
10473
|
+
* @param rowIndex - The index of the row to scroll to
|
|
10474
|
+
* @param focusFirstCell - Whether to focus the first editable cell (default: false)
|
|
10475
|
+
*/
|
|
10476
|
+
scrollToRow(rowIndex, focusFirstCell = false) {
|
|
10477
|
+
if (this.tableComponent) {
|
|
10478
|
+
this.tableComponent.scrollToRowAndFocus(rowIndex, focusFirstCell);
|
|
10479
|
+
}
|
|
10480
|
+
}
|
|
10481
|
+
/**
|
|
10482
|
+
* Scroll to the last row in the current table
|
|
10483
|
+
* @param focusFirstCell - Whether to focus the first editable cell (default: true)
|
|
10484
|
+
*/
|
|
10485
|
+
scrollToLastRow(focusFirstCell = true) {
|
|
10486
|
+
if (this.tableComponent) {
|
|
10487
|
+
this.tableComponent.scrollToLastRow(focusFirstCell);
|
|
10488
|
+
}
|
|
10489
|
+
}
|
|
10325
10490
|
}
|
|
10326
10491
|
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 });
|
|
10327
|
-
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 } });
|
|
10492
|
+
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 } });
|
|
10328
10493
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StWorkbookComponent, decorators: [{
|
|
10329
10494
|
type: Component,
|
|
10330
|
-
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"] }]
|
|
10495
|
+
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"] }]
|
|
10331
10496
|
}], ctorParameters: function () { return [{ type: AutosaveService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
|
|
10332
10497
|
type: Input
|
|
10333
10498
|
}], sheetsData: [{
|
|
@@ -10352,6 +10517,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
10352
10517
|
type: Output
|
|
10353
10518
|
}], requestAddRow: [{
|
|
10354
10519
|
type: Output
|
|
10520
|
+
}], tableComponent: [{
|
|
10521
|
+
type: ViewChild,
|
|
10522
|
+
args: [StTableComponent]
|
|
10355
10523
|
}] } });
|
|
10356
10524
|
|
|
10357
10525
|
/**
|