verben-ng-ui 1.4.7 → 1.5.2

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.
@@ -14,6 +14,8 @@ import { TooltipModule } from 'verben-ng-ui/src/lib/components/tooltip';
14
14
  import * as i7 from 'verben-ng-ui/src/lib/verbena-input';
15
15
  import { VerbenaInputModule } from 'verben-ng-ui/src/lib/verbena-input';
16
16
  import { computeColumnFooter } from 'verben-ng-ui/src/lib/components/data-table';
17
+ import * as i8 from 'verben-ng-ui/src/lib/verbena-button';
18
+ import { VerbenaButtonModule } from 'verben-ng-ui/src/lib/verbena-button';
17
19
 
18
20
  function isPrintableValue(value) {
19
21
  // Check for primitive types
@@ -520,6 +522,23 @@ class DataXportComponent {
520
522
  }
521
523
  }
522
524
  }
525
+ exportAllData() {
526
+ const selectedProfiles = this.profiles.filter((profile) => profile.selected);
527
+ const dataQueryFunction = this.dataQueryFunction();
528
+ if (selectedProfiles.length > 0) {
529
+ if (dataQueryFunction) {
530
+ // this.exportDataRangeEvent.emit({ skip: this.skip, limit: this.limit });
531
+ dataQueryFunction({ skip: 0, limit: 0 }).then((data) => {
532
+ if (data) {
533
+ this.exportService.exportData(data, selectedProfiles, this.useImportKey, this.includeFooterInExport);
534
+ }
535
+ });
536
+ }
537
+ else {
538
+ this.exportService.exportData(this.data, selectedProfiles, this.useImportKey, this.includeFooterInExport);
539
+ }
540
+ }
541
+ }
523
542
  isAnyProfileSelected() {
524
543
  return this.profiles.some((profile) => profile.selected);
525
544
  }
@@ -562,11 +581,11 @@ class DataXportComponent {
562
581
  : column.header;
563
582
  }
564
583
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataXportComponent, deps: [{ token: DataXportService }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
565
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.10", type: DataXportComponent, selector: "lib-data-xport", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: false, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: false, isRequired: false, transformFunction: null }, useImportKey: { classPropertyName: "useImportKey", publicName: "useImportKey", isSignal: false, isRequired: false, transformFunction: null }, includeFooterInExport: { classPropertyName: "includeFooterInExport", publicName: "includeFooterInExport", isSignal: false, isRequired: false, transformFunction: null }, dataFetchUrl: { classPropertyName: "dataFetchUrl", publicName: "dataFetchUrl", isSignal: true, isRequired: false, transformFunction: null }, dataQueryParameters: { classPropertyName: "dataQueryParameters", publicName: "dataQueryParameters", isSignal: true, isRequired: false, transformFunction: null }, dataQueryFunction: { classPropertyName: "dataQueryFunction", publicName: "dataQueryFunction", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { exportDataEvent: "exportDataEvent", exportDataRangeEvent: "exportDataRangeEvent" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n\n <div class=\"operation-grid\">\n <!-- First Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n fontSize=\"11px\"\n placeholder=\"Select field\"\n [options]=\"columnOptions\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n\n <!-- Operator/Join Selection -->\n <ng-container *ngIf=\"newOperation.type === 'arithmetic'\">\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"arithmeticOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"newOperation.operator\"\n fontSize=\"11px\"\n >\n </verben-drop-down>\n </ng-container>\n <ng-container *ngIf=\"newOperation.type === 'string'\">\n <verbena-input\n placeholder=\"Join by\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"newOperation.joinBy\"\n ></verbena-input>\n </ng-container>\n\n <!-- Second Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Record Size</h3>\n </div>\n\n <div class=\"flex gap-4 items-center\">\n <verbena-input\n placeholder=\"Skip\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"skip\"\n ></verbena-input>\n\n <span>-</span>\n\n <verbena-input\n placeholder=\"Limit\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"limit\"\n ></verbena-input>\n </div>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button\n class=\"export-button\"\n [disabled]=\"!isAnyProfileSelected()\"\n (click)=\"exportData()\"\n >\n Export\n </button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}.export-button:disabled{background-color:var(--vbn-color-surface-alt);color:var(--vbn-color-text-muted);cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i5.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio", "heading", "subheading", "variant", "interactive", "selected", "tag", "tagTone", "tagBgColor", "tagTextColor", "actions", "cornerPosition", "actionsOnHover", "collapsed"], outputs: ["collapsedChange", "action"] }, { kind: "directive", type: i5.CardSlotDirective, selector: "[card-header], [card-media], [card-actions]" }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "autoScrollToCurrentItem", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i7.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }] });
584
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.10", type: DataXportComponent, selector: "lib-data-xport", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: false, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: false, isRequired: false, transformFunction: null }, useImportKey: { classPropertyName: "useImportKey", publicName: "useImportKey", isSignal: false, isRequired: false, transformFunction: null }, includeFooterInExport: { classPropertyName: "includeFooterInExport", publicName: "includeFooterInExport", isSignal: false, isRequired: false, transformFunction: null }, dataFetchUrl: { classPropertyName: "dataFetchUrl", publicName: "dataFetchUrl", isSignal: true, isRequired: false, transformFunction: null }, dataQueryParameters: { classPropertyName: "dataQueryParameters", publicName: "dataQueryParameters", isSignal: true, isRequired: false, transformFunction: null }, dataQueryFunction: { classPropertyName: "dataQueryFunction", publicName: "dataQueryFunction", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { exportDataEvent: "exportDataEvent", exportDataRangeEvent: "exportDataRangeEvent" }, usesOnChanges: true, ngImport: i0, template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n\n <div class=\"operation-grid\">\n <!-- First Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n fontSize=\"11px\"\n placeholder=\"Select field\"\n [options]=\"columnOptions\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n\n <!-- Operator/Join Selection -->\n <ng-container *ngIf=\"newOperation.type === 'arithmetic'\">\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"arithmeticOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"newOperation.operator\"\n fontSize=\"11px\"\n >\n </verben-drop-down>\n </ng-container>\n <ng-container *ngIf=\"newOperation.type === 'string'\">\n <verbena-input\n placeholder=\"Join by\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"newOperation.joinBy\"\n ></verbena-input>\n </ng-container>\n\n <!-- Second Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Record Size</h3>\n </div>\n\n <div class=\"flex gap-4 items-center\">\n <verbena-input\n placeholder=\"Skip\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"skip\"\n ></verbena-input>\n\n <span>-</span>\n\n <verbena-input\n placeholder=\"Limit\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"limit\"\n ></verbena-input>\n </div>\n </section>\n </div>\n <div card-footer class=\"card-footer flex gap-2\">\n <verbena-button\n (click)=\"exportData()\"\n styleType=\"secondary\"\n text=\"Export\"\n [disable]=\"!isAnyProfileSelected()\"\n ></verbena-button>\n <verbena-button\n (click)=\"exportAllData()\"\n styleType=\"secondary\"\n text=\"Export All\"\n [disable]=\"!isAnyProfileSelected()\"\n ></verbena-button>\n <!-- <button\n class=\"export-button\"\n [disabled]=\"!isAnyProfileSelected()\"\n (click)=\"exportData()\"\n >\n Export\n </button>\n <button\n class=\"export-button\"\n [disabled]=\"!isAnyProfileSelected()\"\n (click)=\"exportAllData()\"\n >\n Export All\n </button> -->\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}.export-button:disabled{background-color:var(--vbn-color-surface-alt);color:var(--vbn-color-text-muted);cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i4.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i5.CardComponent, selector: "verben-card", inputs: ["pd", "mg", "height", "width", "textColor", "bgColor", "border", "borderRadius", "disabled", "aspectRatio", "heading", "subheading", "variant", "interactive", "selected", "tag", "tagTone", "tagBgColor", "tagTextColor", "actions", "cornerPosition", "actionsOnHover", "collapsed"], outputs: ["collapsedChange", "action"] }, { kind: "directive", type: i5.CardSlotDirective, selector: "[card-header], [card-media], [card-actions]" }, { kind: "component", type: i6.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "overlayWidth", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "refPageSize", "disabled", "required", "autoScrollToCurrentItem", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i7.VerbenaInputComponent, selector: "verbena-input", inputs: ["disabled", "label", "placeHolder", "required", "svgPosition", "minLength", "maxLength", "type", "bgColor", "border", "borderRadius", "textColor", "value", "labelPosition", "labelColor", "disable", "readOnly", "min", "max", "showBorder", "showErrorMessage", "errorMessageColor", "errorBorderColor", "errorPosition", "svg", "fontSize", "svgWidth", "svgHeight", "svgColor", "capitalization", "inputContainerClass", "inputFieldClass", "passLength", "inputWrapperClass", "passwordToggle", "customErrorMessages", "icon", "textPass"], outputs: ["valueChange"] }, { kind: "component", type: i8.VerbenaButtonComponent, selector: "verbena-button", inputs: ["type", "text", "styleType", "size", "block", "disable", "disabled", "isLoading", "spinnerSize", "spinnerColor", "svg", "svgPosition", "svgWidth", "svgHeight", "svgSize", "svgColor", "icon", "useIcon", "iconPosition", "iconColor", "variant", "weight", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "buttonClass", "buttonTextClass"] }] });
566
585
  }
