1 <style type="text/css">
2 .css-form input.ng-invalid {
3 background-color: #FA787E;
5 .css-form select.ng-invalid {
6 background-color: #FA787E;
9 ul.copy-attributes-grid {
13 padding-inline-start: 0px;
16 ul.copy-attributes-grid > li {
19 /* Force the grid to overflow to the next line every 4 entries
20 while leaving some wiggle space for padding/margins */
23 flex-direction: column;
26 ul.copy-attributes-grid > li > div {
28 /* padding here is required to allow the "item modified" bg
29 color to appear around some widgets (mainly selectors) */
33 ul.copy-attributes-grid > li > div:nth-child(1) {
34 border-radius: 6px 6px 0px 0px;
37 ul.copy-attributes-grid > li > div:nth-child(2) {
38 border: 1px solid #d9edf7;
41 ul.copy-attributes-grid li label {
46 border: 3px solid #004D00 !important;
51 <form novalidate class="css-form" name="forms.myForm">
52 <div class="row bg-info">
53 <div class="col-md-1">
54 <h5>[% l('Template') %]</h5>
56 <div ng-class="template_controls ? 'col-md-2' : 'col-md-5'">
57 <eg-basic-combo-box list="template_name_list" selected="template_name"></eg-basic-combo-box>
59 <div class="col-md-1">
60 <button class="btn btn-default " ng-click="applyTemplate(template_name)" type="button">[% l('Apply') %]</button>
62 <div class="col-md-6" ng-show="template_controls">
64 <div class="col-md-4">
65 <div class="btn-group">
66 <label class="btn btn-default" ng-click="saveTemplate(template_name)">[% l('Save') %]</label>
67 <label class="btn btn-default" ng-click="deleteTemplate(template_name)">[% l('Delete') %]</label>
70 <div class="col-md-8">
71 <div class="btn-group pull-right">
72 <span class="btn btn-default btn-file">
74 <input type="file" eg-file-reader container="imported_templates.data">
76 <label class="btn btn-default"
77 eg-json-exporter container="templates"
78 default-file-name="'[% l('exported_copy_templates.json') %]'">
85 <div class="col-md-2" ng-class="{'col-md-offset-3' : !template_controls}">
86 <button class="btn btn-default pull-right" ng-click="clearWorking()" type="button">[% l('Clear') %]</button>
90 <div class="row pad-vert" ng-if="template_controls && defaults.show_vol_template_controls">
92 <div class="col-xs-12">
93 <h4 class="center-block">[% l('Call Number Attributes') %]</h4>
98 <div class="row pad-vert" ng-if="template_controls && defaults.show_vol_template_controls">
99 <div class="col-md-1 bg-info">
100 <b>[% l('Classification') %]</b>
102 <div class="nullable col-md-2" ng-class="{'bg-success': working.callnumber.classification !== undefined}">
103 <select class="form-control" ng-model="working.callnumber.classification" ng-options="cl.id() as cl.name() for cl in classification_list">
104 <option value="">[% l('<NONE>') %]</option>
107 <div class="col-md-1 bg-info">
108 <b>[% l('Prefix') %]</b>
110 <div class="nullable col-xs-2" ng-class="{'bg-success': working.callnumber.prefix !== undefined}">
111 <select class="form-control" ng-model="working.callnumber.prefix" ng-options="p.id() as p.label() for p in prefix_list">
112 <option value="">[% l('<NONE>') %]</option>
115 <div class="col-md-1 bg-info">
116 <b>[% l('Suffix') %]</b>
118 <div class="nullable col-md-2" ng-class="{'bg-success': working.callnumber.suffix !== undefined}">
119 <select class="form-control" ng-model="working.callnumber.suffix" ng-options="s.id() as s.label() for s in suffix_list">
120 <option value="">[% l('<NONE>') %]</option>
125 <div class="row pad-vert" ng-if="template_controls && defaults.show_vol_template_controls">
127 <div class="col-xs-12">
128 <h4 class="center-block">[% l('Item Attributes') %]</h4>
133 <ul class="copy-attributes-grid">
134 <li ng-if="defaults.attributes.circulate">
135 <div class="bg-info"><label>[% l('Circulate?') %]</label></div>
136 <div ng-class="{'bg-success': working.circulate !== undefined, 'field-changed': field_changed('circulate')}">
137 <div class="col-lg-6">
139 <input type="radio" ng-model="working.circulate" value="t"/>
143 <div class="col-lg-6">
145 <input type="radio" ng-model="working.circulate" value="f"/>
150 <!-- this dummy div ensures each <li> has exactly 3 vertical
151 flex divs, ensuring consistent widget/label height -->
152 <div ng-if="hasMulti()"> </div>
154 <li ng-if="defaults.attributes.status">
155 <div class="bg-info"><label>[% l('Status') %]</label></div>
156 <div ng-class="{'bg-success': working.status !== undefined, 'field-changed': field_changed('status')}">
157 <select class="form-control" ng-model="working.status"
158 ng-options="s.id() as s.name() disable when magic_status_list.indexOf(s.id(),0) > -1 for s in status_list">
161 <div ng-if="hasMulti()">
162 <div ng-if="working.MultiMap.status.length > 1 && working.status === undefined">
163 <eg-list-counts label="[% l('Multiple statuses') %]"
164 list="working.MultiMap.status" render="statusName"
165 on-select="select_by_status">
170 <li ng-if="defaults.attributes.circ_lib">
171 <div class="bg-info"><label>[% l('Circulating Library') %]</label></div>
172 <div ng-class="{'bg-success': working.circ_lib !== undefined, 'field-changed': field_changed('circ_lib')}">
174 alldisabled="{{!defaults.attributes.circ_lib}}"
175 selected="working.circ_lib"
177 label="[% l('(Unset)') %]"
178 disable-test="cant_have_vols">
181 <div ng-if="hasMulti()">
183 ng-if="working.MultiMap.circ_lib.length > 1 && working.circ_lib === undefined">
184 <eg-list-counts label="[% l('Multiple values') %]"
185 list="working.MultiMap.circ_lib" render="orgShortname"
186 on-select="select_by_circ_lib">
191 <li ng-if="defaults.attributes.ref">
192 <div class="bg-info"><label>[% l('Reference?') %]</label></div>
193 <div ng-class="{'bg-success': working.ref !== undefined, 'field-changed': field_changed('ref')}">
194 <div class="col-lg-6">
196 <input type="radio" ng-model="working.ref" value="t"/>
200 <div class="col-lg-6">
202 <input type="radio" ng-model="working.ref" value="f"/>
207 <div ng-if="hasMulti()">
209 ng-if="working.MultiMap.ref.length > 1 && working.ref === undefined">
210 <eg-list-counts label="[% l('Multiple values') %]"
211 list="working.MultiMap.ref" render="labelYesNo" on-select="select_by_ref">
216 <li ng-if="defaults.attributes.location">
217 <div class="bg-info"><label>[% l('Shelving Location') %]</label></div>
218 <div ng-class="{'bg-success': working.location !== undefined, 'field-changed': field_changed('location')}">
219 <select class="form-control" ng-model="working.location"
220 ng-options="l.id() as i18n.ou_qualified_location_name(l) for l in location_list">
223 <div ng-if="hasMulti()">
225 ng-if="working.MultiMap.location.length > 1 && working.location === undefined">
226 <eg-list-counts label="[% l('Multiple locations') %]"
227 list="working.MultiMap.location" render="locationName"
228 on-select="select_by_location"></eg-list-counts>
232 <li ng-if="defaults.attributes.opac_visible">
233 <div class="bg-info"><label>[% l('OPAC Visible?') %]</label></div>
234 <div ng-class="{'bg-success': working.opac_visible !== undefined, 'field-changed': field_changed('opac_visible')}">
235 <div class="col-lg-6">
237 <input type="radio" ng-model="working.opac_visible" value="t"/>
241 <div class="col-lg-6">
243 <input type="radio" ng-model="working.opac_visible" value="f"/>
248 <div ng-if="hasMulti()">
250 ng-if="working.MultiMap.opac_visible.length > 1 && working.opac_visible === undefined">
251 <eg-list-counts label="[% l('Multiple values') %]"
252 list="working.MultiMap.opac_visible" render="labelYesNo"
253 on-select="select_by_opac_visible"></eg-list-counts>
257 <li ng-if="defaults.attributes.circ_modifier">
258 <div class="bg-info"><label>[% l('Circulation Modifier') %]</label></div>
259 <div ng-class="{'bg-success': working.circ_modifier !== undefined, 'field-changed': field_changed('circ_modifier')}">
260 <select class="form-control"
261 ng-model="working.circ_modifier"
262 ng-options="m.code() as m.name() for m in circ_modifier_list | orderBy: 'name()'">
263 <option value="">[% l('<NONE>') %]</option>
266 <div ng-if="hasMulti()">
267 <div ng-if="working.MultiMap.circ_modifier.length > 1 && working.circ_modifier === undefined">
268 <eg-list-counts label="[% l('Multiple values') %]"
269 list="working.MultiMap.circ_modifier" render="circmodName"
270 on-select="select_by_circ_modifier"></eg-list-counts>
274 <li ng-if="defaults.attributes.price">
275 <div class="bg-info"><label>[% l('Price') %]</label></div>
276 <div ng-class="{'bg-success': working.price !== undefined, 'field-changed': field_changed('price')}">
277 <input class="form-control" str-to-float ng-model="working.price"
278 type="number" step="0.01"/>
280 <div ng-if="hasMulti()">
281 <div ng-if="working.MultiMap.price.length > 1 && working.price === undefined">
282 <eg-list-counts label="[% l('Multiple prices') %]"
283 list="working.MultiMap.price" on-select="select_by_price">
288 <li ng-if="defaults.attributes.loan_duration">
289 <div class="bg-info"><label>[% l('Loan Duration') %]</label></div>
290 <div ng-class="{'bg-success': working.loan_duration !== undefined, 'field-changed': field_changed('loan_duration')}">
291 <select class="form-control" int-to-str ng-model="working.loan_duration">
292 <option value="1">[% l('Short') %]</option>
293 <option value="2" selected>[% l('Normal') %]</option>
294 <option value="3">[% l('Extended') %]</option>
297 <div ng-if="hasMulti()">
298 <div ng-show="working.MultiMap.loan_duration.length > 1 && working.loan_duration === undefined">
299 <eg-list-counts label="[% l('Multiple durations') %]"
300 list="working.MultiMap.loan_duration" render="durationLabel"
301 on-select="select_by_loan_duration"></eg-list-counts>
305 <li ng-if="defaults.attributes.cost">
306 <div class="bg-info"><label>[% l('Acquisitions Cost') %]</label></div>
307 <div ng-class="{'bg-success': working.cost !== undefined, 'field-changed': field_changed('cost')}">
308 <input class="form-control" str-to-float ng-model="working.cost"
309 type="number" step="0.01"/>
311 <div ng-if="hasMulti()">
312 <div ng-if="working.MultiMap.cost.length > 1 && working.cost === undefined">
313 <eg-list-counts label="[% l('Multiple costs') %]"
314 list="working.MultiMap.cost" on-select="select_by_cost">
319 <li ng-if="defaults.attributes.circ_as_type">
320 <div class="bg-info"><label>[% l('Circulate as Type') %]</label></div>
321 <div ng-class="{'bg-success': working.circ_as_type !== undefined, 'field-changed': field_changed('circ_as_type')}">
322 <select class="form-control" ng-model="working.circ_as_type"
323 ng-options="t.code() as t.value() for t in circ_type_list">
324 <option value="">[% l('<NONE>') %]</option>
327 <div ng-if="hasMulti()">
328 <div ng-if="working.MultiMap.circ_as_type.length > 1 && working.circ_as_type === undefined">
329 <eg-list-counts label="[% l('Multiple types') %]"
330 list="working.MultiMap.circ_as_type" render="circTypeValue"
331 on-select="select_by_circ_as_type">
336 <li ng-if="defaults.attributes.holdable">
337 <div class="bg-info"><label>[% l('Holdable?') %]</label></div>
338 <div ng-class="{'bg-success': working.holdable !== undefined, 'field-changed': field_changed('holdable')}">
339 <div class="col-lg-6">
341 <input type="radio" ng-model="working.holdable" value="t"/>
345 <div class="col-lg-6">
347 <input type="radio" ng-model="working.holdable" value="f"/>
352 <div ng-if="hasMulti()">
353 <div ng-show="working.MultiMap.holdable.length > 1 && working.holdable === undefined">
354 <eg-list-counts label="[% l('Multiple values') %]"
355 list="working.MultiMap.holdable" render="labelYesNo"
356 on-select="select_by_holdable"></eg-list-counts>
360 <li ng-if="defaults.attributes.deposit">
361 <div class="bg-info"><label>[% l('Deposit?') %]</label></div>
362 <div ng-class="{'bg-success': working.deposit !== undefined, 'field-changed': field_changed('deposit')}">
363 <div class="col-lg-6">
365 <input type="radio" ng-model="working.deposit" value="t"/>
369 <div class="col-lg-6">
371 <input type="radio" ng-model="working.deposit" value="f"/>
376 <div ng-if="hasMulti()">
377 <div ng-if="working.MultiMap.deposit.length > 1 && working.deposit === undefined">
378 <eg-list-counts label="[% l('Multiple values') %]"
379 list="working.MultiMap.deposit" render="labelYesNo"
380 on-select="select_by_deposit"></eg-list-counts>
384 <li ng-if="defaults.attributes.deposit_amount">
385 <div class="bg-info"><label>[% l('Deposit Amount') %]</label></div>
386 <div ng-class="{'bg-success': working.deposit_amount !== undefined, 'field-changed': field_changed('deposit_amount')}">
387 <input class="form-control" str-to-float
388 ng-model="working.deposit_amount" type="number" step="0.01"/>
390 <div ng-if="hasMulti()">
391 <div ng-if="working.MultiMap.deposit_amount.length > 1 && working.deposit_amount === undefined">
392 <eg-list-counts label="[% l('Multiple amounts') %]"
393 list="working.MultiMap.deposit_amount"
394 on-select="select_by_deposit_amount"></eg-list-counts>
398 <li ng-if="defaults.attributes.age_protect">
399 <div class="bg-info"><label>[% l('Age-based Hold Protection') %]</label></div>
400 <div ng-class="{'bg-success': working.age_protect !== undefined, 'field-changed': field_changed('age_protect')}">
401 <select class="form-control"
402 ng-model="working.age_protect"
403 ng-options="a.id() as a.name() for a in age_protect_list">
404 <option value="">[% l('<NONE>') %]</option>
407 <div ng-if="hasMulti()">
408 <div ng-if="working.MultiMap.age_protect.length > 1 && working.age_protect === undefined">
409 <eg-list-counts label="[% l('Multiple values') %]"
410 list="working.MultiMap.age_protect" render="ageprotectName"
411 on-select="select_by_age_protect"></eg-list-counts>
415 <li ng-if="defaults.attributes.mint_condition">
416 <div class="bg-info"><label>[% l('Quality') %]</label></div>
417 <div ng-class="{'bg-success': working.mint_condition !== undefined, 'field-changed': field_changed('mint_condition')}">
418 <div class="col-lg-6">
420 <input type="radio" ng-model="working.mint_condition" value="t"/>
424 <div class="col-lg-6">
426 <input type="radio"ng-model="working.mint_condition" value="f"/>
431 <div ng-if="hasMulti()">
432 <div ng-if="working.MultiMap.mint_condition.length > 1 && working.mint_condition === undefined">
433 <eg-list-counts label="[% l('Multiple values') %]"
434 list="working.MultiMap.mint_condition" render="labelYesNo"
435 on-select="select_by_mint_condition"></eg-list-counts>
439 <li ng-if="defaults.attributes.fine_level">
440 <div class="bg-info"><label>[% l('Fine Level') %]</label></div>
441 <div ng-class="{'bg-success': working.fine_level !== undefined, 'field-changed': field_changed('fine_level')}">
442 <select class="form-control" int-to-str ng-model="working.fine_level">
443 <option value="1">[% l('Low') %]</option>
444 <option value="2" selected>[% l('Normal') %]</option>
445 <option value="3">[% l('High') %]</option>
448 <div ng-if="hasMulti()">
449 <div ng-if="working.MultiMap.fine_level.length > 1 && working.fine_level === undefined">
450 <eg-list-counts label="[% l('Multiple levels') %]"
451 list="working.MultiMap.fine_level" render="fineLabel"
452 on-select="select_by_fine_level"></eg-list-counts>
456 <li ng-if="defaults.copy_notes">
457 <div class="bg-info"><label>[% l('Item Notes') %]</label></div>
458 <div ng-class="{'bg-success': working.copy_notes !== undefined}">
459 <button class="btn btn-default" type="button"
460 ng-click="copy_notes_dialog(workingGridControls.selectedItems())">
461 [% l('Item Notes') %]
464 <div ng-if="hasMulti()"> </div>
466 <li ng-if="defaults.attributes.alerts">
467 <div class="bg-info"><label>[% l('Item Alerts') %]</label></div>
468 <div ng-class="{'bg-success': working.alerts !== undefined}">
469 <button class="btn btn-default" type="button"
470 ng-click="copy_alerts_dialog(workingGridControls.selectedItems())">
471 [% l('Item Alerts') %]
474 <div ng-if="hasMulti()"> </div>
476 <li ng-if="defaults.attributes.floating">
477 <div class="bg-info"><label>[% l('Floating') %]</label></div>
478 <div ng-class="{'bg-success': working.floating !== undefined, 'field-changed': field_changed('floating')}">
479 <select class="form-control" ng-model="working.floating"
480 ng-options="a.id() as a.name() for a in floating_list">
481 <option value="">[% l('<NONE>') %]</option>
484 <div ng-if="hasMulti()">
485 <div ng-if="working.MultiMap.floating.length > 1 && working.floating === undefined">
486 <eg-list-counts label="[% l('Multiple values') %]"
487 list="working.MultiMap.floating" render="floatingName"
488 on-select="select_by_floating"></eg-list-counts>
492 <li ng-if="defaults.copy_tags">
493 <div class="bg-info"><label>[% l('Item Tags') %]</label></div>
494 <div ng-class="{'bg-success': working.copy_tags !== undefined}">
496 class="btn btn-default"
497 ng-click="copy_tags_dialog(workingGridControls.selectedItems())"
499 [% l('View/Edit Item Tags') %]
502 <div ng-if="hasMulti()"> </div>
504 <li ng-if="defaults.statcats">
505 <div class="bg-info"><label>[% l('Statistical Categories') %]</label></div>
507 <select class="form-control" ng-disabled="!defaults.statcats"
508 ng-model="working.statcat_filter"
509 ng-options="o.id() as o.shortname() for o in statcat_filter_list">
510 <option value="">[% l('Filter by Library') %]</option>
513 <div ng-if="hasMulti()"> </div>
516 <li ng-repeat="sc in statcats | orderBy:['owner().name()','name()']" ng-if="statcat_visible(sc.owner().id())">
517 <div class="bg-info"><label>{{sc.owner().name() }} : {{ sc.name()}}</label></div>
518 <div ng-class="{'bg-success': working.statcats[sc.id()] !== undefined}">
519 <select class="form-control" ng-disabled="!defaults.statcats"
520 ng-change="statcatUpdate(sc.id())"
521 ng-model="working.statcats[sc.id()]"
522 ng-options="e.id() as e.value() for e in sc.entries()"
523 ng-required="sc.required() == 't' && !working.statcats_multi[sc.id()]">
525 {{ !working.statcats_multi[sc.id()] ? '[% l('<NONE>') %]' : '[% l('<MULTIPLE>') %]' }}
529 <div ng-if="hasMulti()"> </div>