lp1922296 Course Materials Update Call Number Prefix/Suffix On Association user/khuckins/lp19222960-update-callnumber-prefix-suffix-on-item-association
authorKyle Huckins <khuckins@catalyte.io>
Wed, 9 Feb 2022 23:41:18 +0000 (23:41 +0000)
committerKyle Huckins <khuckins@catalyte.io>
Fri, 11 Feb 2022 17:12:30 +0000 (17:12 +0000)
- Update DB scripts to add Original Prefix and Suffix columns to Course Materials
- Update fmIDL to add Original Prefix and Suffix properties to the Course Material IDL Object
- Add Course Service function retrievePrefixSuffixList to retrieve all possible Callnumber Prefix and Suffixes
- Add UI Entries for CN Prefix and Suffix on the Associate Materials Page

Signed-off-by: Kyle Huckins <khuckins@catalyte.io>
Open-ILS/examples/fm_IDL.xml
Open-ILS/src/eg2/src/app/staff/admin/local/course-reserves/course-associate-material.component.html
Open-ILS/src/eg2/src/app/staff/admin/local/course-reserves/course-associate-material.component.ts
Open-ILS/src/eg2/src/app/staff/share/course.service.ts
Open-ILS/src/sql/Pg/040.schema.asset.sql
Open-ILS/src/sql/Pg/upgrade/XXXX-lp19222960-update-callnumber-prefix-suffix-on-item-association.sql [new file with mode: 0644]

index 6d8199f..695180f 100644 (file)
@@ -3312,12 +3312,16 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
             <field reporter:label="Original Circ Modifier" name="original_circ_modifier" reporter:datatype="link" />
             <field reporter:label="Original Shelving Location" name="original_location" reporter:datatype="link" />
             <field reporter:label="Original Callnumber" name="original_callnumber" reporter:datatype="link" />
+            <field reporter:label="Original Callnumber Prefix" name="original_callnumber_prefix" reporter:datatype="link" />
+            <field reporter:label="Original Callnumber Suffix" name="original_callnumber_suffix" reporter:datatype="link" />
         </fields>
         <links>
             <link field="course" reltype="has_a" key="id" map="" class="acmc" />
             <link field="item" reltype="has_a" key="id" map="" class="acp" />
             <link field="record" reltype="has_a" key="id" map="" class="bre" />
             <link field="original_callnumber" reltype="has_a" key="id" map="" class="acn" />
+            <link field="original_callnumber_prefix" reltype="has_a" key="id" map="" class="acnp" />
+            <link field="original_callnumber_suffix" reltype="has_a" key="id" map="" class="acns" />
             <link field="original_status" reltype="has_a" key="id" map="" class="ccs" />
             <link field="original_circ_modifier" reltype="has_a" key="code" map="" class="ccm" />
             <link field="original_location" reltype="has_a" key="id" map="" class="acpl" />
index aec9838..5c22737 100644 (file)
                   <div class="input-group">
                     <div class="input-group-prepend">
                       <div class="input-group-text">
