diff --git a/build/precache-manifest.50006c56e19073402d72ae675adcab72.js b/build/precache-manifest.50006c56e19073402d72ae675adcab72.js new file mode 100644 index 00000000..9ab9c293 --- /dev/null +++ b/build/precache-manifest.50006c56e19073402d72ae675adcab72.js @@ -0,0 +1,30 @@ +self.__precacheManifest = (self.__precacheManifest || []).concat([ + { + "revision": "64596856986271e6f21f6d5b573915e1", + "url": "./index.html" + }, + { + "revision": "88e44a11d06edf1eef2c", + "url": "./static/css/main.36bc8d80.chunk.css" + }, + { + "revision": "d588bdce3e6e15c9d83f", + "url": "./static/js/2.c80c4b2d.chunk.js" + }, + { + "revision": "d822076f121a0870ca6705e1ebd3041a", + "url": "./static/js/2.c80c4b2d.chunk.js.LICENSE.txt" + }, + { + "revision": "88e44a11d06edf1eef2c", + "url": "./static/js/main.703e18fb.chunk.js" + }, + { + "revision": "cb17529e290eed44a367", + "url": "./static/js/runtime-main.42b58e32.js" + }, + { + "revision": "c02541ff141198f0735de067023b6552", + "url": "./static/media/codap.c02541ff.ico" + } +]); \ No newline at end of file diff --git a/build/static/js/main.703e18fb.chunk.js b/build/static/js/main.703e18fb.chunk.js new file mode 100644 index 00000000..38574578 --- /dev/null +++ b/build/static/js/main.703e18fb.chunk.js @@ -0,0 +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 diff --git a/build/static/js/main.703e18fb.chunk.js.map b/build/static/js/main.703e18fb.chunk.js.map new file mode 100644 index 00000000..9b0b74a8 --- /dev/null +++ b/build/static/js/main.703e18fb.chunk.js.map @@ -0,0 +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