[open-ils-commits] r17178 - in branches/seials-integration/Open-ILS: examples src/extras src/perlmods/OpenILS/Application/Search src/perlmods/OpenILS/Utils web/js/dojo/openils/opac/nls web/opac/skin/default/js xul/staff_client/server/serial (dbwells)
svn at svn.open-ils.org
svn at svn.open-ils.org
Wed Aug 11 17:50:31 EDT 2010
Author: dbwells
Date: 2010-08-11 17:50:25 -0400 (Wed, 11 Aug 2010)
New Revision: 17178
Modified:
branches/seials-integration/Open-ILS/examples/fm_IDL.xml
branches/seials-integration/Open-ILS/examples/opensrf.xml.example
branches/seials-integration/Open-ILS/examples/opensrf_core.xml.example
branches/seials-integration/Open-ILS/src/extras/ils_events.xml
branches/seials-integration/Open-ILS/src/perlmods/OpenILS/Application/Search/Serial.pm
branches/seials-integration/Open-ILS/src/perlmods/OpenILS/Utils/MFHDParser.pm
branches/seials-integration/Open-ILS/web/js/dojo/openils/opac/nls/opac.js
branches/seials-integration/Open-ILS/web/opac/skin/default/js/rdetail.js
branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_items.js
branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_items.xul
branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_subs.js
branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_subs.xul
branches/seials-integration/Open-ILS/xul/staff_client/server/serial/sdist_editor.js
branches/seials-integration/Open-ILS/xul/staff_client/server/serial/serctrl_main.xul
Log:
- Basic OPAC display, including attempt at integration with 'legacy' MFHD display
- Rename some display variables and svr fields to be more generic
- Add textual holdings 'override' code to MFHD display parser
- Support for 'Binding' mode in Items tab
- Barcode prompt when creating new units (either receiving or binding)
- Add Serial service to example configuration files
Modified: branches/seials-integration/Open-ILS/examples/fm_IDL.xml
===================================================================
--- branches/seials-integration/Open-ILS/examples/fm_IDL.xml 2010-08-11 20:59:25 UTC (rev 17177)
+++ branches/seials-integration/Open-ILS/examples/fm_IDL.xml 2010-08-11 21:50:25 UTC (rev 17178)
@@ -2923,15 +2923,15 @@
<class id="svr" controller="open-ils.cstore" oils_obj:fieldmapper="serial::virtual_record" oils_persist:virtual="true" reporter:label="Serial Virtual Record">
<fields>
- <field name="id" oils_persist:virtual="true" />
+ <field name="sre_id" oils_persist:virtual="true" />
<field name="location" oils_persist:virtual="true" />
<field name="owning_lib" oils_persist:virtual="true" />
- <field name="holdings" oils_persist:virtual="true" />
- <field name="current_holdings" oils_persist:virtual="true" />
- <field name="supplements" oils_persist:virtual="true" />
- <field name="current_supplements" oils_persist:virtual="true" />
- <field name="indexes" oils_persist:virtual="true" />
- <field name="current_indexes" oils_persist:virtual="true" />
+ <field name="basic_holdings" oils_persist:virtual="true" />
+ <field name="basic_holdings_add" oils_persist:virtual="true" />
+ <field name="supplement_holdings" oils_persist:virtual="true" />
+ <field name="supplement_holdings_add" oils_persist:virtual="true" />
+ <field name="index_holdings" oils_persist:virtual="true" />
+ <field name="index_holdings_add" oils_persist:virtual="true" />
<field name="online" oils_persist:virtual="true" />
<field name="missing" oils_persist:virtual="true" />
<field name="incomplete" oils_persist:virtual="true" />
Modified: branches/seials-integration/Open-ILS/examples/opensrf.xml.example
===================================================================
--- branches/seials-integration/Open-ILS/examples/opensrf.xml.example 2010-08-11 20:59:25 UTC (rev 17177)
+++ branches/seials-integration/Open-ILS/examples/opensrf.xml.example 2010-08-11 21:50:25 UTC (rev 17178)
@@ -976,6 +976,26 @@
</app_settings>
</open-ils.vandelay>
+ <open-ils.serial>
+ <keepalive>3</keepalive>
+ <stateless>1</stateless>
+ <language>perl</language>
+ <implementation>OpenILS::Application::Serial</implementation>
+ <max_requests>17</max_requests>
+ <unix_config>
+ <unix_sock>open-ils.serial_unix.sock</unix_sock>
+ <unix_pid>open-ils.serial_unix.pid</unix_pid>
+ <max_requests>1000</max_requests>
+ <unix_log>open-ils.serial_unix.log</unix_log>
+ <min_children>5</min_children>
+ <max_children>15</max_children>
+ <min_spare_children>3</min_spare_children>
+ <max_spare_children>5</max_spare_children>
+ </unix_config>
+ <app_settings>
+ </app_settings>
+ </open-ils.serial>
+
</apps>
</default>
@@ -1016,6 +1036,7 @@
<appname>open-ils.trigger</appname>
<appname>open-ils.fielder</appname>
<appname>open-ils.vandelay</appname>
+ <appname>open-ils.serial</appname>
</activeapps>
</localhost>
</hosts>
Modified: branches/seials-integration/Open-ILS/examples/opensrf_core.xml.example
===================================================================
--- branches/seials-integration/Open-ILS/examples/opensrf_core.xml.example 2010-08-11 20:59:25 UTC (rev 17177)
+++ branches/seials-integration/Open-ILS/examples/opensrf_core.xml.example 2010-08-11 21:50:25 UTC (rev 17178)
@@ -33,6 +33,7 @@
<service>open-ils.search</service>
<service>open-ils.supercat</service>
<service>open-ils.vandelay</service>
+ <service>open-ils.serial</service>
</services>
</router>
Modified: branches/seials-integration/Open-ILS/src/extras/ils_events.xml
===================================================================
--- branches/seials-integration/Open-ILS/src/extras/ils_events.xml 2010-08-11 20:59:25 UTC (rev 17177)
+++ branches/seials-integration/Open-ILS/src/extras/ils_events.xml 2010-08-11 21:50:25 UTC (rev 17178)
@@ -952,6 +952,16 @@
<!-- ================================================================ -->
+ <event code='11000' textcode='SERIAL_SUBSCRIPTION_NOT_EMPTY'>
+ <desc xml:lang="en-US">The subscription still has dependent objects</desc>
+ </event>
+
+ <event code='11001' textcode='SERIAL_CAPTION_AND_PATTERN_HAS_ISSUANCES'>
+ <desc xml:lang="en-US">The caption/pattern still has dependent issuances</desc>
+ </event>
+
+ <!-- ================================================================ -->
+
</ils_events>
Modified: branches/seials-integration/Open-ILS/src/perlmods/OpenILS/Application/Search/Serial.pm
===================================================================
--- branches/seials-integration/Open-ILS/src/perlmods/OpenILS/Application/Search/Serial.pm 2010-08-11 20:59:25 UTC (rev 17177)
+++ branches/seials-integration/Open-ILS/src/perlmods/OpenILS/Application/Search/Serial.pm 2010-08-11 21:50:25 UTC (rev 17178)
@@ -73,56 +73,104 @@
=cut
-sub bib_to_mfhd_hash {
- my ($self, $client, $bib) = @_;
-
- my $mfhd_hash;
+# DEFUNCT ?
+#sub bib_to_mfhd_hash {
+# my ($self, $client, $bib) = @_;
+#
+# my $mfhd_hash;
+#
+# # XXX perhaps this? --miker
+## my $e = OpenILS::Utils::CStoreEditor->new();
+## my $mfhd = $e->search_serial_record_entry({ record => $bib });
+## return $u->generate_svr( $mfhd->[0] ) if (ref $mfhd);
+## return undef;
+#
+# my @mfhd = $U->cstorereq( "open-ils.cstore.json_query.atomic", {
+# select => { sre => 'marc' },
+# from => 'sre',
+# where => { record => $bib, deleted => 'f' },
+# distinct => 1
+# });
+#
+# if (!@mfhd or scalar(@mfhd) == 0) {
+# return undef;
+# }
+#
+# my $u = OpenILS::Utils::MFHDParser->new();
+# $mfhd_hash = $u->generate_svr( $mfhd[0][0]->{id}, $mfhd[0][0]->{marc}, $mfhd[0][0]->{owning_lib} );
+#
+# return $mfhd_hash;
+#}
+#
+#__PACKAGE__->register_method(
+# method => "bib_to_mfhd_hash",
+# api_name => "open-ils.search.serial.record.bib_to_mfhd.retrieve",
+# argc => 1,
+# note => "Given a bibliographic record ID, return MFHD holdings"
+#);
- # XXX perhaps this? --miker
-# my $e = OpenILS::Utils::CStoreEditor->new();
-# my $mfhd = $e->search_serial_record_entry({ record => $bib });
-# return $u->generate_svr( $mfhd->[0] ) if (ref $mfhd);
-# return undef;
-
- my @mfhd = $U->cstorereq( "open-ils.cstore.json_query.atomic", {
- select => { sre => 'marc' },
- from => 'sre',
- where => { record => $bib, deleted => 'f' },
- distinct => 1
- });
-
- if (!@mfhd or scalar(@mfhd) == 0) {
- return undef;
- }
-
- my $u = OpenILS::Utils::MFHDParser->new();
- $mfhd_hash = $u->generate_svr( $mfhd[0][0]->{id}, $mfhd[0][0]->{marc}, $mfhd[0][0]->{owning_lib} );
-
- return $mfhd_hash;
-}
-
-__PACKAGE__->register_method(
- method => "bib_to_mfhd_hash",
- api_name => "open-ils.search.serial.record.bib_to_mfhd.retrieve",
- argc => 1,
- note => "Given a bibliographic record ID, return MFHD holdings"
-);
-
sub bib_to_mfhd {
my ($self, $client, $bib) = @_;
my $mfhd;
my $e = OpenILS::Utils::CStoreEditor->new();
- my $serials = $e->search_serial_record_entry({ record => $bib, deleted => 'f' });
- if (!ref $serials) {
+ # TODO: 'deleted' ssub support
+ my $sdists = $e->search_serial_distribution([{ "+ssub" => {"record_entry" => $bib} }, { "flesh" => 1, "flesh_fields" => {'sdist' => [ "record_entry", "basic_summary", "supplement_summary", "index_summary" ]}, "join" => {"ssub" => {}} }]);
+ my $sres = $e->search_serial_record_entry([{ record => $bib, deleted => 'f', "+sdist" => {"id" => undef} }, { "join" => {"sdist" => { 'type' => 'left' }} }]);
+ if (!ref $sres and !ref $sdists) {
return undef;
}
- my $u = OpenILS::Utils::MFHDParser->new();
- foreach (@$serials) {
- push(@$mfhd, $u->generate_svr($_->id, $_->marc, $_->owning_lib));
+ my $mfhd_parser = OpenILS::Utils::MFHDParser->new();
+ foreach (@$sdists) {
+ my $svr;
+ if (ref $_->record_entry) {
+ $svr = $mfhd_parser->generate_svr($_->record_entry->id, $_->record_entry->marc, $_->record_entry->owning_lib);
+ } else {
+ $svr = Fieldmapper::serial::virtual_record->new;
+ $svr->sre_id(-1);
+ $svr->location(-1); #TODO: location support
+ $svr->owning_lib($_->holding_lib);
+ $svr->basic_holdings([]);
+ $svr->supplement_holdings([]);
+ $svr->index_holdings([]);
+ $svr->basic_holdings_add([]);
+ $svr->supplement_holdings_add([]);
+ $svr->index_holdings_add([]);
+ $svr->online([]);
+ $svr->missing([]);
+ $svr->incomplete([]);
+ }
+ if (ref $_->basic_summary) { #TODO: 'show-generated' boolean on summaries
+ if ($_->basic_summary->generated_coverage) {
+ push(@{$svr->basic_holdings}, $_->basic_summary->generated_coverage);
+ }
+ if ($_->basic_summary->textual_holdings) {
+ push(@{$svr->basic_holdings_add}, $_->basic_summary->textual_holdings);
+ }
+ }
+ if (ref $_->supplement_summary) {
+ if ($_->supplement_summary->generated_coverage) {
+ push(@{$svr->supplement_holdings}, $_->supplement_summary->generated_coverage);
+ }
+ if ($_->supplement_summary->textual_holdings) {
+ push(@{$svr->supplement_holdings_add}, $_->supplement_summary->textual_holdings);
+ }
+ }
+ if (ref $_->index_summary) {
+ if ($_->index_summary->generated_coverage) {
+ push(@{$svr->index_holdings}, $_->index_summary->generated_coverage);
+ }
+ if ($_->index_summary->textual_holdings) {
+ push(@{$svr->index_holdings_add}, $_->index_summary->textual_holdings);
+ }
+ }
+ push(@$mfhd, $svr);
}
+ foreach (@$sres) {
+ push(@$mfhd, $mfhd_parser->generate_svr($_->id, $_->marc, $_->owning_lib));
+ }
return $mfhd;
}
Modified: branches/seials-integration/Open-ILS/src/perlmods/OpenILS/Utils/MFHDParser.pm
===================================================================
--- branches/seials-integration/Open-ILS/src/perlmods/OpenILS/Utils/MFHDParser.pm 2010-08-11 20:59:25 UTC (rev 17177)
+++ branches/seials-integration/Open-ILS/src/perlmods/OpenILS/Utils/MFHDParser.pm 2010-08-11 21:50:25 UTC (rev 17178)
@@ -59,16 +59,16 @@
my $marc;
my $mfhd;
- my $location = '';
- my $holdings = [];
- my $supplements = [];
- my $indexes = [];
- my $current_holdings = [];
- my $current_supplements = [];
- my $current_indexes = [];
- my $online = []; # Laurentian extension to MFHD standard
- my $missing = []; # Laurentian extension to MFHD standard
- my $incomplete = []; # Laurentian extension to MFHD standard
+ my $location = '';
+ my $basic_holdings = [];
+ my $supplement_holdings = [];
+ my $index_holdings = [];
+ my $basic_holdings_add = [];
+ my $supplement_holdings_add = [];
+ my $index_holdings_add = [];
+ my $online = []; # Laurentian extension to MFHD standard
+ my $missing = []; # Laurentian extension to MFHD standard
+ my $incomplete = []; # Laurentian extension to MFHD standard
try {
$marc = MARC::Record->new_from_xml($mfhd_xml);
@@ -108,48 +108,89 @@
$location =~ s/ -- $//;
+ # TODO: for now, we will assume that textual holdings are in addition to the
+ # computable holdings (that is, they have link IDs greater than the 85X fields)
+ # or that they fully replace the computable holdings (checking for link ID '0').
+ # Eventually this may be handled better by format_holdings() in MFHD.pm
+ my %skip_computable;
try {
foreach my $field ($marc->field('866')) {
my $textual_holdings = $self->format_textual_holdings($field);
if ($textual_holdings) {
- push @$holdings, $textual_holdings;
+ push @$basic_holdings_add, $textual_holdings;
+ if ($field->subfield('8') eq '0') {
+ $skip_computable{'basic'} = 1; # link ID 0 trumps computable fields
+ }
}
}
foreach my $field ($marc->field('867')) {
my $textual_holdings = $self->format_textual_holdings($field);
if ($textual_holdings) {
- push @$supplements, $textual_holdings;
+ push @$supplement_holdings_add, $textual_holdings;
+ if ($field->subfield('8') eq '0') {
+ $skip_computable{'supplement'} = 1; # link ID 0 trumps computable fields
+ }
}
}
foreach my $field ($marc->field('868')) {
my $textual_holdings = $self->format_textual_holdings($field);
if ($textual_holdings) {
- push @$indexes, $textual_holdings;
+ push @$index_holdings_add, $textual_holdings;
+ if ($field->subfield('8') eq '0') {
+ $skip_computable{'index'} = 1; # link ID 0 trumps computable fields
+ }
}
}
- foreach my $cap_id ($mfhd->caption_link_ids('853')) {
- my @curr_holdings = $mfhd->holdings('863', $cap_id);
- next unless scalar @curr_holdings;
- foreach (@curr_holdings) {
- push @$current_holdings, $_->format();
+ if (!exists($skip_computable{'basic'})) {
+ foreach my $cap_id ($mfhd->caption_link_ids('853')) {
+ my @holdings = $mfhd->holdings('863', $cap_id);
+ next unless scalar @holdings;
+ foreach (@holdings) {
+ push @$basic_holdings, $_->format();
+ }
}
+ if (!@$basic_holdings) { # no computed holdings found
+ $basic_holdings = $basic_holdings_add;
+ $basic_holdings_add = [];
+ }
+ } else { # textual are non additional, but primary
+ $basic_holdings = $basic_holdings_add;
+ $basic_holdings_add = [];
}
- foreach my $cap_id ($mfhd->caption_link_ids('854')) {
- my @curr_supplements = $mfhd->holdings('864', $cap_id);
- next unless scalar @curr_supplements;
- foreach (@curr_supplements) {
- push @$current_supplements, $_->format();
+ if (!exists($skip_computable{'supplement'})) {
+ foreach my $cap_id ($mfhd->caption_link_ids('854')) {
+ my @supplements = $mfhd->holdings('864', $cap_id);
+ next unless scalar @supplements;
+ foreach (@supplements) {
+ push @$supplement_holdings, $_->format();
+ }
}
+ if (!@$supplement_holdings) { # no computed holdings found
+ $supplement_holdings = $supplement_holdings_add;
+ $supplement_holdings_add = [];
+ }
+ } else { # textual are non additional, but primary
+ $supplement_holdings = $supplement_holdings_add;
+ $supplement_holdings_add = [];
}
- foreach my $cap_id ($mfhd->caption_link_ids('855')) {
- my @curr_indexes = $mfhd->holdings('865', $cap_id);
- next unless scalar @curr_indexes;
- foreach (@curr_indexes) {
- push @$current_indexes, $_->format();
+ if (!exists($skip_computable{'index'})) {
+ foreach my $cap_id ($mfhd->caption_link_ids('855')) {
+ my @indexes = $mfhd->holdings('865', $cap_id);
+ next unless scalar @indexes;
+ foreach (@indexes) {
+ push @$index_holdings, $_->format();
+ }
}
+ if (!@$index_holdings) { # no computed holdings found
+ $index_holdings = $index_holdings_add;
+ $index_holdings_add = [];
+ }
+ } else { # textual are non additional, but primary
+ $index_holdings = $index_holdings_add;
+ $index_holdings_add = [];
}
# Laurentian extensions
@@ -179,15 +220,16 @@
};
return {
- location => $location,
- holdings => $holdings,
- current_holdings => $current_holdings,
- supplements => $supplements,
- current_supplements => $current_supplements,
- indexes => $indexes,
- current_indexes => $current_indexes,
- missing => $missing,
- incomplete => $incomplete,
+ location => $location,
+ basic_holdings => $basic_holdings,
+ basic_holdings_add => $basic_holdings_add,
+ supplement_holdings => $supplement_holdings,
+ supplement_holdings_add => $supplement_holdings_add,
+ index_holdings => $index_holdings,
+ index_holdings_add => $index_holdings_add,
+ missing => $missing,
+ incomplete => $incomplete,
+ online => $online
};
}
@@ -203,15 +245,15 @@
sub init_holdings_virtual_record {
my $record = Fieldmapper::serial::virtual_record->new;
- $record->id();
+ $record->sre_id();
$record->location();
$record->owning_lib();
- $record->holdings([]);
- $record->current_holdings([]);
- $record->supplements([]);
- $record->current_supplements([]);
- $record->indexes([]);
- $record->current_indexes([]);
+ $record->basic_holdings([]);
+ $record->basic_holdings_add([]);
+ $record->supplement_holdings([]);
+ $record->supplement_holdings_add([]);
+ $record->index_holdings([]);
+ $record->index_holdings_add([]);
$record->online([]);
$record->missing([]);
$record->incomplete([]);
@@ -238,7 +280,7 @@
my $record = init_holdings_virtual_record();
my $holdings = $self->mfhd_to_hash($mfhd);
- $record->id($id);
+ $record->sre_id($id);
$record->owning_lib($owning_lib);
if (!$holdings) {
@@ -246,12 +288,12 @@
}
$record->location($holdings->{location});
- $record->holdings($holdings->{holdings});
- $record->current_holdings($holdings->{current_holdings});
- $record->supplements($holdings->{supplements});
- $record->current_supplements($holdings->{current_supplements});
- $record->indexes($holdings->{indexes});
- $record->current_indexes($holdings->{current_indexes});
+ $record->basic_holdings($holdings->{basic_holdings});
+ $record->basic_holdings_add($holdings->{basic_holdings_add});
+ $record->supplement_holdings($holdings->{supplement_holdings});
+ $record->supplement_holdings_add($holdings->{supplement_holdings_add});
+ $record->index_holdings($holdings->{index_holdings});
+ $record->index_holdings_add($holdings->{index_holdings_add});
$record->online($holdings->{online});
$record->missing($holdings->{missing});
$record->incomplete($holdings->{incomplete});
Modified: branches/seials-integration/Open-ILS/web/js/dojo/openils/opac/nls/opac.js
===================================================================
--- branches/seials-integration/Open-ILS/web/js/dojo/openils/opac/nls/opac.js 2010-08-11 20:59:25 UTC (rev 17177)
+++ branches/seials-integration/Open-ILS/web/js/dojo/openils/opac/nls/opac.js 2010-08-11 21:50:25 UTC (rev 17178)
@@ -18,8 +18,10 @@
"EDIT_MFHD_RECORD": "Edit Record",
"EDIT_MFHD_MENU": "Edit Holdings",
"EDIT_PROPERTIES": "Edit Propeties",
- "HOLDINGS": "Previous volumes",
- "INDEXES": "Previous indexes",
+ "BASIC_HOLDINGS": "Volumes",
+ "BASIC_HOLDINGS_ADD": "Additional Volume Information",
+ "INDEX_HOLDINGS": "Indexes",
+ "INDEX_HOLDINGS_ADD": "Additional Index Information",
"CURRENT_HOLDINGS": "Current volume",
"CURRENT_INDEXES": "Current indexes",
"CURRENT_SUPPLEMENTS": "Current supplements",
@@ -28,5 +30,6 @@
"MISSING_VOLUMES": "Missing volumes",
"ONLINE_VOLUMES": "Online volumes",
"SAVE_MFHD_LABEL": "Save MFHD",
- "SUPPLEMENTS": "Previous supplements"
+ "SUPPLEMENT_HOLDINGS": "Supplements",
+ "SUPPLEMENT_HOLDINGS_ADD": "Additional Supplement Information"
}
Modified: branches/seials-integration/Open-ILS/web/opac/skin/default/js/rdetail.js
===================================================================
--- branches/seials-integration/Open-ILS/web/opac/skin/default/js/rdetail.js 2010-08-11 20:59:25 UTC (rev 17177)
+++ branches/seials-integration/Open-ILS/web/opac/skin/default/js/rdetail.js 2010-08-11 21:50:25 UTC (rev 17178)
@@ -262,19 +262,19 @@
}
}
- var hh = holdings.holdings();
- var hch = holdings.current_holdings();
- var hs = holdings.supplements();
- var hcs = holdings.current_supplements();
- var hi = holdings.indexes();
- var hci = holdings.current_indexes();
+ var hb = holdings.basic_holdings();
+ var hba = holdings.basic_holdings_add();
+ var hs = holdings.supplement_holdings();
+ var hsa = holdings.supplement_holdings_add();
+ var hi = holdings.index_holdings();
+ var hia = holdings.index_holdings_add();
var ho = holdings.online();
var hm = holdings.missing();
var hinc = holdings.incomplete();
var hloc = holdings.location() || 'MFHD';
- if ( hh.length == 0 && hch.length == 0 && hs.length == 0 &&
- hcs.length == 0 && hi.length == 0 && hci.length == 0 &&
+ if ( hb.length == 0 && hba.length == 0 && hs.length == 0 &&
+ hsa.length == 0 && hi.length == 0 && hia.length == 0 &&
ho.length == 0 && hm.length == 0 && hinc.length == 0
) {
@@ -284,14 +284,14 @@
* record is likely empty or corrupt. This gives cataloguers a
* chance to add holdings or correct the record
*/
- hh = 'PLACEHOLDER';
+ hb = ['PLACEHOLDER'];
} else {
return null;
}
}
// Show entryNum + 1 in staff client for better menu correlation
- // Maybe this should be holdings.id() instead? (which could get long after time)
+ // Maybe this should be holdings.sre_id() instead? (which could get long after time)
var entryNumString = '';
if (isXUL()) {
var entryNumInc = entryNum + 1;
@@ -303,31 +303,31 @@
"</caption><tbody id='rdetail_holdings_tbody_" + entryNum +
"'></tbody></table>", "rdetail_details_table", "after"
);
- if (hh.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.HOLDINGS, hh); }
- if (hch.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_HOLDINGS, hch); }
- if (hs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.SUPPLEMENTS, hs); }
- if (hcs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_SUPPLEMENTS, hcs); }
- if (hi.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INDEXES, hi); }
- if (hci.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.CURRENT_INDEXES, hci); }
+ if (hb.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.BASIC_HOLDINGS, hb); }
+ if (hba.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.BASIC_HOLDINGS_ADD, hba); }
+ if (hs.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.SUPPLEMENT_HOLDINGS, hs); }
+ if (hsa.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.SUPPLEMENT_HOLDINGS_ADD, hsa); }
+ if (hi.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INDEX_HOLDINGS, hi); }
+ if (hia.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INDEX_HOLDINGS_ADD, hia); }
if (ho.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.ONLINE_VOLUMES, ho); }
if (hm.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.MISSING_VOLUMES, hm); }
if (hinc.length > 0) { _holdingsDrawMFHDEntry(entryNum, opac_strings.INCOMPLETE_VOLUMES, hinc); }
if (isXUL()) {
- mfhdDetails.push({ 'id' : holdings.id(), 'label' : hloc, 'entryNum' : entryNum, 'owning_lib' : holdings.owning_lib() });
+ mfhdDetails.push({ 'id' : holdings.sre_id(), 'label' : hloc, 'entryNum' : entryNum, 'owning_lib' : holdings.owning_lib() });
dojo.require('openils.Event');
dojo.require('openils.PermaCrud');
var mfhd_edit = new dijit.Menu({});
- new dijit.MenuItem({onClick: function(){loadMarcEditor(holdings.id())}, label:opac_strings.EDIT_MFHD_RECORD}).placeAt(mfhd_edit, "first");
+ new dijit.MenuItem({onClick: function(){loadMarcEditor(holdings.sre_id())}, label:opac_strings.EDIT_MFHD_RECORD}).placeAt(mfhd_edit, "first");
new dijit.MenuItem({onClick:function(){
var pcrud = new openils.PermaCrud({"authtoken": G.user.session});
- var mfhd_rec = pcrud.retrieve("sre", holdings.id());
+ var mfhd_rec = pcrud.retrieve("sre", holdings.sre_id());
if (mfhd_rec) {
pcrud.eliminate(mfhd_rec);
- alert(dojo.string.substitute(opac_strings.DELETED_MFHD_RECORD, [holdings.id()]));
+ alert(dojo.string.substitute(opac_strings.DELETED_MFHD_RECORD, [holdings.sre_id()]));
}
}, label:opac_strings.DELETE_MFHD}).placeAt(mfhd_edit, "last");
- // new dijit.MenuItem({onClick:function(){alert("Edit properties " + holdings.id());}, label:opac_strings.EDIT_PROPERTIES}).placeAt(mfhd_edit, "last");
+ // new dijit.MenuItem({onClick:function(){alert("Edit properties " + holdings.sre_id());}, label:opac_strings.EDIT_PROPERTIES}).placeAt(mfhd_edit, "last");
var mfhd_mb = new dijit.form.DropDownButton({dropDown: mfhd_edit, label:opac_strings.EDIT_MFHD_MENU, style:"float:right"});
mfhd_mb.placeAt("mfhdHoldingsCaption" + entryNum, "last");
mfhd_edit.startup();
Modified: branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_items.js
===================================================================
--- branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_items.js 2010-08-11 20:59:25 UTC (rev 17177)
+++ branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_items.js 2010-08-11 21:50:25 UTC (rev 17178)
@@ -10,6 +10,7 @@
JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.init({'via':'stash'});
this.current_sunit_id = -1; //default to **AUTO**
+ this.mode = 'receive';
}
@@ -80,9 +81,8 @@
ml.addEventListener(
'command',
function(ev) {
- if (document.getElementById('serial_item_refresh_button')) document.getElementById('serial_item_refresh_button').focus();
- JSAN.use('util.file'); var file = new util.file('serial_items_prefs.'+obj.data.server_unadorned);
- util.widgets.save_attributes(file, { 'serial_item_lib_menu' : [ 'value' ], 'mode_receive' : [ 'selected' ], 'mode_bind' : [ 'selected' ], 'serial_manage_items_show_all' : [ 'checked' ] });
+ //if (document.getElementById('serial_item_refresh_button')) document.getElementById('serial_item_refresh_button').focus();
+ obj.save_settings();
// get latest sdist id list based on library drowdown
obj.set_sdist_ids();
obj.refresh_list('main');
@@ -90,6 +90,7 @@
},
false
);
+
} else {
throw(document.getElementById('catStrings').getString('staff.cat.copy_browser.missing_library') + '\n');
}
@@ -100,6 +101,13 @@
ml.value = org.id();
ml.setAttribute('value',ml.value);
}
+
+ // deal with mode radio selectedIndex, as load_attributes is setting a "read-only" value
+ if ($('mode_receive').getAttribute('selected')) {
+ $('serial_manage_items_mode').selectedIndex = 0;
+ } else {
+ $('serial_manage_items_mode').selectedIndex = 1;
+ }
// setup recent sunits list
var recent_sunits_file = new util.file('serial_items_recent_sunits_'+obj.docid+'.'+obj.data.server_unadorned);
@@ -125,6 +133,30 @@
obj.set_sdist_ids();
obj.init_lists();
+ var mode_radio_group = $('serial_manage_items_mode');
+ obj.set_mode(mode_radio_group.selectedItem.id.substr(5));
+ mode_radio_group.addEventListener(
+ 'command',
+ function(ev) {
+ obj.save_settings();
+ var mode = ev.target.id.substr(5); //strip out 'mode_'
+ obj.set_mode(mode);
+ obj.refresh_list('main');
+ obj.refresh_list('workarea');
+ },
+ false
+ );
+ $('serial_manage_items_show_all').addEventListener(
+ 'command',
+ function(ev) {
+ obj.save_settings();
+ obj.set_mode();
+ obj.refresh_list('main');
+ obj.refresh_list('workarea');
+ },
+ false
+ );
+
JSAN.use('util.controller'); obj.controller = new util.controller();
obj.controller.init(
{
@@ -242,6 +274,7 @@
var sstr_id = target.getAttribute('sstr_id');
obj.set_sunit(sunit_id, label, sdist_id, sstr_id);
obj.save_sunit(sunit_id, label, sdist_id, sstr_id);
+ if (obj.mode == 'bind') obj.refresh_list('workarea');
} catch(E) {
obj.error.standard_unexpected_error_alert('cmd_set_sunit failed!',E);
}
@@ -251,6 +284,7 @@
['command'],
function() {
obj.set_other_sunit();
+ if (obj.mode == 'bind') obj.refresh_list('workarea');
}
],
'cmd_predict_items' : [
@@ -273,14 +307,61 @@
}
);
+ var method; var success_label;
+ if (obj.mode == 'receive') {
+ method = 'open-ils.serial.receive_items';
+ success_label = 'received';
+ } else { // bind mode
+ method = 'open-ils.serial.bind_items';
+ success_label = 'bound';
+ }
+
+ // deal with barcodes for *NEW* units
+ var barcodes = {};
+ if (obj.current_sunit_id < 0) { // **AUTO** or **NEW** units
+ new_unit_barcode = '';
+ for (var i = 0; i < list.length; i++) {
+ var item = list[i];
+ if (new_unit_barcode) {
+ barcodes[item.id()] = new_unit_barcode;
+ continue;
+ }
+ var prompt_text;
+ if (obj.current_sunit_id == -1) {
+ prompt_text = 'Please enter a barcode for '+item.issuance().label()+ ' from Distribution: '+item.stream().distribution().label()+'/'+item.stream().id()+':';
+ } else { // must be -2
+ prompt_text = 'Please enter a barcode for new unit:';
+ }
+ var barcode = window.prompt(prompt_text,
+ '',
+ 'Unit Barcode Prompt');
+ barcode = String( barcode ).replace(/\s/g,'');
+ /* Casting a possibly null input value to a String turns it into "null" */
+ if (!barcode || barcode == 'null') {
+ alert('Invalid barcode entered, defaulting to system-generated.');
+ barcode = 'auto';
+ }
+
+ var test = obj.network.simple_request('FM_ACP_RETRIEVE_VIA_BARCODE',[ barcode ]);
+ if (typeof test.ilsevent == 'undefined') {
+ alert('Another copy has barcode "' + barcode + '", defaulting to system-generated.');
+ barcode = 'auto';
+ }
+ barcodes[item.id()] = barcode;
+ if (obj.current_sunit_id == -2) {
+ new_unit_barcode = barcode;
+ }
+ }
+ }
+
var robj = obj.network.request(
'open-ils.serial',
- 'open-ils.serial.receive_items',
- [ ses(), list ]
+ method,
+ [ ses(), list, barcodes ]
);
if (typeof robj.ilsevent != 'undefined') throw(robj); //TODO: catch for override
- alert('Successfully received '+robj.num_items_received+' item(s)');
+ alert('Successfully '+success_label+' '+robj.num_items+' item(s)');
if (obj.current_sunit_id == -2) {
obj.current_sunit_id = robj.new_unit_id;
@@ -319,7 +400,7 @@
'cmd_items_print' : [ ['command'], function() { obj.items_print(obj.selected_list); } ],
'cmd_items_export' : [ ['command'], function() { obj.items_export(obj.selected_list); } ],
- 'cmd_refresh_list' : [ ['command'], function() { obj.refresh_list('main'); obj.refresh_list('workarea'); } ]
+ 'cmd_refresh_list' : [ ['command'], function() { obj.set_sdist_ids(); obj.refresh_list('main'); obj.refresh_list('workarea'); } ]
}
}
);
@@ -472,6 +553,50 @@
}
},
+ 'set_mode' : function(mode) {
+ var obj = this;
+
+ if (!mode) {
+ mode = obj.mode;
+ } else {
+ obj.mode = mode;
+ }
+
+ if (mode == 'receive') {
+ $('serial_workarea_mode_label').value = 'Recently Received';
+ if ($('serial_manage_items_show_all').checked) {
+ obj.lists.main.sitem_retrieve_params = {};
+ } else {
+ obj.lists.main.sitem_retrieve_params = {'date_received' : null };
+ }
+ obj.lists.main.sitem_extra_params ={'order_by' : {'sitem' : 'date_expected ASC, stream ASC'}};
+
+ obj.lists.workarea.sitem_retrieve_params = {'date_received' : {"!=" : null}};
+ obj.lists.workarea.sitem_extra_params ={'order_by' : {'sitem' : 'date_received DESC'}, 'limit' : 30};
+ } else { // bind mode
+ $('serial_workarea_mode_label').value = 'Bound Items in Current Working Unit';
+ if ($('serial_manage_items_show_all').checked) {
+ obj.lists.main.sitem_retrieve_params = {};
+ } else {
+ obj.lists.main.sitem_retrieve_params = {'date_received' : {'!=' : null}, 'status' : {'!=' : 'Bindery'} };
+ }
+ obj.lists.main.sitem_extra_params ={'order_by' : {'sitem' : 'date_expected ASC, stream ASC'}};
+
+ obj.lists.workarea.sitem_retrieve_params = {'status' : 'Bindery'}; // unit set dynamically in 'retrieve'
+ obj.lists.workarea.sitem_extra_params ={'order_by' : {'sitem' : 'date_received DESC'}};
+
+ // default to **NEW UNIT**
+ obj.set_sunit(-2, 'New Unit', '', '');
+ }
+ },
+
+ 'save_settings' : function() {
+ var obj = this;
+
+ JSAN.use('util.file'); var file = new util.file('serial_items_prefs.'+obj.data.server_unadorned);
+ util.widgets.save_attributes(file, { 'serial_item_lib_menu' : [ 'value' ], 'mode_receive' : [ 'selected' ], 'mode_bind' : [ 'selected' ], 'serial_manage_items_show_all' : [ 'checked' ] });
+ },
+
'init_lists' : function() {
var obj = this;
@@ -540,12 +665,6 @@
}
}
);
- if (document.getElementById('serial_manage_items_show_all').checked) {
- obj.lists.main.sitem_retrieve_params = {};
- } else {
- obj.lists.main.sitem_retrieve_params = {'date_received' : null };
- }
- obj.lists.main.sitem_extra_params ={'order_by' : {'sitem' : 'date_expected ASC, stream ASC'}};
obj.lists.workarea = new util.list('workarea_tree');
obj.lists.workarea.init(
@@ -574,21 +693,11 @@
}
}
);
- obj.lists.workarea.sitem_retrieve_params = {'date_received' : {"!=" : null}};
- obj.lists.workarea.sitem_extra_params ={'order_by' : {'sitem' : 'date_received DESC'}, 'limit' : 30};
},
'refresh_list' : function(list_name) {
var obj = this;
- // TODO: make this change on the checkbox command event?
- if (list_name == 'main') {
- if (document.getElementById('serial_manage_items_show_all').checked) {
- delete obj.lists.main.sitem_retrieve_params.date_received;
- } else {
- obj.lists.main.sitem_retrieve_params.date_received = null;
- }
- }
//TODO Optimize this?
obj.retrieve(list_name);
},
@@ -597,6 +706,8 @@
var obj = this;
var list = obj.lists[list_name];
+ list.clear();
+
if (!obj.sdist_ids.length) { // no sdists to retrieve items for
return;
}
@@ -604,6 +715,11 @@
var rparams = list.sitem_retrieve_params;
var robj;
rparams['+sstr'] = { "distribution" : obj.sdist_ids };
+
+ if (obj.mode == 'bind' && list_name == 'workarea') {
+ rparams['unit'] = obj.current_sunit_id;
+ }
+
var other_params = list.sitem_extra_params;
other_params.join = 'sstr';
@@ -611,17 +727,14 @@
'FM_SITEM_ID_LIST',
[ ses(), rparams, other_params ]
);
- if (typeof robj.ilsevent!='undefined') {
- obj.error.standard_unexpected_error_alert('Failed to retrieve serial item ID list',E);
- }
if (!robj) {
robj = [];
+ } else if (typeof robj.ilsevent!='undefined') {
+ obj.error.standard_unexpected_error_alert('Failed to retrieve serial item ID list',E);
} else if (!robj.length) {
robj = [robj];
}
- list.clear();
-
for (i = 0; i < robj.length; i++) {
list.append( { 'row' : { 'my' : { 'sitem_id' : robj[i] } }, 'to_bottom' : true, 'no_auto_select' : true } );
}
Modified: branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_items.xul
===================================================================
--- branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_items.xul 2010-08-11 20:59:25 UTC (rev 17177)
+++ branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_items.xul 2010-08-11 21:50:25 UTC (rev 17178)
@@ -51,6 +51,7 @@
<button id="refresh_button" label="&staff.cat.copy_browser.holdings_maintenance.refresh_button.label;" command="cmd_refresh_list" />
<spacer flex="1"/>
<menubar>
+ <!--
<menu label="Actions for this Serial Control" accesskey="C">
<menupopup>
<menuitem command="cmd_predict_items" label="Predict Items"/>
@@ -58,6 +59,7 @@
<menuitem command="cmd_edit_mfhd" label="Edit MFHD Record"/>
</menupopup>
</menu>
+ -->
<menu label="&staff.cat.copy_browser.holdings_maintenance.actions.label;" accesskey="&staff.cat.copy_browser.holdings_maintenance.actions.accesskey;">
<menupopup>
<menuitem command="cmd_edit_items" label="Edit Item Attributes" accesskey="&staff.cat.copy_browser.actions.cmd_edit_items.accesskey;"/>
@@ -84,7 +86,7 @@
<splitter state="open" collapse="after" resizebefore="closest" resizeafter="farthest"/>
<hbox align="center">
<label style="font-weight: bold" value="Showing: "/>
- <label id="serial_workarea_type_label" value="Recently Received"/>
+ <label id="serial_workarea_mode_label" value="Recently Received"/>
<spacer flex="1"/>
<button label="Receive/Move Selected ↓" command="cmd_receive_items"/>
</hbox>
Modified: branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_subs.js
===================================================================
--- branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_subs.js 2010-08-11 20:59:25 UTC (rev 17177)
+++ branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_subs.js 2010-08-11 21:50:25 UTC (rev 17178)
@@ -188,6 +188,7 @@
function() {
try {
var list = obj.ids_from_sel_list('ssub');
+ if (list.length == 0) list = obj.ids_from_sel_list('scap-group');
if (list.length == 0) return;
/*TODO: permission check?
@@ -225,6 +226,7 @@
function() {
try {
var list = obj.ids_from_sel_list('ssub');
+ if (list.length == 0) list = obj.ids_from_sel_list('siss-group');
if (list.length == 0) return;
/*TODO: permission check?
@@ -954,6 +956,8 @@
JSAN.use('util.exec'); var exec = new util.exec(20); exec.timer(obj.funcs,100);
+ obj.toggle_actions(); // disable menus initially
+
} catch(E) {
this.error.standard_unexpected_error_alert('serial/manage_subs.init: ',E);
}
@@ -1527,7 +1531,7 @@
'to_bottom' : true,
'no_auto_select' : true,
};
- data['row']['my'][type] = item;
+ data['row']['my'][type] = item; // TODO: future optimization: get only the IDs of these leaves, then fetch the full row in 'retrieve_row'
var nparams = obj.list.append(data);
var node = nparams.my_node;
obj.map_tree[ type + '_' + item.id() ] = node;
Modified: branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_subs.xul
===================================================================
--- branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_subs.xul 2010-08-11 20:59:25 UTC (rev 17177)
+++ branches/seials-integration/Open-ILS/xul/staff_client/server/serial/manage_subs.xul 2010-08-11 21:50:25 UTC (rev 17178)
@@ -32,8 +32,7 @@
JSAN.errorLevel = "die"; // none, warn, or die
JSAN.addRepository('/xul/server/');
JSAN.use('util.error'); g.error = new util.error();
- g.error.sdump('D_TRACE','my_init() for serial/manage_subs.xul');
- //JSAN.use('serial2.init');
+ g.error.sdump('D_TRACE','manage_subs_init() for serial/manage_subs.xul');
JSAN.use('serial.manage_subs'); g.manage_subs = new serial.manage_subs();
g.manage_subs.init( { 'docid' : xul_param('docid') } );
@@ -55,7 +54,9 @@
<menuitem command="cmd_add_sdist" label="Add Distribution"/>
<menuitem command="cmd_add_siss" label="Add Issuance"/>
<menuitem command="cmd_add_scap" label="Add Caption/Pattern"/>
+ <menuseparator/>
<menuitem command="cmd_make_predictions" label="Make Predictions"/>
+ <menuseparator/>
<menuitem command="cmd_delete_ssub" label="Delete Subscription"/>
<menuitem command="cmd_delete_sdist" label="Delete Distribution"/>
<menuitem command="cmd_delete_siss" label="Delete Issuance"/>
@@ -78,7 +79,9 @@
<menuitem command="cmd_add_sdist" label="Add Distribution"/>
<menuitem command="cmd_add_siss" label="Add Issuance"/>
<menuitem command="cmd_add_scap" label="Add Caption/Pattern"/>
+ <menuseparator/>
<menuitem command="cmd_make_predictions" label="Make Predictions"/>
+ <menuseparator/>
<menuitem command="cmd_delete_ssub" label="Delete Subscription"/>
<menuitem command="cmd_delete_sdist" label="Delete Distribution"/>
<menuitem command="cmd_delete_siss" label="Delete Issuance"/>
Modified: branches/seials-integration/Open-ILS/xul/staff_client/server/serial/sdist_editor.js
===================================================================
--- branches/seials-integration/Open-ILS/xul/staff_client/server/serial/sdist_editor.js 2010-08-11 20:59:25 UTC (rev 17177)
+++ branches/seials-integration/Open-ILS/xul/staff_client/server/serial/sdist_editor.js 2010-08-11 21:50:25 UTC (rev 17178)
@@ -314,25 +314,15 @@
}
// return cached version if we have it
+ // TODO: clear cache on holding_lib change? (cannot remember how to reproduce this bug)
if (obj.acn_lists[lib_id]) {
return obj.acn_lists[lib_id];
}
- /* we only show this list if dealing with one org_unit, default to first sdist*/
- var my_sre = obj.network.request(
- 'open-ils.pcrud',
- 'open-ils.pcrud.retrieve.sre',
- [ ses(), obj.sdists[0].record_entry() ]
- );
-
- if (!my_sre) {
- return [];
- }
-
var acn_list = obj.network.request(
'open-ils.pcrud',
'open-ils.pcrud.search.acn',
- [ ses(), {"record" : my_sre.record(), "owning_lib" : lib_id, "deleted" : 'f' }, {"order_by" : {"acn" : "label"} } ]
+ [ ses(), {"record" : obj.docid, "owning_lib" : lib_id, "deleted" : 'f' }, {"order_by" : {"acn" : "label"} } ]
);
if (!acn_list) {
Modified: branches/seials-integration/Open-ILS/xul/staff_client/server/serial/serctrl_main.xul
===================================================================
--- branches/seials-integration/Open-ILS/xul/staff_client/server/serial/serctrl_main.xul 2010-08-11 20:59:25 UTC (rev 17177)
+++ branches/seials-integration/Open-ILS/xul/staff_client/server/serial/serctrl_main.xul 2010-08-11 21:50:25 UTC (rev 17178)
@@ -62,11 +62,13 @@
<command id="cmd_make_predictions"/>
<command id="cmd_mark_library"/>
<command id="cmd_mark_subscription"/>
- <!--<command id="cmd_predict_items"/>-->
+ <command id="cmd_predict_items"/>
<command id="cmd_print_spine_labels"/>
<command id="cmd_receive_items"/>
<command id="cmd_refresh_list"/>
<command id="cmd_replace_barcode"/>
+ <command id="cmd_set_sunit" />
+ <command id="cmd_set_other_sunit" />
<command id="cmd_show_all_libs" />
<command id="cmd_show_libs_with_distributions" />
<command id="cmd_show_my_libs" />
@@ -99,21 +101,21 @@
</popupset> -->
<!-- <groupbox flex="1" class="my_overflow"> -->
- <tabbox id="serial_tabbox" flex="1">
+ <tabbox id="serial_tabbox" flex="1" class="my_overflow">
<caption label="Serial Control"/>
<tabs>
<tab label="Items" />
<tab label="Units" />
- <tab label="Summaries" />
+ <tab label="Distributions" />
<tab id="serial_manage_subs_tab" label="Subscriptions" />
<tab label="Claims" />
</tabs>
<tabpanels flex="1">
<tabpanel id="serial_manage_items" />
- <tabpanel id="serial_manage_units" />
- <tabpanel id="serial_manage_summaries" />
+ <tabpanel id="serial_manage_units"><description>This tab will contain an alternative unit view/editor.</description></tabpanel>
+ <tabpanel id="serial_manage_distributions"><description>This tab will contain a tree of distributions with editors for templates, summaries, and streams.</description></tabpanel>
<tabpanel id="serial_manage_subs" />
- <tabpanel id="serial_manage_claims" />
+ <tabpanel id="serial_manage_claims"><description>This tab will contain a claims interface.</description></tabpanel>
</tabpanels>
</tabbox>
<!-- </groupbox> -->
More information about the open-ils-commits
mailing list