From f0c5d4d2678450e36708fb9edf7c4fb3ec91c98d Mon Sep 17 00:00:00 2001 From: eireland Date: Wed, 17 Jan 2024 16:20:19 -0800 Subject: [PATCH 1/2] update build and re-order data_interactive_map to Sonify above story builder --- build/asset-manifest.json | 8 +++--- build/index.html | 2 +- ...ifest.b78c79a36dd4399b008eaae85bc3ded5.js} | 8 +++--- build/service-worker.js | 2 +- ...3e18fb.chunk.js => main.c693d1f6.chunk.js} | 4 +-- ...hunk.js.map => main.c693d1f6.chunk.js.map} | 2 +- src/data_interactive_map.json | 28 +++++++++---------- 7 files changed, 27 insertions(+), 27 deletions(-) rename build/{precache-manifest.50006c56e19073402d72ae675adcab72.js => precache-manifest.b78c79a36dd4399b008eaae85bc3ded5.js} (76%) rename build/static/js/{main.703e18fb.chunk.js => main.c693d1f6.chunk.js} (61%) rename build/static/js/{main.703e18fb.chunk.js.map => main.c693d1f6.chunk.js.map} (99%) diff --git a/build/asset-manifest.json b/build/asset-manifest.json index 0fc5f6c5..ba2c73e6 100644 --- a/build/asset-manifest.json +++ b/build/asset-manifest.json @@ -1,14 +1,14 @@ { "files": { "main.css": "./static/css/main.36bc8d80.chunk.css", - "main.js": "./static/js/main.703e18fb.chunk.js", - "main.js.map": "./static/js/main.703e18fb.chunk.js.map", + "main.js": "./static/js/main.c693d1f6.chunk.js", + "main.js.map": "./static/js/main.c693d1f6.chunk.js.map", "runtime-main.js": "./static/js/runtime-main.42b58e32.js", "runtime-main.js.map": "./static/js/runtime-main.42b58e32.js.map", "static/js/2.c80c4b2d.chunk.js": "./static/js/2.c80c4b2d.chunk.js", "static/js/2.c80c4b2d.chunk.js.map": "./static/js/2.c80c4b2d.chunk.js.map", "index.html": "./index.html", - "precache-manifest.50006c56e19073402d72ae675adcab72.js": "./precache-manifest.50006c56e19073402d72ae675adcab72.js", + "precache-manifest.b78c79a36dd4399b008eaae85bc3ded5.js": "./precache-manifest.b78c79a36dd4399b008eaae85bc3ded5.js", "service-worker.js": "./service-worker.js", "static/css/main.36bc8d80.chunk.css.map": "./static/css/main.36bc8d80.chunk.css.map", "static/js/2.c80c4b2d.chunk.js.LICENSE.txt": "./static/js/2.c80c4b2d.chunk.js.LICENSE.txt", @@ -18,6 +18,6 @@ "static/js/runtime-main.42b58e32.js", "static/js/2.c80c4b2d.chunk.js", "static/css/main.36bc8d80.chunk.css", - "static/js/main.703e18fb.chunk.js" + "static/js/main.c693d1f6.chunk.js" ] } \ No newline at end of file diff --git a/build/index.html b/build/index.html index c3ede6d8..b4a27dc2 100644 --- a/build/index.html +++ b/build/index.html @@ -1 +1 @@ -CODAP Plugins
\ No newline at end of file +CODAP Plugins
\ No newline at end of file diff --git a/build/precache-manifest.50006c56e19073402d72ae675adcab72.js b/build/precache-manifest.b78c79a36dd4399b008eaae85bc3ded5.js similarity index 76% rename from build/precache-manifest.50006c56e19073402d72ae675adcab72.js rename to build/precache-manifest.b78c79a36dd4399b008eaae85bc3ded5.js index 9ab9c293..f6e41efa 100644 --- a/build/precache-manifest.50006c56e19073402d72ae675adcab72.js +++ b/build/precache-manifest.b78c79a36dd4399b008eaae85bc3ded5.js @@ -1,10 +1,10 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ { - "revision": "64596856986271e6f21f6d5b573915e1", + "revision": "96f90a8925d91e8bd4999b1a1b32627f", "url": "./index.html" }, { - "revision": "88e44a11d06edf1eef2c", + "revision": "d995087f826a9e4c6a24", "url": "./static/css/main.36bc8d80.chunk.css" }, { @@ -16,8 +16,8 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "./static/js/2.c80c4b2d.chunk.js.LICENSE.txt" }, { - "revision": "88e44a11d06edf1eef2c", - "url": "./static/js/main.703e18fb.chunk.js" + "revision": "d995087f826a9e4c6a24", + "url": "./static/js/main.c693d1f6.chunk.js" }, { "revision": "cb17529e290eed44a367", diff --git a/build/service-worker.js b/build/service-worker.js index ba6b5344..285eb83d 100644 --- a/build/service-worker.js +++ b/build/service-worker.js @@ -14,7 +14,7 @@ importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); importScripts( - "./precache-manifest.50006c56e19073402d72ae675adcab72.js" + "./precache-manifest.b78c79a36dd4399b008eaae85bc3ded5.js" ); self.addEventListener('message', (event) => { diff --git a/build/static/js/main.703e18fb.chunk.js b/build/static/js/main.c693d1f6.chunk.js similarity index 61% rename from build/static/js/main.703e18fb.chunk.js rename to build/static/js/main.c693d1f6.chunk.js index 38574578..e357922d 100644 --- a/build/static/js/main.703e18fb.chunk.js +++ b/build/static/js/main.c693d1f6.chunk.js @@ -1,2 +1,2 @@ -(this["webpackJsonpcodap-data-interactives"]=this["webpackJsonpcodap-data-interactives"]||[]).push([[0],[,,,,,,,function(e){e.exports=JSON.parse('{"projects":[{"name":"Ocean Tracks","url":"https://oceantracks.org/"},{"name":"ESTEEM","url":"https://hirise.fi.ncsu.edu/projects/esteem/"}],"categories":[{"category":"Partners","tooltip":"Plugins developed by and with other groups."},{"category":"Portals","tooltip":"Plugins that fetch data from external sources."},{"category":"Simulators","tooltip":"Plugins that create data with interactive simulations of phenomena."},{"category":"Generators","tooltip":"Plugins that generate data from abstract statistical models."},{"category":"Tools","tooltip":"Useful plugins that work with datasets in CODAP."},{"category":"Dev","tooltip":"Useful plugins for plugin developers."},{"category":"Search","tooltip":"Search results"}],"data_interactives":[{"title":"Ocean Tracks Selector","description":"Compare the tracks of Pacific Ocean animals tagged by the Ocean Tracks project. Note that this plugin will not load in SSL.","width":550,"height":500,"path":"https://oceantracks.org/map/trackmenu_1.html","visible":"true","aegis":"Ocean Tracks","categories":["Partners","Portals"]},{"title":"Sampler","description":"Create random datasets from scratch or existing datasets.","title-string":"DG.plugin.Sampler.title","description-string":"DG.plugin.Sampler.description","width":232,"height":400,"path":"/TP-Sampler/index.html","icon":"/TP-Sampler/icon-sampler.svg","visible":"true","aegis":"ESTEEM","isStandard":"true","categories":["Partners","Generators"]},{"title":"Scrambler","description":"Test hypotheses by randomly varying an attribute.","title-string":"DG.plugin.Scrambler.name","description-string":"DG.plugin.Scrambler.description","width":400,"height":600,"path":"/eepsmedia/plugins/scrambler/index.html","icon":"/eepsmedia/plugins/scrambler/images/whisk_on_side.svg","visible":"true","isStandard":"true","categories":["Tools"]},{"title":"SRRI Ship Odyssey Data Game","description":"Send rats on a dive to find sunken treasure with this SRRI game.","width":290,"height":304,"path":"/ShipOdyssey/index.html","visible":false,"aegis":"SRRI","categories":["Partners"]},{"title":"SRRI Chainsaw Data Game","description":"Fire up a chainsaw and see how many logs you can cut to the right length. SRRI game.","width":290,"height":304,"path":"/Chainsaw/index.html","visible":false,"aegis":"SRRI","categories":["Partners"]},{"title":"SRRI Inference Data Game","description":"Another SRRI game. See if you can beat a conservative statistician at his own game -- making good guesses from samples.","width":290,"height":304,"path":"/Inference/index.html","visible":false,"aegis":"SRRI","categories":["Partners"]},{"title":"Cart Weight","description":"Win by predicting the total weight of a cart stacked with bricks.","width":290,"height":305,"path":"/CartWeight/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Ramp Game (Netlogo version)","description":"Win by landing on the target.","width":500,"height":734,"path":"/RampGame/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Floyd\'s of Fargo","description":"Make big money running your own car insurance business!","width":570,"height":480,"path":"/FloydsFargo/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Lunar Lander","description":"You and your friends land spacecrafts, then rate your landings.","width":357,"height":541,"path":"/LunarLander/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Markov","description":"Play Rock, Paper, Scissors with the evil Dr. Markov to save the dog.","width":550,"height":315,"path":"/Markov/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Proximity","description":"Get high scores by shooting a ball to land as close to a target as possible.","width":463,"height":344,"path":"/Proximity/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Shuffleboard","description":"Live on the edge-Land a disk on each pad without sliding off to score big!","width":520,"height":350,"path":"/Shuffleboard/index.html","visible":false,"aegis":"Data Games","categories":["Partners"]},{"title":"Guess My Number","description":"As the title says.","width":400,"height":250,"path":"/GuessMyNumber/GuessMyNumber.html","visible":false,"aegis":"CODAP","categories":["Misc"]},{"title":"Random Number Generator","description":"An extremely simple plugin. It generates random numbers between 1 and 100.","width":300,"height":150,"path":"/NewRandomNumbers/index.html","visible":true,"aegis":"CODAP","categories":["Utilities"]},{"title":"Fast Plants Simulator","description":"Simulate growth of fast plants.","width":400,"height":250,"path":"/FastPlants/FastPlants.html","visible":true,"aegis":"CODAP","categories":["Utilities","Simulators"]},{"title":"Performance Harness","description":"A way to generate data while testing the performance of CODAP.","width":400,"height":250,"path":"/PerformanceHarness/PerformanceHarness.html","visible":true,"aegis":"CODAP","categories":["Utilities","Dev"]},{"title":"Normal Distribution Sampler","description":"A way to generate a sample data set from a normal distribution.","width":400,"height":300,"path":"/Sampler/Sampler.html","visible":true,"aegis":"CODAP","categories":["Utilities","Generators"]},{"title":"TerraPop Plugin","description":"Plugin for importing TerraPop data sets.","width":550,"height":500,"path":"/TerraPopInteractive/TPI.html","visible":true,"aegis":"Terra-Pop","categories":["Partners","Portals"]},{"title":"GeoJSON Importer","description":"Plugin for importing GeoJSON","width":450,"height":200,"path":"/GeoJSONImporter/GeoJSONImporter.html","visible":false,"aegis":"CODAP","categories":["Utilities"]},{"title":"Wolf-Sheep Predation","description":"Netlogo model that explores the stability of predator-prey ecosystems.","width":550,"height":500,"path":"/WolfSheep/index.html","visible":true,"aegis":"CODAP","categories":["Partners","Simulators"]},{"title":"Ants","description":"Netlogo model of an ant colony seeking nearby food.","width":550,"height":500,"path":"/Ants/ants.html","visible":true,"aegis":"CODAP","categories":["Partners","Simulators"]},{"title":"Virus Growth","description":"Netlogo model that explores the effect of infectiousness, chance of recovery, and duration of the cycle on infection in a population.","width":780,"height":620,"path":"/Virus/Virus.html","visible":true,"aegis":"CODAP","categories":["Partners","Simulators"]},{"title":"Sage","description":"A Building Models systems modeler.","width":780,"height":620,"path":"https://codap.concord.org/sage/sage.html","visible":true,"aegis":"Building Models","categories":["Partners","Simulators"]},{"title":"Data Card","description":"Data Card permits the user to browse and modify a data set one case at a time.","width":780,"height":620,"path":"/DataCard/DataCard.html","visible":false,"categories":["Utilities"]},{"title":"Track Generator","description":"Simulate OceanTracks data with a simple random walk.","width":400,"height":300,"path":"/Movement/Movement.html","visible":true,"categories":["Utilities","Generators"]},{"title":"Pivotal Tracker Importer","description":"Import stories and activities from any project in Pivotal Tracker.","width":400,"height":250,"path":"/PivotalImporter/PTImporter.html","visible":false,"categories":["Utilities"]},{"title":"Spring Mass Model","description":"Physics model that simulate a mass suspended on a spring created by the InquirySpace project.","width":600,"height":400,"path":"https://lab.concord.org/embeddable.html?codap=true%23interactives/inquiry-space/2-spring.json","visible":true,"categories":["Partners","Simulators"]},{"title":"DropHTMLTable","description":"A basic screen scraper. Drop the contents of an HTML page. The plugin will find the tables to transfer to CODAP.","width":600,"height":400,"path":"/ScreenScraper/index.html","visible":true,"categories":["Utilities"]},{"title":"Questionnaire","description":"Allows the creation of a document with a questionnaire through which data can be added to CODAP.","width":400,"height":600,"path":"/questionnaire/index.html","visible":true,"categories":["Utilities"]},{"title":"Collaboration Service","description":"Allows multiple users to add data to specified data contexts.","width":300,"height":200,"path":"/CollaborationService/CollaborationService.html","visible":true,"categories":["Utilities","Tools"]},{"title":"Attribute Stacker","description":"Allows user to tidy the data set","width":600,"height":400,"path":"/AttributeStacker/index.html","visible":false,"categories":["Utilities"]},{"title":"Charts","description":"Allows user to create common charts for attributes on the data contexts","width":600,"height":400,"path":"/Charts/index.html","visible":true,"categories":["Utilities","Tools"]},{"title":"CaseGenerator","description":"","width":600,"height":400,"path":"/CaseGenerator/CaseGenerator.html","visible":false,"categories":["Utilities"]},{"title":"Plugin API Tester","description":"Exercise the CODAP Plugin API and see the results","width":600,"height":400,"path":"/DataInteractiveAPITester/index.html","visible":true,"categories":["Utilities","Dev"]},{"title":"GeoJSON Importer","description":"","width":600,"height":400,"path":"/GeoJSONImporter/GeoJSONImporter.html","visible":false,"categories":["Utilities"]},{"title":"GoogleSheets","description":"","width":600,"height":400,"path":"/GoogleSheets/example.html","visible":false,"categories":["Utilities"]},{"title":"Image Library","description":"","width":600,"height":400,"path":"/ImageLibrary/index.html","visible":false,"categories":["Utilities"]},{"title":"JSON Rows","description":"","width":600,"height":400,"path":"/JsonRows/JsonRows.html","visible":false,"categories":["Utilities"]},{"title":"Movement","description":"","width":600,"height":400,"path":"/Movement/Movement.html","visible":false,"categories":["Utilities"]},{"title":"Live Dataset","description":"Loads a CSV document from the web and periodically updates","path":"/LiveDataSet/index.html","visible":false,"categories":["Utilities"]},{"title":"CODAP Onboarding","description":"This is the onboarding plugin for CODAP","path":"https://codap.concord.org/plugins/releases/latest/onboarding","width":600,"height":400,"visible":false,"categories":["Utilities"]},{"title":"Ecochamber Simulator","description":"Simulates an ecochamber. Plants and animals in a sealed system, and how they affect rates of photosynthesis and respiration. This is part of the InSPECT project.","path":"https://concord-consortium.github.io/ecochamber/?noise=true","visible":false,"categories":["Partners"]},{"title":"Elodea Simulator","description":"Simulates how many bubbles are produce by elodea plant depending on light color, light level, and CO2 level. This is part of the InSPECT project.","path":"https://concord-consortium.github.io/elodea-sim/index.html","visible":false,"categories":["Partners"]},{"title":"Sensor Interactive (InquirySpace 2 version)","description":"Collect data using Vernier sensors and send the data to CODAP for further analysis","width":600,"height":420,"path":"https://sensor-interactive.concord.org","visible":false,"categories":["Partners","Generators"]},{"title":"Ramp Simulation (InquirySpace 2 version)","description":"Win by landing the car on the target. This is part of the InquirySpace 2 project. To run the Game version of this interactive add \'?game\' to the ramp game url and reload the page.","width":600,"height":400,"path":"https://ramp-game.concord.org","visible":false,"categories":["Partners","Simulators"]},{"title":"Dataflow Onboarding","description":"This is the onboarding plugin for the DataFlow plugin. This is part of the InSPECT project. This must be used in conjunction with the Dataflow plugin","width":600,"height":400,"path":"https://concord-consortium.github.io/codap-data-interactives/DataflowGettingStarted/DataflowGettingStarted.html","visible":false,"categories":["Partners"]},{"title":"Dataflow","description":"The DataFlow plugin is part of the InSPECT project. It collects sensor data collected by the InSPECT Raspbery Pis.","width":600,"height":400,"path":"https://dataflow.staging.concord.org/ext/flow?features=1?use_codap=1","visible":false,"categories":["Partners"]},{"title":"2013 CA ACS Data Portal","description":"A Data Science Games plugin. It will get a random sample of Californians from the 2013 American Community Survey","width":600,"height":400,"path":"https://codap.concord.org/data-science-worlds/acs/acs.html?lang=en","visible":true,"categories":["Partners"]},{"title":"Data Sonofication","description":"The Data Sonofication plugin was created by Takahiko Tsuchiya","width":600,"height":400,"path":"https://ttsuchiya.github.io/codap/plugins/Sonification/SimpleSpectrum/index.html","visible":false,"categories":["Partners","Tools"]},{"title":"Draw Tool","description":"Annotate an image.","title-string":"DG.plugin.DrawTool.title","description-string":"DG.plugin.DrawTool.description","width":600,"height":400,"path":"/DrawTool/index.html","icon":"/DrawTool/icon-draw-tool.svg","visible":true,"isStandard":"true","categories":["Utilities","Tools"]},{"title":"Microdata Portal","description":"Investigate populations from the US census at the individual level.","title-string":"DG.plugin.MicrodataPortal.title","description-string":"DG.plugin.MicrodataPortal.description","path":"/sdlc/plugin/index.html","icon":"/sdlc/plugin/assets/images/icon-microdata-portal.svg","aegis":"SDLC","visible":true,"width":380,"height":520,"isStandard":"true","categories":["Partners","Portals"]},{"title":"acs","description":"ACS data portal: 20000 Californans in 2013","width":600,"height":400,"path":"/data-science-worlds/acs/acs.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"arbor","description":"Make decision trees by hand!","width":600,"height":400,"path":"/data-science-worlds/arbor/arbor.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"barty","description":"BART data for 2015 through 2018. Over 10 million data points.","width":600,"height":400,"path":"/data-science-worlds/barty/barty.html","visible":true,"aegis":"DSG","categories":["Partners","Portals"]},{"title":"fish","description":"A Commons game where you have to fish for a living","width":600,"height":400,"path":"/data-science-worlds/fish/fish.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"geiger","description":"Find the radioactive speck without taking a lethal dose","width":600,"height":400,"path":"/data-science-worlds/geiger/geiger.html","visible":true,"aegis":"DSG","categories":["Partners"]},{"title":"journal","description":"Nature-of-science helper: write tiny papers to share your data with others.","width":600,"height":400,"path":"/data-science-worlds/journal/journal.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"nhanes","description":"Data portal for 11,000-ish cases of 2003 data from NHANES","width":600,"height":400,"path":"/data-science-worlds/nhanes/nhanes.html","visible":true,"aegis":"DSG","categories":["Partners","Portals"]},{"title":"stebbins","description":"Simulation of natural selection","width":600,"height":400,"path":"/data-science-worlds/steb/steb.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"stella","description":"Simulation for stellar astronomy","width":600,"height":400,"path":"/data-science-worlds/stella/stella.html","visible":true,"aegis":"DSG","categories":["Partners","Simulators"]},{"title":"xeno","description":"Diagnose sick alien creatures. Works with arbor.","width":600,"height":400,"path":"/data-science-worlds/xeno/xeno.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"Table Sharing","description":"Allows students to share their data","width":400,"height":600,"path":"https://codap-shared-table-plugin.concord.org/branch/master/index.html","visible":"false","categories":["Partners"]},{"title":"NOAA Weather","description":"Investigate historical weather patterns","title-string":"DG.plugin.NOAA-weather.title","description-string":"DG.plugin.NOAA-weather.description","width":380,"height":490,"path":"/NOAA-weather/index.html","icon":"/NOAA-weather/assets/images/icon-noaa-weather.svg","visible":"true","isStandard":"true","categories":["Partners","Portals"]},{"title":"Moments Recorder","description":"This plugin tracks user actions in CODAP through notification. Each action represents the state of the document at completion of that action. User clicks on an item to bring the CODAP document back to that state","width":400,"height":600,"path":"https://codap.concord.org/~bfinzer/story_builder/index.html","visible":"false","categories":["Partners"]},{"title":"Choosy","description":"Organize and simplify datasets, especially those with many attributes.","title-string":"DG.plugin.Choosy.title","description-string":"DG.plugin.Choosy.description","width":400,"height":600,"icon":"/eepsmedia/plugins/Choosy/art/choosy.svg","path":"/eepsmedia/plugins/Choosy/index.html","visible":"false","isStandard":"true","categories":["Partners","Tools"]},{"title":"Transformers","description":"Transform datasets with a collection of powerful tools","title-string":"DG.plugin.Transformers.title","description-string":"DG.plugin.Transformers.description","width":350,"height":450,"icon":"/codap-transformers/transformers-icon-small.svg","path":"/codap-transformers/","visible":"false","isStandard":"true","categories":["Partners","Tools"]},{"title":"Story Builder","description":"Create a narrative of your investigation","title-string":"DG.plugin.StoryBuilder.pluginName","description-string":"DG.plugin.StoryBuilder.description","width":800,"height":130,"path":"/story-builder/","icon":"/story-builder/story-builder-icon.svg","visible":"false","isStandard":"true","categories":["Partners","Tools"]},{"title":"Sonify","description":"Listen to your data","width":325,"height":274,"path":"/Sonify/index.html","icon":"Sonify/src/assets/images/sonify.svg","visible":"true","isStandard":"true","categories":["Partners","Tools"]},{"title":"Day Length","description":"Computes the day length for a year for any place in the world","width":350,"height":450,"path":"/DayLength/build/","visible":"true","categories":["Generators","Tools"]},{"title":"Collect Measures","description":"With a data set containing randomly generated values, re-randomize and collect measures repeatedly.","width":350,"height":450,"path":"/CollectMeasures/build/","visible":"true","categories":["Generators","Tools"]},{"title":"Fatal Encounters","description":"Explore data from the Fatal Encounters website; a database created to document people in the United Stated who were killed during interactions with the police.","width":350,"height":450,"path":"/FatalEncounters/","visible":"true","categories":["Portals"]}]}')},,,,,,,,function(e,t,a){e.exports=a.p+"static/media/codap.c02541ff.ico"},function(e,t,a){e.exports=a(42)},,,,,function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},,,,,,,,,,,,,,function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){"use strict";a.r(t);var i=a(0),r=a.n(i),s=a(12),n=a.n(s),o=(a(21),a(1)),l=a(2),c=a(5),h=a(4),d=a(3),p=a(7);a(22);var g=function(e){var t=e.categories,a=function(e){var t=[];return e.forEach((function(e){e.visible&&"false"!==e.visible&&e.categories.forEach((function(e){t.includes(e)||t.push(e)}))})),t}(e.plugins),i=t.map((function(e){return e.category})).filter((function(e){return a.includes(e)}));return r.a.createElement(r.a.Fragment,null,i&&r.a.createElement("div",{className:"navigationTabs"},i.map((function(a,i){var s=t.filter((function(e){return e.category===a}))[0];return r.a.createElement("div",{key:"".concat(i),className:"tab theme".concat(i%4+1," ").concat(e.categorySelected===a?"selected":""),onClick:function(){return e.handleCategorySelect(a)},title:s?s.tooltip:""},a)}))))},u=(a(23),function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(e){var i;return Object(o.a)(this,a),(i=t.call(this,e)).handleChange=i.props.handleBranchSelect.bind(Object(c.a)(i)),i}return Object(l.a)(a,[{key:"render",value:function(){return r.a.createElement("form",{onSubmit:this.handleSubmit},r.a.createElement("label",{className:"dropdownLabel"},"Select branch:"),r.a.createElement("select",{className:"dropdownSelect",value:this.props.branchSelected,onChange:this.handleChange},r.a.createElement("option",{value:"latest"},"latest"),r.a.createElement("option",{value:"staging"},"staging"),r.a.createElement("option",{value:"stable"},"stable"),r.a.createElement("option",{value:"branch"},"branch")))}}]),a}(r.a.Component)),m=(a(24),function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){var e;return Object(o.a)(this,a),(e=t.call(this)).state={value:""},e}return Object(l.a)(a,[{key:"handleClear",value:function(){this.props.onSearch("")}},{key:"handleChange",value:function(e){var t=e.target.value;this.props.onSearch(t)}},{key:"render",value:function(){var e=this,t=this.props.searchString;return r.a.createElement("div",{className:"search-panel"},r.a.createElement("input",{type:"text",placeholder:"search for...",onChange:function(t){return e.handleChange(t)},value:t}),r.a.createElement("button",{className:"search-panel-clear",onClick:function(t){return e.handleClear(t)}},"\u24e7"))}}]),a}(r.a.Component)),b=(a(25),function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){return Object(o.a)(this,a),t.apply(this,arguments)}return Object(l.a)(a,[{key:"render",value:function(){return r.a.createElement("div",{className:"header"},this.renderHeaderTitle(),r.a.createElement(g,{plugins:this.props.plugins,categories:this.props.categories,categorySelected:this.props.categorySelected,handleCategorySelect:this.props.onCategorySelect}))}},{key:"renderHeaderTitle",value:function(){return r.a.createElement("div",{className:"headerTitle"},r.a.createElement("div",{className:"headerLeft"},r.a.createElement("a",{href:"https://codap.concord.org/",title:"CODAP Project",target:"_blank",rel:"noopener noreferrer"},r.a.createElement("img",{src:"https://codap.concord.org/wp-content/themes/cc/img/codap-logo.png",className:"codap-logo",alt:"Common Online Data Analysis Program"}))),r.a.createElement("div",{className:"headerCenter"},r.a.createElement("span",{className:"title"},"CODAP Data Interactive Plugins")),r.a.createElement("div",{className:"headerRight"},r.a.createElement(m,{onSearch:this.props.onSearch,searchString:this.props.searchString}),r.a.createElement(u,{branchSelected:this.props.branchSelected,handleBranchSelect:this.props.onBranchSelect})))}}]),a}(r.a.Component)),f=a(13),v=a.n(f),w=a(14),S=a(15),y=a.n(S);a(39);function P(){return(window.location.origin+window.location.pathname).replace(/index.html$/,"").replace(/\/build\//,"")}var C=function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){return Object(o.a)(this,a),t.apply(this,arguments)}return Object(l.a)(a,[{key:"copyToClipboard",value:function(){navigator.clipboard.writeText(this.cleanPath())}},{key:"render",value:function(){var e=this;return r.a.createElement("div",{className:"card"},this.renderPluginTitleAndDescription(),r.a.createElement("div",{className:"embeddableLink",onClick:function(){return e.copyToClipboard()}},"copy link to clipboard",r.a.createElement("span",{role:"img","aria-label":"Image of a clipboard"},"\ud83d\udccb")))}},{key:"renderPluginTitleAndDescription",value:function(){var e=this.props,t=e.plugin,a=e.url,i="";return i=t.path.match(/^http/i)?t.path:P()+t.path,a.match(/^https/i)&&!i.match(/^https/i)&&(i=i.replace(/http/i,"https")),i.match(/^https/i)&&!a.match(/^https/i)&&(a=a.replace(/http/i,"https")),r.a.createElement("div",null,r.a.createElement("div",{title:"Open in CODAP"},r.a.createElement("a",{href:"".concat(a,"?di=").concat(i),className:"pluginTitle",target:"_blank",rel:"noopener noreferrer"},r.a.createElement("img",{src:y.a,alt:"CODAP Logo"}),"\xa0",t.title)),r.a.createElement("p",{className:"pluginDescription"},this.renderHTML(t.description)))}},{key:"renderHTML",value:function(e){return Object(w.a)(v.a.sanitize(e||""))}},{key:"cleanPath",value:function(){var e=this.props.plugin,t="",a="https://codap.concord.org/app/";return t=e.path.match(/^http/i)?e.path:P()+e.path,a.match(/^https/i)&&!t.match(/^https/i)&&(t=t.replace(/http/i,"https")),t.match(/^https/i)&&!a.match(/^https/i)&&(a=a.replace(/http/i,"https")),t}}]),a}(r.a.PureComponent),D=(a(40),function(e){var t=e.plugins,a=e.categorySelected,i=e.url,s=e.tabIndex,n="card-list-wrapper theme".concat(s%4+1),o=t.filter((function(e){return e.visible&&"false"!==e.visible&&e.categories.find((function(e){return e.replace(/\..*/,"")===a}))})).sort((function(e,t){var a=e.title.toLowerCase(),i=t.title.toLowerCase();return ai?1:0}));return r.a.createElement("div",{className:n},r.a.createElement("div",{className:"card-list"},o.map((function(e,t){return r.a.createElement(C,{key:t,plugin:e,url:i})}))))}),k=(a(41),function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){return Object(o.a)(this,a),t.apply(this,arguments)}return Object(l.a)(a,[{key:"render",value:function(){return r.a.createElement("div",{className:"footer"},r.a.createElement("div",{className:"footerLeft"},this.renderInfoLinks()),r.a.createElement("div",{className:"footerRight"},this.renderCCLogo()))}},{key:"renderCCLogo",value:function(){return r.a.createElement("div",{id:"cc"},"a product of",r.a.createElement("div",{className:"cc-logo"},r.a.createElement("a",{href:"https://concord.org/",title:"The Concord Consortium - Revolutionary digital learning for science, math, and engineering"},r.a.createElement("img",{src:"https://codap.concord.org/_assets/img/cc-logo.png",alt:"The Concord Consortium"}))))}},{key:"renderInfoLinks",value:function(){return r.a.createElement(r.a.Fragment,null,r.a.createElement("p",null,"CODAP plugin repository: ",r.a.createElement("a",{target:"blank",href:"https://github.com/concord-consortium/codap-data-interactives"}," github.com/concord-consortium/codap-data-interactives")),r.a.createElement("p",null,"CODAP project repository: ",r.a.createElement("a",{target:"blank",href:"https://github.com/concord-consortium/codap"}," github.com/concord-consortium/codap")),r.a.createElement("p",null,"To find out more about the CODAP project: ",r.a.createElement("a",{target:"blank",href:"https://concord.org/projects/codap"}," About CODAP")),r.a.createElement("p",null,"\xa9 Copyright 2021 ",r.a.createElement("a",{href:"https://concord.org/",title:"The Concord Consortium - Revolutionary digital learning for science, amth, and engineering"},"The Concord Consortium"),". All rights reserved."))}}]),a}(r.a.Component));var O=function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){var e;return Object(o.a)(this,a),(e=t.call(this)).handleCategorySelect=e.handleCategorySelect.bind(Object(c.a)(e)),e.handleBranchSelect=e.handleBranchSelect.bind(Object(c.a)(e)),e.handleSearch=e.handleSearch.bind(Object(c.a)(e)),e.state={dataInteractives:p.data_interactives,categories:p.categories,categorySelected:"Partners",branchSelected:window.location.search.substr(1).includes("dev")?"staging":"latest",searchString:""},e}return Object(l.a)(a,[{key:"render",value:function(){var e,t=this.state.dataInteractives,a=this.state.categories,i=this.state.categorySelected,s=this.state.branchSelected,n=this.state.searchString;switch(s){case"latest":e="/releases/latest/";break;case"staging":e="/releases/staging/";break;case"stable":e="/app/";break;case"branch":e="/~jsandoe/build/"}var o="https://codap.concord.org"+e,l=a.findIndex((function(e){return e.category===i}));return r.a.createElement("div",{className:"App"},r.a.createElement(b,{plugins:t,categories:a,categorySelected:i,branchSelected:s,onCategorySelect:this.handleCategorySelect,onBranchSelect:this.handleBranchSelect,onSearch:this.handleSearch,searchString:n}),r.a.createElement(D,{plugins:t,categorySelected:i,url:o,tabIndex:l}),r.a.createElement(k,null))}},{key:"handleCategorySelect",value:function(e){this.setState({categorySelected:e})}},{key:"handleBranchSelect",value:function(e){this.setState({branchSelected:e.target.value})}},{key:"handleSearch",value:function(e){var t=!1;this.setState({searchString:e}),this.state.dataInteractives.forEach((function(e){var t=e.categories.indexOf("Search");t>=0&&e.categories.splice(t,1)})),e.length>=3&&this.state.dataInteractives.forEach((function(a){(function(e,t){return t=t.toLowerCase(),e.description&&e.description.toLowerCase().includes(t)||e.title&&e.title.toLowerCase().includes(t)||e.aegis&&e.aegis.toLowerCase().includes(t)})(a,e)&&(a.categories.push("Search"),t=!0)})),t&&"Search"!==this.state.categorySelected?(this.priorSelected=this.state.categorySelected,this.setState({categorySelected:"Search"})):t||"Search"!==this.state.categorySelected||(this.setState({categorySelected:this.priorSelected}),this.priorSelected=null)}}]),a}(r.a.PureComponent);Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));n.a.render(r.a.createElement(r.a.StrictMode,null,r.a.createElement(O,null)),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()})).catch((function(e){console.error(e.message)}))}],[[16,1,2]]]); -//# sourceMappingURL=main.703e18fb.chunk.js.map \ No newline at end of file +(this["webpackJsonpcodap-data-interactives"]=this["webpackJsonpcodap-data-interactives"]||[]).push([[0],[,,,,,,,function(e){e.exports=JSON.parse('{"projects":[{"name":"Ocean Tracks","url":"https://oceantracks.org/"},{"name":"ESTEEM","url":"https://hirise.fi.ncsu.edu/projects/esteem/"}],"categories":[{"category":"Partners","tooltip":"Plugins developed by and with other groups."},{"category":"Portals","tooltip":"Plugins that fetch data from external sources."},{"category":"Simulators","tooltip":"Plugins that create data with interactive simulations of phenomena."},{"category":"Generators","tooltip":"Plugins that generate data from abstract statistical models."},{"category":"Tools","tooltip":"Useful plugins that work with datasets in CODAP."},{"category":"Dev","tooltip":"Useful plugins for plugin developers."},{"category":"Search","tooltip":"Search results"}],"data_interactives":[{"title":"Ocean Tracks Selector","description":"Compare the tracks of Pacific Ocean animals tagged by the Ocean Tracks project. Note that this plugin will not load in SSL.","width":550,"height":500,"path":"https://oceantracks.org/map/trackmenu_1.html","visible":"true","aegis":"Ocean Tracks","categories":["Partners","Portals"]},{"title":"Sampler","description":"Create random datasets from scratch or existing datasets.","title-string":"DG.plugin.Sampler.title","description-string":"DG.plugin.Sampler.description","width":232,"height":400,"path":"/TP-Sampler/index.html","icon":"/TP-Sampler/icon-sampler.svg","visible":"true","aegis":"ESTEEM","isStandard":"true","categories":["Partners","Generators"]},{"title":"Scrambler","description":"Test hypotheses by randomly varying an attribute.","title-string":"DG.plugin.Scrambler.name","description-string":"DG.plugin.Scrambler.description","width":400,"height":600,"path":"/eepsmedia/plugins/scrambler/index.html","icon":"/eepsmedia/plugins/scrambler/images/whisk_on_side.svg","visible":"true","isStandard":"true","categories":["Tools"]},{"title":"SRRI Ship Odyssey Data Game","description":"Send rats on a dive to find sunken treasure with this SRRI game.","width":290,"height":304,"path":"/ShipOdyssey/index.html","visible":false,"aegis":"SRRI","categories":["Partners"]},{"title":"SRRI Chainsaw Data Game","description":"Fire up a chainsaw and see how many logs you can cut to the right length. SRRI game.","width":290,"height":304,"path":"/Chainsaw/index.html","visible":false,"aegis":"SRRI","categories":["Partners"]},{"title":"SRRI Inference Data Game","description":"Another SRRI game. See if you can beat a conservative statistician at his own game -- making good guesses from samples.","width":290,"height":304,"path":"/Inference/index.html","visible":false,"aegis":"SRRI","categories":["Partners"]},{"title":"Cart Weight","description":"Win by predicting the total weight of a cart stacked with bricks.","width":290,"height":305,"path":"/CartWeight/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Ramp Game (Netlogo version)","description":"Win by landing on the target.","width":500,"height":734,"path":"/RampGame/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Floyd\'s of Fargo","description":"Make big money running your own car insurance business!","width":570,"height":480,"path":"/FloydsFargo/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Lunar Lander","description":"You and your friends land spacecrafts, then rate your landings.","width":357,"height":541,"path":"/LunarLander/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Markov","description":"Play Rock, Paper, Scissors with the evil Dr. Markov to save the dog.","width":550,"height":315,"path":"/Markov/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Proximity","description":"Get high scores by shooting a ball to land as close to a target as possible.","width":463,"height":344,"path":"/Proximity/index.html","visible":true,"aegis":"Data Games","categories":["Partners"]},{"title":"Shuffleboard","description":"Live on the edge-Land a disk on each pad without sliding off to score big!","width":520,"height":350,"path":"/Shuffleboard/index.html","visible":false,"aegis":"Data Games","categories":["Partners"]},{"title":"Guess My Number","description":"As the title says.","width":400,"height":250,"path":"/GuessMyNumber/GuessMyNumber.html","visible":false,"aegis":"CODAP","categories":["Misc"]},{"title":"Random Number Generator","description":"An extremely simple plugin. It generates random numbers between 1 and 100.","width":300,"height":150,"path":"/NewRandomNumbers/index.html","visible":true,"aegis":"CODAP","categories":["Utilities"]},{"title":"Fast Plants Simulator","description":"Simulate growth of fast plants.","width":400,"height":250,"path":"/FastPlants/FastPlants.html","visible":true,"aegis":"CODAP","categories":["Utilities","Simulators"]},{"title":"Performance Harness","description":"A way to generate data while testing the performance of CODAP.","width":400,"height":250,"path":"/PerformanceHarness/PerformanceHarness.html","visible":true,"aegis":"CODAP","categories":["Utilities","Dev"]},{"title":"Normal Distribution Sampler","description":"A way to generate a sample data set from a normal distribution.","width":400,"height":300,"path":"/Sampler/Sampler.html","visible":true,"aegis":"CODAP","categories":["Utilities","Generators"]},{"title":"TerraPop Plugin","description":"Plugin for importing TerraPop data sets.","width":550,"height":500,"path":"/TerraPopInteractive/TPI.html","visible":true,"aegis":"Terra-Pop","categories":["Partners","Portals"]},{"title":"GeoJSON Importer","description":"Plugin for importing GeoJSON","width":450,"height":200,"path":"/GeoJSONImporter/GeoJSONImporter.html","visible":false,"aegis":"CODAP","categories":["Utilities"]},{"title":"Wolf-Sheep Predation","description":"Netlogo model that explores the stability of predator-prey ecosystems.","width":550,"height":500,"path":"/WolfSheep/index.html","visible":true,"aegis":"CODAP","categories":["Partners","Simulators"]},{"title":"Ants","description":"Netlogo model of an ant colony seeking nearby food.","width":550,"height":500,"path":"/Ants/ants.html","visible":true,"aegis":"CODAP","categories":["Partners","Simulators"]},{"title":"Virus Growth","description":"Netlogo model that explores the effect of infectiousness, chance of recovery, and duration of the cycle on infection in a population.","width":780,"height":620,"path":"/Virus/Virus.html","visible":true,"aegis":"CODAP","categories":["Partners","Simulators"]},{"title":"Sage","description":"A Building Models systems modeler.","width":780,"height":620,"path":"https://codap.concord.org/sage/sage.html","visible":true,"aegis":"Building Models","categories":["Partners","Simulators"]},{"title":"Data Card","description":"Data Card permits the user to browse and modify a data set one case at a time.","width":780,"height":620,"path":"/DataCard/DataCard.html","visible":false,"categories":["Utilities"]},{"title":"Track Generator","description":"Simulate OceanTracks data with a simple random walk.","width":400,"height":300,"path":"/Movement/Movement.html","visible":true,"categories":["Utilities","Generators"]},{"title":"Pivotal Tracker Importer","description":"Import stories and activities from any project in Pivotal Tracker.","width":400,"height":250,"path":"/PivotalImporter/PTImporter.html","visible":false,"categories":["Utilities"]},{"title":"Spring Mass Model","description":"Physics model that simulate a mass suspended on a spring created by the InquirySpace project.","width":600,"height":400,"path":"https://lab.concord.org/embeddable.html?codap=true%23interactives/inquiry-space/2-spring.json","visible":true,"categories":["Partners","Simulators"]},{"title":"DropHTMLTable","description":"A basic screen scraper. Drop the contents of an HTML page. The plugin will find the tables to transfer to CODAP.","width":600,"height":400,"path":"/ScreenScraper/index.html","visible":true,"categories":["Utilities"]},{"title":"Questionnaire","description":"Allows the creation of a document with a questionnaire through which data can be added to CODAP.","width":400,"height":600,"path":"/questionnaire/index.html","visible":true,"categories":["Utilities"]},{"title":"Collaboration Service","description":"Allows multiple users to add data to specified data contexts.","width":300,"height":200,"path":"/CollaborationService/CollaborationService.html","visible":true,"categories":["Utilities","Tools"]},{"title":"Attribute Stacker","description":"Allows user to tidy the data set","width":600,"height":400,"path":"/AttributeStacker/index.html","visible":false,"categories":["Utilities"]},{"title":"Charts","description":"Allows user to create common charts for attributes on the data contexts","width":600,"height":400,"path":"/Charts/index.html","visible":true,"categories":["Utilities","Tools"]},{"title":"CaseGenerator","description":"","width":600,"height":400,"path":"/CaseGenerator/CaseGenerator.html","visible":false,"categories":["Utilities"]},{"title":"Plugin API Tester","description":"Exercise the CODAP Plugin API and see the results","width":600,"height":400,"path":"/DataInteractiveAPITester/index.html","visible":true,"categories":["Utilities","Dev"]},{"title":"GeoJSON Importer","description":"","width":600,"height":400,"path":"/GeoJSONImporter/GeoJSONImporter.html","visible":false,"categories":["Utilities"]},{"title":"GoogleSheets","description":"","width":600,"height":400,"path":"/GoogleSheets/example.html","visible":false,"categories":["Utilities"]},{"title":"Image Library","description":"","width":600,"height":400,"path":"/ImageLibrary/index.html","visible":false,"categories":["Utilities"]},{"title":"JSON Rows","description":"","width":600,"height":400,"path":"/JsonRows/JsonRows.html","visible":false,"categories":["Utilities"]},{"title":"Movement","description":"","width":600,"height":400,"path":"/Movement/Movement.html","visible":false,"categories":["Utilities"]},{"title":"Live Dataset","description":"Loads a CSV document from the web and periodically updates","path":"/LiveDataSet/index.html","visible":false,"categories":["Utilities"]},{"title":"CODAP Onboarding","description":"This is the onboarding plugin for CODAP","path":"https://codap.concord.org/plugins/releases/latest/onboarding","width":600,"height":400,"visible":false,"categories":["Utilities"]},{"title":"Ecochamber Simulator","description":"Simulates an ecochamber. Plants and animals in a sealed system, and how they affect rates of photosynthesis and respiration. This is part of the InSPECT project.","path":"https://concord-consortium.github.io/ecochamber/?noise=true","visible":false,"categories":["Partners"]},{"title":"Elodea Simulator","description":"Simulates how many bubbles are produce by elodea plant depending on light color, light level, and CO2 level. This is part of the InSPECT project.","path":"https://concord-consortium.github.io/elodea-sim/index.html","visible":false,"categories":["Partners"]},{"title":"Sensor Interactive (InquirySpace 2 version)","description":"Collect data using Vernier sensors and send the data to CODAP for further analysis","width":600,"height":420,"path":"https://sensor-interactive.concord.org","visible":false,"categories":["Partners","Generators"]},{"title":"Ramp Simulation (InquirySpace 2 version)","description":"Win by landing the car on the target. This is part of the InquirySpace 2 project. To run the Game version of this interactive add \'?game\' to the ramp game url and reload the page.","width":600,"height":400,"path":"https://ramp-game.concord.org","visible":false,"categories":["Partners","Simulators"]},{"title":"Dataflow Onboarding","description":"This is the onboarding plugin for the DataFlow plugin. This is part of the InSPECT project. This must be used in conjunction with the Dataflow plugin","width":600,"height":400,"path":"https://concord-consortium.github.io/codap-data-interactives/DataflowGettingStarted/DataflowGettingStarted.html","visible":false,"categories":["Partners"]},{"title":"Dataflow","description":"The DataFlow plugin is part of the InSPECT project. It collects sensor data collected by the InSPECT Raspbery Pis.","width":600,"height":400,"path":"https://dataflow.staging.concord.org/ext/flow?features=1?use_codap=1","visible":false,"categories":["Partners"]},{"title":"2013 CA ACS Data Portal","description":"A Data Science Games plugin. It will get a random sample of Californians from the 2013 American Community Survey","width":600,"height":400,"path":"https://codap.concord.org/data-science-worlds/acs/acs.html?lang=en","visible":true,"categories":["Partners"]},{"title":"Data Sonofication","description":"The Data Sonofication plugin was created by Takahiko Tsuchiya","width":600,"height":400,"path":"https://ttsuchiya.github.io/codap/plugins/Sonification/SimpleSpectrum/index.html","visible":false,"categories":["Partners","Tools"]},{"title":"Draw Tool","description":"Annotate an image.","title-string":"DG.plugin.DrawTool.title","description-string":"DG.plugin.DrawTool.description","width":600,"height":400,"path":"/DrawTool/index.html","icon":"/DrawTool/icon-draw-tool.svg","visible":true,"isStandard":"true","categories":["Utilities","Tools"]},{"title":"Microdata Portal","description":"Investigate populations from the US census at the individual level.","title-string":"DG.plugin.MicrodataPortal.title","description-string":"DG.plugin.MicrodataPortal.description","path":"/sdlc/plugin/index.html","icon":"/sdlc/plugin/assets/images/icon-microdata-portal.svg","aegis":"SDLC","visible":true,"width":380,"height":520,"isStandard":"true","categories":["Partners","Portals"]},{"title":"acs","description":"ACS data portal: 20000 Californans in 2013","width":600,"height":400,"path":"/data-science-worlds/acs/acs.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"arbor","description":"Make decision trees by hand!","width":600,"height":400,"path":"/data-science-worlds/arbor/arbor.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"barty","description":"BART data for 2015 through 2018. Over 10 million data points.","width":600,"height":400,"path":"/data-science-worlds/barty/barty.html","visible":true,"aegis":"DSG","categories":["Partners","Portals"]},{"title":"fish","description":"A Commons game where you have to fish for a living","width":600,"height":400,"path":"/data-science-worlds/fish/fish.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"geiger","description":"Find the radioactive speck without taking a lethal dose","width":600,"height":400,"path":"/data-science-worlds/geiger/geiger.html","visible":true,"aegis":"DSG","categories":["Partners"]},{"title":"journal","description":"Nature-of-science helper: write tiny papers to share your data with others.","width":600,"height":400,"path":"/data-science-worlds/journal/journal.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"nhanes","description":"Data portal for 11,000-ish cases of 2003 data from NHANES","width":600,"height":400,"path":"/data-science-worlds/nhanes/nhanes.html","visible":true,"aegis":"DSG","categories":["Partners","Portals"]},{"title":"stebbins","description":"Simulation of natural selection","width":600,"height":400,"path":"/data-science-worlds/steb/steb.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"stella","description":"Simulation for stellar astronomy","width":600,"height":400,"path":"/data-science-worlds/stella/stella.html","visible":true,"aegis":"DSG","categories":["Partners","Simulators"]},{"title":"xeno","description":"Diagnose sick alien creatures. Works with arbor.","width":600,"height":400,"path":"/data-science-worlds/xeno/xeno.html","visible":false,"aegis":"DSG","categories":["Partners"]},{"title":"Table Sharing","description":"Allows students to share their data","width":400,"height":600,"path":"https://codap-shared-table-plugin.concord.org/branch/master/index.html","visible":"false","categories":["Partners"]},{"title":"NOAA Weather","description":"Investigate historical weather patterns","title-string":"DG.plugin.NOAA-weather.title","description-string":"DG.plugin.NOAA-weather.description","width":380,"height":490,"path":"/NOAA-weather/index.html","icon":"/NOAA-weather/assets/images/icon-noaa-weather.svg","visible":"true","isStandard":"true","categories":["Partners","Portals"]},{"title":"Moments Recorder","description":"This plugin tracks user actions in CODAP through notification. Each action represents the state of the document at completion of that action. User clicks on an item to bring the CODAP document back to that state","width":400,"height":600,"path":"https://codap.concord.org/~bfinzer/story_builder/index.html","visible":"false","categories":["Partners"]},{"title":"Choosy","description":"Organize and simplify datasets, especially those with many attributes.","title-string":"DG.plugin.Choosy.title","description-string":"DG.plugin.Choosy.description","width":400,"height":600,"icon":"/eepsmedia/plugins/Choosy/art/choosy.svg","path":"/eepsmedia/plugins/Choosy/index.html","visible":"false","isStandard":"true","categories":["Partners","Tools"]},{"title":"Transformers","description":"Transform datasets with a collection of powerful tools","title-string":"DG.plugin.Transformers.title","description-string":"DG.plugin.Transformers.description","width":350,"height":450,"icon":"/codap-transformers/transformers-icon-small.svg","path":"/codap-transformers/","visible":"false","isStandard":"true","categories":["Partners","Tools"]},{"title":"Sonify","description":"Listen to your data","width":325,"height":274,"path":"/Sonify/index.html","icon":"/Sonify/src/assets/sonify.svg","visible":"true","isStandard":"true","categories":["Partners","Tools"]},{"title":"Story Builder","description":"Create a narrative of your investigation","title-string":"DG.plugin.StoryBuilder.pluginName","description-string":"DG.plugin.StoryBuilder.description","width":800,"height":130,"path":"/story-builder/","icon":"/story-builder/story-builder-icon.svg","visible":"false","isStandard":"true","categories":["Partners","Tools"]},{"title":"Day Length","description":"Computes the day length for a year for any place in the world","width":350,"height":450,"path":"/DayLength/build/","visible":"true","categories":["Generators","Tools"]},{"title":"Collect Measures","description":"With a data set containing randomly generated values, re-randomize and collect measures repeatedly.","width":350,"height":450,"path":"/CollectMeasures/build/","visible":"true","categories":["Generators","Tools"]},{"title":"Fatal Encounters","description":"Explore data from the Fatal Encounters website; a database created to document people in the United Stated who were killed during interactions with the police.","width":350,"height":450,"path":"/FatalEncounters/","visible":"true","categories":["Portals"]}]}')},,,,,,,,function(e,t,a){e.exports=a.p+"static/media/codap.c02541ff.ico"},function(e,t,a){e.exports=a(42)},,,,,function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){},,,,,,,,,,,,,,function(e,t,a){},function(e,t,a){},function(e,t,a){},function(e,t,a){"use strict";a.r(t);var i=a(0),r=a.n(i),s=a(12),n=a.n(s),o=(a(21),a(1)),l=a(2),c=a(5),h=a(4),d=a(3),p=a(7);a(22);var g=function(e){var t=e.categories,a=function(e){var t=[];return e.forEach((function(e){e.visible&&"false"!==e.visible&&e.categories.forEach((function(e){t.includes(e)||t.push(e)}))})),t}(e.plugins),i=t.map((function(e){return e.category})).filter((function(e){return a.includes(e)}));return r.a.createElement(r.a.Fragment,null,i&&r.a.createElement("div",{className:"navigationTabs"},i.map((function(a,i){var s=t.filter((function(e){return e.category===a}))[0];return r.a.createElement("div",{key:"".concat(i),className:"tab theme".concat(i%4+1," ").concat(e.categorySelected===a?"selected":""),onClick:function(){return e.handleCategorySelect(a)},title:s?s.tooltip:""},a)}))))},u=(a(23),function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(e){var i;return Object(o.a)(this,a),(i=t.call(this,e)).handleChange=i.props.handleBranchSelect.bind(Object(c.a)(i)),i}return Object(l.a)(a,[{key:"render",value:function(){return r.a.createElement("form",{onSubmit:this.handleSubmit},r.a.createElement("label",{className:"dropdownLabel"},"Select branch:"),r.a.createElement("select",{className:"dropdownSelect",value:this.props.branchSelected,onChange:this.handleChange},r.a.createElement("option",{value:"latest"},"latest"),r.a.createElement("option",{value:"staging"},"staging"),r.a.createElement("option",{value:"stable"},"stable"),r.a.createElement("option",{value:"branch"},"branch")))}}]),a}(r.a.Component)),m=(a(24),function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){var e;return Object(o.a)(this,a),(e=t.call(this)).state={value:""},e}return Object(l.a)(a,[{key:"handleClear",value:function(){this.props.onSearch("")}},{key:"handleChange",value:function(e){var t=e.target.value;this.props.onSearch(t)}},{key:"render",value:function(){var e=this,t=this.props.searchString;return r.a.createElement("div",{className:"search-panel"},r.a.createElement("input",{type:"text",placeholder:"search for...",onChange:function(t){return e.handleChange(t)},value:t}),r.a.createElement("button",{className:"search-panel-clear",onClick:function(t){return e.handleClear(t)}},"\u24e7"))}}]),a}(r.a.Component)),b=(a(25),function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){return Object(o.a)(this,a),t.apply(this,arguments)}return Object(l.a)(a,[{key:"render",value:function(){return r.a.createElement("div",{className:"header"},this.renderHeaderTitle(),r.a.createElement(g,{plugins:this.props.plugins,categories:this.props.categories,categorySelected:this.props.categorySelected,handleCategorySelect:this.props.onCategorySelect}))}},{key:"renderHeaderTitle",value:function(){return r.a.createElement("div",{className:"headerTitle"},r.a.createElement("div",{className:"headerLeft"},r.a.createElement("a",{href:"https://codap.concord.org/",title:"CODAP Project",target:"_blank",rel:"noopener noreferrer"},r.a.createElement("img",{src:"https://codap.concord.org/wp-content/themes/cc/img/codap-logo.png",className:"codap-logo",alt:"Common Online Data Analysis Program"}))),r.a.createElement("div",{className:"headerCenter"},r.a.createElement("span",{className:"title"},"CODAP Data Interactive Plugins")),r.a.createElement("div",{className:"headerRight"},r.a.createElement(m,{onSearch:this.props.onSearch,searchString:this.props.searchString}),r.a.createElement(u,{branchSelected:this.props.branchSelected,handleBranchSelect:this.props.onBranchSelect})))}}]),a}(r.a.Component)),f=a(13),v=a.n(f),w=a(14),S=a(15),y=a.n(S);a(39);function P(){return(window.location.origin+window.location.pathname).replace(/index.html$/,"").replace(/\/build\//,"")}var C=function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){return Object(o.a)(this,a),t.apply(this,arguments)}return Object(l.a)(a,[{key:"copyToClipboard",value:function(){navigator.clipboard.writeText(this.cleanPath())}},{key:"render",value:function(){var e=this;return r.a.createElement("div",{className:"card"},this.renderPluginTitleAndDescription(),r.a.createElement("div",{className:"embeddableLink",onClick:function(){return e.copyToClipboard()}},"copy link to clipboard",r.a.createElement("span",{role:"img","aria-label":"Image of a clipboard"},"\ud83d\udccb")))}},{key:"renderPluginTitleAndDescription",value:function(){var e=this.props,t=e.plugin,a=e.url,i="";return i=t.path.match(/^http/i)?t.path:P()+t.path,a.match(/^https/i)&&!i.match(/^https/i)&&(i=i.replace(/http/i,"https")),i.match(/^https/i)&&!a.match(/^https/i)&&(a=a.replace(/http/i,"https")),r.a.createElement("div",null,r.a.createElement("div",{title:"Open in CODAP"},r.a.createElement("a",{href:"".concat(a,"?di=").concat(i),className:"pluginTitle",target:"_blank",rel:"noopener noreferrer"},r.a.createElement("img",{src:y.a,alt:"CODAP Logo"}),"\xa0",t.title)),r.a.createElement("p",{className:"pluginDescription"},this.renderHTML(t.description)))}},{key:"renderHTML",value:function(e){return Object(w.a)(v.a.sanitize(e||""))}},{key:"cleanPath",value:function(){var e=this.props.plugin,t="",a="https://codap.concord.org/app/";return t=e.path.match(/^http/i)?e.path:P()+e.path,a.match(/^https/i)&&!t.match(/^https/i)&&(t=t.replace(/http/i,"https")),t.match(/^https/i)&&!a.match(/^https/i)&&(a=a.replace(/http/i,"https")),t}}]),a}(r.a.PureComponent),D=(a(40),function(e){var t=e.plugins,a=e.categorySelected,i=e.url,s=e.tabIndex,n="card-list-wrapper theme".concat(s%4+1),o=t.filter((function(e){return e.visible&&"false"!==e.visible&&e.categories.find((function(e){return e.replace(/\..*/,"")===a}))})).sort((function(e,t){var a=e.title.toLowerCase(),i=t.title.toLowerCase();return ai?1:0}));return r.a.createElement("div",{className:n},r.a.createElement("div",{className:"card-list"},o.map((function(e,t){return r.a.createElement(C,{key:t,plugin:e,url:i})}))))}),k=(a(41),function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){return Object(o.a)(this,a),t.apply(this,arguments)}return Object(l.a)(a,[{key:"render",value:function(){return r.a.createElement("div",{className:"footer"},r.a.createElement("div",{className:"footerLeft"},this.renderInfoLinks()),r.a.createElement("div",{className:"footerRight"},this.renderCCLogo()))}},{key:"renderCCLogo",value:function(){return r.a.createElement("div",{id:"cc"},"a product of",r.a.createElement("div",{className:"cc-logo"},r.a.createElement("a",{href:"https://concord.org/",title:"The Concord Consortium - Revolutionary digital learning for science, math, and engineering"},r.a.createElement("img",{src:"https://codap.concord.org/_assets/img/cc-logo.png",alt:"The Concord Consortium"}))))}},{key:"renderInfoLinks",value:function(){return r.a.createElement(r.a.Fragment,null,r.a.createElement("p",null,"CODAP plugin repository: ",r.a.createElement("a",{target:"blank",href:"https://github.com/concord-consortium/codap-data-interactives"}," github.com/concord-consortium/codap-data-interactives")),r.a.createElement("p",null,"CODAP project repository: ",r.a.createElement("a",{target:"blank",href:"https://github.com/concord-consortium/codap"}," github.com/concord-consortium/codap")),r.a.createElement("p",null,"To find out more about the CODAP project: ",r.a.createElement("a",{target:"blank",href:"https://concord.org/projects/codap"}," About CODAP")),r.a.createElement("p",null,"\xa9 Copyright 2021 ",r.a.createElement("a",{href:"https://concord.org/",title:"The Concord Consortium - Revolutionary digital learning for science, amth, and engineering"},"The Concord Consortium"),". All rights reserved."))}}]),a}(r.a.Component));var O=function(e){Object(h.a)(a,e);var t=Object(d.a)(a);function a(){var e;return Object(o.a)(this,a),(e=t.call(this)).handleCategorySelect=e.handleCategorySelect.bind(Object(c.a)(e)),e.handleBranchSelect=e.handleBranchSelect.bind(Object(c.a)(e)),e.handleSearch=e.handleSearch.bind(Object(c.a)(e)),e.state={dataInteractives:p.data_interactives,categories:p.categories,categorySelected:"Partners",branchSelected:window.location.search.substr(1).includes("dev")?"staging":"latest",searchString:""},e}return Object(l.a)(a,[{key:"render",value:function(){var e,t=this.state.dataInteractives,a=this.state.categories,i=this.state.categorySelected,s=this.state.branchSelected,n=this.state.searchString;switch(s){case"latest":e="/releases/latest/";break;case"staging":e="/releases/staging/";break;case"stable":e="/app/";break;case"branch":e="/~jsandoe/build/"}var o="https://codap.concord.org"+e,l=a.findIndex((function(e){return e.category===i}));return r.a.createElement("div",{className:"App"},r.a.createElement(b,{plugins:t,categories:a,categorySelected:i,branchSelected:s,onCategorySelect:this.handleCategorySelect,onBranchSelect:this.handleBranchSelect,onSearch:this.handleSearch,searchString:n}),r.a.createElement(D,{plugins:t,categorySelected:i,url:o,tabIndex:l}),r.a.createElement(k,null))}},{key:"handleCategorySelect",value:function(e){this.setState({categorySelected:e})}},{key:"handleBranchSelect",value:function(e){this.setState({branchSelected:e.target.value})}},{key:"handleSearch",value:function(e){var t=!1;this.setState({searchString:e}),this.state.dataInteractives.forEach((function(e){var t=e.categories.indexOf("Search");t>=0&&e.categories.splice(t,1)})),e.length>=3&&this.state.dataInteractives.forEach((function(a){(function(e,t){return t=t.toLowerCase(),e.description&&e.description.toLowerCase().includes(t)||e.title&&e.title.toLowerCase().includes(t)||e.aegis&&e.aegis.toLowerCase().includes(t)})(a,e)&&(a.categories.push("Search"),t=!0)})),t&&"Search"!==this.state.categorySelected?(this.priorSelected=this.state.categorySelected,this.setState({categorySelected:"Search"})):t||"Search"!==this.state.categorySelected||(this.setState({categorySelected:this.priorSelected}),this.priorSelected=null)}}]),a}(r.a.PureComponent);Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));n.a.render(r.a.createElement(r.a.StrictMode,null,r.a.createElement(O,null)),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()})).catch((function(e){console.error(e.message)}))}],[[16,1,2]]]); +//# sourceMappingURL=main.c693d1f6.chunk.js.map \ No newline at end of file diff --git a/build/static/js/main.703e18fb.chunk.js.map b/build/static/js/main.c693d1f6.chunk.js.map similarity index 99% rename from build/static/js/main.703e18fb.chunk.js.map rename to build/static/js/main.c693d1f6.chunk.js.map index 9b0b74a8..82826191 100644 --- a/build/static/js/main.703e18fb.chunk.js.map +++ b/build/static/js/main.c693d1f6.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["components/card/codap.ico","components/header/navigation.jsx","utils/util.js","components/header/dropdown-select.jsx","components/header/search-panel.jsx","components/header/header.jsx","components/card/card.jsx","components/card-list/card-list.jsx","components/footer/footer.jsx","App.js","serviceWorker.js","index.js"],"names":["module","exports","NavigationTabs","props","categoryDefinitions","categories","categoriesInUse","plugins","categoryArray","forEach","plugin","visible","category","includes","push","getCategories","map","e","filter","className","index","tip","c","key","categorySelected","onClick","handleCategorySelect","title","tooltip","DropdownSelect","handleChange","handleBranchSelect","bind","onSubmit","this","handleSubmit","value","branchSelected","onChange","React","Component","SearchPanel","state","onSearch","ev","searchString","target","type","placeholder","handleClear","Header","renderHeaderTitle","onCategorySelect","href","rel","src","alt","onBranchSelect","getURLRoot","window","location","origin","pathname","replace","Card","navigator","clipboard","writeText","cleanPath","renderPluginTitleAndDescription","copyToClipboard","role","aria-label","url","pluginPath","path","match","logo","renderHTML","description","parse","DOMPurify","sanitize","PureComponent","CardList","tabIndex","cardListWrapperClassNames","pluginsToShow","find","cat","sort","a","b","aLow","toLowerCase","bLow","Footer","renderInfoLinks","renderCCLogo","id","App","handleSearch","dataInteractives","dataInteractiveList","data_interactives","search","substr","findIndex","entry","setState","event","found","ix","indexOf","splice","length","aegis","pluginSearch","priorSelected","Boolean","hostname","ReactDOM","render","StrictMode","document","getElementById","serviceWorker","ready","then","registration","unregister","catch","error","console","message"],"mappings":"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","file":"static/js/main.703e18fb.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/codap.c02541ff.ico\";","import React from \"react\";\nimport PropTypes from 'prop-types';\nimport { getCategories } from \"../../utils/util\";\nimport \"./navigation.css\"\n\nexport const NavigationTabs = (props) => {\n const categoryDefinitions = props.categories;\n const categoriesInUse = getCategories(props.plugins);\n const categories = categoryDefinitions.map(e => e.category)\n .filter(category=>categoriesInUse.includes(category));\n\n return (\n <>\n { categories &&
\n {categories.map((category, index) => {\n const tip = (categoryDefinitions.filter(c => c.category === category))[0];\n return (\n
props.handleCategorySelect(category)} title={tip? tip.tooltip : \"\" }>\n {category}\n
\n )\n }\n )}\n
\n }\n \n );\n}\n\nNavigationTabs.propTypes = {\n handleCategorySelect: PropTypes.func,\n plugins: PropTypes.array,\n categories: PropTypes.any,\n categorySelected: PropTypes.string,\n}\n","export function getCategories(plugins) {\n let categoryArray = [];\n \n plugins.forEach(plugin => {\n if (plugin.visible && plugin.visible !== \"false\"){\n plugin.categories.forEach(category => {\n if (!categoryArray.includes(category)) {\n categoryArray.push(category)\n }\n })\n }\n })\n return categoryArray;\n}\n\nexport function isDevMode() {\n let queryParam = window.location.search.substr(1);\n return queryParam.includes(\"dev\")\n}\n","import React from 'react';\n\nimport \"./dropdown-select.css\";\n\nexport class DropdownSelect extends React.Component {\n constructor(props) {\n super(props);\n this.handleChange = this.props.handleBranchSelect.bind(this);\n }\n\n render() {\n return (\n
\n \n \n
\n );\n }\n}\n","import React from 'react';\n\nimport \"./search-panel.css\";\nimport PropTypes from \"prop-types\";\n\nexport class SearchPanel extends React.Component {\n constructor() {\n super();\n this.state = {value: ''};\n }\n\n handleClear(/*ev*/) {\n this.props.onSearch('');\n }\n\n handleChange(ev) {\n let searchString = ev.target.value;\n this.props.onSearch(searchString);\n }\n\n render() {\n let placeholder='search for...';\n let value = /*this.state.value*/this.props.searchString;\n\n return (\n
\n this.handleChange(ev)} value={value} />\n \n
\n )\n }\n}\n\nSearchPanel.propTypes = {\n onSearch: PropTypes.func,\n searchString: PropTypes.string,\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { NavigationTabs } from \"./navigation\";\nimport { DropdownSelect } from \"./dropdown-select\";\nimport { SearchPanel } from \"./search-panel\";\n\nimport \"./header.css\"\n\nexport class Header extends React.Component {\n render() {\n return (\n
\n {this.renderHeaderTitle()}\n \n
\n );\n }\n\n renderHeaderTitle() {\n return (\n
\n
\n \n \"Common\n \n
\n
\n CODAP Data Interactive Plugins\n
\n
\n \n \n
\n
\n\n )\n }\n}\nHeader.propTypes = {\n plugins: PropTypes.array,\n categories: PropTypes.any,\n categorySelected: PropTypes.string,\n onCategorySelect: PropTypes.func,\n onSearch: PropTypes.func,\n searchString: PropTypes.string,\n branchSelected: PropTypes.string,\n onBranchSelect: PropTypes.func\n}\n","import React from \"react\";\nimport DOMPurify from \"dompurify\";\nimport parse from \"html-react-parser\";\nimport logo from \"./codap.ico\";\n\nimport \"./card.css\"\nimport PropTypes from \"prop-types\";\n\nfunction getURLRoot() {\n let urlRoot = window.location.origin+window.location.pathname;\n return urlRoot.replace(/index.html$/, '').replace(/\\/build\\//, '');\n}\n\nexport class Card extends React.PureComponent{\n copyToClipboard() {\n navigator.clipboard.writeText(this.cleanPath());\n }\n\n render(){\n let cardClassNames = `card`\n return (\n
\n {this.renderPluginTitleAndDescription()}\n
this.copyToClipboard()}>\n copy link to clipboard\n 📋\n
\n
\n );\n }\n\n renderPluginTitleAndDescription() {\n let { plugin, url } = this.props;\n let pluginPath = \"\";\n if (plugin.path.match(/^http/i)) {\n pluginPath = plugin.path;\n }\n else {\n pluginPath = getURLRoot()+plugin.path;\n }\n if (url.match(/^https/i) && !pluginPath.match(/^https/i)) {\n pluginPath=pluginPath.replace(/http/i,'https');\n }\n\n if (pluginPath.match(/^https/i) && !url.match(/^https/i)) {\n url=url.replace(/http/i,'https');\n }\n\n return (\n
\n
\n \n {\"CODAP \n {plugin.title}\n \n
\n

{this.renderHTML(plugin.description)}

\n\n
\n );\n }\n\n renderHTML(description) {\n return parse(DOMPurify.sanitize(description || \"\"));\n }\n\n cleanPath() {\n const { plugin } = this.props;\n let path = '';\n let url=\"https://codap.concord.org/app/\"\n\n if (plugin.path.match(/^http/i)) {\n path = plugin.path;\n }\n else {\n path = getURLRoot() + plugin.path;\n }\n\n if (url.match(/^https/i) && !path.match(/^https/i)) {\n path = path.replace(/http/i, 'https');\n }\n\n if (path.match(/^https/i) && !url.match(/^https/i)) {\n url = url.replace(/http/i, 'https');\n }\n return path;\n }\n}\n\nCard.propTypes = {\n plugin: PropTypes.object,\n project: PropTypes.object,\n url: PropTypes.string\n}\n","import React from \"react\";\nimport PropTypes from 'prop-types';\nimport { Card } from \"../card/card\";\n\nimport \"./card-list.css\";\n\nexport const CardList = props => {\n let { plugins, categorySelected, url, tabIndex } = props;\n let cardListWrapperClassNames = `card-list-wrapper theme${(tabIndex % 4) + 1}`\n let pluginsToShow = plugins.filter(plugin =>\n plugin.visible &&\n plugin.visible!=='false' &&\n (plugin.categories.find(cat => cat.replace(/\\..*/, '') === categorySelected))\n ).sort(function (a, b) {\n let aLow = a.title.toLowerCase();\n let bLow = b.title.toLowerCase();\n if (aLow < bLow) return -1;\n if (aLow > bLow) return 1;\n return 0;\n });\n return (\n
\n
\n {pluginsToShow.map((plugin, index) =>\n \n )}\n
\n
\n )\n}\n\nCardList.propTypes = {\n plugins: PropTypes.array,\n categorySelected: PropTypes.string,\n url: PropTypes.string,\n tabIndex: PropTypes.number\n}\n","import React from 'react';\nimport \"./footer.css\"\n\nexport class Footer extends React.Component {\n\n render() {\n return (\n
\n
\n {this.renderInfoLinks()}\n
\n
\n {this.renderCCLogo()}\n
\n
\n );\n }\n\n renderCCLogo() {\n return (\n
\n a product of\n
\n \"The\n \n
\n
\n )\n }\n\n renderInfoLinks() {\n return (\n <>\n

CODAP plugin repository: github.com/concord-consortium/codap-data-interactives

\n

CODAP project repository: github.com/concord-consortium/codap

\n

To find out more about the CODAP project: About CODAP

\n

© Copyright 2021 The Concord Consortium. All rights reserved.

\n \n )\n }\n}\n","import React from 'react';\nimport dataInteractiveList from \"./data_interactive_map.json\";\nimport { Header } from \"./components/header/header\";\nimport { CardList } from \"./components/card-list/card-list\";\nimport { Footer } from \"./components/footer/footer\";\nimport { isDevMode } from \"./utils/util\";\n\n/**\n *\n * @param plugin {\n * {description: string},\n * {title: string},\n * {aegis: string}\n * }\n * @param searchString {string}\n * @return {boolean}\n */\nfunction pluginSearch(plugin, searchString) {\n searchString = searchString.toLowerCase();\n return (plugin.description && plugin.description.toLowerCase().includes(searchString)) ||\n (plugin.title && plugin.title.toLowerCase().includes(searchString)) ||\n (plugin.aegis && plugin.aegis.toLowerCase().includes(searchString));\n}\n\nexport default class App extends React.PureComponent {\n constructor() {\n super();\n this.handleCategorySelect = this.handleCategorySelect.bind(this);\n this.handleBranchSelect = this.handleBranchSelect.bind(this);\n this.handleSearch = this.handleSearch.bind(this);\n this.state = {\n dataInteractives: dataInteractiveList.data_interactives,\n categories: dataInteractiveList.categories,\n categorySelected: \"Partners\",\n branchSelected: isDevMode() ? \"staging\" : \"latest\",\n searchString: ''\n };\n }\n\n render() {\n const codapBaseUrl = \"https://codap.concord.org\";\n const plugins = this.state.dataInteractives;\n const categories = this.state.categories;\n const categorySelected = this.state.categorySelected;\n const branchSelected = this.state.branchSelected;\n const searchString = this.state.searchString;\n let path;\n switch (branchSelected) {\n case \"latest\":\n path = \"/releases/latest/\"\n break;\n case \"staging\":\n path = \"/releases/staging/\"\n break;\n case \"stable\":\n path = \"/app/\"\n break;\n case \"branch\":\n path = \"/~jsandoe/build/\"\n break;\n }\n const url = codapBaseUrl+path;\n let tabIndex = categories.findIndex(entry => entry.category === categorySelected);\n\n return (\n
\n
\n \n
\n
\n );\n }\n\n handleCategorySelect(category) {\n this.setState({ categorySelected: category });\n }\n\n handleBranchSelect(event) {\n this.setState({ branchSelected: event.target.value});\n }\n\n handleSearch (searchString) {\n let found = false;\n this.setState({searchString: searchString});\n this.state.dataInteractives.forEach(plugin => {\n let ix = plugin.categories.indexOf('Search');\n if (ix >= 0) {\n plugin.categories.splice(ix, 1);\n }\n });\n if (searchString.length >= 3) {\n this.state.dataInteractives.forEach(plugin => {\n if (pluginSearch(plugin, searchString)) {\n plugin.categories.push('Search');\n found = true;\n }\n });\n }\n if (found && this.state.categorySelected !== 'Search') {\n this.priorSelected = this.state.categorySelected;\n this.setState({categorySelected: 'Search'})\n } else if (!found && this.state.categorySelected === 'Search') {\n this.setState({categorySelected: this.priorSelected});\n this.priorSelected = null;\n }\n }\n}\n\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["components/card/codap.ico","components/header/navigation.jsx","utils/util.js","components/header/dropdown-select.jsx","components/header/search-panel.jsx","components/header/header.jsx","components/card/card.jsx","components/card-list/card-list.jsx","components/footer/footer.jsx","App.js","serviceWorker.js","index.js"],"names":["module","exports","NavigationTabs","props","categoryDefinitions","categories","categoriesInUse","plugins","categoryArray","forEach","plugin","visible","category","includes","push","getCategories","map","e","filter","className","index","tip","c","key","categorySelected","onClick","handleCategorySelect","title","tooltip","DropdownSelect","handleChange","handleBranchSelect","bind","onSubmit","this","handleSubmit","value","branchSelected","onChange","React","Component","SearchPanel","state","onSearch","ev","searchString","target","type","placeholder","handleClear","Header","renderHeaderTitle","onCategorySelect","href","rel","src","alt","onBranchSelect","getURLRoot","window","location","origin","pathname","replace","Card","navigator","clipboard","writeText","cleanPath","renderPluginTitleAndDescription","copyToClipboard","role","aria-label","url","pluginPath","path","match","logo","renderHTML","description","parse","DOMPurify","sanitize","PureComponent","CardList","tabIndex","cardListWrapperClassNames","pluginsToShow","find","cat","sort","a","b","aLow","toLowerCase","bLow","Footer","renderInfoLinks","renderCCLogo","id","App","handleSearch","dataInteractives","dataInteractiveList","data_interactives","search","substr","findIndex","entry","setState","event","found","ix","indexOf","splice","length","aegis","pluginSearch","priorSelected","Boolean","hostname","ReactDOM","render","StrictMode","document","getElementById","serviceWorker","ready","then","registration","unregister","catch","error","console","message"],"mappings":"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","file":"static/js/main.c693d1f6.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/codap.c02541ff.ico\";","import React from \"react\";\nimport PropTypes from 'prop-types';\nimport { getCategories } from \"../../utils/util\";\nimport \"./navigation.css\"\n\nexport const NavigationTabs = (props) => {\n const categoryDefinitions = props.categories;\n const categoriesInUse = getCategories(props.plugins);\n const categories = categoryDefinitions.map(e => e.category)\n .filter(category=>categoriesInUse.includes(category));\n\n return (\n <>\n { categories &&
\n {categories.map((category, index) => {\n const tip = (categoryDefinitions.filter(c => c.category === category))[0];\n return (\n
props.handleCategorySelect(category)} title={tip? tip.tooltip : \"\" }>\n {category}\n
\n )\n }\n )}\n
\n }\n \n );\n}\n\nNavigationTabs.propTypes = {\n handleCategorySelect: PropTypes.func,\n plugins: PropTypes.array,\n categories: PropTypes.any,\n categorySelected: PropTypes.string,\n}\n","export function getCategories(plugins) {\n let categoryArray = [];\n \n plugins.forEach(plugin => {\n if (plugin.visible && plugin.visible !== \"false\"){\n plugin.categories.forEach(category => {\n if (!categoryArray.includes(category)) {\n categoryArray.push(category)\n }\n })\n }\n })\n return categoryArray;\n}\n\nexport function isDevMode() {\n let queryParam = window.location.search.substr(1);\n return queryParam.includes(\"dev\")\n}\n","import React from 'react';\n\nimport \"./dropdown-select.css\";\n\nexport class DropdownSelect extends React.Component {\n constructor(props) {\n super(props);\n this.handleChange = this.props.handleBranchSelect.bind(this);\n }\n\n render() {\n return (\n
\n \n \n
\n );\n }\n}\n","import React from 'react';\n\nimport \"./search-panel.css\";\nimport PropTypes from \"prop-types\";\n\nexport class SearchPanel extends React.Component {\n constructor() {\n super();\n this.state = {value: ''};\n }\n\n handleClear(/*ev*/) {\n this.props.onSearch('');\n }\n\n handleChange(ev) {\n let searchString = ev.target.value;\n this.props.onSearch(searchString);\n }\n\n render() {\n let placeholder='search for...';\n let value = /*this.state.value*/this.props.searchString;\n\n return (\n
\n this.handleChange(ev)} value={value} />\n \n
\n )\n }\n}\n\nSearchPanel.propTypes = {\n onSearch: PropTypes.func,\n searchString: PropTypes.string,\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { NavigationTabs } from \"./navigation\";\nimport { DropdownSelect } from \"./dropdown-select\";\nimport { SearchPanel } from \"./search-panel\";\n\nimport \"./header.css\"\n\nexport class Header extends React.Component {\n render() {\n return (\n
\n {this.renderHeaderTitle()}\n \n
\n );\n }\n\n renderHeaderTitle() {\n return (\n
\n
\n \n \"Common\n \n
\n
\n CODAP Data Interactive Plugins\n
\n
\n \n \n
\n
\n\n )\n }\n}\nHeader.propTypes = {\n plugins: PropTypes.array,\n categories: PropTypes.any,\n categorySelected: PropTypes.string,\n onCategorySelect: PropTypes.func,\n onSearch: PropTypes.func,\n searchString: PropTypes.string,\n branchSelected: PropTypes.string,\n onBranchSelect: PropTypes.func\n}\n","import React from \"react\";\nimport DOMPurify from \"dompurify\";\nimport parse from \"html-react-parser\";\nimport logo from \"./codap.ico\";\n\nimport \"./card.css\"\nimport PropTypes from \"prop-types\";\n\nfunction getURLRoot() {\n let urlRoot = window.location.origin+window.location.pathname;\n return urlRoot.replace(/index.html$/, '').replace(/\\/build\\//, '');\n}\n\nexport class Card extends React.PureComponent{\n copyToClipboard() {\n navigator.clipboard.writeText(this.cleanPath());\n }\n\n render(){\n let cardClassNames = `card`\n return (\n
\n {this.renderPluginTitleAndDescription()}\n
this.copyToClipboard()}>\n copy link to clipboard\n 📋\n
\n
\n );\n }\n\n renderPluginTitleAndDescription() {\n let { plugin, url } = this.props;\n let pluginPath = \"\";\n if (plugin.path.match(/^http/i)) {\n pluginPath = plugin.path;\n }\n else {\n pluginPath = getURLRoot()+plugin.path;\n }\n if (url.match(/^https/i) && !pluginPath.match(/^https/i)) {\n pluginPath=pluginPath.replace(/http/i,'https');\n }\n\n if (pluginPath.match(/^https/i) && !url.match(/^https/i)) {\n url=url.replace(/http/i,'https');\n }\n\n return (\n
\n
\n \n {\"CODAP \n {plugin.title}\n \n
\n

{this.renderHTML(plugin.description)}

\n\n
\n );\n }\n\n renderHTML(description) {\n return parse(DOMPurify.sanitize(description || \"\"));\n }\n\n cleanPath() {\n const { plugin } = this.props;\n let path = '';\n let url=\"https://codap.concord.org/app/\"\n\n if (plugin.path.match(/^http/i)) {\n path = plugin.path;\n }\n else {\n path = getURLRoot() + plugin.path;\n }\n\n if (url.match(/^https/i) && !path.match(/^https/i)) {\n path = path.replace(/http/i, 'https');\n }\n\n if (path.match(/^https/i) && !url.match(/^https/i)) {\n url = url.replace(/http/i, 'https');\n }\n return path;\n }\n}\n\nCard.propTypes = {\n plugin: PropTypes.object,\n project: PropTypes.object,\n url: PropTypes.string\n}\n","import React from \"react\";\nimport PropTypes from 'prop-types';\nimport { Card } from \"../card/card\";\n\nimport \"./card-list.css\";\n\nexport const CardList = props => {\n let { plugins, categorySelected, url, tabIndex } = props;\n let cardListWrapperClassNames = `card-list-wrapper theme${(tabIndex % 4) + 1}`\n let pluginsToShow = plugins.filter(plugin =>\n plugin.visible &&\n plugin.visible!=='false' &&\n (plugin.categories.find(cat => cat.replace(/\\..*/, '') === categorySelected))\n ).sort(function (a, b) {\n let aLow = a.title.toLowerCase();\n let bLow = b.title.toLowerCase();\n if (aLow < bLow) return -1;\n if (aLow > bLow) return 1;\n return 0;\n });\n return (\n
\n
\n {pluginsToShow.map((plugin, index) =>\n \n )}\n
\n
\n )\n}\n\nCardList.propTypes = {\n plugins: PropTypes.array,\n categorySelected: PropTypes.string,\n url: PropTypes.string,\n tabIndex: PropTypes.number\n}\n","import React from 'react';\nimport \"./footer.css\"\n\nexport class Footer extends React.Component {\n\n render() {\n return (\n
\n
\n {this.renderInfoLinks()}\n
\n
\n {this.renderCCLogo()}\n
\n
\n );\n }\n\n renderCCLogo() {\n return (\n
\n a product of\n
\n \"The\n \n
\n
\n )\n }\n\n renderInfoLinks() {\n return (\n <>\n

CODAP plugin repository: github.com/concord-consortium/codap-data-interactives

\n

CODAP project repository: github.com/concord-consortium/codap

\n

To find out more about the CODAP project: About CODAP

\n

© Copyright 2021 The Concord Consortium. All rights reserved.

\n \n )\n }\n}\n","import React from 'react';\nimport dataInteractiveList from \"./data_interactive_map.json\";\nimport { Header } from \"./components/header/header\";\nimport { CardList } from \"./components/card-list/card-list\";\nimport { Footer } from \"./components/footer/footer\";\nimport { isDevMode } from \"./utils/util\";\n\n/**\n *\n * @param plugin {\n * {description: string},\n * {title: string},\n * {aegis: string}\n * }\n * @param searchString {string}\n * @return {boolean}\n */\nfunction pluginSearch(plugin, searchString) {\n searchString = searchString.toLowerCase();\n return (plugin.description && plugin.description.toLowerCase().includes(searchString)) ||\n (plugin.title && plugin.title.toLowerCase().includes(searchString)) ||\n (plugin.aegis && plugin.aegis.toLowerCase().includes(searchString));\n}\n\nexport default class App extends React.PureComponent {\n constructor() {\n super();\n this.handleCategorySelect = this.handleCategorySelect.bind(this);\n this.handleBranchSelect = this.handleBranchSelect.bind(this);\n this.handleSearch = this.handleSearch.bind(this);\n this.state = {\n dataInteractives: dataInteractiveList.data_interactives,\n categories: dataInteractiveList.categories,\n categorySelected: \"Partners\",\n branchSelected: isDevMode() ? \"staging\" : \"latest\",\n searchString: ''\n };\n }\n\n render() {\n const codapBaseUrl = \"https://codap.concord.org\";\n const plugins = this.state.dataInteractives;\n const categories = this.state.categories;\n const categorySelected = this.state.categorySelected;\n const branchSelected = this.state.branchSelected;\n const searchString = this.state.searchString;\n let path;\n switch (branchSelected) {\n case \"latest\":\n path = \"/releases/latest/\"\n break;\n case \"staging\":\n path = \"/releases/staging/\"\n break;\n case \"stable\":\n path = \"/app/\"\n break;\n case \"branch\":\n path = \"/~jsandoe/build/\"\n break;\n }\n const url = codapBaseUrl+path;\n let tabIndex = categories.findIndex(entry => entry.category === categorySelected);\n\n return (\n
\n
\n \n
\n
\n );\n }\n\n handleCategorySelect(category) {\n this.setState({ categorySelected: category });\n }\n\n handleBranchSelect(event) {\n this.setState({ branchSelected: event.target.value});\n }\n\n handleSearch (searchString) {\n let found = false;\n this.setState({searchString: searchString});\n this.state.dataInteractives.forEach(plugin => {\n let ix = plugin.categories.indexOf('Search');\n if (ix >= 0) {\n plugin.categories.splice(ix, 1);\n }\n });\n if (searchString.length >= 3) {\n this.state.dataInteractives.forEach(plugin => {\n if (pluginSearch(plugin, searchString)) {\n plugin.categories.push('Search');\n found = true;\n }\n });\n }\n if (found && this.state.categorySelected !== 'Search') {\n this.priorSelected = this.state.categorySelected;\n this.setState({categorySelected: 'Search'})\n } else if (!found && this.state.categorySelected === 'Search') {\n this.setState({categorySelected: this.priorSelected});\n this.priorSelected = null;\n }\n }\n}\n\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""} \ No newline at end of file diff --git a/src/data_interactive_map.json b/src/data_interactive_map.json index 35641b4d..b9e72276 100644 --- a/src/data_interactive_map.json +++ b/src/data_interactive_map.json @@ -853,6 +853,20 @@ "Tools" ] }, + { + "title": "Sonify", + "description": "Listen to your data", + "width": 325, + "height": 274, + "path": "/Sonify/index.html", + "icon": "/Sonify/src/assets/sonify.svg", + "visible": "true", + "isStandard": "true", + "categories": [ + "Partners", + "Tools" + ] + }, { "title": "Story Builder", "description": "Create a narrative of your investigation", @@ -869,20 +883,6 @@ "Tools" ] }, - { - "title": "Sonify", - "description": "Listen to your data", - "width": 325, - "height": 274, - "path": "/Sonify/index.html", - "icon": "/Sonify/src/assets/sonify.svg", - "visible": "true", - "isStandard": "true", - "categories": [ - "Partners", - "Tools" - ] - }, { "title": "Day Length", "description": "Computes the day length for a year for any place in the world", From a82eff50090fe31ab9f0a366131e286ab11a081c Mon Sep 17 00:00:00 2001 From: eireland Date: Fri, 9 Feb 2024 08:23:28 -0800 Subject: [PATCH 2/2] Enables closing table in the Microdata Portal plugin --- sdlc/plugin/js/app.CODAPconnect.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdlc/plugin/js/app.CODAPconnect.js b/sdlc/plugin/js/app.CODAPconnect.js index e17b3ebc..aa265877 100644 --- a/sdlc/plugin/js/app.CODAPconnect.js +++ b/sdlc/plugin/js/app.CODAPconnect.js @@ -180,7 +180,7 @@ let CODAPconnect = { type : 'caseTable', dataContext : constants.datasetName, name : constants.caseTableName, - cannotClose : true + cannotClose : false } };