@memberjunction/ng-base-forms 4.0.0 → 4.2.0
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/dist/lib/base-form-component.d.ts +103 -215
- package/dist/lib/base-form-component.d.ts.map +1 -1
- package/dist/lib/base-form-component.js +384 -541
- package/dist/lib/base-form-component.js.map +1 -1
- package/dist/lib/container/record-form-container.component.d.ts +165 -0
- package/dist/lib/container/record-form-container.component.d.ts.map +1 -0
- package/dist/lib/container/record-form-container.component.js +534 -0
- package/dist/lib/container/record-form-container.component.js.map +1 -0
- package/dist/lib/explorer-entity-data-grid.component.d.ts +7 -5
- package/dist/lib/explorer-entity-data-grid.component.d.ts.map +1 -1
- package/dist/lib/explorer-entity-data-grid.component.js +15 -9
- package/dist/lib/explorer-entity-data-grid.component.js.map +1 -1
- package/dist/lib/field/form-field.component.d.ts +268 -0
- package/dist/lib/field/form-field.component.d.ts.map +1 -0
- package/dist/lib/field/form-field.component.js +1194 -0
- package/dist/lib/field/form-field.component.js.map +1 -0
- package/dist/lib/form-state.interface.d.ts +2 -0
- package/dist/lib/form-state.interface.d.ts.map +1 -1
- package/dist/lib/form-state.interface.js.map +1 -1
- package/dist/lib/form-state.service.d.ts +14 -0
- package/dist/lib/form-state.service.d.ts.map +1 -1
- package/dist/lib/form-state.service.js +19 -0
- package/dist/lib/form-state.service.js.map +1 -1
- package/dist/lib/panel/collapsible-panel.component.d.ts +139 -0
- package/dist/lib/panel/collapsible-panel.component.d.ts.map +1 -0
- package/dist/lib/panel/collapsible-panel.component.js +468 -0
- package/dist/lib/panel/collapsible-panel.component.js.map +1 -0
- package/dist/lib/toolbar/form-toolbar.component.d.ts +170 -0
- package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -0
- package/dist/lib/toolbar/form-toolbar.component.js +830 -0
- package/dist/lib/toolbar/form-toolbar.component.js.map +1 -0
- package/dist/lib/types/form-events.d.ts +90 -0
- package/dist/lib/types/form-events.d.ts.map +1 -0
- package/dist/lib/types/form-events.js +45 -0
- package/dist/lib/types/form-events.js.map +1 -0
- package/dist/lib/types/form-types.d.ts +150 -0
- package/dist/lib/types/form-types.d.ts.map +1 -0
- package/dist/lib/types/form-types.js +12 -0
- package/dist/lib/types/form-types.js.map +1 -0
- package/dist/lib/types/navigation-events.d.ts +88 -0
- package/dist/lib/types/navigation-events.d.ts.map +1 -0
- package/dist/lib/types/navigation-events.js +2 -0
- package/dist/lib/types/navigation-events.js.map +1 -0
- package/dist/lib/types/toolbar-config.d.ts +66 -0
- package/dist/lib/types/toolbar-config.d.ts.map +1 -0
- package/dist/lib/types/toolbar-config.js +38 -0
- package/dist/lib/types/toolbar-config.js.map +1 -0
- package/dist/module.d.ts +28 -20
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +47 -74
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +20 -8
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +24 -9
- package/dist/public-api.js.map +1 -1
- package/package.json +20 -23
- package/README.md +0 -449
- package/dist/lib/base-field-component.d.ts +0 -152
- package/dist/lib/base-field-component.d.ts.map +0 -1
- package/dist/lib/base-field-component.js +0 -669
- package/dist/lib/base-field-component.js.map +0 -1
- package/dist/lib/base-form-context.d.ts +0 -23
- package/dist/lib/base-form-context.d.ts.map +0 -1
- package/dist/lib/base-form-context.js +0 -10
- package/dist/lib/base-form-context.js.map +0 -1
- package/dist/lib/collapsible-panel.component.d.ts +0 -68
- package/dist/lib/collapsible-panel.component.d.ts.map +0 -1
- package/dist/lib/collapsible-panel.component.js +0 -330
- package/dist/lib/collapsible-panel.component.js.map +0 -1
- package/dist/lib/form-section-controls.component.d.ts +0 -35
- package/dist/lib/form-section-controls.component.d.ts.map +0 -1
- package/dist/lib/form-section-controls.component.js +0 -273
- package/dist/lib/form-section-controls.component.js.map +0 -1
- package/dist/lib/link-field.component.d.ts +0 -62
- package/dist/lib/link-field.component.d.ts.map +0 -1
- package/dist/lib/link-field.component.js +0 -392
- package/dist/lib/link-field.component.js.map +0 -1
|
@@ -1,392 +0,0 @@
|
|
|
1
|
-
import { Component, Input, ViewChild } from "@angular/core";
|
|
2
|
-
import { BaseRecordComponent } from "./base-record-component";
|
|
3
|
-
import { CompositeKey, Metadata, RunView } from "@memberjunction/core";
|
|
4
|
-
import { debounceTime, fromEvent } from 'rxjs';
|
|
5
|
-
import { SharedService } from "@memberjunction/ng-shared";
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@memberjunction/ng-shared";
|
|
8
|
-
import * as i2 from "@angular/common";
|
|
9
|
-
import * as i3 from "@angular/forms";
|
|
10
|
-
import * as i4 from "@progress/kendo-angular-buttons";
|
|
11
|
-
import * as i5 from "@progress/kendo-angular-inputs";
|
|
12
|
-
import * as i6 from "@progress/kendo-angular-dropdowns";
|
|
13
|
-
const _c0 = ["inputBox"];
|
|
14
|
-
function MJLinkField_Conditional_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
15
|
-
const _r3 = i0.ɵɵgetCurrentView();
|
|
16
|
-
i0.ɵɵelementStart(0, "button", 6);
|
|
17
|
-
i0.ɵɵlistener("click", function MJLinkField_Conditional_1_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onNewClicked()); });
|
|
18
|
-
i0.ɵɵelement(1, "span", 7);
|
|
19
|
-
i0.ɵɵelementEnd();
|
|
20
|
-
} }
|
|
21
|
-
function MJLinkField_Conditional_1_Conditional_5_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
22
|
-
const _r4 = i0.ɵɵgetCurrentView();
|
|
23
|
-
i0.ɵɵelementStart(0, "li", 8);
|
|
24
|
-
i0.ɵɵlistener("click", function MJLinkField_Conditional_1_Conditional_5_For_2_Template_li_click_0_listener() { const record_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onRecordSelected(record_r5)); });
|
|
25
|
-
i0.ɵɵtext(1);
|
|
26
|
-
i0.ɵɵelementEnd();
|
|
27
|
-
} if (rf & 2) {
|
|
28
|
-
const record_r5 = ctx.$implicit;
|
|
29
|
-
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
30
|
-
i0.ɵɵadvance();
|
|
31
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.GetRecordDisplayString(record_r5), " ");
|
|
32
|
-
} }
|
|
33
|
-
function MJLinkField_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
34
|
-
i0.ɵɵelementStart(0, "ul", 5);
|
|
35
|
-
i0.ɵɵrepeaterCreate(1, MJLinkField_Conditional_1_Conditional_5_For_2_Template, 2, 1, "li", null, i0.ɵɵrepeaterTrackByIdentity);
|
|
36
|
-
i0.ɵɵelementEnd();
|
|
37
|
-
} if (rf & 2) {
|
|
38
|
-
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
39
|
-
i0.ɵɵadvance();
|
|
40
|
-
i0.ɵɵrepeater(ctx_r1.RelatedEntityRecords);
|
|
41
|
-
} }
|
|
42
|
-
function MJLinkField_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
43
|
-
const _r1 = i0.ɵɵgetCurrentView();
|
|
44
|
-
i0.ɵɵelementStart(0, "input", 1, 0);
|
|
45
|
-
i0.ɵɵtwoWayListener("ngModelChange", function MJLinkField_Conditional_1_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.RecordName, $event) || (ctx_r1.RecordName = $event); return i0.ɵɵresetView($event); });
|
|
46
|
-
i0.ɵɵelementEnd();
|
|
47
|
-
i0.ɵɵelementStart(2, "button", 2);
|
|
48
|
-
i0.ɵɵlistener("click", function MJLinkField_Conditional_1_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onClearClicked()); });
|
|
49
|
-
i0.ɵɵelement(3, "span", 3);
|
|
50
|
-
i0.ɵɵelementEnd();
|
|
51
|
-
i0.ɵɵconditionalCreate(4, MJLinkField_Conditional_1_Conditional_4_Template, 2, 0, "button", 4);
|
|
52
|
-
i0.ɵɵconditionalCreate(5, MJLinkField_Conditional_1_Conditional_5_Template, 3, 0, "ul", 5);
|
|
53
|
-
} if (rf & 2) {
|
|
54
|
-
const ctx_r1 = i0.ɵɵnextContext();
|
|
55
|
-
i0.ɵɵproperty("ngClass", ctx_r1.RecordLinked ? "record-linked" : "");
|
|
56
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.RecordName);
|
|
57
|
-
i0.ɵɵadvance(2);
|
|
58
|
-
i0.ɵɵproperty("ngClass", ctx_r1.UserCanCreateNewLinkedRecord ? "" : "last-button-in-row");
|
|
59
|
-
i0.ɵɵadvance(2);
|
|
60
|
-
i0.ɵɵconditional(ctx_r1.UserCanCreateNewLinkedRecord ? 4 : -1);
|
|
61
|
-
i0.ɵɵadvance();
|
|
62
|
-
i0.ɵɵconditional(ctx_r1.showMatchingRecords ? 5 : -1);
|
|
63
|
-
} }
|
|
64
|
-
function MJLinkField_Conditional_2_Conditional_0_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
65
|
-
i0.ɵɵelement(0, "kendo-combobox-column", 11);
|
|
66
|
-
} if (rf & 2) {
|
|
67
|
-
const d_r7 = ctx.$implicit;
|
|
68
|
-
i0.ɵɵproperty("field", d_r7.Name)("title", d_r7.DisplayNameOrName);
|
|
69
|
-
} }
|
|
70
|
-
function MJLinkField_Conditional_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
71
|
-
const _r6 = i0.ɵɵgetCurrentView();
|
|
72
|
-
i0.ɵɵelementStart(0, "kendo-multicolumncombobox", 10);
|
|
73
|
-
i0.ɵɵtwoWayListener("valueChange", function MJLinkField_Conditional_2_Conditional_0_Template_kendo_multicolumncombobox_valueChange_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedRecord, $event) || (ctx_r1.SelectedRecord = $event); return i0.ɵɵresetView($event); });
|
|
74
|
-
i0.ɵɵrepeaterCreate(1, MJLinkField_Conditional_2_Conditional_0_For_2_Template, 1, 2, "kendo-combobox-column", 11, i0.ɵɵrepeaterTrackByIdentity);
|
|
75
|
-
i0.ɵɵelementEnd();
|
|
76
|
-
} if (rf & 2) {
|
|
77
|
-
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
78
|
-
i0.ɵɵproperty("data", ctx_r1.RelatedEntityRecords)("textField", ctx_r1.RelatedEntityInfo.NameField ? ctx_r1.RelatedEntityInfo.NameField.Name : ctx_r1.RelatedEntityInfo.FirstPrimaryKey.Name)("valueField", ctx_r1.RelatedEntityInfo.FirstPrimaryKey.Name);
|
|
79
|
-
i0.ɵɵtwoWayProperty("value", ctx_r1.SelectedRecord);
|
|
80
|
-
i0.ɵɵadvance();
|
|
81
|
-
i0.ɵɵrepeater(ctx_r1.dropDownColumns);
|
|
82
|
-
} }
|
|
83
|
-
function MJLinkField_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
84
|
-
i0.ɵɵconditionalCreate(0, MJLinkField_Conditional_2_Conditional_0_Template, 3, 4, "kendo-multicolumncombobox", 9);
|
|
85
|
-
} if (rf & 2) {
|
|
86
|
-
const ctx_r1 = i0.ɵɵnextContext();
|
|
87
|
-
i0.ɵɵconditional(ctx_r1.RelatedEntityInfo ? 0 : -1);
|
|
88
|
-
} }
|
|
89
|
-
/**
|
|
90
|
-
* This component is used to automatically generate a UI for any field in a given BaseEntity object. The CodeGen tool will generate forms and form sections that
|
|
91
|
-
* use this component. This component automatically determines the type of the field and generates the appropriate UI element for it. It is possible to use other
|
|
92
|
-
* elements to render a field as desired in a custom form, think of this component as a nice "base" component you can use for many cases, and you can create custom
|
|
93
|
-
* components for field rendering/editing when needed.
|
|
94
|
-
*/
|
|
95
|
-
export class MJLinkField extends BaseRecordComponent {
|
|
96
|
-
cdr;
|
|
97
|
-
navigationService;
|
|
98
|
-
constructor(cdr, navigationService) {
|
|
99
|
-
super();
|
|
100
|
-
this.cdr = cdr;
|
|
101
|
-
this.navigationService = navigationService;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* The record object that contains the field to be rendered. This object should be an instance of BaseEntity or a derived class.
|
|
105
|
-
*/
|
|
106
|
-
record;
|
|
107
|
-
/**
|
|
108
|
-
* The name of the field in the entity to be rendered.
|
|
109
|
-
*/
|
|
110
|
-
FieldName = '';
|
|
111
|
-
/**
|
|
112
|
-
* For users of this component, if you already know the name of the record we are linking to, provide it here to reduce DB overhead
|
|
113
|
-
*/
|
|
114
|
-
RecordName = '';
|
|
115
|
-
/**
|
|
116
|
-
* The type of component to show, search is a user input field that searches for records, dropdown is a dropdown list of records. The default is 'search'. If the related entity has
|
|
117
|
-
* a small list of possible records, it is often desirable to show a dropdown list instead of a search box.
|
|
118
|
-
*/
|
|
119
|
-
LinkComponentType = 'Search';
|
|
120
|
-
RelatedEntityInfo = undefined;
|
|
121
|
-
_SelectedRecord = undefined;
|
|
122
|
-
get SelectedRecord() {
|
|
123
|
-
return this._SelectedRecord;
|
|
124
|
-
}
|
|
125
|
-
set SelectedRecord(val) {
|
|
126
|
-
this._SelectedRecord = val;
|
|
127
|
-
if (val) {
|
|
128
|
-
this.Value = val.FirstPrimaryKey.Value;
|
|
129
|
-
}
|
|
130
|
-
else
|
|
131
|
-
this.Value = null;
|
|
132
|
-
}
|
|
133
|
-
RecordLinked = false;
|
|
134
|
-
RelatedEntityRecords = [];
|
|
135
|
-
showMatchingRecords = false;
|
|
136
|
-
dropDownColumns = [];
|
|
137
|
-
inputBox;
|
|
138
|
-
async initComponent() {
|
|
139
|
-
if (!this.record)
|
|
140
|
-
throw new Error('record property is required');
|
|
141
|
-
if (!this.FieldName)
|
|
142
|
-
throw new Error('FieldName property is required');
|
|
143
|
-
const relatedEntityID = this.EntityField?.RelatedEntityID;
|
|
144
|
-
const md = new Metadata();
|
|
145
|
-
if (relatedEntityID) {
|
|
146
|
-
this.RelatedEntityInfo = md.EntityByID(relatedEntityID);
|
|
147
|
-
this.cdr.detectChanges();
|
|
148
|
-
}
|
|
149
|
-
if (this.LinkComponentType === 'Search') {
|
|
150
|
-
await this.AttemptToLinkValue();
|
|
151
|
-
if (this.inputBox) {
|
|
152
|
-
fromEvent(this.inputBox.nativeElement, 'input')
|
|
153
|
-
.pipe(debounceTime(300))
|
|
154
|
-
.subscribe(() => {
|
|
155
|
-
if (!this.RecordLinked) {
|
|
156
|
-
this.showMatchingRecords = true;
|
|
157
|
-
this.fetchMatchingRecords(this.inputBox.nativeElement.value);
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
fromEvent(this.inputBox.nativeElement, 'keydown').subscribe((event) => {
|
|
161
|
-
if (this.RecordLinked && !['Backspace', 'Delete'].includes(event.key)) {
|
|
162
|
-
event.preventDefault();
|
|
163
|
-
}
|
|
164
|
-
else if (['Backspace', 'Delete'].includes(event.key)) {
|
|
165
|
-
this.RecordName = '';
|
|
166
|
-
this.Value = null;
|
|
167
|
-
this.RecordLinked = false;
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
await this.populateDropdownList();
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
async ngAfterViewInit() {
|
|
177
|
-
await this.initComponent();
|
|
178
|
-
}
|
|
179
|
-
_cache_userCanCreateNewLinkedRecord = null;
|
|
180
|
-
get UserCanCreateNewLinkedRecord() {
|
|
181
|
-
if (this._cache_userCanCreateNewLinkedRecord === null) {
|
|
182
|
-
const md = new Metadata();
|
|
183
|
-
if (this.RelatedEntityInfo) {
|
|
184
|
-
const perms = this.RelatedEntityInfo.GetUserPermisions(md.CurrentUser);
|
|
185
|
-
this._cache_userCanCreateNewLinkedRecord = perms.CanCreate;
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
// we can't do anything yet as we don't have the related entity info, so just return false
|
|
189
|
-
// do not cache this as we want to check again when we have the related entity info
|
|
190
|
-
return false;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
return this._cache_userCanCreateNewLinkedRecord;
|
|
194
|
-
}
|
|
195
|
-
onNewClicked() {
|
|
196
|
-
// user wants to create a new record, double check to make sure we can create a record
|
|
197
|
-
if (this.UserCanCreateNewLinkedRecord && this.RelatedEntityInfo) {
|
|
198
|
-
// Use NavigationService to open a new record form
|
|
199
|
-
this.navigationService.OpenNewEntityRecord(this.RelatedEntityInfo.Name);
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
// user can't create a new record, so let's tell them
|
|
203
|
-
// they shouldn't actually ever get here as we don't show the New button if they can't create a new record but
|
|
204
|
-
// this is an extra safeguard.
|
|
205
|
-
SharedService.Instance.CreateSimpleNotification(`You do not have permission to create a new ${this.RelatedEntityInfo?.Name} record`, 'info', 2500);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
async AttemptToLinkValue() {
|
|
209
|
-
const relatedEntityID = this.EntityField?.RelatedEntityID;
|
|
210
|
-
const md = new Metadata();
|
|
211
|
-
this.RecordLinked = false;
|
|
212
|
-
if (relatedEntityID) {
|
|
213
|
-
this.RelatedEntityInfo = md.EntityByID(relatedEntityID);
|
|
214
|
-
if (!this.RecordName) {
|
|
215
|
-
if (this.Value) {
|
|
216
|
-
// at present only support single valued FOREIGN KEYs, will need to upgrade this soon
|
|
217
|
-
const pk = new CompositeKey([{ FieldName: this.RelatedEntityInfo.FirstPrimaryKey.Name, Value: this.Value }]);
|
|
218
|
-
this.RecordName = await md.GetEntityRecordName(this.RelatedEntityInfo.Name, pk);
|
|
219
|
-
if (!this.RecordName)
|
|
220
|
-
this.RecordName = this.Value;
|
|
221
|
-
this.RecordLinked = true;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
get Value() {
|
|
227
|
-
return this.record.Get(this.FieldName);
|
|
228
|
-
}
|
|
229
|
-
set Value(val) {
|
|
230
|
-
this.record.Set(this.FieldName, val);
|
|
231
|
-
if (this.LinkComponentType === 'Search') {
|
|
232
|
-
this.AttemptToLinkValue();
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
this.SetDropdownValue();
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
get EntityField() {
|
|
239
|
-
return this.record.Fields.find(f => f.Name === this.FieldName)?.EntityFieldInfo;
|
|
240
|
-
}
|
|
241
|
-
get DisplayName() {
|
|
242
|
-
const ef = this.EntityField;
|
|
243
|
-
if (ef)
|
|
244
|
-
return ef.DisplayNameOrName;
|
|
245
|
-
else
|
|
246
|
-
return this.FieldName;
|
|
247
|
-
}
|
|
248
|
-
onClearClicked() {
|
|
249
|
-
this.RecordName = '';
|
|
250
|
-
this.RecordLinked = false;
|
|
251
|
-
this.Value = null;
|
|
252
|
-
this.showMatchingRecords = false;
|
|
253
|
-
}
|
|
254
|
-
RelatedEntityNameField = '';
|
|
255
|
-
async fetchMatchingRecords(query) {
|
|
256
|
-
this.RecordLinked = false;
|
|
257
|
-
this.RelatedEntityRecords = [];
|
|
258
|
-
if (this.RelatedEntityInfo) {
|
|
259
|
-
this.RelatedEntityNameField = this.RelatedEntityInfo.NameField ? this.RelatedEntityInfo.NameField.Name : '';
|
|
260
|
-
const escapedQuery = query.replace(/'/g, "''");
|
|
261
|
-
let filter = '';
|
|
262
|
-
if (!this.RelatedEntityInfo.FirstPrimaryKey.NeedsQuotes) {
|
|
263
|
-
// the pkey is a number, so let's see if the query is a number
|
|
264
|
-
if (isNaN(Number(query)) && this.RelatedEntityNameField === '') {
|
|
265
|
-
// if the query is not a number (for number pkeys) and we don't have a name field to search on, then we can't search
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
// if we get here it means we either have a RelatedEntityNameField to search on or the query is a number
|
|
270
|
-
if (!isNaN(Number(query))) {
|
|
271
|
-
// if the query is a number, then we can search on the pkey
|
|
272
|
-
filter = `[${this.RelatedEntityInfo.FirstPrimaryKey.Name}] = ${query}`;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
else if (this.RelatedEntityInfo.FirstPrimaryKey.Type.trim().toLowerCase() !== 'uniqueidentifier') {
|
|
277
|
-
// the pkey is a string that is NOT a unique identifier, so we can search on it no matter what the query is, a number, not a number, whatever
|
|
278
|
-
filter = `[${this.RelatedEntityInfo.FirstPrimaryKey.Name}] = '${escapedQuery}'`;
|
|
279
|
-
}
|
|
280
|
-
else {
|
|
281
|
-
// we can't search on the pkey unless the escapedQuery is a valid GUID, so check that and if so, search on the pkey
|
|
282
|
-
if (escapedQuery.match(/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/)) {
|
|
283
|
-
filter = `[${this.RelatedEntityInfo.FirstPrimaryKey.Name}] = '${escapedQuery}'`;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
if (this.RelatedEntityNameField) {
|
|
287
|
-
filter = `[${this.RelatedEntityNameField}] LIKE '${escapedQuery}%'${filter.length > 0 ? ' OR ' + filter : ''}`;
|
|
288
|
-
}
|
|
289
|
-
if (filter && filter.length > 0) {
|
|
290
|
-
const rv = new RunView();
|
|
291
|
-
const result = await rv.RunView({
|
|
292
|
-
EntityName: this.RelatedEntityInfo.Name,
|
|
293
|
-
ExtraFilter: filter,
|
|
294
|
-
OrderBy: this.RelatedEntityNameField,
|
|
295
|
-
ResultType: 'entity_object',
|
|
296
|
-
MaxRows: 5
|
|
297
|
-
});
|
|
298
|
-
if (result && result.Results?.length > 0) {
|
|
299
|
-
this.RelatedEntityRecords = result.Results;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
else {
|
|
303
|
-
this.RelatedEntityRecords = [{ Name: "Can't search on " + this.RelatedEntityInfo.Name + ' records' }]; // this will have the effect of a single record in the list that says "Can't search on..."
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
GetRecordDisplayString(record) {
|
|
308
|
-
if (!record)
|
|
309
|
-
return '';
|
|
310
|
-
if (record.Get !== undefined) {
|
|
311
|
-
// we have a base entity
|
|
312
|
-
return this.RelatedEntityNameField ? record.Get(this.RelatedEntityNameField) : (record.FirstPrimaryKey ? record.FirstPrimaryKey.Value?.toString() : 'Unable to retrieve Primary Key Value.');
|
|
313
|
-
}
|
|
314
|
-
else {
|
|
315
|
-
// we have a plain object because we couldn't find any records
|
|
316
|
-
return record.Name;
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
async populateDropdownList() {
|
|
320
|
-
if (this.RelatedEntityInfo) {
|
|
321
|
-
this.dropDownColumns = this.RelatedEntityInfo.Fields.filter(f => f.DefaultInView || f.IsPrimaryKey || f.IsNameField);
|
|
322
|
-
this.cdr.detectChanges();
|
|
323
|
-
// run a view to get the records
|
|
324
|
-
const rv = new RunView();
|
|
325
|
-
const result = await rv.RunView({
|
|
326
|
-
EntityName: this.RelatedEntityInfo.Name,
|
|
327
|
-
ExtraFilter: '',
|
|
328
|
-
OrderBy: this.RelatedEntityNameField,
|
|
329
|
-
ResultType: 'entity_object',
|
|
330
|
-
});
|
|
331
|
-
if (result && result.Success) {
|
|
332
|
-
this.RelatedEntityRecords = result.Results;
|
|
333
|
-
// look for a match between the records we have, finding a match between our this.Value and the pkey of the record
|
|
334
|
-
const match = this.RelatedEntityRecords.find(r => r.FirstPrimaryKey.Value === this.Value);
|
|
335
|
-
if (match) {
|
|
336
|
-
this.SelectedRecord = match;
|
|
337
|
-
this.SetDropdownValue();
|
|
338
|
-
}
|
|
339
|
-
this.cdr.detectChanges();
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
async SetDropdownValue() {
|
|
344
|
-
}
|
|
345
|
-
onRecordSelected(linkedRecord) {
|
|
346
|
-
if (linkedRecord.EntityInfo) {
|
|
347
|
-
this.SelectedRecord = linkedRecord;
|
|
348
|
-
this.RecordName = this.RelatedEntityNameField ? linkedRecord.Get(this.RelatedEntityNameField) : linkedRecord.PrimaryKey.ToString();
|
|
349
|
-
this.RecordLinked = true;
|
|
350
|
-
this.showMatchingRecords = false;
|
|
351
|
-
this.record.Set(this.FieldName, linkedRecord.FirstPrimaryKey.Value);
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
// this means that we really don't have a selected record and we were just showing the "Can't search on..." record
|
|
355
|
-
this.showMatchingRecords = false;
|
|
356
|
-
this.RecordLinked = false;
|
|
357
|
-
this.RecordName = '';
|
|
358
|
-
}
|
|
359
|
-
this.cdr.detectChanges();
|
|
360
|
-
}
|
|
361
|
-
static ɵfac = function MJLinkField_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJLinkField)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.NavigationService)); };
|
|
362
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJLinkField, selectors: [["mj-link-field"]], viewQuery: function MJLinkField_Query(rf, ctx) { if (rf & 1) {
|
|
363
|
-
i0.ɵɵviewQuery(_c0, 5);
|
|
364
|
-
} if (rf & 2) {
|
|
365
|
-
let _t;
|
|
366
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.inputBox = _t.first);
|
|
367
|
-
} }, inputs: { record: "record", FieldName: "FieldName", RecordName: "RecordName", LinkComponentType: "LinkComponentType" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [["inputBox", ""], ["type", "text", "kendoTextBox", "", 1, "input-box", 3, "ngModelChange", "ngClass", "ngModel"], ["kendoButton", "", "title", "Clear", 3, "click", "ngClass"], [1, "fa-solid", "fa-delete-left"], ["kendoButton", "", "title", "Create New Record", 1, "last-button-in-row"], [1, "matching-records"], ["kendoButton", "", "title", "Create New Record", 1, "last-button-in-row", 3, "click"], [1, "fa-solid", "fa-plus"], [3, "click"], [3, "data", "textField", "valueField", "value"], [3, "valueChange", "data", "textField", "valueField", "value"], [3, "field", "title"]], template: function MJLinkField_Template(rf, ctx) { if (rf & 1) {
|
|
368
|
-
i0.ɵɵelementStart(0, "div");
|
|
369
|
-
i0.ɵɵconditionalCreate(1, MJLinkField_Conditional_1_Template, 6, 5)(2, MJLinkField_Conditional_2_Template, 1, 1);
|
|
370
|
-
i0.ɵɵelementEnd();
|
|
371
|
-
} if (rf & 2) {
|
|
372
|
-
i0.ɵɵadvance();
|
|
373
|
-
i0.ɵɵconditional(ctx.LinkComponentType === "Search" ? 1 : 2);
|
|
374
|
-
} }, dependencies: [i2.NgClass, i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgModel, i4.ButtonComponent, i5.TextBoxDirective, i6.MultiColumnComboBoxComponent, i6.ComboBoxColumnComponent], styles: [".record-linked[_ngcontent-%COMP%] {\n color: darkblue;\n text-decoration: underline;\n}\n\n.input-box[_ngcontent-%COMP%] {\n width: 406px;\n border-radius: 3px 0 0 3px; \n\n}\n\nbutton[_ngcontent-%COMP%] {\n width: 28px;\n border-radius: 0 0 0 0; \n border-left: 0; \n\n}\n\nbutton.last-button-in-row[_ngcontent-%COMP%] {\n border-radius: 0 3px 3px 0; \n \n}\n\n.matching-records[_ngcontent-%COMP%] {\n width: 406px;\n list-style-type: none;\n margin: 0;\n padding: 0;\n max-height: 200px;\n overflow-y: auto;\n border: 1px solid #ccc;\n}\n\n.matching-records[_ngcontent-%COMP%] li[_ngcontent-%COMP%] {\n padding: 8px;\n cursor: pointer;\n}\n\n.matching-records[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:hover {\n background-color: #f0f0f0;\n}"] });
|
|
375
|
-
}
|
|
376
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJLinkField, [{
|
|
377
|
-
type: Component,
|
|
378
|
-
args: [{ standalone: false, selector: 'mj-link-field', template: "<div>\n @if (LinkComponentType === 'Search') {\n <input\n #inputBox\n type=\"text\"\n class=\"input-box\"\n [ngClass]=\"RecordLinked ? 'record-linked' : ''\"\n [(ngModel)]=\"RecordName\"\n kendoTextBox\n />\n <button kendoButton (click)=\"onClearClicked()\" title=\"Clear\" [ngClass]=\"UserCanCreateNewLinkedRecord ? '' : 'last-button-in-row'\"><span class=\"fa-solid fa-delete-left\"></span></button>\n @if (UserCanCreateNewLinkedRecord) {\n <button kendoButton (click)=\"onNewClicked()\" title=\"Create New Record\" class=\"last-button-in-row\"><span class=\"fa-solid fa-plus\"></span></button>\n }\n\n @if (showMatchingRecords) {\n <ul class=\"matching-records\">\n @for (record of RelatedEntityRecords; track record) {\n <li (click)=\"onRecordSelected(record)\">\n {{ GetRecordDisplayString(record)}}\n </li>\n }\n </ul>\n }\n }\n @else {\n @if (RelatedEntityInfo) {\n <kendo-multicolumncombobox\n [data]=\"RelatedEntityRecords\"\n [textField]=\"RelatedEntityInfo.NameField ? RelatedEntityInfo.NameField.Name : RelatedEntityInfo.FirstPrimaryKey.Name\"\n [valueField]=\"RelatedEntityInfo.FirstPrimaryKey.Name\"\n [(value)]=\"SelectedRecord\"\n >\n @for (d of dropDownColumns; track d) {\n <kendo-combobox-column\n [field]=\"d.Name\"\n [title]=\"d.DisplayNameOrName\"\n >\n </kendo-combobox-column>\n }\n </kendo-multicolumncombobox>\n }\n}\n</div>", styles: [".record-linked {\n color: darkblue;\n text-decoration: underline;\n}\n\n.input-box {\n width: 406px;\n border-radius: 3px 0 0 3px; /* top-left, top-right, bottom-right, bottom-left don't make the right/top and right/bottom rounded so it ties up to the buttons better */\n}\n\nbutton {\n width: 28px;\n border-radius: 0 0 0 0; \n border-left: 0; /* remove the left border */\n}\n\nbutton.last-button-in-row {\n border-radius: 0 3px 3px 0; /*round the top right and bottom right for the last button only*/ \n}\n\n.matching-records {\n width: 406px;\n list-style-type: none;\n margin: 0;\n padding: 0;\n max-height: 200px;\n overflow-y: auto;\n border: 1px solid #ccc;\n}\n\n.matching-records li {\n padding: 8px;\n cursor: pointer;\n}\n\n.matching-records li:hover {\n background-color: #f0f0f0;\n}\n"] }]
|
|
379
|
-
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.NavigationService }], { record: [{
|
|
380
|
-
type: Input
|
|
381
|
-
}], FieldName: [{
|
|
382
|
-
type: Input
|
|
383
|
-
}], RecordName: [{
|
|
384
|
-
type: Input
|
|
385
|
-
}], LinkComponentType: [{
|
|
386
|
-
type: Input
|
|
387
|
-
}], inputBox: [{
|
|
388
|
-
type: ViewChild,
|
|
389
|
-
args: ['inputBox', { static: false }]
|
|
390
|
-
}] }); })();
|
|
391
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJLinkField, { className: "MJLinkField", filePath: "src/lib/link-field.component.ts", lineNumber: 19 }); })();
|
|
392
|
-
//# sourceMappingURL=link-field.component.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"link-field.component.js","sourceRoot":"","sources":["../../src/lib/link-field.component.ts","../../src/lib/link-field.component.html"],"names":[],"mappings":"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"}
|