Just a grid for now.
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
<script src="[% ctx.media_prefix %]/js/ui/default/staff/serials/directives/sub_selector.js"></script>
<script src="[% ctx.media_prefix %]/js/ui/default/staff/serials/directives/prediction_manager.js"></script>
<script src="[% ctx.media_prefix %]/js/ui/default/staff/serials/directives/prediction_wizard.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/serials/directives/item_manager.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/serials/directives/view-items-grid.js"></script>
<script src="[% ctx.media_prefix %]/js/ui/default/staff/cat/services/record.js"></script>
<script>
angular.module('egCoreMod').run(['egStrings', function(s) {
--- /dev/null
+<div>
+<eg-sub-selector bib-id="bibId" ssub-id="ssubId"></eg-sub-selector>
+</div>
+
+<div>
+<eg-item-grid bib-id="bibId" ssub-id="ssubId"></eg-item-grid>
+</div>
</eg-prediction-manager>
</uib-tab>
<uib-tab index="'view-issues'" heading="[% l('View Issues') %]">
- <p>View Issues TODO</p>
+ <eg-item-manager ng-if="active_tab == 'view-issues'"
+ bib-id="bib_id" ssub-id="ssub.id">
+ </eg-item-manager>
</uib-tab>
<uib-tab index="'receive'" heading="[% l('Receive') %]">
<p>Receive TODO</p>
--- /dev/null
+<div>
+ <eg-grid
+ id-field="index"
+ features="-display,-sort,-multisort"
+ items-provider="itemGridProvider"
+ grid-controls="itemGridControls"
+ persist-key="serials.view_item_grid">
+
+ <eg-grid-action handler="edit_items"
+ label="[% l('Edit Items') %]"></eg-grid-action>
+ <eg-grid-action handler="delete_items"
+ label="[% l('Delete Items') %]"></eg-grid-action>
+
+ <eg-grid-field label="[% l('Distribution Library') %]" path="stream.distribution.holding_lib.name" visible></eg-grid-field>
+ <eg-grid-field label="[% l('Issuance') %]" path="issuance.label" visible></eg-grid-field>
+ <eg-grid-field label="[% l('Publication Date') %]" path="issuance.date_published" visible></eg-grid-field>
+ <eg-grid-field label="[% l('Holding Type') %]" path="issuance.holding_type" visible></eg-grid-field>
+ <eg-grid-field label="[% l('Route To') %]" path="stream.routing_label"></eg-grid-field>
+ <eg-grid-field label="[% l('Receiving Template') %]" path="stream.distribution.receive_unit_template.name" visible></eg-grid-field>
+ <eg-grid-field label="[% l('Summary Display') %]" path="stream.distribution.summary_method" visible></eg-grid-field>
+ <eg-grid-field label="[% l('Receiving Call Number') %]" path="stream.distribution.receive_call_number.label"></eg-grid-field>
+ <eg-grid-field label="[% l('Binding Call Number') %]" path="stream.distribution.bind_call_number.label"></eg-grid-field>
+ <eg-grid-field label="[% l('Binding Template') %]" path="stream.distribution.bind_unit_template.name"></eg-grid-field>
+ <eg-grid-field label="[% l('Unit Label Prefix') %]" path="stream.distribution.unit_label_prefix"></eg-grid-field>
+ <eg-grid-field label="[% l('Unit Label Suffix') %]" path="stream.distribution.unit_label_suffix"></eg-grid-field>
+ <eg-grid-field label="[% l('Display Grouping') %]" path="stream.distribution.display_grouping"></eg-grid-field>
+ <eg-grid-field label="[% l('Subscription ID') %]" path="stream.distribution.subscription.id"></eg-grid-field>
+ <eg-grid-field label="[% l('Distribution ID') %]" path="stream.distribution.id"></eg-grid-field>
+ </eg-grid>
+</div>
+
--- /dev/null
+angular.module('egSerialsAppDep')
+
+.directive('egItemManager', function() {
+ return {
+ transclude: true,
+ restrict: 'E',
+ scope: {
+ bibId : '=',
+ ssubId : '='
+ },
+ templateUrl: './serials/t_item_manager',
+ controller:
+ ['$scope','$q','egSerialsCoreSvc','egCore','$uibModal',
+function($scope , $q , egSerialsCoreSvc , egCore , $uibModal) {
+
+ egSerialsCoreSvc.fetch($scope.bibId);
+
+ // convert to sitem funcs
+ $scope.createScap = function(pred) {
+ var scap = egCore.idl.fromTypedHash(pred);
+ egCore.pcrud.create(scap).then(function() {
+ // completely reset the model in order to reset the
+ // forms; causes a blink, alas
+ $scope.predictions = [];
+ $scope.new_prediction = null;
+ egSerialsCoreSvc.fetch($scope.bibId).then(function() {
+ reload($scope.ssubId);
+ });
+ });
+ }
+ $scope.updateScap = function(pred) {
+ var scap = egCore.idl.fromTypedHash(pred);
+ egCore.pcrud.update(scap).then(function() {
+ // completely reset the model in order to reset the
+ // forms; causes a blink, alas
+ $scope.predictions = [];
+ egSerialsCoreSvc.fetch($scope.bibId).then(function() {
+ reload($scope.ssubId);
+ });
+ });
+ }
+ $scope.deleteScap = function(pred) {
+ var scap = egCore.idl.fromTypedHash(pred);
+ // TODO ask to confirm
+ // TODO check whether there are linked issuances
+ egCore.pcrud.remove(scap).then(function() {
+ // completely reset the model in order to reset the
+ // forms; causes a blink, alas
+ $scope.predictions = [];
+ egSerialsCoreSvc.fetch($scope.bibId).then(function() {
+ reload($scope.ssubId);
+ });
+ });
+ }
+
+
+}]
+ }
+})
--- /dev/null
+angular.module('egSerialsAppDep')
+
+.directive('egItemGrid', function() {
+ return {
+ transclude: true,
+ restrict: 'E',
+ scope: {
+ bibId : '=',
+ ssubId : '='
+ },
+ templateUrl: './serials/t_view_items_grid',
+ controller:
+ ['$scope','$q','egSerialsCoreSvc','egCore','egGridDataProvider',
+ '$uibModal',
+function($scope , $q , egSerialsCoreSvc , egCore , egGridDataProvider ,
+ $uibModal) {
+
+ $scope.svc = egSerialsCoreSvc; // just for debugging
+
+ function reload(ssubId) {
+ return egSerialsCoreSvc.fetchItemsForSub(ssubId).then(function(list) {
+ $scope.itemGridProvider.refresh();
+ });
+ }
+
+ $scope.$watch('ssubId', function(newVal, oldVal) {
+ if (newVal && newVal != oldVal) return reload(newVal);
+ });
+
+ $scope.itemGridControls = {
+ activateItem : function (item) { } // TODO
+ };
+
+ $scope.itemGridProvider = egGridDataProvider.instance({
+ get : function(offset, count) {
+ return this.arrayNotifier(egSerialsCoreSvc.itemList, offset, count);
+ }
+ });
+
+ $scope.need_one_selected = function() {
+ var items = $scope.itemGridControls.selectedItems();
+ if (items.length == 1) return false;
+ return true;
+ };
+
+ if (!egSerialsCoreSvc.subTree.length) {
+ egSerialsCoreSvc.fetch($scope.bibId).then(function() {
+ return reload($scope.ssubId);
+ });
+ } else if ($scope.ssubId) {
+ reload($scope.ssubId);
+ }
+
+}]
+
+ }
+})
subId : null,
subTree : [],
subList : [],
- sptList : []
+ sptList : [],
+ itemTree : [],
+ itemList : []
};
// fetch subscription, distributions, streams, captions,
update_flat_sdist_sstr_list();
});
}
+
+ // Creates an inverted tree from item to sub
+ service.fetchItemsForSub = function(subId) {
+
+ if (!subId && service.subId) subId = service.subId;
+ if (!subId) return $q.reject('fetchItemsForSub: no subscription id');
+
+ var sub = service.get_ssub(subId);
+ if (!sub) return $q.reject('fetchItemsForSub: unknown subscription id');
+
+ var streams = [];
+ angular.forEach(sub.distributions(), function(dist) {
+ angular.forEach(
+ dist.streams().map(
+ function (stream) { return stream.id() }
+ ),
+ function (sid) { streams.push(sid) }
+ );
+ });
+
+ return egCore.pcrud.search(
+ 'sitem',
+ { stream : streams },
+ {
+ flesh : 1,
+ flesh_fields : {
+ sitem : ['issuance','editor','creator','unit','url']
+ }
+ },
+ { atomic : true }
+ ).then(function(list) {
+ service.subId = subId;
+ service.itemTree = list;
+
+ // map items by stream for faster lookup
+ var tmp = {};
+ angular.forEach(list, function(item) {
+ if (!tmp[item.stream()]) tmp[item.stream()] = [];
+ tmp[item.stream()].push(item);
+ });
+ angular.forEach(sub.distributions(), function(dist) {
+ angular.forEach(dist.streams(), function(stream) {
+ angular.forEach(tmp[stream.id()], function (item) {
+ var st = egCore.idl.Clone(stream,1);
+ var d = egCore.idl.Clone(dist,1);
+ var ss = egCore.idl.Clone(sub,1);
+ ss.distributions([]);
+ d.subscription(ss);
+ d.streams([]);
+ st.distribution(d);
+ item.stream(st);
+ });
+ });
+ });
+
+ service.itemList = egCore.idl.toHash(list);
+ return $q.when(list);
+ });
+ }
// create/update a flat version of the subscription/distribution/stream
// tree for feeding to the distribution and stream grid
}
service.get_ssub = function(ssubId) {
+ if (!ssubId) return;
for (var i = 0; i <= service.subTree.length; i++) {
if (service.subTree[i].id() == ssubId) {
return service.subTree[i];
} else if (thing._isfieldmapper) {
obj.a[i] = service.Clone(thing);
} else {
+ if(angular.isArray(thing)) {
+ obj.a[i] = [];
if(angular.isArray(thing)) {
obj.a[i] = [];
if (typeof old[j] == 'undefined')
obj[j] = old[j];
else if( old[j]._isfieldmapper )
- obj[j] = service.Clone(old[j]);
+ obj[j] = service.Clone(old[j], depth - 1);
else
obj[j] = angular.copy(old[j]);
}
if (typeof old[j] == 'undefined')
obj[j] = old[j];
else if( old[j]._isfieldmapper )
- obj[j] = service.Clone(old[j]);
+ obj[j] = service.Clone(old[j], depth - 1);
else
obj[j] = angular.copy(old[j]);
}