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="btn-close btn-close-white"
17 i18n-aria-label aria-label="Close" (click)="closeEditor()"></button>
20 <div class="modal-body">
21 <form #fmEditForm="ngForm" role="form"
22 class="form-validated common-form striped-odd"
23 [egDateFieldOrderList]="dateFieldOrderList">
24 <ng-container *ngIf="!record">
25 <!-- display a progress dialog while the editor
26 fetches the needed data -->
27 <eg-progress-inline></eg-progress-inline>
29 <ng-container *ngIf="record">
30 <div role="alert" class="alert alert-danger" *ngIf="fmEditForm.errors?.['datesOutOfOrder'] && (fmEditForm.touched || fmEditForm.dirty)">
31 <span class="material-icons" aria-hidden="true">error</span>
32 <span i18n>Dates must be in the correct order</span>
35 <div class="form-group row" *ngFor="let field of fields">
36 <div class="col-lg-3">
37 <label class="form-label" for="{{idPrefix}}-{{field.name}}">{{field.label}}</label>
38 <eg-help-popover [placement]="'right'" *ngIf="field.helpText" helpText="{{field.helpTextValue}}"></eg-help-popover>
40 <div class="col-lg-9">
42 <ng-container [ngSwitch]="inputType(field)">
44 <ng-container *ngSwitchCase="'template'">
46 *ngTemplateOutlet="field.template; context:customTemplateFieldContext(field)">
50 <ng-container *ngSwitchCase="'readonly'">
51 <span>{{record[field.name]()}}</span>
54 <ng-container *ngSwitchCase="'readonly-money'">
55 <span>{{record[field.name]() | currency}}</span>
58 <ng-container *ngSwitchCase="'readonly-list'">
59 <ng-container *ngIf="field.linkedValues && field.linkedValues[0]?.label">
60 <span>{{field.linkedValues[0].label}}</span>
64 <ng-container *ngSwitchCase="'timestamp'">
66 domId="{{idPrefix}}-{{field.name}}"
67 [readOnly]="field.readOnly"
68 [ngModel]="record[field.name]()"
70 (onChangeAsIso)="record[field.name]($event)"
71 initialIso="{{record[field.name]()}}">
75 <ng-container *ngSwitchCase="'timestamp-timepicker'">
79 domId="{{idPrefix}}-{{field.name}}"
80 (onChangeAsIso)="record[field.name]($event)"
82 [readOnly]="field.readOnly"
83 [ngModel]="record[field.name]()"
85 initialIso="{{record[field.name]()}}">
89 <ng-container *ngSwitchCase="'org_unit'">
91 placeholder="{{field.label}}..."
93 domId="{{idPrefix}}-{{field.name}}"
94 persistKey="{{field.persistKey}}"
95 [limitPerms]="modePerms[mode]"
96 [readOnly]="field.readOnly"
97 [applyDefault]="field.orgDefaultAllowed"
98 [applyOrgId]="record[field.name]()"
99 (onChange)="record[field.name]($event)">
103 <ng-container *ngSwitchCase="'money'">
106 type="number" step="0.1"
107 name="{{field.name}}"
108 id="{{idPrefix}}-{{field.name}}"
109 placeholder="{{field.label}}..."
111 [readonly]="field.readOnly"
112 [required]="field.isRequired()"
113 [ngModel]="record[field.name]()"
114 (ngModelChange)="record[field.name]($event)"/>
117 <ng-container *ngSwitchCase="'int'">
121 name="{{field.name}}"
122 id="{{idPrefix}}-{{field.name}}"
123 placeholder="{{field.label}}..."
125 [required]="field.isRequired()"
126 egMin="{{field.min}}"
127 egMax="{{field.max}}"
128 [ngModel]="record[field.name]()"
129 (ngModelChange)="record[field.name]($event)"/>
132 <ng-container *ngSwitchCase="'float'">
135 type="number" step="0.1"
136 name="{{field.name}}"
137 id="{{idPrefix}}-{{field.name}}"
138 placeholder="{{field.label}}..."
140 [required]="field.isRequired()"
141 [ngModel]="record[field.name]()"
142 (ngModelChange)="record[field.name]($event)"/>
145 <ng-container *ngSwitchCase="'text'">
148 id="{{idPrefix}}-{{field.name}}" name="{{field.name}}"
149 type="text" pattern="[\s\S]*\S[\s\S]*"
150 placeholder="{{field.label}}..." i18n-placeholder
151 [required]="field.isRequired()"
152 [ngModel]="record[field.name]()"
153 (ngModelChange)="record[field.name]($event)"/>
156 <ng-container *ngSwitchCase="'bool'">
158 class="form-check-input"
160 name="{{field.name}}"
161 id="{{idPrefix}}-{{field.name}}"
162 [disabled]="field.readOnly"
163 [ngModel]="record[field.name]()"
164 (ngModelChange)="record[field.name]($event)"/>
167 <ng-container *ngSwitchCase="'readonly-au'">
168 <ng-container *ngIf="field.linkedValues">
169 <a href="/eg/staff/circ/patron/{{field.linkedValues[0].id}}/checkout" target="_blank">{{field.linkedValues[0].label}}
170 <span class="material-icons" i18n-title title="Open user record in new tab">open_in_new</span></a>
174 <ng-container *ngSwitchCase="'link'">
176 id="{{idPrefix}}-{{field.name}}" name="{{field.name}}"
177 placeholder="{{field.label}}..." i18n-placeholder
178 [required]="field.isRequired()"
179 [idlClass]="field.class" [asyncSupportsEmptyTermClick]="true"
180 [idlBaseQuery]="field.idlBaseQuery"
181 [idlField]="field.selector"
182 [selectedId]="record[field.name]()"
183 (onChange)="record[field.name]($event ? $event.id : null)">
187 <ng-container *ngSwitchCase="'list'">
189 domId="{{idPrefix}}-{{field.name}}" name="{{field.name}}"
190 placeholder="{{field.label}}..." i18n-placeholder
191 [required]="field.isRequired()"
192 [entries]="field.linkedValues"
193 [asyncDataSource]="field.linkedValuesSource"
194 [selectedId]="record[field.name]()"
195 (onChange)="record[field.name]($event ? $event.id : null)">
198 </ng-container> <!-- switch -->
200 <div class="col-lg-1" *ngIf="field.i18n && !field.readOnly">
201 <a (click)="openTranslator(field.name)"
202 i18n-title title="Translate">
203 <button class="btn btn-outline-info mat-icon-in-button">
204 <span class="material-icons">translate</span>
212 <div class="modal-footer">
213 <button type="button" class="btn {{action.buttonCss}}"
214 *ngFor="let action of actions" [disabled]="action.disabled"
215 (click)="action.actionClick.emit({action: action.key, record: record})">
218 <ng-container *ngIf="isDialog()">
219 <button type="button" class="btn btn-success" *ngIf="mode === 'view'"
220 (click)="closeEditor()" i18n>Close</button>
221 <button type="button" class="btn btn-warning ms-2" *ngIf="mode !== 'view'"
222 (click)="cancel()" i18n>Cancel</button>
225 <ng-container *ngIf="showDelete && mode !== 'view'">
226 <button type="button" class="btn btn-warning" (click)="remove()"
227 [disabled]="record && record.isnew()" i18n>Delete</button>
230 <button type="button" class="btn btn-info"
231 [disabled]="fmEditForm.invalid" *ngIf="mode !== 'view'"
232 (click)="save()" i18n>Save</button>
236 <ng-container *ngIf="!isDialog()">
237 <!-- in "inline" mode, render the editor pane right here -->
238 <ng-container *ngTemplateOutlet="dialogContent">