+                        <label for="associate-item-temp-call-number-prefix" i18n>Call Number Prefix</label>
+                      </div>
+                    </div>
+                    <eg-combobox [smallFormControl]="true" [(ngModel)]="tempCallNumberPrefix" label="associate-item-temp-call-number-prefix"
+                      [disabled]="currentCourse && currentCourse.is_archived() == 't'" class="flex-grow-1">
+                      <eg-combobox-entry *ngFor="let prefix of prefixList"
+                        [entryId]="prefix.id()" [entryLabel]="prefix.label()">
+                      </eg-combobox-entry>
+                    </eg-combobox>
+                    <div class="input-group-append">
+                      <div class="input-group-text">
+                        <input type="checkbox" [(ngModel)]="isModifyingCallNumberPrefix"
+                          [disabled]="currentCourse && currentCourse.is_archived() == 't'"
+                          aria-label="Checkbox for setting a temporary Call Number Prefix" />
+                      </div>
+                    </div>
+                  </div>
+                </div>
+                <div class="d-flex" [ngClass]="isDialog() ? 'col-md-6' : 'col-md-12 mt-3'">
+                  <div class="input-group">
+                    <div class="input-group-prepend">
+                      <div class="input-group-text">
+                        <label for="associate-item-temp-call-number-suffix" i18n>Call Number Suffix</label>
+                      </div>
+                    </div>
+                    <eg-combobox [smallFormControl]="true" [(ngModel)]="tempCallNumberSuffix" label="associate-item-temp-call-number-suffix"
+                      [disabled]="currentCourse && currentCourse.is_archived() == 't'" class="flex-grow-1">
+                      <eg-combobox-entry *ngFor="let suffix of suffixList"
+                        [entryId]="suffix.id()" [entryLabel]="suffix.label()">
+                      </eg-combobox-entry>
+                    </eg-combobox>
+                    <div class="input-group-append">
+                      <div class="input-group-text">
+                        <input type="checkbox" [(ngModel)]="isModifyingCallNumberSuffix"
+                          [disabled]="currentCourse && currentCourse.is_archived() == 't'"
+                          aria-label="Checkbox for setting a temporary Call Number Suffix" />
+                      </div>
+                    </div>
+                  </div>
+                </div>
+                <div class="d-flex" [ngClass]="isDialog() ? 'col-md-6' : 'col-md-12 mt-3'">
+                  <div class="input-group">
+                    <div class="input-group-prepend">
+                      <div class="input-group-text">
                         <span i18n>Circulation Modifier</span>
                       </div>
                     </div>
index 9a8264c..409501e 100644 (file)
@@ -44,15 +44,21 @@ export class CourseAssociateMaterialComponent extends DialogComponent implements
     @ViewChild('materialAddDifferentLibraryString', { static: true })
         materialAddDifferentLibraryString: StringComponent;
     materialsDataSource: GridDataSource;
+    @Input() prefixList: any[] = [];
+    @Input() suffixList: any[] = [];
     @Input() barcodeInput: String;
     @Input() relationshipInput: String;
     @Input() tempCallNumber: String;
+    @Input() tempCallNumberPrefix: String;
+    @Input() tempCallNumberSuffix: String;
     @Input() tempStatus: Number;
     @Input() tempLocation: Number;
     @Input() tempCircMod: String;
     @Input() isModifyingStatus: Boolean;
     @Input() isModifyingCircMod: Boolean;
     @Input() isModifyingCallNumber: Boolean;
+    @Input() isModifyingCallNumberPrefix: Boolean;
+    @Input() isModifyingCallNumberSuffix: Boolean;
     @Input() isModifyingLocation: Boolean;
     bibId: number;
 