567
586
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataXportComponent, decorators: [{
568
587
  type: Component,
569
- args: [{ selector: 'lib-data-xport', template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n\n <div class=\"operation-grid\">\n <!-- First Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n fontSize=\"11px\"\n placeholder=\"Select field\"\n [options]=\"columnOptions\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n\n <!-- Operator/Join Selection -->\n <ng-container *ngIf=\"newOperation.type === 'arithmetic'\">\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"arithmeticOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"newOperation.operator\"\n fontSize=\"11px\"\n >\n </verben-drop-down>\n </ng-container>\n <ng-container *ngIf=\"newOperation.type === 'string'\">\n <verbena-input\n placeholder=\"Join by\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"newOperation.joinBy\"\n ></verbena-input>\n </ng-container>\n\n <!-- Second Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Record Size</h3>\n </div>\n\n <div class=\"flex gap-4 items-center\">\n <verbena-input\n placeholder=\"Skip\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"skip\"\n ></verbena-input>\n\n <span>-</span>\n\n <verbena-input\n placeholder=\"Limit\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"limit\"\n ></verbena-input>\n </div>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button\n class=\"export-button\"\n [disabled]=\"!isAnyProfileSelected()\"\n (click)=\"exportData()\"\n >\n Export\n </button>\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}.export-button:disabled{background-color:var(--vbn-color-surface-alt);color:var(--vbn-color-text-muted);cursor:not-allowed}\n"] }]
588
+ args: [{ selector: 'lib-data-xport', template: "<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n\n <div class=\"operation-grid\">\n <!-- First Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n fontSize=\"11px\"\n placeholder=\"Select field\"\n [options]=\"columnOptions\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n\n <!-- Operator/Join Selection -->\n <ng-container *ngIf=\"newOperation.type === 'arithmetic'\">\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"arithmeticOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"newOperation.operator\"\n fontSize=\"11px\"\n >\n </verben-drop-down>\n </ng-container>\n <ng-container *ngIf=\"newOperation.type === 'string'\">\n <verbena-input\n placeholder=\"Join by\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"newOperation.joinBy\"\n ></verbena-input>\n </ng-container>\n\n <!-- Second Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Record Size</h3>\n </div>\n\n <div class=\"flex gap-4 items-center\">\n <verbena-input\n placeholder=\"Skip\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"skip\"\n ></verbena-input>\n\n <span>-</span>\n\n <verbena-input\n placeholder=\"Limit\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"limit\"\n ></verbena-input>\n </div>\n </section>\n </div>\n <div card-footer class=\"card-footer flex gap-2\">\n <verbena-button\n (click)=\"exportData()\"\n styleType=\"secondary\"\n text=\"Export\"\n [disable]=\"!isAnyProfileSelected()\"\n ></verbena-button>\n <verbena-button\n (click)=\"exportAllData()\"\n styleType=\"secondary\"\n text=\"Export All\"\n [disable]=\"!isAnyProfileSelected()\"\n ></verbena-button>\n <!-- <button\n class=\"export-button\"\n [disabled]=\"!isAnyProfileSelected()\"\n (click)=\"exportData()\"\n >\n Export\n </button>\n <button\n class=\"export-button\"\n [disabled]=\"!isAnyProfileSelected()\"\n (click)=\"exportAllData()\"\n >\n Export All\n </button> -->\n </div>\n</verben-card>\n", styles: [".export-card{font-size:.75rem;z-index:10}.card-header{display:flex;justify-content:space-between;align-items:center;background-color:transparent;padding:4px!important}.header-title{font-weight:600;font-size:.8125rem}.card-body,.section{display:flex;flex-direction:column;gap:.5rem}.section-header{display:flex;justify-content:space-between;align-items:center}.section-title{font-size:.8125rem}.item{display:flex;justify-content:space-between;align-items:center}.item-label{display:flex;align-items:center;gap:.5rem}.checkbox-label{line-height:1}.item-actions{display:flex;gap:.5rem}.show-more{display:flex;gap:.5em;align-items:center;color:var(--vbn-color-text-muted);cursor:pointer}.divider{border:none;border-top:1px solid var(--vbn-color-border)}.operation-grid{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}.add-button{margin-top:.5rem;outline:none;border:none;background-color:transparent;color:var(--vbn-color-border-focus);font-size:.75rem;font-weight:500;cursor:pointer}.card-footer{display:flex;justify-content:flex-end;background-color:transparent}.export-button{margin-top:.5rem;outline:none;border:none;padding:.2rem 1.6rem;background-color:var(--vbn-color-primary);color:var(--vbn-color-on-primary);font-size:.75rem;font-weight:600;cursor:pointer}.export-button:disabled{background-color:var(--vbn-color-surface-alt);color:var(--vbn-color-text-muted);cursor:not-allowed}\n"] }]
570
589
  }], ctorParameters: () => [{ type: DataXportService }, { type: i2.FormBuilder }], propDecorators: { data: [{
571
590
  type: Input
572
591
  }], columns: [{
@@ -590,7 +609,8 @@ class DataXportModule {
590
609
  CardModule,
591
610
  DropDownModule,
592
611
  TooltipModule,
593
- VerbenaInputModule], exports: [DataXportComponent] });
612
+ VerbenaInputModule,
613
+ VerbenaButtonModule], exports: [DataXportComponent] });
594
614
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataXportModule, providers: [DataXportService], imports: [CommonModule,
595
615
  FormsModule,
596
616
  ReactiveFormsModule,
@@ -598,7 +618,8 @@ class DataXportModule {
598
618
  CardModule,
599
619
  DropDownModule,
600
620
  TooltipModule,
601
- VerbenaInputModule] });
621
+ VerbenaInputModule,
622
+ VerbenaButtonModule] });
602
623
  }
