1 <!-- idlObject and fieldName applied programmatically -->
2 <eg-translate #translator></eg-translate>
4 <eg-string #successStr text="Update Succeeded" i18n-text></eg-string>
5 <eg-string #failStr text="Update Failed" i18n-text></eg-string>
7 <eg-confirm-dialog #confirmDel
8 dialogTitle="Delete?" i18n-dialogTitle
9 dialogBody="Delete {{recordLabel}}?" i18n-dialogBody>
12 <ng-template #dialogContent>
13 <div class="modal-header bg-info" *ngIf="!hideBanner">
14 <h4 class="modal-title" i18n>Record Editor: {{recordLabel}}</h4>
15 <ng-container *ngIf="isDialog()">
16 <button type="button" class="close"
17 i18n-aria-label aria-label="Close" (click)="closeEditor()">
18 <span aria-hidden="true">×</span>
22 <div class="modal-body">
23 <form #fmEditForm="ngForm" role="form"
24 class="form-validated common-form striped-odd"
25 [egDateFieldOrderList]="dateFieldOrderList">
26 <ng-container *ngIf="!record">
27 <!-- display a progress dialog while the editor
28 fetches the needed data -->
29 <eg-progress-inline></eg-progress-inline>
31 <ng-container *ngIf="record">
32 <div role="alert" class="alert alert-danger" *ngIf="fmEditForm.errors?.['datesOutOfOrder'] && (fmEditForm.touched || fmEditForm.dirty)">
33 <span class="material-icons" aria-hidden="true">error</span>
34 <span i18n>Dates must be in the correct order</span>
37 <div class="form-group row" *ngFor="let field of fields">
38 <div class="col-lg-3">
39 <label for="{{idPrefix}}-{{field.name}}">{{field.label}}</label>
40 <eg-help-popover [placement]="'right'" *ngIf="field.helpText" helpText="{{field.helpTextValue}}"></eg-help-popover>
42 <div class="col-lg-9">
44 <ng-container [ngSwitch]="inputType(field)">
46 <ng-container *ngSwitchCase="'template'">
48 *ngTemplateOutlet="field.template; context:customTemplateFieldContext(field)">
52 <ng-container *ngSwitchCase="'readonly'">
53 <span>{{record[field.name]()}}</span>
56 <ng-container *ngSwitchCase="'readonly-money'">
57 <span>{{record[field.name]() | currency}}</span>
60 <ng-container *ngSwitchCase="'readonly-list'">
61 <ng-container *ngIf="field.linkedValues && field.linkedValues[0]?.label">
62 <span>{{field.linkedValues[0].label}}</span>
66 <ng-container *ngSwitchCase="'timestamp'">
68 domId="{{idPrefix}}-{{field.name}}"
69 [readOnly]="field.readOnly"
70 [ngModel]="record[field.name]()"
72 (onChangeAsIso)="record[field.name]($event)"
73 initialIso="{{record[field.name]()}}">
77 <ng-container *ngSwitchCase="'timestamp-timepicker'">
81 domId="{{idPrefix}}-{{field.name}}"
82 (onChangeAsIso)="record[field.name]($event)"
84 [readOnly]="field.readOnly"
85 [ngModel]="record[field.name]()"
87 initialIso="{{record[field.name]()}}">
91 <ng-container *ngSwitchCase="'org_unit'">
93 placeholder="{{field.label}}..."
95 domId="{{idPrefix}}-{{field.name}}"
96 [limitPerms]="modePerms[mode]"
97 [readOnly]="field.readOnly"
98 [applyDefault]="field.orgDefaultAllowed"
99 [applyOrgId]="record[field.name]()"
100 (onChange)="record[field.name]($event)">
104 <ng-container *ngSwitchCase="'money'">
107 type="number" step="0.1"
108 name="{{field.name}}"
109 id="{{idPrefix}}-{{field.name}}"
110 placeholder="{{field.label}}..."
112 [readonly]="field.readOnly"
113 [required]="field.isRequired()"
114 [ngModel]="record[field.name]()"
115 (ngModelChange)="record[field.name]($event)"/>
118 <ng-container *ngSwitchCase="'int'">
122 name="{{field.name}}"
123 id="{{idPrefix}}-{{field.name}}"
124 placeholder="{{field.label}}..."
126 [required]="field.isRequired()"
127 egMin="{{field.min}}"
128 egMax="{{field.max}}"
129 [ngModel]="record[field.name]()"
130 (ngModelChange)="record[field.name]($event)"/>
133 <ng-container *ngSwitchCase="'float'">
136 type="number" step="0.1"
137 name="{{field.name}}"
138 id="{{idPrefix}}-{{field.name}}"
139 placeholder="{{field.label}}..."
141 [required]="field.isRequired()"
142 [ngModel]="record[field.name]()"
143 (ngModelChange)="record[field.name]($event)"/>
146 <ng-container *ngSwitchCase="'text'">
149 id="{{idPrefix}}-{{field.name}}" name="{{field.name}}"
150 type="text" pattern="[\s\S]*\S[\s\S]*"
151 placeholder="{{field.label}}..." i18n-placeholder
152 [required]="field.isRequired()"
153 [ngModel]="record[field.name]()"
154 (ngModelChange)="record[field.name]($event)"/>
157 <ng-container *ngSwitchCase="'bool'">
159 class="form-check-input"
161 name="{{field.name}}"
162 id="{{idPrefix}}-{{field.name}}"
163 [disabled]="field.readOnly"
164 [ngModel]="record[field.name]()"
165 (ngModelChange)="record[field.name]($event)"/>
168 <ng-container *ngSwitchCase="'readonly-au'">
169 <ng-container *ngIf="field.linkedValues">
170 <a href="/eg/staff/circ/patron/{{field.linkedValues[0].id}}/checkout" target="_blank">{{field.linkedValues[0].label}}
171 <span class="material-icons" i18n-title title="Open user record in new tab">open_in_new</span></a>
175 <ng-container *ngSwitchCase="'link'">
177 id="{{idPrefix}}-{{field.name}}" name="{{field.name}}"
178 placeholder="{{field.label}}..." i18n-placeholder
179 [required]="field.isRequired()"
180 [idlClass]="field.class" [asyncSupportsEmptyTermClick]="true"
181 [idlBaseQuery]="field.idlBaseQuery"
182 [idlField]="field.selector"
183 [selectedId]="record[field.name]()"
184 (onChange)="record[field.name]($event ? $event.id : null)">
188 <ng-container *ngSwitchCase="'list'">
190 domId="{{idPrefix}}-{{field.name}}" name="{{field.name}}"
191 placeholder="{{field.label}}..." i18n-placeholder
192 [required]="field.isRequired()"
193 [entries]="field.linkedValues"
194 [asyncDataSource]="field.linkedValuesSource"
195 [selectedId]="record[field.name]()"
196 (onChange)="record[field.name]($event ? $event.id : null)">
199 </ng-container> <!-- switch -->
201 <div class="col-lg-1" *ngIf="field.i18n && !field.readOnly">
202 <a (click)="openTranslator(field.name)"
203 i18n-title title="Translate">
204 <button class="btn btn-outline-info mat-icon-in-button">
205 <span class="material-icons">translate</span>
213 <div class="modal-footer">
214 <button type="button" class="btn {{action.buttonCss}}"
215 *ngFor="let action of actions" [disabled]="action.disabled"
216 (click)="action.actionClick.emit({action: action.key, record: record})">
219 <ng-container *ngIf="isDialog()">
220 <button type="button" class="btn btn-success" *ngIf="mode === 'view'"
221 (click)="closeEditor()" i18n>Close</button>
222 <button type="button" class="btn btn-warning ml-2" *ngIf="mode !== 'view'"
223 (click)="cancel()" i18n>Cancel</button>
226 <ng-container *ngIf="showDelete && mode !== 'view'">
227 <button type="button" class="btn btn-warning" (click)="remove()"
228 [disabled]="record && record.isnew()" i18n>Delete</button>
231 <button type="button" class="btn btn-info"
232 [disabled]="fmEditForm.invalid" *ngIf="mode !== 'view'"
233 (click)="save()" i18n>Save</button>
237 <ng-container *ngIf="!isDialog()">
238 <!-- in "inline" mode, render the editor pane right here -->
239 <ng-container *ngTemplateOutlet="dialogContent">