From: Jane Sandberg Date: Sun, 2 Aug 2020 18:10:30 +0000 (-0700) Subject: LP1849212: Add a course reserves facet X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=9de1f40af9b63f5b11faf8be866888ef2a0c19d2;p=working%2FEvergreen.git LP1849212: Add a course reserves facet Signed-off-by: Jane Sandberg --- diff --git a/Open-ILS/src/eg2/src/app/staff/catalog/result/facets.component.html b/Open-ILS/src/eg2/src/app/staff/catalog/result/facets.component.html index 2c2cb14cdb..94f9d5cbe6 100644 --- a/Open-ILS/src/eg2/src/app/staff/catalog/result/facets.component.html +++ b/Open-ILS/src/eg2/src/app/staff/catalog/result/facets.component.html @@ -7,7 +7,7 @@ } .list-group-item {padding: .5rem .75rem .5rem .75rem} -
+
{{value.count}}
diff --git a/Open-ILS/src/eg2/src/app/staff/catalog/result/facets.component.ts b/Open-ILS/src/eg2/src/app/staff/catalog/result/facets.component.ts index aacb27c3bc..38a99a7155 100644 --- a/Open-ILS/src/eg2/src/app/staff/catalog/result/facets.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/catalog/result/facets.component.ts @@ -1,4 +1,5 @@ import {Component, OnInit, Input} from '@angular/core'; +import {OrgService} from '@eg/core/org.service'; import {CatalogService} from '@eg/share/catalog/catalog.service'; import {CatalogUrlService} from '@eg/share/catalog/catalog-url.service'; import {CatalogSearchContext, FacetFilter} from '@eg/share/catalog/search-context'; @@ -10,11 +11,13 @@ export const FACET_CONFIG = { {facetClass : 'subject', facetOrder : ['topic']}, {facetClass : 'identifier', facetOrder : ['genre']}, {facetClass : 'series', facetOrder : ['seriestitle']}, - {facetClass : 'subject', facetOrder : ['name', 'geographic']} + {facetClass : 'subject', facetOrder : ['name', 'geographic']}, ], displayCount : 5 }; +const RESERVE_FACET_DISPLAY = {facetClass : 'boolean_facet', facetOrder : ['on_reserve']}; + @Component({ selector: 'eg-catalog-result-facets', templateUrl: 'facets.component.html' @@ -27,13 +30,22 @@ export class ResultFacetsComponent implements OnInit { constructor( private cat: CatalogService, private catUrl: CatalogUrlService, - private staffCat: StaffCatalogService + private org: OrgService, + private staffCat: StaffCatalogService, ) { this.facetConfig = FACET_CONFIG; } ngOnInit() { - this.searchContext = this.staffCat.searchContext; + // If the org unit uses the Course Materials module, make sure to display the + // on_reserve facet + this.org.settings('circ.course_materials_opt_in').then((results) => { + if (results['circ.course_materials_opt_in'] && + (this.facetConfig.display.indexOf(RESERVE_FACET_DISPLAY) === -1)) { + this.facetConfig.display.push(RESERVE_FACET_DISPLAY); + } + this.searchContext = this.staffCat.searchContext; + }); } facetIsApplied(cls: string, name: string, value: string): boolean { diff --git a/Open-ILS/src/sql/Pg/030.schema.metabib.sql b/Open-ILS/src/sql/Pg/030.schema.metabib.sql index 0c82fc89d9..ac2d7f0eee 100644 --- a/Open-ILS/src/sql/Pg/030.schema.metabib.sql +++ b/Open-ILS/src/sql/Pg/030.schema.metabib.sql @@ -1073,7 +1073,7 @@ BEGIN PERFORM * FROM config.internal_flag WHERE name = 'ingest.assume_inserts_only' AND enabled; IF NOT FOUND THEN IF NOT b_skip_search THEN - FOR fclass IN SELECT * FROM config.metabib_class LOOP + FOR fclass IN SELECT * FROM config.metabib_class WHERE name != 'boolean_facet' LOOP -- RAISE NOTICE 'Emptying out %', fclass.name; EXECUTE $$DELETE FROM metabib.$$ || fclass.name || $$_field_entry WHERE source = $$ || bib_id; END LOOP; diff --git a/Open-ILS/src/sql/Pg/040.schema.asset.sql b/Open-ILS/src/sql/Pg/040.schema.asset.sql index 0207797284..bf515940e4 100644 --- a/Open-ILS/src/sql/Pg/040.schema.asset.sql +++ b/Open-ILS/src/sql/Pg/040.schema.asset.sql @@ -1136,5 +1136,58 @@ CREATE TABLE asset.course_module_course_materials ( unique (course, item, record) ); -COMMIT; +CREATE OR REPLACE FUNCTION asset.update_course_reserves_facet(old_bib_id BIGINT, new_bib_id BIGINT) RETURNS VOID AS $func$ +DECLARE + facet_field INT; +BEGIN + SELECT id INTO facet_field FROM config.metabib_field WHERE name='on_reserve'; + IF facet_field IS NOT NULL THEN + PERFORM * FROM config.internal_flag WHERE name = 'ingest.assume_inserts_only' AND enabled; + IF NOT FOUND THEN + DELETE FROM metabib.facet_entry WHERE source = old_bib_id AND field=facet_field; + END IF; + IF EXISTS (SELECT id FROM biblio.record_entry WHERE id=new_bib_id AND NOT deleted) THEN + IF EXISTS (SELECT id FROM asset.course_module_course_materials WHERE record=new_bib_id) THEN + INSERT INTO metabib.facet_entry (source, field, value) VALUES (new_bib_id, facet_field, 't'); + ELSE + INSERT INTO metabib.facet_entry (source, field, value) VALUES (new_bib_id, facet_field, 'f'); + END IF; + END IF; + END IF; +END; +$func$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION asset.course_materials_inserted () RETURNS TRIGGER AS $func$ +BEGIN + PERFORM asset.update_course_reserves_facet(NEW.record, NEW.record); + RETURN NEW; +END; +$func$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION asset.course_materials_changed () RETURNS TRIGGER AS $func$ +BEGIN + PERFORM asset.update_course_reserves_facet(OLD.record, NEW.record); + RETURN NEW; +END; +$func$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION asset.course_materials_deleted () RETURNS TRIGGER AS $func$ +BEGIN + PERFORM asset.update_course_reserves_facet(OLD.record, -1); + RETURN OLD; +END; +$func$ LANGUAGE plpgsql; + +CREATE TRIGGER acmcm_inserted_trig + AFTER INSERT ON asset.course_module_course_materials + FOR EACH ROW EXECUTE PROCEDURE asset.course_materials_inserted(); +CREATE TRIGGER acmcm_changed_trig + AFTER UPDATE ON asset.course_module_course_materials + FOR EACH ROW EXECUTE PROCEDURE asset.course_materials_changed(); + +CREATE TRIGGER acmcm_deleted_trig + AFTER DELETE ON asset.course_module_course_materials + FOR EACH ROW EXECUTE PROCEDURE asset.course_materials_deleted(); + +COMMIT; 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 b5d3672550..a191990b7a 100644 --- a/Open-ILS/src/sql/Pg/950.data.seed-values.sql +++ b/Open-ILS/src/sql/Pg/950.data.seed-values.sql @@ -100,6 +100,7 @@ INSERT INTO config.metabib_class ( name, label ) VALUES ( 'title', oils_i18n_get INSERT INTO config.metabib_class ( name, label ) VALUES ( 'author', oils_i18n_gettext('author', 'Author', 'cmc', 'label')); INSERT INTO config.metabib_class ( name, label ) VALUES ( 'subject', oils_i18n_gettext('subject', 'Subject', 'cmc', 'label') ); INSERT INTO config.metabib_class ( name, label ) VALUES ( 'series', oils_i18n_gettext('series', 'Series', 'cmc', 'label') ); +INSERT INTO config.metabib_class ( name, label ) VALUES ( 'boolean_facet', oils_i18n_gettext('boolean_facet', 'Boolean facet', 'cmc', 'label') ); -- enable combined search for only the subject class by default UPDATE config.metabib_class SET combined = TRUE WHERE name = 'subject'; @@ -336,6 +337,14 @@ VALUES ( FALSE, TRUE, FALSE, FALSE ); +INSERT INTO config.metabib_field (id, field_class, name, label, facet_field, + search_field, browse_field, display_field) +VALUES ( + 54, 'boolean_facet', 'on_reserve', + oils_i18n_gettext(54, 'On Reserve', 'cmf', 'label'), + TRUE, FALSE, FALSE, FALSE +); + INSERT INTO config.metabib_field_virtual_map (real, virtual) SELECT id, 45 diff --git a/Open-ILS/src/sql/Pg/999.functions.global.sql b/Open-ILS/src/sql/Pg/999.functions.global.sql index d806534576..96c9294213 100644 --- a/Open-ILS/src/sql/Pg/999.functions.global.sql +++ b/Open-ILS/src/sql/Pg/999.functions.global.sql @@ -1541,10 +1541,19 @@ BEGIN END; $func$ LANGUAGE PLPGSQL; +CREATE OR REPLACE FUNCTION biblio.course_reserves_facet () RETURNS TRIGGER AS $func$ +BEGIN + PERFORM asset.update_course_reserves_facet(NEW.id, NEW.id); + RETURN NEW; +END; +$func$ LANGUAGE plpgsql; + + -- Ingest triggers CREATE TRIGGER fingerprint_tgr BEFORE INSERT OR UPDATE ON biblio.record_entry FOR EACH ROW EXECUTE PROCEDURE biblio.fingerprint_trigger ('eng','BKS'); CREATE TRIGGER aaa_indexing_ingest_or_delete AFTER INSERT OR UPDATE ON biblio.record_entry FOR EACH ROW EXECUTE PROCEDURE biblio.indexing_ingest_or_delete (); CREATE TRIGGER bbb_simple_rec_trigger AFTER INSERT OR UPDATE OR DELETE ON biblio.record_entry FOR EACH ROW EXECUTE PROCEDURE reporter.simple_rec_trigger (); +CREATE TRIGGER course_reserves_facet AFTER INSERT OR UPDATE ON biblio.record_entry FOR EACH ROW EXECUTE PROCEDURE biblio.course_reserves_facet (); CREATE TRIGGER map_thesaurus_to_control_set BEFORE INSERT OR UPDATE ON authority.record_entry FOR EACH ROW EXECUTE PROCEDURE authority.map_thesaurus_to_control_set (); CREATE TRIGGER aaa_auth_ingest_or_delete AFTER INSERT OR UPDATE ON authority.record_entry FOR EACH ROW EXECUTE PROCEDURE authority.indexing_ingest_or_delete (); diff --git a/Open-ILS/src/sql/Pg/live_t/course_materials.pg b/Open-ILS/src/sql/Pg/live_t/course_materials.pg new file mode 100644 index 0000000000..4c2d15e02c --- /dev/null +++ b/Open-ILS/src/sql/Pg/live_t/course_materials.pg @@ -0,0 +1,34 @@ +BEGIN; + +SELECT plan(3); + +SELECT is( + (SELECT value FROM metabib.facet_entry + WHERE source = 2 AND + field IN (SELECT id FROM config.metabib_field WHERE name='on_reserve' )), + 'f', + 'Initially, On Reserves facet is false' +); + +INSERT INTO asset.course_module_course_materials (course, record) +VALUES (1, 2); + +SELECT is( + (SELECT value FROM metabib.facet_entry + WHERE source = 2 AND + field IN (SELECT id FROM config.metabib_field WHERE name='on_reserve' )), + 't', + 'When a bib record is added to a course, the On Reserves facet is true' +); + +DELETE asset.course_module_course_materials WHERE course=1 AND record=2; + +SELECT is( + (SELECT value FROM metabib.facet_entry + WHERE source = 2 AND + field IN (SELECT id FROM config.metabib_field WHERE name='on_reserve' )), + 'f', + 'After removing a record from a course, On Reserves facet goes back to false' +); + +ROLLBACK; diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.course-materials-module.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.course-materials-module.sql index e07b7c55b3..c8f4cff66c 100644 --- a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.course-materials-module.sql +++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.course-materials-module.sql @@ -103,4 +103,76 @@ INSERT INTO actor.org_unit_setting (org_unit, name, value) FROM config.bib_source WHERE source='Course materials module'; +INSERT INTO config.metabib_class ( name, label ) VALUES ( 'boolean_facet', oils_i18n_gettext('boolean_facet', 'Boolean facet', 'cmc', 'label') ); + +INSERT INTO config.metabib_field (id, field_class, name, label, facet_field, search_field, browse_field, display_field ) VALUES + (54, 'boolean_facet', 'on_reserve', oils_i18n_gettext(54, 'On Reserve', 'cmf', 'label'), TRUE, FALSE, FALSE, FALSE ); + +CREATE OR REPLACE FUNCTION asset.update_course_reserves_facet(old_bib_id BIGINT, new_bib_id BIGINT) RETURNS VOID AS $func$ +DECLARE + facet_field INT; +BEGIN + SELECT id INTO facet_field FROM config.metabib_field WHERE name='on_reserve'; + IF facet_field IS NOT NULL THEN + PERFORM * FROM config.internal_flag WHERE name = 'ingest.assume_inserts_only' AND enabled; + IF NOT FOUND THEN + DELETE FROM metabib.facet_entry WHERE source = old_bib_id AND field=facet_field; + END IF; + IF EXISTS (SELECT id FROM biblio.record_entry WHERE id=new_bib_id AND NOT deleted) THEN + IF EXISTS (SELECT id FROM asset.course_module_course_materials WHERE record=new_bib_id) THEN + INSERT INTO metabib.facet_entry (source, field, value) VALUES (new_bib_id, facet_field, 't'); + ELSE + INSERT INTO metabib.facet_entry (source, field, value) VALUES (new_bib_id, facet_field, 'f'); + END IF; + END IF; + END IF; +END; +$func$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION asset.course_materials_inserted () RETURNS TRIGGER AS $func$ +BEGIN + PERFORM asset.update_course_reserves_facet(NEW.record, NEW.record); + RETURN NEW; +END; +$func$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION asset.course_materials_changed () RETURNS TRIGGER AS $func$ +BEGIN + PERFORM asset.update_course_reserves_facet(OLD.record, NEW.record); + RETURN NEW; +END; +$func$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION asset.course_materials_deleted () RETURNS TRIGGER AS $func$ +BEGIN + PERFORM asset.update_course_reserves_facet(OLD.record, -1); + RETURN OLD; +END; +$func$ LANGUAGE plpgsql; + +CREATE TRIGGER acmcm_inserted_trig + AFTER INSERT ON asset.course_module_course_materials + FOR EACH ROW EXECUTE PROCEDURE asset.course_materials_inserted(); + +CREATE TRIGGER acmcm_changed_trig + AFTER UPDATE ON asset.course_module_course_materials + FOR EACH ROW EXECUTE PROCEDURE asset.course_materials_changed(); + +CREATE TRIGGER acmcm_deleted_trig + AFTER DELETE ON asset.course_module_course_materials + FOR EACH ROW EXECUTE PROCEDURE asset.course_materials_deleted(); + +CREATE OR REPLACE FUNCTION course_reserves_facet () RETURNS TRIGGER AS $func$ +BEGIN + PERFORM asset.update_course_reserves_facet(NEW.id, NEW.id); + RETURN NEW; +END; +$func$ LANGUAGE plpgsql; +CREATE TRIGGER course_reserves_facet AFTER INSERT OR UPDATE ON biblio.record_entry FOR EACH ROW EXECUTE PROCEDURE biblio.update_reserves_facet (); + + +--- Populate the On reserve facet +INSERT INTO metabib.facet_entry (source, field, value) + SELECT id, 54, 'f' FROM biblio.record_entry WHERE NOT deleted; + COMMIT; diff --git a/Open-ILS/src/templates/opac/parts/config.tt2 b/Open-ILS/src/templates/opac/parts/config.tt2 index 48b4f0fee5..010b37dd6f 100644 --- a/Open-ILS/src/templates/opac/parts/config.tt2 +++ b/Open-ILS/src/templates/opac/parts/config.tt2 @@ -115,7 +115,9 @@ facet.display = [ {facet_class => 'subject', facet_order => ['topic']}, {facet_class => 'identifier', facet_order => ['genre']}, {facet_class => 'series', facet_order => ['seriestitle']}, - {facet_class => 'subject', facet_order => ['name', 'geographic']} + {facet_class => 'subject', facet_order => ['name', 'geographic']}, + # Uncomment the next line for the course reserves facet: + # {facet_class => 'boolean_facet', facet_order => ['on_reserve']}, ]; facet.default_display_count = 5; diff --git a/Open-ILS/src/templates/opac/parts/result/facets.tt2 b/Open-ILS/src/templates/opac/parts/result/facets.tt2 index 38f231ffc6..2d7d12641b 100644 --- a/Open-ILS/src/templates/opac/parts/result/facets.tt2 +++ b/Open-ILS/src/templates/opac/parts/result/facets.tt2 @@ -83,7 +83,15 @@ FOR facet IN sorted_facets;
[% FOR facet_data IN facet.data; - display_value = facet_data.value | html; + IF fclass == 'boolean_facet'; + IF facet_data.value == 't'; + display_value = l('Yes'); + ELSE; + display_value = l('No'); + END; + ELSE; + display_value = facet_data.value | html; + END; param_string = fclass _ '|' _ fname _ '[' _ facet_data.value _ ']'; new_facets = []; this_selected = 0; diff --git a/Open-ILS/tests/datasets/sql/course_materials.sql b/Open-ILS/tests/datasets/sql/course_materials.sql index 271802f52b..84220b7816 100644 --- a/Open-ILS/tests/datasets/sql/course_materials.sql +++ b/Open-ILS/tests/datasets/sql/course_materials.sql @@ -10,3 +10,5 @@ INSERT INTO asset.course_module_course_materials (1, 200, 'Required'), (1, 201, 'Optional'); +SELECT asset.update_course_reserves_facet(id, id) +FROM biblio.record_entry WHERE NOT deleted;