{"version":3,"sources":["DownloadFormInit.js","IndicatorSelectionCheckboxView.js","IndicatorSelectionModel.js","IndicatorSelectionRouter.js","IndicatorSelectionTreeView.js"],"names":["$","_","updateLayout","ns","nspace","$downloadAwait","debounce","colorbox","resize","width","window","DownloadButton","model","self","$downloadFiles","click","indicators","get","val","ccc","components","ui","ColorboxDownloader","waiting","failure","no_selection","download","inline","href","height","onComplete","removeClass","addClass","scrolling","transition","jQuery","IndicatorSelectionCheckboxView","Backbone","View","extend","initialize","selectedCategories","this","split","setSelectedIndicators","indicatorArray","willCheck","newIndicators","allIndicators","each","indicator","contains","push","reject","el","sort","a","b","join","set","bindAll","on","render","length","parentId","attr","has","replace","prop","parent","find","column","children","$topLevelCategory","$subCategories","$orphanCheckboxes","counter","$topLevelCategoryCheckBox","$subCategory","$checkBoxes","subCounter","$subCategoryCheckBox","id","isIn","IndicatorSelectionModel","Model","defaults","0","selectedIndicators","IndicatorSelectionRouter","Router","routes","",":selectedCategories",":selectedCategories/:selectedIndicators","initializeViews","catIds","catIdHash","i","parseInt","silent","updateUrl","tableView","IndicatorSelectionTreeView","checkboxView","downloadButton","trigger","urlParts","cats","size","keys","navigate","e","newIds","closest","data","selectedIds","omit","$topLevelCategories","ids","elementsToShow","isHidden","$element","stop","css","merge","filter","slideUp","slideDown","catId","$container","catIsSelected","text"],"mappings":"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","file":"download-indicator-selection-generated.js","sourcesContent":["(function($, _) {\r\n \"use strict\";\r\n\r\n var ns = nspace(\"ccc.indicatorSelection\"),\r\n $downloadAwait = $(\"#downloadAwait\");\r\n\r\n // set up window resize\r\n (function() {\r\n var updateLayout;\r\n\r\n // set up colorbox resize after window resize\r\n updateLayout = _.debounce(function() {\r\n $downloadAwait.colorbox.resize({ width: \"600px\" });\r\n }, 400);\r\n $(window).resize(updateLayout);\r\n })();\r\n\r\n var noTopicsSelected = true;\r\n\r\n ns.DownloadButton = function(model) {\r\n var self = model,\r\n $downloadFiles = $(\"#downloadFiles\");\r\n\r\n $downloadFiles.click(function() {\r\n var indicators = self.get(\"selectedIndicators\"),\r\n downloadHref,\r\n colorboxDownloader;\r\n\r\n if (\r\n indicators !== \"0\" &&\r\n indicators !== \"\" &&\r\n indicators !== null &&\r\n typeof indicators !== \"undefined\"\r\n ) {\r\n downloadHref = \"/data/downloaddata/\";\r\n\r\n $(\"#no-items-selected\").val(\"false\");\r\n\r\n colorboxDownloader = new ccc.components.ui.ColorboxDownloader(\r\n $downloadFiles,\r\n \"#downloadAwait\",\r\n downloadHref,\r\n {\r\n waiting: \"#download-waiting\",\r\n failure: \"#download-failure\",\r\n no_selection: \"#download-no-selection\",\r\n },\r\n \"no-display\",\r\n 20000,\r\n \"POST\",\r\n {\r\n \"indicators\": indicators,\r\n },\r\n );\r\n colorboxDownloader.download();\r\n }\r\n else {\r\n $(\"#no-items-selected\").val(\"true\");\r\n\r\n $.colorbox({\r\n inline: true,\r\n href: \"#downloadAwait\",\r\n height: 200,\r\n width: 300,\r\n onComplete: function() {\r\n $(\"#download-no-selection\").removeClass(\"no-display\");\r\n $(\"#download-waiting, #download-failure\").addClass(\"no-display\");\r\n noTopicsSelected = true;\r\n },\r\n scrolling: false,\r\n transition: \"none\",\r\n });\r\n }\r\n });\r\n };\r\n})(jQuery, _);\r\n","/// \r\n/// \r\n/// \r\n\r\n(function($, _) {\r\n \"use strict\";\r\n\r\n var ns = nspace(\"ccc.indicatorSelection\");\r\n ns.IndicatorSelectionCheckboxView = Backbone.View.extend({\r\n initialize: function() {\r\n var self = this,\r\n indicators = self.model.get(\"selectedIndicators\").split(\",\"),\r\n selectedCategories;\r\n\r\n _.bindAll(this, \"render\");\r\n\r\n this.model.on(\"change\", this.render);\r\n\r\n // change the selectedCategories of the model\r\n // if the category isn't initially expanded\r\n if (self.model.get(\"selectedIndicators\").length > 0) {\r\n selectedCategories = self.model.get(\"selectedCategories\");\r\n // get the selected categories of each checkbox\r\n _.each(indicators, function(indicator) {\r\n // get the selected category\r\n var parentId = $(\"#indicator-\" + indicator).attr(\"indicator\");\r\n if (\r\n _.has(selectedCategories, parentId) === false &&\r\n typeof parentId !== \"undefined\"\r\n ) {\r\n selectedCategories[parentId] = true;\r\n self.model.set(\"selectedCategories\", selectedCategories);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the model's selectedIndicators given an array of indicators to add or remove.\r\n * @param indicatorArray An array of indicators to add or remove.\r\n * @param willCheck True to add, false to remove the specified indicators.\r\n */\r\n function setSelectedIndicators(indicatorArray, willCheck) {\r\n var allIndicators = self.model.get(\"selectedIndicators\").split(\",\"),\r\n newIndicators;\r\n\r\n _.each(indicatorArray, function(indicator) {\r\n if (\r\n willCheck === true &&\r\n _.contains(allIndicators, indicator) === false\r\n ) {\r\n allIndicators.push(indicator);\r\n }\n else if (willCheck === false) {\r\n allIndicators = _(allIndicators).reject(function(el) {\r\n return el === indicator;\r\n });\r\n }\r\n });\r\n\r\n allIndicators.sort(function(a, b) {\r\n return a - b;\r\n });\r\n\r\n newIndicators = allIndicators.join(\",\");\r\n if (newIndicators === \"\") {\r\n newIndicators = \"0\";\r\n }\r\n if (self.model.get(\"selectedIndicators\") !== newIndicators) {\r\n self.model.set(\"selectedIndicators\", newIndicators);\r\n }\r\n }\r\n\r\n $(\".download-subtopic-list-checkbox\").on(\"click\", function() {\r\n setSelectedIndicators(\r\n [\r\n $(this)\r\n .attr(\"id\")\r\n .replace(\"indicator-\", \"\")\r\n ],\r\n $(this).prop(\"checked\")\r\n );\r\n });\r\n\r\n $(\".download-subcategory, .download-category\").on(\"click\", function() {\r\n var newIndicators = [];\r\n $(this)\r\n .parent(\"li\")\r\n .find(\".download-subtopic-list-checkbox\")\r\n .each(function() {\r\n newIndicators.push(\r\n $(this)\r\n .attr(\"id\")\r\n .replace(\"indicator-\", \"\")\r\n );\r\n });\r\n\r\n setSelectedIndicators(newIndicators, $(this).prop(\"checked\"));\r\n });\r\n },\r\n\r\n /**\r\n * Checks the checkboxes, as well as parent checkboxes\r\n */\r\n render: function() {\r\n var self = this,\r\n indicators = self.model.get(\"selectedIndicators\").split(\",\"),\r\n columns = [\r\n \".download-indicator-list-left\",\r\n \".download-indicator-list-right\"\r\n ];\r\n\r\n // get the hierarchy of tabs\r\n _.each(columns, function(column) {\r\n // get the top level categories\r\n $(column)\r\n .children(\"li\")\r\n .each(function() {\r\n var $topLevelCategory = $(this),\r\n $subCategories = $topLevelCategory\r\n .find(\".indicator-subtopics-list\")\r\n .children(\"li\"),\r\n $orphanCheckboxes = $topLevelCategory\r\n .find(\".download-indicator-list-toggle-container\")\r\n .children(\".download-subtopic-list\")\r\n .find(\".download-subtopic-list-checkbox\"),\r\n counter = 0,\r\n $topLevelCategoryCheckBox = $topLevelCategory.children(\r\n \"input.download-category\"\r\n );\r\n\r\n // get any sub categories\r\n $subCategories.each(function() {\r\n var $subCategory = $(this),\r\n $checkBoxes = $subCategory.find(\r\n \".download-subtopic-list-checkbox\"\r\n ),\r\n subCounter = 0,\r\n $subCategoryCheckBox = $subCategory.children(\r\n \"input.download-subcategory\"\r\n );\r\n\r\n // check the applicable checkboxes\r\n $checkBoxes.each(function() {\r\n var id = $(this)\r\n .attr(\"id\")\r\n .replace(\"indicator-\", \"\"),\r\n isIn = _.contains(indicators, id);\r\n if ($(this).prop(\"checked\") !== isIn) {\r\n $(this).prop(\"checked\", isIn);\r\n }\r\n\r\n // count the number of checked in outer var\r\n if ($(this).prop(\"checked\") === true) {\r\n subCounter++;\r\n }\r\n });\r\n\r\n // check the applicable subcategory checkboxes\r\n $subCategoryCheckBox.each(function() {\r\n if (\r\n $(this).prop(\"checked\") !==\r\n (subCounter === $checkBoxes.length)\r\n ) {\r\n $(this).prop(\"checked\", subCounter === $checkBoxes.length);\r\n }\r\n // count the number of subcategory checked in outer var\r\n if ($(this).prop(\"checked\") === true) {\r\n counter++;\r\n }\r\n });\r\n });\r\n\r\n // check the applicable orphaned checkboxes\r\n $orphanCheckboxes.each(function() {\r\n var id = $(this)\r\n .attr(\"id\")\r\n .replace(\"indicator-\", \"\"),\r\n isIn = _.contains(indicators, id);\r\n if ($(this).prop(\"checked\") !== isIn) {\r\n $(this).prop(\"checked\", isIn);\r\n }\r\n\r\n // count the number of checked in outer var\r\n if ($(this).prop(\"checked\") === true) {\r\n counter++;\r\n }\r\n });\r\n\r\n // check the applicable top level category checkboxes\r\n $topLevelCategoryCheckBox.each(function() {\r\n if (\r\n $(this).prop(\"checked\") !==\r\n (counter === $subCategories.length + $orphanCheckboxes.length)\r\n ) {\r\n // check the top level category checkbox\r\n $(this).prop(\r\n \"checked\",\r\n counter === $subCategories.length + $orphanCheckboxes.length\r\n );\r\n }\r\n });\r\n });\r\n });\r\n }\r\n });\r\n})(jQuery, _);\r\n","/// \r\n/// \r\n\r\n(function() {\r\n var ns = nspace(\"ccc.indicatorSelection\");\r\n\r\n ns.IndicatorSelectionModel = Backbone.Model.extend({\r\n defaults: {\r\n selectedCategories: { 0: true },\r\n /** number: selects the given indicator */\r\n selectedIndicators: \"0\"\r\n }\r\n });\r\n})(jQuery);\r\n","/// \r\n/// \r\n\r\n(function(_) {\r\n var ns = nspace(\"ccc.indicatorSelection\");\r\n\r\n ns.IndicatorSelectionRouter = Backbone.Router.extend({\r\n initialize: function() {\r\n _.bindAll(this, \"updateUrl\");\r\n },\r\n\r\n routes: {\r\n \"\": \"initializeViews\",\r\n \":selectedCategories\": \"initializeViews\",\r\n \":selectedCategories/:selectedIndicators\": \"initializeViews\"\r\n },\r\n\r\n initializeViews: function(selectedCategories, selectedIndicators) {\r\n // This method will only ever be invoked a single time, so use\r\n // it to initialize the model/view classes and trigger the initial rendering\r\n this.model = new ns.IndicatorSelectionModel();\r\n\r\n if (typeof selectedCategories !== \"undefined\") {\r\n var catIds = selectedCategories.split(\",\");\r\n var catIdHash = {};\r\n for (var i = 0; i < catIds.length; i++) {\r\n catIdHash[parseInt(catIds[i], 10)] = true;\r\n }\r\n this.model.set(\"selectedCategories\", catIdHash, {\r\n silent: true\r\n });\r\n }\r\n\r\n if (typeof selectedIndicators !== \"undefined\") {\r\n this.model.set(\"selectedIndicators\", selectedIndicators);\r\n }\r\n\r\n // Listen for changes to the model and update our URL\r\n this.model.on(\"change\", this.updateUrl);\r\n\r\n this.tableView = new ns.IndicatorSelectionTreeView({\r\n model: this.model\r\n });\r\n this.checkboxView = new ns.IndicatorSelectionCheckboxView({\r\n model: this.model\r\n });\r\n this.downloadButton = new ns.DownloadButton(this.model);\r\n\r\n // Trigger a change notification on the model now that all of the selectors have finished initializing\r\n // so that other components can update themselves to reflect the current app state\r\n this.model.trigger(\"change\");\r\n },\r\n\r\n updateUrl: function() {\r\n var urlParts = [];\r\n\r\n var cats = this.model.get(\"selectedCategories\");\r\n if (cats && _.size(cats) > 0) {\r\n urlParts.push(_.keys(cats).join(\",\"));\r\n }\r\n\r\n var indicators = this.model.get(\"selectedIndicators\");\r\n if (indicators) {\r\n urlParts.push(indicators);\r\n }\r\n\r\n this.navigate(urlParts.join(\"/\"), { replace: true });\r\n }\r\n });\r\n})(_);\r\n","/// \r\n/// \r\n\r\n(function($, _) {\r\n var ns = nspace(\"ccc.indicatorSelection\");\r\n\r\n ns.IndicatorSelectionTreeView = Backbone.View.extend({\r\n initialize: function() {\r\n _.bindAll(this, \"render\");\r\n var self = this;\r\n\r\n this.model.on(\"change\", this.render);\r\n\r\n // Listen for clicks on the category nodes and toggle their visibilty\r\n $(\".download-indicator-lists-container\").on(\r\n \"click\",\r\n \"li[data-top-category] .download-indicator-list-link\",\r\n function(e) {\r\n var $catNode = $(this).closest(\"li[data-top-category]\");\r\n var id = $catNode.data(\"category-id\");\r\n\r\n var selectedIds = self.model.get(\"selectedCategories\");\r\n var newIds;\r\n if (_.has(selectedIds, id)) {\r\n // update the model\r\n newIds = _.omit(selectedIds, \"\" + id); // _.omit seems to be broken for int keys, so stringify the id\r\n self.model.set(\"selectedCategories\", newIds);\r\n }\n else {\r\n // update the model\r\n newIds = {};\r\n newIds[id] = true;\r\n _.extend(newIds, selectedIds);\r\n self.model.set(\"selectedCategories\", newIds);\r\n }\r\n }\r\n );\r\n\r\n // Listen for a click on the \"expand/collapse\" button and update the model\r\n $(\".indicator-tree-toggle\").on(\"click\", function() {\r\n var $topLevelCategories = $(\"li[data-top-category]\"),\r\n ids = self.model.get(\"selectedCategories\"),\r\n newIds = {};\r\n\r\n // if the number of selectedCategories in the model is equal to the\r\n // number of li's in the view, collapse; otherwise, expand\r\n if ($topLevelCategories.length === _.size(ids)) {\r\n // collapse\r\n self.model.set(\"selectedCategories\", { 0: true });\r\n }\n else {\r\n $topLevelCategories.each(function() {\r\n newIds[$(this).data(\"category-id\")] = true;\r\n });\r\n self.model.set(\"selectedCategories\", newIds);\r\n }\r\n });\r\n },\r\n\r\n render: function() {\r\n // The tree html is rendered on the server side, so just\r\n // hide or show the indicator & category nodes that correspond with\r\n // the currently selected location type\r\n var self = this;\r\n var elementsToHide = [];\r\n var elementsToShow = [];\r\n var $topLevelCategories = $(\"li[data-top-category]\");\r\n\r\n function isHidden($element) {\r\n // The :visible/:hidden pseudoselectors are affected by parent visibility, but\r\n // for the purposes of deciding what to show, we need to know if the elements\r\n // would be hidden even if the parent element is not.\r\n // Test this by checking for CSS styles.\r\n return (\r\n $element\r\n .stop(true, true) // Finish any pending animations immediately, or we can't be sure\r\n .css(\"display\") === \"none\"\r\n ); // In this case, we need only look at \"display\"\r\n }\r\n\r\n // Anything with a \"data-loctype-ids\" attribute is potentially hidden\r\n $.merge(\r\n elementsToShow,\r\n $(\"[data-loctype-ids]\").filter(function() {\r\n return isHidden($(this));\r\n })\r\n );\r\n\r\n $(elementsToHide).slideUp(700);\r\n $(elementsToShow).slideDown(700);\r\n\r\n // Open / close the top level tree nodes as necessary\r\n var selectedIds = self.model.get(\"selectedCategories\");\r\n $topLevelCategories.each(function() {\r\n var catId = $(this).data(\"category-id\");\r\n var $container = $(\".download-indicator-list-toggle-container\", this);\r\n var catIsSelected = _.has(selectedIds, catId);\r\n if (catIsSelected && isHidden($container)) {\r\n $container.slideDown();\r\n $(\".download-indicator-list-link\", this).addClass(\"active\");\r\n }\n else if (!catIsSelected && !isHidden($container)) {\r\n $container.slideUp();\r\n $(\".download-indicator-list-link\", this).removeClass(\"active\");\r\n }\r\n });\r\n\r\n $(\".indicator-tree-toggle\").text(\r\n _.size(selectedIds) === $topLevelCategories.length\r\n ? \"Collapse All\"\r\n : \"Expand All\"\r\n );\r\n }\r\n });\r\n})(jQuery, _);\r\n"]}