@brickclay-org/ui 0.0.46 → 0.0.47
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.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Component, EventEmitter, HostListener, ViewChildren, Output, Input, Injectable, NgModule, forwardRef, ViewEncapsulation, Optional, Self, ViewChild, input, model, output, signal, computed, effect, inject, ElementRef, InjectionToken
|
|
2
|
+
import { Component, EventEmitter, HostListener, ViewChildren, Output, Input, Injectable, NgModule, forwardRef, ViewEncapsulation, Optional, Self, Directive, ViewChild, input, model, output, signal, computed, effect, inject, ElementRef, InjectionToken } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/common';
|
|
4
4
|
import { CommonModule } from '@angular/common';
|
|
5
5
|
import * as i1$1 from '@angular/forms';
|
|
@@ -2903,6 +2903,260 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
2903
2903
|
type: Output
|
|
2904
2904
|
}] } });
|
|
2905
2905
|
|
|
2906
|
+
class BKTooltipDirective {
|
|
2907
|
+
el;
|
|
2908
|
+
renderer;
|
|
2909
|
+
tooltipContent = '';
|
|
2910
|
+
tooltipPosition = 'right';
|
|
2911
|
+
tooltipElement = null;
|
|
2912
|
+
constructor(el, renderer) {
|
|
2913
|
+
this.el = el;
|
|
2914
|
+
this.renderer = renderer;
|
|
2915
|
+
}
|
|
2916
|
+
ngOnInit() {
|
|
2917
|
+
this.createTooltip();
|
|
2918
|
+
}
|
|
2919
|
+
ngOnChanges(changes) {
|
|
2920
|
+
if (changes['tooltipContent'] && !changes['tooltipContent'].firstChange) {
|
|
2921
|
+
this.updateTooltipContent();
|
|
2922
|
+
}
|
|
2923
|
+
}
|
|
2924
|
+
ngOnDestroy() {
|
|
2925
|
+
this.removeTooltip();
|
|
2926
|
+
}
|
|
2927
|
+
updateTooltipContent() {
|
|
2928
|
+
// If tooltip doesn't exist yet and content is now available, create it
|
|
2929
|
+
if (!this.tooltipElement && !this.isTooltipContentEmpty()) {
|
|
2930
|
+
this.createTooltip();
|
|
2931
|
+
return;
|
|
2932
|
+
}
|
|
2933
|
+
if (!this.tooltipElement)
|
|
2934
|
+
return;
|
|
2935
|
+
if (this.isTooltipContentEmpty())
|
|
2936
|
+
return;
|
|
2937
|
+
// remove old .text nodes
|
|
2938
|
+
Array.from(this.tooltipElement.querySelectorAll('.text')).forEach((el) => this.renderer.removeChild(this.tooltipElement, el));
|
|
2939
|
+
this.appendContent();
|
|
2940
|
+
}
|
|
2941
|
+
appendContent() {
|
|
2942
|
+
if (!this.tooltipElement)
|
|
2943
|
+
return;
|
|
2944
|
+
const contentLines = Array.isArray(this.tooltipContent)
|
|
2945
|
+
? this.tooltipContent
|
|
2946
|
+
: [this.tooltipContent];
|
|
2947
|
+
contentLines.forEach((line) => {
|
|
2948
|
+
const div = this.renderer.createElement('div');
|
|
2949
|
+
this.renderer.addClass(div, 'text');
|
|
2950
|
+
if (line?.trim().startsWith('<')) {
|
|
2951
|
+
div.innerHTML = line;
|
|
2952
|
+
}
|
|
2953
|
+
else {
|
|
2954
|
+
const text = this.renderer.createText(line ?? '');
|
|
2955
|
+
this.renderer.appendChild(div, text);
|
|
2956
|
+
}
|
|
2957
|
+
this.renderer.appendChild(this.tooltipElement, div);
|
|
2958
|
+
});
|
|
2959
|
+
}
|
|
2960
|
+
onMouseEnter() {
|
|
2961
|
+
if (this.tooltipElement) {
|
|
2962
|
+
this.setTooltipPosition();
|
|
2963
|
+
this.setStyle(this.tooltipElement, {
|
|
2964
|
+
visibility: 'visible',
|
|
2965
|
+
opacity: '1',
|
|
2966
|
+
});
|
|
2967
|
+
this.renderer.setStyle(document.body, 'overflow-x', 'hidden'); // ✅ temporarily lock horizontal scroll
|
|
2968
|
+
}
|
|
2969
|
+
}
|
|
2970
|
+
onMouseLeave() {
|
|
2971
|
+
if (this.tooltipElement) {
|
|
2972
|
+
this.setStyle(this.tooltipElement, {
|
|
2973
|
+
visibility: 'hidden',
|
|
2974
|
+
opacity: '0',
|
|
2975
|
+
});
|
|
2976
|
+
this.renderer.removeStyle(document.body, 'overflow-x'); // ✅ restore scroll when tooltip hides
|
|
2977
|
+
}
|
|
2978
|
+
}
|
|
2979
|
+
onWindowChange() {
|
|
2980
|
+
if (this.tooltipElement?.style.visibility === 'visible') {
|
|
2981
|
+
this.setTooltipPosition();
|
|
2982
|
+
}
|
|
2983
|
+
}
|
|
2984
|
+
isTooltipContentEmpty() {
|
|
2985
|
+
if (typeof this.tooltipContent === 'string') {
|
|
2986
|
+
return !this.tooltipContent.trim();
|
|
2987
|
+
}
|
|
2988
|
+
else if (Array.isArray(this.tooltipContent)) {
|
|
2989
|
+
return this.tooltipContent.length === 0 || this.tooltipContent.every(line => !line.trim());
|
|
2990
|
+
}
|
|
2991
|
+
return true;
|
|
2992
|
+
}
|
|
2993
|
+
createTooltip() {
|
|
2994
|
+
if (this.isTooltipContentEmpty())
|
|
2995
|
+
return;
|
|
2996
|
+
this.tooltipElement = this.renderer.createElement('div');
|
|
2997
|
+
this.renderer.addClass(this.tooltipElement, 'bk-tooltip-content');
|
|
2998
|
+
// Add content
|
|
2999
|
+
const contentLines = Array.isArray(this.tooltipContent) ? this.tooltipContent : [this.tooltipContent];
|
|
3000
|
+
contentLines.forEach((line) => {
|
|
3001
|
+
const div = this.renderer.createElement('div');
|
|
3002
|
+
this.renderer.addClass(div, 'text');
|
|
3003
|
+
// this.renderer.appendChild(div, this.renderer.createText(line));
|
|
3004
|
+
// Check if the line contains HTML
|
|
3005
|
+
if (line.trim().startsWith('<')) {
|
|
3006
|
+
div.innerHTML = line;
|
|
3007
|
+
}
|
|
3008
|
+
else {
|
|
3009
|
+
const text = this.renderer.createText(line);
|
|
3010
|
+
this.renderer.appendChild(div, text);
|
|
3011
|
+
}
|
|
3012
|
+
this.renderer.appendChild(this.tooltipElement, div);
|
|
3013
|
+
});
|
|
3014
|
+
// Add triangle
|
|
3015
|
+
const triangle = this.renderer.createElement('div');
|
|
3016
|
+
this.renderer.addClass(triangle, 'bk-tooltip-triangle');
|
|
3017
|
+
this.renderer.appendChild(this.tooltipElement, triangle);
|
|
3018
|
+
// Set base styles
|
|
3019
|
+
this.setStyle(this.tooltipElement, {
|
|
3020
|
+
position: 'fixed',
|
|
3021
|
+
visibility: 'hidden',
|
|
3022
|
+
opacity: '0',
|
|
3023
|
+
zIndex: '9999',
|
|
3024
|
+
transition: 'opacity 0.3s ease, visibility 0.3s ease',
|
|
3025
|
+
});
|
|
3026
|
+
this.renderer.appendChild(document.body, this.tooltipElement);
|
|
3027
|
+
}
|
|
3028
|
+
setTooltipPosition() {
|
|
3029
|
+
if (!this.tooltipElement)
|
|
3030
|
+
return;
|
|
3031
|
+
const hostRect = this.el.nativeElement.getBoundingClientRect();
|
|
3032
|
+
const tooltipRect = this.tooltipElement.getBoundingClientRect();
|
|
3033
|
+
const scrollTop = window.scrollY || document.documentElement.scrollTop;
|
|
3034
|
+
const scrollLeft = window.scrollX || document.documentElement.scrollLeft;
|
|
3035
|
+
const triangle = this.tooltipElement.querySelector('.bk-tooltip-triangle');
|
|
3036
|
+
const padding = 10;
|
|
3037
|
+
let top = 0, left = 0;
|
|
3038
|
+
// Position logic
|
|
3039
|
+
switch (this.tooltipPosition) {
|
|
3040
|
+
case 'right':
|
|
3041
|
+
case 'left':
|
|
3042
|
+
top = hostRect.top + scrollTop + hostRect.height / 2;
|
|
3043
|
+
left = this.tooltipPosition === 'right'
|
|
3044
|
+
? hostRect.right + scrollLeft + padding
|
|
3045
|
+
: hostRect.left + scrollLeft - tooltipRect.width - padding;
|
|
3046
|
+
// Auto flip if out of viewport
|
|
3047
|
+
if (this.tooltipPosition === 'right' && left + tooltipRect.width > window.innerWidth) {
|
|
3048
|
+
left = hostRect.left + scrollLeft - tooltipRect.width - padding;
|
|
3049
|
+
}
|
|
3050
|
+
else if (this.tooltipPosition === 'left' && left < 0) {
|
|
3051
|
+
left = hostRect.right + scrollLeft + padding;
|
|
3052
|
+
}
|
|
3053
|
+
this.setStyle(this.tooltipElement, {
|
|
3054
|
+
transform: 'translateY(-50%)',
|
|
3055
|
+
});
|
|
3056
|
+
this.setTriangleStyles(triangle, this.tooltipPosition, left < hostRect.left + scrollLeft);
|
|
3057
|
+
break;
|
|
3058
|
+
case 'top':
|
|
3059
|
+
case 'bottom':
|
|
3060
|
+
left = hostRect.left + scrollLeft + hostRect.width / 2 - tooltipRect.width / 2;
|
|
3061
|
+
top = this.tooltipPosition === 'top'
|
|
3062
|
+
? hostRect.top + scrollTop - tooltipRect.height - padding
|
|
3063
|
+
: hostRect.bottom + scrollTop + padding;
|
|
3064
|
+
// Prevent overflow
|
|
3065
|
+
left = Math.max(10, Math.min(left, window.innerWidth - tooltipRect.width - 10));
|
|
3066
|
+
this.setStyle(this.tooltipElement, {
|
|
3067
|
+
transform: 'translateX(0)',
|
|
3068
|
+
});
|
|
3069
|
+
this.setTriangleStyles(triangle, this.tooltipPosition);
|
|
3070
|
+
break;
|
|
3071
|
+
}
|
|
3072
|
+
this.setStyle(this.tooltipElement, {
|
|
3073
|
+
top: `${top}px`,
|
|
3074
|
+
left: `${left}px`,
|
|
3075
|
+
});
|
|
3076
|
+
}
|
|
3077
|
+
setTriangleStyles(triangle, position, flipped = false) {
|
|
3078
|
+
if (!triangle)
|
|
3079
|
+
return;
|
|
3080
|
+
const base = {
|
|
3081
|
+
top: '',
|
|
3082
|
+
left: '',
|
|
3083
|
+
right: '',
|
|
3084
|
+
bottom: '',
|
|
3085
|
+
transform: '',
|
|
3086
|
+
borderColor: '',
|
|
3087
|
+
};
|
|
3088
|
+
let styles = { ...base };
|
|
3089
|
+
switch (position) {
|
|
3090
|
+
case 'right':
|
|
3091
|
+
styles = flipped
|
|
3092
|
+
? { left: '100%', top: '50%', transform: 'translateY(-50%) translateX(0)', borderColor: 'transparent transparent transparent #1a1a1a' }
|
|
3093
|
+
: { left: '-15px', top: '50%', transform: 'translateY(-50%)', borderColor: 'transparent #1a1a1a transparent transparent' };
|
|
3094
|
+
break;
|
|
3095
|
+
case 'left':
|
|
3096
|
+
styles = flipped
|
|
3097
|
+
? { left: '100%', top: '50%', transform: 'translateY(-50%) translateX(0)', borderColor: 'transparent transparent transparent #1a1a1a' }
|
|
3098
|
+
: { left: '-15px', top: '50%', transform: 'translateY(-50%)', borderColor: 'transparent #1a1a1a transparent transparent' };
|
|
3099
|
+
break;
|
|
3100
|
+
case 'top':
|
|
3101
|
+
styles = {
|
|
3102
|
+
bottom: '-15px',
|
|
3103
|
+
left: '50%',
|
|
3104
|
+
transform: 'translateX(-50%)',
|
|
3105
|
+
borderColor: '#1a1a1a transparent transparent transparent',
|
|
3106
|
+
};
|
|
3107
|
+
break;
|
|
3108
|
+
case 'bottom':
|
|
3109
|
+
styles = {
|
|
3110
|
+
top: '-15px',
|
|
3111
|
+
left: '50%',
|
|
3112
|
+
transform: 'translateX(-50%)',
|
|
3113
|
+
borderColor: 'transparent transparent #1a1a1a transparent',
|
|
3114
|
+
};
|
|
3115
|
+
break;
|
|
3116
|
+
}
|
|
3117
|
+
this.setStyle(triangle, styles);
|
|
3118
|
+
}
|
|
3119
|
+
removeTooltip() {
|
|
3120
|
+
if (this.tooltipElement) {
|
|
3121
|
+
this.renderer.removeChild(document.body, this.tooltipElement);
|
|
3122
|
+
this.tooltipElement = null;
|
|
3123
|
+
}
|
|
3124
|
+
}
|
|
3125
|
+
// Utility function to apply multiple styles
|
|
3126
|
+
setStyle(el, styles) {
|
|
3127
|
+
Object.entries(styles).forEach(([prop, value]) => {
|
|
3128
|
+
this.renderer.setStyle(el, prop, value);
|
|
3129
|
+
});
|
|
3130
|
+
}
|
|
3131
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BKTooltipDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
|
|
3132
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.16", type: BKTooltipDirective, isStandalone: true, selector: "[bkTooltip]", inputs: { tooltipContent: ["bkTooltip", "tooltipContent"], tooltipPosition: ["bkTooltipPosition", "tooltipPosition"] }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "window:scroll": "onWindowChange()", "window:resize": "onWindowChange()" } }, usesOnChanges: true, ngImport: i0 });
|
|
3133
|
+
}
|
|
3134
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BKTooltipDirective, decorators: [{
|
|
3135
|
+
type: Directive,
|
|
3136
|
+
args: [{
|
|
3137
|
+
selector: '[bkTooltip]',
|
|
3138
|
+
standalone: true,
|
|
3139
|
+
}]
|
|
3140
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { tooltipContent: [{
|
|
3141
|
+
type: Input,
|
|
3142
|
+
args: ['bkTooltip']
|
|
3143
|
+
}], tooltipPosition: [{
|
|
3144
|
+
type: Input,
|
|
3145
|
+
args: ['bkTooltipPosition']
|
|
3146
|
+
}], onMouseEnter: [{
|
|
3147
|
+
type: HostListener,
|
|
3148
|
+
args: ['mouseenter']
|
|
3149
|
+
}], onMouseLeave: [{
|
|
3150
|
+
type: HostListener,
|
|
3151
|
+
args: ['mouseleave']
|
|
3152
|
+
}], onWindowChange: [{
|
|
3153
|
+
type: HostListener,
|
|
3154
|
+
args: ['window:scroll']
|
|
3155
|
+
}, {
|
|
3156
|
+
type: HostListener,
|
|
3157
|
+
args: ['window:resize']
|
|
3158
|
+
}] } });
|
|
3159
|
+
|
|
2906
3160
|
class BkGrid {
|
|
2907
3161
|
draggable = false;
|
|
2908
3162
|
columns = [];
|
|
@@ -3002,11 +3256,11 @@ class BkGrid {
|
|
|
3002
3256
|
});
|
|
3003
3257
|
}
|
|
3004
3258
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BkGrid, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3005
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: BkGrid, isStandalone: true, selector: "bk-grid", inputs: { draggable: "draggable", columns: "columns", result: "result", actions: "actions" }, outputs: { actionClick: "actionClick", sortChange: "sortChange", dragDropChange: "dragDropChange" }, viewQueries: [{ propertyName: "tableScrollContainer", first: true, predicate: ["tableScrollContainer"], descendants: true }], ngImport: i0, template: "<div\r\n #tableScrollContainer\r\n cdkScrollable\r\n class=\"h-[calc(100vh-260px)] overflow-y-auto\">\r\n\r\n <table class=\"min-w-full text-sm text-left text-gray-800 table-auto border-collapse\">\r\n\r\n <!-- ================= HEADER ================= -->\r\n <thead>\r\n <tr>\r\n @for (col of columns; track col.header;let i=$index;) {\r\n @if (isColumnVisible(col)) {\r\n <th\r\n class=\"grid-header sticky top-0 cursor-pointer\"\r\n [class.action-sticky]=\"col.sticky\"\r\n [class.z-10]=\"col.sticky\"\r\n [ngClass]=\"col.headerClass\"\r\n [ngClass]=\"col.cellClass\"\r\n (click)=\"sort(col,i)\"\r\n >\r\n <span class=\"flex items-center gap-1\"\r\n [ngClass]=\"sortColumn === col.field\r\n ? (sortDirection === 'asc' ? 'grid-asc' : 'grid-desc')\r\n : ''\">\r\n {{ col.header }}\r\n @if (col.sortable) {\r\n <span class=\"grid-sort-icon\"></span>\r\n }\r\n </span>\r\n </th>\r\n }\r\n }\r\n\r\n @if (actions.length) {\r\n <th class=\"grid-header sticky top-0 action-sticky z-10 !bg-[#FBFBFC] w-20\">\r\n Action\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <!-- ================= BODY ================= -->\r\n <tbody\r\n cdkDropList\r\n [cdkDropListDisabled]=\"!draggable\"\r\n [cdkDropListData]=\"result || []\"\r\n (cdkDropListDropped)=\"dropList($event)\">\r\n\r\n @for (row of result; track row; let rowIndex = $index) {\r\n <tr\r\n cdkDrag\r\n cdkDragLockAxis=\"y\"\r\n [cdkDragDisabled]=\"!draggable\"\r\n (cdkDragStarted)=\"onDragStart($event)\"\r\n (cdkDragMoved)=\"onDragMoved($event)\"\r\n class=\"\" [ngClass]=\"{ 'cursor-move ': draggable }\">\r\n\r\n @for (col of columns; track col.header; let colIndex = $index) {\r\n @if (isColumnVisible(col)) {\r\n <td class=\"grid-cell text-nowrap\" [ngClass]=\"col.cellClass\">\r\n @if (draggable && colIndex === firstVisibleColumnIndex) {\r\n <span cdkDragHandle class=\"mr-2 text-gray-400\" [ngClass]=\"{ 'cursor-move': draggable }\">\u2630</span>\r\n }\r\n {{ getCellValue(row, col) }}\r\n </td>\r\n }\r\n }\r\n\r\n @if (actions.length) {\r\n <td class=\"grid-cell action-sticky text-center\">\r\n <div class=\"flex items-center justify-center gap-1.5\">\r\n @for (action of actions; track action.name) {\r\n @if (action.hasPermission) {\r\n <!-- appTooltip=\"{{ action.tooltip }}\"\r\n appTooltipPosition=\"top\" -->\r\n <button\r\n class=\"size-6 flex items-center justify-center rounded hover:bg-[#F8F8FA]\"\r\n (click)=\"emitAction(action, row)\"\r\n\r\n >\r\n <img\r\n [src]=\"action.icon\"\r\n width=\"14\"\r\n height=\"14\"\r\n alt=\"action-icon\"\r\n />\r\n </button>\r\n }\r\n }\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n</div>\r\n", styles: [".grid-header{@apply bg-[#FBFBFC] text-xs text-[#60646C] leading-5 font-semibold capitalize px-4 py-2 whitespace-nowrap;}.grid-cell{@apply text-[#15191E] text-[13px] font-medium leading-4 px-4 py-2 border border-[#EBEDF3] border-b-0;}.grid-cell:last-child{@apply border-e-0;}.grid-cell:first-child,.grid-first-cell{@apply border-s-0;}.grid-last-cell{@apply border-e-0;}.grid-action-sticky{@apply sticky bg-white right-[.1px] z-[1px];}.grid-action-sticky:before{@apply absolute top-0 bottom-0 left-[-8px] w-2;content:\"\";background-image:linear-gradient(to left,rgba(0,0,0,.05),transparent)}.grid-required{@apply font-medium text-sm leading-normal after:content-[\"*\"] after:text-[#C10007] after:ms-0.5;}.grid-sort{display:inline-flex;align-items:center;gap:.35rem;cursor:pointer;line-height:1}.grid-sort-icon{display:inline-flex;flex-direction:column;justify-content:center;align-items:center;height:.875rem;width:.875rem;gap:.125rem;line-height:1}.grid-sort-icon:before{display:inline-block;content:\"\";height:.3rem;width:.54rem;background-repeat:no-repeat;background-position:center;background-size:cover;background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M1.08333 4.83333C0.908333 4.83333 0.791667 4.775 0.675 4.65833C0.441667 4.425 0.441667 4.075 0.675 3.84167L3.59167 0.925C3.825 0.691667 4.175 0.691667 4.40833 0.925L7.325 3.84167C7.55833 4.075 7.55833 4.425 7.325 4.65833C7.09167 4.89167 6.74167 4.89167 6.50833 4.65833L4 2.15L1.49167 4.65833C1.375 4.775 1.25833 4.83333 1.08333 4.83333Z' fill='%2378829D'/%3e%3c/svg%3e\")}.grid-sort-icon:after{display:inline-block;content:\"\";height:.3rem;width:.54rem;background-repeat:no-repeat;background-position:center;background-size:cover;background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M4 4.24984C3.825 4.24984 3.70833 4.1915 3.59167 4.07484L0.675 1.15817C0.441667 0.924838 0.441667 0.574837 0.675 0.341504C0.908333 0.108171 1.25833 0.108171 1.49167 0.341504L4 2.84984L6.50833 0.341504C6.74167 0.108171 7.09167 0.108171 7.325 0.341504C7.55833 0.574837 7.55833 0.924838 7.325 1.15817L4.40833 4.07484C4.29167 4.1915 4.175 4.24984 4 4.24984Z' fill='%2378829D'/%3e%3c/svg%3e\")}.grid-asc>.grid-sort-icon:before{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M1.08333 4.83333C0.908333 4.83333 0.791667 4.775 0.675 4.65833C0.441667 4.425 0.441667 4.075 0.675 3.84167L3.59167 0.925C3.825 0.691667 4.175 0.691667 4.40833 0.925L7.325 3.84167C7.55833 4.075 7.55833 4.425 7.325 4.65833C7.09167 4.89167 6.74167 4.89167 6.50833 4.65833L4 2.15L1.49167 4.65833C1.375 4.775 1.25833 4.83333 1.08333 4.83333Z' fill='%234B5675'/%3e%3c/svg%3e\")}.grid-asc>.grid-sort-icon:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M4 4.24984C3.825 4.24984 3.70833 4.1915 3.59167 4.07484L0.675 1.15817C0.441667 0.924838 0.441667 0.574837 0.675 0.341504C0.908333 0.108171 1.25833 0.108171 1.49167 0.341504L4 2.84984L6.50833 0.341504C6.74167 0.108171 7.09167 0.108171 7.325 0.341504C7.55833 0.574837 7.55833 0.924838 7.325 1.15817L4.40833 4.07484C4.29167 4.1915 4.175 4.24984 4 4.24984Z' fill='%23C4CADA'/%3e%3c/svg%3e\")}.grid-desc>.grid-sort-icon:before{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M1.08333 4.83333C0.908333 4.83333 0.791667 4.775 0.675 4.65833C0.441667 4.425 0.441667 4.075 0.675 3.84167L3.59167 0.925C3.825 0.691667 4.175 0.691667 4.40833 0.925L7.325 3.84167C7.55833 4.075 7.55833 4.425 7.325 4.65833C7.09167 4.89167 6.74167 4.89167 6.50833 4.65833L4 2.15L1.49167 4.65833C1.375 4.775 1.25833 4.83333 1.08333 4.83333Z' fill='%23C4CADA'/%3e%3c/svg%3e\")}.grid-desc>.grid-sort-icon:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M4 4.24984C3.825 4.24984 3.70833 4.1915 3.59167 4.07484L0.675 1.15817C0.441667 0.924838 0.441667 0.574837 0.675 0.341504C0.908333 0.108171 1.25833 0.108171 1.49167 0.341504L4 2.84984L6.50833 0.341504C6.74167 0.108171 7.09167 0.108171 7.325 0.341504C7.55833 0.574837 7.55833 0.924838 7.325 1.15817L4.40833 4.07484C4.29167 4.1915 4.175 4.24984 4 4.24984Z' fill='%234B5675'/%3e%3c/svg%3e\")}.cdk-drag-preview{display:table;width:100%;background:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:.4;background-color:#f3f4f6}.cdk-drag-animating,.cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.ɵɵCdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: ScrollingModule }] });
|
|
3259
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: BkGrid, isStandalone: true, selector: "bk-grid", inputs: { draggable: "draggable", columns: "columns", result: "result", actions: "actions" }, outputs: { actionClick: "actionClick", sortChange: "sortChange", dragDropChange: "dragDropChange" }, viewQueries: [{ propertyName: "tableScrollContainer", first: true, predicate: ["tableScrollContainer"], descendants: true }], ngImport: i0, template: "<div\r\n #tableScrollContainer\r\n cdkScrollable\r\n class=\"h-[calc(100vh-260px)] overflow-y-auto\">\r\n\r\n <table class=\"min-w-full text-sm text-left text-gray-800 table-auto border-collapse\">\r\n\r\n <!-- ================= HEADER ================= -->\r\n <thead>\r\n <tr>\r\n @for (col of columns; track col.header;let i=$index;) {\r\n @if (isColumnVisible(col)) {\r\n <th\r\n class=\"grid-header sticky top-0 cursor-pointer\"\r\n [class.action-sticky]=\"col.sticky\"\r\n [class.z-10]=\"col.sticky\"\r\n [ngClass]=\"col.headerClass\"\r\n [ngClass]=\"col.cellClass\"\r\n (click)=\"sort(col,i)\"\r\n >\r\n <span class=\"flex items-center gap-1\"\r\n [ngClass]=\"sortColumn === col.field\r\n ? (sortDirection === 'asc' ? 'grid-asc' : 'grid-desc')\r\n : ''\">\r\n {{ col.header }}\r\n @if (col.sortable) {\r\n <span class=\"grid-sort-icon\"></span>\r\n }\r\n </span>\r\n </th>\r\n }\r\n }\r\n\r\n @if (actions.length) {\r\n <th class=\"grid-header sticky top-0 action-sticky z-10 !bg-[#FBFBFC] w-20\">\r\n Action\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <!-- ================= BODY ================= -->\r\n <tbody\r\n cdkDropList\r\n [cdkDropListDisabled]=\"!draggable\"\r\n [cdkDropListData]=\"result || []\"\r\n (cdkDropListDropped)=\"dropList($event)\">\r\n\r\n @for (row of result; track row; let rowIndex = $index) {\r\n <tr\r\n cdkDrag\r\n cdkDragLockAxis=\"y\"\r\n [cdkDragDisabled]=\"!draggable\"\r\n (cdkDragStarted)=\"onDragStart($event)\"\r\n (cdkDragMoved)=\"onDragMoved($event)\"\r\n class=\"\" [ngClass]=\"{ 'cursor-move ': draggable }\">\r\n\r\n @for (col of columns; track col.header; let colIndex = $index) {\r\n @if (isColumnVisible(col)) {\r\n <td class=\"grid-cell text-nowrap\" [ngClass]=\"col.cellClass\">\r\n @if (draggable && colIndex === firstVisibleColumnIndex) {\r\n <span cdkDragHandle class=\"mr-2 text-gray-400\" [ngClass]=\"{ 'cursor-move': draggable }\">\u2630</span>\r\n }\r\n {{ getCellValue(row, col) }}\r\n </td>\r\n }\r\n }\r\n\r\n @if (actions.length) {\r\n <td class=\"grid-cell action-sticky text-center\">\r\n <div class=\"flex items-center justify-center gap-1.5\">\r\n @for (action of actions; track action.name) {\r\n @if (action.hasPermission) {\r\n \r\n <button \r\n bkTooltip=\"{{ action.tooltip }}\"\r\n bkTooltipPosition=\"top\" \r\n class=\"size-6 flex items-center justify-center rounded hover:bg-[#F8F8FA]\"\r\n (click)=\"emitAction(action, row)\"\r\n >\r\n <img\r\n [src]=\"action.icon\"\r\n width=\"14\"\r\n height=\"14\"\r\n alt=\"action-icon\"\r\n />\r\n </button>\r\n }\r\n }\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n</div>\r\n", styles: [".grid-header{@apply bg-[#FBFBFC] text-xs text-[#60646C] leading-5 font-semibold capitalize px-4 py-2 whitespace-nowrap;}.grid-cell{@apply text-[#15191E] text-[13px] font-medium leading-4 px-4 py-2 border border-[#EBEDF3] border-b-0;}.grid-cell:last-child{@apply border-e-0;}.grid-cell:first-child,.grid-first-cell{@apply border-s-0;}.grid-last-cell{@apply border-e-0;}.grid-action-sticky{@apply sticky bg-white right-[.1px] z-[1px];}.grid-action-sticky:before{@apply absolute top-0 bottom-0 left-[-8px] w-2;content:\"\";background-image:linear-gradient(to left,rgba(0,0,0,.05),transparent)}.grid-required{@apply font-medium text-sm leading-normal after:content-[\"*\"] after:text-[#C10007] after:ms-0.5;}.grid-sort{display:inline-flex;align-items:center;gap:.35rem;cursor:pointer;line-height:1}.grid-sort-icon{display:inline-flex;flex-direction:column;justify-content:center;align-items:center;height:.875rem;width:.875rem;gap:.125rem;line-height:1}.grid-sort-icon:before{display:inline-block;content:\"\";height:.3rem;width:.54rem;background-repeat:no-repeat;background-position:center;background-size:cover;background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M1.08333 4.83333C0.908333 4.83333 0.791667 4.775 0.675 4.65833C0.441667 4.425 0.441667 4.075 0.675 3.84167L3.59167 0.925C3.825 0.691667 4.175 0.691667 4.40833 0.925L7.325 3.84167C7.55833 4.075 7.55833 4.425 7.325 4.65833C7.09167 4.89167 6.74167 4.89167 6.50833 4.65833L4 2.15L1.49167 4.65833C1.375 4.775 1.25833 4.83333 1.08333 4.83333Z' fill='%2378829D'/%3e%3c/svg%3e\")}.grid-sort-icon:after{display:inline-block;content:\"\";height:.3rem;width:.54rem;background-repeat:no-repeat;background-position:center;background-size:cover;background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M4 4.24984C3.825 4.24984 3.70833 4.1915 3.59167 4.07484L0.675 1.15817C0.441667 0.924838 0.441667 0.574837 0.675 0.341504C0.908333 0.108171 1.25833 0.108171 1.49167 0.341504L4 2.84984L6.50833 0.341504C6.74167 0.108171 7.09167 0.108171 7.325 0.341504C7.55833 0.574837 7.55833 0.924838 7.325 1.15817L4.40833 4.07484C4.29167 4.1915 4.175 4.24984 4 4.24984Z' fill='%2378829D'/%3e%3c/svg%3e\")}.grid-asc>.grid-sort-icon:before{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M1.08333 4.83333C0.908333 4.83333 0.791667 4.775 0.675 4.65833C0.441667 4.425 0.441667 4.075 0.675 3.84167L3.59167 0.925C3.825 0.691667 4.175 0.691667 4.40833 0.925L7.325 3.84167C7.55833 4.075 7.55833 4.425 7.325 4.65833C7.09167 4.89167 6.74167 4.89167 6.50833 4.65833L4 2.15L1.49167 4.65833C1.375 4.775 1.25833 4.83333 1.08333 4.83333Z' fill='%234B5675'/%3e%3c/svg%3e\")}.grid-asc>.grid-sort-icon:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M4 4.24984C3.825 4.24984 3.70833 4.1915 3.59167 4.07484L0.675 1.15817C0.441667 0.924838 0.441667 0.574837 0.675 0.341504C0.908333 0.108171 1.25833 0.108171 1.49167 0.341504L4 2.84984L6.50833 0.341504C6.74167 0.108171 7.09167 0.108171 7.325 0.341504C7.55833 0.574837 7.55833 0.924838 7.325 1.15817L4.40833 4.07484C4.29167 4.1915 4.175 4.24984 4 4.24984Z' fill='%23C4CADA'/%3e%3c/svg%3e\")}.grid-desc>.grid-sort-icon:before{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M1.08333 4.83333C0.908333 4.83333 0.791667 4.775 0.675 4.65833C0.441667 4.425 0.441667 4.075 0.675 3.84167L3.59167 0.925C3.825 0.691667 4.175 0.691667 4.40833 0.925L7.325 3.84167C7.55833 4.075 7.55833 4.425 7.325 4.65833C7.09167 4.89167 6.74167 4.89167 6.50833 4.65833L4 2.15L1.49167 4.65833C1.375 4.775 1.25833 4.83333 1.08333 4.83333Z' fill='%23C4CADA'/%3e%3c/svg%3e\")}.grid-desc>.grid-sort-icon:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M4 4.24984C3.825 4.24984 3.70833 4.1915 3.59167 4.07484L0.675 1.15817C0.441667 0.924838 0.441667 0.574837 0.675 0.341504C0.908333 0.108171 1.25833 0.108171 1.49167 0.341504L4 2.84984L6.50833 0.341504C6.74167 0.108171 7.09167 0.108171 7.325 0.341504C7.55833 0.574837 7.55833 0.924838 7.325 1.15817L4.40833 4.07484C4.29167 4.1915 4.175 4.24984 4 4.24984Z' fill='%234B5675'/%3e%3c/svg%3e\")}.cdk-drag-preview{display:table;width:100%;background:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:.4;background-color:#f3f4f6}.cdk-drag-animating,.cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.ɵɵCdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: BKTooltipDirective, selector: "[bkTooltip]", inputs: ["bkTooltip", "bkTooltipPosition"] }] });
|
|
3006
3260
|
}
|
|
3007
3261
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BkGrid, decorators: [{
|
|
3008
3262
|
type: Component,
|
|
3009
|
-
args: [{ selector: 'bk-grid', standalone: true, imports: [CommonModule, DragDropModule, ScrollingModule], template: "<div\r\n #tableScrollContainer\r\n cdkScrollable\r\n class=\"h-[calc(100vh-260px)] overflow-y-auto\">\r\n\r\n <table class=\"min-w-full text-sm text-left text-gray-800 table-auto border-collapse\">\r\n\r\n <!-- ================= HEADER ================= -->\r\n <thead>\r\n <tr>\r\n @for (col of columns; track col.header;let i=$index;) {\r\n @if (isColumnVisible(col)) {\r\n <th\r\n class=\"grid-header sticky top-0 cursor-pointer\"\r\n [class.action-sticky]=\"col.sticky\"\r\n [class.z-10]=\"col.sticky\"\r\n [ngClass]=\"col.headerClass\"\r\n [ngClass]=\"col.cellClass\"\r\n (click)=\"sort(col,i)\"\r\n >\r\n <span class=\"flex items-center gap-1\"\r\n [ngClass]=\"sortColumn === col.field\r\n ? (sortDirection === 'asc' ? 'grid-asc' : 'grid-desc')\r\n : ''\">\r\n {{ col.header }}\r\n @if (col.sortable) {\r\n <span class=\"grid-sort-icon\"></span>\r\n }\r\n </span>\r\n </th>\r\n }\r\n }\r\n\r\n @if (actions.length) {\r\n <th class=\"grid-header sticky top-0 action-sticky z-10 !bg-[#FBFBFC] w-20\">\r\n Action\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <!-- ================= BODY ================= -->\r\n <tbody\r\n cdkDropList\r\n [cdkDropListDisabled]=\"!draggable\"\r\n [cdkDropListData]=\"result || []\"\r\n (cdkDropListDropped)=\"dropList($event)\">\r\n\r\n @for (row of result; track row; let rowIndex = $index) {\r\n <tr\r\n cdkDrag\r\n cdkDragLockAxis=\"y\"\r\n [cdkDragDisabled]=\"!draggable\"\r\n (cdkDragStarted)=\"onDragStart($event)\"\r\n (cdkDragMoved)=\"onDragMoved($event)\"\r\n class=\"\" [ngClass]=\"{ 'cursor-move ': draggable }\">\r\n\r\n @for (col of columns; track col.header; let colIndex = $index) {\r\n @if (isColumnVisible(col)) {\r\n <td class=\"grid-cell text-nowrap\" [ngClass]=\"col.cellClass\">\r\n @if (draggable && colIndex === firstVisibleColumnIndex) {\r\n <span cdkDragHandle class=\"mr-2 text-gray-400\" [ngClass]=\"{ 'cursor-move': draggable }\">\u2630</span>\r\n }\r\n {{ getCellValue(row, col) }}\r\n </td>\r\n }\r\n }\r\n\r\n @if (actions.length) {\r\n <td class=\"grid-cell action-sticky text-center\">\r\n <div class=\"flex items-center justify-center gap-1.5\">\r\n @for (action of actions; track action.name) {\r\n @if (action.hasPermission) {\r\n
|
|
3263
|
+
args: [{ selector: 'bk-grid', standalone: true, imports: [CommonModule, DragDropModule, ScrollingModule, BKTooltipDirective], template: "<div\r\n #tableScrollContainer\r\n cdkScrollable\r\n class=\"h-[calc(100vh-260px)] overflow-y-auto\">\r\n\r\n <table class=\"min-w-full text-sm text-left text-gray-800 table-auto border-collapse\">\r\n\r\n <!-- ================= HEADER ================= -->\r\n <thead>\r\n <tr>\r\n @for (col of columns; track col.header;let i=$index;) {\r\n @if (isColumnVisible(col)) {\r\n <th\r\n class=\"grid-header sticky top-0 cursor-pointer\"\r\n [class.action-sticky]=\"col.sticky\"\r\n [class.z-10]=\"col.sticky\"\r\n [ngClass]=\"col.headerClass\"\r\n [ngClass]=\"col.cellClass\"\r\n (click)=\"sort(col,i)\"\r\n >\r\n <span class=\"flex items-center gap-1\"\r\n [ngClass]=\"sortColumn === col.field\r\n ? (sortDirection === 'asc' ? 'grid-asc' : 'grid-desc')\r\n : ''\">\r\n {{ col.header }}\r\n @if (col.sortable) {\r\n <span class=\"grid-sort-icon\"></span>\r\n }\r\n </span>\r\n </th>\r\n }\r\n }\r\n\r\n @if (actions.length) {\r\n <th class=\"grid-header sticky top-0 action-sticky z-10 !bg-[#FBFBFC] w-20\">\r\n Action\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <!-- ================= BODY ================= -->\r\n <tbody\r\n cdkDropList\r\n [cdkDropListDisabled]=\"!draggable\"\r\n [cdkDropListData]=\"result || []\"\r\n (cdkDropListDropped)=\"dropList($event)\">\r\n\r\n @for (row of result; track row; let rowIndex = $index) {\r\n <tr\r\n cdkDrag\r\n cdkDragLockAxis=\"y\"\r\n [cdkDragDisabled]=\"!draggable\"\r\n (cdkDragStarted)=\"onDragStart($event)\"\r\n (cdkDragMoved)=\"onDragMoved($event)\"\r\n class=\"\" [ngClass]=\"{ 'cursor-move ': draggable }\">\r\n\r\n @for (col of columns; track col.header; let colIndex = $index) {\r\n @if (isColumnVisible(col)) {\r\n <td class=\"grid-cell text-nowrap\" [ngClass]=\"col.cellClass\">\r\n @if (draggable && colIndex === firstVisibleColumnIndex) {\r\n <span cdkDragHandle class=\"mr-2 text-gray-400\" [ngClass]=\"{ 'cursor-move': draggable }\">\u2630</span>\r\n }\r\n {{ getCellValue(row, col) }}\r\n </td>\r\n }\r\n }\r\n\r\n @if (actions.length) {\r\n <td class=\"grid-cell action-sticky text-center\">\r\n <div class=\"flex items-center justify-center gap-1.5\">\r\n @for (action of actions; track action.name) {\r\n @if (action.hasPermission) {\r\n \r\n <button \r\n bkTooltip=\"{{ action.tooltip }}\"\r\n bkTooltipPosition=\"top\" \r\n class=\"size-6 flex items-center justify-center rounded hover:bg-[#F8F8FA]\"\r\n (click)=\"emitAction(action, row)\"\r\n >\r\n <img\r\n [src]=\"action.icon\"\r\n width=\"14\"\r\n height=\"14\"\r\n alt=\"action-icon\"\r\n />\r\n </button>\r\n }\r\n }\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n</div>\r\n", styles: [".grid-header{@apply bg-[#FBFBFC] text-xs text-[#60646C] leading-5 font-semibold capitalize px-4 py-2 whitespace-nowrap;}.grid-cell{@apply text-[#15191E] text-[13px] font-medium leading-4 px-4 py-2 border border-[#EBEDF3] border-b-0;}.grid-cell:last-child{@apply border-e-0;}.grid-cell:first-child,.grid-first-cell{@apply border-s-0;}.grid-last-cell{@apply border-e-0;}.grid-action-sticky{@apply sticky bg-white right-[.1px] z-[1px];}.grid-action-sticky:before{@apply absolute top-0 bottom-0 left-[-8px] w-2;content:\"\";background-image:linear-gradient(to left,rgba(0,0,0,.05),transparent)}.grid-required{@apply font-medium text-sm leading-normal after:content-[\"*\"] after:text-[#C10007] after:ms-0.5;}.grid-sort{display:inline-flex;align-items:center;gap:.35rem;cursor:pointer;line-height:1}.grid-sort-icon{display:inline-flex;flex-direction:column;justify-content:center;align-items:center;height:.875rem;width:.875rem;gap:.125rem;line-height:1}.grid-sort-icon:before{display:inline-block;content:\"\";height:.3rem;width:.54rem;background-repeat:no-repeat;background-position:center;background-size:cover;background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M1.08333 4.83333C0.908333 4.83333 0.791667 4.775 0.675 4.65833C0.441667 4.425 0.441667 4.075 0.675 3.84167L3.59167 0.925C3.825 0.691667 4.175 0.691667 4.40833 0.925L7.325 3.84167C7.55833 4.075 7.55833 4.425 7.325 4.65833C7.09167 4.89167 6.74167 4.89167 6.50833 4.65833L4 2.15L1.49167 4.65833C1.375 4.775 1.25833 4.83333 1.08333 4.83333Z' fill='%2378829D'/%3e%3c/svg%3e\")}.grid-sort-icon:after{display:inline-block;content:\"\";height:.3rem;width:.54rem;background-repeat:no-repeat;background-position:center;background-size:cover;background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M4 4.24984C3.825 4.24984 3.70833 4.1915 3.59167 4.07484L0.675 1.15817C0.441667 0.924838 0.441667 0.574837 0.675 0.341504C0.908333 0.108171 1.25833 0.108171 1.49167 0.341504L4 2.84984L6.50833 0.341504C6.74167 0.108171 7.09167 0.108171 7.325 0.341504C7.55833 0.574837 7.55833 0.924838 7.325 1.15817L4.40833 4.07484C4.29167 4.1915 4.175 4.24984 4 4.24984Z' fill='%2378829D'/%3e%3c/svg%3e\")}.grid-asc>.grid-sort-icon:before{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M1.08333 4.83333C0.908333 4.83333 0.791667 4.775 0.675 4.65833C0.441667 4.425 0.441667 4.075 0.675 3.84167L3.59167 0.925C3.825 0.691667 4.175 0.691667 4.40833 0.925L7.325 3.84167C7.55833 4.075 7.55833 4.425 7.325 4.65833C7.09167 4.89167 6.74167 4.89167 6.50833 4.65833L4 2.15L1.49167 4.65833C1.375 4.775 1.25833 4.83333 1.08333 4.83333Z' fill='%234B5675'/%3e%3c/svg%3e\")}.grid-asc>.grid-sort-icon:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M4 4.24984C3.825 4.24984 3.70833 4.1915 3.59167 4.07484L0.675 1.15817C0.441667 0.924838 0.441667 0.574837 0.675 0.341504C0.908333 0.108171 1.25833 0.108171 1.49167 0.341504L4 2.84984L6.50833 0.341504C6.74167 0.108171 7.09167 0.108171 7.325 0.341504C7.55833 0.574837 7.55833 0.924838 7.325 1.15817L4.40833 4.07484C4.29167 4.1915 4.175 4.24984 4 4.24984Z' fill='%23C4CADA'/%3e%3c/svg%3e\")}.grid-desc>.grid-sort-icon:before{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M1.08333 4.83333C0.908333 4.83333 0.791667 4.775 0.675 4.65833C0.441667 4.425 0.441667 4.075 0.675 3.84167L3.59167 0.925C3.825 0.691667 4.175 0.691667 4.40833 0.925L7.325 3.84167C7.55833 4.075 7.55833 4.425 7.325 4.65833C7.09167 4.89167 6.74167 4.89167 6.50833 4.65833L4 2.15L1.49167 4.65833C1.375 4.775 1.25833 4.83333 1.08333 4.83333Z' fill='%23C4CADA'/%3e%3c/svg%3e\")}.grid-desc>.grid-sort-icon:after{background-image:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5' viewBox='0 0 8 5' fill='none'%3e%3cpath d='M4 4.24984C3.825 4.24984 3.70833 4.1915 3.59167 4.07484L0.675 1.15817C0.441667 0.924838 0.441667 0.574837 0.675 0.341504C0.908333 0.108171 1.25833 0.108171 1.49167 0.341504L4 2.84984L6.50833 0.341504C6.74167 0.108171 7.09167 0.108171 7.325 0.341504C7.55833 0.574837 7.55833 0.924838 7.325 1.15817L4.40833 4.07484C4.29167 4.1915 4.175 4.24984 4 4.24984Z' fill='%234B5675'/%3e%3c/svg%3e\")}.cdk-drag-preview{display:table;width:100%;background:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-placeholder{opacity:.4;background-color:#f3f4f6}.cdk-drag-animating,.cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}\n"] }]
|
|
3010
3264
|
}], propDecorators: { draggable: [{
|
|
3011
3265
|
type: Input
|
|
3012
3266
|
}], columns: [{
|
|
@@ -5264,260 +5518,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
5264
5518
|
}]
|
|
5265
5519
|
}] });
|
|
5266
5520
|
|
|
5267
|
-
class BKTooltipDirective {
|
|
5268
|
-
el;
|
|
5269
|
-
renderer;
|
|
5270
|
-
tooltipContent = '';
|
|
5271
|
-
tooltipPosition = 'right';
|
|
5272
|
-
tooltipElement = null;
|
|
5273
|
-
constructor(el, renderer) {
|
|
5274
|
-
this.el = el;
|
|
5275
|
-
this.renderer = renderer;
|
|
5276
|
-
}
|
|
5277
|
-
ngOnInit() {
|
|
5278
|
-
this.createTooltip();
|
|
5279
|
-
}
|
|
5280
|
-
ngOnChanges(changes) {
|
|
5281
|
-
if (changes['tooltipContent'] && !changes['tooltipContent'].firstChange) {
|
|
5282
|
-
this.updateTooltipContent();
|
|
5283
|
-
}
|
|
5284
|
-
}
|
|
5285
|
-
ngOnDestroy() {
|
|
5286
|
-
this.removeTooltip();
|
|
5287
|
-
}
|
|
5288
|
-
updateTooltipContent() {
|
|
5289
|
-
// If tooltip doesn't exist yet and content is now available, create it
|
|
5290
|
-
if (!this.tooltipElement && !this.isTooltipContentEmpty()) {
|
|
5291
|
-
this.createTooltip();
|
|
5292
|
-
return;
|
|
5293
|
-
}
|
|
5294
|
-
if (!this.tooltipElement)
|
|
5295
|
-
return;
|
|
5296
|
-
if (this.isTooltipContentEmpty())
|
|
5297
|
-
return;
|
|
5298
|
-
// remove old .text nodes
|
|
5299
|
-
Array.from(this.tooltipElement.querySelectorAll('.text')).forEach((el) => this.renderer.removeChild(this.tooltipElement, el));
|
|
5300
|
-
this.appendContent();
|
|
5301
|
-
}
|
|
5302
|
-
appendContent() {
|
|
5303
|
-
if (!this.tooltipElement)
|
|
5304
|
-
return;
|
|
5305
|
-
const contentLines = Array.isArray(this.tooltipContent)
|
|
5306
|
-
? this.tooltipContent
|
|
5307
|
-
: [this.tooltipContent];
|
|
5308
|
-
contentLines.forEach((line) => {
|
|
5309
|
-
const div = this.renderer.createElement('div');
|
|
5310
|
-
this.renderer.addClass(div, 'text');
|
|
5311
|
-
if (line?.trim().startsWith('<')) {
|
|
5312
|
-
div.innerHTML = line;
|
|
5313
|
-
}
|
|
5314
|
-
else {
|
|
5315
|
-
const text = this.renderer.createText(line ?? '');
|
|
5316
|
-
this.renderer.appendChild(div, text);
|
|
5317
|
-
}
|
|
5318
|
-
this.renderer.appendChild(this.tooltipElement, div);
|
|
5319
|
-
});
|
|
5320
|
-
}
|
|
5321
|
-
onMouseEnter() {
|
|
5322
|
-
if (this.tooltipElement) {
|
|
5323
|
-
this.setTooltipPosition();
|
|
5324
|
-
this.setStyle(this.tooltipElement, {
|
|
5325
|
-
visibility: 'visible',
|
|
5326
|
-
opacity: '1',
|
|
5327
|
-
});
|
|
5328
|
-
this.renderer.setStyle(document.body, 'overflow-x', 'hidden'); // ✅ temporarily lock horizontal scroll
|
|
5329
|
-
}
|
|
5330
|
-
}
|
|
5331
|
-
onMouseLeave() {
|
|
5332
|
-
if (this.tooltipElement) {
|
|
5333
|
-
this.setStyle(this.tooltipElement, {
|
|
5334
|
-
visibility: 'hidden',
|
|
5335
|
-
opacity: '0',
|
|
5336
|
-
});
|
|
5337
|
-
this.renderer.removeStyle(document.body, 'overflow-x'); // ✅ restore scroll when tooltip hides
|
|
5338
|
-
}
|
|
5339
|
-
}
|
|
5340
|
-
onWindowChange() {
|
|
5341
|
-
if (this.tooltipElement?.style.visibility === 'visible') {
|
|
5342
|
-
this.setTooltipPosition();
|
|
5343
|
-
}
|
|
5344
|
-
}
|
|
5345
|
-
isTooltipContentEmpty() {
|
|
5346
|
-
if (typeof this.tooltipContent === 'string') {
|
|
5347
|
-
return !this.tooltipContent.trim();
|
|
5348
|
-
}
|
|
5349
|
-
else if (Array.isArray(this.tooltipContent)) {
|
|
5350
|
-
return this.tooltipContent.length === 0 || this.tooltipContent.every(line => !line.trim());
|
|
5351
|
-
}
|
|
5352
|
-
return true;
|
|
5353
|
-
}
|
|
5354
|
-
createTooltip() {
|
|
5355
|
-
if (this.isTooltipContentEmpty())
|
|
5356
|
-
return;
|
|
5357
|
-
this.tooltipElement = this.renderer.createElement('div');
|
|
5358
|
-
this.renderer.addClass(this.tooltipElement, 'bk-tooltip-content');
|
|
5359
|
-
// Add content
|
|
5360
|
-
const contentLines = Array.isArray(this.tooltipContent) ? this.tooltipContent : [this.tooltipContent];
|
|
5361
|
-
contentLines.forEach((line) => {
|
|
5362
|
-
const div = this.renderer.createElement('div');
|
|
5363
|
-
this.renderer.addClass(div, 'text');
|
|
5364
|
-
// this.renderer.appendChild(div, this.renderer.createText(line));
|
|
5365
|
-
// Check if the line contains HTML
|
|
5366
|
-
if (line.trim().startsWith('<')) {
|
|
5367
|
-
div.innerHTML = line;
|
|
5368
|
-
}
|
|
5369
|
-
else {
|
|
5370
|
-
const text = this.renderer.createText(line);
|
|
5371
|
-
this.renderer.appendChild(div, text);
|
|
5372
|
-
}
|
|
5373
|
-
this.renderer.appendChild(this.tooltipElement, div);
|
|
5374
|
-
});
|
|
5375
|
-
// Add triangle
|
|
5376
|
-
const triangle = this.renderer.createElement('div');
|
|
5377
|
-
this.renderer.addClass(triangle, 'bk-tooltip-triangle');
|
|
5378
|
-
this.renderer.appendChild(this.tooltipElement, triangle);
|
|
5379
|
-
// Set base styles
|
|
5380
|
-
this.setStyle(this.tooltipElement, {
|
|
5381
|
-
position: 'fixed',
|
|
5382
|
-
visibility: 'hidden',
|
|
5383
|
-
opacity: '0',
|
|
5384
|
-
zIndex: '9999',
|
|
5385
|
-
transition: 'opacity 0.3s ease, visibility 0.3s ease',
|
|
5386
|
-
});
|
|
5387
|
-
this.renderer.appendChild(document.body, this.tooltipElement);
|
|
5388
|
-
}
|
|
5389
|
-
setTooltipPosition() {
|
|
5390
|
-
if (!this.tooltipElement)
|
|
5391
|
-
return;
|
|
5392
|
-
const hostRect = this.el.nativeElement.getBoundingClientRect();
|
|
5393
|
-
const tooltipRect = this.tooltipElement.getBoundingClientRect();
|
|
5394
|
-
const scrollTop = window.scrollY || document.documentElement.scrollTop;
|
|
5395
|
-
const scrollLeft = window.scrollX || document.documentElement.scrollLeft;
|
|
5396
|
-
const triangle = this.tooltipElement.querySelector('.bk-tooltip-triangle');
|
|
5397
|
-
const padding = 10;
|
|
5398
|
-
let top = 0, left = 0;
|
|
5399
|
-
// Position logic
|
|
5400
|
-
switch (this.tooltipPosition) {
|
|
5401
|
-
case 'right':
|
|
5402
|
-
case 'left':
|
|
5403
|
-
top = hostRect.top + scrollTop + hostRect.height / 2;
|
|
5404
|
-
left = this.tooltipPosition === 'right'
|
|
5405
|
-
? hostRect.right + scrollLeft + padding
|
|
5406
|
-
: hostRect.left + scrollLeft - tooltipRect.width - padding;
|
|
5407
|
-
// Auto flip if out of viewport
|
|
5408
|
-
if (this.tooltipPosition === 'right' && left + tooltipRect.width > window.innerWidth) {
|
|
5409
|
-
left = hostRect.left + scrollLeft - tooltipRect.width - padding;
|
|
5410
|
-
}
|
|
5411
|
-
else if (this.tooltipPosition === 'left' && left < 0) {
|
|
5412
|
-
left = hostRect.right + scrollLeft + padding;
|
|
5413
|
-
}
|
|
5414
|
-
this.setStyle(this.tooltipElement, {
|
|
5415
|
-
transform: 'translateY(-50%)',
|
|
5416
|
-
});
|
|
5417
|
-
this.setTriangleStyles(triangle, this.tooltipPosition, left < hostRect.left + scrollLeft);
|
|
5418
|
-
break;
|
|
5419
|
-
case 'top':
|
|
5420
|
-
case 'bottom':
|
|
5421
|
-
left = hostRect.left + scrollLeft + hostRect.width / 2 - tooltipRect.width / 2;
|
|
5422
|
-
top = this.tooltipPosition === 'top'
|
|
5423
|
-
? hostRect.top + scrollTop - tooltipRect.height - padding
|
|
5424
|
-
: hostRect.bottom + scrollTop + padding;
|
|
5425
|
-
// Prevent overflow
|
|
5426
|
-
left = Math.max(10, Math.min(left, window.innerWidth - tooltipRect.width - 10));
|
|
5427
|
-
this.setStyle(this.tooltipElement, {
|
|
5428
|
-
transform: 'translateX(0)',
|
|
5429
|
-
});
|
|
5430
|
-
this.setTriangleStyles(triangle, this.tooltipPosition);
|
|
5431
|
-
break;
|
|
5432
|
-
}
|
|
5433
|
-
this.setStyle(this.tooltipElement, {
|
|
5434
|
-
top: `${top}px`,
|
|
5435
|
-
left: `${left}px`,
|
|
5436
|
-
});
|
|
5437
|
-
}
|
|
5438
|
-
setTriangleStyles(triangle, position, flipped = false) {
|
|
5439
|
-
if (!triangle)
|
|
5440
|
-
return;
|
|
5441
|
-
const base = {
|
|
5442
|
-
top: '',
|
|
5443
|
-
left: '',
|
|
5444
|
-
right: '',
|
|
5445
|
-
bottom: '',
|
|
5446
|
-
transform: '',
|
|
5447
|
-
borderColor: '',
|
|
5448
|
-
};
|
|
5449
|
-
let styles = { ...base };
|
|
5450
|
-
switch (position) {
|
|
5451
|
-
case 'right':
|
|
5452
|
-
styles = flipped
|
|
5453
|
-
? { left: '100%', top: '50%', transform: 'translateY(-50%) translateX(0)', borderColor: 'transparent transparent transparent #1a1a1a' }
|
|
5454
|
-
: { left: '-15px', top: '50%', transform: 'translateY(-50%)', borderColor: 'transparent #1a1a1a transparent transparent' };
|
|
5455
|
-
break;
|
|
5456
|
-
case 'left':
|
|
5457
|
-
styles = flipped
|
|
5458
|
-
? { left: '100%', top: '50%', transform: 'translateY(-50%) translateX(0)', borderColor: 'transparent transparent transparent #1a1a1a' }
|
|
5459
|
-
: { left: '-15px', top: '50%', transform: 'translateY(-50%)', borderColor: 'transparent #1a1a1a transparent transparent' };
|
|
5460
|
-
break;
|
|
5461
|
-
case 'top':
|
|
5462
|
-
styles = {
|
|
5463
|
-
bottom: '-15px',
|
|
5464
|
-
left: '50%',
|
|
5465
|
-
transform: 'translateX(-50%)',
|
|
5466
|
-
borderColor: '#1a1a1a transparent transparent transparent',
|
|
5467
|
-
};
|
|
5468
|
-
break;
|
|
5469
|
-
case 'bottom':
|
|
5470
|
-
styles = {
|
|
5471
|
-
top: '-15px',
|
|
5472
|
-
left: '50%',
|
|
5473
|
-
transform: 'translateX(-50%)',
|
|
5474
|
-
borderColor: 'transparent transparent #1a1a1a transparent',
|
|
5475
|
-
};
|
|
5476
|
-
break;
|
|
5477
|
-
}
|
|
5478
|
-
this.setStyle(triangle, styles);
|
|
5479
|
-
}
|
|
5480
|
-
removeTooltip() {
|
|
5481
|
-
if (this.tooltipElement) {
|
|
5482
|
-
this.renderer.removeChild(document.body, this.tooltipElement);
|
|
5483
|
-
this.tooltipElement = null;
|
|
5484
|
-
}
|
|
5485
|
-
}
|
|
5486
|
-
// Utility function to apply multiple styles
|
|
5487
|
-
setStyle(el, styles) {
|
|
5488
|
-
Object.entries(styles).forEach(([prop, value]) => {
|
|
5489
|
-
this.renderer.setStyle(el, prop, value);
|
|
5490
|
-
});
|
|
5491
|
-
}
|
|
5492
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BKTooltipDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
|
|
5493
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.16", type: BKTooltipDirective, isStandalone: true, selector: "[bkTooltip]", inputs: { tooltipContent: ["bkTooltip", "tooltipContent"], tooltipPosition: ["bkTooltipPosition", "tooltipPosition"] }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "window:scroll": "onWindowChange()", "window:resize": "onWindowChange()" } }, usesOnChanges: true, ngImport: i0 });
|
|
5494
|
-
}
|
|
5495
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: BKTooltipDirective, decorators: [{
|
|
5496
|
-
type: Directive,
|
|
5497
|
-
args: [{
|
|
5498
|
-
selector: '[bkTooltip]',
|
|
5499
|
-
standalone: true,
|
|
5500
|
-
}]
|
|
5501
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { tooltipContent: [{
|
|
5502
|
-
type: Input,
|
|
5503
|
-
args: ['bkTooltip']
|
|
5504
|
-
}], tooltipPosition: [{
|
|
5505
|
-
type: Input,
|
|
5506
|
-
args: ['bkTooltipPosition']
|
|
5507
|
-
}], onMouseEnter: [{
|
|
5508
|
-
type: HostListener,
|
|
5509
|
-
args: ['mouseenter']
|
|
5510
|
-
}], onMouseLeave: [{
|
|
5511
|
-
type: HostListener,
|
|
5512
|
-
args: ['mouseleave']
|
|
5513
|
-
}], onWindowChange: [{
|
|
5514
|
-
type: HostListener,
|
|
5515
|
-
args: ['window:scroll']
|
|
5516
|
-
}, {
|
|
5517
|
-
type: HostListener,
|
|
5518
|
-
args: ['window:resize']
|
|
5519
|
-
}] } });
|
|
5520
|
-
|
|
5521
5521
|
/*
|
|
5522
5522
|
* Public API Surface of brickclay-lib
|
|
5523
5523
|
*/
|