}
.list-group-item {padding: .5rem .75rem .5rem .75rem}
</style>
-<div *ngIf="searchContext.result.facetData">
+<div *ngIf="searchContext && searchContext.result.facetData">
<div *ngFor="let facetConf of facetConfig.display">
<div *ngIf="searchContext.result.facetData[facetConf.facetClass]">
<div *ngFor="let name of facetConf.facetOrder">
<a class="card-link"
routerLink="/staff/catalog/search"
[queryParams]="getFacetUrlParams(facetConf.facetClass, name, value.value)">
- {{value.value}}
+ <eg-bool *ngIf="'boolean_facet' === facetConf.facetClass" value="{{value.value}}"></eg-bool>
+ <ng-container *ngIf="'boolean_facet' !== facetConf.facetClass">
+ {{value.value}}
+ </ng-container>
</a>
</div>
<div class="col-lg-3">{{value.count}}</div>
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';
{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'
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 {
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;
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;
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_facets', 'Boolean facet', 'cmc', 'label') );
-- enable combined search for only the subject class by default
UPDATE config.metabib_class SET combined = TRUE WHERE name = 'subject';
FALSE, TRUE, FALSE, FALSE
);
+INSERT INTO config.metabib_field (field_class, name, label, facet_field,
+ search_field, browse_field, display_field)
+VALUES (
+ 'boolean_facet', 'on_reserve',
+ oils_i18n_gettext(1, 'On Reserve', 'cmf', 'label'),
+ TRUE, FALSE, FALSE, FALSE
+);
+
INSERT INTO config.metabib_field_virtual_map (real, virtual)
SELECT id,
45
END;
$func$ LANGUAGE PLPGSQL;
+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;
+
+
-- 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.update_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 ();
--- /dev/null
+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;
FROM config.bib_source
WHERE source='Course materials module';
+INSERT INTO config.metabib_class ( name, label ) VALUES ( 'boolean_facet', oils_i18n_gettext('boolean_facets', 'Boolean facet', 'cmc', 'label') );
+
+INSERT INTO config.metabib_field (field_class, name, label, facet_field, search_field, browse_field, display_field ) VALUES
+ ('boolean_facet', 'on_reserve', oils_i18n_gettext(1, 'On Reserve', 'cmf', 'label'), TRUE, FALSE, FALSE, FALSE );
+
+
COMMIT;
{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;
<div class="box_wrapper">
<div class="box">
[% 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;