diff --git a/client/src/components/GamesTable/GamesTable.jsx b/client/src/components/GamesTable/GamesTable.jsx
index c7972cb..7eccca4 100644
--- a/client/src/components/GamesTable/GamesTable.jsx
+++ b/client/src/components/GamesTable/GamesTable.jsx
@@ -1,5 +1,6 @@
import React from 'react';
import DownloadButton from '../RemoteGames/DownloadButton.jsx'
+import ContentState from '../ContentState/ContentState.jsx'
import ISO6391 from 'iso-639-1'
@@ -187,12 +188,11 @@ export default class GamesTable extends React.Component {
: null
}
-
{
- game.has_errors && game.errors.length ?
- `${game.errors.length} errors `
- :
- game.state
- }
+ |
+
+
+
|
{
! game.existsLocally && this.props.remoteApi && this.props.localApi ?
diff --git a/model/game.json b/model/game.json
index ba2b250..94f2d24 100644
--- a/model/game.json
+++ b/model/game.json
@@ -79,7 +79,8 @@
"type": "array",
"minLength": 1,
"maxLength": 3,
- "enum" : [
+ "items" : {
+ "enum" : [
"Jeux de rôle",
"Identité secrete",
"Bluff",
@@ -99,7 +100,8 @@
"Traditionel",
"Wargame",
"Placement"
- ],
+ ]
+ },
"id": "mechanics",
"title": "Mechanics",
"description": "The mechanics that organize the way to play this game"
diff --git a/public/js/bundle.js b/public/js/bundle.js
index e754bd5..c371a9f 100644
--- a/public/js/bundle.js
+++ b/public/js/bundle.js
@@ -1982,7 +1982,7 @@
/* 323 */
/***/ (function(module, exports, __webpack_require__) {
- eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _EditableText = __webpack_require__(324);\n\nvar _EditableText2 = _interopRequireDefault(_EditableText);\n\nvar _FreeTagging = __webpack_require__(417);\n\nvar _FreeTagging2 = _interopRequireDefault(_FreeTagging);\n\nvar _MultiSelect = __webpack_require__(418);\n\nvar _MultiSelect2 = _interopRequireDefault(_MultiSelect);\n\nvar _Selector = __webpack_require__(419);\n\nvar _Selector2 = _interopRequireDefault(_Selector);\n\nvar _Number = __webpack_require__(420);\n\nvar _Number2 = _interopRequireDefault(_Number);\n\nvar _FilesList = __webpack_require__(421);\n\nvar _FilesList2 = _interopRequireDefault(_FilesList);\n\nvar _iso = __webpack_require__(424);\n\nvar _iso2 = _interopRequireDefault(_iso);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar requirements = [{\n name: \"Nothing.\",\n value: \"nothing\"\n}, {\n name: \"Office (printer, stationery...)\",\n value: \"print\"\n}, {\n name: \"Wood Workshop (saw, hammer, wood...)\",\n value: \"wood\"\n}, {\n name: \"Fab Lab (3D printer, laser cutter...)\",\n value: \"fablab\"\n}];\n\nvar ages = [{ name: \"Children\", value: \"Children\" }, { name: \"Teenagers\", value: \"Teenagers\" }, { name: \"Adults\", value: \"Adults\" }];\n\n// 50 last years\nvar years = [].concat(_toConsumableArray(Array(50).fill(0).map(function (d, i) {\n var y = new Date().getFullYear() - i;\n return { name: y, value: y };\n})));\n\n// languages code\nvar languages = _iso2.default.getLanguages(_iso2.default.getAllCodes()).map(function (d) {\n return { name: d.name, value: d.code };\n}\n\n// licences\n);var licenses = [\"CC0\", \"CC BY-NC-SA 4.0\", \"Public Domain\", \"No License\", \"Unknown\"].map(function (d) {\n return { name: d, value: d };\n});\n\nvar GameForm = function (_React$Component) {\n _inherits(GameForm, _React$Component);\n\n function GameForm() {\n _classCallCheck(this, GameForm);\n\n return _possibleConstructorReturn(this, (GameForm.__proto__ || Object.getPrototypeOf(GameForm)).apply(this, arguments));\n }\n\n _createClass(GameForm, [{\n key: 'updateGame',\n value: function updateGame(game) {\n this.props.updateGame(game);\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var _props$game = this.props.game,\n audience = _props$game.audience,\n credentials = _props$game.credentials,\n description = _props$game.description,\n fabrication = _props$game.fabrication,\n source = _props$game.source,\n timestamp_add = _props$game.timestamp_add,\n title = _props$game.title,\n content_type = _props$game.content_type;\n var _props = this.props,\n editMode = _props.editMode,\n errors = _props.errors;\n\n // TODO : make title editable\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'h1',\n null,\n _react2.default.createElement(_EditableText2.default, {\n type: 'input',\n text: title,\n error: errors[\"title\"],\n editing: editMode,\n placeholder: 'Add a title...',\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.title = d;\n _this2.updateGame(game);\n }\n })\n ),\n _react2.default.createElement(_EditableText2.default, {\n type: 'textarea',\n text: description.summary,\n placeholder: 'Add a description...',\n error: errors[\"description.summary\"],\n editing: editMode,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.description.summary = d;\n _this2.updateGame(game);\n }\n }),\n _react2.default.createElement(\n 'p',\n null,\n 'Webpage:',\n !editMode ? _react2.default.createElement(\n 'a',\n { href: source.url, target: '_blank' },\n source.url\n ) : _react2.default.createElement(_EditableText2.default, {\n type: 'input',\n text: source.url,\n error: errors[\"source.url\"],\n fieldType: 'url',\n editing: editMode,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.source.url = d;\n _this2.updateGame(game);\n }\n }),\n _react2.default.createElement('br', null),\n 'Under license :',\n _react2.default.createElement(_Selector2.default, {\n editing: editMode,\n value: credentials.license,\n error: errors[\"credentials.license\"],\n options: licenses,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.credentials.license = d;\n _this2.updateGame(game);\n }\n }),\n _react2.default.createElement('br', null),\n 'Published in :',\n _react2.default.createElement(_Selector2.default, {\n editing: editMode,\n value: credentials.publication_year,\n error: errors[\"credentials.publication_year\"],\n options: years,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n var year = parseInt(d);\n game.credentials.publication_year = year;\n _this2.updateGame(game);\n }\n })\n ),\n _react2.default.createElement('hr', null),\n _react2.default.createElement(\n 'div',\n { className: 'row' },\n _react2.default.createElement(\n 'div',\n { className: 'six columns' },\n _react2.default.createElement(\n 'p',\n null,\n 'Language:',\n _react2.default.createElement(_Selector2.default, {\n editing: editMode,\n value: audience.language,\n error: errors[\"audience.language\"],\n options: languages,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.audience.language = d;\n _this2.updateGame(game);\n }\n }),\n _react2.default.createElement('br', null),\n 'Number of players :',\n editMode ? \" (minimum)\" : null,\n _react2.default.createElement(_Number2.default, {\n editing: editMode,\n value: audience.number_of_players.players_min,\n error: errors[\"audience.number_of_players.players_min\"],\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.audience.number_of_players.players_min = d;\n _this2.updateGame(game);\n }\n }),\n '-',\n editMode ? \"Number_of_players (maximum)\" : null,\n _react2.default.createElement(_Number2.default, {\n editing: editMode,\n value: audience.number_of_players.players_max,\n error: errors[\"audience.number_of_players.players_max\"],\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.audience.number_of_players.players_max = d;\n _this2.updateGame(game);\n }\n }),\n _react2.default.createElement('br', null),\n 'Duration of each play (minutes):',\n _react2.default.createElement(_Number2.default, {\n editing: editMode,\n value: audience.duration,\n error: errors[\"audience.duration\"],\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.audience.duration = d;\n _this2.updateGame(game);\n }\n })\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'six columns' },\n editMode ? \"Audience Age\" : null,\n _react2.default.createElement(_MultiSelect2.default, {\n value: audience.age,\n error: errors[\"audience.age\"],\n options: ages,\n editing: editMode,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.audience.age = d;\n _this2.updateGame(game);\n }\n })\n )\n ),\n _react2.default.createElement('hr', null),\n _react2.default.createElement(\n 'div',\n { className: 'row' },\n _react2.default.createElement(\n 'div',\n { className: 'six columns' },\n !editMode ? _react2.default.createElement(\n 'h5',\n null,\n 'Fabrication time : ',\n fabrication.fab_time,\n ' minutes '\n ) : _react2.default.createElement(\n 'p',\n null,\n 'Fabrication time (minutes):',\n _react2.default.createElement(_Number2.default, {\n editing: editMode,\n error: errors[\"fabrication.fab_time\"],\n value: fabrication.fab_time,\n fieldId: 'fabrication.fab_time',\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.fabrication.fab_time = d;\n _this2.updateGame(game);\n }\n })\n ),\n _react2.default.createElement(\n 'h5',\n null,\n 'Requirements'\n ),\n _react2.default.createElement(_MultiSelect2.default, {\n value: fabrication.requirements,\n error: errors[\"fabrication.requirements\"],\n options: requirements,\n editing: editMode,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.fabrication.requirements = d;\n _this2.updateGame(game);\n }\n })\n ),\n _react2.default.createElement(\n 'div',\n { className: 'six columns' },\n _react2.default.createElement(\n 'h5',\n null,\n 'Download files'\n ),\n _react2.default.createElement(_FilesList2.default, {\n files: this.props.files,\n newFiles: this.props.newFiles,\n editing: editMode,\n handleFileUpload: this.props.handleFileUpload,\n handleDeleteFile: this.props.handleDeleteFile,\n handleAddFiles: function handleAddFiles(files) {\n return _this2.props.handleAddFiles(files);\n }\n })\n )\n ),\n _react2.default.createElement('hr', null),\n _react2.default.createElement(\n 'div',\n { className: 'row' },\n _react2.default.createElement(\n 'div',\n { className: 'four columns' },\n _react2.default.createElement(\n 'p',\n null,\n 'Authors'\n ),\n _react2.default.createElement(_FreeTagging2.default, {\n items: credentials.authors,\n editing: editMode,\n error: errors[\"credentials.authors\"],\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.credentials.authors = d;\n _this2.updateGame(game);\n }\n })\n ),\n _react2.default.createElement(\n 'div',\n { className: 'four columns' },\n _react2.default.createElement(\n 'p',\n null,\n 'Illustrators'\n ),\n _react2.default.createElement(_FreeTagging2.default, {\n items: credentials.illustrators,\n error: errors[\"credentials.illustrators\"],\n editing: editMode,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.credentials.illustrators = d;\n _this2.updateGame(game);\n }\n })\n ),\n _react2.default.createElement(\n 'div',\n { className: 'four columns' },\n _react2.default.createElement(\n 'p',\n null,\n 'Publishers'\n ),\n _react2.default.createElement(_FreeTagging2.default, {\n items: credentials.publishers,\n error: errors[\"credentials.publishers\"],\n editing: editMode,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.credentials.publishers = d;\n _this2.updateGame(game);\n }\n })\n )\n ),\n _react2.default.createElement('hr', null),\n _react2.default.createElement(\n 'p',\n null,\n content_type,\n ' added on ',\n timestamp_add,\n '.'\n )\n );\n }\n }]);\n\n return GameForm;\n}(_react2.default.Component);\n\n// helper from http://stackoverflow.com/questions/6491463/accessing-nested-javascript-objects-with-string-key\n\nexports.default = GameForm;\nObject.byString = function (o, s) {\n s = s.replace(/\\[(\\w+)\\]/g, '.$1'); // convert indexes to properties\n s = s.replace(/^\\./, ''); // strip a leading dot\n var a = s.split('.');\n for (var i = 0, n = a.length; i < n; ++i) {\n var k = a[i];\n if (k in o) {\n o = o[k];\n } else {\n return;\n }\n }\n return o;\n};\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/GameForm/GameForm.jsx\n// module id = 323\n// module chunks = 0\n//# sourceURL=webpack:///./src/components/GameForm/GameForm.jsx?");
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _EditableText = __webpack_require__(324);\n\nvar _EditableText2 = _interopRequireDefault(_EditableText);\n\nvar _FreeTagging = __webpack_require__(417);\n\nvar _FreeTagging2 = _interopRequireDefault(_FreeTagging);\n\nvar _MultiSelect = __webpack_require__(418);\n\nvar _MultiSelect2 = _interopRequireDefault(_MultiSelect);\n\nvar _Selector = __webpack_require__(419);\n\nvar _Selector2 = _interopRequireDefault(_Selector);\n\nvar _Number = __webpack_require__(420);\n\nvar _Number2 = _interopRequireDefault(_Number);\n\nvar _FilesList = __webpack_require__(421);\n\nvar _FilesList2 = _interopRequireDefault(_FilesList);\n\nvar _iso = __webpack_require__(424);\n\nvar _iso2 = _interopRequireDefault(_iso);\n\nvar _ContentState = __webpack_require__(984);\n\nvar _ContentState2 = _interopRequireDefault(_ContentState);\n\nvar _game = __webpack_require__(928);\n\nvar _game2 = _interopRequireDefault(_game);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar requirements = _game2.default.properties.fabrication.properties.requirements.items.enum.map(function (d) {\n return { value: d, name: d };\n});\n\nvar licenses = _game2.default.properties.credentials.properties.license.enum.map(function (d) {\n return { name: d, value: d };\n});\n\nvar intentions = _game2.default.properties.description.properties.intention.enum.map(function (d) {\n return { name: d, value: d };\n});\n\nvar gameplays = _game2.default.properties.description.properties.gameplay.enum.map(function (d) {\n return { name: d, value: d };\n});\n\nvar gametypes = _game2.default.properties.description.properties.type.enum.map(function (d) {\n return { name: d, value: d };\n});\n\nvar mechanics = _game2.default.properties.description.properties.mechanics.items.enum.map(function (d) {\n return { name: d, value: d };\n});\n\nvar ages = _game2.default.properties.audience.properties.age.items.enum.map(function (d) {\n return { name: d, value: d };\n}\n\n// 50 last years\n);var years = [].concat(_toConsumableArray(Array(50).fill(0).map(function (d, i) {\n var y = new Date().getFullYear() - i;\n return { name: y, value: y };\n})));\n\n// languages code\nvar languages = _iso2.default.getLanguages(_iso2.default.getAllCodes()).map(function (d) {\n return { name: d.name, value: d.code };\n});\n\nvar GameForm = function (_React$Component) {\n _inherits(GameForm, _React$Component);\n\n function GameForm() {\n _classCallCheck(this, GameForm);\n\n return _possibleConstructorReturn(this, (GameForm.__proto__ || Object.getPrototypeOf(GameForm)).apply(this, arguments));\n }\n\n _createClass(GameForm, [{\n key: 'updateGame',\n value: function updateGame(game) {\n this.props.updateGame(game);\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var _props$game = this.props.game,\n audience = _props$game.audience,\n credentials = _props$game.credentials,\n description = _props$game.description,\n fabrication = _props$game.fabrication,\n source = _props$game.source,\n state = _props$game.state,\n timestamp_add = _props$game.timestamp_add,\n title = _props$game.title,\n content_type = _props$game.content_type;\n var _props = this.props,\n editMode = _props.editMode,\n errors = _props.errors;\n\n // TODO : make title editable\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'h1',\n null,\n _react2.default.createElement(_EditableText2.default, {\n type: 'input',\n text: title,\n error: errors[\"title\"],\n editing: editMode,\n placeholder: 'Add a title...',\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.title = d;\n _this2.updateGame(game);\n }\n })\n ),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement(_ContentState2.default, {\n state: state,\n errors: this.props.game.errors\n })\n ),\n _react2.default.createElement(_EditableText2.default, {\n type: 'textarea',\n text: description.summary,\n placeholder: 'Add a description...',\n error: errors[\"description.summary\"],\n editing: editMode,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.description.summary = d;\n _this2.updateGame(game);\n }\n }),\n _react2.default.createElement(\n 'p',\n null,\n 'Webpage:',\n !editMode ? _react2.default.createElement(\n 'a',\n { href: source.url, target: '_blank' },\n source.url\n ) : _react2.default.createElement(_EditableText2.default, {\n type: 'input',\n text: source.url,\n error: errors[\"source.url\"],\n fieldType: 'url',\n editing: editMode,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.source.url = d;\n _this2.updateGame(game);\n }\n }),\n _react2.default.createElement('br', null),\n 'Under license :',\n _react2.default.createElement(_Selector2.default, {\n editing: editMode,\n value: credentials.license,\n error: errors[\"credentials.license\"],\n options: licenses,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.credentials.license = d;\n _this2.updateGame(game);\n }\n }),\n _react2.default.createElement('br', null),\n 'Published in :',\n _react2.default.createElement(_Selector2.default, {\n editing: editMode,\n value: credentials.publication_year,\n error: errors[\"credentials.publication_year\"],\n options: years,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n var year = parseInt(d);\n game.credentials.publication_year = year;\n _this2.updateGame(game);\n }\n })\n ),\n _react2.default.createElement('hr', null),\n _react2.default.createElement(\n 'p',\n null,\n _react2.default.createElement('br', null),\n 'Intention',\n _react2.default.createElement(_Selector2.default, {\n editing: editMode,\n value: description.intention,\n error: errors[\"description.intention\"],\n options: intentions,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.description.intention = d;\n _this2.updateGame(game);\n }\n }),\n _react2.default.createElement('br', null),\n 'Gameplay',\n _react2.default.createElement(_Selector2.default, {\n editing: editMode,\n value: description.gameplay,\n error: errors[\"description.gameplay\"],\n options: gameplays,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.description.gameplay = d;\n _this2.updateGame(game);\n }\n }),\n 'Type',\n _react2.default.createElement(_Selector2.default, {\n editing: editMode,\n value: description.type,\n error: errors[\"description.type\"],\n options: gametypes,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.description.gameplay = d;\n _this2.updateGame(game);\n }\n }),\n _react2.default.createElement('br', null),\n 'Mechanics',\n _react2.default.createElement(_MultiSelect2.default, {\n editing: editMode,\n value: description.mechanics,\n error: errors[\"description.mechanics\"],\n options: mechanics,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.description.mechanics = d;\n _this2.updateGame(game);\n }\n }),\n _react2.default.createElement('br', null),\n 'Tags',\n _react2.default.createElement(_FreeTagging2.default, {\n items: description.tags,\n editing: editMode,\n error: errors[\"description.tags\"],\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.description.tags = d;\n _this2.updateGame(game);\n }\n })\n ),\n _react2.default.createElement('hr', null),\n _react2.default.createElement(\n 'div',\n { className: 'row' },\n _react2.default.createElement(\n 'div',\n { className: 'six columns' },\n _react2.default.createElement(\n 'p',\n null,\n 'Language:',\n _react2.default.createElement(_Selector2.default, {\n editing: editMode,\n value: audience.language,\n error: errors[\"audience.language\"],\n options: languages,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.audience.language = d;\n _this2.updateGame(game);\n }\n }),\n _react2.default.createElement('br', null),\n 'Number of players :',\n editMode ? \" (minimum)\" : null,\n _react2.default.createElement(_Number2.default, {\n editing: editMode,\n value: audience.number_of_players.players_min,\n error: errors[\"audience.number_of_players.players_min\"],\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.audience.number_of_players.players_min = d;\n _this2.updateGame(game);\n }\n }),\n '-',\n editMode ? \"Number_of_players (maximum)\" : null,\n _react2.default.createElement(_Number2.default, {\n editing: editMode,\n value: audience.number_of_players.players_max,\n error: errors[\"audience.number_of_players.players_max\"],\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.audience.number_of_players.players_max = d;\n _this2.updateGame(game);\n }\n }),\n _react2.default.createElement('br', null),\n 'Duration of each play (minutes):',\n _react2.default.createElement(_Number2.default, {\n editing: editMode,\n value: audience.duration,\n error: errors[\"audience.duration\"],\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.audience.duration = d;\n _this2.updateGame(game);\n }\n })\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'six columns' },\n editMode ? \"Audience Age\" : null,\n _react2.default.createElement(_MultiSelect2.default, {\n value: audience.age,\n error: errors[\"audience.age\"],\n options: ages,\n editing: editMode,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.audience.age = d;\n _this2.updateGame(game);\n }\n })\n )\n ),\n _react2.default.createElement('hr', null),\n _react2.default.createElement(\n 'div',\n { className: 'row' },\n _react2.default.createElement(\n 'div',\n { className: 'six columns' },\n !editMode ? _react2.default.createElement(\n 'h5',\n null,\n 'Fabrication time : ',\n fabrication.fab_time,\n ' minutes '\n ) : _react2.default.createElement(\n 'p',\n null,\n 'Fabrication time (minutes):',\n _react2.default.createElement(_Number2.default, {\n editing: editMode,\n error: errors[\"fabrication.fab_time\"],\n value: fabrication.fab_time,\n fieldId: 'fabrication.fab_time',\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.fabrication.fab_time = d;\n _this2.updateGame(game);\n }\n })\n ),\n _react2.default.createElement(\n 'h5',\n null,\n 'Requirements'\n ),\n _react2.default.createElement(_MultiSelect2.default, {\n value: fabrication.requirements,\n error: errors[\"fabrication.requirements\"],\n options: requirements,\n editing: editMode,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.fabrication.requirements = d;\n _this2.updateGame(game);\n }\n })\n ),\n _react2.default.createElement(\n 'div',\n { className: 'six columns' },\n _react2.default.createElement(\n 'h5',\n null,\n 'Download files'\n ),\n _react2.default.createElement(_FilesList2.default, {\n files: this.props.files,\n newFiles: this.props.newFiles,\n editing: editMode,\n handleFileUpload: this.props.handleFileUpload,\n handleDeleteFile: this.props.handleDeleteFile,\n handleAddFiles: function handleAddFiles(files) {\n return _this2.props.handleAddFiles(files);\n }\n })\n )\n ),\n _react2.default.createElement('hr', null),\n _react2.default.createElement(\n 'div',\n { className: 'row' },\n _react2.default.createElement(\n 'div',\n { className: 'four columns' },\n _react2.default.createElement(\n 'p',\n null,\n 'Authors'\n ),\n _react2.default.createElement(_FreeTagging2.default, {\n items: credentials.authors,\n editing: editMode,\n error: errors[\"credentials.authors\"],\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.credentials.authors = d;\n _this2.updateGame(game);\n }\n })\n ),\n _react2.default.createElement(\n 'div',\n { className: 'four columns' },\n _react2.default.createElement(\n 'p',\n null,\n 'Illustrators'\n ),\n _react2.default.createElement(_FreeTagging2.default, {\n items: credentials.illustrators,\n error: errors[\"credentials.illustrators\"],\n editing: editMode,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.credentials.illustrators = d;\n _this2.updateGame(game);\n }\n })\n ),\n _react2.default.createElement(\n 'div',\n { className: 'four columns' },\n _react2.default.createElement(\n 'p',\n null,\n 'Publishers'\n ),\n _react2.default.createElement(_FreeTagging2.default, {\n items: credentials.publishers,\n error: errors[\"credentials.publishers\"],\n editing: editMode,\n handleChange: function handleChange(d) {\n var game = _this2.props.game;\n game.credentials.publishers = d;\n _this2.updateGame(game);\n }\n })\n )\n ),\n _react2.default.createElement('hr', null),\n _react2.default.createElement(\n 'p',\n null,\n content_type,\n ' added on ',\n timestamp_add,\n '.'\n )\n );\n }\n }]);\n\n return GameForm;\n}(_react2.default.Component);\n\n// helper from http://stackoverflow.com/questions/6491463/accessing-nested-javascript-objects-with-string-key\n\nexports.default = GameForm;\nObject.byString = function (o, s) {\n s = s.replace(/\\[(\\w+)\\]/g, '.$1'); // convert indexes to properties\n s = s.replace(/^\\./, ''); // strip a leading dot\n var a = s.split('.');\n for (var i = 0, n = a.length; i < n; ++i) {\n var k = a[i];\n if (k in o) {\n o = o[k];\n } else {\n return;\n }\n }\n return o;\n};\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/GameForm/GameForm.jsx\n// module id = 323\n// module chunks = 0\n//# sourceURL=webpack:///./src/components/GameForm/GameForm.jsx?");
/***/ }),
/* 324 */
@@ -2552,13 +2552,13 @@
/* 418 */
/***/ (function(module, exports, __webpack_require__) {
- eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar styleLi = {\n // display : \"inline\",\n padding: \"0 .5em\",\n margin: \".5em \",\n width: \"auto\",\n lineHeight: \"2.5em\",\n display: \"inline-block\",\n border: \"1px solid #ccc\"\n},\n styleUl = { listStyle: \"none\" };\n\nvar MultiSelect = function (_React$Component) {\n _inherits(MultiSelect, _React$Component);\n\n function MultiSelect(props) {\n _classCallCheck(this, MultiSelect);\n\n // parse display name\n var _this = _possibleConstructorReturn(this, (MultiSelect.__proto__ || Object.getPrototypeOf(MultiSelect)).call(this, props));\n\n _this.opts = {};\n _this.props.options.map(function (d) {\n return _this.opts[d.value] = d.name;\n });\n return _this;\n }\n\n _createClass(MultiSelect, [{\n key: \"handleChange\",\n value: function handleChange(e) {\n var items = [].concat(_toConsumableArray(e.target.options)).filter(function (o) {\n return o.selected;\n }).map(function (o) {\n return o.value;\n });\n\n this.props.handleChange(items);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n\n var lis = this.props.value ? this.props.value.map(function (item, i) {\n return _react2.default.createElement(\n \"li\",\n { key: i,\n style: styleLi\n },\n _this2.opts[item]\n );\n }) : null;\n\n var options = this.props.options.map(function (item, i) {\n return _react2.default.createElement(\n \"option\",\n { key: i, value: item.value },\n item.name\n );\n });\n\n return _react2.default.createElement(\n \"span\",\n null,\n this.props.editing ? _react2.default.createElement(\n \"select\",\n {\n multiple: true,\n size: 8,\n style: { height: '20%' },\n onChange: function onChange(e) {\n return _this2.handleChange(e);\n },\n value: this.props.value\n },\n options\n ) : _react2.default.createElement(\n \"ul\",\n { style: styleUl },\n lis\n )\n );\n }\n }]);\n\n return MultiSelect;\n}(_react2.default.Component);\n\nexports.default = MultiSelect;\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Form/MultiSelect.jsx\n// module id = 418\n// module chunks = 0\n//# sourceURL=webpack:///./src/components/Form/MultiSelect.jsx?");
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar styleLi = {\n // display : \"inline\",\n padding: \"0 .5em\",\n margin: \".5em \",\n width: \"auto\",\n lineHeight: \"2.5em\",\n display: \"inline-block\",\n border: \"1px solid #ccc\"\n},\n styleUl = { listStyle: \"none\" };\n\nvar MultiSelect = function (_React$Component) {\n _inherits(MultiSelect, _React$Component);\n\n function MultiSelect(props) {\n _classCallCheck(this, MultiSelect);\n\n // parse display name\n var _this = _possibleConstructorReturn(this, (MultiSelect.__proto__ || Object.getPrototypeOf(MultiSelect)).call(this, props));\n\n _this.opts = {};\n _this.props.options.map(function (d) {\n return _this.opts[d.value] = d.name;\n });\n return _this;\n }\n\n _createClass(MultiSelect, [{\n key: \"handleChange\",\n value: function handleChange(e) {\n var items = [].concat(_toConsumableArray(e.target.options)).filter(function (o) {\n return o.selected;\n }).map(function (o) {\n return o.value;\n });\n\n this.props.handleChange(items);\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n\n var error = this.props.error ? _react2.default.createElement(\n \"span\",\n { style: { fontSize: '10pt', color: 'red' } },\n this.props.error\n ) : null;\n\n var lis = this.props.value ? this.props.value.map(function (item, i) {\n return _react2.default.createElement(\n \"li\",\n { key: i,\n style: styleLi\n },\n _this2.opts[item]\n );\n }) : null;\n\n var options = this.props.options.map(function (item, i) {\n return _react2.default.createElement(\n \"option\",\n { key: i, value: item.value },\n item.name\n );\n });\n\n var style = { height: '20%' };\n\n return _react2.default.createElement(\n \"span\",\n null,\n this.props.editing ? _react2.default.createElement(\n \"select\",\n {\n multiple: true,\n size: 8,\n style: this.props.error ? Object.assign(style, { borderColor: 'red' }) : style,\n onChange: function onChange(e) {\n return _this2.handleChange(e);\n },\n value: this.props.value\n },\n options\n ) : _react2.default.createElement(\n \"ul\",\n { style: styleUl },\n lis\n ),\n this.props.error ? error : null\n );\n }\n }]);\n\n return MultiSelect;\n}(_react2.default.Component);\n\nexports.default = MultiSelect;\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Form/MultiSelect.jsx\n// module id = 418\n// module chunks = 0\n//# sourceURL=webpack:///./src/components/Form/MultiSelect.jsx?");
/***/ }),
/* 419 */
/***/ (function(module, exports, __webpack_require__) {
- eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Selector = function (_React$Component) {\n _inherits(Selector, _React$Component);\n\n function Selector(props) {\n _classCallCheck(this, Selector);\n\n // parse display name\n var _this = _possibleConstructorReturn(this, (Selector.__proto__ || Object.getPrototypeOf(Selector)).call(this, props));\n\n _this.opts = {};\n _this.props.options.map(function (d) {\n return _this.opts[d.value] = d.name;\n });\n return _this;\n }\n\n _createClass(Selector, [{\n key: 'handleChange',\n value: function handleChange(e) {\n this.props.handleChange(e.target.value);\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var _props = this.props,\n editing = _props.editing,\n value = _props.value,\n options = _props.options;\n\n\n var optionsTags = this.props.options.map(function (o, i) {\n return _react2.default.createElement(\n 'option',\n { key: i, value: o.value },\n o.name\n );\n });\n var error = this.props.error ? _react2.default.createElement(\n 'span',\n { style: { fontSize: '10pt', color: 'red' } },\n this.props.error\n ) : null;\n\n return editing ? _react2.default.createElement(\n 'span',\n null,\n _react2.default.createElement(\n 'select',\n {\n style: this.props.error ? { borderColor: 'red' } : null,\n value: value,\n onChange: function onChange(e) {\n return _this2.handleChange(e);\n }\n },\n _react2.default.createElement('option', { value: null }),\n optionsTags\n ),\n error\n ) : _react2.default.createElement(\n 'span',\n null,\n this.opts[value]\n );\n }\n }]);\n\n return Selector;\n}(_react2.default.Component);\n\nexports.default = Selector;\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Form/Selector.jsx\n// module id = 419\n// module chunks = 0\n//# sourceURL=webpack:///./src/components/Form/Selector.jsx?");
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Selector = function (_React$Component) {\n _inherits(Selector, _React$Component);\n\n function Selector(props) {\n _classCallCheck(this, Selector);\n\n // parse display name\n var _this = _possibleConstructorReturn(this, (Selector.__proto__ || Object.getPrototypeOf(Selector)).call(this, props));\n\n _this.opts = {};\n _this.props.options.map(function (d) {\n return _this.opts[d.value] = d.name;\n });\n return _this;\n }\n\n _createClass(Selector, [{\n key: 'handleChange',\n value: function handleChange(e) {\n this.props.handleChange(e.target.value);\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var _props = this.props,\n editing = _props.editing,\n value = _props.value,\n options = _props.options;\n\n\n var optionsTags = this.props.options.map(function (o, i) {\n return _react2.default.createElement(\n 'option',\n { key: i, value: o.value },\n o.name\n );\n });\n\n var error = this.props.error ? _react2.default.createElement(\n 'span',\n { style: { fontSize: '10pt', color: 'red' } },\n this.props.error\n ) : null;\n\n return editing ? _react2.default.createElement(\n 'span',\n null,\n _react2.default.createElement(\n 'select',\n {\n style: this.props.error ? { borderColor: 'red' } : null,\n value: value,\n onChange: function onChange(e) {\n return _this2.handleChange(e);\n }\n },\n _react2.default.createElement('option', { value: null }),\n optionsTags\n ),\n error\n ) : _react2.default.createElement(\n 'span',\n null,\n this.opts[value]\n );\n }\n }]);\n\n return Selector;\n}(_react2.default.Component);\n\nexports.default = Selector;\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Form/Selector.jsx\n// module id = 419\n// module chunks = 0\n//# sourceURL=webpack:///./src/components/Form/Selector.jsx?");
/***/ }),
/* 420 */
@@ -5612,13 +5612,13 @@
/* 928 */
/***/ (function(module, exports) {
- eval("module.exports = {\n\t\"$schema\": \"http://json-schema.org/draft-04/schema#\",\n\t\"title\": \"Ludobox Game\",\n\t\"description\": \"A game for Ludobox's catalog\",\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"title\": {\n\t\t\t\"type\": \"string\",\n\t\t\t\"minLength\": 1,\n\t\t\t\"id\": \"title\",\n\t\t\t\"title\": \"Title\",\n\t\t\t\"description\": \"The title of the game\"\n\t\t},\n\t\t\"description\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"Description of the game\",\n\t\t\t\"properties\": {\n\t\t\t\t\"summary\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\"id\": \"summary\",\n\t\t\t\t\t\"title\": \"Summary\",\n\t\t\t\t\t\"description\": \"Desribe the content of the game\"\n\t\t\t\t},\n\t\t\t\t\"tags\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"uniqueItems\": true,\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\t\"default\": \"Game\"\n\t\t\t\t\t},\n\t\t\t\t\t\"id\": \"tags\",\n\t\t\t\t\t\"title\": \"Tags\",\n\t\t\t\t\t\"description\": \"Free-tagging to describe the game content\"\n\t\t\t\t},\n\t\t\t\t\"intention\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"Loisir\",\n\t\t\t\t\t\t\"Militant\",\n\t\t\t\t\t\t\"Pédagogique\",\n\t\t\t\t\t\t\"Publicitaire\",\n\t\t\t\t\t\t\"Institutionel\",\n\t\t\t\t\t\t\"Experimental\"\n\t\t\t\t\t],\n\t\t\t\t\t\"id\": \"intention\",\n\t\t\t\t\t\"title\": \"Intention\",\n\t\t\t\t\t\"description\": \"The intention that created the game\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"Indoor game\",\n\t\t\t\t\t\t\"Toys\",\n\t\t\t\t\t\t\"Outdoor game\",\n\t\t\t\t\t\t\"Construction\",\n\t\t\t\t\t\t\"Design Kit\"\n\t\t\t\t\t],\n\t\t\t\t\t\"id\": \"intention\",\n\t\t\t\t\t\"title\": \"Intention\",\n\t\t\t\t\t\"description\": \"The intention that created the game\"\n\t\t\t\t},\n\t\t\t\t\"gameplay\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"Individuel\",\n\t\t\t\t\t\t\"En équipe\",\n\t\t\t\t\t\t\"Cooperatif\"\n\t\t\t\t\t],\n\t\t\t\t\t\"id\": \"gameplay\",\n\t\t\t\t\t\"title\": \"Gameplay\",\n\t\t\t\t\t\"description\": \"The game play\"\n\t\t\t\t},\n\t\t\t\t\"mechanics\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\"maxLength\": 3,\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"Jeux de rôle\",\n\t\t\t\t\t\t\"Identité secrete\",\n\t\t\t\t\t\t\"Bluff\",\n\t\t\t\t\t\t\"Stop ou encore\",\n\t\t\t\t\t\t\"Gestion\",\n\t\t\t\t\t\t\"Enchères\",\n\t\t\t\t\t\t\"Programmation\",\n\t\t\t\t\t\t\"Abstrait\",\n\t\t\t\t\t\t\"Parcours\",\n\t\t\t\t\t\t\"Hasard\",\n\t\t\t\t\t\t\"Construction\",\n\t\t\t\t\t\t\"Dexterité\",\n\t\t\t\t\t\t\"Narratif\",\n\t\t\t\t\t\t\"Rapidite\",\n\t\t\t\t\t\t\"Enquetes\",\n\t\t\t\t\t\t\"Enigme\",\n\t\t\t\t\t\t\"Traditionel\",\n\t\t\t\t\t\t\"Wargame\",\n\t\t\t\t\t\t\"Placement\"\n\t\t\t\t\t],\n\t\t\t\t\t\"id\": \"mechanics\",\n\t\t\t\t\t\"title\": \"Mechanics\",\n\t\t\t\t\t\"description\": \"The mechanics that organize the way to play this game\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"credentials\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"Credentials - who created this game ?\",\n\t\t\t\"properties\": {\n\t\t\t\t\"license\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\"default\": \"Unknown\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"Commercial use allowed\",\n\t\t\t\t\t\t\"Modifications allowed\",\n\t\t\t\t\t\t\"Commercial use & mods allowed\",\n\t\t\t\t\t\t\"No known copyright restrictions\",\n\t\t\t\t\t\t\"Public Domain\",\n\t\t\t\t\t\t\"No License\"\n\t\t\t\t\t],\n\t\t\t\t\t\"id\": \"license\",\n\t\t\t\t\t\"title\": \"License\",\n\t\t\t\t\t\"description\": \"The license\"\n\t\t\t\t},\n\t\t\t\t\"publishers\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"uniqueItems\": false,\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\"minLength\": 1\n\t\t\t\t\t},\n\t\t\t\t\t\"id\": \"publishers\",\n\t\t\t\t\t\"title\": \"Publisher(s)\",\n\t\t\t\t\t\"description\": \"Who published this game?\"\n\t\t\t\t},\n\t\t\t\t\"publication_year\": {\n\t\t\t\t\t\"type\": \"integer\",\n\t\t\t\t\t\"multipleOf\": 1,\n\t\t\t\t\t\"maximum\": 2100,\n\t\t\t\t\t\"minimum\": 1,\n\t\t\t\t\t\"exclusiveMaximum\": false,\n\t\t\t\t\t\"exclusiveMinimum\": false,\n\t\t\t\t\t\"default\": 1900,\n\t\t\t\t\t\"id\": \"publication_year\",\n\t\t\t\t\t\"title\": \"Publication Year\",\n\t\t\t\t\t\"description\": \"When was this game published ?\"\n\t\t\t\t},\n\t\t\t\t\"authors\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"uniqueItems\": false,\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\"minLength\": 1\n\t\t\t\t\t},\n\t\t\t\t\t\"id\": \"authors\",\n\t\t\t\t\t\"title\": \"Authors\",\n\t\t\t\t\t\"description\": \"Who are the authors ?\"\n\t\t\t\t},\n\t\t\t\t\"illustrators\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"uniqueItems\": false,\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\"minLength\": 1\n\t\t\t\t\t},\n\t\t\t\t\t\"id\": \"illustrators\",\n\t\t\t\t\t\"title\": \"Illustrators / Artists\",\n\t\t\t\t\t\"description\": \"Who are the illustrators and artists ?\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"license\"\n\t\t\t]\n\t\t},\n\t\t\"audience\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"Audience - who should play this game ?\",\n\t\t\t\"properties\": {\n\t\t\t\t\"age\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\"Children\",\n\t\t\t\t\t\t\t\"Teenagers\",\n\t\t\t\t\t\t\t\"Adults\"\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t\"id\": \"age\",\n\t\t\t\t\t\"uniqueItems\": true,\n\t\t\t\t\t\"title\": \"Age Requirements\",\n\t\t\t\t\t\"description\": \"Who should play this game ?\"\n\t\t\t\t},\n\t\t\t\t\"number_of_players\": {\n\t\t\t\t\t\"type\": \"object\",\n\t\t\t\t\t\"title\": \"Number of Players\",\n\t\t\t\t\t\"properties\": {\n\t\t\t\t\t\t\"players_min\": {\n\t\t\t\t\t\t\t\"type\": \"integer\",\n\t\t\t\t\t\t\t\"multipleOf\": 1,\n\t\t\t\t\t\t\t\"maximum\": 100,\n\t\t\t\t\t\t\t\"minimum\": 1,\n\t\t\t\t\t\t\t\"exclusiveMaximum\": false,\n\t\t\t\t\t\t\t\"exclusiveMinimum\": false,\n\t\t\t\t\t\t\t\"default\": 3,\n\t\t\t\t\t\t\t\"id\": \"players_min\",\n\t\t\t\t\t\t\t\"title\": \"Max numbers of players\",\n\t\t\t\t\t\t\t\"description\": \"Maximum number of players\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"players_max\": {\n\t\t\t\t\t\t\t\"type\": \"integer\",\n\t\t\t\t\t\t\t\"multipleOf\": 1,\n\t\t\t\t\t\t\t\"maximum\": 100,\n\t\t\t\t\t\t\t\"minimum\": 1,\n\t\t\t\t\t\t\t\"exclusiveMaximum\": false,\n\t\t\t\t\t\t\t\"exclusiveMinimum\": false,\n\t\t\t\t\t\t\t\"default\": 6,\n\t\t\t\t\t\t\t\"id\": \"players_max\",\n\t\t\t\t\t\t\t\"title\": \"Min numbers of players\",\n\t\t\t\t\t\t\t\"description\": \"Minimum number of players\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"duration\": {\n\t\t\t\t\t\"type\": \"integer\",\n\t\t\t\t\t\"multipleOf\": 1,\n\t\t\t\t\t\"maximum\": 10000,\n\t\t\t\t\t\"minimum\": 1,\n\t\t\t\t\t\"exclusiveMaximum\": false,\n\t\t\t\t\t\"exclusiveMinimum\": false,\n\t\t\t\t\t\"default\": 60,\n\t\t\t\t\t\"id\": \"duration\",\n\t\t\t\t\t\"title\": \"Duration of each game\",\n\t\t\t\t\t\"description\": \"How long last a game ? (in minutes)\"\n\t\t\t\t},\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\"maxLength\": 2,\n\t\t\t\t\t\"default\": \"en\",\n\t\t\t\t\t\"id\": \"language\",\n\t\t\t\t\t\"title\": \"Language\",\n\t\t\t\t\t\"description\": \"Language required to play the game / read the instructions\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"language\"\n\t\t\t]\n\t\t},\n\t\t\"fabrication\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"Fabrication - who to fabricate this game ?\",\n\t\t\t\"required\": [\n\t\t\t\t\"fab_time\"\n\t\t\t],\n\t\t\t\"properties\": {\n\t\t\t\t\"fab_time\": {\n\t\t\t\t\t\"type\": \"integer\",\n\t\t\t\t\t\"multipleOf\": 1,\n\t\t\t\t\t\"maximum\": 10000,\n\t\t\t\t\t\"minimum\": 1,\n\t\t\t\t\t\"exclusiveMaximum\": false,\n\t\t\t\t\t\"exclusiveMinimum\": false,\n\t\t\t\t\t\"default\": 120,\n\t\t\t\t\t\"id\": \"fab_time\",\n\t\t\t\t\t\"title\": \"Fabrication Time\",\n\t\t\t\t\t\"description\": \"How much time does it take to fabricate the game?\"\n\t\t\t\t},\n\t\t\t\t\"requirements\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"uniqueItems\": true,\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\"Nothing\",\n\t\t\t\t\t\t\t\"Printers B&W\",\n\t\t\t\t\t\t\t\"Printers Colour\",\n\t\t\t\t\t\t\t\"Cissors\",\n\t\t\t\t\t\t\t\"Pens\",\n\t\t\t\t\t\t\t\"Stickers\",\n\t\t\t\t\t\t\t\"Ruler\",\n\t\t\t\t\t\t\t\"Paper Glue\",\n\t\t\t\t\t\t\t\"Cutter\",\n\t\t\t\t\t\t\t\"Mechanical saw\",\n\t\t\t\t\t\t\t\"Hand saw\",\n\t\t\t\t\t\t\t\"Wood glue\",\n\t\t\t\t\t\t\t\"Hammer\",\n\t\t\t\t\t\t\t\"All purpose plier\",\n\t\t\t\t\t\t\t\"Welder\",\n\t\t\t\t\t\t\t\"Sewing machine\",\n\t\t\t\t\t\t\t\"Drill\",\n\t\t\t\t\t\t\t\"Other tools\",\n\t\t\t\t\t\t\t\"3D printers\",\n\t\t\t\t\t\t\t\"Laser cutter\",\n\t\t\t\t\t\t\t\"Micro chip computer\"\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t\"id\": \"requirements\",\n\t\t\t\t\t\"title\": \"Requirements\",\n\t\t\t\t\t\"description\": \"What do you need to fabricate this game?\"\n\t\t\t\t},\n\t\t\t\t\"components\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"uniqueItems\": true,\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"object\",\n\t\t\t\t\t\t\"properties\": {\n\t\t\t\t\t\t\t\"componentName\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\t\t\"Dé classique\",\n\t\t\t\t\t\t\t\t\t\"Dés speciaux\",\n\t\t\t\t\t\t\t\t\t\"Jeu de carte classique\",\n\t\t\t\t\t\t\t\t\t\"Jeu existant\",\n\t\t\t\t\t\t\t\t\t\"Pions\",\n\t\t\t\t\t\t\t\t\t\"Jetons\",\n\t\t\t\t\t\t\t\t\t\"Contenant\",\n\t\t\t\t\t\t\t\t\t\"Chronomètre \",\n\t\t\t\t\t\t\t\t\t\"Materiel exotique\",\n\t\t\t\t\t\t\t\t\t\"Balloon\"\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"source\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"Sources - ref and further reading about this game\",\n\t\t\t\"properties\": {\n\t\t\t\t\"url\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"minLength\": 0,\n\t\t\t\t\t\"id\": \"url\",\n\t\t\t\t\t\"title\": \"Homepage / Link\",\n\t\t\t\t\t\"description\": \"A link to the game website or page\"\n\t\t\t\t},\n\t\t\t\t\"ISBN\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"uniqueItems\": false,\n\t\t\t\t\t\"items\": {},\n\t\t\t\t\t\"id\": \"ISBN\",\n\t\t\t\t\t\"title\": \"ISBN\",\n\t\t\t\t\t\"description\": \"ISBN (if applicable)\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"url\"\n\t\t\t]\n\t\t},\n\t\t\"content_type\": {\n\t\t\t\"type\": \"string\",\n\t\t\t\"enum\": [\n\t\t\t\t\"game\",\n\t\t\t\t\"book\",\n\t\t\t\t\"material\"\n\t\t\t],\n\t\t\t\"enumNames\": [\n\t\t\t\t\"Book\",\n\t\t\t\t\"Game\",\n\t\t\t\t\"Material\"\n\t\t\t],\n\t\t\t\"default\": \"game\",\n\t\t\t\"id\": \"content_type\",\n\t\t\t\"title\": \"Content Type\",\n\t\t\t\"description\": \"Is that a game, a book or sth else ?\"\n\t\t},\n\t\t\"timestamp_add\": {\n\t\t\t\"type\": \"string\",\n\t\t\t\"minLength\": 1,\n\t\t\t\"default\": \"10/10/2015 14:52:35\",\n\t\t\t\"id\": \"timestamp_add\",\n\t\t\t\"title\": \"Updated time\",\n\t\t\t\"description\": \"Last time this info has been updated\"\n\t\t}\n\t},\n\t\"id\": \"/\",\n\t\"required\": [\n\t\t\"title\",\n\t\t\"content_type\",\n\t\t\"fabrication\",\n\t\t\"timestamp_add\"\n\t]\n};\n\n//////////////////\n// WEBPACK FOOTER\n// ../model/game.json\n// module id = 928\n// module chunks = 0\n//# sourceURL=webpack:///../model/game.json?");
+ eval("module.exports = {\n\t\"$schema\": \"http://json-schema.org/draft-04/schema#\",\n\t\"title\": \"Ludobox Game\",\n\t\"description\": \"A game for Ludobox's catalog\",\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"title\": {\n\t\t\t\"type\": \"string\",\n\t\t\t\"minLength\": 1,\n\t\t\t\"id\": \"title\",\n\t\t\t\"title\": \"Title\",\n\t\t\t\"description\": \"The title of the game\"\n\t\t},\n\t\t\"description\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"Description of the game\",\n\t\t\t\"properties\": {\n\t\t\t\t\"summary\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\"id\": \"summary\",\n\t\t\t\t\t\"title\": \"Summary\",\n\t\t\t\t\t\"description\": \"Desribe the content of the game\"\n\t\t\t\t},\n\t\t\t\t\"tags\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"uniqueItems\": true,\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\t\"default\": \"Game\"\n\t\t\t\t\t},\n\t\t\t\t\t\"id\": \"tags\",\n\t\t\t\t\t\"title\": \"Tags\",\n\t\t\t\t\t\"description\": \"Free-tagging to describe the game content\"\n\t\t\t\t},\n\t\t\t\t\"intention\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"Loisir\",\n\t\t\t\t\t\t\"Militant\",\n\t\t\t\t\t\t\"Pédagogique\",\n\t\t\t\t\t\t\"Publicitaire\",\n\t\t\t\t\t\t\"Institutionel\",\n\t\t\t\t\t\t\"Experimental\"\n\t\t\t\t\t],\n\t\t\t\t\t\"id\": \"intention\",\n\t\t\t\t\t\"title\": \"Intention\",\n\t\t\t\t\t\"description\": \"The intention that created the game\"\n\t\t\t\t},\n\t\t\t\t\"type\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"Indoor game\",\n\t\t\t\t\t\t\"Toys\",\n\t\t\t\t\t\t\"Outdoor game\",\n\t\t\t\t\t\t\"Construction\",\n\t\t\t\t\t\t\"Design Kit\"\n\t\t\t\t\t],\n\t\t\t\t\t\"id\": \"intention\",\n\t\t\t\t\t\"title\": \"Intention\",\n\t\t\t\t\t\"description\": \"The intention that created the game\"\n\t\t\t\t},\n\t\t\t\t\"gameplay\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"Individuel\",\n\t\t\t\t\t\t\"En équipe\",\n\t\t\t\t\t\t\"Cooperatif\"\n\t\t\t\t\t],\n\t\t\t\t\t\"id\": \"gameplay\",\n\t\t\t\t\t\"title\": \"Gameplay\",\n\t\t\t\t\t\"description\": \"The game play\"\n\t\t\t\t},\n\t\t\t\t\"mechanics\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\"maxLength\": 3,\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\"Jeux de rôle\",\n\t\t\t\t\t\t\t\"Identité secrete\",\n\t\t\t\t\t\t\t\"Bluff\",\n\t\t\t\t\t\t\t\"Stop ou encore\",\n\t\t\t\t\t\t\t\"Gestion\",\n\t\t\t\t\t\t\t\"Enchères\",\n\t\t\t\t\t\t\t\"Programmation\",\n\t\t\t\t\t\t\t\"Abstrait\",\n\t\t\t\t\t\t\t\"Parcours\",\n\t\t\t\t\t\t\t\"Hasard\",\n\t\t\t\t\t\t\t\"Construction\",\n\t\t\t\t\t\t\t\"Dexterité\",\n\t\t\t\t\t\t\t\"Narratif\",\n\t\t\t\t\t\t\t\"Rapidite\",\n\t\t\t\t\t\t\t\"Enquetes\",\n\t\t\t\t\t\t\t\"Enigme\",\n\t\t\t\t\t\t\t\"Traditionel\",\n\t\t\t\t\t\t\t\"Wargame\",\n\t\t\t\t\t\t\t\"Placement\"\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t\"id\": \"mechanics\",\n\t\t\t\t\t\"title\": \"Mechanics\",\n\t\t\t\t\t\"description\": \"The mechanics that organize the way to play this game\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"credentials\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"Credentials - who created this game ?\",\n\t\t\t\"properties\": {\n\t\t\t\t\"license\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\"default\": \"Unknown\",\n\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\"Commercial use allowed\",\n\t\t\t\t\t\t\"Modifications allowed\",\n\t\t\t\t\t\t\"Commercial use & mods allowed\",\n\t\t\t\t\t\t\"No known copyright restrictions\",\n\t\t\t\t\t\t\"Public Domain\",\n\t\t\t\t\t\t\"No License\"\n\t\t\t\t\t],\n\t\t\t\t\t\"id\": \"license\",\n\t\t\t\t\t\"title\": \"License\",\n\t\t\t\t\t\"description\": \"The license\"\n\t\t\t\t},\n\t\t\t\t\"publishers\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"uniqueItems\": false,\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\"minLength\": 1\n\t\t\t\t\t},\n\t\t\t\t\t\"id\": \"publishers\",\n\t\t\t\t\t\"title\": \"Publisher(s)\",\n\t\t\t\t\t\"description\": \"Who published this game?\"\n\t\t\t\t},\n\t\t\t\t\"publication_year\": {\n\t\t\t\t\t\"type\": \"integer\",\n\t\t\t\t\t\"multipleOf\": 1,\n\t\t\t\t\t\"maximum\": 2100,\n\t\t\t\t\t\"minimum\": 1,\n\t\t\t\t\t\"exclusiveMaximum\": false,\n\t\t\t\t\t\"exclusiveMinimum\": false,\n\t\t\t\t\t\"default\": 1900,\n\t\t\t\t\t\"id\": \"publication_year\",\n\t\t\t\t\t\"title\": \"Publication Year\",\n\t\t\t\t\t\"description\": \"When was this game published ?\"\n\t\t\t\t},\n\t\t\t\t\"authors\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"uniqueItems\": false,\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\"minLength\": 1\n\t\t\t\t\t},\n\t\t\t\t\t\"id\": \"authors\",\n\t\t\t\t\t\"title\": \"Authors\",\n\t\t\t\t\t\"description\": \"Who are the authors ?\"\n\t\t\t\t},\n\t\t\t\t\"illustrators\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"uniqueItems\": false,\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\"minLength\": 1\n\t\t\t\t\t},\n\t\t\t\t\t\"id\": \"illustrators\",\n\t\t\t\t\t\"title\": \"Illustrators / Artists\",\n\t\t\t\t\t\"description\": \"Who are the illustrators and artists ?\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"license\"\n\t\t\t]\n\t\t},\n\t\t\"audience\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"Audience - who should play this game ?\",\n\t\t\t\"properties\": {\n\t\t\t\t\"age\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\"Children\",\n\t\t\t\t\t\t\t\"Teenagers\",\n\t\t\t\t\t\t\t\"Adults\"\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t\"id\": \"age\",\n\t\t\t\t\t\"uniqueItems\": true,\n\t\t\t\t\t\"title\": \"Age Requirements\",\n\t\t\t\t\t\"description\": \"Who should play this game ?\"\n\t\t\t\t},\n\t\t\t\t\"number_of_players\": {\n\t\t\t\t\t\"type\": \"object\",\n\t\t\t\t\t\"title\": \"Number of Players\",\n\t\t\t\t\t\"properties\": {\n\t\t\t\t\t\t\"players_min\": {\n\t\t\t\t\t\t\t\"type\": \"integer\",\n\t\t\t\t\t\t\t\"multipleOf\": 1,\n\t\t\t\t\t\t\t\"maximum\": 100,\n\t\t\t\t\t\t\t\"minimum\": 1,\n\t\t\t\t\t\t\t\"exclusiveMaximum\": false,\n\t\t\t\t\t\t\t\"exclusiveMinimum\": false,\n\t\t\t\t\t\t\t\"default\": 3,\n\t\t\t\t\t\t\t\"id\": \"players_min\",\n\t\t\t\t\t\t\t\"title\": \"Max numbers of players\",\n\t\t\t\t\t\t\t\"description\": \"Maximum number of players\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"players_max\": {\n\t\t\t\t\t\t\t\"type\": \"integer\",\n\t\t\t\t\t\t\t\"multipleOf\": 1,\n\t\t\t\t\t\t\t\"maximum\": 100,\n\t\t\t\t\t\t\t\"minimum\": 1,\n\t\t\t\t\t\t\t\"exclusiveMaximum\": false,\n\t\t\t\t\t\t\t\"exclusiveMinimum\": false,\n\t\t\t\t\t\t\t\"default\": 6,\n\t\t\t\t\t\t\t\"id\": \"players_max\",\n\t\t\t\t\t\t\t\"title\": \"Min numbers of players\",\n\t\t\t\t\t\t\t\"description\": \"Minimum number of players\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"duration\": {\n\t\t\t\t\t\"type\": \"integer\",\n\t\t\t\t\t\"multipleOf\": 1,\n\t\t\t\t\t\"maximum\": 10000,\n\t\t\t\t\t\"minimum\": 1,\n\t\t\t\t\t\"exclusiveMaximum\": false,\n\t\t\t\t\t\"exclusiveMinimum\": false,\n\t\t\t\t\t\"default\": 60,\n\t\t\t\t\t\"id\": \"duration\",\n\t\t\t\t\t\"title\": \"Duration of each game\",\n\t\t\t\t\t\"description\": \"How long last a game ? (in minutes)\"\n\t\t\t\t},\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"minLength\": 1,\n\t\t\t\t\t\"maxLength\": 2,\n\t\t\t\t\t\"default\": \"en\",\n\t\t\t\t\t\"id\": \"language\",\n\t\t\t\t\t\"title\": \"Language\",\n\t\t\t\t\t\"description\": \"Language required to play the game / read the instructions\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"language\"\n\t\t\t]\n\t\t},\n\t\t\"fabrication\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"Fabrication - who to fabricate this game ?\",\n\t\t\t\"required\": [\n\t\t\t\t\"fab_time\"\n\t\t\t],\n\t\t\t\"properties\": {\n\t\t\t\t\"fab_time\": {\n\t\t\t\t\t\"type\": \"integer\",\n\t\t\t\t\t\"multipleOf\": 1,\n\t\t\t\t\t\"maximum\": 10000,\n\t\t\t\t\t\"minimum\": 1,\n\t\t\t\t\t\"exclusiveMaximum\": false,\n\t\t\t\t\t\"exclusiveMinimum\": false,\n\t\t\t\t\t\"default\": 120,\n\t\t\t\t\t\"id\": \"fab_time\",\n\t\t\t\t\t\"title\": \"Fabrication Time\",\n\t\t\t\t\t\"description\": \"How much time does it take to fabricate the game?\"\n\t\t\t\t},\n\t\t\t\t\"requirements\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"uniqueItems\": true,\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\"Nothing\",\n\t\t\t\t\t\t\t\"Printers B&W\",\n\t\t\t\t\t\t\t\"Printers Colour\",\n\t\t\t\t\t\t\t\"Cissors\",\n\t\t\t\t\t\t\t\"Pens\",\n\t\t\t\t\t\t\t\"Stickers\",\n\t\t\t\t\t\t\t\"Ruler\",\n\t\t\t\t\t\t\t\"Paper Glue\",\n\t\t\t\t\t\t\t\"Cutter\",\n\t\t\t\t\t\t\t\"Mechanical saw\",\n\t\t\t\t\t\t\t\"Hand saw\",\n\t\t\t\t\t\t\t\"Wood glue\",\n\t\t\t\t\t\t\t\"Hammer\",\n\t\t\t\t\t\t\t\"All purpose plier\",\n\t\t\t\t\t\t\t\"Welder\",\n\t\t\t\t\t\t\t\"Sewing machine\",\n\t\t\t\t\t\t\t\"Drill\",\n\t\t\t\t\t\t\t\"Other tools\",\n\t\t\t\t\t\t\t\"3D printers\",\n\t\t\t\t\t\t\t\"Laser cutter\",\n\t\t\t\t\t\t\t\"Micro chip computer\"\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t\"id\": \"requirements\",\n\t\t\t\t\t\"title\": \"Requirements\",\n\t\t\t\t\t\"description\": \"What do you need to fabricate this game?\"\n\t\t\t\t},\n\t\t\t\t\"components\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"uniqueItems\": true,\n\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\"type\": \"object\",\n\t\t\t\t\t\t\"properties\": {\n\t\t\t\t\t\t\t\"componentName\": {\n\t\t\t\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\t\t\t\"enum\": [\n\t\t\t\t\t\t\t\t\t\"Dé classique\",\n\t\t\t\t\t\t\t\t\t\"Dés speciaux\",\n\t\t\t\t\t\t\t\t\t\"Jeu de carte classique\",\n\t\t\t\t\t\t\t\t\t\"Jeu existant\",\n\t\t\t\t\t\t\t\t\t\"Pions\",\n\t\t\t\t\t\t\t\t\t\"Jetons\",\n\t\t\t\t\t\t\t\t\t\"Contenant\",\n\t\t\t\t\t\t\t\t\t\"Chronomètre \",\n\t\t\t\t\t\t\t\t\t\"Materiel exotique\",\n\t\t\t\t\t\t\t\t\t\"Balloon\"\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"count\": {\n\t\t\t\t\t\t\t\t\"type\": \"number\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"source\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"title\": \"Sources - ref and further reading about this game\",\n\t\t\t\"properties\": {\n\t\t\t\t\"url\": {\n\t\t\t\t\t\"type\": \"string\",\n\t\t\t\t\t\"minLength\": 0,\n\t\t\t\t\t\"id\": \"url\",\n\t\t\t\t\t\"title\": \"Homepage / Link\",\n\t\t\t\t\t\"description\": \"A link to the game website or page\"\n\t\t\t\t},\n\t\t\t\t\"ISBN\": {\n\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\"uniqueItems\": false,\n\t\t\t\t\t\"items\": {},\n\t\t\t\t\t\"id\": \"ISBN\",\n\t\t\t\t\t\"title\": \"ISBN\",\n\t\t\t\t\t\"description\": \"ISBN (if applicable)\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"required\": [\n\t\t\t\t\"url\"\n\t\t\t]\n\t\t},\n\t\t\"content_type\": {\n\t\t\t\"type\": \"string\",\n\t\t\t\"enum\": [\n\t\t\t\t\"game\",\n\t\t\t\t\"book\",\n\t\t\t\t\"material\"\n\t\t\t],\n\t\t\t\"enumNames\": [\n\t\t\t\t\"Book\",\n\t\t\t\t\"Game\",\n\t\t\t\t\"Material\"\n\t\t\t],\n\t\t\t\"default\": \"game\",\n\t\t\t\"id\": \"content_type\",\n\t\t\t\"title\": \"Content Type\",\n\t\t\t\"description\": \"Is that a game, a book or sth else ?\"\n\t\t},\n\t\t\"timestamp_add\": {\n\t\t\t\"type\": \"string\",\n\t\t\t\"minLength\": 1,\n\t\t\t\"default\": \"10/10/2015 14:52:35\",\n\t\t\t\"id\": \"timestamp_add\",\n\t\t\t\"title\": \"Updated time\",\n\t\t\t\"description\": \"Last time this info has been updated\"\n\t\t}\n\t},\n\t\"id\": \"/\",\n\t\"required\": [\n\t\t\"title\",\n\t\t\"content_type\",\n\t\t\"fabrication\",\n\t\t\"timestamp_add\"\n\t]\n};\n\n//////////////////\n// WEBPACK FOOTER\n// ../model/game.json\n// module id = 928\n// module chunks = 0\n//# sourceURL=webpack:///../model/game.json?");
/***/ }),
/* 929 */
/***/ (function(module, exports, __webpack_require__) {
- eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouter = __webpack_require__(182);\n\nvar _reactAlert = __webpack_require__(930);\n\nvar _reactAlert2 = _interopRequireDefault(_reactAlert);\n\nvar _api = __webpack_require__(296);\n\nvar _api2 = _interopRequireDefault(_api);\n\nvar _GameForm = __webpack_require__(323);\n\nvar _GameForm2 = _interopRequireDefault(_GameForm);\n\nvar _ActionButtons = __webpack_require__(798);\n\nvar _ActionButtons2 = _interopRequireDefault(_ActionButtons);\n\nvar _History = __webpack_require__(800);\n\nvar _History2 = _interopRequireDefault(_History);\n\nvar _isMyJsonValid = __webpack_require__(918);\n\nvar _isMyJsonValid2 = _interopRequireDefault(_isMyJsonValid);\n\nvar _game = __webpack_require__(928);\n\nvar _game2 = _interopRequireDefault(_game);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar alertOptions = {\n offset: 14,\n position: 'bottom left',\n theme: 'dark',\n time: 5000,\n transition: 'scale'\n\n // edit button\n};var editButtonStyle = {\n fontSize: \"10pt\",\n cursor: \"pointer\"\n};\n\nvar GameEdit = function (_React$Component) {\n _inherits(GameEdit, _React$Component);\n\n function GameEdit(props) {\n _classCallCheck(this, GameEdit);\n\n var _this = _possibleConstructorReturn(this, (GameEdit.__proto__ || Object.getPrototypeOf(GameEdit)).call(this, props));\n\n _this.api = new _api2.default();\n _this.validate = (0, _isMyJsonValid2.default)(_game2.default);\n _this.state = {\n game: null,\n // prevGame : JSON.parse(JSON.stringify(this.state.game)),\n prevGame: null,\n files: [],\n newFiles: [],\n errors: [],\n editMode: false\n };\n return _this;\n }\n\n _createClass(GameEdit, [{\n key: 'fetchGame',\n value: function fetchGame(slug) {\n var _this2 = this;\n\n this.api.getGame(slug, function (game) {\n var files = game.files;\n\n files = files.map(function (f) {\n return {\n url: _this2.api.getURL('games/' + slug + '/files/' + f),\n filename: f\n };\n });\n _this2.setState({ game: game, files: files });\n });\n }\n }, {\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.fetchGame(this.props.params.gameSlug);\n }\n }, {\n key: 'handleAddFiles',\n value: function handleAddFiles(files) {\n console.log(files);\n this.setState({ newFiles: files });\n }\n }, {\n key: 'handleDeleteFile',\n value: function handleDeleteFile(fileName) {\n var _this3 = this;\n\n // get slug\n var slug = this.state.game.slug;\n console.log(slug);\n\n this.api.deleteFile(slug, fileName, function (resp) {\n // SUCCESS : File deleted\n console.log(resp.files);\n // show feedback\n _this3.msg.success(\"Your file have been deleted.\");\n\n var files = resp.files.map(function (f) {\n return {\n url: _this3.api.getURL('games/' + slug + '/files/' + f),\n filename: f\n };\n });\n\n _this3.setState({ editMode: false, files: files });\n }, function (error) {\n console.log(error);\n _this3.msg.error(error.message);\n });\n }\n }, {\n key: 'handleFileUpload',\n value: function handleFileUpload() {\n var _this4 = this;\n\n console.log(this.state.newFiles);\n\n if (!this.state.newFiles.length) {\n this.msg.error(\"No files. Please add a file to upload.\");\n return;\n }\n\n // get slug\n var slug = this.state.game.slug;\n\n // send files to server\n this.api.postFiles(slug, this.state.newFiles, function (resp) {\n // SUCCESS : Game created\n console.log(resp.files);\n // show feedback\n _this4.msg.success(\"Bravo, your files have been posted!\");\n\n var files = resp.files.map(function (f) {\n return {\n url: _this4.api.getURL('games/' + slug + '/files/' + f),\n filename: f\n };\n });\n\n _this4.setState({ editMode: false, files: files });\n }, function (error) {\n console.log(error);\n _this4.msg.error(error.message);\n });\n }\n }, {\n key: 'sendChanges',\n value: function sendChanges() {\n var _this5 = this;\n\n // data validation\n this.validate(this.state.game);\n console.log(this.validate.errors);\n\n if (this.validate.errors) {\n this.msg.error(this.validate.errors.length + \" errors.\");\n\n var errors = {};\n this.validate.errors.map(function (error) {\n return errors[error.field.slice(5)] = error.message;\n });\n this.setState({ errors: errors });\n } else {\n this.setState({ errors: {} }\n\n // get slug\n );var slug = this.state.game.slug;\n\n // send changes to server\n this.api.updateGame(this.state.game, slug, function (resp) {\n // SUCCESS : Game created\n // show feedback\n _this5.msg.success(\"Bravo, your game has been updated!\");\n }, function (error) {\n return _this5.msg.error(error.message);\n }\n\n // Move to /games/switch to read mode\n );_reactRouter.browserHistory.push('/games/' + slug);\n }\n }\n }, {\n key: 'cancelChanges',\n value: function cancelChanges() {\n console.log(\"changes cancelled\");\n this.setState({\n game: Object.assign({}, this.state.prevGame),\n prevGame: null,\n editMode: false\n });\n }\n }, {\n key: 'handleSendChanges',\n value: function handleSendChanges() {\n this.updateGameData();\n }\n }, {\n key: 'updateGame',\n value: function updateGame(game) {\n this.setState({ game: game });\n }\n }, {\n key: 'render',\n value: function render() {\n var _this6 = this;\n\n return _react2.default.createElement(\n 'div',\n null,\n this.state.game && this.state.files ? _react2.default.createElement(_GameForm2.default, {\n game: this.state.game,\n editMode: true,\n updateGame: function updateGame(game) {\n return _this6.updateGame(game);\n },\n errors: this.state.errors,\n files: this.state.files,\n newFiles: this.state.newFiles,\n handleAddFiles: function handleAddFiles(files) {\n return _this6.handleAddFiles(files);\n },\n handleDeleteFile: function handleDeleteFile(file) {\n return _this6.handleDeleteFile(file);\n },\n handleFileUpload: function handleFileUpload(files) {\n return _this6.handleFileUpload(files);\n } // if defined, will add a upload button to push files directly\n }) : null,\n _react2.default.createElement(\n 'span',\n null,\n _react2.default.createElement(\n 'a',\n { className: 'button',\n onClick: function onClick() {\n return _this6.sendChanges();\n },\n style: editButtonStyle\n },\n _react2.default.createElement('i', { className: 'icono-check' })\n ),\n _react2.default.createElement(\n 'a',\n { className: 'button',\n onClick: function onClick() {\n return _this6.cancelChanges();\n },\n style: editButtonStyle\n },\n _react2.default.createElement('i', { className: 'icono-cross' })\n )\n ),\n _react2.default.createElement(_reactAlert2.default, _extends({ ref: function ref(a) {\n return _this6.msg = a;\n } }, this.alertOptions))\n );\n }\n }]);\n\n return GameEdit;\n}(_react2.default.Component);\n\nexports.default = GameEdit;\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/GameEdit/GameEdit.jsx\n// module id = 929\n// module chunks = 0\n//# sourceURL=webpack:///./src/components/GameEdit/GameEdit.jsx?");
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouter = __webpack_require__(182);\n\nvar _reactAlert = __webpack_require__(930);\n\nvar _reactAlert2 = _interopRequireDefault(_reactAlert);\n\nvar _api = __webpack_require__(296);\n\nvar _api2 = _interopRequireDefault(_api);\n\nvar _GameForm = __webpack_require__(323);\n\nvar _GameForm2 = _interopRequireDefault(_GameForm);\n\nvar _ActionButtons = __webpack_require__(798);\n\nvar _ActionButtons2 = _interopRequireDefault(_ActionButtons);\n\nvar _History = __webpack_require__(800);\n\nvar _History2 = _interopRequireDefault(_History);\n\nvar _isMyJsonValid = __webpack_require__(918);\n\nvar _isMyJsonValid2 = _interopRequireDefault(_isMyJsonValid);\n\nvar _game = __webpack_require__(928);\n\nvar _game2 = _interopRequireDefault(_game);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar alertOptions = {\n offset: 14,\n position: 'bottom left',\n theme: 'dark',\n time: 5000,\n transition: 'scale'\n\n // edit button\n};var editButtonStyle = {\n fontSize: \"10pt\",\n cursor: \"pointer\"\n};\n\nvar GameEdit = function (_React$Component) {\n _inherits(GameEdit, _React$Component);\n\n function GameEdit(props) {\n _classCallCheck(this, GameEdit);\n\n var _this = _possibleConstructorReturn(this, (GameEdit.__proto__ || Object.getPrototypeOf(GameEdit)).call(this, props));\n\n _this.api = new _api2.default();\n _this.validate = (0, _isMyJsonValid2.default)(_game2.default);\n _this.state = {\n game: null,\n // prevGame : JSON.parse(JSON.stringify(this.state.game)),\n prevGame: null,\n files: [],\n newFiles: [],\n errors: [],\n editMode: false\n };\n return _this;\n }\n\n _createClass(GameEdit, [{\n key: 'fetchGame',\n value: function fetchGame(slug) {\n var _this2 = this;\n\n this.api.getGame(slug, function (game) {\n var files = game.files;\n\n files = files.map(function (f) {\n return {\n url: _this2.api.getURL('games/' + slug + '/files/' + f),\n filename: f\n };\n });\n _this2.setState({ game: game, files: files });\n });\n }\n }, {\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.fetchGame(this.props.params.gameSlug);\n }\n }, {\n key: 'handleAddFiles',\n value: function handleAddFiles(files) {\n console.log(files);\n this.setState({ newFiles: files });\n }\n }, {\n key: 'handleDeleteFile',\n value: function handleDeleteFile(fileName) {\n var _this3 = this;\n\n // get slug\n var slug = this.state.game.slug;\n console.log(slug);\n\n this.api.deleteFile(slug, fileName, function (resp) {\n // SUCCESS : File deleted\n console.log(resp.files);\n // show feedback\n _this3.msg.success(\"Your file have been deleted.\");\n\n var files = resp.files.map(function (f) {\n return {\n url: _this3.api.getURL('games/' + slug + '/files/' + f),\n filename: f\n };\n });\n\n _this3.setState({ editMode: false, files: files });\n }, function (error) {\n console.log(error);\n _this3.msg.error(error.message);\n });\n }\n }, {\n key: 'handleFileUpload',\n value: function handleFileUpload() {\n var _this4 = this;\n\n console.log(this.state.newFiles);\n\n if (!this.state.newFiles.length) {\n this.msg.error(\"No files. Please add a file to upload.\");\n return;\n }\n\n // get slug\n var slug = this.state.game.slug;\n\n // send files to server\n this.api.postFiles(slug, this.state.newFiles, function (resp) {\n // SUCCESS : Game created\n console.log(resp.files);\n // show feedback\n _this4.msg.success(\"Bravo, your files have been posted!\");\n\n var files = resp.files.map(function (f) {\n return {\n url: _this4.api.getURL('games/' + slug + '/files/' + f),\n filename: f\n };\n });\n\n _this4.setState({ editMode: false, files: files });\n }, function (error) {\n console.log(error);\n _this4.msg.error(error.message);\n });\n }\n }, {\n key: 'sendChanges',\n value: function sendChanges() {\n var _this5 = this;\n\n // data validation\n this.validate(this.state.game);\n console.log(this.validate.errors);\n\n if (this.validate.errors) {\n\n var errors = {};\n var errorMsg = \"\";\n this.validate.errors.map(function (error) {\n\n var fieldName = error.field.split(\".\").length == 4 ? error.field.split(\".\").slice(1, -1).join(\".\" // handle multiselect errors\n ) : error.field.slice(5);\n\n errorMsg += fieldName + ' \\n';\n return errors[fieldName] = error.message;\n });\n\n this.msg.error(this.validate.errors.length + ' errors.\\n\\n ' + errorMsg + ' ');\n\n this.setState({ errors: errors });\n } else {\n this.setState({ errors: {} }\n\n // get slug\n );var slug = this.state.game.slug;\n\n // send changes to server\n this.api.updateGame(this.state.game, slug, function (resp) {\n // SUCCESS : Game created\n // show feedback\n _this5.msg.success(\"Bravo, your game has been updated!\");\n }, function (error) {\n return _this5.msg.error(error.message);\n }\n\n // Move to /games/switch to read mode\n );_reactRouter.browserHistory.push('/games/' + slug);\n }\n }\n }, {\n key: 'cancelChanges',\n value: function cancelChanges() {\n console.log(\"changes cancelled\");\n this.setState({\n game: Object.assign({}, this.state.prevGame),\n prevGame: null,\n editMode: false\n });\n }\n }, {\n key: 'handleSendChanges',\n value: function handleSendChanges() {\n this.updateGameData();\n }\n }, {\n key: 'updateGame',\n value: function updateGame(game) {\n this.setState({ game: game });\n }\n }, {\n key: 'render',\n value: function render() {\n var _this6 = this;\n\n return _react2.default.createElement(\n 'div',\n null,\n this.state.game && this.state.files ? _react2.default.createElement(_GameForm2.default, {\n game: this.state.game,\n editMode: true,\n updateGame: function updateGame(game) {\n return _this6.updateGame(game);\n },\n errors: this.state.errors,\n files: this.state.files,\n newFiles: this.state.newFiles,\n handleAddFiles: function handleAddFiles(files) {\n return _this6.handleAddFiles(files);\n },\n handleDeleteFile: function handleDeleteFile(file) {\n return _this6.handleDeleteFile(file);\n },\n handleFileUpload: function handleFileUpload(files) {\n return _this6.handleFileUpload(files);\n } // if defined, will add a upload button to push files directly\n }) : null,\n _react2.default.createElement(\n 'span',\n null,\n _react2.default.createElement(\n 'a',\n { className: 'button',\n onClick: function onClick() {\n return _this6.sendChanges();\n },\n style: editButtonStyle\n },\n _react2.default.createElement('i', { className: 'icono-check' })\n ),\n _react2.default.createElement(\n 'a',\n { className: 'button',\n onClick: function onClick() {\n return _this6.cancelChanges();\n },\n style: editButtonStyle\n },\n _react2.default.createElement('i', { className: 'icono-cross' })\n )\n ),\n _react2.default.createElement(_reactAlert2.default, _extends({ ref: function ref(a) {\n return _this6.msg = a;\n } }, this.alertOptions))\n );\n }\n }]);\n\n return GameEdit;\n}(_react2.default.Component);\n\nexports.default = GameEdit;\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/GameEdit/GameEdit.jsx\n// module id = 929\n// module chunks = 0\n//# sourceURL=webpack:///./src/components/GameEdit/GameEdit.jsx?");
/***/ }),
/* 930 */
@@ -5888,7 +5888,7 @@
/* 974 */
/***/ (function(module, exports, __webpack_require__) {
- eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _DownloadButton = __webpack_require__(975);\n\nvar _DownloadButton2 = _interopRequireDefault(_DownloadButton);\n\nvar _iso = __webpack_require__(424);\n\nvar _iso2 = _interopRequireDefault(_iso);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar requirements = [{\n name: \"Nothing.\",\n value: \"nothing\"\n}, {\n name: \"Office (printer)\",\n value: \"print\"\n}, {\n name: \"Wood Workshop (saw, hammer...)\",\n value: \"wood\"\n}, {\n name: \"Fab Lab (3D printer, lasercutter...)\",\n value: \"fablab\"\n}];\n\nvar GamesTable = function (_React$Component) {\n _inherits(GamesTable, _React$Component);\n\n function GamesTable(props) {\n _classCallCheck(this, GamesTable);\n\n var _this = _possibleConstructorReturn(this, (GamesTable.__proto__ || Object.getPrototypeOf(GamesTable)).call(this, props));\n\n var selectedRequirements = {};\n requirements.forEach(function (d) {\n return selectedRequirements[d.value] = true;\n });\n\n _this.state = {\n filterStr: '',\n selectedLanguage: 'any',\n selectedAges: [\"Children\", \"Teenagers\", \"Adults\"],\n showLookup: false,\n timeRange: 60,\n selectedRequirements: selectedRequirements\n };\n return _this;\n }\n\n _createClass(GamesTable, [{\n key: 'toggleLookup',\n value: function toggleLookup(e) {\n this.setState({ showLookup: !this.state.showLookup });\n }\n }, {\n key: 'changeFilterStr',\n value: function changeFilterStr(filterStr) {\n this.setState({ filterStr: filterStr });\n }\n }, {\n key: 'selectLanguage',\n value: function selectLanguage(selectedLanguage) {\n this.setState({ selectedLanguage: selectedLanguage });\n }\n }, {\n key: 'changeTimeRange',\n value: function changeTimeRange(e) {\n this.setState({ timeRange: e.target.value });\n }\n }, {\n key: 'selectAge',\n value: function selectAge(e) {\n var selectedAges = [].concat(_toConsumableArray(e.target.options)).filter(function (o) {\n return o.selected;\n }).map(function (o) {\n return o.value;\n });\n this.setState({ selectedAges: selectedAges });\n }\n }, {\n key: 'handleCheckbox',\n value: function handleCheckbox(e) {\n var selectedRequirements = this.state.selectedRequirements;\n\n selectedRequirements[e.target.name] = e.target.checked;\n this.setState({ selectedRequirements: selectedRequirements });\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var games = this.props.games;\n var _state = this.state,\n showLookup = _state.showLookup,\n filterStr = _state.filterStr,\n selectedLanguage = _state.selectedLanguage,\n selectedAges = _state.selectedAges,\n timeRange = _state.timeRange,\n selectedRequirements = _state.selectedRequirements;\n\n // get unique language codes\n\n var lgg = new Set(games.map(function (g) {\n return g.audience.language;\n }));\n\n // get screen names\n var languages = _iso2.default.getLanguages(Array.from(lgg));\n\n var languagesOptions = [{ name: 'Any', code: 'any' }].concat(_toConsumableArray(languages)).map(function (lg) {\n return _react2.default.createElement(\n 'option',\n { key: lg.code, value: lg.code },\n lg.name\n );\n });\n\n var ageOptions = [\"Children\", \"Teenagers\", \"Adults\", null].map(function (age) {\n return _react2.default.createElement(\n 'option',\n { key: age, value: age },\n age\n );\n });\n\n var requirementsOptions = requirements.map(function (option) {\n return _react2.default.createElement(\n 'label',\n {\n key: option.value,\n style: {\n display: \"block\",\n float: \"left\",\n paddingRight: \"10px\",\n whiteSpace: \"nowrap\"\n }\n },\n _react2.default.createElement('input', {\n onClick: function onClick(e) {\n return _this2.handleCheckbox(e);\n },\n type: 'checkbox',\n name: option.value,\n defaultChecked: _this2.state.selectedRequirements[option.value]\n }),\n _react2.default.createElement(\n 'span',\n { className: 'label-body' },\n option.name\n )\n );\n });\n\n var rows = games.filter(function (g) {\n return g.title.toLowerCase().includes(filterStr);\n }).filter(function (g) {\n return selectedLanguage !== 'any' ? g.audience.language === selectedLanguage : true;\n } // show all games by default\n ).filter(function (g) {\n var ages = g.audience.age ? new Set(g.audience.age) : new Set([\"\"]);\n return selectedAges.filter(function (age) {\n return ages.has(age);\n }).length;\n }\n // .filter(g => {\n // let reqs = g.fabrication && g.fabrication.requirements ?\n // new Set(g.fabrication.requirements)\n // : new Set([\"\"])\n //\n // return Object.keys(selectedRequirements)\n // .filter( d => selectedRequirements[d] )\n // .filter( req => reqs.has(req) )\n // .length\n // })\n // .filter( g =>\n // timeRange == 0 ?\n // true\n // :\n // g.fabrication.fab_time <= timeRange\n // )\n ).map(function (game) {\n return _react2.default.createElement(\n 'tr',\n { style: game.existsLocally ? { background: \"yellow\" } : {},\n key: game.slug },\n _react2.default.createElement(\n 'td',\n null,\n _react2.default.createElement(\n 'a',\n {\n href: \"/games/\" + game.slug,\n title: game.description.summary\n },\n game.title\n )\n ),\n _react2.default.createElement(\n 'td',\n null,\n game.audience ? _iso2.default.getName(game.audience.language //\n ) : null\n ),\n _react2.default.createElement(\n 'td',\n null,\n game.has_errors && game.errors.length ? game.errors.length + ' errors ' : game.state\n ),\n !game.existsLocally && _this2.props.remoteApi && _this2.props.localApi ? _react2.default.createElement(\n 'td',\n null,\n _react2.default.createElement(_DownloadButton2.default, {\n socket: _this2.props.socket,\n remoteApi: _this2.props.remoteApi,\n localApi: _this2.props.localApi,\n slug: game.slug\n })\n ) : null\n );\n });\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'row' },\n _react2.default.createElement(\n 'label',\n null,\n 'What do you have at hand?'\n ),\n requirementsOptions\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row' },\n _react2.default.createElement(\n 'label',\n null,\n 'How much time do you have?'\n ),\n timeRange == 120 ? \"2+ hours\" : timeRange + ' minutes',\n _react2.default.createElement('input', {\n type: 'range',\n min: '0',\n max: '120',\n step: '10',\n onChange: function onChange(e) {\n return _this2.changeTimeRange(e);\n }\n })\n ),\n showLookup ? _react2.default.createElement(\n 'div',\n { className: 'row' },\n _react2.default.createElement(\n 'div',\n { className: 'six columns' },\n _react2.default.createElement(\n 'label',\n null,\n 'Search'\n ),\n _react2.default.createElement('input', {\n type: 'text',\n id: 'filterStrField',\n value: filterStr,\n onChange: function onChange(e) {\n return _this2.changeFilterStr(e.target.value);\n },\n placeholder: 'Lookup a game'\n })\n ),\n _react2.default.createElement(\n 'div',\n { className: 'two columns' },\n _react2.default.createElement(\n 'label',\n null,\n 'Language'\n ),\n _react2.default.createElement(\n 'select',\n {\n id: 'languageSelector',\n value: selectedLanguage,\n onChange: function onChange(e) {\n return _this2.selectLanguage(e.target.value);\n }\n },\n languagesOptions\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'four columns' },\n _react2.default.createElement(\n 'label',\n null,\n 'Age'\n ),\n _react2.default.createElement(\n 'select',\n {\n id: 'languageSelector',\n value: selectedAges,\n onChange: function onChange(e) {\n return _this2.selectAge(e);\n },\n multiple: true\n },\n ageOptions\n )\n )\n ) : null,\n _react2.default.createElement(\n 'a',\n {\n className: 'button',\n onClick: function onClick(e) {\n return _this2.toggleLookup(e);\n }\n },\n showLookup ? \"X\" : \"More Options\"\n //
\n\n ),\n _react2.default.createElement(\n 'table',\n { className: 'twelve columns', style: { tableLayout: \"fixed\" } },\n _react2.default.createElement(\n 'thead',\n null,\n _react2.default.createElement(\n 'tr',\n null,\n _react2.default.createElement(\n 'td',\n null,\n 'Title'\n ),\n _react2.default.createElement(\n 'td',\n null,\n 'Language'\n ),\n _react2.default.createElement(\n 'td',\n null,\n 'Status'\n ),\n this.props.remoteApi ? _react2.default.createElement(\n 'td',\n null,\n 'Download'\n ) : null\n )\n ),\n _react2.default.createElement(\n 'tbody',\n null,\n rows\n )\n )\n );\n }\n }]);\n\n return GamesTable;\n}(_react2.default.Component);\n\nexports.default = GamesTable;\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/GamesTable/GamesTable.jsx\n// module id = 974\n// module chunks = 0\n//# sourceURL=webpack:///./src/components/GamesTable/GamesTable.jsx?");
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _DownloadButton = __webpack_require__(975);\n\nvar _DownloadButton2 = _interopRequireDefault(_DownloadButton);\n\nvar _ContentState = __webpack_require__(984);\n\nvar _ContentState2 = _interopRequireDefault(_ContentState);\n\nvar _iso = __webpack_require__(424);\n\nvar _iso2 = _interopRequireDefault(_iso);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar requirements = [{\n name: \"Nothing.\",\n value: \"nothing\"\n}, {\n name: \"Office (printer)\",\n value: \"print\"\n}, {\n name: \"Wood Workshop (saw, hammer...)\",\n value: \"wood\"\n}, {\n name: \"Fab Lab (3D printer, lasercutter...)\",\n value: \"fablab\"\n}];\n\nvar GamesTable = function (_React$Component) {\n _inherits(GamesTable, _React$Component);\n\n function GamesTable(props) {\n _classCallCheck(this, GamesTable);\n\n var _this = _possibleConstructorReturn(this, (GamesTable.__proto__ || Object.getPrototypeOf(GamesTable)).call(this, props));\n\n var selectedRequirements = {};\n requirements.forEach(function (d) {\n return selectedRequirements[d.value] = true;\n });\n\n _this.state = {\n filterStr: '',\n selectedLanguage: 'any',\n selectedAges: [\"Children\", \"Teenagers\", \"Adults\"],\n showLookup: false,\n timeRange: 60,\n selectedRequirements: selectedRequirements\n };\n return _this;\n }\n\n _createClass(GamesTable, [{\n key: 'toggleLookup',\n value: function toggleLookup(e) {\n this.setState({ showLookup: !this.state.showLookup });\n }\n }, {\n key: 'changeFilterStr',\n value: function changeFilterStr(filterStr) {\n this.setState({ filterStr: filterStr });\n }\n }, {\n key: 'selectLanguage',\n value: function selectLanguage(selectedLanguage) {\n this.setState({ selectedLanguage: selectedLanguage });\n }\n }, {\n key: 'changeTimeRange',\n value: function changeTimeRange(e) {\n this.setState({ timeRange: e.target.value });\n }\n }, {\n key: 'selectAge',\n value: function selectAge(e) {\n var selectedAges = [].concat(_toConsumableArray(e.target.options)).filter(function (o) {\n return o.selected;\n }).map(function (o) {\n return o.value;\n });\n this.setState({ selectedAges: selectedAges });\n }\n }, {\n key: 'handleCheckbox',\n value: function handleCheckbox(e) {\n var selectedRequirements = this.state.selectedRequirements;\n\n selectedRequirements[e.target.name] = e.target.checked;\n this.setState({ selectedRequirements: selectedRequirements });\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var games = this.props.games;\n var _state = this.state,\n showLookup = _state.showLookup,\n filterStr = _state.filterStr,\n selectedLanguage = _state.selectedLanguage,\n selectedAges = _state.selectedAges,\n timeRange = _state.timeRange,\n selectedRequirements = _state.selectedRequirements;\n\n // get unique language codes\n\n var lgg = new Set(games.map(function (g) {\n return g.audience.language;\n }));\n\n // get screen names\n var languages = _iso2.default.getLanguages(Array.from(lgg));\n\n var languagesOptions = [{ name: 'Any', code: 'any' }].concat(_toConsumableArray(languages)).map(function (lg) {\n return _react2.default.createElement(\n 'option',\n { key: lg.code, value: lg.code },\n lg.name\n );\n });\n\n var ageOptions = [\"Children\", \"Teenagers\", \"Adults\", null].map(function (age) {\n return _react2.default.createElement(\n 'option',\n { key: age, value: age },\n age\n );\n });\n\n var requirementsOptions = requirements.map(function (option) {\n return _react2.default.createElement(\n 'label',\n {\n key: option.value,\n style: {\n display: \"block\",\n float: \"left\",\n paddingRight: \"10px\",\n whiteSpace: \"nowrap\"\n }\n },\n _react2.default.createElement('input', {\n onClick: function onClick(e) {\n return _this2.handleCheckbox(e);\n },\n type: 'checkbox',\n name: option.value,\n defaultChecked: _this2.state.selectedRequirements[option.value]\n }),\n _react2.default.createElement(\n 'span',\n { className: 'label-body' },\n option.name\n )\n );\n });\n\n var rows = games.filter(function (g) {\n return g.title.toLowerCase().includes(filterStr);\n }).filter(function (g) {\n return selectedLanguage !== 'any' ? g.audience.language === selectedLanguage : true;\n } // show all games by default\n ).filter(function (g) {\n var ages = g.audience.age ? new Set(g.audience.age) : new Set([\"\"]);\n return selectedAges.filter(function (age) {\n return ages.has(age);\n }).length;\n }\n // .filter(g => {\n // let reqs = g.fabrication && g.fabrication.requirements ?\n // new Set(g.fabrication.requirements)\n // : new Set([\"\"])\n //\n // return Object.keys(selectedRequirements)\n // .filter( d => selectedRequirements[d] )\n // .filter( req => reqs.has(req) )\n // .length\n // })\n // .filter( g =>\n // timeRange == 0 ?\n // true\n // :\n // g.fabrication.fab_time <= timeRange\n // )\n ).map(function (game) {\n return _react2.default.createElement(\n 'tr',\n { style: game.existsLocally ? { background: \"yellow\" } : {},\n key: game.slug },\n _react2.default.createElement(\n 'td',\n null,\n _react2.default.createElement(\n 'a',\n {\n href: \"/games/\" + game.slug,\n title: game.description.summary\n },\n game.title\n )\n ),\n _react2.default.createElement(\n 'td',\n null,\n game.audience ? _iso2.default.getName(game.audience.language //\n ) : null\n ),\n _react2.default.createElement(\n 'td',\n null,\n _react2.default.createElement(\n 'a',\n { style: { textDecoration: \"none\" },\n href: \"/games/\" + game.slug },\n _react2.default.createElement(_ContentState2.default, { state: game.state, errors: game.errors })\n )\n ),\n !game.existsLocally && _this2.props.remoteApi && _this2.props.localApi ? _react2.default.createElement(\n 'td',\n null,\n _react2.default.createElement(_DownloadButton2.default, {\n socket: _this2.props.socket,\n remoteApi: _this2.props.remoteApi,\n localApi: _this2.props.localApi,\n slug: game.slug\n })\n ) : null\n );\n });\n\n return _react2.default.createElement(\n 'div',\n null,\n _react2.default.createElement(\n 'div',\n { className: 'row' },\n _react2.default.createElement(\n 'label',\n null,\n 'What do you have at hand?'\n ),\n requirementsOptions\n ),\n _react2.default.createElement(\n 'div',\n { className: 'row' },\n _react2.default.createElement(\n 'label',\n null,\n 'How much time do you have?'\n ),\n timeRange == 120 ? \"2+ hours\" : timeRange + ' minutes',\n _react2.default.createElement('input', {\n type: 'range',\n min: '0',\n max: '120',\n step: '10',\n onChange: function onChange(e) {\n return _this2.changeTimeRange(e);\n }\n })\n ),\n showLookup ? _react2.default.createElement(\n 'div',\n { className: 'row' },\n _react2.default.createElement(\n 'div',\n { className: 'six columns' },\n _react2.default.createElement(\n 'label',\n null,\n 'Search'\n ),\n _react2.default.createElement('input', {\n type: 'text',\n id: 'filterStrField',\n value: filterStr,\n onChange: function onChange(e) {\n return _this2.changeFilterStr(e.target.value);\n },\n placeholder: 'Lookup a game'\n })\n ),\n _react2.default.createElement(\n 'div',\n { className: 'two columns' },\n _react2.default.createElement(\n 'label',\n null,\n 'Language'\n ),\n _react2.default.createElement(\n 'select',\n {\n id: 'languageSelector',\n value: selectedLanguage,\n onChange: function onChange(e) {\n return _this2.selectLanguage(e.target.value);\n }\n },\n languagesOptions\n )\n ),\n _react2.default.createElement(\n 'div',\n { className: 'four columns' },\n _react2.default.createElement(\n 'label',\n null,\n 'Age'\n ),\n _react2.default.createElement(\n 'select',\n {\n id: 'languageSelector',\n value: selectedAges,\n onChange: function onChange(e) {\n return _this2.selectAge(e);\n },\n multiple: true\n },\n ageOptions\n )\n )\n ) : null,\n _react2.default.createElement(\n 'a',\n {\n className: 'button',\n onClick: function onClick(e) {\n return _this2.toggleLookup(e);\n }\n },\n showLookup ? \"X\" : \"More Options\"\n //
\n\n ),\n _react2.default.createElement(\n 'table',\n { className: 'twelve columns', style: { tableLayout: \"fixed\" } },\n _react2.default.createElement(\n 'thead',\n null,\n _react2.default.createElement(\n 'tr',\n null,\n _react2.default.createElement(\n 'td',\n null,\n 'Title'\n ),\n _react2.default.createElement(\n 'td',\n null,\n 'Language'\n ),\n _react2.default.createElement(\n 'td',\n null,\n 'Status'\n ),\n this.props.remoteApi ? _react2.default.createElement(\n 'td',\n null,\n 'Download'\n ) : null\n )\n ),\n _react2.default.createElement(\n 'tbody',\n null,\n rows\n )\n )\n );\n }\n }]);\n\n return GamesTable;\n}(_react2.default.Component);\n\nexports.default = GamesTable;\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/GamesTable/GamesTable.jsx\n// module id = 974\n// module chunks = 0\n//# sourceURL=webpack:///./src/components/GamesTable/GamesTable.jsx?");
/***/ }),
/* 975 */
@@ -5944,5 +5944,11 @@
eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Authorization = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactRouter = __webpack_require__(182);\n\nvar _ = __webpack_require__(982);\n\nvar _2 = _interopRequireDefault(_);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// Authorization HOC\nvar Authorization = exports.Authorization = function Authorization(allowedRoles) {\n return function (WrappedComponent) {\n return function (_React$Component) {\n _inherits(_class, _React$Component);\n\n function _class(props) {\n _classCallCheck(this, _class);\n\n var _this = _possibleConstructorReturn(this, (_class.__proto__ || Object.getPrototypeOf(_class)).call(this, props));\n\n _this.state = {\n user: {}\n };\n return _this;\n }\n\n _createClass(_class, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n var user = window.initialData.user;\n\n this.setState({ user: user });\n console.log(user);\n }\n }, {\n key: 'render',\n value: function render() {\n var roles = this.state.user.roles;\n\n var isAuthorized = false;\n\n if (roles) isAuthorized = allowedRoles.filter(function (n) {\n return roles.indexOf(n) !== -1;\n }).length != 0;\n\n if (isAuthorized) {\n return _react2.default.createElement(WrappedComponent, this.props);\n } else {\n return _react2.default.createElement(_2.default, null);\n }\n }\n }]);\n\n return _class;\n }(_react2.default.Component);\n };\n};\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Authorization/Authorization.jsx\n// module id = 983\n// module chunks = 0\n//# sourceURL=webpack:///./src/components/Authorization/Authorization.jsx?");
+/***/ }),
+/* 984 */
+/***/ (function(module, exports, __webpack_require__) {
+
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(1);\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar states = {\n \"needs_review\": {\n text: \"Needs Review\",\n color: \"orange\"\n },\n \"validated\": {\n text: \"Validated\",\n color: \"green\"\n },\n \"rejected\": {\n text: \"Rejected\",\n color: \"red\"\n }\n};\n\nvar style = {\n border: \"1px solid #ccc\",\n borderRadius: \"5px\",\n fontSize: \".7em\",\n padding: \".5em 1em\"\n};\n\nvar ContentState = function (_React$Component) {\n _inherits(ContentState, _React$Component);\n\n function ContentState() {\n _classCallCheck(this, ContentState);\n\n return _possibleConstructorReturn(this, (ContentState.__proto__ || Object.getPrototypeOf(ContentState)).apply(this, arguments));\n }\n\n _createClass(ContentState, [{\n key: \"render\",\n value: function render() {\n var _props = this.props,\n state = _props.state,\n errors = _props.errors;\n\n\n if (!errors) errors = [];\n\n var text = errors.length ? errors.length + \" errors \" : states[state].text;\n\n var color = errors.length ? \"red\" : states[state].color;\n\n return _react2.default.createElement(\n \"span\",\n { style: Object.assign(style, { color: color, borderColor: color }) },\n text\n );\n }\n }]);\n\n return ContentState;\n}(_react2.default.Component);\n\nexports.default = ContentState;\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/ContentState/ContentState.jsx\n// module id = 984\n// module chunks = 0\n//# sourceURL=webpack:///./src/components/ContentState/ContentState.jsx?");
+
/***/ })
/******/ ]);
\ No newline at end of file
diff --git a/server/ludobox/content.py b/server/ludobox/content.py
index 13439d5..9620283 100644
--- a/server/ludobox/content.py
+++ b/server/ludobox/content.py
@@ -102,7 +102,6 @@ def read_content(path):
try :
validate_content(data)
except ValidationError as e:
- data["has_errors"] = True
data["errors"] = validate_content(data, get_all_errors=True)
# add files attachments list
diff --git a/server/ludobox/flat_files.py b/server/ludobox/flat_files.py
index 76c083f..38634c5 100644
--- a/server/ludobox/flat_files.py
+++ b/server/ludobox/flat_files.py
@@ -47,6 +47,11 @@ def delete_resource_folder(resource_folder_path):
def write_info_json(info, resource_folder_path):
"""Write a JSON file based on valid resource data"""
+ # remove stuff we don't need
+ info.pop('files', None)
+ info.pop('errors', None)
+ info.pop('has_errors', None)
+
# Convert the data to JSON into file
content = json.dumps(info, sort_keys=True, indent=4, default=json_serial)
json_path = os.path.join(resource_folder_path, "info.json")
diff --git a/server/ludobox/history.py b/server/ludobox/history.py
index 5f05ab7..4b66cf9 100644
--- a/server/ludobox/history.py
+++ b/server/ludobox/history.py
@@ -108,11 +108,11 @@ def make_update_event(old_content, new_content, user=None):
new = new_content.copy()
old = old_content.copy()
- # make sure ro remove history and files
- new.pop('history', None)
- new.pop('files', None)
- old.pop('history', None)
- old.pop('files', None)
+ # ignore keys we don't want to track in the history events
+ ignored_keys = ["history", "files", "errors", "has_errors"]
+ for k in ignored_keys:
+ new.pop(k, None)
+ old.pop(k, None)
# create json diff
patch = make_patch(new, old)
diff --git a/server/tests/test_content.py b/server/tests/test_content.py
index 33fd11a..d8af6d6 100644
--- a/server/tests/test_content.py
+++ b/server/tests/test_content.py
@@ -95,11 +95,11 @@ def test_read_content_validation(self):
write_info_json(wrong_content, wrong_game_path)
with_errors = read_content(wrong_game_path)
- self.assertTrue(with_errors["has_errors"])
self.assertIs(type(with_errors["errors"]), list)
self.assertIs(len(with_errors["errors"]), 1)
- self.assertIs(type(with_errors["errors"][0]), str)
- self.assertIn("title" ,with_errors["errors"][0])
+ self.assertIs(type(with_errors["errors"][0]), dict)
+ self.assertIn("title" , with_errors["errors"][0]["path"])
+ self.assertIn("345" , with_errors["errors"][0]["message"])
def test_create_content_without_attachements(self):
""" Make sure that content is written properly"""