diff --git a/.travis.yml b/.travis.yml index d883a6158..6267fb4a6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,27 +10,46 @@ notifications: secure: ezESiG7JnuSLZc2/PPhOvWUv5BHBCr+g86MsuLLw+S+zz3DUfzWHMQ1g5tUvkeSDTPmfEIX41EnPkaoWtsD3OGO0PGXgseAfA8+6Z4N1rICNZZrhXZB2s6UdwRK1e+0Jol4W3kHmt96BHyN2scLNgJYeWMgSJllVsuPhMTlKBZIXI9u540NH8Nxjl3f2WvoIg64Q1mZvMxkpPbw4xssx6U4HSFE8kTTE6+EFsSxzombFX0cLGjPiJ9QZgGVUk4UkIjyiFLQQDfQlLllCaUpqJ9+qbuCNoMSKA2yty/qyZ8Y+r4OlMberjmBzR9GRLLyXWWcaAfMIgwlRhjtLYIDAUSsGM1iwUWCgyB9maG2IiXuYLSueuMx8DcDwbpUepoDgnqBYnM2AJmT8gcsxqlKYzJpYpHDgZgBlLZQgMXqjrVJHs/Tf9XVcLS6HAn1Ww0OOT01jThfy4gClpAuqLayYexsXOoL+RaFg25E2NzuTtaFWgRfWZgcAeqYNDiUzwun2D4vZ5I+NtdRP0gzpbG2fxhFz05vAqyf1Kp6ZYb17Li3A38dIm6Lsvv3qawAIAgNaZpIZX3f89+uq6jHU8kJy1Iv823JK2Xac3vEz3SHUKJnuXFF0LO07om9AcNEXhP/JrJ617S8nfvDtZRJODMFhz8qQwie+65Ql1I871goBpVs= env: global: + - API_HOST_master=https://api.scratch.mit.edu + - API_HOST_STAGING=https://api-staging.scratch.mit.edu + - API_HOST_VAR=API_HOST_$TRAVIS_BRANCH + - API_HOST=${!API_HOST_VAR} + - API_HOST=${API_HOST:-$API_HOST_STAGING} # EB_AWS_ACCESS_KEY_ID - secure: A138rYuXDsOmpEwYxZ31WyXEeq5fgr9qyqsQh1nTFsjBKpFtNM+CN9e0QJQFT3PLs4wH/lWTRSyHxakxKQS1sxq828f9gHed+f15REKk/fRUplcCYIexT9xKVtU3D8CRNn/KBFWk75fZyZt20eyOVIv4h3pInKQz7y84J6PWzB1BCrAFvADrzS1X68Z3NJJLyxnz0YEurzz8mC2v4D0s/XifKTWvRtefD4QM6pE0C2iYyk+ThrLwg7i9FDHVfo0MrkgcdX7mz37SnTr7p7mHWnGXrGngi/NiDRQ+Uwwq/sr2UIww0rCwS1xsOcS//dC4NNqrrt1kUTsoC1Yt87Ny+gI0nUplsfEpdKajAkOYdANC5bJUGqPdSlOds1v9aJs9Hx48uGamWkm/3cFmoJ5uA2ZzUwbSGjTkWbnhwzT0YRvcLGhP1WE/EswaIyK5qMp522E79mP1yH6M750iUvi4N39+QW1BNX3ADkOwyAI67ArX5on5gWP83RXcJ15im7XsBpsmVn/KXi6AouWPb8jmSmKCj0QZCzfLY7ivM42IugYpK2NV7kFB38DpXQamJ5eskgwYa3elRmednIFUuwb1QDnONvJogVjk4CLmoSxssC2mJnnrUItM7l8G6As81GMI+6lTtl86hAuXBjUk60FMbgTAQDX9ll26LgpBy8jHSx8= # EB_AWS_SECRET_ACCESS_KEY - secure: EX1fyov+f6ytWN2ZSL4dLslwrVkp6Ho/uoSLO38/qNG3XdGmBN4VprxddcQiWfo+Mrg3GdWcfcM/VazhhStBi1uLfZiw3RHZaSGuWbiuD2EtzqtlC+OVvoajgy91QFajh9Zzuwa0rYbEPd/sw01R53NoWJYl0GSteWk7C8Wv6anl4FUJCqgvvTV2ZEcyTtGcVJgUhKi1MfNpTSM6JWBy0DWszcyxj7C8LSs1+l9ZjAtnlUBWY13HsrNu8G5d+FwqGHZLUAjdu2O602wxV897/xLARLduZ+01ALpVefNEEGMB1Wd+xMw4dm2B0Uk86a4TBRCeOgJZ1yoJoPpGPOHTo+dgNXcU8ReszGVoy7uOjFWwu82FQq8gzfcf75yzaRJgG8/BJ6BkJfa0EmFg3iO5CwixQyHR5+CqsedtoLAWVT8zlOfQ/Z6yx4Pm7jXQSOkyvo09YJ2QIn4IFGPvwOVS7Firzi+fLl8GYApeSV9G10e1IzA4pPrKdJMRA4qRMPt9zJGq7ZO1J/d9aW/5KIsJUDnodnl7yXJyDMOyNeljT9I82ciHZcURxRRY080vrW6dgNJE1V9jxBhWEvr2iCeWMMedWaGuC41I7K9L79eW8lmaE+cQ+OZrzpOJP4GbfmIiXrh+0M4ChL/xBpjtiFwpNdkCXXhzWMnjJ4wCrii4yuc= - - CXX=g++-4.8 - AWS_ACCESS_KEY_ID=$EB_AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY=$EB_AWS_SECRET_ACCESS_KEY + - CXX=g++-4.8 - FASTLY_ACTIVATE_CHANGES=true - - S3_BUCKET_NAME_STAGING=scratch-www-staging - - S3_BUCKET_NAME_PRODUCTION=scratch-www-production - - S3_ACL=public_read - - S3_LOCAL_DIR=build - - S3_REGION=us-east-1 - - SKIP_CLEANUP=true - - WWW_VERSION=${TRAVIS_COMMIT:0:5} # FASTLY_API_KEY - secure: XNWcCnqSAd4MpKg6FVe3WeFmdqfdH753+PBCOEkJrHS+AHmLMuWsjIQFJ3LUR9ylEQRVPR2OyXJW/R8NI9toStREgwE4fwIVo0l4fwYqLStxYpEKlcWfkJ3uNpRZhvcVmUBycelrnjJqXVdrtlxPCKX0tNkpcKH2b98We7A2/r7HxKv13upDxWTQ/qRUv0+SJCRTB4n/QInABi87Ef8Q2rNGrL0WQzQvVBeiEXOP0JSkyYK4+q65gswMKPehgiFagnYVgJN9J9Q1VrBDc06gidbznBcEpPaBAYvsTTY9dWTJxaaKNSrmOIe/OiuJUEHjb+8NL+j6Lp7wX8lzEjbr0FkVlFnxS9VbftS2KFkN7+c3RF57+tsq0xwJ6vgomIVS5FupHgl/oCJicnH/FLfynditOLZhmhF+Ed5GCAoIEamRRzcVHdjvglsEtYsDX1/z2t+HKYtPQuXYOywDRVTSPf88eEbu8ehfgNcYaIAuD6eedyDnKTOIv7owWs3Y7GsxQ2jBLGXq1YoUEkPtB0vfaHi72CeEhDQ53mEn2Ure47UMGMgUjKtiIhDBNTbECwP/ZDJv1accGRljKjDy93aCJeRi1T7Op7tDbHSl4ScieeOwOeKJMcD1U5JGdA/sRnjjgSKb24P2ys4NYr95dgqWNNGPGMxca+lGufzdEaTQT44= + # FASTLY_SERVICE_ID_master + - secure: l5jwRVj4rj7qT6iuRinVqBBOie3OwBgXDPFER15JLLj5H5HZn0iGtdyuAhjvNWp6+Q/gGU6GAJEBCx63oFESBklyKUbZEAFqVI8f8g+d9toce+rlnMLcbw5A4jfgyqxJS9IYu57v291AGO78x7+HhUxbf9XLjhl1N18sIIDcMUXQir1zjnOkyBm3M4In2pi7PLdkpYwaWDxyjR9+Jy5BE9bl68BRSoqRGidFpoWHeZM4zrXzY49gSUsHNL6UnmYwCdEOGEclSn9cAhTE2O+z24Du3Kp35JfBnI8kHFfBn/u5auiHPzuwC4QvovjrxBNX9bvjBKVOPhgaq0kw3cKxftEeMAlHciancaXnCWFGSSQ7Cw7isvbYAJsy9gbNtJoNn90KlSPLUQ8pRcPU7pcfCabBxGYFda4736dWjq++SxiCyMgmxU9Q5LqOQWNvGsLREAKp4SOg0nkv2mrebAvL3Ta/nfI1Fb5mDtxsHJldttMYQgElV5OsXncZBY5pZG5KdbffnaxS40oRT58xdMQPLx/RUK/ZLkq+3lJM7Pb/ZuSJr7WBTu54VsWrPGr53Td1kZgONH1ksAepJxCij/X4f56aiQbRm144r9ERSJZBZ8qn8GG7N3Mad+ZJkPS9Bs4DIDgJyxMm7kIhUhPfHzydsb93ns1bPI6l+S+dx2JIKHc= # FASTLY_SERVICE_ID_STAGING - - secure: n2A/v+rfDqhYNvp2ANvWXFnDRnstDqTuAiiMHx5YZmk/2OXIj8FZ74cu5klRNuq8xeKLdWAq24nOjMkaM7LSu5l3xPTIX5nhk094srFZI+KZnpB8LIftJFR9+8f2Jzz+HboQVwYdAXnmkGWkE8U1v+qOrFkAY3GmZurWcBFJwZ3ytTcyXqPe3QsdXeijEgMRvPmj1RIrtD+ovJdir19la7HMIBfwbARRhCSCmBsd9WZwNc4aCz5ob1lTnZaNBFtYHbB9hpvp/+A68Nql7+zLRxytUQ6raehe6WC1gWpfhMIphmUpumJqCU4fK0uPD0ztzHoxYbpeSds8KO7Q0yJVNfRxQLgD9kVQliTWFM/jCWQYcCLnrH0Rq2L3VlXw0qLlT+cYXc9+/Nx8Rl+q8R7w+1sGUZJDbzHPXW1gssVizU1Mxo78MJJrZ6+DpsEhOHLGGrs3RrYIzo7/c4prEdr3lN40lkYplQdzPEA9XQoqAOOfzazetEMzlBm+/q1fVmNZrBY2m1Xnu78l1SMvoUzEYZeezP70UG3TQfPSS7M5fPhAbXroD67VHE2qrcLo9PMDNl8/QmIhjGaogGDLSv0eiZU+e9KbCtKuawtgP5DahEKiOx17xOE9Vx73KAqDMT6G/reQmUhZihCwysbRudL/vWd617l721uloGV5xVrF0s4= - # FASTLY_SERVICE_ID_PRODUCTION - - secure: W8aANFTNABATDi2WFUAb934xN55eKVifopbOQhBPuLMGlch0BUn3Otbwl05Zt7mQZtestHGy6lgpUzV9tajvuZ3GjzlVN2Dm7xfQe8VbVL2pjWXhVgMiX+eY08/Ba5KG2X4BcSdcpdXP4GEjNW9GoNUjJDSpYUFACZew/hZS/+EwNF0j8EC87Gs0xL37JOQ61X/uG2QCMVzmP4R7NjTCFoLwh6CiqRRAMowNrU11aOjQ8rM52AO7iL4ekXYWx16PURn+jQ32ywo009J11x7zeqithnvLcyG4dvAcqyKYI9PaH+tWyr3JxSZqEJkvlP7CSFKsnuOyIF+1k0kS3IIyMEK4KHptM+/lll6MiFd9xIoNYyqkq0Y9pYjaq2mGbf6lOuIC028g+KcHM1/q8a9MhwTUmGiLg6k5VU1zsr217Z0f6//fNzvOG6/x42d78Zyc66T9OnZ8ap92AzDjrrJBP1D9JYIU2nVojRMesQ2iLrdiU2HaHY/vZz4MPhkdE9t6lvptHEXysmn5tokdNWrgXJpHgLlteMLnFOWG6PaadysLn39QAz9o4wcsuAnIJWYoaWOBplwfY011G0QKq1VNpZrmHJZaHMLruP8rbXLHWnQkkQp/RlT+7+z+Tf+3kB8LBRykRt8WaH717eblUUm5MVPFrZA0A5faCD8o0maN3SA= + - secure: MyT0xGN75v1bVnP1fpKaenx2WijGi2OZCQV5TDeDkgqlkW9n2HOtGa4bWE+cT+hR8UieC176sGg7OvsUCy0nYm5QhR8WJc+8WGa689GsPDUMgw+hUKfk/JYeHQHNKTwAyY6iN6Jo2qQtcBMS/M8xakwYaktB0vcNNId13Fhj7IMUTUEdpSWQLTkaXGB7cHM0ak9KqivH2aqzoncJnhcRNrqVz3FaLKmqAXI8NpQcgz5uAxkBjmniIHWkJPWRvLqr3xRebDaXiMFI7pB+iTSlbzR2lqsZLzZpSBJbqKhPx99KvnHjlSq7LAjP840X5Vj5ZCPlSrZe4IIYp2g863j5nOUHj1MC1Eh6xD3bjmZ+61KaWchSWMp+XOs9grghl9kLexfwZbCNxW0s8uq+WqOY/qcbzm/go5z7WFlDJ1Qmdo2sLhdtwCwcSwyCR8nhoaHqJtKg9PJTyKbr+SWizDVlSyWRccqyJ1jd/vjd1xAG5RRM6YuP4RBqEAWGzOsx+kJMhnOOI3yIZfY7eTntMxb9Gxjyk4IsBX3pyPHJSWeb7x4bzMGCHSewMmdTzcFHvSmRaZ2w50PSqPSagR42mYJqAfaS1/eMSf2oI5kE9RmiQYP4SrLerdYFbYEt0w8/+Hu8glRqpJtMSB42yWanMIvMBahSQH9dun3TzFQKKEljwzA= + - FASTLY_SERVICE_ID_VAR=FASTLY_SERVICE_ID_$TRAVIS_BRANCH + - FASTLY_SERVICE_ID=${!FASTLY_SERVICE_ID_VAR} + - FASTLY_SERVICE_ID=${FASTLY_SERVICE_ID:-$FASTLY_SERVICE_ID_STAGING} + - GA_TRACKER_master=UA-30688952-1 + - GA_TRACKER_VAR=GA_TRACKER_$TRAVIS_BRANCH + - GA_TRACKER=${!GA_TRACKER_VAR} + - GA_TRACKER=${GA_TRACKER:-$GA_TRACKER_STAGING} + - S3_BUCKET_NAME_master=scratch-www-production + - S3_BUCKET_NAME_STAGING=scratch-www-staging + - S3_BUCKET_NAME_VAR=S3_BUCKET_NAME_$TRAVIS_BRANCH + - S3_BUCKET_NAME=${!S3_BUCKET_NAME_VAR} + - S3_BUCKET_NAME=${S3_BUCKET_NAME:-$S3_BUCKET_NAME_STAGING} + - S3_LOCAL_DIR=build + - SENTRY_DSN_master=https://6cf7e15e06b24ba48b727910bd9e6d9e@app.getsentry.com/54913 + - SENTRY_DSN_STAGING=https://7e69dd3d620e434490f07ef0e60613f9@app.getsentry.com/58289 + - SENTRY_DSN_VAR=SENTRY_DSN_$TRAVIS_BRANCH + - SENTRY_DSN=${!SENTRY_DSN_VAR} + - SENTRY_DSN=${SENTRY_DSN:-$SENTRY_DSN_STAGING} + - SKIP_CLEANUP=true + - NODE_ENV=production + - WWW_VERSION=${TRAVIS_COMMIT:0:5} addons: apt: sources: @@ -43,7 +62,7 @@ install: deploy: - provider: script skip_cleanup: $SKIP_CLEANUP - script: env FASTLY_SERVICE_ID=$FASTLY_SERVICE_ID_STAGING S3_BUCKET_NAME=$S3_BUCKET_NAME_STAGING make sync + script: env make sync on: repo: LLK/scratch-www branch: @@ -52,7 +71,7 @@ deploy: - release/* - provider: script skip_cleanup: $SKIP_CLEANUP - script: env FASTLY_SERVICE_ID=$FASTLY_SERVICE_ID_PRODUCTION S3_BUCKET_NAME=$S3_BUCKET_NAME_PRODUCTION make sync + script: env make sync on: repo: LLK/scratch-www branch: diff --git a/README.md b/README.md index e3edb0908..23824c4ef 100644 --- a/README.md +++ b/README.md @@ -61,12 +61,14 @@ Use `^C` to stop the node process `npm start` starts. `npm start` can be configured with the following environment variables -| Variable | Default | Description | -| ------------- | ------------------------------------- | ---------------------------------------------- | -| `API_HOST` | `https://api.scratch.mit.edu` | Hostname for API requests | -| `NODE_ENV` | `null` | If not `production`, app acts like development | -| `PORT` | `8333` | Port for devserver (http://localhost:XXXX) | -| `FALLBACK` | `''` | Pass-through location for old site | +| Variable | Default | Description | +| ------------- | ----------------------------- | ---------------------------------------------- | +| `API_HOST` | `https://api.scratch.mit.edu` | Hostname for API requests | +| `SENTRY_DSN` | `''` | DSN for Sentry | +| `FALLBACK` | `''` | Pass-through location for old site | +| `GA_TRACKER` | `''` | Where to log Google Analytics data | +| `NODE_ENV` | `null` | If not `production`, app acts like development | +| `PORT` | `8333` | Port for devserver (http://localhost:XXXX) | **NOTE:** Because by default `API_HOST=https://api.scratch.mit.edu`, please be aware that, by default, you will be seeing and interacting with real data on the Scratch website. diff --git a/src/components/grid/grid.json b/src/components/grid/grid.json index 16742f743..c48b916b2 100644 --- a/src/components/grid/grid.json +++ b/src/components/grid/grid.json @@ -46,5 +46,85 @@ "thumbnailUrl": "", "creator": "", "href": "#" + }, + { + "id": 7, + "type": "project", + "title": "Project", + "thumbnailUrl": "", + "creator": "", + "href": "#" + }, + { + "id": 8, + "type": "project", + "title": "Project", + "thumbnailUrl": "", + "creator": "", + "href": "#" + }, + { + "id": 9, + "type": "project", + "title": "Project", + "thumbnailUrl": "", + "creator": "", + "href": "#" + }, + { + "id": 10, + "type": "project", + "title": "Project", + "thumbnailUrl": "", + "creator": "", + "href": "#" + }, + { + "id": 11, + "type": "project", + "title": "Project", + "thumbnailUrl": "", + "creator": "", + "href": "#" + }, + { + "id": 12, + "type": "project", + "title": "Project", + "thumbnailUrl": "", + "creator": "", + "href": "#" + }, + { + "id": 13, + "type": "project", + "title": "Project", + "thumbnailUrl": "", + "creator": "", + "href": "#" + }, + { + "id": 14, + "type": "project", + "title": "Project", + "thumbnailUrl": "", + "creator": "", + "href": "#" + }, + { + "id": 15, + "type": "project", + "title": "Project", + "thumbnailUrl": "", + "creator": "", + "href": "#" + }, + { + "id": 16, + "type": "project", + "title": "Project", + "thumbnailUrl": "", + "creator": "", + "href": "#" } ] diff --git a/src/routes.json b/src/routes.json index 5b3dcab80..24a1f0f69 100644 --- a/src/routes.json +++ b/src/routes.json @@ -91,6 +91,12 @@ "pattern": "^/info/donate/?", "redirect": "https://secure.donationpay.org/scratchfoundation/" }, + { + "name": "dmca", + "pattern": "^/DMCA/?$", + "view": "dmca/dmca", + "title": "DMCA" + }, { "name": "guidelines", "pattern": "^/community_guidelines$", diff --git a/src/template-config.js b/src/template-config.js index 681357ccb..5a1ce4296 100644 --- a/src/template-config.js +++ b/src/template-config.js @@ -22,7 +22,7 @@ module.exports = { ga_tracker: process.env.GA_TRACKER || '', // Error handling - sentry_dsn: process.env.CLIENT_SENTRY_DSN || '', + sentry_dsn: process.env.SENTRY_DSN || '', // Use minified JS libraries min: (process.env.NODE_ENV === 'production') ? '.min' : '', diff --git a/src/views/conference/plan/plan.jsx b/src/views/conference/plan/plan.jsx index 752117465..e49e22ed0 100644 --- a/src/views/conference/plan/plan.jsx +++ b/src/views/conference/plan/plan.jsx @@ -279,6 +279,18 @@ var ConferencePlan = React.createClass({ Proposal submissions are now closed. +
+ How much does it cost to register? +
+
+ Through May 1, registration is $150 per ticket (Early Bird rate).{' '} + After May 1, registration increases to $250 per ticket. You can register{' '} + for the conference through the{' '} + + registration form + . +
+
I can only attend one day of the conference. Do you offer single-day{' '} registration? diff --git a/src/views/dmca/dmca.jsx b/src/views/dmca/dmca.jsx new file mode 100644 index 000000000..5e2670310 --- /dev/null +++ b/src/views/dmca/dmca.jsx @@ -0,0 +1,34 @@ +var React = require('react'); +var FormattedMessage = require('react-intl').FormattedMessage; +var render = require('../../lib/render.jsx'); +var Page = require('../../components/page/www/page.jsx'); +var Box = require('../../components/box/box.jsx'); + +require('./dmca.scss'); + +var Dmca = React.createClass({ + type: 'Dmca', + render: function () { + return ( +
+ +

+

+ Copyright Agent / Mitchel Resnick
+ MIT Media Laboratory
+ 77 Massachusetts Ave
+ Room E14-445A
+ Cambridge, MA 02139
+ Tel: (617) 253-9783 +

+

+

+

+

+
+
+ ); + } +}); + +render(, document.getElementById('app')); diff --git a/src/views/dmca/dmca.scss b/src/views/dmca/dmca.scss new file mode 100644 index 000000000..9431c95e6 --- /dev/null +++ b/src/views/dmca/dmca.scss @@ -0,0 +1,2 @@ +@import "../../colors"; +@import "../../typography"; diff --git a/src/views/dmca/l10n.json b/src/views/dmca/l10n.json new file mode 100644 index 000000000..784580a5a --- /dev/null +++ b/src/views/dmca/l10n.json @@ -0,0 +1,7 @@ +{ + "dmca.intro": "The Lifelong Kindergarten research group respects the intellectual property of others, as well as our users. If you believe that your work has been copied in a way that constitutes copyright infringement, please email copyright@scratch.mit.edu, or mail your complaint to the following:", + "dmca.llkresponse": "The Lifelong Kindergarten Group will promptly process and investigate notices of alleged infringement and will take appropriate actions under the Digital Millennium Copyright Act (“DMCA”) and other applicable intellectual property laws. Upon receipt of notices complying or substantially complying with the DMCA, the Lifelong Kindergarten Group may act expeditiously to remove or disable access to any material claimed to be infringing. Repeat infringers of third-party copyrights are subject to termination in appropriate circumstances.", + "dmca.assessment": "In assessing whether or not a Scratch user has violated your copyrights, please keep in mind that Scratch is an educational and not-for-profit initiative, seeking to aid children’s learning by providing the tools for them to learn and express themselves using digital technology. Please also keep in mind the “Fair Use” doctrine incorporated into the Copyright Act of 1976, 17 U.S.C. § 107.", + "dmca.eyetoeye": "We hope you also see Scratch not only as a good way of popularizing your creations/website but also as an opportunity to do something good for children’s education.", + "dmca.afterfiling": "If you choose to make a copyright infringement complaint, please note that we may post your notification, with personally identifiable information redacted, to a clearinghouse such as chillingeffects.org. Please also note that you may be liable for damages (including costs and attorneys’ fees) if you materially misrepresent that an activity is infringing your copyright." +} diff --git a/src/views/explore/explore.jsx b/src/views/explore/explore.jsx index 7a472137f..d2c0474ca 100644 --- a/src/views/explore/explore.jsx +++ b/src/views/explore/explore.jsx @@ -22,20 +22,25 @@ var Explore = injectIntl(React.createClass({ ], getDefaultProps: function () { var tabOptions = ['all','animations','art','games','music','stories']; + var typeOptions = ['projects','studios']; - var pathname = window.location.pathname; + var pathname = window.location.pathname.toLowerCase(); if (pathname.substring(pathname.length-1,pathname.length) == '/') { pathname = pathname.substring(0,pathname.length-1); } var slash = pathname.lastIndexOf('/'); - var currentTab = pathname.substring(slash+1,pathname.length).toLowerCase(); - if (tabOptions.indexOf(currentTab) == -1) { + var currentTab = pathname.substring(slash+1,pathname.length); + var typeStart = pathname.indexOf('explore/'); + var type = pathname.substring(typeStart+8,slash); + if (tabOptions.indexOf(currentTab) == -1 || typeOptions.indexOf(type) == -1) { window.location = window.location.origin + '/explore/projects/all/'; } return { tab: currentTab, acceptableTabs: tabOptions, + acceptableTypes: typeOptions, + itemType: type, loadNumber: 16 }; }, @@ -54,7 +59,8 @@ var Explore = injectIntl(React.createClass({ tabText = '&q=' + this.props.tab; } this.api({ - uri: '/search/projects?limit=' + this.props.loadNumber + '&offset=' + this.state.offset + tabText + uri: '/search/' + this.props.itemType + + '?limit=' + this.props.loadNumber + '&offset=' + this.state.offset + tabText }, function (err, body) { if (!err) { var loadedSoFar = this.state.loaded; @@ -65,8 +71,18 @@ var Explore = injectIntl(React.createClass({ } }.bind(this)); }, + changeItemType: function () { + var newType; + for each (var t in this.props.acceptableTypes) { + if (this.props.itemType != t) { + newType = t; + break; + } + } + window.location = window.location.origin + '/explore/'+newType+'/'+this.props.tab; + }, getTab: function (type) { - var allTab = + var allTab =
  • ; if (this.props.tab==type) { - allTab = + allTab =
  • -
    -