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