603
624
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataXportModule, decorators: [{
604
625
  type: NgModule,
@@ -613,6 +634,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImpo
613
634
  DropDownModule,
614
635
  TooltipModule,
615
636
  VerbenaInputModule,
637
+ VerbenaButtonModule,
616
638
  ],
617
639
  providers: [DataXportService],
618
640
  exports: [DataXportComponent],
@@ -1 +1 @@
1
- {"version":3,"file":"verben-ng-ui-src-lib-components-data-xport.mjs","sources":["../../../projects/verben-ng-ui/src/lib/components/data-xport/data-xport.utils.ts","../../../projects/verben-ng-ui/src/lib/components/data-xport/data-xport.service.ts","../../../projects/verben-ng-ui/src/lib/components/data-xport/data-xport.component.ts","../../../projects/verben-ng-ui/src/lib/components/data-xport/data-xport.component.html","../../../projects/verben-ng-ui/src/lib/components/data-xport/data-xport.module.ts","../../../projects/verben-ng-ui/src/lib/components/data-xport/verben-ng-ui-src-lib-components-data-xport.ts"],"sourcesContent":["export function isPrintableValue(value: unknown): boolean {\n // Check for primitive types\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true;\n }\n\n // Check for specific object types that are considered \"printable\"\n if (value instanceof Date) {\n return true;\n }\n\n // Exclude null and generic objects\n if (\n value === null ||\n (typeof value === 'object' && value.constructor === Object)\n ) {\n return false;\n }\n\n // You might add more specific checks here for other \"printable\" object types if needed.\n\n return false; // Default for other unhandled types\n}\n","import { Injectable } from '@angular/core';\nimport {\n ExportProfile,\n Operation,\n ExportItem,\n ExportItemType,\n ArithmeticOperation,\n StringOperation,\n} from './data-xport.types';\nimport {\n ColumnDefinition,\n computeColumnFooter,\n} from 'verben-ng-ui/src/lib/components/data-table';\nimport { isPrintableValue } from './data-xport.utils';\n\n@Injectable()\nexport class DataXportService<T> {\n private profiles: ExportProfile[] = [];\n private operations: Operation[] = [];\n private columns: ColumnDefinition<T>[] = [];\n\n constructor() {\n this.initializeDefaultProfile();\n }\n\n private initializeDefaultProfile() {\n this.profiles = [\n {\n id: 'default',\n name: 'All',\n items: [],\n },\n ];\n }\n\n setColumns(columns: ColumnDefinition<T>[]) {\n this.columns = columns;\n this.updateDefaultProfile();\n }\n\n getColumns(): ColumnDefinition<T>[] {\n return this.columns;\n }\n\n addProfile(profile: ExportProfile): void {\n this.profiles.push(profile);\n }\n\n getProfiles(): ExportProfile[] {\n return this.profiles;\n }\n\n updateProfile(id: string, updatedProfile: ExportProfile): void {\n const index = this.profiles.findIndex((p) => p.id === id);\n if (index !== -1) {\n this.profiles[index] = updatedProfile;\n }\n }\n\n removeProfile(id: string): void {\n this.profiles = this.profiles.filter((p) => p.id !== id);\n }\n\n addOperation(operation: Operation): void {\n this.operations.unshift(operation);\n this.updateDefaultProfile();\n }\n\n getOperations(): Operation[] {\n return this.operations;\n }\n\n updateOperation(id: string, updatedOperation: Operation): void {\n const index = this.operations.findIndex((o) => o.id === id);\n if (index !== -1) {\n this.operations[index] = updatedOperation;\n this.updateDefaultProfile();\n }\n }\n\n removeOperation(id: string): void {\n this.operations = this.operations.filter((o) => o.id !== id);\n this.updateDefaultProfile();\n // Remove operation from all profiles\n this.profiles.forEach((profile) => {\n profile.items = profile.items.filter((item) => item.id !== id);\n });\n }\n\n resetAll(): void {\n this.operations = [];\n this.columns = [];\n this.initializeDefaultProfile();\n }\n\n getAllItems(): ExportItem[] {\n return [\n ...this.operations.map((op) => ({\n id: op.id,\n name: op.name,\n exportKey: op.name,\n type: 'operation' as ExportItemType,\n })),\n ...this.columns.map((col) => ({\n id: col.id,\n name: col.header instanceof Function ? col.header({}) : col.header,\n exportKey: col.header instanceof Function ? col.header({}) : col.header,\n type: 'property' as ExportItemType,\n })),\n ];\n }\n\n exportData(\n data: T[],\n selectedProfiles: ExportProfile[],\n useImportKey: boolean = false,\n includeFooter: boolean = true\n ): Record<string, any>[] {\n const uniqueItems = new Set<ExportItem>();\n selectedProfiles.forEach((profile) => {\n profile.items.forEach((item) => uniqueItems.add(item));\n });\n\n // console.log('ITEMSSS', Array.from(uniqueItems));\n // console.log('DATAAA', Array.from(data));\n\n const records = data.map((item) => {\n const exportedItem: Record<string, any> = {};\n uniqueItems.forEach((exportItem) => {\n if (exportItem.type === 'property') {\n const column = this.columns.find((col) => col.id === exportItem.id);\n if (column) {\n // exportedItem[exportItem.name] = column.accessorFn\n // ? column.accessorFn(item)\n // : column.accessorKey\n // ? item[column.accessorKey]\n // : null;\n\n if (\n column.accessorKey &&\n isPrintableValue(item[column.accessorKey])\n ) {\n exportedItem[exportItem.name] = item[column.accessorKey];\n } else if (\n column.accessorFn &&\n isPrintableValue(column.accessorFn(item))\n ) {\n exportedItem[exportItem.name] = column.accessorFn(item);\n } else if (\n useImportKey &&\n column.importKey &&\n isPrintableValue(item[column.importKey])\n ) {\n exportedItem[exportItem.name] = item[column.importKey];\n } else {\n // Export null/undefined cells as empty rather than literal null.\n exportedItem[exportItem.name] = '';\n }\n }\n } else {\n const operation = this.operations.find((o) => o.id === exportItem.id);\n if (operation) {\n exportedItem[exportItem.name] = this.calculateOperation(\n item,\n operation\n );\n }\n }\n });\n return exportedItem;\n });\n\n if (includeFooter) {\n const footerRow = this.getFooterRow(data, uniqueItems);\n if (footerRow) {\n records.push(footerRow);\n }\n }\n\n this.downloadCSV(records);\n return records;\n }\n\n /**\n * Builds a single footer/summary row aligned with the exported columns. Each\n * exported item gets a key (blank by default) so the CSV stays column-aligned;\n * property columns that define a simple `footerFn` or a richer `footer` config\n * receive the computed value. A `footer` config can opt out via\n * `includeInExport: false`; `footerFn`-only columns are always included.\n * Returns `null` when no column contributes a footer.\n */\n getFooterRow(\n data: T[],\n items: Set<ExportItem> | ExportItem[]\n ): Record<string, any> | null {\n const uniqueItems = new Set<ExportItem>(items);\n\n const footerRow: Record<string, any> = {};\n let hasFooter = false;\n\n uniqueItems.forEach((item) => {\n footerRow[item.name] = '';\n\n if (item.type !== 'property') return;\n\n const column = this.columns.find((col) => col.id === item.id);\n if (!column || (!column.footer && !column.footerFn)) return;\n if (column.footer?.includeInExport === false) return;\n\n const value = computeColumnFooter(column, data);\n // Fall back to the label (or empty) so footer cells never carry null.\n footerRow[item.name] = value ?? column.footer?.label ?? '';\n hasFooter = true;\n });\n\n return hasFooter ? footerRow : null;\n }\n\n downloadCSV(data: Partial<any>[]) {\n const headers = Object.keys(data[0]);\n const csvContent = [\n headers.join(','),\n ...data.map((row) =>\n headers\n .map((header) => row[header])\n .map((datum) => `\"${datum}\"`)\n .join(',')\n ),\n ].join('\\n');\n\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n if (link.download !== undefined) {\n const url = URL.createObjectURL(blob);\n link.setAttribute('href', url);\n link.setAttribute('download', 'export.csv');\n link.style.visibility = 'hidden';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n }\n\n private calculateOperation(item: T, operation: Operation): number | string {\n const column1 = this.columns.find((col) => col.id === operation.field1);\n const column2 = this.columns.find((col) => col.id === operation.field2);\n\n if (!column1 || !column2) return '';\n\n const value1 = column1.accessorFn\n ? column1.accessorFn(item)\n : column1.accessorKey\n ? item[column1.accessorKey]\n : '';\n\n const value2 = column2.accessorFn\n ? column2.accessorFn(item)\n : column2.accessorKey\n ? item[column2.accessorKey]\n : '';\n\n if (operation.type === 'arithmetic') {\n const num1 = Number(value1);\n const num2 = Number(value2);\n\n switch (operation.operator) {\n case 'add':\n return num1 + num2;\n case 'subtract':\n return num1 - num2;\n case 'multiply':\n return num1 * num2;\n case 'divide':\n return num2 !== 0 ? num1 / num2 : NaN;\n }\n } else {\n return `${value1}${operation.joinBy}${value2}`;\n }\n }\n\n private updateDefaultProfile(): void {\n this.profiles[0].items = this.getAllItems();\n }\n}\n","import { Component, EventEmitter, input, Input, Output } from '@angular/core';\nimport {\n ArithmeticOperation,\n ExportItem,\n ExportProfile,\n Operation,\n StringOperation,\n} from './data-xport.types';\nimport { ColumnDefinition } from 'verben-ng-ui/src/lib/components/data-table';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { DataXportService } from './data-xport.service';\nimport { isPrintableValue } from './data-xport.utils';\nimport { SearchPropertyValue } from 'verben-ng-ui/src/lib/components/data-export';\n\n@Component({\n selector: 'lib-data-xport',\n templateUrl: './data-xport.component.html',\n styleUrl: './data-xport.component.css',\n})\nexport class DataXportComponent<T> {\n @Input() data!: T[];\n @Input() columns!: ColumnDefinition<T>[];\n /**\n * @deprecated will be removed in the near future\n */\n @Input() useImportKey: boolean = false;\n /** Append a footer/summary row (from each column's `footer`/`footerFn`) to the export. */\n @Input() includeFooterInExport: boolean = true;\n dataFetchUrl = input<string>();\n dataQueryParameters = input<SearchPropertyValue[]>();\n dataQueryFunction =\n input<(range: { skip: number; limit: number }) => Promise<T[]>>();\n @Output() exportDataEvent = new EventEmitter<Record<string, any>[]>();\n @Output() exportDataRangeEvent = new EventEmitter<{\n skip: number;\n limit: number;\n }>();\n\n profiles: (ExportProfile & { selected: boolean })[] = [];\n groupItems: (ExportItem & { selected: boolean })[] = [];\n newGroupForm: FormGroup;\n newOperation: Partial<Operation> = {\n id: '',\n name: '',\n field1: '',\n field2: '',\n type: 'arithmetic',\n } as ArithmeticOperation;\n\n numericColumns: ColumnDefinition<T>[] = [];\n stringColumns: ColumnDefinition<T>[] = [];\n isEditingOperation: boolean = false;\n showAllProfiles: boolean = false;\n showAllGroups: boolean = false;\n\n arithmeticOperators = [\n { value: 'add', label: '+' },\n { value: 'subtract', label: '-' },\n { value: 'multiply', label: '×' },\n { value: 'divide', label: '÷' },\n ];\n\n skip: null | number = null;\n limit: null | number = null;\n\n constructor(\n private exportService: DataXportService<T>,\n private fb: FormBuilder\n ) {\n this.newGroupForm = this.fb.group({\n name: ['', Validators.required],\n });\n }\n\n ngOnInit() {\n this.initializeColumns();\n this.updateProfiles();\n }\n\n ngOnChanges() {\n if (this.columns) {\n this.initializeColumns();\n }\n }\n\n get visibleProfiles() {\n return this.showAllProfiles ? this.profiles : this.profiles.slice(0, 3);\n }\n\n get visibleGroups() {\n return this.showAllGroups ? this.groupItems : this.groupItems.slice(0, 3);\n }\n\n initializeColumns() {\n const validColumns = this.columns.filter(\n (col) =>\n col.exportBy ||\n (col.canExport !== false && (col.accessorKey || col.accessorFn)) ||\n (this.useImportKey && col.importKey)\n );\n if (validColumns?.length) {\n this.exportService.setColumns(validColumns);\n this.updateColumnTypes();\n this.updateGroupItems();\n }\n }\n\n private updateColumnTypes() {\n if (this.data?.length && this.columns?.length) {\n const sampleData = this.data[0];\n\n this.numericColumns = this.columns.filter((col) => {\n /**\n * Remove the entire first part of the tenery on deprecation of this.useImportKey\n */\n let value;\n\n if (col.accessorKey && isPrintableValue(sampleData[col.accessorKey])) {\n value = sampleData[col.accessorKey];\n } else if (\n col.accessorFn &&\n isPrintableValue(col.accessorFn(sampleData))\n ) {\n value = col.accessorFn(sampleData);\n } else if (\n this.useImportKey &&\n col.importKey &&\n isPrintableValue(sampleData[col.importKey])\n ) {\n value = sampleData[col.importKey];\n }\n\n // this.useImportKey\n // ? col.accessorFn && typeof col.accessorFn(sampleData) === 'number'\n // ? col.accessorFn(sampleData)\n // : col.importKey\n // ? sampleData[col.importKey]\n // : null\n // : col.accessorFn\n // ? col.accessorFn(sampleData)\n // : col.accessorKey\n // ? sampleData[col.accessorKey]\n // : null;\n return typeof value === 'number';\n });\n\n this.stringColumns = this.columns.filter((col) => {\n /**\n * Remove the entire first part of the tenery on deprecation of this.useImportKey\n */\n let value;\n\n if (col.accessorKey && isPrintableValue(sampleData[col.accessorKey])) {\n value = sampleData[col.accessorKey];\n } else if (\n col.accessorFn &&\n isPrintableValue(col.accessorFn(sampleData))\n ) {\n value = col.accessorFn(sampleData);\n } else if (\n this.useImportKey &&\n col.importKey &&\n isPrintableValue(sampleData[col.importKey])\n ) {\n value = sampleData[col.importKey];\n }\n // const value = this.useImportKey\n // ? col.accessorFn && typeof col.accessorFn(sampleData) === 'string'\n // ? col.accessorFn(sampleData)\n // : col.importKey\n // ? sampleData[col.importKey]\n // : null\n // : col.accessorFn\n // ? col.accessorFn(sampleData)\n // : col.accessorKey\n // ? sampleData[col.accessorKey]\n // : null;\n return typeof value === 'string';\n });\n }\n }\n\n updateProfiles() {\n this.profiles = this.exportService.getProfiles().map((profile) => ({\n ...profile,\n selected: false,\n }));\n }\n\n updateGroupItems() {\n this.groupItems = this.exportService.getAllItems().map((item) => ({\n ...item,\n selected: false,\n }));\n }\n\n addGroup() {\n if (this.newGroupForm.valid) {\n const selectedItems = this.groupItems.filter((item) => item.selected);\n if (selectedItems.length > 0) {\n const newProfile: ExportProfile = {\n id: Date.now().toString(),\n name: this.newGroupForm.get('name')?.value,\n items: selectedItems,\n };\n this.exportService.addProfile(newProfile);\n this.updateProfiles();\n this.groupItems.forEach((item) => (item.selected = false));\n this.newGroupForm.reset();\n }\n }\n }\n\n editProfile(profile: ExportProfile & { selected: boolean }) {\n this.groupItems.forEach((item) => {\n item.selected = profile.items.some(\n (profileItem) => profileItem.id === item.id\n );\n });\n this.removeProfile(profile);\n }\n\n removeProfile(profile: ExportProfile & { selected: boolean }) {\n this.exportService.removeProfile(profile.id);\n this.updateProfiles();\n }\n\n addOrUpdateOperation() {\n if (\n this.newOperation.name &&\n this.newOperation.field1 &&\n this.newOperation.field2\n ) {\n const operation: Operation =\n this.newOperation.type === 'arithmetic'\n ? {\n id: this.isEditingOperation\n ? this.newOperation.id!\n : Date.now().toString(),\n name: this.newOperation.name,\n field1: this.newOperation.field1,\n field2: this.newOperation.field2,\n type: 'arithmetic',\n operator:\n (this.newOperation as ArithmeticOperation).operator || 'add',\n }\n : {\n id: this.isEditingOperation\n ? this.newOperation.id!\n : Date.now().toString(),\n name: this.newOperation.name,\n field1: this.newOperation.field1,\n field2: this.newOperation.field2,\n type: 'string',\n joinBy: (this.newOperation as StringOperation).joinBy || ' ',\n };\n\n if (this.isEditingOperation) {\n this.exportService.updateOperation(operation.id, operation);\n } else {\n this.exportService.addOperation(operation);\n }\n this.updateGroupItems();\n this.resetOperationForm();\n }\n }\n\n editOperation(operation: ExportItem & { selected: boolean }) {\n const foundOperation = this.exportService\n .getOperations()\n .find((op) => op.id === operation.id);\n if (foundOperation) {\n this.newOperation = { ...foundOperation };\n this.isEditingOperation = true;\n }\n }\n\n removeOperation(operation: ExportItem & { selected: boolean }) {\n this.exportService.removeOperation(operation.id);\n this.updateGroupItems();\n }\n\n resetOperationForm() {\n this.newOperation = {\n id: '',\n name: '',\n field1: '',\n field2: '',\n type: 'arithmetic',\n operator: 'add',\n } as ArithmeticOperation;\n this.isEditingOperation = false;\n }\n\n resetAll() {\n this.exportService.resetAll();\n this.initializeColumns();\n this.updateProfiles();\n this.resetOperationForm();\n this.newGroupForm.reset();\n }\n\n exportData() {\n const selectedProfiles = this.profiles.filter(\n (profile) => profile.selected\n );\n const dataQueryFunction = this.dataQueryFunction();\n\n if (selectedProfiles.length > 0) {\n if (this.skip !== null && this.limit !== null && dataQueryFunction) {\n // this.exportDataRangeEvent.emit({ skip: this.skip, limit: this.limit });\n dataQueryFunction({ skip: this.skip, limit: this.limit }).then(\n (data) => {\n if (data) {\n this.exportService.exportData(\n data,\n selectedProfiles,\n this.useImportKey,\n this.includeFooterInExport\n );\n }\n }\n );\n } else {\n this.exportService.exportData(\n this.data,\n selectedProfiles,\n this.useImportKey,\n this.includeFooterInExport\n );\n }\n }\n }\n\n isAnyProfileSelected(): boolean {\n return this.profiles.some((profile) => profile.selected);\n }\n\n onField1Change() {\n this.newOperation.field2 = '';\n const isNumeric = this.numericColumns.some(\n (col) => col.id === this.newOperation.field1\n );\n this.newOperation.type = isNumeric ? 'arithmetic' : 'string';\n if (isNumeric) {\n (this.newOperation as ArithmeticOperation).operator = 'add';\n } else {\n (this.newOperation as StringOperation).joinBy = ' ';\n }\n }\n\n private transformColumnToOption(column: ColumnDefinition<T>) {\n return {\n id: column.id,\n label:\n typeof column.header === 'function' ? column.header({}) : column.header,\n originalColumn: column,\n };\n }\n\n get columnOptions() {\n return [...this.numericColumns, ...this.stringColumns].map((col) =>\n this.transformColumnToOption(col)\n );\n }\n\n get availableFields2() {\n const columns =\n this.newOperation.type === 'arithmetic'\n ? this.numericColumns\n : this.stringColumns;\n return columns.map((col) => this.transformColumnToOption(col));\n }\n\n toggleShowAllProfiles() {\n this.showAllProfiles = !this.showAllProfiles;\n }\n\n toggleShowAllGroups() {\n this.showAllGroups = !this.showAllGroups;\n }\n\n getColumnHeader(column: ColumnDefinition<T>): string {\n return typeof column.header === 'function'\n ? column.header({})\n : column.header;\n }\n}\n","<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n\n <div class=\"operation-grid\">\n <!-- First Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n fontSize=\"11px\"\n placeholder=\"Select field\"\n [options]=\"columnOptions\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n\n <!-- Operator/Join Selection -->\n <ng-container *ngIf=\"newOperation.type === 'arithmetic'\">\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"arithmeticOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"newOperation.operator\"\n fontSize=\"11px\"\n >\n </verben-drop-down>\n </ng-container>\n <ng-container *ngIf=\"newOperation.type === 'string'\">\n <verbena-input\n placeholder=\"Join by\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"newOperation.joinBy\"\n ></verbena-input>\n </ng-container>\n\n <!-- Second Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Record Size</h3>\n </div>\n\n <div class=\"flex gap-4 items-center\">\n <verbena-input\n placeholder=\"Skip\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"skip\"\n ></verbena-input>\n\n <span>-</span>\n\n <verbena-input\n placeholder=\"Limit\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"limit\"\n ></verbena-input>\n </div>\n </section>\n </div>\n <div card-footer class=\"card-footer\">\n <button\n class=\"export-button\"\n [disabled]=\"!isAnyProfileSelected()\"\n (click)=\"exportData()\"\n >\n Export\n </button>\n </div>\n</verben-card>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { SvgModule } from 'verben-ng-ui/src/lib/components/svg';\nimport { CardModule } from 'verben-ng-ui/src/lib/components/card';\nimport { DropDownModule } from 'verben-ng-ui/src/lib/components/drop-down';\nimport { TooltipModule } from 'verben-ng-ui/src/lib/components/tooltip';\nimport { VerbenaInputModule } from 'verben-ng-ui/src/lib/verbena-input';\nimport { DataXportService } from './data-xport.service';\nimport { DataXportComponent } from './data-xport.component';\n\n@NgModule({\n declarations: [DataXportComponent],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n SvgModule,\n CardModule,\n DropDownModule,\n TooltipModule,\n VerbenaInputModule,\n ],\n providers: [DataXportService],\n exports: [DataXportComponent],\n})\nexport class DataXportModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.DataXportService"],"mappings":"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"}
1
+ {"version":3,"file":"verben-ng-ui-src-lib-components-data-xport.mjs","sources":["../../../projects/verben-ng-ui/src/lib/components/data-xport/data-xport.utils.ts","../../../projects/verben-ng-ui/src/lib/components/data-xport/data-xport.service.ts","../../../projects/verben-ng-ui/src/lib/components/data-xport/data-xport.component.ts","../../../projects/verben-ng-ui/src/lib/components/data-xport/data-xport.component.html","../../../projects/verben-ng-ui/src/lib/components/data-xport/data-xport.module.ts","../../../projects/verben-ng-ui/src/lib/components/data-xport/verben-ng-ui-src-lib-components-data-xport.ts"],"sourcesContent":["export function isPrintableValue(value: unknown): boolean {\n // Check for primitive types\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true;\n }\n\n // Check for specific object types that are considered \"printable\"\n if (value instanceof Date) {\n return true;\n }\n\n // Exclude null and generic objects\n if (\n value === null ||\n (typeof value === 'object' && value.constructor === Object)\n ) {\n return false;\n }\n\n // You might add more specific checks here for other \"printable\" object types if needed.\n\n return false; // Default for other unhandled types\n}\n","import { Injectable } from '@angular/core';\nimport {\n ExportProfile,\n Operation,\n ExportItem,\n ExportItemType,\n ArithmeticOperation,\n StringOperation,\n} from './data-xport.types';\nimport {\n ColumnDefinition,\n computeColumnFooter,\n} from 'verben-ng-ui/src/lib/components/data-table';\nimport { isPrintableValue } from './data-xport.utils';\n\n@Injectable()\nexport class DataXportService<T> {\n private profiles: ExportProfile[] = [];\n private operations: Operation[] = [];\n private columns: ColumnDefinition<T>[] = [];\n\n constructor() {\n this.initializeDefaultProfile();\n }\n\n private initializeDefaultProfile() {\n this.profiles = [\n {\n id: 'default',\n name: 'All',\n items: [],\n },\n ];\n }\n\n setColumns(columns: ColumnDefinition<T>[]) {\n this.columns = columns;\n this.updateDefaultProfile();\n }\n\n getColumns(): ColumnDefinition<T>[] {\n return this.columns;\n }\n\n addProfile(profile: ExportProfile): void {\n this.profiles.push(profile);\n }\n\n getProfiles(): ExportProfile[] {\n return this.profiles;\n }\n\n updateProfile(id: string, updatedProfile: ExportProfile): void {\n const index = this.profiles.findIndex((p) => p.id === id);\n if (index !== -1) {\n this.profiles[index] = updatedProfile;\n }\n }\n\n removeProfile(id: string): void {\n this.profiles = this.profiles.filter((p) => p.id !== id);\n }\n\n addOperation(operation: Operation): void {\n this.operations.unshift(operation);\n this.updateDefaultProfile();\n }\n\n getOperations(): Operation[] {\n return this.operations;\n }\n\n updateOperation(id: string, updatedOperation: Operation): void {\n const index = this.operations.findIndex((o) => o.id === id);\n if (index !== -1) {\n this.operations[index] = updatedOperation;\n this.updateDefaultProfile();\n }\n }\n\n removeOperation(id: string): void {\n this.operations = this.operations.filter((o) => o.id !== id);\n this.updateDefaultProfile();\n // Remove operation from all profiles\n this.profiles.forEach((profile) => {\n profile.items = profile.items.filter((item) => item.id !== id);\n });\n }\n\n resetAll(): void {\n this.operations = [];\n this.columns = [];\n this.initializeDefaultProfile();\n }\n\n getAllItems(): ExportItem[] {\n return [\n ...this.operations.map((op) => ({\n id: op.id,\n name: op.name,\n exportKey: op.name,\n type: 'operation' as ExportItemType,\n })),\n ...this.columns.map((col) => ({\n id: col.id,\n name: col.header instanceof Function ? col.header({}) : col.header,\n exportKey: col.header instanceof Function ? col.header({}) : col.header,\n type: 'property' as ExportItemType,\n })),\n ];\n }\n\n exportData(\n data: T[],\n selectedProfiles: ExportProfile[],\n useImportKey: boolean = false,\n includeFooter: boolean = true\n ): Record<string, any>[] {\n const uniqueItems = new Set<ExportItem>();\n selectedProfiles.forEach((profile) => {\n profile.items.forEach((item) => uniqueItems.add(item));\n });\n\n // console.log('ITEMSSS', Array.from(uniqueItems));\n // console.log('DATAAA', Array.from(data));\n\n const records = data.map((item) => {\n const exportedItem: Record<string, any> = {};\n uniqueItems.forEach((exportItem) => {\n if (exportItem.type === 'property') {\n const column = this.columns.find((col) => col.id === exportItem.id);\n if (column) {\n // exportedItem[exportItem.name] = column.accessorFn\n // ? column.accessorFn(item)\n // : column.accessorKey\n // ? item[column.accessorKey]\n // : null;\n\n if (\n column.accessorKey &&\n isPrintableValue(item[column.accessorKey])\n ) {\n exportedItem[exportItem.name] = item[column.accessorKey];\n } else if (\n column.accessorFn &&\n isPrintableValue(column.accessorFn(item))\n ) {\n exportedItem[exportItem.name] = column.accessorFn(item);\n } else if (\n useImportKey &&\n column.importKey &&\n isPrintableValue(item[column.importKey])\n ) {\n exportedItem[exportItem.name] = item[column.importKey];\n } else {\n // Export null/undefined cells as empty rather than literal null.\n exportedItem[exportItem.name] = '';\n }\n }\n } else {\n const operation = this.operations.find((o) => o.id === exportItem.id);\n if (operation) {\n exportedItem[exportItem.name] = this.calculateOperation(\n item,\n operation\n );\n }\n }\n });\n return exportedItem;\n });\n\n if (includeFooter) {\n const footerRow = this.getFooterRow(data, uniqueItems);\n if (footerRow) {\n records.push(footerRow);\n }\n }\n\n this.downloadCSV(records);\n return records;\n }\n\n /**\n * Builds a single footer/summary row aligned with the exported columns. Each\n * exported item gets a key (blank by default) so the CSV stays column-aligned;\n * property columns that define a simple `footerFn` or a richer `footer` config\n * receive the computed value. A `footer` config can opt out via\n * `includeInExport: false`; `footerFn`-only columns are always included.\n * Returns `null` when no column contributes a footer.\n */\n getFooterRow(\n data: T[],\n items: Set<ExportItem> | ExportItem[]\n ): Record<string, any> | null {\n const uniqueItems = new Set<ExportItem>(items);\n\n const footerRow: Record<string, any> = {};\n let hasFooter = false;\n\n uniqueItems.forEach((item) => {\n footerRow[item.name] = '';\n\n if (item.type !== 'property') return;\n\n const column = this.columns.find((col) => col.id === item.id);\n if (!column || (!column.footer && !column.footerFn)) return;\n if (column.footer?.includeInExport === false) return;\n\n const value = computeColumnFooter(column, data);\n // Fall back to the label (or empty) so footer cells never carry null.\n footerRow[item.name] = value ?? column.footer?.label ?? '';\n hasFooter = true;\n });\n\n return hasFooter ? footerRow : null;\n }\n\n downloadCSV(data: Partial<any>[]) {\n const headers = Object.keys(data[0]);\n const csvContent = [\n headers.join(','),\n ...data.map((row) =>\n headers\n .map((header) => row[header])\n .map((datum) => `\"${datum}\"`)\n .join(',')\n ),\n ].join('\\n');\n\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n if (link.download !== undefined) {\n const url = URL.createObjectURL(blob);\n link.setAttribute('href', url);\n link.setAttribute('download', 'export.csv');\n link.style.visibility = 'hidden';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n }\n\n private calculateOperation(item: T, operation: Operation): number | string {\n const column1 = this.columns.find((col) => col.id === operation.field1);\n const column2 = this.columns.find((col) => col.id === operation.field2);\n\n if (!column1 || !column2) return '';\n\n const value1 = column1.accessorFn\n ? column1.accessorFn(item)\n : column1.accessorKey\n ? item[column1.accessorKey]\n : '';\n\n const value2 = column2.accessorFn\n ? column2.accessorFn(item)\n : column2.accessorKey\n ? item[column2.accessorKey]\n : '';\n\n if (operation.type === 'arithmetic') {\n const num1 = Number(value1);\n const num2 = Number(value2);\n\n switch (operation.operator) {\n case 'add':\n return num1 + num2;\n case 'subtract':\n return num1 - num2;\n case 'multiply':\n return num1 * num2;\n case 'divide':\n return num2 !== 0 ? num1 / num2 : NaN;\n }\n } else {\n return `${value1}${operation.joinBy}${value2}`;\n }\n }\n\n private updateDefaultProfile(): void {\n this.profiles[0].items = this.getAllItems();\n }\n}\n","import { Component, EventEmitter, input, Input, Output } from '@angular/core';\nimport {\n ArithmeticOperation,\n ExportItem,\n ExportProfile,\n Operation,\n StringOperation,\n} from './data-xport.types';\nimport { ColumnDefinition } from 'verben-ng-ui/src/lib/components/data-table';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { DataXportService } from './data-xport.service';\nimport { isPrintableValue } from './data-xport.utils';\nimport { SearchPropertyValue } from 'verben-ng-ui/src/lib/components/data-export';\n\n@Component({\n selector: 'lib-data-xport',\n templateUrl: './data-xport.component.html',\n styleUrl: './data-xport.component.css',\n})\nexport class DataXportComponent<T> {\n @Input() data!: T[];\n @Input() columns!: ColumnDefinition<T>[];\n /**\n * @deprecated will be removed in the near future\n */\n @Input() useImportKey: boolean = false;\n /** Append a footer/summary row (from each column's `footer`/`footerFn`) to the export. */\n @Input() includeFooterInExport: boolean = true;\n dataFetchUrl = input<string>();\n dataQueryParameters = input<SearchPropertyValue[]>();\n dataQueryFunction =\n input<(range: { skip: number; limit: number }) => Promise<T[]>>();\n @Output() exportDataEvent = new EventEmitter<Record<string, any>[]>();\n @Output() exportDataRangeEvent = new EventEmitter<{\n skip: number;\n limit: number;\n }>();\n\n profiles: (ExportProfile & { selected: boolean })[] = [];\n groupItems: (ExportItem & { selected: boolean })[] = [];\n newGroupForm: FormGroup;\n newOperation: Partial<Operation> = {\n id: '',\n name: '',\n field1: '',\n field2: '',\n type: 'arithmetic',\n } as ArithmeticOperation;\n\n numericColumns: ColumnDefinition<T>[] = [];\n stringColumns: ColumnDefinition<T>[] = [];\n isEditingOperation: boolean = false;\n showAllProfiles: boolean = false;\n showAllGroups: boolean = false;\n\n arithmeticOperators = [\n { value: 'add', label: '+' },\n { value: 'subtract', label: '-' },\n { value: 'multiply', label: '×' },\n { value: 'divide', label: '÷' },\n ];\n\n skip: null | number = null;\n limit: null | number = null;\n\n constructor(\n private exportService: DataXportService<T>,\n private fb: FormBuilder,\n ) {\n this.newGroupForm = this.fb.group({\n name: ['', Validators.required],\n });\n }\n\n ngOnInit() {\n this.initializeColumns();\n this.updateProfiles();\n }\n\n ngOnChanges() {\n if (this.columns) {\n this.initializeColumns();\n }\n }\n\n get visibleProfiles() {\n return this.showAllProfiles ? this.profiles : this.profiles.slice(0, 3);\n }\n\n get visibleGroups() {\n return this.showAllGroups ? this.groupItems : this.groupItems.slice(0, 3);\n }\n\n initializeColumns() {\n const validColumns = this.columns.filter(\n (col) =>\n col.exportBy ||\n (col.canExport !== false && (col.accessorKey || col.accessorFn)) ||\n (this.useImportKey && col.importKey),\n );\n if (validColumns?.length) {\n this.exportService.setColumns(validColumns);\n this.updateColumnTypes();\n this.updateGroupItems();\n }\n }\n\n private updateColumnTypes() {\n if (this.data?.length && this.columns?.length) {\n const sampleData = this.data[0];\n\n this.numericColumns = this.columns.filter((col) => {\n /**\n * Remove the entire first part of the tenery on deprecation of this.useImportKey\n */\n let value;\n\n if (col.accessorKey && isPrintableValue(sampleData[col.accessorKey])) {\n value = sampleData[col.accessorKey];\n } else if (\n col.accessorFn &&\n isPrintableValue(col.accessorFn(sampleData))\n ) {\n value = col.accessorFn(sampleData);\n } else if (\n this.useImportKey &&\n col.importKey &&\n isPrintableValue(sampleData[col.importKey])\n ) {\n value = sampleData[col.importKey];\n }\n\n // this.useImportKey\n // ? col.accessorFn && typeof col.accessorFn(sampleData) === 'number'\n // ? col.accessorFn(sampleData)\n // : col.importKey\n // ? sampleData[col.importKey]\n // : null\n // : col.accessorFn\n // ? col.accessorFn(sampleData)\n // : col.accessorKey\n // ? sampleData[col.accessorKey]\n // : null;\n return typeof value === 'number';\n });\n\n this.stringColumns = this.columns.filter((col) => {\n /**\n * Remove the entire first part of the tenery on deprecation of this.useImportKey\n */\n let value;\n\n if (col.accessorKey && isPrintableValue(sampleData[col.accessorKey])) {\n value = sampleData[col.accessorKey];\n } else if (\n col.accessorFn &&\n isPrintableValue(col.accessorFn(sampleData))\n ) {\n value = col.accessorFn(sampleData);\n } else if (\n this.useImportKey &&\n col.importKey &&\n isPrintableValue(sampleData[col.importKey])\n ) {\n value = sampleData[col.importKey];\n }\n // const value = this.useImportKey\n // ? col.accessorFn && typeof col.accessorFn(sampleData) === 'string'\n // ? col.accessorFn(sampleData)\n // : col.importKey\n // ? sampleData[col.importKey]\n // : null\n // : col.accessorFn\n // ? col.accessorFn(sampleData)\n // : col.accessorKey\n // ? sampleData[col.accessorKey]\n // : null;\n return typeof value === 'string';\n });\n }\n }\n\n updateProfiles() {\n this.profiles = this.exportService.getProfiles().map((profile) => ({\n ...profile,\n selected: false,\n }));\n }\n\n updateGroupItems() {\n this.groupItems = this.exportService.getAllItems().map((item) => ({\n ...item,\n selected: false,\n }));\n }\n\n addGroup() {\n if (this.newGroupForm.valid) {\n const selectedItems = this.groupItems.filter((item) => item.selected);\n if (selectedItems.length > 0) {\n const newProfile: ExportProfile = {\n id: Date.now().toString(),\n name: this.newGroupForm.get('name')?.value,\n items: selectedItems,\n };\n this.exportService.addProfile(newProfile);\n this.updateProfiles();\n this.groupItems.forEach((item) => (item.selected = false));\n this.newGroupForm.reset();\n }\n }\n }\n\n editProfile(profile: ExportProfile & { selected: boolean }) {\n this.groupItems.forEach((item) => {\n item.selected = profile.items.some(\n (profileItem) => profileItem.id === item.id,\n );\n });\n this.removeProfile(profile);\n }\n\n removeProfile(profile: ExportProfile & { selected: boolean }) {\n this.exportService.removeProfile(profile.id);\n this.updateProfiles();\n }\n\n addOrUpdateOperation() {\n if (\n this.newOperation.name &&\n this.newOperation.field1 &&\n this.newOperation.field2\n ) {\n const operation: Operation =\n this.newOperation.type === 'arithmetic'\n ? {\n id: this.isEditingOperation\n ? this.newOperation.id!\n : Date.now().toString(),\n name: this.newOperation.name,\n field1: this.newOperation.field1,\n field2: this.newOperation.field2,\n type: 'arithmetic',\n operator:\n (this.newOperation as ArithmeticOperation).operator || 'add',\n }\n : {\n id: this.isEditingOperation\n ? this.newOperation.id!\n : Date.now().toString(),\n name: this.newOperation.name,\n field1: this.newOperation.field1,\n field2: this.newOperation.field2,\n type: 'string',\n joinBy: (this.newOperation as StringOperation).joinBy || ' ',\n };\n\n if (this.isEditingOperation) {\n this.exportService.updateOperation(operation.id, operation);\n } else {\n this.exportService.addOperation(operation);\n }\n this.updateGroupItems();\n this.resetOperationForm();\n }\n }\n\n editOperation(operation: ExportItem & { selected: boolean }) {\n const foundOperation = this.exportService\n .getOperations()\n .find((op) => op.id === operation.id);\n if (foundOperation) {\n this.newOperation = { ...foundOperation };\n this.isEditingOperation = true;\n }\n }\n\n removeOperation(operation: ExportItem & { selected: boolean }) {\n this.exportService.removeOperation(operation.id);\n this.updateGroupItems();\n }\n\n resetOperationForm() {\n this.newOperation = {\n id: '',\n name: '',\n field1: '',\n field2: '',\n type: 'arithmetic',\n operator: 'add',\n } as ArithmeticOperation;\n this.isEditingOperation = false;\n }\n\n resetAll() {\n this.exportService.resetAll();\n this.initializeColumns();\n this.updateProfiles();\n this.resetOperationForm();\n this.newGroupForm.reset();\n }\n\n exportData() {\n const selectedProfiles = this.profiles.filter(\n (profile) => profile.selected,\n );\n const dataQueryFunction = this.dataQueryFunction();\n\n if (selectedProfiles.length > 0) {\n if (this.skip !== null && this.limit !== null && dataQueryFunction) {\n // this.exportDataRangeEvent.emit({ skip: this.skip, limit: this.limit });\n dataQueryFunction({ skip: this.skip, limit: this.limit }).then(\n (data) => {\n if (data) {\n this.exportService.exportData(\n data,\n selectedProfiles,\n this.useImportKey,\n this.includeFooterInExport,\n );\n }\n },\n );\n } else {\n this.exportService.exportData(\n this.data,\n selectedProfiles,\n this.useImportKey,\n this.includeFooterInExport,\n );\n }\n }\n }\n\n exportAllData() {\n const selectedProfiles = this.profiles.filter(\n (profile) => profile.selected,\n );\n const dataQueryFunction = this.dataQueryFunction();\n\n if (selectedProfiles.length > 0) {\n if (dataQueryFunction) {\n // this.exportDataRangeEvent.emit({ skip: this.skip, limit: this.limit });\n dataQueryFunction({ skip: 0, limit: 0 }).then((data) => {\n if (data) {\n this.exportService.exportData(\n data,\n selectedProfiles,\n this.useImportKey,\n this.includeFooterInExport,\n );\n }\n });\n } else {\n this.exportService.exportData(\n this.data,\n selectedProfiles,\n this.useImportKey,\n this.includeFooterInExport,\n );\n }\n }\n }\n\n isAnyProfileSelected(): boolean {\n return this.profiles.some((profile) => profile.selected);\n }\n\n onField1Change() {\n this.newOperation.field2 = '';\n const isNumeric = this.numericColumns.some(\n (col) => col.id === this.newOperation.field1,\n );\n this.newOperation.type = isNumeric ? 'arithmetic' : 'string';\n if (isNumeric) {\n (this.newOperation as ArithmeticOperation).operator = 'add';\n } else {\n (this.newOperation as StringOperation).joinBy = ' ';\n }\n }\n\n private transformColumnToOption(column: ColumnDefinition<T>) {\n return {\n id: column.id,\n label:\n typeof column.header === 'function' ? column.header({}) : column.header,\n originalColumn: column,\n };\n }\n\n get columnOptions() {\n return [...this.numericColumns, ...this.stringColumns].map((col) =>\n this.transformColumnToOption(col),\n );\n }\n\n get availableFields2() {\n const columns =\n this.newOperation.type === 'arithmetic'\n ? this.numericColumns\n : this.stringColumns;\n return columns.map((col) => this.transformColumnToOption(col));\n }\n\n toggleShowAllProfiles() {\n this.showAllProfiles = !this.showAllProfiles;\n }\n\n toggleShowAllGroups() {\n this.showAllGroups = !this.showAllGroups;\n }\n\n getColumnHeader(column: ColumnDefinition<T>): string {\n return typeof column.header === 'function'\n ? column.header({})\n : column.header;\n }\n}\n","<verben-card\n width=\"24rem\"\n borderRadius=\"1rem\"\n [border]=\"'1px solid var(--vbn-color-primary)'\"\n bgColor=\"var(--vbn-color-surface)\"\n class=\"export-card\"\n>\n <div card-header class=\"card-header\">\n <h4 class=\"header-title\">Export</h4>\n <button\n class=\"reset-button\"\n [style.color]=\"'var(--vbn-color-border-focus)'\"\n [style.background-color]=\"'transparent'\"\n [style.border]=\"'none'\"\n [style.cursor]=\"'pointer'\"\n [style.font-size]=\"'12px'\"\n (click)=\"resetAll()\"\n >\n Reset\n </button>\n </div>\n <div card-body class=\"card-body\">\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Profiles</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <div *ngFor=\"let profile of visibleProfiles; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'profile-' + i\"\n [(ngModel)]=\"profile.selected\"\n />\n <label [for]=\"'profile-' + i\" class=\"checkbox-label\">\n {{ profile.name }}\n </label>\n </div>\n <div class=\"item-actions\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editProfile(profile)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeProfile(profile)\"\n ></verben-svg>\n </div>\n </div>\n <div\n *ngIf=\"profiles.length > 3\"\n (click)=\"toggleShowAllProfiles()\"\n class=\"show-more\"\n >\n <span>{{ showAllProfiles ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Group</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <form [formGroup]=\"newGroupForm\" (ngSubmit)=\"addGroup()\">\n <verbena-input\n placeholder=\"Group name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n width=\"100%\"\n fontSize=\"11px\"\n height=\"20px\"\n pd=\"2px 4px !important\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n formControlName=\"name\"\n ></verbena-input>\n </form>\n <div *ngFor=\"let item of visibleGroups; let i = index\" class=\"item\">\n <div class=\"item-label\">\n <input\n type=\"checkbox\"\n [id]=\"'group-' + i\"\n [(ngModel)]=\"item.selected\"\n />\n <label [for]=\"'group-' + i\" class=\"checkbox-label\">\n {{ item.name }}\n </label>\n </div>\n <div class=\"item-actions\" *ngIf=\"item.type === 'operation'\">\n <verben-svg\n icon=\"edit\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-border-focus)\"\n fill=\"var(--vbn-color-surface)\"\n (click)=\"editOperation(item)\"\n ></verben-svg>\n <verben-svg\n icon=\"delete\"\n [width]=\"15\"\n [height]=\"15\"\n stroke=\"var(--vbn-color-error)\"\n (click)=\"removeOperation(item)\"\n ></verben-svg>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between\">\n <button\n *ngIf=\"groupItems.length > 3\"\n (click)=\"toggleShowAllGroups()\"\n class=\"show-more\"\n >\n <span>{{ showAllGroups ? \"Show less\" : \"Show more\" }}</span>\n <verben-svg\n icon=\"chevron\"\n [width]=\"8\"\n [height]=\"6\"\n fill=\"var(--vbn-color-text)\"\n stroke=\"var(--vbn-color-text)\"\n ></verben-svg>\n </button>\n <button class=\"add-button\" (click)=\"addGroup()\">+ Add</button>\n </div>\n </section>\n <hr class=\"divider\" />\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Operation</h3>\n <verben-svg\n icon=\"info\"\n [width]=\"15\"\n [height]=\"15\"\n fill=\"var(--vbn-color-text-muted)\"\n ></verben-svg>\n </div>\n <verbena-input\n placeholder=\"Operation name\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"20px\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [showErrorMessage]=\"true\"\n [errorPosition]=\"'bottom'\"\n [(ngModel)]=\"newOperation.name\"\n ></verbena-input>\n\n <div class=\"operation-grid\">\n <!-- First Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n fontSize=\"11px\"\n placeholder=\"Select field\"\n [options]=\"columnOptions\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field1\"\n (ngModelChange)=\"onField1Change()\"\n >\n </verben-drop-down>\n\n <!-- Operator/Join Selection -->\n <ng-container *ngIf=\"newOperation.type === 'arithmetic'\">\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select operator\"\n [options]=\"arithmeticOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"newOperation.operator\"\n fontSize=\"11px\"\n >\n </verben-drop-down>\n </ng-container>\n <ng-container *ngIf=\"newOperation.type === 'string'\">\n <verbena-input\n placeholder=\"Join by\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"newOperation.joinBy\"\n ></verbena-input>\n </ng-container>\n\n <!-- Second Field Selection -->\n <verben-drop-down\n width=\"100%\"\n height=\"1.025rem\"\n placeholder=\"Select field\"\n [options]=\"availableFields2\"\n optionLabel=\"label\"\n optionValue=\"id\"\n [(ngModel)]=\"newOperation.field2\"\n >\n </verben-drop-down>\n </div>\n <button class=\"add-button ml-auto\" (click)=\"addOrUpdateOperation()\">\n {{ isEditingOperation ? \"Update\" : \"+ Add\" }}\n </button>\n </section>\n\n <section class=\"section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">Record Size</h3>\n </div>\n\n <div class=\"flex gap-4 items-center\">\n <verbena-input\n placeholder=\"Skip\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"skip\"\n ></verbena-input>\n\n <span>-</span>\n\n <verbena-input\n placeholder=\"Limit\"\n border=\"1px solid var(--vbn-color-border)\"\n borderRadius=\"5px\"\n textColor=\"var(--vbn-color-text)\"\n fontSize=\"11px\"\n width=\"100%\"\n height=\"1.025rem\"\n pd=\"2px 6px\"\n bgColor=\"transparent\"\n [showBorder]=\"true\"\n [(ngModel)]=\"limit\"\n ></verbena-input>\n </div>\n </section>\n </div>\n <div card-footer class=\"card-footer flex gap-2\">\n <verbena-button\n (click)=\"exportData()\"\n styleType=\"secondary\"\n text=\"Export\"\n [disable]=\"!isAnyProfileSelected()\"\n ></verbena-button>\n <verbena-button\n (click)=\"exportAllData()\"\n styleType=\"secondary\"\n text=\"Export All\"\n [disable]=\"!isAnyProfileSelected()\"\n ></verbena-button>\n <!-- <button\n class=\"export-button\"\n [disabled]=\"!isAnyProfileSelected()\"\n (click)=\"exportData()\"\n >\n Export\n </button>\n <button\n class=\"export-button\"\n [disabled]=\"!isAnyProfileSelected()\"\n (click)=\"exportAllData()\"\n >\n Export All\n </button> -->\n </div>\n</verben-card>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { SvgModule } from 'verben-ng-ui/src/lib/components/svg';\nimport { CardModule } from 'verben-ng-ui/src/lib/components/card';\nimport { DropDownModule } from 'verben-ng-ui/src/lib/components/drop-down';\nimport { TooltipModule } from 'verben-ng-ui/src/lib/components/tooltip';\nimport { VerbenaInputModule } from 'verben-ng-ui/src/lib/verbena-input';\nimport { DataXportService } from './data-xport.service';\nimport { DataXportComponent } from './data-xport.component';\nimport { VerbenaButtonModule } from 'verben-ng-ui/src/lib/verbena-button';\n\n@NgModule({\n declarations: [DataXportComponent],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n SvgModule,\n CardModule,\n DropDownModule,\n TooltipModule,\n VerbenaInputModule,\n VerbenaButtonModule,\n ],\n providers: [DataXportService],\n exports: [DataXportComponent],\n})\nexport class DataXportModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.DataXportService"],"mappings":"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"}