@elementar-rt/components 0.6.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -0
- package/action-required/index.d.ts +13 -0
- package/alert/index.d.ts +51 -0
- package/announcement/index.d.ts +45 -0
- package/avatar/index.d.ts +67 -0
- package/block-loader/index.d.ts +21 -0
- package/block-state/index.d.ts +33 -0
- package/brand-colors/index.d.ts +27 -0
- package/breadcrumbs/index.d.ts +104 -0
- package/card-overlay/index.d.ts +20 -0
- package/carousel/index.d.ts +75 -0
- package/code-highlighter/index.d.ts +18 -0
- package/color-picker/index.d.ts +92 -0
- package/color-scheme/index.d.ts +44 -0
- package/command-bar/index.d.ts +28 -0
- package/comment-editor/index.d.ts +194 -0
- package/comparison-slider/index.d.ts +51 -0
- package/confirm/index.d.ts +35 -0
- package/content-fade/index.d.ts +17 -0
- package/cookie-popup/index.d.ts +41 -0
- package/core/index.d.ts +252 -0
- package/country-select/index.d.ts +76 -0
- package/crop/index.d.ts +59 -0
- package/currency-select/index.d.ts +78 -0
- package/dashboard/index.d.ts +48 -0
- package/data-view/index.d.ts +127 -0
- package/date-format-select/index.d.ts +56 -0
- package/divider/index.d.ts +13 -0
- package/drawer/index.d.ts +35 -0
- package/emoji-picker/index.d.ts +49 -0
- package/expand/index.d.ts +26 -0
- package/fesm2022/elementar-rt-components-action-required.mjs +30 -0
- package/fesm2022/elementar-rt-components-action-required.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-alert.mjs +139 -0
- package/fesm2022/elementar-rt-components-alert.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-announcement.mjs +73 -0
- package/fesm2022/elementar-rt-components-announcement.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-avatar.mjs +234 -0
- package/fesm2022/elementar-rt-components-avatar.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-block-loader.mjs +54 -0
- package/fesm2022/elementar-rt-components-block-loader.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-block-state.mjs +75 -0
- package/fesm2022/elementar-rt-components-block-state.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-brand-colors.mjs +78 -0
- package/fesm2022/elementar-rt-components-brand-colors.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-breadcrumbs.mjs +213 -0
- package/fesm2022/elementar-rt-components-breadcrumbs.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-card-overlay.mjs +55 -0
- package/fesm2022/elementar-rt-components-card-overlay.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-carousel.mjs +605 -0
- package/fesm2022/elementar-rt-components-carousel.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-code-highlighter.mjs +57 -0
- package/fesm2022/elementar-rt-components-code-highlighter.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-color-picker.mjs +708 -0
- package/fesm2022/elementar-rt-components-color-picker.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-color-scheme.mjs +106 -0
- package/fesm2022/elementar-rt-components-color-scheme.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-command-bar.mjs +59 -0
- package/fesm2022/elementar-rt-components-command-bar.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-comment-editor.mjs +1039 -0
- package/fesm2022/elementar-rt-components-comment-editor.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-comparison-slider.mjs +193 -0
- package/fesm2022/elementar-rt-components-comparison-slider.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-confirm.mjs +86 -0
- package/fesm2022/elementar-rt-components-confirm.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-content-fade.mjs +35 -0
- package/fesm2022/elementar-rt-components-content-fade.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-cookie-popup.mjs +109 -0
- package/fesm2022/elementar-rt-components-cookie-popup.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-core.mjs +837 -0
- package/fesm2022/elementar-rt-components-core.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-country-select.mjs +477 -0
- package/fesm2022/elementar-rt-components-country-select.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-crop.mjs +183 -0
- package/fesm2022/elementar-rt-components-crop.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-currency-select.mjs +384 -0
- package/fesm2022/elementar-rt-components-currency-select.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-dashboard.mjs +96 -0
- package/fesm2022/elementar-rt-components-dashboard.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-data-view.mjs +302 -0
- package/fesm2022/elementar-rt-components-data-view.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-date-format-select.mjs +136 -0
- package/fesm2022/elementar-rt-components-date-format-select.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-divider.mjs +31 -0
- package/fesm2022/elementar-rt-components-divider.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-drawer.mjs +131 -0
- package/fesm2022/elementar-rt-components-drawer.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-emoji-picker.mjs +249 -0
- package/fesm2022/elementar-rt-components-emoji-picker.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-expand.mjs +60 -0
- package/fesm2022/elementar-rt-components-expand.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-filter-builder.mjs +333 -0
- package/fesm2022/elementar-rt-components-filter-builder.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-form-renderer-autocomplete-many-field.component-AqEghjO_.mjs +123 -0
- package/fesm2022/elementar-rt-components-form-renderer-autocomplete-many-field.component-AqEghjO_.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-form-renderer-checkbox-field.component-CUKmZGFq.mjs +22 -0
- package/fesm2022/elementar-rt-components-form-renderer-checkbox-field.component-CUKmZGFq.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-form-renderer-datepicker-field.component-DihIRWMt.mjs +40 -0
- package/fesm2022/elementar-rt-components-form-renderer-datepicker-field.component-DihIRWMt.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-form-renderer-divider-content.component-CjlGcU3B.mjs +17 -0
- package/fesm2022/elementar-rt-components-form-renderer-divider-content.component-CjlGcU3B.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-form-renderer-image-content.component-0pL2Fk0H.mjs +17 -0
- package/fesm2022/elementar-rt-components-form-renderer-image-content.component-0pL2Fk0H.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-form-renderer-input-field.component-X2sKvj6J.mjs +33 -0
- package/fesm2022/elementar-rt-components-form-renderer-input-field.component-X2sKvj6J.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-form-renderer-radio-group-field.component-DWXZAA3F.mjs +38 -0
- package/fesm2022/elementar-rt-components-form-renderer-radio-group-field.component-DWXZAA3F.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-form-renderer-select-field.component-Cx9DZoD6.mjs +39 -0
- package/fesm2022/elementar-rt-components-form-renderer-select-field.component-Cx9DZoD6.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-form-renderer-text-content.component-BmFyUG06.mjs +24 -0
- package/fesm2022/elementar-rt-components-form-renderer-text-content.component-BmFyUG06.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-form-renderer-textarea-field.component-D9KmE049.mjs +37 -0
- package/fesm2022/elementar-rt-components-form-renderer-textarea-field.component-D9KmE049.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-form-renderer-timezone-field.component-BroP_Q4P.mjs +35 -0
- package/fesm2022/elementar-rt-components-form-renderer-timezone-field.component-BroP_Q4P.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-form-renderer-toggle-field.component-nGbtVi1_.mjs +22 -0
- package/fesm2022/elementar-rt-components-form-renderer-toggle-field.component-nGbtVi1_.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-form-renderer.mjs +321 -0
- package/fesm2022/elementar-rt-components-form-renderer.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-gauge.mjs +50 -0
- package/fesm2022/elementar-rt-components-gauge.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-icon.mjs +62 -0
- package/fesm2022/elementar-rt-components-icon.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-image-resizer.mjs +159 -0
- package/fesm2022/elementar-rt-components-image-resizer.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-image-viewer.mjs +349 -0
- package/fesm2022/elementar-rt-components-image-viewer.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-incidents.mjs +259 -0
- package/fesm2022/elementar-rt-components-incidents.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-inline-text-edit.mjs +181 -0
- package/fesm2022/elementar-rt-components-inline-text-edit.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-input-mask.mjs +180 -0
- package/fesm2022/elementar-rt-components-input-mask.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-input-validator.mjs +24 -0
- package/fesm2022/elementar-rt-components-input-validator.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-kanban-board.mjs +156 -0
- package/fesm2022/elementar-rt-components-kanban-board.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-layout.mjs +188 -0
- package/fesm2022/elementar-rt-components-layout.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-logo.mjs +43 -0
- package/fesm2022/elementar-rt-components-logo.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-marquee.mjs +79 -0
- package/fesm2022/elementar-rt-components-marquee.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-micro-chart.mjs +950 -0
- package/fesm2022/elementar-rt-components-micro-chart.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-navigation.mjs +379 -0
- package/fesm2022/elementar-rt-components-navigation.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-notifications.mjs +190 -0
- package/fesm2022/elementar-rt-components-notifications.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-number-input.mjs +288 -0
- package/fesm2022/elementar-rt-components-number-input.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-overlay-scrollbar.mjs +455 -0
- package/fesm2022/elementar-rt-components-overlay-scrollbar.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-overlay.mjs +112 -0
- package/fesm2022/elementar-rt-components-overlay.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-page-loading-bar.mjs +79 -0
- package/fesm2022/elementar-rt-components-page-loading-bar.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-panel.mjs +105 -0
- package/fesm2022/elementar-rt-components-panel.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-password-strength.mjs +474 -0
- package/fesm2022/elementar-rt-components-password-strength.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-phone-input.mjs +637 -0
- package/fesm2022/elementar-rt-components-phone-input.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-pin-input.mjs +197 -0
- package/fesm2022/elementar-rt-components-pin-input.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-popover.mjs +262 -0
- package/fesm2022/elementar-rt-components-popover.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-radio-card.mjs +102 -0
- package/fesm2022/elementar-rt-components-radio-card.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-rail-nav.mjs +84 -0
- package/fesm2022/elementar-rt-components-rail-nav.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-resizable-container.mjs +69 -0
- package/fesm2022/elementar-rt-components-resizable-container.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-screen-loader.mjs +27 -0
- package/fesm2022/elementar-rt-components-screen-loader.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-scroll-spy.mjs +165 -0
- package/fesm2022/elementar-rt-components-scroll-spy.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-segmented.mjs +153 -0
- package/fesm2022/elementar-rt-components-segmented.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-side-panel.mjs +110 -0
- package/fesm2022/elementar-rt-components-side-panel.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-sidebar.mjs +423 -0
- package/fesm2022/elementar-rt-components-sidebar.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-signature-pad.mjs +452 -0
- package/fesm2022/elementar-rt-components-signature-pad.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-skeleton.mjs +56 -0
- package/fesm2022/elementar-rt-components-skeleton.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-splash-screen.mjs +91 -0
- package/fesm2022/elementar-rt-components-splash-screen.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-stepper.mjs +194 -0
- package/fesm2022/elementar-rt-components-stepper.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-suggestions.mjs +76 -0
- package/fesm2022/elementar-rt-components-suggestions.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-tab-panel.mjs +270 -0
- package/fesm2022/elementar-rt-components-tab-panel.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-text-editor.mjs +1025 -0
- package/fesm2022/elementar-rt-components-text-editor.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-thumbnail-maker.mjs +214 -0
- package/fesm2022/elementar-rt-components-thumbnail-maker.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-timeline.mjs +122 -0
- package/fesm2022/elementar-rt-components-timeline.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-timezone-select.mjs +351 -0
- package/fesm2022/elementar-rt-components-timezone-select.mjs.map +1 -0
- package/fesm2022/elementar-rt-components-upload.mjs +340 -0
- package/fesm2022/elementar-rt-components-upload.mjs.map +1 -0
- package/fesm2022/elementar-rt-components.mjs +6 -0
- package/fesm2022/elementar-rt-components.mjs.map +1 -0
- package/filter-builder/index.d.ts +107 -0
- package/form-renderer/index.d.ts +121 -0
- package/gauge/index.d.ts +21 -0
- package/icon/index.d.ts +17 -0
- package/image-resizer/index.d.ts +35 -0
- package/image-viewer/index.d.ts +63 -0
- package/incidents/index.d.ts +119 -0
- package/index.d.ts +2 -0
- package/inline-text-edit/index.d.ts +39 -0
- package/input-mask/index.d.ts +36 -0
- package/input-validator/index.d.ts +5 -0
- package/kanban-board/index.d.ts +68 -0
- package/layout/index.d.ts +75 -0
- package/logo/index.d.ts +21 -0
- package/marquee/index.d.ts +26 -0
- package/micro-chart/index.d.ts +193 -0
- package/navigation/index.d.ts +119 -0
- package/notifications/index.d.ts +84 -0
- package/number-input/index.d.ts +93 -0
- package/overlay/index.d.ts +12 -0
- package/overlay-scrollbar/index.d.ts +66 -0
- package/package.json +356 -0
- package/page-loading-bar/index.d.ts +20 -0
- package/panel/index.d.ts +43 -0
- package/password-strength/index.d.ts +109 -0
- package/phone-input/index.d.ts +94 -0
- package/pin-input/index.d.ts +48 -0
- package/popover/index.d.ts +75 -0
- package/radio-card/index.d.ts +37 -0
- package/rail-nav/index.d.ts +36 -0
- package/resizable-container/index.d.ts +21 -0
- package/screen-loader/index.d.ts +9 -0
- package/scroll-spy/index.d.ts +48 -0
- package/segmented/index.d.ts +54 -0
- package/side-panel/index.d.ts +42 -0
- package/sidebar/index.d.ts +143 -0
- package/signature-pad/index.d.ts +49 -0
- package/skeleton/index.d.ts +24 -0
- package/splash-screen/index.d.ts +31 -0
- package/stepper/index.d.ts +65 -0
- package/styles/_common.scss +776 -0
- package/styles/themes/cyan-orange.scss +41 -0
- package/styles/themes/default.scss +5 -0
- package/styles/themes/magenta-violet.scss +41 -0
- package/styles/themes/rose-red.scss +41 -0
- package/suggestions/index.d.ts +32 -0
- package/tab-panel/index.d.ts +96 -0
- package/text-editor/index.d.ts +191 -0
- package/thumbnail-maker/index.d.ts +35 -0
- package/timeline/index.d.ts +57 -0
- package/timezone-select/index.d.ts +72 -0
- package/upload/index.d.ts +134 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, TemplateRef, Directive, input, contentChild, ChangeDetectorRef, PLATFORM_ID, viewChildren, contentChildren, output, Component } from '@angular/core';
|
|
3
|
+
import { isPlatformServer, NgTemplateOutlet } from '@angular/common';
|
|
4
|
+
import { MatIcon } from '@angular/material/icon';
|
|
5
|
+
import { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu';
|
|
6
|
+
import * as i1 from '@angular/forms';
|
|
7
|
+
import { FormsModule } from '@angular/forms';
|
|
8
|
+
import { MatOption } from '@angular/material/autocomplete';
|
|
9
|
+
import { MatFormField, MatInput } from '@angular/material/input';
|
|
10
|
+
import { MatSelect } from '@angular/material/select';
|
|
11
|
+
import { MenuOptionGroupDirective, AutoFocusDirective, FocusElementDirective } from '@elementar-rt/components/core';
|
|
12
|
+
|
|
13
|
+
class FilterBuilderOperationNameDirective {
|
|
14
|
+
templateRef = inject(TemplateRef);
|
|
15
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderOperationNameDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
16
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.10", type: FilterBuilderOperationNameDirective, isStandalone: true, selector: "[emrFilterBuilderOperationName]", ngImport: i0 });
|
|
17
|
+
}
|
|
18
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderOperationNameDirective, decorators: [{
|
|
19
|
+
type: Directive,
|
|
20
|
+
args: [{
|
|
21
|
+
selector: '[emrFilterBuilderOperationName]'
|
|
22
|
+
}]
|
|
23
|
+
}] });
|
|
24
|
+
|
|
25
|
+
class FilterBuilderOperationIconDirective {
|
|
26
|
+
templateRef = inject(TemplateRef);
|
|
27
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderOperationIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
28
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.10", type: FilterBuilderOperationIconDirective, isStandalone: true, selector: "[emrFilterBuilderOperationIcon]", ngImport: i0 });
|
|
29
|
+
}
|
|
30
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderOperationIconDirective, decorators: [{
|
|
31
|
+
type: Directive,
|
|
32
|
+
args: [{
|
|
33
|
+
selector: '[emrFilterBuilderOperationIcon]'
|
|
34
|
+
}]
|
|
35
|
+
}] });
|
|
36
|
+
|
|
37
|
+
class FilterBuilderOperationDefDirective {
|
|
38
|
+
id = input('', ...(ngDevMode ? [{ debugName: "id", alias: 'emrFilterBuilderOperationDef' }] : [{
|
|
39
|
+
alias: 'emrFilterBuilderOperationDef'
|
|
40
|
+
}]));
|
|
41
|
+
allowedDataTypes = input([], ...(ngDevMode ? [{ debugName: "allowedDataTypes" }] : []));
|
|
42
|
+
operationName = contentChild(FilterBuilderOperationNameDirective, ...(ngDevMode ? [{ debugName: "operationName" }] : []));
|
|
43
|
+
operationIcon = contentChild(FilterBuilderOperationIconDirective, ...(ngDevMode ? [{ debugName: "operationIcon" }] : []));
|
|
44
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderOperationDefDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
45
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.3.10", type: FilterBuilderOperationDefDirective, isStandalone: true, selector: "[emrFilterBuilderOperationDef]", inputs: { id: { classPropertyName: "id", publicName: "emrFilterBuilderOperationDef", isSignal: true, isRequired: false, transformFunction: null }, allowedDataTypes: { classPropertyName: "allowedDataTypes", publicName: "allowedDataTypes", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "operationName", first: true, predicate: FilterBuilderOperationNameDirective, descendants: true, isSignal: true }, { propertyName: "operationIcon", first: true, predicate: FilterBuilderOperationIconDirective, descendants: true, isSignal: true }], ngImport: i0 });
|
|
46
|
+
}
|
|
47
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderOperationDefDirective, decorators: [{
|
|
48
|
+
type: Directive,
|
|
49
|
+
args: [{
|
|
50
|
+
selector: '[emrFilterBuilderOperationDef]'
|
|
51
|
+
}]
|
|
52
|
+
}], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "emrFilterBuilderOperationDef", required: false }] }], allowedDataTypes: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowedDataTypes", required: false }] }], operationName: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FilterBuilderOperationNameDirective), { isSignal: true }] }], operationIcon: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FilterBuilderOperationIconDirective), { isSignal: true }] }] } });
|
|
53
|
+
|
|
54
|
+
class FilterBuilderComponent {
|
|
55
|
+
_cdr = inject(ChangeDetectorRef);
|
|
56
|
+
_platformId = inject(PLATFORM_ID);
|
|
57
|
+
_isServer = isPlatformServer(this._platformId);
|
|
58
|
+
_operationAllowedTypesMap = new Map();
|
|
59
|
+
_resetMethodMap = {
|
|
60
|
+
'_resetStringValue': this._resetStringValue,
|
|
61
|
+
'_resetBooleanValue': this._resetBooleanValue,
|
|
62
|
+
'_resetArrayValue': this._resetArrayValue,
|
|
63
|
+
'_resetNumberValue': this._resetNumberValue,
|
|
64
|
+
};
|
|
65
|
+
value = input([], ...(ngDevMode ? [{ debugName: "value" }] : []));
|
|
66
|
+
fieldDefs = input([], ...(ngDevMode ? [{ debugName: "fieldDefs" }] : []));
|
|
67
|
+
categories = input([], ...(ngDevMode ? [{ debugName: "categories" }] : []));
|
|
68
|
+
groupOperations = input([
|
|
69
|
+
{
|
|
70
|
+
id: 'and',
|
|
71
|
+
name: 'And'
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 'or',
|
|
75
|
+
name: 'Or'
|
|
76
|
+
}
|
|
77
|
+
], ...(ngDevMode ? [{ debugName: "groupOperations" }] : []));
|
|
78
|
+
customOperations = input([], ...(ngDevMode ? [{ debugName: "customOperations" }] : []));
|
|
79
|
+
_logicalOperator = this.groupOperations()[0].id;
|
|
80
|
+
_prebuiltOperationDefs = viewChildren(FilterBuilderOperationDefDirective, ...(ngDevMode ? [{ debugName: "_prebuiltOperationDefs" }] : []));
|
|
81
|
+
_customOperationDefs = contentChildren(FilterBuilderOperationDefDirective, ...(ngDevMode ? [{ debugName: "_customOperationDefs" }] : []));
|
|
82
|
+
_operationDefs = [];
|
|
83
|
+
valueChanged = output();
|
|
84
|
+
_value = [];
|
|
85
|
+
_operations = [];
|
|
86
|
+
editItem;
|
|
87
|
+
ngOnInit() {
|
|
88
|
+
if (this.value().length) {
|
|
89
|
+
if (!this._isGroup(this.value()[0])) {
|
|
90
|
+
throw new Error('Invalid filter value, first element should be a filter group');
|
|
91
|
+
}
|
|
92
|
+
this._logicalOperator = this.value()[0]['logicalOperator'];
|
|
93
|
+
this._value = JSON.parse(JSON.stringify(this.value()[0]['value']));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
ngAfterViewInit() {
|
|
97
|
+
this._operationDefs = [...this._prebuiltOperationDefs(), ...this._customOperationDefs()];
|
|
98
|
+
this._operationDefs.forEach(operationDef => {
|
|
99
|
+
this._operations.push({
|
|
100
|
+
id: operationDef.id(),
|
|
101
|
+
name: operationDef.operationName()?.templateRef
|
|
102
|
+
});
|
|
103
|
+
operationDef.allowedDataTypes().forEach((allowedType) => {
|
|
104
|
+
if (!this._operationAllowedTypesMap.has(allowedType)) {
|
|
105
|
+
this._operationAllowedTypesMap.set(allowedType, []);
|
|
106
|
+
}
|
|
107
|
+
const allowedTypeValue = this._operationAllowedTypesMap.get(allowedType);
|
|
108
|
+
allowedTypeValue.push(operationDef.id());
|
|
109
|
+
this._operationAllowedTypesMap.set(allowedType, allowedTypeValue);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
this._cdr.detectChanges();
|
|
113
|
+
}
|
|
114
|
+
addCondition(targetGroup) {
|
|
115
|
+
const value = !targetGroup ? this._value : targetGroup.value;
|
|
116
|
+
value.push({
|
|
117
|
+
value: [this.fieldDefs()[0].dataField, this._operations[0].id, '']
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
addGroup(targetGroup) {
|
|
121
|
+
const value = !targetGroup ? this._value : targetGroup.value;
|
|
122
|
+
value.push({
|
|
123
|
+
logicalOperator: this.groupOperations()[0].id,
|
|
124
|
+
value: []
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
getConditionField(dataField) {
|
|
128
|
+
return this.fieldDefs().find(field => field.dataField === dataField);
|
|
129
|
+
}
|
|
130
|
+
getConditionOperation(id) {
|
|
131
|
+
return this._operations.find(operation => operation.id === id);
|
|
132
|
+
}
|
|
133
|
+
getSelectedGroupOperationName(targetGroup) {
|
|
134
|
+
const groupLogicalOperatorId = targetGroup ? targetGroup.logicalOperator : this._logicalOperator;
|
|
135
|
+
return this.groupOperations().find(groupOperator => groupOperator.id === groupLogicalOperatorId)?.name || '';
|
|
136
|
+
}
|
|
137
|
+
selectConditionField(item, field) {
|
|
138
|
+
this.editItem = undefined;
|
|
139
|
+
let allowedTypes = this._operationAllowedTypesMap.get(field.dataType);
|
|
140
|
+
item['value'][1] = allowedTypes[0];
|
|
141
|
+
this._resetValue(field, item);
|
|
142
|
+
this._emitChangeEvent();
|
|
143
|
+
}
|
|
144
|
+
operationChanged(item, operation) {
|
|
145
|
+
this.editItem = undefined;
|
|
146
|
+
const oldOperation = item['value'][1];
|
|
147
|
+
if (oldOperation === 'equals' && operation === 'isAnyOf') {
|
|
148
|
+
item['value'][2] = [];
|
|
149
|
+
}
|
|
150
|
+
else if (oldOperation === 'isAnyOf' && operation === 'equals') {
|
|
151
|
+
item['value'][2] = null;
|
|
152
|
+
}
|
|
153
|
+
if (oldOperation === 'isBetween' && operation !== 'isBetween') {
|
|
154
|
+
item['value'][2] = null;
|
|
155
|
+
}
|
|
156
|
+
else if (oldOperation !== 'isBetween' && operation === 'isBetween') {
|
|
157
|
+
item['value'][2] = [];
|
|
158
|
+
}
|
|
159
|
+
if (['isNotBlank', 'isBlank'].includes(operation)) {
|
|
160
|
+
item['value'][2] = null;
|
|
161
|
+
}
|
|
162
|
+
item['value'][1] = operation;
|
|
163
|
+
this._emitChangeEvent();
|
|
164
|
+
}
|
|
165
|
+
removeCondition(index, items) {
|
|
166
|
+
items.splice(index, 1);
|
|
167
|
+
this._emitChangeEvent();
|
|
168
|
+
}
|
|
169
|
+
isOperationAllowedForCondition(dataField, operationId) {
|
|
170
|
+
const fieldDef = this.fieldDefs().find(f => f.dataField === dataField);
|
|
171
|
+
let allowedTypes = this._operationAllowedTypesMap.get(fieldDef.dataType);
|
|
172
|
+
if (!allowedTypes) {
|
|
173
|
+
throw new Error('There are not operations for the datatype: ' + fieldDef.dataType);
|
|
174
|
+
}
|
|
175
|
+
return allowedTypes.includes(operationId);
|
|
176
|
+
}
|
|
177
|
+
modifyValue(item) {
|
|
178
|
+
this.editItem = item;
|
|
179
|
+
}
|
|
180
|
+
getFieldType(item) {
|
|
181
|
+
return this.fieldDefs().find(f => f.dataField === item['value'][0]).dataType;
|
|
182
|
+
}
|
|
183
|
+
isValueNotEmpty(item) {
|
|
184
|
+
if (this.getFieldType(item) === 'array') {
|
|
185
|
+
if (item['value'][1] === 'equals') {
|
|
186
|
+
return item['value'][2] !== null && item['value'][2] !== '';
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
return item['value'][2].length > 0;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (item['value'][1] === 'isBetween') {
|
|
193
|
+
return item['value'][2].length === 2 && item['value'][2][0] !== null && item['value'][2][1] !== null;
|
|
194
|
+
}
|
|
195
|
+
return item['value'][2] !== null && item['value'][2] !== '';
|
|
196
|
+
}
|
|
197
|
+
cancelEdit(delay = 0) {
|
|
198
|
+
setTimeout(() => {
|
|
199
|
+
this.editItem = undefined;
|
|
200
|
+
this._cdr.detectChanges();
|
|
201
|
+
}, delay);
|
|
202
|
+
}
|
|
203
|
+
getOptions(item) {
|
|
204
|
+
const fieldDef = this._getFieldDef(item);
|
|
205
|
+
return fieldDef.lookup?.dataSource;
|
|
206
|
+
}
|
|
207
|
+
getDataSourceItemNameById(item, dataSourceItemId) {
|
|
208
|
+
const fieldDef = this._getFieldDef(item);
|
|
209
|
+
return (fieldDef.lookup?.dataSource).find(item => item.id === dataSourceItemId)?.name || '';
|
|
210
|
+
}
|
|
211
|
+
selectBlur(event) {
|
|
212
|
+
event.preventDefault();
|
|
213
|
+
event.stopPropagation();
|
|
214
|
+
const select = event.target;
|
|
215
|
+
setTimeout(() => {
|
|
216
|
+
const formField = select.closest('.mat-mdc-form-field');
|
|
217
|
+
if (formField) {
|
|
218
|
+
if (!formField.classList.contains('mat-focused')) {
|
|
219
|
+
this.cancelEdit();
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}, 25);
|
|
223
|
+
}
|
|
224
|
+
selectClosed() {
|
|
225
|
+
this.cancelEdit();
|
|
226
|
+
this._emitChangeEvent();
|
|
227
|
+
}
|
|
228
|
+
operationIconTemplateRef(operation) {
|
|
229
|
+
return operation.operationIcon()?.templateRef;
|
|
230
|
+
}
|
|
231
|
+
operationNameTemplateRef(operation) {
|
|
232
|
+
return operation.operationName()?.templateRef;
|
|
233
|
+
}
|
|
234
|
+
_isGroup(item) {
|
|
235
|
+
return 'logicalOperator' in item;
|
|
236
|
+
}
|
|
237
|
+
_isCondition(item) {
|
|
238
|
+
return !('logicalOperator' in item);
|
|
239
|
+
}
|
|
240
|
+
_emitChangeEvent() {
|
|
241
|
+
const value = this._normalizeValue(this._value);
|
|
242
|
+
if (value.length > 0) {
|
|
243
|
+
this.valueChanged.emit([
|
|
244
|
+
{
|
|
245
|
+
logicalOperator: this._logicalOperator,
|
|
246
|
+
value: value
|
|
247
|
+
}
|
|
248
|
+
]);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
this.valueChanged.emit([]);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
_getFieldDef(condition) {
|
|
255
|
+
return this.fieldDefs().find(f => f.dataField === condition['value'][0]);
|
|
256
|
+
}
|
|
257
|
+
_resetValue(field, condition) {
|
|
258
|
+
const fieldDef = this.fieldDefs().find(f => f.dataField === field.dataField);
|
|
259
|
+
const resetMethod = '_reset' + this._capitalizeFirstLetter(fieldDef.dataType) + 'Value';
|
|
260
|
+
this._resetMethodMap[resetMethod](condition);
|
|
261
|
+
}
|
|
262
|
+
_resetStringValue(condition) {
|
|
263
|
+
condition['value'][2] = '';
|
|
264
|
+
}
|
|
265
|
+
_resetNumberValue(condition) {
|
|
266
|
+
condition['value'][2] = null;
|
|
267
|
+
}
|
|
268
|
+
_resetArrayValue(condition) {
|
|
269
|
+
if (condition['value'][1] === 'equals') {
|
|
270
|
+
condition['value'][2] = null;
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
condition['value'][2] = [];
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
_resetBooleanValue(condition) {
|
|
277
|
+
condition['value'][2] = false;
|
|
278
|
+
}
|
|
279
|
+
_capitalizeFirstLetter(value) {
|
|
280
|
+
return value.charAt(0).toUpperCase() + value.slice(1);
|
|
281
|
+
}
|
|
282
|
+
_normalizeValue(value) {
|
|
283
|
+
let result = [];
|
|
284
|
+
value.forEach(item => {
|
|
285
|
+
if (this._isGroup(item)) {
|
|
286
|
+
const groupValue = this._normalizeValue(item.value);
|
|
287
|
+
if (groupValue.length > 0) {
|
|
288
|
+
result = [...result, {
|
|
289
|
+
logicalOperator: item.logicalOperator,
|
|
290
|
+
value: groupValue
|
|
291
|
+
}];
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
if (this.isValueNotEmpty(item)) {
|
|
296
|
+
result.push(item);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
return result;
|
|
301
|
+
}
|
|
302
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
303
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.10", type: FilterBuilderComponent, isStandalone: true, selector: "emr-filter-builder", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, fieldDefs: { classPropertyName: "fieldDefs", publicName: "fieldDefs", isSignal: true, isRequired: false, transformFunction: null }, categories: { classPropertyName: "categories", publicName: "categories", isSignal: true, isRequired: false, transformFunction: null }, groupOperations: { classPropertyName: "groupOperations", publicName: "groupOperations", isSignal: true, isRequired: false, transformFunction: null }, customOperations: { classPropertyName: "customOperations", publicName: "customOperations", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChanged: "valueChanged" }, host: { classAttribute: "emr-filter-builder" }, queries: [{ propertyName: "_customOperationDefs", predicate: FilterBuilderOperationDefDirective, isSignal: true }], viewQueries: [{ propertyName: "_prebuiltOperationDefs", predicate: FilterBuilderOperationDefDirective, descendants: true, isSignal: true }], exportAs: ["emrFilterBuilder"], ngImport: i0, template: "@if (_isServer) {\r\n <ng-content/>\r\n}\r\n\r\n<ng-template #itemsTpl let-items>\r\n <div class=\"group\">\r\n @for (item of items; track item; let index = $index) {\r\n @if (_isGroup(item)) {\r\n <div class=\"flex items-center group-operations\">\r\n <div class=\"remove\" (click)=\"removeCondition(index, items)\">\r\n <mat-icon class=\"font-icon\">close</mat-icon>\r\n </div>\r\n <button [matMenuTriggerFor]=\"nestedGroupOperationsMenu\" class=\"group-operation\">\r\n {{ getSelectedGroupOperationName(item) }}\r\n </button>\r\n <div [matMenuTriggerFor]=\"addGroupMenu\" class=\"add\">\r\n <mat-icon class=\"font-icon\">add</mat-icon>\r\n </div>\r\n <mat-menu #nestedGroupOperationsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"item['logicalOperator']\">\r\n @for (groupOperation of groupOperations(); track groupOperation.id) {\r\n <mat-option [value]=\"groupOperation.id\">{{ groupOperation.name }}</mat-option>\r\n }\r\n </div>\r\n </mat-menu>\r\n <mat-menu #addGroupMenu>\r\n <button mat-menu-item (click)=\"addCondition(item)\">Add Condition</button>\r\n <button mat-menu-item (click)=\"addGroup(item)\">Add Group</button>\r\n </mat-menu>\r\n </div>\r\n @if (item['value'].length > 0) {\r\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" [ngTemplateOutletContext]=\"{ $implicit: item['value'] }\"></ng-container>\r\n }\r\n } @else if (_isCondition(item)) {\r\n <div class=\"condition\">\r\n <div class=\"remove\" (click)=\"removeCondition(index, items)\">\r\n <mat-icon class=\"font-icon\">close</mat-icon>\r\n </div>\r\n <button class=\"condition-field\"\r\n [matMenuTriggerFor]=\"fieldsMenu\">{{ getConditionField(item['value'][0])?.name }}</button>\r\n <button class=\"condition-operation\"\r\n [matMenuTriggerFor]=\"operationsMenu\">\r\n <ng-template [ngTemplateOutlet]=\"getConditionOperation(item['value'][1])?.name\"></ng-template>\r\n </button>\r\n <div class=\"relative\">\r\n @if (editItem && editItem === item) {\r\n <div class=\"absolute start-0 top-0 -translate-y-1/2\">\r\n @switch (getFieldType(editItem)) {\r\n @case ('array') {\r\n @switch (editItem['value'][1]) {\r\n @case ('equals') {\r\n <mat-form-field class=\"form-field\">\r\n <mat-select placeholder=\"Select...\"\r\n emrAutoFocus\r\n (blur)=\"selectBlur($event)\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n @for (option of getOptions(editItem); track option.id) {\r\n <mat-option [value]=\"option.id\">{{ option.name }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n\r\n @case ('isAnyOf') {\r\n <mat-form-field class=\"form-field\">\r\n <mat-select placeholder=\"Select...\" multiple\r\n emrAutoFocus\r\n (blur)=\"selectBlur($event)\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (closed)=\"selectClosed()\">\r\n @for (option of getOptions(editItem); track option.id) {\r\n <mat-option [value]=\"option.id\">{{ option.name }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n }\r\n }\r\n\r\n @case ('number') {\r\n @switch (editItem['value'][1]) {\r\n @case ('isBetween') {\r\n <div class=\"flex gap-2 items-center\"\r\n emrFocusElement (elementBlurred)=\"cancelEdit()\">\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput emrAutoFocus\r\n [(ngModel)]=\"item['value'][2][0]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n <div class=\"text-neutral-500\">–</div>\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput\r\n [(ngModel)]=\"item['value'][2][1]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n </div>\r\n }\r\n @default {\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput emrAutoFocus\r\n (blur)=\"cancelEdit()\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n }\r\n }\r\n }\r\n\r\n @default {\r\n <mat-form-field class=\"form-field\">\r\n <input type=\"text\" matInput emrAutoFocus\r\n (blur)=\"cancelEdit()\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n @if (item['value'][1] !== 'isBlank' && item['value'][1] !== 'isNotBlank') {\r\n @if (isValueNotEmpty(item)) {\r\n @if (getFieldType(item) === 'array') {\r\n @if (item['value'][1] === 'equals') {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n {{ getDataSourceItemNameById(item, item['value'][2]) }}\r\n </button>\r\n } @else {\r\n <button class=\"condition-value flex items-center gap-2\" (click)=\"modifyValue(item)\">\r\n @for (dataSourceItemId of item['value'][2]; track dataSourceItemId; let last = $last) {\r\n <span>{{ getDataSourceItemNameById(item, dataSourceItemId) }}</span>\r\n @if (!last) {\r\n <span class=\"text-neutral-500\">|</span>\r\n }\r\n }\r\n </button>\r\n }\r\n } @else {\r\n @if (item['value'][1] === 'isBetween') {\r\n <button class=\"condition-value flex items-center gap-2\" (click)=\"modifyValue(item)\">\r\n <span>{{ item['value'][2][0] }}</span>\r\n <span class=\"text-neutral-500\">–</span>\r\n <span>{{ item['value'][2][1] }}</span>\r\n </button>\r\n } @else {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n <span>{{ item['value'][2] }}</span>\r\n </button>\r\n }\r\n }\r\n } @else {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n <span i18n><enter a value></span>\r\n </button>\r\n }\r\n }\r\n }\r\n </div>\r\n </div>\r\n <mat-menu #fieldsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"item['value'][0]\">\r\n @for (fieldDef of fieldDefs(); track fieldDef) {\r\n <mat-option [value]=\"fieldDef.dataField\"\r\n (click)=\"selectConditionField(item, fieldDef)\">{{ fieldDef.name }}</mat-option>\r\n }\r\n </div>\r\n </mat-menu>\r\n <mat-menu #operationsMenu>\r\n <div emrMenuOptionGroup [ngModel]=\"item['value'][1]\">\r\n @for (operation of _operationDefs; track operation.id()) {\r\n <div [hidden]=\"!isOperationAllowedForCondition(item['value'][0], operation.id())\">\r\n <mat-option [value]=\"operation.id()\" (click)=\"operationChanged(item, operation.id())\">\r\n <div class=\"flex items-center gap-3\">\r\n @if (operation.operationIcon()) {\r\n <ng-template [ngTemplateOutlet]=\"operationIconTemplateRef(operation)\"></ng-template>\r\n }\r\n <div>\r\n <ng-template [ngTemplateOutlet]=\"operationNameTemplateRef(operation)\"></ng-template>\r\n </div>\r\n </div>\r\n </mat-option>\r\n </div>\r\n }\r\n </div>\r\n </mat-menu>\r\n }\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"group\">\r\n <div class=\"flex items-center group-operations\">\r\n <button [matMenuTriggerFor]=\"groupOperationsMenu\" class=\"group-operation\">\r\n {{ getSelectedGroupOperationName() }}\r\n </button>\r\n <div [matMenuTriggerFor]=\"addMenu\" class=\"add\">\r\n <mat-icon class=\"font-icon\">add</mat-icon>\r\n </div>\r\n </div>\r\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" [ngTemplateOutletContext]=\"{ $implicit: _value }\"></ng-container>\r\n</div>\r\n\r\n<mat-menu #groupOperationsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"_logicalOperator\" (ngModelChange)=\"_emitChangeEvent()\">\r\n @for (groupOperation of groupOperations(); track groupOperation.id) {\r\n <mat-option [value]=\"groupOperation.id\">{{ groupOperation.name }}</mat-option>\r\n }\r\n </div>\r\n</mat-menu>\r\n<mat-menu #addMenu>\r\n <button mat-menu-item (click)=\"addCondition()\">Add Condition</button>\r\n <button mat-menu-item (click)=\"addGroup()\">Add Group</button>\r\n</mat-menu>\r\n\r\n<ng-container emrFilterBuilderOperationDef=\"contains\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Contains</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"doesNotContain\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Does not contain</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"startsWith\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Starts with</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"endsWith\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Ends with</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"equals\" [allowedDataTypes]=\"['string', 'number', 'array', 'boolean']\">\r\n <ng-template emrFilterBuilderOperationName>Equals</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"notEquals\" [allowedDataTypes]=\"['string', 'number', 'boolean']\">\r\n <ng-template emrFilterBuilderOperationName>Not equals</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isLessThen\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is less then</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isLessThenOrEqual\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is less then or equal to</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isGreaterThen\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is greater then</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isGreaterThenOrEqual\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is greater then or equal to</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isBlank\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Is blank</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isNotBlank\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Is not blank</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isBetween\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is between</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isAnyOf\" [allowedDataTypes]=\"['array']\">\r\n <ng-template emrFilterBuilderOperationName>Is any of</ng-template>\r\n</ng-container>\r\n", styles: [":host{--emr-filter-builder-group-operations-gap: calc(var(--spacing) * 2);--emr-filter-builder-group-operation-font-size: var(--text-tiny);--emr-filter-builder-group-operation-color: var(--color-neutral-800);--emr-filter-builder-group-operation-bg: transparent;--emr-filter-builder-group-operation-font-weight: 400;--emr-filter-builder-group-operation-border-radius: .5rem;--emr-filter-builder-group-operation-bpadding: 0 calc(var(--spacing) * 2);--emr-filter-builder-group-operation-height: calc(var(--spacing) * 7);--emr-filter-builder-group-operation-hover-color: var(--color-neutral-800);--emr-filter-builder-group-operation-hover-bg: var(--color-neutral-200);--emr-filter-builder-group-operation-active-color: var(--color-neutral-900);--emr-filter-builder-group-operation-active-bg: var(--color-neutral-300);--emr-filter-builder-group-operation-border: 1px solid var(--color-neutral-500);--emr-filter-builder-group-add-color: var(--color-primary);--emr-filter-builder-group-add-hover-color: var(--color-primary);--emr-filter-builder-group-margin: 0;--emr-filter-builder-group-padding: 0;--emr-filter-builder-group-gap: calc(var(--spacing) * 4);--emr-filter-builder-condition-gap: calc(var(--spacing) * 2);--emr-filter-builder-condition-field-height: calc(var(--spacing) * 7);--emr-filter-builder-condition-field-font-size: var(--text-tiny);--emr-filter-builder-condition-field-color: var(--color-neutral-800);--emr-filter-builder-condition-field-bg: var(--color-primary-300);--emr-filter-builder-condition-field-font-weight: 400;--emr-filter-builder-condition-field-border-radius: .5rem;--emr-filter-builder-condition-field-bpadding: calc(var(--spacing) * .5) calc(var(--spacing) * 2);--emr-filter-builder-condition-field-hover-color: var(--color-neutral-800);--emr-filter-builder-condition-field-hover-bg: var(--color-primary-400);--emr-filter-builder-condition-field-active-color: white;--emr-filter-builder-condition-field-active-bg: var(--color-primary-500);--emr-filter-builder-condition-operation-height: calc(var(--spacing) * 7);--emr-filter-builder-condition-operation-font-size: var(--text-tiny);--emr-filter-builder-condition-operation-color: var(--color-neutral-800);--emr-filter-builder-condition-operation-bg: var(--color-tertiary-300);--emr-filter-builder-condition-operation-font-weight: 400;--emr-filter-builder-condition-operation-border-radius: .5rem;--emr-filter-builder-condition-operation-bpadding: calc(var(--spacing) * .5) calc(var(--spacing) * 2);--emr-filter-builder-condition-operation-hover-color: var(--color-neutral-800);--emr-filter-builder-condition-operation-hover-bg: var(--color-tertiary-400);--emr-filter-builder-condition-operation-active-color: white;--emr-filter-builder-condition-operation-active-bg: var(--color-tertiary-500);--emr-filter-builder-condition-value-height: calc(var(--spacing) * 7);--emr-filter-builder-condition-value-font-size: var(--text-tiny);--emr-filter-builder-condition-value-color: var(--color-neutral-800);--emr-filter-builder-condition-value-bg: var(--color-neutral-200);--emr-filter-builder-condition-value-font-weight: 400;--emr-filter-builder-condition-value-border-radius: .5rem;--emr-filter-builder-condition-value-bpadding: calc(var(--spacing) * .5) calc(var(--spacing) * 2);--emr-filter-builder-condition-value-hover-color: var(--color-neutral-800);--emr-filter-builder-condition-value-hover-bg: var(--color-neutral-300);--emr-filter-builder-condition-remove-color: oklch(63.7% .237 25.331);--emr-filter-builder-condition-remove-hover-color: oklch(57.7% .245 27.325);display:block}:host ::ng-deep .mat-mdc-form-field-infix{--mat-form-field-container-height: 46px !important;--mat-form-field-container-vertical-padding: 12px !important}:host ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}:host .form-field{width:200px}:host .form-field-number{width:140px}:host .group-operations{gap:var(--emr-filter-builder-group-operations-gap)}:host .group{margin:var(--emr-filter-builder-group-margin);padding:var(--emr-filter-builder-group-padding);display:flex;flex-direction:column;gap:var(--emr-filter-builder-group-gap)}:host .group .group{margin-left:calc(var(--spacing) * 4)}:host .icon:empty{display:none}:host .group-operation{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-group-operation-height);font-size:var(--emr-filter-builder-group-operation-font-size);font-weight:var(--emr-filter-builder-group-operation-font-weight);color:var(--emr-filter-builder-group-operation-color);background:var(--emr-filter-builder-group-operation-bg);border:var(--emr-filter-builder-group-operation-border);border-radius:var(--emr-filter-builder-group-operation-border-radius);padding:var(--emr-filter-builder-group-operation-bpadding)}:host .group-operation:hover{color:var(--emr-filter-builder-group-operation-hover-color);background:var(--emr-filter-builder-group-operation-hover-bg)}:host .group-operation:active,:host .group-operation.active{color:var(--emr-filter-builder-group-operation-active-color);background:var(--emr-filter-builder-group-operation-active-bg)}:host .condition{display:flex;align-items:center;gap:var(--emr-filter-builder-condition-gap)}:host .condition-field{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-condition-field-height);font-size:var(--emr-filter-builder-condition-field-font-size);font-weight:var(--emr-filter-builder-condition-field-font-weight);color:var(--emr-filter-builder-condition-field-color);background:var(--emr-filter-builder-condition-field-bg);border-radius:var(--emr-filter-builder-condition-field-border-radius);padding:var(--emr-filter-builder-condition-field-bpadding)}:host .condition-field:hover{color:var(--emr-filter-builder-condition-field-hover-color);background:var(--emr-filter-builder-condition-field-hover-bg)}:host .add{line-height:0;color:var(--emr-filter-builder-group-add-color);cursor:pointer}:host .add:hover{color:var(--emr-filter-builder-group-add-hover-color)}:host .remove{line-height:0;color:var(--emr-filter-builder-condition-remove-color);cursor:pointer}:host .remove:hover{color:var(--emr-filter-builder-condition-remove-hover-color)}:host .condition-field:active,:host .condition-field.active{color:var(--emr-filter-builder-condition-field-active-color);background:var(--emr-filter-builder-condition-field-active-bg)}:host .condition-operation{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-condition-operation-height);font-size:var(--emr-filter-builder-condition-operation-font-size);font-weight:var(--emr-filter-builder-condition-operation-font-weight);color:var(--emr-filter-builder-condition-operation-color);background:var(--emr-filter-builder-condition-operation-bg);border-radius:var(--emr-filter-builder-condition-operation-border-radius);padding:var(--emr-filter-builder-condition-operation-bpadding)}:host .condition-operation:hover{color:var(--emr-filter-builder-condition-operation-hover-color);background:var(--emr-filter-builder-condition-operation-hover-bg)}:host .condition-operation:active,:host .condition-operation.active{color:var(--emr-filter-builder-condition-operation-active-color);background:var(--emr-filter-builder-condition-operation-active-bg)}:host .condition-value{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-condition-value-height);font-size:var(--emr-filter-builder-condition-value-font-size);font-weight:var(--emr-filter-builder-condition-value-font-weight);color:var(--emr-filter-builder-condition-value-color);background:var(--emr-filter-builder-condition-value-bg);border-radius:var(--emr-filter-builder-condition-value-border-radius);padding:var(--emr-filter-builder-condition-value-bpadding)}:host .condition-value:hover{color:var(--emr-filter-builder-condition-value-hover-color);background:var(--emr-filter-builder-condition-value-hover-bg)}:host-context(html.dark){--emr-filter-builder-group-operation-color: var(--color-neutral-200);--emr-filter-builder-group-operation-hover-bg: var(--color-neutral-600);--emr-filter-builder-group-operation-active-bg: var(--color-neutral-650);--emr-filter-builder-group-operation-hover-color: var(--color-neutral-100);--emr-filter-builder-group-operation-active-color: var(--color-neutral-50)}\n/*! tailwindcss v4.1.14 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: MenuOptionGroupDirective, selector: "[emrMenuOptionGroup]", outputs: ["valueChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: AutoFocusDirective, selector: "[emrAutoFocus]", exportAs: ["emrAutoFocus"] }, { kind: "directive", type: FocusElementDirective, selector: "[emrFocusElement]", inputs: ["checkChildren"], outputs: ["elementFocused", "elementBlurred"], exportAs: ["emrFocusElement"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: FilterBuilderOperationDefDirective, selector: "[emrFilterBuilderOperationDef]", inputs: ["emrFilterBuilderOperationDef", "allowedDataTypes"] }, { kind: "directive", type: FilterBuilderOperationNameDirective, selector: "[emrFilterBuilderOperationName]" }] });
|
|
304
|
+
}
|
|
305
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderComponent, decorators: [{
|
|
306
|
+
type: Component,
|
|
307
|
+
args: [{ selector: 'emr-filter-builder', exportAs: 'emrFilterBuilder', imports: [
|
|
308
|
+
MatIcon,
|
|
309
|
+
MatMenuTrigger,
|
|
310
|
+
MatMenu,
|
|
311
|
+
MenuOptionGroupDirective,
|
|
312
|
+
FormsModule,
|
|
313
|
+
MatOption,
|
|
314
|
+
MatMenuItem,
|
|
315
|
+
NgTemplateOutlet,
|
|
316
|
+
MatFormField,
|
|
317
|
+
MatSelect,
|
|
318
|
+
AutoFocusDirective,
|
|
319
|
+
FocusElementDirective,
|
|
320
|
+
MatInput,
|
|
321
|
+
FilterBuilderOperationDefDirective,
|
|
322
|
+
FilterBuilderOperationNameDirective
|
|
323
|
+
], host: {
|
|
324
|
+
'class': 'emr-filter-builder'
|
|
325
|
+
}, template: "@if (_isServer) {\r\n <ng-content/>\r\n}\r\n\r\n<ng-template #itemsTpl let-items>\r\n <div class=\"group\">\r\n @for (item of items; track item; let index = $index) {\r\n @if (_isGroup(item)) {\r\n <div class=\"flex items-center group-operations\">\r\n <div class=\"remove\" (click)=\"removeCondition(index, items)\">\r\n <mat-icon class=\"font-icon\">close</mat-icon>\r\n </div>\r\n <button [matMenuTriggerFor]=\"nestedGroupOperationsMenu\" class=\"group-operation\">\r\n {{ getSelectedGroupOperationName(item) }}\r\n </button>\r\n <div [matMenuTriggerFor]=\"addGroupMenu\" class=\"add\">\r\n <mat-icon class=\"font-icon\">add</mat-icon>\r\n </div>\r\n <mat-menu #nestedGroupOperationsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"item['logicalOperator']\">\r\n @for (groupOperation of groupOperations(); track groupOperation.id) {\r\n <mat-option [value]=\"groupOperation.id\">{{ groupOperation.name }}</mat-option>\r\n }\r\n </div>\r\n </mat-menu>\r\n <mat-menu #addGroupMenu>\r\n <button mat-menu-item (click)=\"addCondition(item)\">Add Condition</button>\r\n <button mat-menu-item (click)=\"addGroup(item)\">Add Group</button>\r\n </mat-menu>\r\n </div>\r\n @if (item['value'].length > 0) {\r\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" [ngTemplateOutletContext]=\"{ $implicit: item['value'] }\"></ng-container>\r\n }\r\n } @else if (_isCondition(item)) {\r\n <div class=\"condition\">\r\n <div class=\"remove\" (click)=\"removeCondition(index, items)\">\r\n <mat-icon class=\"font-icon\">close</mat-icon>\r\n </div>\r\n <button class=\"condition-field\"\r\n [matMenuTriggerFor]=\"fieldsMenu\">{{ getConditionField(item['value'][0])?.name }}</button>\r\n <button class=\"condition-operation\"\r\n [matMenuTriggerFor]=\"operationsMenu\">\r\n <ng-template [ngTemplateOutlet]=\"getConditionOperation(item['value'][1])?.name\"></ng-template>\r\n </button>\r\n <div class=\"relative\">\r\n @if (editItem && editItem === item) {\r\n <div class=\"absolute start-0 top-0 -translate-y-1/2\">\r\n @switch (getFieldType(editItem)) {\r\n @case ('array') {\r\n @switch (editItem['value'][1]) {\r\n @case ('equals') {\r\n <mat-form-field class=\"form-field\">\r\n <mat-select placeholder=\"Select...\"\r\n emrAutoFocus\r\n (blur)=\"selectBlur($event)\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n @for (option of getOptions(editItem); track option.id) {\r\n <mat-option [value]=\"option.id\">{{ option.name }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n\r\n @case ('isAnyOf') {\r\n <mat-form-field class=\"form-field\">\r\n <mat-select placeholder=\"Select...\" multiple\r\n emrAutoFocus\r\n (blur)=\"selectBlur($event)\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (closed)=\"selectClosed()\">\r\n @for (option of getOptions(editItem); track option.id) {\r\n <mat-option [value]=\"option.id\">{{ option.name }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n }\r\n }\r\n\r\n @case ('number') {\r\n @switch (editItem['value'][1]) {\r\n @case ('isBetween') {\r\n <div class=\"flex gap-2 items-center\"\r\n emrFocusElement (elementBlurred)=\"cancelEdit()\">\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput emrAutoFocus\r\n [(ngModel)]=\"item['value'][2][0]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n <div class=\"text-neutral-500\">–</div>\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput\r\n [(ngModel)]=\"item['value'][2][1]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n </div>\r\n }\r\n @default {\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput emrAutoFocus\r\n (blur)=\"cancelEdit()\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n }\r\n }\r\n }\r\n\r\n @default {\r\n <mat-form-field class=\"form-field\">\r\n <input type=\"text\" matInput emrAutoFocus\r\n (blur)=\"cancelEdit()\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n @if (item['value'][1] !== 'isBlank' && item['value'][1] !== 'isNotBlank') {\r\n @if (isValueNotEmpty(item)) {\r\n @if (getFieldType(item) === 'array') {\r\n @if (item['value'][1] === 'equals') {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n {{ getDataSourceItemNameById(item, item['value'][2]) }}\r\n </button>\r\n } @else {\r\n <button class=\"condition-value flex items-center gap-2\" (click)=\"modifyValue(item)\">\r\n @for (dataSourceItemId of item['value'][2]; track dataSourceItemId; let last = $last) {\r\n <span>{{ getDataSourceItemNameById(item, dataSourceItemId) }}</span>\r\n @if (!last) {\r\n <span class=\"text-neutral-500\">|</span>\r\n }\r\n }\r\n </button>\r\n }\r\n } @else {\r\n @if (item['value'][1] === 'isBetween') {\r\n <button class=\"condition-value flex items-center gap-2\" (click)=\"modifyValue(item)\">\r\n <span>{{ item['value'][2][0] }}</span>\r\n <span class=\"text-neutral-500\">–</span>\r\n <span>{{ item['value'][2][1] }}</span>\r\n </button>\r\n } @else {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n <span>{{ item['value'][2] }}</span>\r\n </button>\r\n }\r\n }\r\n } @else {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n <span i18n><enter a value></span>\r\n </button>\r\n }\r\n }\r\n }\r\n </div>\r\n </div>\r\n <mat-menu #fieldsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"item['value'][0]\">\r\n @for (fieldDef of fieldDefs(); track fieldDef) {\r\n <mat-option [value]=\"fieldDef.dataField\"\r\n (click)=\"selectConditionField(item, fieldDef)\">{{ fieldDef.name }}</mat-option>\r\n }\r\n </div>\r\n </mat-menu>\r\n <mat-menu #operationsMenu>\r\n <div emrMenuOptionGroup [ngModel]=\"item['value'][1]\">\r\n @for (operation of _operationDefs; track operation.id()) {\r\n <div [hidden]=\"!isOperationAllowedForCondition(item['value'][0], operation.id())\">\r\n <mat-option [value]=\"operation.id()\" (click)=\"operationChanged(item, operation.id())\">\r\n <div class=\"flex items-center gap-3\">\r\n @if (operation.operationIcon()) {\r\n <ng-template [ngTemplateOutlet]=\"operationIconTemplateRef(operation)\"></ng-template>\r\n }\r\n <div>\r\n <ng-template [ngTemplateOutlet]=\"operationNameTemplateRef(operation)\"></ng-template>\r\n </div>\r\n </div>\r\n </mat-option>\r\n </div>\r\n }\r\n </div>\r\n </mat-menu>\r\n }\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"group\">\r\n <div class=\"flex items-center group-operations\">\r\n <button [matMenuTriggerFor]=\"groupOperationsMenu\" class=\"group-operation\">\r\n {{ getSelectedGroupOperationName() }}\r\n </button>\r\n <div [matMenuTriggerFor]=\"addMenu\" class=\"add\">\r\n <mat-icon class=\"font-icon\">add</mat-icon>\r\n </div>\r\n </div>\r\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" [ngTemplateOutletContext]=\"{ $implicit: _value }\"></ng-container>\r\n</div>\r\n\r\n<mat-menu #groupOperationsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"_logicalOperator\" (ngModelChange)=\"_emitChangeEvent()\">\r\n @for (groupOperation of groupOperations(); track groupOperation.id) {\r\n <mat-option [value]=\"groupOperation.id\">{{ groupOperation.name }}</mat-option>\r\n }\r\n </div>\r\n</mat-menu>\r\n<mat-menu #addMenu>\r\n <button mat-menu-item (click)=\"addCondition()\">Add Condition</button>\r\n <button mat-menu-item (click)=\"addGroup()\">Add Group</button>\r\n</mat-menu>\r\n\r\n<ng-container emrFilterBuilderOperationDef=\"contains\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Contains</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"doesNotContain\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Does not contain</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"startsWith\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Starts with</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"endsWith\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Ends with</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"equals\" [allowedDataTypes]=\"['string', 'number', 'array', 'boolean']\">\r\n <ng-template emrFilterBuilderOperationName>Equals</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"notEquals\" [allowedDataTypes]=\"['string', 'number', 'boolean']\">\r\n <ng-template emrFilterBuilderOperationName>Not equals</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isLessThen\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is less then</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isLessThenOrEqual\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is less then or equal to</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isGreaterThen\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is greater then</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isGreaterThenOrEqual\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is greater then or equal to</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isBlank\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Is blank</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isNotBlank\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Is not blank</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isBetween\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is between</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isAnyOf\" [allowedDataTypes]=\"['array']\">\r\n <ng-template emrFilterBuilderOperationName>Is any of</ng-template>\r\n</ng-container>\r\n", styles: [":host{--emr-filter-builder-group-operations-gap: calc(var(--spacing) * 2);--emr-filter-builder-group-operation-font-size: var(--text-tiny);--emr-filter-builder-group-operation-color: var(--color-neutral-800);--emr-filter-builder-group-operation-bg: transparent;--emr-filter-builder-group-operation-font-weight: 400;--emr-filter-builder-group-operation-border-radius: .5rem;--emr-filter-builder-group-operation-bpadding: 0 calc(var(--spacing) * 2);--emr-filter-builder-group-operation-height: calc(var(--spacing) * 7);--emr-filter-builder-group-operation-hover-color: var(--color-neutral-800);--emr-filter-builder-group-operation-hover-bg: var(--color-neutral-200);--emr-filter-builder-group-operation-active-color: var(--color-neutral-900);--emr-filter-builder-group-operation-active-bg: var(--color-neutral-300);--emr-filter-builder-group-operation-border: 1px solid var(--color-neutral-500);--emr-filter-builder-group-add-color: var(--color-primary);--emr-filter-builder-group-add-hover-color: var(--color-primary);--emr-filter-builder-group-margin: 0;--emr-filter-builder-group-padding: 0;--emr-filter-builder-group-gap: calc(var(--spacing) * 4);--emr-filter-builder-condition-gap: calc(var(--spacing) * 2);--emr-filter-builder-condition-field-height: calc(var(--spacing) * 7);--emr-filter-builder-condition-field-font-size: var(--text-tiny);--emr-filter-builder-condition-field-color: var(--color-neutral-800);--emr-filter-builder-condition-field-bg: var(--color-primary-300);--emr-filter-builder-condition-field-font-weight: 400;--emr-filter-builder-condition-field-border-radius: .5rem;--emr-filter-builder-condition-field-bpadding: calc(var(--spacing) * .5) calc(var(--spacing) * 2);--emr-filter-builder-condition-field-hover-color: var(--color-neutral-800);--emr-filter-builder-condition-field-hover-bg: var(--color-primary-400);--emr-filter-builder-condition-field-active-color: white;--emr-filter-builder-condition-field-active-bg: var(--color-primary-500);--emr-filter-builder-condition-operation-height: calc(var(--spacing) * 7);--emr-filter-builder-condition-operation-font-size: var(--text-tiny);--emr-filter-builder-condition-operation-color: var(--color-neutral-800);--emr-filter-builder-condition-operation-bg: var(--color-tertiary-300);--emr-filter-builder-condition-operation-font-weight: 400;--emr-filter-builder-condition-operation-border-radius: .5rem;--emr-filter-builder-condition-operation-bpadding: calc(var(--spacing) * .5) calc(var(--spacing) * 2);--emr-filter-builder-condition-operation-hover-color: var(--color-neutral-800);--emr-filter-builder-condition-operation-hover-bg: var(--color-tertiary-400);--emr-filter-builder-condition-operation-active-color: white;--emr-filter-builder-condition-operation-active-bg: var(--color-tertiary-500);--emr-filter-builder-condition-value-height: calc(var(--spacing) * 7);--emr-filter-builder-condition-value-font-size: var(--text-tiny);--emr-filter-builder-condition-value-color: var(--color-neutral-800);--emr-filter-builder-condition-value-bg: var(--color-neutral-200);--emr-filter-builder-condition-value-font-weight: 400;--emr-filter-builder-condition-value-border-radius: .5rem;--emr-filter-builder-condition-value-bpadding: calc(var(--spacing) * .5) calc(var(--spacing) * 2);--emr-filter-builder-condition-value-hover-color: var(--color-neutral-800);--emr-filter-builder-condition-value-hover-bg: var(--color-neutral-300);--emr-filter-builder-condition-remove-color: oklch(63.7% .237 25.331);--emr-filter-builder-condition-remove-hover-color: oklch(57.7% .245 27.325);display:block}:host ::ng-deep .mat-mdc-form-field-infix{--mat-form-field-container-height: 46px !important;--mat-form-field-container-vertical-padding: 12px !important}:host ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}:host .form-field{width:200px}:host .form-field-number{width:140px}:host .group-operations{gap:var(--emr-filter-builder-group-operations-gap)}:host .group{margin:var(--emr-filter-builder-group-margin);padding:var(--emr-filter-builder-group-padding);display:flex;flex-direction:column;gap:var(--emr-filter-builder-group-gap)}:host .group .group{margin-left:calc(var(--spacing) * 4)}:host .icon:empty{display:none}:host .group-operation{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-group-operation-height);font-size:var(--emr-filter-builder-group-operation-font-size);font-weight:var(--emr-filter-builder-group-operation-font-weight);color:var(--emr-filter-builder-group-operation-color);background:var(--emr-filter-builder-group-operation-bg);border:var(--emr-filter-builder-group-operation-border);border-radius:var(--emr-filter-builder-group-operation-border-radius);padding:var(--emr-filter-builder-group-operation-bpadding)}:host .group-operation:hover{color:var(--emr-filter-builder-group-operation-hover-color);background:var(--emr-filter-builder-group-operation-hover-bg)}:host .group-operation:active,:host .group-operation.active{color:var(--emr-filter-builder-group-operation-active-color);background:var(--emr-filter-builder-group-operation-active-bg)}:host .condition{display:flex;align-items:center;gap:var(--emr-filter-builder-condition-gap)}:host .condition-field{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-condition-field-height);font-size:var(--emr-filter-builder-condition-field-font-size);font-weight:var(--emr-filter-builder-condition-field-font-weight);color:var(--emr-filter-builder-condition-field-color);background:var(--emr-filter-builder-condition-field-bg);border-radius:var(--emr-filter-builder-condition-field-border-radius);padding:var(--emr-filter-builder-condition-field-bpadding)}:host .condition-field:hover{color:var(--emr-filter-builder-condition-field-hover-color);background:var(--emr-filter-builder-condition-field-hover-bg)}:host .add{line-height:0;color:var(--emr-filter-builder-group-add-color);cursor:pointer}:host .add:hover{color:var(--emr-filter-builder-group-add-hover-color)}:host .remove{line-height:0;color:var(--emr-filter-builder-condition-remove-color);cursor:pointer}:host .remove:hover{color:var(--emr-filter-builder-condition-remove-hover-color)}:host .condition-field:active,:host .condition-field.active{color:var(--emr-filter-builder-condition-field-active-color);background:var(--emr-filter-builder-condition-field-active-bg)}:host .condition-operation{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-condition-operation-height);font-size:var(--emr-filter-builder-condition-operation-font-size);font-weight:var(--emr-filter-builder-condition-operation-font-weight);color:var(--emr-filter-builder-condition-operation-color);background:var(--emr-filter-builder-condition-operation-bg);border-radius:var(--emr-filter-builder-condition-operation-border-radius);padding:var(--emr-filter-builder-condition-operation-bpadding)}:host .condition-operation:hover{color:var(--emr-filter-builder-condition-operation-hover-color);background:var(--emr-filter-builder-condition-operation-hover-bg)}:host .condition-operation:active,:host .condition-operation.active{color:var(--emr-filter-builder-condition-operation-active-color);background:var(--emr-filter-builder-condition-operation-active-bg)}:host .condition-value{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-condition-value-height);font-size:var(--emr-filter-builder-condition-value-font-size);font-weight:var(--emr-filter-builder-condition-value-font-weight);color:var(--emr-filter-builder-condition-value-color);background:var(--emr-filter-builder-condition-value-bg);border-radius:var(--emr-filter-builder-condition-value-border-radius);padding:var(--emr-filter-builder-condition-value-bpadding)}:host .condition-value:hover{color:var(--emr-filter-builder-condition-value-hover-color);background:var(--emr-filter-builder-condition-value-hover-bg)}:host-context(html.dark){--emr-filter-builder-group-operation-color: var(--color-neutral-200);--emr-filter-builder-group-operation-hover-bg: var(--color-neutral-600);--emr-filter-builder-group-operation-active-bg: var(--color-neutral-650);--emr-filter-builder-group-operation-hover-color: var(--color-neutral-100);--emr-filter-builder-group-operation-active-color: var(--color-neutral-50)}\n/*! tailwindcss v4.1.14 | MIT License | https://tailwindcss.com */\n"] }]
|
|
326
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], fieldDefs: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldDefs", required: false }] }], categories: [{ type: i0.Input, args: [{ isSignal: true, alias: "categories", required: false }] }], groupOperations: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupOperations", required: false }] }], customOperations: [{ type: i0.Input, args: [{ isSignal: true, alias: "customOperations", required: false }] }], _prebuiltOperationDefs: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => FilterBuilderOperationDefDirective), { isSignal: true }] }], _customOperationDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FilterBuilderOperationDefDirective), { isSignal: true }] }], valueChanged: [{ type: i0.Output, args: ["valueChanged"] }] } });
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Generated bundle index. Do not edit.
|
|
330
|
+
*/
|
|
331
|
+
|
|
332
|
+
export { FilterBuilderComponent, FilterBuilderOperationDefDirective, FilterBuilderOperationIconDirective, FilterBuilderOperationNameDirective };
|
|
333
|
+
//# sourceMappingURL=elementar-rt-components-filter-builder.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elementar-rt-components-filter-builder.mjs","sources":["../../../projects/components/filter-builder/src/filter-builder-operation-name.directive.ts","../../../projects/components/filter-builder/src/filter-builder-operation-icon.directive.ts","../../../projects/components/filter-builder/src/filter-builder-operation-def.directive.ts","../../../projects/components/filter-builder/src/filter-builder/filter-builder.component.ts","../../../projects/components/filter-builder/src/filter-builder/filter-builder.component.html","../../../projects/components/filter-builder/elementar-rt-components-filter-builder.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[emrFilterBuilderOperationName]'\r\n})\r\nexport class FilterBuilderOperationNameDirective {\r\n readonly templateRef = inject(TemplateRef);\r\n}\r\n","import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[emrFilterBuilderOperationIcon]'\r\n})\r\nexport class FilterBuilderOperationIconDirective {\r\n readonly templateRef = inject(TemplateRef);\r\n}\r\n","import { Directive, contentChild, input } from '@angular/core';\r\nimport { FilterBuilderOperationNameDirective } from './filter-builder-operation-name.directive';\r\nimport { FilterBuilderOperationIconDirective } from './filter-builder-operation-icon.directive';\r\n\r\n@Directive({\r\n selector: '[emrFilterBuilderOperationDef]'\r\n})\r\nexport class FilterBuilderOperationDefDirective {\r\n id = input('', {\r\n alias: 'emrFilterBuilderOperationDef'\r\n });\r\n allowedDataTypes = input<string[]>([]);\r\n readonly operationName = contentChild(FilterBuilderOperationNameDirective);\r\n readonly operationIcon = contentChild(FilterBuilderOperationIconDirective);\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n inject,\r\n Input,\r\n OnInit,\r\n output,\r\n PLATFORM_ID,\r\n viewChildren,\r\n contentChildren, TemplateRef, input\r\n} from '@angular/core';\r\nimport { isPlatformServer, NgTemplateOutlet } from '@angular/common';\r\nimport { FilterBuilderOperationDefDirective } from '../filter-builder-operation-def.directive';\r\nimport {\r\n FilterBuilderCondition,\r\n FilterBuilderFieldDataSourceItem,\r\n FilterBuilderFieldDef,\r\n FilterBuilderGroup,\r\n FilterBuilderItemType\r\n} from '../types';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatOption } from '@angular/material/autocomplete';\r\nimport { MatFormField, MatInput } from '@angular/material/input';\r\nimport { MatSelect } from '@angular/material/select';\r\nimport { FilterBuilderOperationNameDirective } from '../filter-builder-operation-name.directive';\r\nimport { AutoFocusDirective, FocusElementDirective, MenuOptionGroupDirective } from '@elementar-rt/components/core';\r\n\r\n@Component({\r\n selector: 'emr-filter-builder',\r\n exportAs: 'emrFilterBuilder',\r\n imports: [\r\n MatIcon,\r\n MatMenuTrigger,\r\n MatMenu,\r\n MenuOptionGroupDirective,\r\n FormsModule,\r\n MatOption,\r\n MatMenuItem,\r\n NgTemplateOutlet,\r\n MatFormField,\r\n MatSelect,\r\n AutoFocusDirective,\r\n FocusElementDirective,\r\n MatInput,\r\n FilterBuilderOperationDefDirective,\r\n FilterBuilderOperationNameDirective\r\n ],\r\n templateUrl: './filter-builder.component.html',\r\n styleUrl: './filter-builder.component.scss',\r\n host: {\r\n 'class': 'emr-filter-builder'\r\n },\r\n})\r\nexport class FilterBuilderComponent implements OnInit, AfterViewInit {\r\n protected _cdr = inject(ChangeDetectorRef);\r\n protected _platformId = inject(PLATFORM_ID);\r\n protected _isServer = isPlatformServer(this._platformId);\r\n protected _operationAllowedTypesMap: Map<string, string[]> = new Map();\r\n private _resetMethodMap: { [prop: string]: (condition: FilterBuilderCondition) => void } = {\r\n '_resetStringValue': this._resetStringValue,\r\n '_resetBooleanValue': this._resetBooleanValue,\r\n '_resetArrayValue': this._resetArrayValue,\r\n '_resetNumberValue': this._resetNumberValue,\r\n };\r\n\r\n value = input<FilterBuilderGroup[]>([]);\r\n fieldDefs = input<FilterBuilderFieldDef[]>([]);\r\n categories = input([]);\r\n groupOperations = input([\r\n {\r\n id: 'and',\r\n name: 'And'\r\n },\r\n {\r\n id: 'or',\r\n name: 'Or'\r\n }\r\n ]);\r\n customOperations = input([]);\r\n\r\n protected _logicalOperator = this.groupOperations()[0].id;\r\n readonly _prebuiltOperationDefs = viewChildren(FilterBuilderOperationDefDirective);\r\n readonly _customOperationDefs = contentChildren(FilterBuilderOperationDefDirective);\r\n protected _operationDefs: FilterBuilderOperationDefDirective[] = [];\r\n\r\n readonly valueChanged = output<FilterBuilderGroup[]>();\r\n\r\n protected _value: FilterBuilderGroup[] = [];\r\n protected _operations: any[] = [];\r\n protected editItem: FilterBuilderCondition | undefined;\r\n\r\n ngOnInit() {\r\n if (this.value().length) {\r\n if (!this._isGroup(this.value()[0])) {\r\n throw new Error('Invalid filter value, first element should be a filter group');\r\n }\r\n\r\n this._logicalOperator = this.value()[0]['logicalOperator'] as string;\r\n this._value = JSON.parse(JSON.stringify(this.value()[0]['value']));\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this._operationDefs = [...this._prebuiltOperationDefs(), ...this._customOperationDefs()];\r\n this._operationDefs.forEach(operationDef => {\r\n this._operations.push({\r\n id: operationDef.id(),\r\n name: operationDef.operationName()?.templateRef\r\n });\r\n operationDef.allowedDataTypes().forEach((allowedType: string) => {\r\n if (!this._operationAllowedTypesMap.has(allowedType)) {\r\n this._operationAllowedTypesMap.set(allowedType, []);\r\n }\r\n\r\n const allowedTypeValue = this._operationAllowedTypesMap.get(allowedType) as string[];\r\n allowedTypeValue.push(operationDef.id());\r\n this._operationAllowedTypesMap.set(allowedType, allowedTypeValue);\r\n });\r\n });\r\n this._cdr.detectChanges();\r\n }\r\n\r\n addCondition(targetGroup?: FilterBuilderGroup) {\r\n const value = !targetGroup ? this._value : targetGroup.value;\r\n value.push(\r\n {\r\n value: [this.fieldDefs()[0].dataField, this._operations[0].id, '']\r\n }\r\n );\r\n }\r\n\r\n addGroup(targetGroup?: FilterBuilderGroup) {\r\n const value = !targetGroup ? this._value : targetGroup.value;\r\n value.push(\r\n {\r\n logicalOperator: this.groupOperations()[0].id,\r\n value: []\r\n }\r\n );\r\n }\r\n\r\n getConditionField(dataField: string): FilterBuilderFieldDef | undefined {\r\n return this.fieldDefs().find(field => field.dataField === dataField);\r\n }\r\n\r\n getConditionOperation(id: string) {\r\n return this._operations.find(operation => operation.id === id);\r\n }\r\n\r\n getSelectedGroupOperationName(targetGroup?: FilterBuilderGroup): string {\r\n const groupLogicalOperatorId = targetGroup ? targetGroup.logicalOperator : this._logicalOperator\r\n return this.groupOperations().find(groupOperator => groupOperator.id === groupLogicalOperatorId)?.name || '';\r\n }\r\n\r\n selectConditionField(item: FilterBuilderCondition, field: FilterBuilderFieldDef): void {\r\n this.editItem = undefined;\r\n let allowedTypes = this._operationAllowedTypesMap.get(field.dataType) as string[];\r\n item['value'][1] = allowedTypes[0];\r\n this._resetValue(field, item);\r\n this._emitChangeEvent();\r\n }\r\n\r\n operationChanged(item: FilterBuilderCondition, operation: string): void {\r\n this.editItem = undefined;\r\n const oldOperation = item['value'][1];\r\n\r\n if (oldOperation === 'equals' && operation === 'isAnyOf') {\r\n item['value'][2] = [];\r\n } else if (oldOperation === 'isAnyOf' && operation === 'equals') {\r\n item['value'][2] = null;\r\n }\r\n\r\n if (oldOperation === 'isBetween' && operation !== 'isBetween') {\r\n item['value'][2] = null;\r\n } else if (oldOperation !== 'isBetween' && operation === 'isBetween') {\r\n item['value'][2] = [];\r\n }\r\n\r\n if (['isNotBlank', 'isBlank'].includes(operation)) {\r\n item['value'][2] = null;\r\n }\r\n\r\n item['value'][1] = operation;\r\n this._emitChangeEvent();\r\n }\r\n\r\n removeCondition(index: number, items: FilterBuilderItemType[]): void {\r\n items.splice(index, 1);\r\n this._emitChangeEvent();\r\n }\r\n\r\n isOperationAllowedForCondition(dataField: string, operationId: string): boolean {\r\n const fieldDef = this.fieldDefs().find(f =>\r\n f.dataField === dataField\r\n ) as FilterBuilderFieldDef;\r\n\r\n let allowedTypes = this._operationAllowedTypesMap.get(fieldDef.dataType);\r\n\r\n if (!allowedTypes) {\r\n throw new Error('There are not operations for the datatype: ' + fieldDef.dataType);\r\n }\r\n\r\n return allowedTypes.includes(operationId);\r\n }\r\n\r\n modifyValue(item: FilterBuilderCondition): void {\r\n this.editItem = item;\r\n }\r\n\r\n getFieldType(item: FilterBuilderCondition): string {\r\n return (this.fieldDefs().find(f =>\r\n f.dataField === item['value'][0]\r\n ) as FilterBuilderFieldDef).dataType;\r\n }\r\n\r\n isValueNotEmpty(item: FilterBuilderCondition): boolean {\r\n if (this.getFieldType(item) === 'array') {\r\n if (item['value'][1] === 'equals') {\r\n return item['value'][2] !== null && item['value'][2] !== '';\r\n } else {\r\n return item['value'][2].length > 0;\r\n }\r\n }\r\n\r\n if (item['value'][1] === 'isBetween') {\r\n return item['value'][2].length === 2 && item['value'][2][0] !== null && item['value'][2][1] !== null;\r\n }\r\n\r\n return item['value'][2] !== null && item['value'][2] !== '';\r\n }\r\n\r\n cancelEdit(delay = 0): void {\r\n setTimeout(() => {\r\n this.editItem = undefined;\r\n this._cdr.detectChanges();\r\n }, delay);\r\n }\r\n\r\n getOptions(item: FilterBuilderCondition): FilterBuilderFieldDataSourceItem[] {\r\n const fieldDef = this._getFieldDef(item);\r\n return fieldDef.lookup?.dataSource as FilterBuilderFieldDataSourceItem[];\r\n }\r\n\r\n getDataSourceItemNameById(item: FilterBuilderCondition, dataSourceItemId: string): string {\r\n const fieldDef = this._getFieldDef(item);\r\n return (fieldDef.lookup?.dataSource as FilterBuilderFieldDataSourceItem[]).find(\r\n item => item.id === dataSourceItemId\r\n )?.name || '';\r\n }\r\n\r\n selectBlur(event: FocusEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const select = event.target as HTMLElement;\r\n\r\n setTimeout(() => {\r\n const formField = select.closest('.mat-mdc-form-field');\r\n\r\n if (formField) {\r\n if (!formField.classList.contains('mat-focused')) {\r\n this.cancelEdit();\r\n }\r\n }\r\n }, 25);\r\n }\r\n\r\n selectClosed(): void {\r\n this.cancelEdit();\r\n this._emitChangeEvent();\r\n }\r\n\r\n protected operationIconTemplateRef(operation: FilterBuilderOperationDefDirective): TemplateRef<any> {\r\n return operation.operationIcon()?.templateRef as TemplateRef<any>;\r\n }\r\n\r\n protected operationNameTemplateRef(operation: FilterBuilderOperationDefDirective): TemplateRef<any> {\r\n return operation.operationName()?.templateRef as TemplateRef<any>;\r\n }\r\n\r\n protected _isGroup(item: FilterBuilderItemType): item is FilterBuilderGroup {\r\n return 'logicalOperator' in item;\r\n }\r\n\r\n protected _isCondition(item: FilterBuilderItemType): item is FilterBuilderCondition {\r\n return !('logicalOperator' in item);\r\n }\r\n\r\n protected _emitChangeEvent(): void {\r\n const value = this._normalizeValue(this._value);\r\n\r\n if (value.length > 0) {\r\n this.valueChanged.emit([\r\n {\r\n logicalOperator: this._logicalOperator,\r\n value: value\r\n }\r\n ]);\r\n } else {\r\n this.valueChanged.emit([]);\r\n }\r\n }\r\n\r\n private _getFieldDef(condition: FilterBuilderCondition): FilterBuilderFieldDef {\r\n return this.fieldDefs().find(f =>\r\n f.dataField === condition['value'][0]\r\n ) as FilterBuilderFieldDef;\r\n }\r\n\r\n private _resetValue(field: FilterBuilderFieldDef, condition: FilterBuilderCondition): void {\r\n const fieldDef = this.fieldDefs().find(f =>\r\n f.dataField === field.dataField\r\n ) as FilterBuilderFieldDef;\r\n const resetMethod = '_reset' + this._capitalizeFirstLetter(fieldDef.dataType) + 'Value';\r\n this._resetMethodMap[resetMethod](condition);\r\n }\r\n\r\n private _resetStringValue(condition: FilterBuilderCondition): void {\r\n condition['value'][2] = '';\r\n }\r\n\r\n private _resetNumberValue(condition: FilterBuilderCondition): void {\r\n condition['value'][2] = null;\r\n }\r\n\r\n private _resetArrayValue(condition: FilterBuilderCondition): void {\r\n if (condition['value'][1] === 'equals') {\r\n condition['value'][2] = null;\r\n } else {\r\n condition['value'][2] = [];\r\n }\r\n }\r\n\r\n private _resetBooleanValue(condition: FilterBuilderCondition): void {\r\n condition['value'][2] = false;\r\n }\r\n\r\n private _capitalizeFirstLetter(value: string) {\r\n return value.charAt(0).toUpperCase() + value.slice(1);\r\n }\r\n\r\n private _normalizeValue(value: FilterBuilderItemType[]): FilterBuilderItemType[] {\r\n let result: FilterBuilderItemType[] = [];\r\n value.forEach(item => {\r\n if (this._isGroup(item)) {\r\n const groupValue = this._normalizeValue(item.value);\r\n\r\n if (groupValue.length > 0) {\r\n result = [...result, {\r\n logicalOperator: item.logicalOperator,\r\n value: groupValue\r\n }];\r\n }\r\n } else {\r\n if (this.isValueNotEmpty(item)) {\r\n result.push(item);\r\n }\r\n }\r\n });\r\n return result;\r\n }\r\n}\r\n","@if (_isServer) {\r\n <ng-content/>\r\n}\r\n\r\n<ng-template #itemsTpl let-items>\r\n <div class=\"group\">\r\n @for (item of items; track item; let index = $index) {\r\n @if (_isGroup(item)) {\r\n <div class=\"flex items-center group-operations\">\r\n <div class=\"remove\" (click)=\"removeCondition(index, items)\">\r\n <mat-icon class=\"font-icon\">close</mat-icon>\r\n </div>\r\n <button [matMenuTriggerFor]=\"nestedGroupOperationsMenu\" class=\"group-operation\">\r\n {{ getSelectedGroupOperationName(item) }}\r\n </button>\r\n <div [matMenuTriggerFor]=\"addGroupMenu\" class=\"add\">\r\n <mat-icon class=\"font-icon\">add</mat-icon>\r\n </div>\r\n <mat-menu #nestedGroupOperationsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"item['logicalOperator']\">\r\n @for (groupOperation of groupOperations(); track groupOperation.id) {\r\n <mat-option [value]=\"groupOperation.id\">{{ groupOperation.name }}</mat-option>\r\n }\r\n </div>\r\n </mat-menu>\r\n <mat-menu #addGroupMenu>\r\n <button mat-menu-item (click)=\"addCondition(item)\">Add Condition</button>\r\n <button mat-menu-item (click)=\"addGroup(item)\">Add Group</button>\r\n </mat-menu>\r\n </div>\r\n @if (item['value'].length > 0) {\r\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" [ngTemplateOutletContext]=\"{ $implicit: item['value'] }\"></ng-container>\r\n }\r\n } @else if (_isCondition(item)) {\r\n <div class=\"condition\">\r\n <div class=\"remove\" (click)=\"removeCondition(index, items)\">\r\n <mat-icon class=\"font-icon\">close</mat-icon>\r\n </div>\r\n <button class=\"condition-field\"\r\n [matMenuTriggerFor]=\"fieldsMenu\">{{ getConditionField(item['value'][0])?.name }}</button>\r\n <button class=\"condition-operation\"\r\n [matMenuTriggerFor]=\"operationsMenu\">\r\n <ng-template [ngTemplateOutlet]=\"getConditionOperation(item['value'][1])?.name\"></ng-template>\r\n </button>\r\n <div class=\"relative\">\r\n @if (editItem && editItem === item) {\r\n <div class=\"absolute start-0 top-0 -translate-y-1/2\">\r\n @switch (getFieldType(editItem)) {\r\n @case ('array') {\r\n @switch (editItem['value'][1]) {\r\n @case ('equals') {\r\n <mat-form-field class=\"form-field\">\r\n <mat-select placeholder=\"Select...\"\r\n emrAutoFocus\r\n (blur)=\"selectBlur($event)\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n @for (option of getOptions(editItem); track option.id) {\r\n <mat-option [value]=\"option.id\">{{ option.name }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n\r\n @case ('isAnyOf') {\r\n <mat-form-field class=\"form-field\">\r\n <mat-select placeholder=\"Select...\" multiple\r\n emrAutoFocus\r\n (blur)=\"selectBlur($event)\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (closed)=\"selectClosed()\">\r\n @for (option of getOptions(editItem); track option.id) {\r\n <mat-option [value]=\"option.id\">{{ option.name }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n }\r\n }\r\n\r\n @case ('number') {\r\n @switch (editItem['value'][1]) {\r\n @case ('isBetween') {\r\n <div class=\"flex gap-2 items-center\"\r\n emrFocusElement (elementBlurred)=\"cancelEdit()\">\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput emrAutoFocus\r\n [(ngModel)]=\"item['value'][2][0]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n <div class=\"text-neutral-500\">–</div>\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput\r\n [(ngModel)]=\"item['value'][2][1]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n </div>\r\n }\r\n @default {\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput emrAutoFocus\r\n (blur)=\"cancelEdit()\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n }\r\n }\r\n }\r\n\r\n @default {\r\n <mat-form-field class=\"form-field\">\r\n <input type=\"text\" matInput emrAutoFocus\r\n (blur)=\"cancelEdit()\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n @if (item['value'][1] !== 'isBlank' && item['value'][1] !== 'isNotBlank') {\r\n @if (isValueNotEmpty(item)) {\r\n @if (getFieldType(item) === 'array') {\r\n @if (item['value'][1] === 'equals') {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n {{ getDataSourceItemNameById(item, item['value'][2]) }}\r\n </button>\r\n } @else {\r\n <button class=\"condition-value flex items-center gap-2\" (click)=\"modifyValue(item)\">\r\n @for (dataSourceItemId of item['value'][2]; track dataSourceItemId; let last = $last) {\r\n <span>{{ getDataSourceItemNameById(item, dataSourceItemId) }}</span>\r\n @if (!last) {\r\n <span class=\"text-neutral-500\">|</span>\r\n }\r\n }\r\n </button>\r\n }\r\n } @else {\r\n @if (item['value'][1] === 'isBetween') {\r\n <button class=\"condition-value flex items-center gap-2\" (click)=\"modifyValue(item)\">\r\n <span>{{ item['value'][2][0] }}</span>\r\n <span class=\"text-neutral-500\">–</span>\r\n <span>{{ item['value'][2][1] }}</span>\r\n </button>\r\n } @else {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n <span>{{ item['value'][2] }}</span>\r\n </button>\r\n }\r\n }\r\n } @else {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n <span i18n><enter a value></span>\r\n </button>\r\n }\r\n }\r\n }\r\n </div>\r\n </div>\r\n <mat-menu #fieldsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"item['value'][0]\">\r\n @for (fieldDef of fieldDefs(); track fieldDef) {\r\n <mat-option [value]=\"fieldDef.dataField\"\r\n (click)=\"selectConditionField(item, fieldDef)\">{{ fieldDef.name }}</mat-option>\r\n }\r\n </div>\r\n </mat-menu>\r\n <mat-menu #operationsMenu>\r\n <div emrMenuOptionGroup [ngModel]=\"item['value'][1]\">\r\n @for (operation of _operationDefs; track operation.id()) {\r\n <div [hidden]=\"!isOperationAllowedForCondition(item['value'][0], operation.id())\">\r\n <mat-option [value]=\"operation.id()\" (click)=\"operationChanged(item, operation.id())\">\r\n <div class=\"flex items-center gap-3\">\r\n @if (operation.operationIcon()) {\r\n <ng-template [ngTemplateOutlet]=\"operationIconTemplateRef(operation)\"></ng-template>\r\n }\r\n <div>\r\n <ng-template [ngTemplateOutlet]=\"operationNameTemplateRef(operation)\"></ng-template>\r\n </div>\r\n </div>\r\n </mat-option>\r\n </div>\r\n }\r\n </div>\r\n </mat-menu>\r\n }\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"group\">\r\n <div class=\"flex items-center group-operations\">\r\n <button [matMenuTriggerFor]=\"groupOperationsMenu\" class=\"group-operation\">\r\n {{ getSelectedGroupOperationName() }}\r\n </button>\r\n <div [matMenuTriggerFor]=\"addMenu\" class=\"add\">\r\n <mat-icon class=\"font-icon\">add</mat-icon>\r\n </div>\r\n </div>\r\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" [ngTemplateOutletContext]=\"{ $implicit: _value }\"></ng-container>\r\n</div>\r\n\r\n<mat-menu #groupOperationsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"_logicalOperator\" (ngModelChange)=\"_emitChangeEvent()\">\r\n @for (groupOperation of groupOperations(); track groupOperation.id) {\r\n <mat-option [value]=\"groupOperation.id\">{{ groupOperation.name }}</mat-option>\r\n }\r\n </div>\r\n</mat-menu>\r\n<mat-menu #addMenu>\r\n <button mat-menu-item (click)=\"addCondition()\">Add Condition</button>\r\n <button mat-menu-item (click)=\"addGroup()\">Add Group</button>\r\n</mat-menu>\r\n\r\n<ng-container emrFilterBuilderOperationDef=\"contains\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Contains</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"doesNotContain\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Does not contain</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"startsWith\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Starts with</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"endsWith\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Ends with</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"equals\" [allowedDataTypes]=\"['string', 'number', 'array', 'boolean']\">\r\n <ng-template emrFilterBuilderOperationName>Equals</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"notEquals\" [allowedDataTypes]=\"['string', 'number', 'boolean']\">\r\n <ng-template emrFilterBuilderOperationName>Not equals</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isLessThen\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is less then</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isLessThenOrEqual\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is less then or equal to</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isGreaterThen\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is greater then</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isGreaterThenOrEqual\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is greater then or equal to</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isBlank\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Is blank</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isNotBlank\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Is not blank</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isBetween\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is between</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isAnyOf\" [allowedDataTypes]=\"['array']\">\r\n <ng-template emrFilterBuilderOperationName>Is any of</ng-template>\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|