@@ -84,6 +90,10 @@ export class CourseAssociateMaterialComponent extends DialogComponent implements
     }
 
     ngOnInit() {
+        let prefixSuffixList = this.course.retrievePrefixSuffixList();
+        console.log(prefixSuffixList);
+        this.prefixList = prefixSuffixList.prefixList;
+        this.suffixList = prefixSuffixList.suffixList;
         this.associateBriefRecord = (newRecord: string) => {
             return this.net.request(
                 'open-ils.courses',
@@ -164,6 +174,8 @@ export class CourseAssociateMaterialComponent extends DialogComponent implements
                 barcode: barcode.trim(),
                 relationship: relationship,
                 isModifyingCallNumber: this.isModifyingCallNumber,
+                isModifyingCallNumberPrefix: this.isModifyingCallNumberPrefix,
+                isModifyingCallNumberSuffix: this.isModifyingCallNumberSuffix,
                 isModifyingCircMod: this.isModifyingCircMod,
                 isModifyingLocation: this.isModifyingLocation,
                 isModifyingStatus: this.isModifyingStatus,
@@ -182,6 +194,12 @@ export class CourseAssociateMaterialComponent extends DialogComponent implements
                     item = associatedMaterial.item;
                     let new_cn = item.call_number().label();
                     if (this.tempCallNumber) { new_cn = this.tempCallNumber; }
+                    if (this.tempCallNumberPrefix) {
+                        item.call_number().prefix(this.tempCallNumberPrefix);
+                    }
+                    if (this.tempCallNumberSuffix) {
+                        item.call_number().suffix(this.tempCallNumberSuffix);
+                    }
                     this.course.updateItem(item, this.currentCourse.owning_lib(),
                         new_cn, args.isModifyingCallNumber
                     ).then(resp => {
index 080626b..3516045 100644 (file)
@@ -127,6 +127,14 @@ export class CourseService {
         if (args.isModifyingCallNumber) {
             material.original_callnumber(item.call_number());
         }
+        if (args.isModifyingCallNumberPrefix) {
+            material.original_callnumber(item.call_number());
+            material.original_callnumber_prefix(item.call_number().prefix());
+        }
+        if (args.isModifyingCallNumberSuffix) {
+            material.original_callnumber(item.call_number());
+            material.original_callnumber_suffix(item.call_number().suffix);
+        }
         const response = {
             item: item,
             material: this.pcrud.create(material).toPromise()
@@ -195,7 +203,7 @@ export class CourseService {
 
     resetItemFields(material, course_lib) {
         this.pcrud.retrieve('acp', material.item(),
-            {flesh: 3, flesh_fields: {acp: ['call_number']}}).subscribe(copy => {
+            {flesh: 3, flesh_fields: {acp: ['call_number'], acn: ['prefix', 'suffix']}}).subscribe(copy => {
             if (material.original_status()) {
                 copy.status(material.original_status());
             }
@@ -205,22 +213,43 @@ export class CourseService {
             if (material.original_location()) {
                 copy.location(material.original_location());
             }
+            if (material.original_callnumber_prefix()) {
+                copy.call_number().prefix(material.original_callnumber_prefix);
+            }
+            if (material.original_callnumber_suffix()) {
+                copy.call_number().suffix(material.original_callnumber_suffix);
+            }
             if (material.original_callnumber()) {
                 this.pcrud.retrieve('acn', material.original_callnumber()).subscribe(cn => {
-                    this.updateItem(copy, course_lib, cn.label(), true);
+                    this.updateItem(copy, course_lib, cn, true);
                 });
             } else {
-                this.updateItem(copy, course_lib, copy.call_number().label(), false);
+                this.updateItem(copy, course_lib, copy.call_number(), false);
             }
         });
     }
 
+    retrievePrefixSuffixList() {
+        const prefixList = [];
+        const suffixList = [];
+        this.pcrud.retrieveAll("acnp").subscribe(prefix => {
+            prefixList.push(prefix);
+        });
+        this.pcrud.retrieveAll("acns").subscribe(suffix => {
+            suffixList.push(suffix);
+        });
+        console.log(prefixList);
+        console.log(suffixList);
+        return {prefixList, suffixList};
+    }
+
 
     updateItem(item: IdlObject, courseLib, callNumber, updatingVolume) {
         return new Promise((resolve, reject) => {
             this.pcrud.update(item).subscribe(() => {
                 if (updatingVolume) {
                     const cn = item.call_number();
+                    console.log(cn);
                     const callNumberLibrary = this.org.canHaveVolumes(courseLib) ? courseLib.id() : cn.owning_lib();
                     return this.net.request(
                         'open-ils.cat', 'open-ils.cat.call_number.find_or_create',
@@ -241,6 +270,7 @@ export class CourseService {
                             resolve(item);
                         });
                     }, err => {
+                        console.log(err);
                         reject(err);
                     }, () => {
                         resolve(item);
index e269238..3b1d333 100644 (file)
@@ -1127,6 +1127,8 @@ CREATE TABLE asset.course_module_course_materials (
     original_status        INT REFERENCES config.copy_status,
     original_circ_modifier TEXT, --REFERENCES config.circ_modifier
     original_callnumber    INT REFERENCES asset.call_number,
+    original_callnumber_prefix    INT REFERENCES asset.call_number_prefix,
+    original_callnumber_suffix    INT REFERENCES asset.call_number_suffix,
     unique (course, item, record)
 );
 
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX-lp19222960-update-callnumber-prefix-suffix-on-item-association.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX-lp19222960-update-callnumber-prefix-suffix-on-item-association.sql
new file mode 100644 (file)
index 0000000..8422d35
--- /dev/null
@@ -0,0 +1,9 @@
+BEGIN;\r
+\r
+SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);\r
+\r
+ALTER TABLE asset.course_module_course_materials\r
+    ADD COLUMN original_callnumber_prefix    INT REFERENCES asset.call_number_prefix,\r
+    ADD COLUMN original_callnumber_suffix    INT REFERENCES asset.call_number_suffix\r
+    \r
+COMMIT;
\ No newline at end of file