@memberjunction/ng-base-forms 4.0.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 (77) 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 -541
  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 -5
  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 -9
  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/toolbar/form-toolbar.component.d.ts +170 -0
  29. package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -0
  30. package/dist/lib/toolbar/form-toolbar.component.js +830 -0
  31. package/dist/lib/toolbar/form-toolbar.component.js.map +1 -0
  32. package/dist/lib/types/form-events.d.ts +90 -0
  33. package/dist/lib/types/form-events.d.ts.map +1 -0
  34. package/dist/lib/types/form-events.js +45 -0
  35. package/dist/lib/types/form-events.js.map +1 -0
  36. package/dist/lib/types/form-types.d.ts +150 -0
  37. package/dist/lib/types/form-types.d.ts.map +1 -0
  38. package/dist/lib/types/form-types.js +12 -0
  39. package/dist/lib/types/form-types.js.map +1 -0
  40. package/dist/lib/types/navigation-events.d.ts +88 -0
  41. package/dist/lib/types/navigation-events.d.ts.map +1 -0
  42. package/dist/lib/types/navigation-events.js +2 -0
  43. package/dist/lib/types/navigation-events.js.map +1 -0
  44. package/dist/lib/types/toolbar-config.d.ts +66 -0
  45. package/dist/lib/types/toolbar-config.d.ts.map +1 -0
  46. package/dist/lib/types/toolbar-config.js +38 -0
  47. package/dist/lib/types/toolbar-config.js.map +1 -0
  48. package/dist/module.d.ts +28 -20
  49. package/dist/module.d.ts.map +1 -1
  50. package/dist/module.js +47 -74
  51. package/dist/module.js.map +1 -1
  52. package/dist/public-api.d.ts +20 -8
  53. package/dist/public-api.d.ts.map +1 -1
  54. package/dist/public-api.js +24 -9
  55. package/dist/public-api.js.map +1 -1
  56. package/package.json +20 -23
  57. package/README.md +0 -449
  58. package/dist/lib/base-field-component.d.ts +0 -152
  59. package/dist/lib/base-field-component.d.ts.map +0 -1
  60. package/dist/lib/base-field-component.js +0 -669
  61. package/dist/lib/base-field-component.js.map +0 -1
  62. package/dist/lib/base-form-context.d.ts +0 -23
  63. package/dist/lib/base-form-context.d.ts.map +0 -1
  64. package/dist/lib/base-form-context.js +0 -10
  65. package/dist/lib/base-form-context.js.map +0 -1
  66. package/dist/lib/collapsible-panel.component.d.ts +0 -68
  67. package/dist/lib/collapsible-panel.component.d.ts.map +0 -1
  68. package/dist/lib/collapsible-panel.component.js +0 -330
  69. package/dist/lib/collapsible-panel.component.js.map +0 -1
  70. package/dist/lib/form-section-controls.component.d.ts +0 -35
  71. package/dist/lib/form-section-controls.component.d.ts.map +0 -1
  72. package/dist/lib/form-section-controls.component.js +0 -273
  73. package/dist/lib/form-section-controls.component.js.map +0 -1
  74. package/dist/lib/link-field.component.d.ts +0 -62
  75. package/dist/lib/link-field.component.d.ts.map +0 -1
  76. package/dist/lib/link-field.component.js +0 -392
  77. 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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"}