dataset-selector.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /**
  2. * Reusable component that encapsulates selecting a dataset to work on in a given page.
  3. * Takes the FusekiServer as a model, and populates a select control to choose one of the
  4. * current datasets. If the dataset changes, this view will update the `selectedDatasetName`
  5. * on the model, and trigger the event `dataset.changed`.
  6. **/
  7. define(
  8. function( require ) {
  9. "use strict";
  10. var Marionette = require( "marionette" ),
  11. Backbone = require( "backbone" ),
  12. _ = require( "underscore" ),
  13. fui = require( "app/fui" ),
  14. sprintf = require( "sprintf" ),
  15. datasetSelectorTemplate = require( "plugins/text!app/templates/dataset-selector.tpl" );
  16. var DatasetSelectorView = Backbone.Marionette.ItemView.extend( {
  17. initialize: function(){
  18. this.listenTo( this.model, "change", this.render, this );
  19. },
  20. template: _.template( datasetSelectorTemplate ),
  21. el: ".dataset-selector-container",
  22. ui: {
  23. select: ".dataset-selector select"
  24. },
  25. events: {
  26. "change .dataset-selector select": "onChangeDataset"
  27. },
  28. /**
  29. * After rendering, set up the dataset picker and notify the rest of the
  30. * app if the default dataset name is known.
  31. */
  32. onRender: function() {
  33. var selector = $('.selectpicker');
  34. selector.selectpicker('refresh');
  35. if (selector.val()) {
  36. this.unHideDatasetElements();
  37. this.onChangeDataset();
  38. }
  39. },
  40. /**
  41. * Respond to a change in the dataset name selection by updating
  42. * the underlying model. TODO: should also update the application
  43. * URL.
  44. */
  45. onChangeDataset: function( e ) {
  46. var newDatasetName = this.ui.select.val();
  47. this.model.set( "selectedDatasetName", newDatasetName );
  48. this.notifyDatasetName( newDatasetName );
  49. },
  50. /**
  51. * Ensure that elements that should be visible when a dataset is known
  52. * are not hidden, and vice-versa.
  53. */
  54. unHideDatasetElements: function() {
  55. $(".no-dataset").addClass( "hidden" );
  56. $(".with-dataset").removeClass( "hidden" );
  57. },
  58. /** Trigger an event to notify other components that the dataset
  59. * name has been selected.
  60. */
  61. notifyDatasetName: function( dsName ) {
  62. fui.vent.trigger( "dataset.changed", dsName || this.ui.select.val() );
  63. }
  64. });
  65. return DatasetSelectorView;
  66. }
  67. );