diff --git a/docs/3.0.0-beta.x/migration-guide/migration-guide-beta.17-to-beta.18.md b/docs/3.0.0-beta.x/migration-guide/migration-guide-beta.17-to-beta.18.md index c8c407fbbc..e9190b14cd 100644 --- a/docs/3.0.0-beta.x/migration-guide/migration-guide-beta.17-to-beta.18.md +++ b/docs/3.0.0-beta.x/migration-guide/migration-guide-beta.17-to-beta.18.md @@ -132,6 +132,16 @@ Run the following statement in your database: ::: :::: +## Date type changes + +We introduced new types in the admin panel: `date`, `datetime` and `time`. Before all of those types where saved as `datetime`. + +You will need to change the type of your fields from `date` to `datetime` if you don't want to migrate your data. + +- To migrate yout old `date` to `datetime`, change the field type from `date` to `datetime`. NO data migration is required. +- To migrate your old `date` to new `date`, you will need to migrate yout data to be of the format: `YYYY-MM-DD` +- To migrate your old `date` to the new `time`, change the field type from `date` to `time`. You will also need to transform them to be of the format: `HH:mm:ss.SSS` + ## Groups become Components If you were using the groups feature you will need to apply some changes: @@ -370,10 +380,19 @@ _Repeat this query for every join table where you are using this component._ ```sql UPDATE restaurant_components -SET component_type = 'groups_old_table_name' -WHERE component_type = 'components_new_table_name'; +SET component_type = 'components_new_table_name' +WHERE component_type = 'groups_old_table_name'; ``` +**4. If you store files in groups, update the `related_type` values** + +```sql +UPDATE upload_file_morph +SET related_type = 'components_new_table_name' +WHERE related_type = 'groups_old_table_name'; +``` + + #### Mongo In `mongo` the relation between a content type and its components is held in an array of references. To know which component type it referes to, the array also contains a `kind` attribute containing the component Schema name. @@ -450,6 +469,45 @@ We created new home pages when your go to your api url. You will need to copy `index.html` and `production.html` into your `public` folder. You can find those two files [here](https://github.com/strapi/strapi/tree/master/packages/strapi-generate-new/lib/resources/files/public). +## Updating `csp` options + +The admin panel contains certain assets that use `data:img;base64` images. To allow rendering of those assets you can update the files `./config/environments/{env}/security.json` as follows: + +**Before** + +```json +{ + "csp": { + "enabled": true, + "policy": [ + { + "img-src": "'self' http:" + }, + "block-all-mixed-content" + ] + } + //.... +} +``` + +**After** + +```json +{ + "csp": { + "enabled": true, + "policy": ["block-all-mixed-content"] + } + //.... +} +``` + +If you need more fine control you can also simply add the `data:` option to the `img-src` option. + ## Rebuilding your administration panel Now delete the `.cache` and `build` folders. Then run `yarn develop`. + +``` + +``` diff --git a/examples/getstarted/api/address/models/Address.settings.json b/examples/getstarted/api/address/models/Address.settings.json index 4cac844079..270b48cb94 100755 --- a/examples/getstarted/api/address/models/Address.settings.json +++ b/examples/getstarted/api/address/models/Address.settings.json @@ -43,11 +43,6 @@ "full_name": { "type": "string", "required": true - }, - "dz": { - "type": "dynamiczone", - "components": [], - "min": 2 } } } diff --git a/examples/getstarted/package.json b/examples/getstarted/package.json index 22bebcfabd..0340e72f5c 100644 --- a/examples/getstarted/package.json +++ b/examples/getstarted/package.json @@ -1,7 +1,7 @@ { "name": "getstarted", "private": true, - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "A Strapi application.", "scripts": { "develop": "strapi develop", @@ -15,21 +15,21 @@ "mysql": "^2.17.1", "pg": "^7.10.0", "sqlite3": "^4.0.6", - "strapi": "3.0.0-beta.18.1", - "strapi-admin": "3.0.0-beta.18.1", - "strapi-connector-bookshelf": "3.0.0-beta.18.1", - "strapi-connector-mongoose": "3.0.0-beta.18.1", - "strapi-middleware-views": "3.0.0-beta.18.1", - "strapi-plugin-content-manager": "3.0.0-beta.18.1", - "strapi-plugin-content-type-builder": "3.0.0-beta.18.1", - "strapi-plugin-documentation": "3.0.0-beta.18.1", - "strapi-plugin-email": "3.0.0-beta.18.1", - "strapi-plugin-graphql": "3.0.0-beta.18.1", - "strapi-plugin-upload": "3.0.0-beta.18.1", - "strapi-plugin-users-permissions": "3.0.0-beta.18.1", - "strapi-provider-email-mailgun": "3.0.0-beta.18.1", - "strapi-provider-upload-aws-s3": "3.0.0-beta.18.1", - "strapi-utils": "3.0.0-beta.18.1" + "strapi": "3.0.0-beta.18.2", + "strapi-admin": "3.0.0-beta.18.2", + "strapi-connector-bookshelf": "3.0.0-beta.18.2", + "strapi-connector-mongoose": "3.0.0-beta.18.2", + "strapi-middleware-views": "3.0.0-beta.18.2", + "strapi-plugin-content-manager": "3.0.0-beta.18.2", + "strapi-plugin-content-type-builder": "3.0.0-beta.18.2", + "strapi-plugin-documentation": "3.0.0-beta.18.2", + "strapi-plugin-email": "3.0.0-beta.18.2", + "strapi-plugin-graphql": "3.0.0-beta.18.2", + "strapi-plugin-upload": "3.0.0-beta.18.2", + "strapi-plugin-users-permissions": "3.0.0-beta.18.2", + "strapi-provider-email-mailgun": "3.0.0-beta.18.2", + "strapi-provider-upload-aws-s3": "3.0.0-beta.18.2", + "strapi-utils": "3.0.0-beta.18.2" }, "strapi": { "uuid": "getstarted" diff --git a/lerna.json b/lerna.json index 06342ed1f6..79c3402bd2 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "packages": [ "packages/*", "examples/*" diff --git a/packages/create-strapi-app/package.json b/packages/create-strapi-app/package.json index 571f085e68..32588303a6 100644 --- a/packages/create-strapi-app/package.json +++ b/packages/create-strapi-app/package.json @@ -1,6 +1,6 @@ { "name": "create-strapi-app", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Generate a new Strapi application.", "license": "MIT", "homepage": "http://strapi.io", @@ -21,7 +21,7 @@ ], "dependencies": { "commander": "^2.20.0", - "strapi-generate-new": "3.0.0-beta.18.1" + "strapi-generate-new": "3.0.0-beta.18.2" }, "scripts": { "test": "echo \"no tests yet\"" diff --git a/packages/strapi-admin/admin/src/components/Logout/index.js b/packages/strapi-admin/admin/src/components/Logout/index.js index 8fe44a6b7f..79249dddfe 100644 --- a/packages/strapi-admin/admin/src/components/Logout/index.js +++ b/packages/strapi-admin/admin/src/components/Logout/index.js @@ -26,9 +26,9 @@ const Logout = ({ history: { push } }) => { const id = get(auth.getUserInfo(), 'id'); push({ - pathname: `/plugins/content-manager/administrator/${id}`, + pathname: `/plugins/content-manager/strapi::administrator/${id}`, search: - '?redirectUrl=/plugins/content-manager/administrator/?page=0&limit=0&sort=id&source=admin', + '?redirectUrl=/plugins/content-manager/strapi::administrator/?_page=0&_limit=0&_sort=id', }); }; const handleGoToAdministrator = () => { diff --git a/packages/strapi-admin/admin/src/containers/App/index.js b/packages/strapi-admin/admin/src/containers/App/index.js index d56d4ad8d0..b08a1b4dd0 100644 --- a/packages/strapi-admin/admin/src/containers/App/index.js +++ b/packages/strapi-admin/admin/src/containers/App/index.js @@ -48,7 +48,7 @@ function App(props) { if (uuid) { try { - await fetch('https://analytics.strapi.io/track', { + fetch('https://analytics.strapi.io/track', { method: 'POST', body: JSON.stringify({ event: 'didInitializeAdministration', diff --git a/packages/strapi-admin/admin/src/translations/en.json b/packages/strapi-admin/admin/src/translations/en.json index 3d21e63388..de1dfada7d 100644 --- a/packages/strapi-admin/admin/src/translations/en.json +++ b/packages/strapi-admin/admin/src/translations/en.json @@ -130,6 +130,7 @@ "components.Input.error.validation.required": "This value is required.", "components.Input.error.validation.unique": "This value is already used.", "components.InputSelect.option.placeholder": "Choose here", + "component.Input.error.validation.integer": "The value must be an integer", "components.ListRow.empty": "There is no data to be shown.", "components.OverlayBlocker.description": "You're using a feature that needs the server to restart. Please wait until the server is up.", "components.OverlayBlocker.description.serverError": "The server should have restarted, please check your logs in the terminal.", diff --git a/packages/strapi-admin/package.json b/packages/strapi-admin/package.json index cf6dd56308..1b8b3b05a6 100644 --- a/packages/strapi-admin/package.json +++ b/packages/strapi-admin/package.json @@ -1,6 +1,6 @@ { "name": "strapi-admin", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Strapi Admin", "repository": { "type": "git", @@ -80,8 +80,8 @@ "reselect": "^3.0.1", "sanitize.css": "^4.1.0", "shelljs": "^0.7.8", - "strapi-helper-plugin": "3.0.0-beta.18.1", - "strapi-utils": "3.0.0-beta.18.1", + "strapi-helper-plugin": "3.0.0-beta.18.2", + "strapi-utils": "3.0.0-beta.18.2", "style-loader": "^0.23.1", "styled-components": "^4.2.0", "terser-webpack-plugin": "^1.2.3", diff --git a/packages/strapi-connector-bookshelf/package.json b/packages/strapi-connector-bookshelf/package.json index 9498b1f352..f187a9ccbe 100644 --- a/packages/strapi-connector-bookshelf/package.json +++ b/packages/strapi-connector-bookshelf/package.json @@ -1,6 +1,6 @@ { "name": "strapi-connector-bookshelf", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Bookshelf hook for the Strapi framework", "homepage": "http://strapi.io", "keywords": [ @@ -22,7 +22,7 @@ "lodash": "^4.17.11", "pluralize": "^7.0.0", "rimraf": "^2.6.3", - "strapi-utils": "3.0.0-beta.18.1" + "strapi-utils": "3.0.0-beta.18.2" }, "strapi": { "dependencies": [ diff --git a/packages/strapi-connector-mongoose/lib/mount-models.js b/packages/strapi-connector-mongoose/lib/mount-models.js index 3a7bb15392..44e93f0f24 100644 --- a/packages/strapi-connector-mongoose/lib/mount-models.js +++ b/packages/strapi-connector-mongoose/lib/mount-models.js @@ -364,6 +364,14 @@ const createOnFetchPopulateFn = ({ } }); + if (definition.modelType === 'component') { + definition.associations + .filter(ast => ast.autoPopulate !== false) + .forEach(ast => { + this.populate({ path: ast.alias }); + }); + } + componentAttributes.forEach(key => { this.populate({ path: `${key}.ref` }); }); diff --git a/packages/strapi-connector-mongoose/package.json b/packages/strapi-connector-mongoose/package.json index ca6f1bdf76..7b4fd73532 100644 --- a/packages/strapi-connector-mongoose/package.json +++ b/packages/strapi-connector-mongoose/package.json @@ -1,6 +1,6 @@ { "name": "strapi-connector-mongoose", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Mongoose hook for the Strapi framework", "homepage": "http://strapi.io", "keywords": [ @@ -20,7 +20,7 @@ "mongoose-float": "^1.0.4", "mongoose-long": "^0.2.1", "pluralize": "^7.0.0", - "strapi-utils": "3.0.0-beta.18.1" + "strapi-utils": "3.0.0-beta.18.2" }, "author": { "email": "hi@strapi.io", diff --git a/packages/strapi-database/package.json b/packages/strapi-database/package.json index 0562d72765..248e044318 100644 --- a/packages/strapi-database/package.json +++ b/packages/strapi-database/package.json @@ -1,6 +1,6 @@ { "name": "strapi-database", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Strapi's database layer", "homepage": "http://strapi.io", "main": "./lib/index.js", diff --git a/packages/strapi-generate-api/package.json b/packages/strapi-generate-api/package.json index 97bfc48493..0d7ba6d6cc 100644 --- a/packages/strapi-generate-api/package.json +++ b/packages/strapi-generate-api/package.json @@ -1,6 +1,6 @@ { "name": "strapi-generate-api", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Generate an API for a Strapi application.", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-generate-controller/package.json b/packages/strapi-generate-controller/package.json index bc41a7faff..e8f9c650d1 100644 --- a/packages/strapi-generate-controller/package.json +++ b/packages/strapi-generate-controller/package.json @@ -1,6 +1,6 @@ { "name": "strapi-generate-controller", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Generate a controller for a Strapi API.", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-generate-model/package.json b/packages/strapi-generate-model/package.json index 6c08f5a24c..68a7ca451f 100644 --- a/packages/strapi-generate-model/package.json +++ b/packages/strapi-generate-model/package.json @@ -1,6 +1,6 @@ { "name": "strapi-generate-model", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Generate a model for a Strapi API.", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-generate-new/package.json b/packages/strapi-generate-new/package.json index 9e7d9343bc..7936c213ce 100644 --- a/packages/strapi-generate-new/package.json +++ b/packages/strapi-generate-new/package.json @@ -1,6 +1,6 @@ { "name": "strapi-generate-new", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Generate a new Strapi application.", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-generate-plugin/package.json b/packages/strapi-generate-plugin/package.json index 05ff91bf21..3d5afe87bc 100644 --- a/packages/strapi-generate-plugin/package.json +++ b/packages/strapi-generate-plugin/package.json @@ -1,6 +1,6 @@ { "name": "strapi-generate-plugin", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Generate an plugin for a Strapi application.", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-generate-policy/package.json b/packages/strapi-generate-policy/package.json index 3c7763d323..fd27a701e8 100644 --- a/packages/strapi-generate-policy/package.json +++ b/packages/strapi-generate-policy/package.json @@ -1,6 +1,6 @@ { "name": "strapi-generate-policy", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Generate a policy for a Strapi API.", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-generate-service/package.json b/packages/strapi-generate-service/package.json index 44cea1e20c..acb8a7ffa1 100644 --- a/packages/strapi-generate-service/package.json +++ b/packages/strapi-generate-service/package.json @@ -1,6 +1,6 @@ { "name": "strapi-generate-service", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Generate a service for a Strapi API.", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-generate/package.json b/packages/strapi-generate/package.json index 1773bbb0c0..2e904d6931 100644 --- a/packages/strapi-generate/package.json +++ b/packages/strapi-generate/package.json @@ -1,6 +1,6 @@ { "name": "strapi-generate", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Master of ceremonies for the Strapi generators.", "homepage": "http://strapi.io", "keywords": [ @@ -20,7 +20,7 @@ "fs-extra": "^8.0.1", "lodash": "^4.17.11", "reportback": "^2.0.2", - "strapi-utils": "3.0.0-beta.18.1" + "strapi-utils": "3.0.0-beta.18.2" }, "author": { "name": "Strapi team", diff --git a/packages/strapi-helper-plugin/lib/src/utils/translatedErrors.js b/packages/strapi-helper-plugin/lib/src/utils/translatedErrors.js index ccaa42194a..642e18cc52 100644 --- a/packages/strapi-helper-plugin/lib/src/utils/translatedErrors.js +++ b/packages/strapi-helper-plugin/lib/src/utils/translatedErrors.js @@ -8,6 +8,7 @@ const errorsTrads = { regex: 'components.Input.error.validation.regex', required: 'components.Input.error.validation.required', unique: 'components.Input.error.validation.unique', + integer: 'component.Input.error.validation.integer', }; export default errorsTrads; diff --git a/packages/strapi-helper-plugin/package.json b/packages/strapi-helper-plugin/package.json index d3f9bb9a09..67adf87d6e 100644 --- a/packages/strapi-helper-plugin/package.json +++ b/packages/strapi-helper-plugin/package.json @@ -1,6 +1,6 @@ { "name": "strapi-helper-plugin", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Helper for Strapi plugins development", "files": [ "dist" diff --git a/packages/strapi-hook-ejs/package.json b/packages/strapi-hook-ejs/package.json index 6eb1083085..006e235ab8 100644 --- a/packages/strapi-hook-ejs/package.json +++ b/packages/strapi-hook-ejs/package.json @@ -1,6 +1,6 @@ { "name": "strapi-hook-ejs", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "EJS hook for the Strapi framework", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-hook-redis/package.json b/packages/strapi-hook-redis/package.json index eb680127a2..535de10b0b 100644 --- a/packages/strapi-hook-redis/package.json +++ b/packages/strapi-hook-redis/package.json @@ -1,6 +1,6 @@ { "name": "strapi-hook-redis", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Redis hook for the Strapi framework", "homepage": "http://strapi.io", "keywords": [ @@ -19,7 +19,7 @@ "lodash": "^4.17.11", "rimraf": "^2.6.3", "stack-trace": "0.0.10", - "strapi-utils": "3.0.0-beta.18.1" + "strapi-utils": "3.0.0-beta.18.2" }, "author": { "email": "hi@strapi.io", diff --git a/packages/strapi-middleware-views/package.json b/packages/strapi-middleware-views/package.json index 8bbc984a5b..a1e4b3b4a7 100644 --- a/packages/strapi-middleware-views/package.json +++ b/packages/strapi-middleware-views/package.json @@ -1,6 +1,6 @@ { "name": "strapi-middleware-views", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Views middleware to enable server-side rendering for the Strapi framework", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-plugin-content-manager/admin/src/components/DraggedFieldWithPreview/DynamicComponent.js b/packages/strapi-plugin-content-manager/admin/src/components/DraggedFieldWithPreview/DynamicComponent.js index a26df27eef..c478534c43 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/DraggedFieldWithPreview/DynamicComponent.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/DraggedFieldWithPreview/DynamicComponent.js @@ -8,6 +8,7 @@ import Tooltip from './Tooltip'; const DynamicComponent = ({ componentUid, friendlyName, + icon, setIsOverDynamicZone, }) => { const [state, setState] = useState(false); @@ -22,6 +23,7 @@ const DynamicComponent = ({ { push( @@ -38,11 +40,13 @@ const DynamicComponent = ({ DynamicComponent.defaultProps = { friendlyName: '', + icon: 'smile', }; DynamicComponent.propTypes = { componentUid: PropTypes.string.isRequired, friendlyName: PropTypes.string, + icon: PropTypes.string, setIsOverDynamicZone: PropTypes.func.isRequired, }; diff --git a/packages/strapi-plugin-content-manager/admin/src/components/DraggedFieldWithPreview/index.js b/packages/strapi-plugin-content-manager/admin/src/components/DraggedFieldWithPreview/index.js index cccc7f6e3c..4058c38b91 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/DraggedFieldWithPreview/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/DraggedFieldWithPreview/index.js @@ -46,8 +46,8 @@ const DraggedFieldWithPreview = forwardRef( 'dynamiczone', ]; const withLongerHeight = higherFields.includes(type) && !dragStart; - const getCompoFriendlyName = uid => - get(componentLayouts, [uid, 'schema', 'info', 'name'], ''); + const getCompoInfos = uid => + get(componentLayouts, [uid, 'schema', 'info'], { name: '', icon: '' }); const componentData = get(componentLayouts, [componentUid], {}); const componentLayout = get(componentData, ['layouts', 'edit'], []); @@ -146,11 +146,14 @@ const DraggedFieldWithPreview = forwardRef( {type === 'dynamiczone' && ( {dynamicZoneComponents.map(compo => { + const { name, icon } = getCompoInfos(compo); + return ( ); diff --git a/packages/strapi-plugin-content-manager/admin/src/components/Inputs/index.js b/packages/strapi-plugin-content-manager/admin/src/components/Inputs/index.js index 45714f7dfd..802dae5d11 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/Inputs/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/Inputs/index.js @@ -14,7 +14,6 @@ const getInputType = (type = '') => { switch (toLower(type)) { case 'boolean': return 'bool'; - case 'biginteger': case 'decimal': case 'float': case 'integer': @@ -114,6 +113,14 @@ function Inputs({ autoFocus, keys, layout, name, onBlur }) { inputValue = []; } + let step; + + if (type === 'float' || type === 'decimal') { + step = 'any'; + } else { + step = '1'; + } + return ( {error => { @@ -141,6 +148,7 @@ function Inputs({ autoFocus, keys, layout, name, onBlur }) { onBlur={onBlur} onChange={onChange} options={get(attribute, 'enum', [])} + step={step} type={getInputType(type)} validations={validations} value={inputValue} diff --git a/packages/strapi-plugin-content-manager/admin/src/components/RepeatableComponent/index.js b/packages/strapi-plugin-content-manager/admin/src/components/RepeatableComponent/index.js index 91ac7a8b01..db977326eb 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/RepeatableComponent/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/RepeatableComponent/index.js @@ -52,6 +52,7 @@ const RepeatableComponent = ({ const errorsArray = componentErrorKeys.map(key => get(formErrors, [key, 'id'], '') ); + const hasMinError = get(errorsArray, [0], '').includes('min') && !collapses.some(obj => obj.isOpen === true); diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/index.js b/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/index.js index ab2433ade3..61a0439393 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/index.js @@ -196,6 +196,10 @@ const EditViewDataManagerProvider = ({ inputValue = null; } + if (type === 'biginteger' && value === '') { + inputValue = null; + } + dispatch({ type: 'ON_CHANGE', keys: name.split('.'), @@ -262,7 +266,7 @@ const EditViewDataManagerProvider = ({ }); redirectToPreviousPage(); } catch (err) { - console.log({ err }); + console.error({ err }); const error = get( err, ['response', 'payload', 'message', '0', 'messages', '0', 'id'], @@ -277,6 +281,7 @@ const EditViewDataManagerProvider = ({ } } catch (err) { const errors = getYupInnerErrors(err); + console.error({ err, errors }); dispatch({ type: 'SUBMIT_ERRORS', diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js b/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js index ae7eaadd0d..270dca5974 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js @@ -7,6 +7,7 @@ import { isArray, isEmpty, isNaN, + toNumber, } from 'lodash'; import * as yup from 'yup'; import { translatedErrors as errorsTrads } from 'strapi-helper-plugin'; @@ -28,6 +29,34 @@ yup.addMethod(yup.array, 'notEmptyMin', function(min) { }); }); +yup.addMethod(yup.string, 'isInferior', function(message, max) { + return this.test('isInferior', message, function(value) { + if (!value) { + return true; + } + + if (Number.isNaN(toNumber(value))) { + return true; + } + + return toNumber(max) >= toNumber(value); + }); +}); + +yup.addMethod(yup.string, 'isSuperior', function(message, min) { + return this.test('isSuperior', message, function(value) { + if (!value) { + return true; + } + + if (Number.isNaN(toNumber(value))) { + return true; + } + + return toNumber(value) >= toNumber(min); + }); +}); + const getAttributes = data => get(data, ['schema', 'attributes'], {}); const createYupSchema = (model, { components }) => { @@ -80,7 +109,26 @@ const createYupSchema = (model, { components }) => { .nullable(); if (min) { - componentSchema = componentSchema.min(min, errorsTrads.min); + componentSchema = yup.lazy(array => { + if (attribute.required) { + return yup + .array() + .of(componentFieldSchema) + .defined() + .min(min, errorsTrads.min); + } + + let schema = yup + .array() + .of(componentFieldSchema) + .nullable(); + + if (array && !isEmpty(array)) { + schema = schema.min(min, errorsTrads.min); + } + + return schema; + }); } if (max) { @@ -146,6 +194,7 @@ const createYupSchema = (model, { components }) => { const createYupSchemaAttribute = (type, validations) => { let schema = yup.mixed(); + if ( ['string', 'text', 'richtext', 'email', 'password', 'enumeration'].includes( type @@ -153,6 +202,7 @@ const createYupSchemaAttribute = (type, validations) => { ) { schema = yup.string(); } + if (type === 'json') { schema = yup .mixed(errorsTrads.json) @@ -183,16 +233,22 @@ const createYupSchemaAttribute = (type, validations) => { if (type === 'email') { schema = schema.email(errorsTrads.email); } + if (['number', 'integer', 'biginteger', 'float', 'decimal'].includes(type)) { schema = yup .number() .transform(cv => (isNaN(cv) ? undefined : cv)) .typeError(); } + if (['date', 'datetime'].includes(type)) { schema = yup.date(); } + if (type === 'biginteger') { + schema = yup.string().matches(/^\d*$/); + } + Object.keys(validations).forEach(validation => { const validationValue = validations[validation]; if ( @@ -205,15 +261,25 @@ const createYupSchemaAttribute = (type, validations) => { case 'required': schema = schema.required(errorsTrads.required); break; - case 'max': - schema = schema.max(validationValue, errorsTrads.max); + case 'max': { + if (type === 'biginteger') { + schema = schema.isInferior(errorsTrads.max, validationValue); + } else { + schema = schema.max(validationValue, errorsTrads.max); + } break; + } case 'maxLength': schema = schema.max(validationValue, errorsTrads.maxLength); break; - case 'min': - schema = schema.min(validationValue, errorsTrads.min); + case 'min': { + if (type === 'biginteger') { + schema = schema.isSuperior(errorsTrads.min, validationValue); + } else { + schema = schema.min(validationValue, errorsTrads.min); + } break; + } case 'minLength': schema = schema.min(validationValue, errorsTrads.minLength); break; @@ -249,6 +315,7 @@ const createYupSchemaAttribute = (type, validations) => { } } }); + return schema; }; diff --git a/packages/strapi-plugin-content-manager/package.json b/packages/strapi-plugin-content-manager/package.json index 58cf1fff30..ae76bb4317 100644 --- a/packages/strapi-plugin-content-manager/package.json +++ b/packages/strapi-plugin-content-manager/package.json @@ -1,6 +1,6 @@ { "name": "strapi-plugin-content-manager", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "A powerful UI to easily manage your data.", "strapi": { "name": "Content Manager", @@ -32,8 +32,8 @@ "redux-immutable": "^4.0.0", "reselect": "^3.0.1", "showdown": "^1.9.0", - "strapi-helper-plugin": "3.0.0-beta.18.1", - "strapi-utils": "3.0.0-beta.18.1", + "strapi-helper-plugin": "3.0.0-beta.18.2", + "strapi-utils": "3.0.0-beta.18.2", "styled-components": "^4.2.0", "yup": "^0.27.0" }, diff --git a/packages/strapi-plugin-content-type-builder/admin/src/assets/images/logo.svg b/packages/strapi-plugin-content-type-builder/admin/src/assets/images/logo.svg new file mode 100644 index 0000000000..a13aa373e0 --- /dev/null +++ b/packages/strapi-plugin-content-type-builder/admin/src/assets/images/logo.svg @@ -0,0 +1 @@ +🏭 \ No newline at end of file diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/ComponentSelect/MultipleMenuList.js b/packages/strapi-plugin-content-type-builder/admin/src/components/ComponentSelect/MultipleMenuList.js index 4bea98cc44..09f2726256 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/ComponentSelect/MultipleMenuList.js +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/ComponentSelect/MultipleMenuList.js @@ -1,29 +1,98 @@ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import { components } from 'react-select'; +import { FormattedMessage } from 'react-intl'; import { get } from 'lodash'; import { Checkbox, CheckboxWrapper, Label } from '@buffetjs/styles'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import useDataManager from '../../hooks/useDataManager'; +import useQuery from '../../hooks/useQuery'; +import getTrad from '../../utils/getTrad'; import UpperFirst from '../UpperFirst'; import SubUl from './SubUl'; import Ul from './Ul'; import hasSubArray from './utils/hasSubArray'; const MultipleMenuList = ({ - selectProps: { name, addComponentsToDynamicZone, /*refState, */ value }, + selectProps: { name, addComponentsToDynamicZone, inputValue, value }, ...rest }) => { - const { componentsGroupedByCategory } = useDataManager(); - const collapsesObject = Object.keys(componentsGroupedByCategory).reduce( - (acc, current) => { - acc[current] = false; + const { componentsGroupedByCategory, modifiedData } = useDataManager(); + const query = useQuery(); + const dzName = query.get('dynamicZoneTarget'); + const alreadyUsedComponents = get( + modifiedData, + ['contentType', 'schema', 'attributes', dzName, 'components'], + [] + ); + const filteredComponentsGroupedByCategory = Object.keys( + componentsGroupedByCategory + ).reduce((acc, current) => { + const filteredComponents = componentsGroupedByCategory[current].filter( + ({ uid }) => { + return !alreadyUsedComponents.includes(uid); + } + ); + + if (filteredComponents.length > 0) { + acc[current] = filteredComponents; + } + + return acc; + }, {}); + + const collapsesObject = Object.keys( + filteredComponentsGroupedByCategory + ).reduce((acc, current) => { + acc[current] = false; + + return acc; + }, {}); + const [collapses, setCollapses] = useState(collapsesObject); + const [options, setOptions] = useState(filteredComponentsGroupedByCategory); + + // Search for component + useEffect(() => { + const formattedOptions = Object.keys( + filteredComponentsGroupedByCategory + ).reduce((acc, current) => { + const filteredComponents = filteredComponentsGroupedByCategory[ + current + ].filter(({ schema: { name } }) => { + return name.includes(inputValue); + }); + + if (filteredComponents.length > 0) { + acc[current] = filteredComponents; + } return acc; - }, - {} - ); - const [collapses, setCollapses] = useState(collapsesObject); + }, {}); + + setOptions(formattedOptions); + + const categoriesToOpen = Object.keys(formattedOptions); + + if (inputValue !== '') { + // Close collapses + Object.keys(filteredComponentsGroupedByCategory) + .filter(cat => categoriesToOpen.indexOf(cat) === -1) + .forEach(catName => { + setCollapses(prevState => ({ ...prevState, [catName]: false })); + }); + + categoriesToOpen.forEach(catName => { + setCollapses(prevState => ({ ...prevState, [catName]: true })); + }); + } else { + // Close all collapses + categoriesToOpen.forEach(catName => { + setCollapses(prevState => ({ ...prevState, [catName]: false })); + }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [inputValue]); + const toggleCollapse = catName => { setCollapses(prevState => ({ ...prevState, @@ -33,18 +102,15 @@ const MultipleMenuList = ({ const Component = components.MenuList; - const allComponentsCategory = Object.keys(componentsGroupedByCategory).reduce( - (acc, current) => { - const categoryCompos = componentsGroupedByCategory[current].map(compo => { - return compo.uid; - }); + const allComponentsCategory = Object.keys(options).reduce((acc, current) => { + const categoryCompos = options[current].map(compo => { + return compo.uid; + }); - acc[current] = categoryCompos; + acc[current] = categoryCompos; - return acc; - }, - {} - ); + return acc; + }, {}); const getCategoryValue = categoryName => { const componentsCategory = allComponentsCategory[categoryName]; @@ -79,7 +145,18 @@ const MultipleMenuList = ({ maxHeight: 150, }} > - {Object.keys(componentsGroupedByCategory).map(categoryName => { + {Object.keys(options).length === 0 && ( + + {msg =>
  • {msg}
  • } +
    + )} + {Object.keys(options).map(categoryName => { const isChecked = getCategoryValue(categoryName); const target = { name: categoryName, value: !isChecked }; @@ -124,7 +201,7 @@ const MultipleMenuList = ({ - {componentsGroupedByCategory[categoryName].map(component => { + {options[categoryName].map(component => { const isChecked = get(value, 'value', []).includes( component.uid ); @@ -165,6 +242,7 @@ const MultipleMenuList = ({ MultipleMenuList.defaultProps = { selectProps: { + inputValue: '', refState: { current: { select: { @@ -179,6 +257,7 @@ MultipleMenuList.defaultProps = { MultipleMenuList.propTypes = { selectProps: PropTypes.shape({ addComponentsToDynamicZone: PropTypes.func.isRequired, + inputValue: PropTypes.string, name: PropTypes.string.isRequired, refState: PropTypes.object, value: PropTypes.object, diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/CustomCheckbox/index.js b/packages/strapi-plugin-content-type-builder/admin/src/components/CustomCheckbox/index.js index 634fdb9c43..440a92884b 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/CustomCheckbox/index.js +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/CustomCheckbox/index.js @@ -10,8 +10,18 @@ import { isEmpty, isNumber } from 'lodash'; import { Inputs } from '@buffetjs/custom'; import StyledCustomCheckbox from './StyledCustomCheckbox'; -const CustomCheckbox = ({ label, name, onChange, value, ...rest }) => { +const CustomCheckbox = ({ + label, + modifiedData, + name, + onChange, + value, + ...rest +}) => { const [checked, setChecked] = useState(isNumber(value) || !isEmpty(value)); + const type = modifiedData.type === 'biginteger' ? 'text' : 'number'; + const step = ['decimal', 'float'].includes(modifiedData.type) ? 'any' : '1'; + const disabled = !modifiedData.type; return ( @@ -38,8 +48,10 @@ const CustomCheckbox = ({ label, name, onChange, value, ...rest }) => { {...rest} name={name} onChange={onChange} + step={step} + disabled={disabled} value={value} - type="number" + type={type} /> )} @@ -49,12 +61,14 @@ const CustomCheckbox = ({ label, name, onChange, value, ...rest }) => { CustomCheckbox.defaultProps = { label: null, + modifiedData: {}, name: '', value: null, }; CustomCheckbox.propTypes = { label: PropTypes.string, + modifiedData: PropTypes.object, name: PropTypes.string, onChange: PropTypes.func.isRequired, value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), diff --git a/packages/strapi-plugin-content-type-builder/admin/src/containers/DataManagerProvider/reducer.js b/packages/strapi-plugin-content-type-builder/admin/src/containers/DataManagerProvider/reducer.js index f17c2d4b43..634056bc7e 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/containers/DataManagerProvider/reducer.js +++ b/packages/strapi-plugin-content-type-builder/admin/src/containers/DataManagerProvider/reducer.js @@ -132,7 +132,9 @@ const reducer = (state, action) => { dynamicZoneTarget, 'components', ], - () => fromJS(makeUnique(newComponents)) + list => { + return fromJS(makeUnique([...list.toJS(), ...newComponents])); + } ) .updateIn(['modifiedData', 'components'], old => { const componentsSchema = newComponents.reduce((acc, current) => { diff --git a/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/index.js b/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/index.js index 8c4a75487e..f369cb1fd0 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/index.js +++ b/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/index.js @@ -213,8 +213,10 @@ const FormModal = () => { ); const attributeToEdit = { ...attributeToEditNotFormatted, + // We filter the available components + // Because this modal is only used for adding components + components: [], name: dynamicZoneTarget, - // createComponent: true, createComponent: false, componentToCreate: { type: 'component' }, }; @@ -1238,6 +1240,7 @@ const FormModal = () => { > = toNumber(min); + }); +}); + const ATTRIBUTES_THAT_DONT_HAVE_MIN_MAX_SETTINGS = [ 'boolean', 'date', @@ -210,11 +228,50 @@ const forms = { case 'integer': case 'biginteger': case 'float': - case 'decimal': + case 'decimal': { + if (dataToValidate.type === 'biginteger') { + return yup.object().shape({ + ...commonShape, + default: yup + .string() + .nullable() + .matches(/^\d*$/), + min: yup + .string() + .nullable() + .matches(/^\d*$/) + .when('max', (max, schema) => { + if (max) { + return schema.isInferior( + getTrad('error.validation.minSupMax'), + max + ); + } else { + return schema; + } + }), + + max: yup + .string() + .nullable() + .matches(/^\d*$/), + }); + } + + let defaultType = yup.number(); + + if (dataToValidate.type === 'integer') { + defaultType = yup + .number() + .integer('component.Input.error.validation.integer'); + } + return yup.object().shape({ ...commonShape, + default: defaultType.nullable(), ...numberTypeShape, }); + } case 'relation': return yup.object().shape({ name: yup @@ -312,6 +369,24 @@ const forms = { const items = defaultItems.slice(); + if (type === 'number' && data.type !== 'biginteger') { + const step = + data.type === 'decimal' || data.type === 'float' ? 'any' : '1'; + + items.splice(0, 1, [ + { + autoFocus: true, + name: 'default', + type: 'number', + step, + label: { + id: getTrad('form.attribute.settings.default'), + }, + validations: {}, + }, + ]); + } + if (type === 'media') { items.splice(0, 1); } else if (type === 'boolean') { @@ -758,7 +833,7 @@ const forms = { .required(errorsTrads.required), category: yup .string() - .matches(NAME_REGEX, errorsTrads.regex) + .matches(CATEGORY_NAME_REGEX, errorsTrads.regex) .required(errorsTrads.required), icon: yup.string().required(errorsTrads.required), collectionName: yup.string().nullable(), @@ -821,6 +896,7 @@ const forms = { return yup.object().shape({ name: yup .string() + .matches(CATEGORY_NAME_REGEX, errorsTrads.regex) .unique(errorsTrads.unique, allowedCategories, toLower) .required(errorsTrads.required), }); diff --git a/packages/strapi-plugin-content-type-builder/admin/src/translations/en.json b/packages/strapi-plugin-content-type-builder/admin/src/translations/en.json index 03756c5125..be3c9e5fca 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/translations/en.json +++ b/packages/strapi-plugin-content-type-builder/admin/src/translations/en.json @@ -34,7 +34,9 @@ "button.component.add": "Add a component", "button.component.create": "Create new component", "button.model.create": "Create new content-type", - "components.componentSelect.value-component": "{number} component selected", + "components.componentSelect.no-component-available": "You have already added all your components", + "components.componentSelect.no-component-available.with-search": "There is no component matching your search", + "components.componentSelect.value-component": "{number} component selected (type to search for a component)", "components.componentSelect.value-components": "{number} components selected", "component.repeatable": "(repeatable)", "configurations": "configurations", diff --git a/packages/strapi-plugin-content-type-builder/controllers/validation/common.js b/packages/strapi-plugin-content-type-builder/controllers/validation/common.js index 7b89dc000f..55042ae145 100644 --- a/packages/strapi-plugin-content-type-builder/controllers/validation/common.js +++ b/packages/strapi-plugin-content-type-builder/controllers/validation/common.js @@ -17,6 +17,7 @@ const validators = { const NAME_REGEX = new RegExp('^[A-Za-z][_0-9A-Za-z]*$'); const COLLECTION_NAME_REGEX = new RegExp('^[A-Za-z][-_0-9A-Za-z]*$'); +const CATEGORY_NAME_REGEX = new RegExp('^[A-Za-z][-_0-9A-Za-z]*$'); const ENUM_REGEX = new RegExp('^[_A-Za-z][_0-9A-Za-z]*$'); const ICON_REGEX = new RegExp('^[A-Za-z0-9][-A-Za-z0-9]*$'); @@ -26,6 +27,12 @@ const isValidName = { test: val => val === '' || NAME_REGEX.test(val), }; +const isValidCategoryName = { + name: 'isValidCategoryName', + message: '${path} must match the following regex: /^[A-Za-z][_-0-9A-Za-z]*$/', + test: val => val === '' || CATEGORY_NAME_REGEX.test(val), +}; + const isValidCollectionName = { name: 'isValidCollectionName', message: '${path} must match the following regex: /^[A-Za-z][-_0-9A-Za-z]*$/', @@ -55,6 +62,7 @@ module.exports = { validators, isValidCollectionName, + isValidCategoryName, isValidName, isValidIcon, isValidKey, diff --git a/packages/strapi-plugin-content-type-builder/controllers/validation/component-category.js b/packages/strapi-plugin-content-type-builder/controllers/validation/component-category.js index aab5852cb2..95b1229d23 100644 --- a/packages/strapi-plugin-content-type-builder/controllers/validation/component-category.js +++ b/packages/strapi-plugin-content-type-builder/controllers/validation/component-category.js @@ -3,7 +3,7 @@ const yup = require('yup'); const formatYupErrors = require('./yup-formatter'); -const { isValidName } = require('./common'); +const { isValidCategoryName } = require('./common'); module.exports = data => { return componentCategorySchema @@ -19,7 +19,7 @@ const componentCategorySchema = yup name: yup .string() .min(3) - .test(isValidName) + .test(isValidCategoryName) .required('name.required'), }) .noUnknown(); diff --git a/packages/strapi-plugin-content-type-builder/controllers/validation/component.js b/packages/strapi-plugin-content-type-builder/controllers/validation/component.js index fc6fe2970e..ad978c2cf9 100644 --- a/packages/strapi-plugin-content-type-builder/controllers/validation/component.js +++ b/packages/strapi-plugin-content-type-builder/controllers/validation/component.js @@ -3,7 +3,7 @@ const _ = require('lodash'); const yup = require('yup'); -const { isValidName, isValidIcon } = require('./common'); +const { isValidCategoryName, isValidIcon } = require('./common'); const formatYupErrors = require('./yup-formatter'); const createSchema = require('./model-schema'); const { modelTypes, DEFAULT_TYPES } = require('./constants'); @@ -23,7 +23,7 @@ const componentSchema = createSchema(VALID_TYPES, VALID_RELATIONS, { category: yup .string() .nullable() - .test(isValidName) + .test(isValidCategoryName) .required('category.required'), }) .required() diff --git a/packages/strapi-plugin-content-type-builder/package.json b/packages/strapi-plugin-content-type-builder/package.json index 41acaf487e..b210bd4cba 100644 --- a/packages/strapi-plugin-content-type-builder/package.json +++ b/packages/strapi-plugin-content-type-builder/package.json @@ -1,6 +1,6 @@ { "name": "strapi-plugin-content-type-builder", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Strapi plugin to create content type (API).", "strapi": { "name": "Content Type Builder", @@ -29,9 +29,9 @@ "redux": "^4.0.1", "redux-immutable": "^4.0.0", "reselect": "^3.0.1", - "strapi-generate": "3.0.0-beta.18.1", - "strapi-generate-api": "3.0.0-beta.18.1", - "strapi-helper-plugin": "3.0.0-beta.18.1", + "strapi-generate": "3.0.0-beta.18.2", + "strapi-generate-api": "3.0.0-beta.18.2", + "strapi-helper-plugin": "3.0.0-beta.18.2", "yup": "^0.27.0" }, "author": { diff --git a/packages/strapi-plugin-documentation/package.json b/packages/strapi-plugin-documentation/package.json index fca5bd1383..61dbcd2e4c 100755 --- a/packages/strapi-plugin-documentation/package.json +++ b/packages/strapi-plugin-documentation/package.json @@ -1,6 +1,6 @@ { "name": "strapi-plugin-documentation", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "This is the description of the plugin.", "strapi": { "name": "Documentation", @@ -32,7 +32,7 @@ "redux": "^4.0.1", "redux-immutable": "^4.0.0", "reselect": "^4.0.0", - "strapi-helper-plugin": "3.0.0-beta.18.1", + "strapi-helper-plugin": "3.0.0-beta.18.2", "swagger-ui-dist": "3.24.3" }, "author": { diff --git a/packages/strapi-plugin-documentation/services/utils/parametersOptions.json b/packages/strapi-plugin-documentation/services/utils/parametersOptions.json index 01e003b90f..180901f067 100755 --- a/packages/strapi-plugin-documentation/services/utils/parametersOptions.json +++ b/packages/strapi-plugin-documentation/services/utils/parametersOptions.json @@ -115,7 +115,8 @@ "required": false, "description": "Get records that matches any value in the array of values", "schema": { - "type": "array" + "type": "array", + "items": { "type": "string" } }, "deprecated": false }, @@ -125,8 +126,9 @@ "required": false, "description": "Get records that doesn't match any value in the array of values", "schema": { - "type": "array" + "type": "array", + "items": { "type": "string" } }, "deprecated": false } -] \ No newline at end of file +] diff --git a/packages/strapi-plugin-email/package.json b/packages/strapi-plugin-email/package.json index e55dcd64ad..0581449610 100644 --- a/packages/strapi-plugin-email/package.json +++ b/packages/strapi-plugin-email/package.json @@ -1,6 +1,6 @@ { "name": "strapi-plugin-email", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "This is the description of the plugin.", "strapi": { "name": "Email", @@ -12,13 +12,13 @@ "test": "echo \"no tests yet\"" }, "dependencies": { - "strapi-provider-email-sendmail": "3.0.0-beta.18.1", - "strapi-utils": "3.0.0-beta.18.1" + "strapi-provider-email-sendmail": "3.0.0-beta.18.2", + "strapi-utils": "3.0.0-beta.18.2" }, "devDependencies": { "react-copy-to-clipboard": "5.0.1", "rimraf": "^2.6.3", - "strapi-helper-plugin": "3.0.0-beta.18.1" + "strapi-helper-plugin": "3.0.0-beta.18.2" }, "author": { "name": "Strapi team", diff --git a/packages/strapi-plugin-graphql/package.json b/packages/strapi-plugin-graphql/package.json index 9f12c77905..5e27c441bd 100644 --- a/packages/strapi-plugin-graphql/package.json +++ b/packages/strapi-plugin-graphql/package.json @@ -1,6 +1,6 @@ { "name": "strapi-plugin-graphql", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "This is the description of the plugin.", "strapi": { "name": "graphql", @@ -23,7 +23,7 @@ "graphql-type-long": "^0.1.1", "koa-compose": "^4.1.0", "pluralize": "^7.0.0", - "strapi-utils": "3.0.0-beta.18.1" + "strapi-utils": "3.0.0-beta.18.2" }, "devDependencies": { "cross-env": "^5.2.0", diff --git a/packages/strapi-plugin-upload/package.json b/packages/strapi-plugin-upload/package.json index 55d1b35611..493c77cf4b 100644 --- a/packages/strapi-plugin-upload/package.json +++ b/packages/strapi-plugin-upload/package.json @@ -1,6 +1,6 @@ { "name": "strapi-plugin-upload", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "This is the description of the plugin.", "strapi": { "name": "Files Upload", @@ -23,9 +23,9 @@ "react-router-dom": "^5.0.0", "react-transition-group": "^2.5.0", "reactstrap": "^5.0.0", - "strapi-helper-plugin": "3.0.0-beta.18.1", - "strapi-provider-upload-local": "3.0.0-beta.18.1", - "strapi-utils": "3.0.0-beta.18.1", + "strapi-helper-plugin": "3.0.0-beta.18.2", + "strapi-provider-upload-local": "3.0.0-beta.18.2", + "strapi-utils": "3.0.0-beta.18.2", "stream-to-array": "^2.3.0", "uuid": "^3.2.1" }, diff --git a/packages/strapi-plugin-users-permissions/package.json b/packages/strapi-plugin-users-permissions/package.json index 51587ff82f..0117c7bf03 100644 --- a/packages/strapi-plugin-users-permissions/package.json +++ b/packages/strapi-plugin-users-permissions/package.json @@ -1,6 +1,6 @@ { "name": "strapi-plugin-users-permissions", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Protect your API with a full-authentication process based on JWT", "strapi": { "name": "Roles & Permissions", @@ -31,8 +31,8 @@ "reactstrap": "^5.0.0", "redux-saga": "^0.16.0", "request": "^2.83.0", - "strapi-helper-plugin": "3.0.0-beta.18.1", - "strapi-utils": "3.0.0-beta.18.1", + "strapi-helper-plugin": "3.0.0-beta.18.2", + "strapi-utils": "3.0.0-beta.18.2", "uuid": "^3.1.0" }, "devDependencies": { diff --git a/packages/strapi-provider-email-amazon-ses/package.json b/packages/strapi-provider-email-amazon-ses/package.json index 2a41007822..6e2aa7dd3a 100644 --- a/packages/strapi-provider-email-amazon-ses/package.json +++ b/packages/strapi-provider-email-amazon-ses/package.json @@ -1,6 +1,6 @@ { "name": "strapi-provider-email-amazon-ses", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Amazon SES provider for strapi email", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-provider-email-mailgun/package.json b/packages/strapi-provider-email-mailgun/package.json index e04bcf9f4f..4ce84c41c9 100644 --- a/packages/strapi-provider-email-mailgun/package.json +++ b/packages/strapi-provider-email-mailgun/package.json @@ -1,6 +1,6 @@ { "name": "strapi-provider-email-mailgun", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Mailgun provider for strapi email plugin", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-provider-email-sendgrid/package.json b/packages/strapi-provider-email-sendgrid/package.json index 0e4b0a8a51..b4439f49dd 100644 --- a/packages/strapi-provider-email-sendgrid/package.json +++ b/packages/strapi-provider-email-sendgrid/package.json @@ -1,6 +1,6 @@ { "name": "strapi-provider-email-sendgrid", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Sendgrid provider for strapi email", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-provider-email-sendmail/package.json b/packages/strapi-provider-email-sendmail/package.json index 438db0cf6f..4e96b01557 100644 --- a/packages/strapi-provider-email-sendmail/package.json +++ b/packages/strapi-provider-email-sendmail/package.json @@ -1,6 +1,6 @@ { "name": "strapi-provider-email-sendmail", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Sendmail provider for strapi email", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-provider-upload-aws-s3/package.json b/packages/strapi-provider-upload-aws-s3/package.json index a0ec5f26a2..7506758199 100644 --- a/packages/strapi-provider-upload-aws-s3/package.json +++ b/packages/strapi-provider-upload-aws-s3/package.json @@ -1,6 +1,6 @@ { "name": "strapi-provider-upload-aws-s3", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "AWS S3 provider for strapi upload", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-provider-upload-cloudinary/package.json b/packages/strapi-provider-upload-cloudinary/package.json index 15ccf0acf6..9379faf2ee 100644 --- a/packages/strapi-provider-upload-cloudinary/package.json +++ b/packages/strapi-provider-upload-cloudinary/package.json @@ -1,6 +1,6 @@ { "name": "strapi-provider-upload-cloudinary", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Cloudinary provider for strapi upload", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-provider-upload-local/package.json b/packages/strapi-provider-upload-local/package.json index 75cb260fef..7408cf31fd 100644 --- a/packages/strapi-provider-upload-local/package.json +++ b/packages/strapi-provider-upload-local/package.json @@ -1,6 +1,6 @@ { "name": "strapi-provider-upload-local", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Local provider for strapi upload", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi-provider-upload-rackspace/package.json b/packages/strapi-provider-upload-rackspace/package.json index 6d72468c3c..fa50e509f7 100644 --- a/packages/strapi-provider-upload-rackspace/package.json +++ b/packages/strapi-provider-upload-rackspace/package.json @@ -1,6 +1,6 @@ { "name": "strapi-provider-upload-rackspace", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Rackspace provider for strapi upload", "main": "./lib", "keywords": [], diff --git a/packages/strapi-utils/package.json b/packages/strapi-utils/package.json index 64dfe8947a..8b8108a24a 100644 --- a/packages/strapi-utils/package.json +++ b/packages/strapi-utils/package.json @@ -1,6 +1,6 @@ { "name": "strapi-utils", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "Shared utilities for the Strapi packages", "homepage": "http://strapi.io", "keywords": [ diff --git a/packages/strapi/package.json b/packages/strapi/package.json index 02d287831d..1afd7a5a99 100644 --- a/packages/strapi/package.json +++ b/packages/strapi/package.json @@ -1,6 +1,6 @@ { "name": "strapi", - "version": "3.0.0-beta.18.1", + "version": "3.0.0-beta.18.2", "description": "An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MongoDB, MySQL, MariaDB, PostgreSQL, SQLite", "homepage": "http://strapi.io", "directories": { @@ -49,16 +49,16 @@ "resolve-cwd": "^3.0.0", "rimraf": "^2.6.2", "shelljs": "^0.8.3", - "strapi-database": "3.0.0-beta.18.1", - "strapi-generate": "3.0.0-beta.18.1", - "strapi-generate-api": "3.0.0-beta.18.1", - "strapi-generate-controller": "3.0.0-beta.18.1", - "strapi-generate-model": "3.0.0-beta.18.1", - "strapi-generate-new": "3.0.0-beta.18.1", - "strapi-generate-plugin": "3.0.0-beta.18.1", - "strapi-generate-policy": "3.0.0-beta.18.1", - "strapi-generate-service": "3.0.0-beta.18.1", - "strapi-utils": "3.0.0-beta.18.1" + "strapi-database": "3.0.0-beta.18.2", + "strapi-generate": "3.0.0-beta.18.2", + "strapi-generate-api": "3.0.0-beta.18.2", + "strapi-generate-controller": "3.0.0-beta.18.2", + "strapi-generate-model": "3.0.0-beta.18.2", + "strapi-generate-new": "3.0.0-beta.18.2", + "strapi-generate-plugin": "3.0.0-beta.18.2", + "strapi-generate-policy": "3.0.0-beta.18.2", + "strapi-generate-service": "3.0.0-beta.18.2", + "strapi-utils": "3.0.0-beta.18.2" }, "scripts": { "test": "jest --verbose",