From: Jason Etheridge Date: Wed, 14 Dec 2022 21:45:10 +0000 (-0500) Subject: LP 1855781 fixup X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=d33604bb25c89d8de8062a12cda91915da28c904;p=working%2FEvergreen.git LP 1855781 fixup * put out some fires after rebasing and smoketesting * persistKey to enable Save Grid Settings * disable Edit Selected action unless exactly one row is selected * allow for the explicit setting of null for certain eligible fields in fmEditor * support appending custom templates to fields in fmEditor * simplify/robustify the insertion of dividers in fmEditor here with the new appendTemplate fmOption * i18nize this helpText * style this header the same way as the fmEditor * required property seems to work for eg-org-select well, just the styling. Could maybe replace eg-org-select with eg-org-family-select which has some form smarts * release notes Additional tweaks since the last pullrequest: * replacing checkboxes with eg-bool-select in fm-editor * required and validation for eg-bool-select * Change Copy Location to Shelving Location in the IDL If we wanted to catch every instance of Copy Location, we could do something like ack -li 'copy location' > /tmp/list.txt # vim /tmp/list.txt # some care needed with pruning the list. Worthy of its own ticket and commit, IMO for x in `cat /tmp/list.txt` ; do sed -i 's/copy location/Shelving Location/gi' $x ; done * fix a typo and relabel the new policy button * relabel some more fields in the IDL "Copy Circ Lib" and "Copy Owning Lib" become "Item Circ Library" and "Item Owning Library", respectively. * Org Unit becomes Checkout Library for the circ matrix. Checkout is more prevalent in the code than Check Out, but we should pick one. * grid filters and some cruft removal * org selector. We should really find a way to leverage the AdminPageComponent here rather than crib code from it. Signed-off-by: Jason Etheridge --- diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index 63353a3704..74f312b0fe 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -2060,12 +2060,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - + + - + @@ -2167,14 +2167,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - - - - + + + + - + @@ -2195,7 +2195,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - + @@ -2318,11 +2318,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - + - + @@ -5321,7 +5321,7 @@ SELECT usr, - + @@ -5411,7 +5411,7 @@ SELECT usr, - + @@ -5819,7 +5819,7 @@ SELECT usr, - + @@ -5850,7 +5850,7 @@ SELECT usr, - + @@ -5869,7 +5869,7 @@ SELECT usr, - + @@ -6625,11 +6625,11 @@ SELECT usr, - - + + - + @@ -6993,7 +6993,7 @@ SELECT usr, - + @@ -7266,7 +7266,7 @@ SELECT usr, - + @@ -8194,8 +8194,8 @@ SELECT usr, - - + + @@ -10614,7 +10614,7 @@ SELECT usr, - + diff --git a/Open-ILS/src/eg2/src/app/share/boolean-select/boolean-select.component.css b/Open-ILS/src/eg2/src/app/share/boolean-select/boolean-select.component.css new file mode 100644 index 0000000000..43bf66b251 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/share/boolean-select/boolean-select.component.css @@ -0,0 +1,3 @@ +label { + margin-left: 8px; +} diff --git a/Open-ILS/src/eg2/src/app/share/boolean-select/boolean-select.component.html b/Open-ILS/src/eg2/src/app/share/boolean-select/boolean-select.component.html new file mode 100644 index 0000000000..0b45b6fe3d --- /dev/null +++ b/Open-ILS/src/eg2/src/app/share/boolean-select/boolean-select.component.html @@ -0,0 +1,14 @@ +
+ + +
diff --git a/Open-ILS/src/eg2/src/app/share/boolean-select/boolean-select.component.ts b/Open-ILS/src/eg2/src/app/share/boolean-select/boolean-select.component.ts new file mode 100644 index 0000000000..1468685d93 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/share/boolean-select/boolean-select.component.ts @@ -0,0 +1,83 @@ +import { Component, ChangeDetectorRef, forwardRef, OnInit, Input, Output } from '@angular/core'; +import {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms'; + +@Component({ + selector: 'eg-bool-select', + templateUrl: './boolean-select.component.html', + styleUrls: ['./boolean-select.component.css'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => BooleanSelectComponent), + multi: true + } + ] +}) + +export class BooleanSelectComponent implements ControlValueAccessor { + + @Input() label: string; + @Input() name: string; + @Input() options: Array<{ label: string; value: any }> = [ + { label: $localize`Yes`, value: true }, + { label: $localize`No`, value: false }, + ]; + private _value: boolean = false; + private _disabled: boolean = false; + private _required: boolean = false; + + onChange: (value: boolean) => void = () => {}; + onTouched: () => void = () => {}; + + get value(): boolean { + return this._value; + } + + set value(value: boolean) { + this._value = value; + this.onChange(value); + this.onTouched(); + } + + writeValue(value: any): void { + this._value = value; + this.cdr.detectChanges(); + } + + registerOnChange(fn: (value: boolean) => void): void { + this.onChange = fn; + } + + registerOnTouched(fn: () => void): void { + this.onTouched = fn; + } + + get disabled(): boolean { + return this._disabled; + } + + set disabled(value: boolean) { + this._disabled = value; + } + + setDisabledState?(isDisabled: boolean): void { + this.disabled = isDisabled; + } + + get required(): boolean { + return this._required; + } + + set required(value: boolean) { + this._required = value; + } + + setRequiredState?(isRequired: boolean): void { + this.required = isRequired; + } + + constructor(public cdr: ChangeDetectorRef) {}; + + ngOnInit(): void {} + +} diff --git a/Open-ILS/src/eg2/src/app/share/common-widgets.module.ts b/Open-ILS/src/eg2/src/app/share/common-widgets.module.ts index 49fdc7bce0..b4c0eb43ec 100644 --- a/Open-ILS/src/eg2/src/app/share/common-widgets.module.ts +++ b/Open-ILS/src/eg2/src/app/share/common-widgets.module.ts @@ -11,6 +11,7 @@ import {EgCoreModule} from '@eg/core/core.module'; import {ComboboxComponent, IdlClassTemplateDirective} from '@eg/share/combobox/combobox.component'; import {ComboboxEntryComponent} from '@eg/share/combobox/combobox-entry.component'; import {DateSelectComponent} from '@eg/share/date-select/date-select.component'; +import {BooleanSelectComponent} from '@eg/share/boolean-select/boolean-select.component'; import {OrgSelectComponent} from '@eg/share/org-select/org-select.component'; import {DateRangeSelectComponent} from '@eg/share/daterange-select/daterange-select.component'; import {DateTimeSelectComponent} from '@eg/share/datetime-select/datetime-select.component'; @@ -25,6 +26,7 @@ import {ClipboardDialogComponent} from '@eg/share/clipboard/clipboard-dialog.com ComboboxComponent, ComboboxEntryComponent, DateSelectComponent, + BooleanSelectComponent, OrgSelectComponent, DateRangeSelectComponent, DateTimeSelectComponent, @@ -49,6 +51,7 @@ import {ClipboardDialogComponent} from '@eg/share/clipboard/clipboard-dialog.com ComboboxComponent, ComboboxEntryComponent, DateSelectComponent, + BooleanSelectComponent, OrgSelectComponent, DateRangeSelectComponent, DateTimeSelectComponent, diff --git a/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.html b/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.html index 8a734fb144..1235f8173a 100644 --- a/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.html +++ b/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.html @@ -34,10 +34,14 @@ Dates must be in the correct order -
+ +
+ +
(Unset) +
@@ -95,6 +99,7 @@ domId="{{idPrefix}}-{{field.name}}" [limitPerms]="modePerms[mode]" [readOnly]="field.readOnly" + [required]="field.isRequired()" [applyDefault]="field.orgDefaultAllowed" [applyOrgId]="record[field.name]()" (onChange)="record[field.name]($event)"> @@ -155,14 +160,15 @@ - + (ngModelChange)="record[field.name]($event)"> + + @@ -207,6 +213,12 @@
+ + + + +
diff --git a/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts b/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts index 7328f080c7..dff77f094c 100644 --- a/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts +++ b/Open-ILS/src/eg2/src/app/share/fm-editor/fm-editor.component.ts @@ -16,6 +16,7 @@ import {FormatService} from '@eg/core/format.service'; import {TranslateComponent} from '@eg/share/translate/translate.component'; import {FmRecordEditorActionComponent} from './fm-editor-action.component'; import {ConfirmDialogComponent} from '@eg/share/dialog/confirm.component'; +import {BooleanSelectComponent} from '@eg/share/boolean-select/boolean-select.component'; import {Directive, HostBinding} from '@angular/core'; import {AbstractControl, NG_VALIDATORS, ValidationErrors, Validator, Validators} from '@angular/forms'; @@ -84,6 +85,9 @@ export interface FmFieldOptions { // from the default set of form inputs. customTemplate?: CustomFieldTemplate; + // Follow the normal field rendering with this custom template + appendTemplate?: CustomFieldTemplate; + // help text to display via a popover helpText?: StringComponent; @@ -426,9 +430,10 @@ export class FmRecordEditorComponent if (field.datatype === 'bool') { if (rec[field.name]() === true) { rec[field.name]('t'); - // } else if (rec[field.name]() === false) { - } else { // TODO: some bools can be NULL + } else if (rec[field.name]() === false) { rec[field.name]('f'); + } else { + rec[field.name](null); } } else if (field.datatype === 'org_unit') { const org = rec[field.name](); @@ -523,6 +528,11 @@ export class FmRecordEditorComponent }; } + if (fieldOptions.appendTemplate) { + field.append_template = fieldOptions.appendTemplate.template; + field.append_context = fieldOptions.appendTemplate.context; + } + if (fieldOptions.customTemplate) { field.template = fieldOptions.customTemplate.template; field.context = fieldOptions.customTemplate.context; @@ -595,6 +605,13 @@ export class FmRecordEditorComponent }, fieldDef.context || {} ); } + appendTemplateFieldContext(fieldDef: any): CustomFieldContext { + return Object.assign( + { record : this.record, + field: fieldDef // from this.fields + }, fieldDef.append_context || {} + ); + } save() { const recToSave = this.idl.clone(this.record); @@ -720,6 +737,23 @@ export class FmRecordEditorComponent } ); } + + isSafeToNull(field) { + if (field.datatype == 'id') { + return false; + } + if (field.readOnly) { + return false; + } + if (field.isRequired()) { + return false; + } + return true; + } + + setToNull(field) { + this.record[field.name](null); + } } // https://stackoverflow.com/a/57812865 diff --git a/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/circ-matrix-matchpoint.component.html b/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/circ-matrix-matchpoint.component.html index 9bedaa58bb..76299e9fdb 100644 --- a/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/circ-matrix-matchpoint.component.html +++ b/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/circ-matrix-matchpoint.component.html @@ -5,15 +5,44 @@ + +
+
+ + + + +
+
+
+ + Filters Applied: {{gridFilters | json}} + Clear Filters + +
+
+
+
+ + label="New Circulation Policy" i18n-label (onClick)="createNew()"> - + @@ -30,54 +59,20 @@ -
- -
-
-
Circulation Policies
+
+
+ + +
-
- -
-
-
Circulation Policy Effects
+
+
+ + +
@@ -89,6 +84,6 @@ fieldOrder="id,active,grp,org_unit,copy_circ_lib,copy_owning_lib,user_home_ou,is_renewal,juvenile_flag,circ_modifier,copy_location,marc_type,marc_form,marc_bib_level,marc_vr_format,ref_flag,usr_age_lower_bound,usr_age_upper_bound,item_age,circulate,duration_rule,renewals,hard_due_date,recurring_fine_rule,grace_period,max_fine_rule,available_copy_hold_ratio,total_copy_hold_ratio,script_test,description" requiredFields="active,grp,org_unit" (recordSaved)="configureLimitSets($event); clearLinkedCircLimitSets(); closeDialog()" - [fieldOptions]="{active:{customTemplate:{template:active}}, item_age:{customTemplate:{template:item_age}}}"> + [fieldOptions]="{active:{appendTemplate:{template:active}}, item_age:{appendTemplate:{template:item_age}}}"> - \ No newline at end of file + diff --git a/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/circ-matrix-matchpoint.component.ts b/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/circ-matrix-matchpoint.component.ts index 535aa0aaee..6dc8443a67 100644 --- a/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/circ-matrix-matchpoint.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/circ-matrix-matchpoint.component.ts @@ -2,22 +2,30 @@ import {Pager} from '@eg/share/util/pager'; import {Component, OnInit, AfterViewInit, Input, ViewChild, ElementRef} from '@angular/core'; import {GridComponent} from '@eg/share/grid/grid.component'; import {GridDataSource, GridColumn, GridRowFlairEntry} from '@eg/share/grid/grid'; -import {IdlObject} from '@eg/core/idl.service'; +import {ActivatedRoute} from '@angular/router'; +import {Location} from '@angular/common'; +import {IdlService, IdlObject} from '@eg/core/idl.service'; import {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component'; import {LinkedCircLimitSetsComponent} from './linked-circ-limit-sets.component'; import {CircMatrixMatchpointDialogComponent} from './circ-matrix-matchpoint-dialog.component'; import {StringComponent} from '@eg/share/string/string.component'; import {PcrudService} from '@eg/core/pcrud.service'; import {ToastService} from '@eg/share/toast/toast.service'; +import {AuthService} from '@eg/core/auth.service'; +import {PermService} from '@eg/core/perm.service'; +import {OrgService} from '@eg/core/org.service'; +import {OrgFamily} from '@eg/share/org-family-select/org-family-select.component'; @Component({ templateUrl: './circ-matrix-matchpoint.component.html' }) export class CircMatrixMatchpointComponent implements OnInit { recId: number; - gridDataSource: GridDataSource; + orgField = 'org_unit'; + disableOrgFilter = false; initDone = false; - dataSource: GridDataSource = new GridDataSource(); + dataSource: GridDataSource; + gridFilters: {[key: string]: string | number}; showLinkLimitSets = false; usedSetLimitList = {}; linkedLimitSets = []; @@ -27,6 +35,7 @@ export class CircMatrixMatchpointComponent implements OnInit { marginTop: '25px', marginLeft: '73%' }; + notOneSelectedRow: (rows: IdlObject[]) => boolean; @ViewChild('limitSets', { static: false }) limitSets: ElementRef; @ViewChild('circLimitSets', { static: true }) limitSetsComponent: LinkedCircLimitSetsComponent; @@ -44,20 +53,94 @@ export class CircMatrixMatchpointComponent implements OnInit { @Input() dialogSize: 'sm' | 'lg' = 'lg'; + idlClassDef: any; + pkeyField: string; + contextOrg: IdlObject; + searchOrgs: OrgFamily; + orgFieldLabel: string; + viewPerms: string; + canCreate: boolean; + constructor( + private route: ActivatedRoute, private pcrud: PcrudService, - private toast: ToastService - ) { - this.gridDataSource = new GridDataSource(); - } + private toast: ToastService, + public idl: IdlService, + private org: OrgService, + public auth: AuthService, + private perm: PermService + ) {} ngOnInit() { this.initDone = true; + this.notOneSelectedRow = (rows: IdlObject[]) => (rows.length !== 1); + this.idlClassDef = this.idl.classes[this.idlClass]; + this.pkeyField = this.idlClassDef.pkey || 'id'; + + // Limit the view org selector to orgs where the user has + // permacrud-encoded view permissions. + const pc = this.idlClassDef.permacrud; + if (pc && pc.retrieve) { + this.viewPerms = pc.retrieve.perms; + } + + const contextOrg = this.route.snapshot.queryParamMap.get('contextOrg'); + this.checkCreatePerms(); + this.applyOrgValues(Number(contextOrg)); + + this.initDataSource(); + } + + applyOrgValues(orgId?: number) { + + if (this.disableOrgFilter) { + this.orgField = null; + return; + } + + if (!this.orgField) { + // If no org unit field is specified, try to find one. + // If an object type has multiple org unit fields, the + // caller should specify one or disable org unit filter. + this.idlClassDef.fields.forEach(field => { + if (field['class'] === 'aou') { + this.orgField = field.name; + } + }); + } + + if (this.orgField) { + this.orgFieldLabel = this.idlClassDef.field_map[this.orgField].label; + this.contextOrg = this.org.get(orgId) || this.org.get(this.auth.user().ws_ou()) || this.org.root(); + this.searchOrgs = {primaryOrgId: this.contextOrg.id()}; + } + } + + checkCreatePerms() { + this.canCreate = false; + const pc = this.idlClassDef.permacrud || {}; + const perms = pc.create ? pc.create.perms : []; + if (perms.length === 0) { return; } + + this.perm.hasWorkPermAt(perms, true).then(permMap => { + Object.keys(permMap).forEach(key => { + if (permMap[key].length > 0) { + this.canCreate = true; + } + }); + }); + } + + initDataSource() { + this.dataSource = new GridDataSource(); + this.dataSource.getRows = (pager: Pager, sort: any[]) => { const orderBy: any = {}; + if (sort.length) { // Sort specified from grid orderBy[this.idlClass] = sort[0].name + ' ' + sort[0].dir; + } else if (this.sortField) { // Default sort field orderBy[this.idlClass] = this.sortField; @@ -68,7 +151,42 @@ export class CircMatrixMatchpointComponent implements OnInit { limit: pager.limit, order_by: orderBy }; - return this.pcrud.retrieveAll('ccmm', searchOps, {fleshSelectors: true}); + + if (!this.contextOrg && !this.gridFilters && !Object.keys(this.dataSource.filters).length) { + // No org filter -- fetch all rows + return this.pcrud.retrieveAll( + this.idlClass, searchOps, {fleshSelectors: true}); + } + + const search: any[] = new Array(); + const orgFilter: any = {}; + + if (this.orgField && (this.searchOrgs || this.contextOrg)) { + orgFilter[this.orgField] = + this.searchOrgs.orgIds || [this.contextOrg.id()]; + search.push(orgFilter); + } + + Object.keys(this.dataSource.filters).forEach(key => { + Object.keys(this.dataSource.filters[key]).forEach(key2 => { + search.push(this.dataSource.filters[key][key2]); + }); + }); + + // FIXME - do we want to remove this, which is used in several + // secondary admin pages, in favor of switching it to the built-in + // grid filtering? + if (this.gridFilters) { + // Lay the URL grid filters over our search object. + Object.keys(this.gridFilters).forEach(key => { + const urlProvidedFilters = {}; + urlProvidedFilters[key] = this.gridFilters[key]; + search.push(urlProvidedFilters); + }); + } + + return this.pcrud.search( + this.idlClass, search, searchOps, {fleshSelectors: true}); }; } @@ -199,7 +317,7 @@ export class CircMatrixMatchpointComponent implements OnInit { } deleteLimitSets(limitSet) { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { if (limitSet.isDeleted) { if (limitSet.linkedLimitSet.id()) { this.pcrud.remove(limitSet.linkedLimitSet).subscribe(res => { diff --git a/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/circ-matrix-matchpoint.module.ts b/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/circ-matrix-matchpoint.module.ts index 516fb90962..6ac7b60869 100644 --- a/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/circ-matrix-matchpoint.module.ts +++ b/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/circ-matrix-matchpoint.module.ts @@ -23,7 +23,7 @@ import {CircMatrixMatchpointDialogComponent} from './circ-matrix-matchpoint-dial ] }) -export class CircMatrixMathpointModule { +export class CircMatrixMatchpointModule { } diff --git a/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/linked-circ-limit-sets.component.html b/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/linked-circ-limit-sets.component.html index 07ef8c52a3..04f46ec45e 100644 --- a/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/linked-circ-limit-sets.component.html +++ b/Open-ILS/src/eg2/src/app/staff/admin/local/circ_matrix_matchpoint/linked-circ-limit-sets.component.html @@ -2,7 +2,7 @@
-
+
@@ -64,7 +64,7 @@ (click)="addLinkedSet()" i18n-title title="Add" i18n>Add - +
diff --git a/Open-ILS/src/eg2/src/app/staff/admin/local/routing.module.ts b/Open-ILS/src/eg2/src/app/staff/admin/local/routing.module.ts index 3b52752521..2eba2f0463 100644 --- a/Open-ILS/src/eg2/src/app/staff/admin/local/routing.module.ts +++ b/Open-ILS/src/eg2/src/app/staff/admin/local/routing.module.ts @@ -101,7 +101,8 @@ const routes: Routes = [{ import('./negative-balances/negative-balances.module').then(m => m.NegativeBalancesModule) }, { path: 'config/circ_matrix_matchpoint', - loadChildren: '@eg/staff/admin/local/circ_matrix_matchpoint/circ-matrix-matchpoint.module#CircMatrixMathpointModule' + loadChildren: () => + import('./circ_matrix_matchpoint/circ-matrix-matchpoint.module').then(m => m.CircMatrixMatchpointModule) }, { path: ':schema/:table', component: BasicAdminPageComponent diff --git a/Open-ILS/src/sql/Pg/950.data.seed-values.sql b/Open-ILS/src/sql/Pg/950.data.seed-values.sql index 346c273411..af3d7da1e0 100644 --- a/Open-ILS/src/sql/Pg/950.data.seed-values.sql +++ b/Open-ILS/src/sql/Pg/950.data.seed-values.sql @@ -23249,3 +23249,12 @@ VALUES ( ) ); +INSERT INTO config.workstation_setting_type (name, grp, datatype, label) +VALUES ( + 'eg.grid.admin.config.circ_matrix_matchpoint', 'gui', 'object', + oils_i18n_gettext( + 'eg.grid.admin.config.circ_matrix_matchpoint', + 'Grid Config: admin.config.circ_matrix_matchpoint', + 'cwst', 'label' + ) +); diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.data.circPolicy-grid-ws-settings.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.data.circPolicy-grid-ws-settings.sql new file mode 100644 index 0000000000..4fca655461 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.data.circPolicy-grid-ws-settings.sql @@ -0,0 +1,15 @@ +BEGIN; + +SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version); + +INSERT INTO config.workstation_setting_type (name, grp, datatype, label) +VALUES ( + 'eg.grid.admin.config.circ_matrix_matchpoint', 'gui', 'object', + oils_i18n_gettext( + 'eg.grid.admin.config.circ_matrix_matchpoint', + 'Grid Config: admin.config.circ_matrix_matchpoint', + 'cwst', 'label' + ) +); + +COMMIT; diff --git a/docs/RELEASE_NOTES_NEXT/miscellaneous.adoc b/docs/RELEASE_NOTES_NEXT/miscellaneous.adoc index bb32c8357c..8abbe01475 100644 --- a/docs/RELEASE_NOTES_NEXT/miscellaneous.adoc +++ b/docs/RELEASE_NOTES_NEXT/miscellaneous.adoc @@ -11,3 +11,10 @@ * Prevent templates from applying or changing magical status in angular holdings editor (LP#1999401) * Prevent directly editing the shelving location deleted field in the Shelving Locations Editor (LP#2002435) * The "Strict Barcode" checkbox is now closer to the barcode input on the Check Out, Check In, and Renew Items pages (LP#1990968) +* Angularized the Local Administration -> Circulation Policies interface. +* Added an option to fmEditor for allowing one to unset a field (aka set to null) +* Added some misc fmEditor tweaks/additions for developers +* Replaced checkboxes for boolean fields in fmEditor with radio buttons +* Changed instances of Copy Location to Shelving Location in the IDL, which wil be reflected in many interfaces. +* Also, in the IDL, "Copy Circ Lib" and "Copy Owning Lib" become "Item Circ Library" and "Item Owning Library", respectively. +* Org Unit becomes Checkout Library for the circ matrix. Checkout is more prevalent in the code than Check Out, but we should pick one.