diff --git a/ui/scripts/ui/widgets/detailView.js b/ui/scripts/ui/widgets/detailView.js index bfc67f61f66..acbd19ebf88 100644 --- a/ui/scripts/ui/widgets/detailView.js +++ b/ui/scripts/ui/widgets/detailView.js @@ -870,6 +870,13 @@ var removedTabs = []; var tabFilter = options.tabFilter; var context = options.context ? options.context : {}; + var updateContext = $detailView.data('view-args').updateContext; + + if (updateContext) { + $.extend($detailView.data('view-args').context, updateContext({ + context: $detailView.data('view-args').context + })); + } if(options.newData && ($detailView.data('view-args').section != null && context[$detailView.data('view-args').section] != null && context[$detailView.data('view-args').section].length > 0)) { diff --git a/ui/tests/test.detailView.js b/ui/tests/test.detailView.js index 1d098a34916..413e28dac20 100644 --- a/ui/tests/test.detailView.js +++ b/ui/tests/test.detailView.js @@ -743,4 +743,53 @@ }; $detailView.find('.action.updateDataTestAsync a').click(); }); + + test('Update context', function() { + var detailView = { + context: { + listViewItemA: [ + { fieldA: 'fieldAContent' } + ] + // listViewItemB [not stored yet] + }, + + tabFilter: function(args) { + start(); + ok($.isArray(args.context.listViewItemB), 'updateContext called before tabFilter'); + stop(); + + return []; + }, + + // updateContext is executed every time a data provider is called + updateContext: function(args) { + start(); + ok(true, 'updateContext called'); + equal(args.context.listViewItemA[0].fieldA, 'fieldAContent', 'updateContext: Item A present in context'); + stop(); + + return { + listViewItemB: [ + { fieldB: 'fieldBContent' } + ] + }; + }, + + tabs: { + test: { + title: 'test', + fields: { fieldA: { label: 'fieldA'}, fieldB: { label: 'fieldB' }}, + dataProvider: function(args) { + start(); + equal(args.context.listViewItemA[0].fieldA, 'fieldAContent', 'dataProvider: Item A present in context'); + equal(args.context.listViewItemB[0].fieldB, 'fieldBContent', 'dataProvider: Item B present in context'); + } + } + } + }; + var $detailView = $('
'); + + stop(); + $detailView.detailView(detailView); + }); }(jQuery));