Merge branch 'master' into issue/2327

This commit is contained in:
Jim LAURIE 2019-01-22 13:52:13 +01:00 committed by GitHub
commit f90255bb75
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
123 changed files with 625 additions and 427 deletions

View File

@ -2,18 +2,26 @@
<!-- Uncomment the correct contribution type. !-->
My PR is a:
**My PR is a:**
- [ ] 💥 Breaking change
- [ ] 🐛 Bug fix #issueNumber
- [ ] 💅 Enhancement
- [ ] 🚀 New feature
Main update on the:
**Main update on the:**
- [ ] Admin
- [ ] Documentation
- [ ] Framework
- [ ] Plugin
<!-- Please note that all databases should be tested and confirmed to be working prior to the PR being merged. -->
**Manual testing done on the follow databases:**
- [ ] Not applicable
- [ ] MongoDB
- [ ] MySQL
- [ ] Postgres
<!-- Write a short description of what your PR does and link the concerned issues of your update. -->
**Description:**
<!-- ⚠️ Please link issue(s) you close / fix by using GitHub keywords https://help.github.com/articles/closing-issues-using-keywords/ !-->

View File

@ -57,7 +57,7 @@ Node:
* NodeJS >= 10.x
* NPM >= 6.x
**Please note that right now Node 11 is not Officially supported, and the current Node LTS (v10) should be used.**
**Please note that right now Node 11 is not supported, and the current Node LTS (v10) should be used.**
Database:
* MongoDB >= 3.x
@ -71,8 +71,8 @@ Database:
npm install strapi@alpha -g
````
**We recommend to use the latest version of Strapi to start your new project**.
Some breaking changes might happen, new releases are shipped every two weeks to fix/enhance the product.
**We recommend always using the latest version of Strapi to start your new project**.
As this project is currently in Alpha, some breaking changes may occur. New releases are shipped every two weeks to fix/enhance the project.
#### 🏗 Create a new project
@ -80,7 +80,7 @@ Some breaking changes might happen, new releases are shipped every two weeks to
strapi new my-project
```
It will generate a brand new project with the default features (authentication, permissions, content management, content type builder & file upload).
This command will generate a brand new project with the default features (authentication, permissions, content management, content type builder & file upload).
#### 🚀 Start your project
@ -109,8 +109,7 @@ Be aware that one of the content type builder won't work due to the writing file
## Features
- **Modern Admin Panel:**
Elegant, entirely customizable and fully extensible admin panel.
- **Modern Admin Panel:** Elegant, entirely customizable and fully extensible admin panel.
- **Secure by default:** Reusable policies, CSRF, CORS, P3P, Xframe, XSS, and more.
- **Plugins Oriented:** Install auth system, content management, custom plugins, and more, in seconds.
- **Blazing Fast:** Built on top of Node.js, Strapi delivers amazing performances.
@ -133,7 +132,7 @@ For more information on the upcoming version, please take a look to our [ROADMAP
For general help using Strapi, please refer to [the official Strapi documentation](https://strapi.io/documentation/). For additional help, you can use one of this channel to ask question:
- [StackOverflow](http://stackoverflow.com/questions/tagged/strapi)
- [Slack](http://slack.strapi.io) (highly recommended for realtime support)
- [Slack](http://slack.strapi.io) (highly recommended for faster support)
- [GitHub](https://github.com/strapi/strapi)
- [Twitter](https://twitter.com/strapijs)
- [Facebook](https://www.facebook.com/Strapi-616063331867161).

View File

@ -28,9 +28,9 @@ npm install strapi@alpha -g
If you encounter npm permissions issues, [change the permissions to npm default directory](https://docs.npmjs.com/getting-started/fixing-npm-permissions#option-1-change-the-permission-to-npms-default-directory).
:::
It takes about 20 seconds with a good Internet connection. You can take a coffee ☕️ if you have a slow one.
It takes about 20 seconds with a good Internet connection. You can take a coffee ☕️ break if your internet is slow.
Having troubles during the installation? Check if someone already had the [same issue](https://github.com/strapi/strapi/issues). If not, please [post one](https://github.com/strapi/strapi/issues/new).
Having troubles during the installation? Check if someone already had the [same issue](https://github.com/strapi/strapi/issues). If not, please [submit an issue](https://github.com/strapi/strapi/issues/new).
## Check installation

View File

@ -21,6 +21,22 @@ Update the `production` settings with the IP and domain name where the project w
In case your database is not running on the same server, make sure that the environment of your production
database (`./config/environments/production/database.json`) is set properly.
If you are passing a number of configuration item values via environment variables which is always encouraged for production environment to keep application stateless, checkout the section for [Dynamic Configuration](../configurations/configurations.md#dynamic-configurations). Here is a hint on how to do it for production, for the configuration mentioned above:
**Path —** `./config/environments/production/server.json`.
```js
{
"host": "${process.env.APP_HOST || '127.0.0.1'}"
"port": "${process.env.NODE_PORT || 1337}",
"autoReload": {
"enabled": false
},
"admin": {
"path": "/dashboard" // We highly recommend to change the default `/admin` path for security reasons.
}
}
```
**⚠️ If you changed the path to access to the administration, the step #2 is required.**
#### #2 - Setup (optional)

View File

@ -82,7 +82,7 @@ Requests system can be implemented in custom code sections.
### Extracting requests filters
To extract the filters from an JavaScript object or a request, you need to call the [`strapi.utils.models.convertParams` helper](../api-reference/reference.md#strapiutils).
To extract the filters from a JavaScript object or a request, you need to call the [`strapi.utils.models.convertParams` helper](../api-reference/reference.md#strapiutils).
::: note
The returned objects are formatted according to the ORM used by the model.

View File

@ -194,7 +194,7 @@ You can also apply different parameters to the query to make more complex querie
- `<field>_lt`: Lower than.
- `<field>_lte`: Lower than or equal to.
- `<field>_gt`: Greater than.
- `<field>_gte`: Lower than or equal to.
- `<field>_gte`: Greater than or equal to.
- `<field>_contains`: Contains.
- `<field>_containss`: Contains sensitive.

View File

@ -27,6 +27,7 @@ The info key on the model-json states information about the model. This informat
The options key on the model-json states.
- `idAttribute`: This tells the model which attribute to expect as the unique identifier for each database row (typically an auto-incrementing primary key named 'id'). _Only valid for strapi-hook-bookshelf_
- `idAttributeType`: Data type of `idAttribute`, accepted list of value bellow. _Only valid for strapi-hook-bookshelf_
- `timestamps`: This tells the model which attributes to use for timestamps. Accepts either `boolean` or `Array` of strings where frist element is create data and second elemtent is update date. Default value when set to `true` for Bookshelf is `["created_at", "updated_at"]` and for MongoDB is `["createdAt", "updatedAt"]`.
## Define the attributes
@ -56,6 +57,7 @@ If you're using SQL databases, you should use the native SQL constraints to appl
- `required` (boolean) — if true adds a required validator for this property.
- `unique` (boolean) — whether to define a unique index on this property.
- `index` (boolean) — adds an index on this property, this will create a [single field index](https://docs.mongodb.com/manual/indexes/#single-field) that will run in the background (*only supported by MongoDB*).
- `max` (integer) — checks if the value is greater than or equal to the given minimum.
- `min` (integer) — checks if the value is less than or equal to the given maximum.
@ -100,7 +102,8 @@ To improve the Developer eXperience when developing or using the administration
"age": {
"type": "integer",
"min": 18,
"max": 99
"max": 99,
"index": true
},
"birthday": {
"type": "date"

View File

@ -63,10 +63,10 @@ Do the same thing for other environments.
#### HTTP call
Now it is time to make the HTTP call. In this example we will use `request` as it is already in the list of Strapi's dependencies. Let's install it:
Now it is time to make the HTTP call. In this example we will use `axios`. Let's install it:
```
npm i request --save
npm i axios --save
```
Edit `api/yourContentType/models/YourContentType.js`:
@ -76,7 +76,7 @@ Edit `api/yourContentType/models/YourContentType.js`:
```js
'use strict';
const request = require('request');
const axios = require('axios');
/**
* Lifecycle callbacks for the `Post` model.
@ -119,5 +119,5 @@ So, to trigger an url on delete, please add `request.post(strapi.config.currentE
- `delete` action of `plugins/content-manager/services/ContentManager.js` (triggered by the Content Manager).
::: note
Do not forget to require `request` at the top of these files.
Do not forget to require `axios` at the top of these files.
:::

View File

@ -22,6 +22,6 @@
- [Migration guide from alpha.14.4 to alpha.14.5](migration-guide-alpha.14.4-to-alpha.14.5.md)
- [Migration guide from alpha.14.5 to alpha.15](migration-guide-alpha.14.5-to-alpha.15.md)
- [Migration guide from alpha.15 to alpha.16](migration-guide-alpha.15-to-alpha.16.md)
- [Migration guide from alpha.15 to alpha.16](migration-guide-alpha.15-to-alpha.16.md)
- [Migration guide from alpha.16 to alpha.17](migration-guide-alpha.16-to-alpha.17.md)
- [Migration guide from alpha.17 to alpha.18](migration-guide-alpha.17-to-alpha.18.md)
- [Migration guide from alpha.18 to alpha.19](migration-guide-alpha.18-to-alpha.19.md)

View File

@ -49,7 +49,7 @@ Delete your old admin folder and replace it by the new one.
Copy this file `/plugins/users-permissions/config/jwt.json` **from your old project** and paste it in the corresponding one in your new project.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it by the new one.

View File

@ -45,7 +45,7 @@ Delete your old admin folder and replace it by the new one.
## Update the Plugins
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it by the new one.

View File

@ -50,7 +50,7 @@ Delete your old admin folder and replace it by the new one.
If you did custom update on one of the plugin, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it by the new one.

View File

@ -52,7 +52,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -51,7 +51,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -50,7 +50,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -52,7 +52,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -50,7 +50,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -50,7 +50,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -51,7 +51,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -51,7 +51,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -50,7 +50,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -50,7 +50,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -50,7 +50,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -44,7 +44,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -50,7 +50,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -50,7 +50,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -48,7 +48,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -50,7 +50,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -50,7 +50,7 @@ Delete your old admin folder and replace it with the new one.
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.

View File

@ -0,0 +1,76 @@
# Migration guide from alpha.18 to alpha.19
**Here are the major changes:**
- Fix CLI database issue for Windows
- Custom timestamp
- Fix write file on production environment
**Useful links:**
- Changelog: [https://github.com/strapi/strapi/releases/tag/v3.0.0-alpha.19](https://github.com/strapi/strapi/releases/tag/v3.0.0-alpha.19)
- GitHub diff: [https://github.com/strapi/strapi/compare/v3.0.0-alpha.18...v3.0.0-alpha.19](https://github.com/strapi/strapi/compare/v3.0.0-alpha.18...v3.0.0-alpha.19)
<br>
::: note
Feel free to [join us on Slack](http://slack.strapi.io) and ask questions about the migration process.
:::
<br>
## Getting started
Install Strapi `alpha.19` globally on your computer. To do so run `npm install strapi@3.0.0-alpha.19 -g`.
When it's done, generate a new empty project `strapi new myNewProject` (don't pay attention to the database configuration).
<br>
## Update node modules
Update the Strapi's dependencies version (move Strapi's dependencies to `3.0.0-alpha.19` version) of your project.
Run `npm install strapi@3.0.0-alpha.19 --save` to update your strapi version.
<br>
## Update the Admin
::: note
If you performed updates in the Admin, you will have to manually migrate your changes.
:::
Delete your old admin folder and replace it with the new one.
<br>
## Update the Plugins
::: note
If you did a custom update on one of the plugins, you will have to manually migrate your update.
:::
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it with the new one.
## Production environment
If you deploy your application on a server that you don't have write file access you will have to update your procution config file.
In `config/environments/production/server.json` file you have to add `production` key with `true` as value.
```
{
...
"port": "${process.env.PORT || 1337}",
"production": true,
"proxy": {
"enabled": false
},
...
}
```
<br>
That's all, you have now upgraded to Strapi `alpha.19`.

View File

@ -60,7 +60,7 @@ Delete your old admin folder and replace it by the new one.
Copy this file `/plugins/users-permissions/config/jwt.json` **from your old project** and paste it in the corresponding one in your new project.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it by the new one.

View File

@ -49,7 +49,7 @@ Delete your old admin folder and replace it by the new one.
Copy this file `/plugins/users-permissions/config/jwt.json` **from your old project** and paste it in the corresponding one in your new project.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` file in the new one.
Copy the fields and relations you had in your `/plugins/users-permissions/models/User.settings.json` and `/plugins/users-permissions/config/jwt.json` file in the new one.
Then, delete your old `plugins` folder and replace it by the new one.

View File

@ -1,6 +1,6 @@
{
"private": true,
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"dependencies": {},
"devDependencies": {
"assert": "~1.3.0",

View File

@ -8,6 +8,8 @@ import React from 'react';
import { defineMessages, FormattedMessage } from 'react-intl';
import { PropTypes } from 'prop-types';
import LeftMenuLink from 'components/LeftMenuLink';
import styles from './styles.scss';
import messages from './messages.json';
defineMessages(messages);
@ -15,8 +17,22 @@ defineMessages(messages);
function LeftMenuFooter({ version }) { // eslint-disable-line react/prefer-stateless-function
return (
<div className={styles.leftMenuFooter}>
<FormattedMessage {...messages.poweredBy} />
<a href={`https://github.com/strapi/strapi/releases/tag/v${version}`} target="_blank">v{version}</a>
<ul className={styles.list}>
<LeftMenuLink
icon="book"
label={messages.documentation.id}
destination="https://strapi.io/documentation"
/>
<LeftMenuLink
icon="question-circle"
label={messages.help.id}
destination="https://strapi.io/help"
/>
</ul>
<div className={styles.poweredBy}>
<FormattedMessage {...messages.poweredBy} />
<a href="https://strapi.io" target="_blank">Strapi</a> <a href={`https://github.com/strapi/strapi/releases/tag/v${version}`} target="_blank">v{version}</a>
</div>
</div>
);
}

View File

@ -1,4 +1,12 @@
{
"documentation": {
"id": "app.components.LeftMenuFooter.documentation",
"defaultMessage": "Documentation"
},
"help": {
"id": "app.components.LeftMenuFooter.help",
"defaultMessage": "Help"
},
"poweredBy": {
"id": "app.components.LeftMenuFooter.poweredBy",
"defaultMessage": "Proudly powered by "

View File

@ -4,26 +4,27 @@
.leftMenuFooter { /* stylelint-disable */
position: absolute;
width: 100%;
display: flex;
justify-content: space-between;
background: $left-menu-bg;
bottom: 0;
}
.list {
list-style: none;
padding: 0;
margin-bottom: 0;
}
.poweredBy {
width: 100%;
bottom: 0;
height: 3rem;
padding-left: 15px;
padding-right: 15px;
line-height: 3rem;
font-family: 'Lato';
background-color: rgba(255, 255, 255, .02);
font-size: 1rem;
font-weight: 400;
letter-spacing: 0.05rem;
vertical-align: middle;
color: $strapi-gray-light;
a {
color: #0097f7;
}
select{
outline: none;
}
}

View File

@ -47,8 +47,22 @@ class LeftMenuLink extends React.Component {
<span className={styles.linkLabel}>{this.props.label}</span>
);
return (
<li className={styles.item}>
// Icon.
const icon = <i className={`${styles.linkIcon} fa-${this.props.icon} fa`} />;
// Create external or internal link.
const link = this.props.destination.includes('http')
? (
<a
className={`${styles.link} ${isLinkActive ? styles.linkActive : ''}`}
href={this.props.destination}
target="_blank"
>
{icon}
{content}
</a>
)
: (
<Link
className={`${styles.link} ${isLinkActive ? styles.linkActive : ''}`}
to={{
@ -56,9 +70,14 @@ class LeftMenuLink extends React.Component {
search: this.props.source ? `?source=${this.props.source}` : '',
}}
>
<i className={`${styles.linkIcon} fa-${this.props.icon} fa`} />
{icon}
{content}
</Link>
);
return (
<li className={styles.item}>
{link}
{plugin}
</li>
);

View File

@ -3,6 +3,7 @@
.leftMenuLinkContainer { /* stylelint-ignore */
padding-top: .6rem;
padding-bottom: 10.2rem; // LeftMenuFooter height
position: absolute;
top: 60px;
right: 0;

View File

@ -5,6 +5,7 @@
*/
import React from 'react';
import { FormattedMessage } from 'react-intl';
import { get } from 'lodash';
import PropTypes from 'prop-types';
import { ButtonDropdown, DropdownItem, DropdownMenu, DropdownToggle } from 'reactstrap';
@ -40,10 +41,10 @@ class Logout extends React.Component { // eslint-disable-line react/prefer-state
</DropdownToggle>
<DropdownMenu className={styles.dropDownContent}>
<DropdownItem onClick={this.handleGoTo} className={styles.item}>
Profile
<FormattedMessage id="app.components.Logout.profile" />
</DropdownItem>
<DropdownItem onClick={this.handleLogout}>
Logout
<FormattedMessage id="app.components.Logout.logout" />
<i className="fa fa-sign-out" />
</DropdownItem>
</DropdownMenu>

View File

@ -75,6 +75,8 @@
"app.components.ListPluginsPage.description": "قائمة الإضافيات المثبتة في المشروع.",
"app.components.ListPluginsPage.helmet.title": "قائمة الإضافات",
"app.components.ListPluginsPage.title": "الإضافات",
"app.components.Logout.profile": "الملف الشخصي",
"app.components.Logout.logout": "الخروج",
"app.components.NotFoundPage.back": "العودة للرئيسية",
"app.components.NotFoundPage.description": "لا يوجد",
"app.components.Official": "الرسمية",

View File

@ -75,6 +75,8 @@
"app.components.LeftMenuLinkContainer.plugins": "Plugins",
"app.components.ListPluginsPage.description": "Liste aller im Projekt installierten Plugins.",
"app.components.ListPluginsPage.helmet.title": "Plugins anzeigen",
"app.components.Logout.profile": "Profil",
"app.components.Logout.logout": "Ausloggen",
"app.components.ListPluginsPage.title": "Plugins",
"app.components.NotFoundPage.back": "Zurück zur Homepage",
"app.components.NotFoundPage.description": "Nicht gefunden",

View File

@ -65,6 +65,8 @@
"app.components.InstallPluginPopup.navLink.faq": "faq",
"app.components.InstallPluginPopup.navLink.screenshots": "Screenshots",
"app.components.InstallPluginPopup.noDescription": "No description available",
"app.components.LeftMenuFooter.documentation": "Documentation",
"app.components.LeftMenuFooter.help": "Help",
"app.components.LeftMenuFooter.poweredBy": "Powered by ",
"app.components.LeftMenuLinkContainer.configuration": "Configurations",
"app.components.LeftMenuLinkContainer.general": "General",
@ -75,6 +77,8 @@
"app.components.ListPluginsPage.description": "List of the installed plugins in the project.",
"app.components.ListPluginsPage.helmet.title": "List plugins",
"app.components.ListPluginsPage.title": "Plugins",
"app.components.Logout.profile": "Profile",
"app.components.Logout.logout": "Logout",
"app.components.NotFoundPage.back": "Back to homepage",
"app.components.NotFoundPage.description": "Not Found",
"app.components.Official": "Official",

View File

@ -75,6 +75,8 @@
"app.components.ListPluginsPage.description": "Lista de los plugins instalados en el proyecto.",
"app.components.ListPluginsPage.helmet.title": "Lista de plugins",
"app.components.ListPluginsPage.title": "Plugins",
"app.components.Logout.profile": "Perfil",
"app.components.Logout.logout": "Cerrar sesión",
"app.components.NotFoundPage.back": "Volver a la página de inicio",
"app.components.NotFoundPage.description": "No encontrado",
"app.components.Official": "Oficial",

View File

@ -66,6 +66,8 @@
"app.components.InstallPluginPopup.navLink.faq": "FAQ",
"app.components.InstallPluginPopup.navLink.screenshots": "Captures d'écran",
"app.components.InstallPluginPopup.noDescription": "Aucune description disponible",
"app.components.LeftMenuFooter.documentation": "Documentation",
"app.components.LeftMenuFooter.help": "Aide",
"app.components.LeftMenuFooter.poweredBy": "Propulsé par ",
"app.components.LeftMenuLinkContainer.configuration": "Configurations",
"app.components.LeftMenuLinkContainer.general": "Général",
@ -75,6 +77,8 @@
"app.components.LeftMenuLinkContainer.plugins": "Plugins",
"app.components.ListPluginsPage.description": "Liste des plugins installés dans le projet.",
"app.components.ListPluginsPage.helmet.title": "List plugins",
"app.components.Logout.profile": "Profil",
"app.components.Logout.logout": "Connectez - Out",
"app.components.ListPluginsPage.title": "Plugins",
"app.components.NotFoundPage.back": "Retourner à la page d'accueil",
"app.components.NotFoundPage.description": "Page introuvable",

View File

@ -75,6 +75,8 @@
"app.components.ListPluginsPage.description": "Lista dei plugin installati nel progetto.",
"app.components.ListPluginsPage.helmet.title": "Lista plugin",
"app.components.ListPluginsPage.title": "Plugins",
"app.components.Logout.profile": "Profilo",
"app.components.Logout.logout": "Disconnettersi",
"app.components.NotFoundPage.back": "Torna alla home",
"app.components.NotFoundPage.description": "Non trovato",
"app.components.Official": "Ufficiale",

View File

@ -75,6 +75,8 @@
"app.components.ListPluginsPage.description": "このプロジェクトでインストールされたプラグイン一覧",
"app.components.ListPluginsPage.helmet.title": "プラグイン一覧",
"app.components.ListPluginsPage.title": "プラグイン",
"app.components.Logout.profile": "プロフィール",
"app.components.Logout.logout": "ログアウト",
"app.components.NotFoundPage.back": "ホームページに戻る",
"app.components.NotFoundPage.description": "見つかりません",
"app.components.Official": "オフィシャル",

View File

@ -74,6 +74,8 @@
"app.components.ListPluginsPage.description": "이 프로젝트에 설치된 플러그인 목록입니다.",
"app.components.ListPluginsPage.helmet.title": "플러그인 목록",
"app.components.ListPluginsPage.title": "플러그인",
"app.components.Logout.profile": "옆모습",
"app.components.Logout.logout": "로그 아웃",
"app.components.NotFoundPage.back": "홈으로 돌아가기",
"app.components.NotFoundPage.description": "찾을 수 없는 페이지입니다.",
"app.components.Official": "공식",

View File

@ -75,6 +75,8 @@
"app.components.ListPluginsPage.description": "Lijst van alle plugins voor dit project",
"app.components.ListPluginsPage.helmet.title": "Alle extensies",
"app.components.ListPluginsPage.title": "Extensies",
"app.components.Logout.profile": "Profil",
"app.components.Logout.logout": "Log ud",
"app.components.NotFoundPage.back": "Terug naar home pagina",
"app.components.NotFoundPage.description": "Niets gevonden",
"app.components.Official": "Officieel",

View File

@ -75,6 +75,8 @@
"app.components.ListPluginsPage.description": "Lista zainstalowanych wtyczek w projekcie.",
"app.components.ListPluginsPage.helmet.title": "Lista wtyczek",
"app.components.ListPluginsPage.title": "Wtyczki",
"app.components.Logout.profile": "Profil",
"app.components.Logout.logout": "Wyloguj",
"app.components.NotFoundPage.back": "Powrót do strony głównej",
"app.components.NotFoundPage.description": "Nie znaleziono",
"app.components.Official": "Oficjalna",

View File

@ -75,6 +75,8 @@
"app.components.ListPluginsPage.description": "Lista de extensões instaladas no projeto.",
"app.components.ListPluginsPage.helmet.title": "Lista de extensões",
"app.components.ListPluginsPage.title": "Extensões",
"app.components.Logout.profile": "Perfil",
"app.components.Logout.logout": "Sair",
"app.components.NotFoundPage.back": "Voltar à página inicial",
"app.components.NotFoundPage.description": "Não encontrado",
"app.components.Official": "Oficial",

View File

@ -75,6 +75,8 @@
"app.components.ListPluginsPage.description": "Lista de extensões instaladas no projecto.",
"app.components.ListPluginsPage.helmet.title": "Lista de extensões",
"app.components.ListPluginsPage.title": "Extensões",
"app.components.Logout.profile": "Perfil",
"app.components.Logout.logout": "Sair",
"app.components.NotFoundPage.back": "Voltar à página inicial",
"app.components.NotFoundPage.description": "Não encontrado",
"app.components.Official": "Oficial",

View File

@ -1,7 +1,7 @@
{
"Analytics": "Аналитика",
"Content Manager": "Редактор контента",
"Content Type Builder": "Конструктор Типов Контента",
"Content Type Builder": "Типы Контента",
"Email": "Email",
"Files Upload": "Загрузка файлов",
"HomePage.notification.newsLetter.success": "Успешная подписка на рассылку новостей",
@ -16,9 +16,9 @@
"Users": "Пользователи",
"Users & Permissions": "Пользователи & Доступы",
"app.components.BlockLink.code": "Примеры кода",
"app.components.BlockLink.code.content": "Обучайтесь на реальных проектах разработанных в сообществе.",
"app.components.BlockLink.code.content": "Обучайтесь на реальных проектах, разработанных в сообществе.",
"app.components.BlockLink.documentation": "Прочитать документацию",
"app.components.BlockLink.documentation.content": "Ознакомтесь с концепциями, документацией и обучающими материалами.",
"app.components.BlockLink.documentation.content": "Ознакомьтесь с концепциями, справочниками и обучающими материалами.",
"app.components.Button.cancel": "Отменить",
"app.components.Button.save": "Сохранить",
"app.components.ComingSoonPage.comingSoon": "Скоро",
@ -27,26 +27,26 @@
"app.components.DownloadInfo.text": "Это может занять около минуты. Спасибо за ваше терпение.",
"app.components.EmptyAttributes.title": "Пока нет полей",
"app.components.HomePage.button.blog": "СМОТРИТЕ БОЛЬШЕ В БЛОГЕ",
"app.components.HomePage.button.quickStart": "ОЗНАКОМТЕСЬ С РУКОВОДСТВОМ ПО БЫСТРОМУ СТАРТУ",
"app.components.HomePage.community": "Найти сообщество в интернете",
"app.components.HomePage.community.content": "Обсудите с членами команды и разработчиками в разных каналах",
"app.components.HomePage.button.quickStart": "ОЗНАКОМИТЬСЯ С РУКОВОДСТВОМ ПО БЫСТРОМУ СТАРТУ",
"app.components.HomePage.community": "Найдите сообщество в интернете",
"app.components.HomePage.community.content": "Обсуждайте с членами команды и разработчиками в разных каналах",
"app.components.HomePage.create": "Создайте ваш первый Тип Контента",
"app.components.HomePage.createBlock.content.first": " ",
"app.components.HomePage.createBlock.content.second": " плагин поможет вам создать структуру ваших данных. Если вы новичок, мы настоятельно рекомендуем вам следить за нашими ",
"app.components.HomePage.createBlock.content.second": " — плагин, который поможет вам определить структуру ваших данных. Если вы новичок, мы настоятельно рекомендуем вам изучить наше ",
"app.components.HomePage.createBlock.content.tutorial": " руководство.",
"app.components.HomePage.cta": "ПОДТВЕРДИТЬ",
"app.components.HomePage.newsLetter": "Подпишитесь на рассылку, чтобы быть в курсе новостей о Strapi",
"app.components.HomePage.cta": "ПОДПИСАТЬСЯ",
"app.components.HomePage.newsLetter": "Подпишитесь на нашу рассылку, чтобы быть в курсе новостей Strapi",
"app.components.HomePage.support": "ПОДДЕРЖИТЕ НАС",
"app.components.HomePage.support.content": "Купите футболку, это поможет нам продолжать работу над проектом, чтобы предоставить вам наилучшее из возможных решений!",
"app.components.HomePage.support.content": "Покупая футболку, вы помогаете нам продолжать работу над проектом и предоставлять вам наилучшее из возможных решений!",
"app.components.HomePage.support.link": "ЗАКАЗАТЬ НАШУ ФУТБОЛКУ СЕЙЧАС",
"app.components.HomePage.welcome": "Добро пожаловать!",
"app.components.HomePage.welcome.again": "Добро пожаловать",
"app.components.HomePage.welcomeBlock.content": "Мы рады, что вы вступили в сообщество. Нам необходима обратная связь для развития проекта, поэтому не стесняйтесь писать нам ",
"app.components.HomePage.welcomeBlock.content.again": "Надеемся у вы делаете успехи в вашем проекте... Следите с последними новостями о Strapi. Мы стараемся изо всех сил, чтобы улучшить продукт основываясь на ваших пожеланиях.",
"app.components.HomePage.welcomeBlock.content.issues": "проблема.",
"app.components.HomePage.welcomeBlock.content.raise": " или поднять ",
"app.components.ImgPreview.hint": "Перетащите файл в эту область или {browse} для загрузки файла",
"app.components.ImgPreview.hint.browse": "просмотреть",
"app.components.HomePage.welcomeBlock.content": "Мы рады, что вы присоединились к сообществу. Нам необходима обратная связь для развития проекта, поэтому не стесняйтесь писать нам в ",
"app.components.HomePage.welcomeBlock.content.again": "Надеемся, что вы делаете успехи в вашем проекте... Следите за последними новостями Strapi. Мы стараемся изо всех сил, чтобы улучшить продукт, основываясь на ваших пожеланиях.",
"app.components.HomePage.welcomeBlock.content.issues": "проблемах.",
"app.components.HomePage.welcomeBlock.content.raise": " или сообщать о ",
"app.components.ImgPreview.hint": "Перетащите файл в эту область или {browse} файл для загрузки",
"app.components.ImgPreview.hint.browse": "выберите",
"app.components.InputFile.newFile": "Добавить новый файл",
"app.components.InputFileDetails.open": "Открыть в новой вкладке",
"app.components.InputFileDetails.originalName": "Первоначальное название:",
@ -56,7 +56,7 @@
"app.components.InstallPluginPage.InputSearch.placeholder": "Искать плагин... (ex: authentication)",
"app.components.InstallPluginPage.description": "Расширяйте ваше приложение без усилий.",
"app.components.InstallPluginPage.helmet": "Магазин - Плагины",
"app.components.InstallPluginPage.plugin.support-us.description": "Поддержите нас купив футболку Strapi. Это поможет нам продолжать работу над проектом, чтобы предоставить вам наилучшее из возможных решений!",
"app.components.InstallPluginPage.plugin.support-us.description": "Поддержите нас, купив футболку Strapi. Это поможет нам продолжать работу над проектом, чтобы предоставить вам наилучшее из возможных решений!",
"app.components.InstallPluginPage.title": "Магазин - Плагины",
"app.components.InstallPluginPopup.downloads": "скачать",
"app.components.InstallPluginPopup.navLink.avis": "avis",
@ -70,23 +70,25 @@
"app.components.LeftMenuLinkContainer.general": "Общие",
"app.components.LeftMenuLinkContainer.installNewPlugin": "Магазин",
"app.components.LeftMenuLinkContainer.listPlugins": "Плагины",
"app.components.LeftMenuLinkContainer.noPluginsInstalled": "Нет установленых плагинов",
"app.components.LeftMenuLinkContainer.noPluginsInstalled": "Нет установленных плагинов",
"app.components.LeftMenuLinkContainer.plugins": "Плагины",
"app.components.ListPluginsPage.description": "Список установленых плагинов.",
"app.components.ListPluginsPage.description": "Список установленных плагинов.",
"app.components.ListPluginsPage.helmet.title": "Список плагинов",
"app.components.ListPluginsPage.title": "Плагины",
"app.components.Logout.profile": "Профиль",
"app.components.Logout.logout": "Выйти",
"app.components.NotFoundPage.back": "Вернуться на главную",
"app.components.NotFoundPage.description": "Не найдено",
"app.components.Official": "Официальный",
"app.components.PluginCard.Button.label.download": "Скачать",
"app.components.PluginCard.Button.label.install": "Уже становленно",
"app.components.PluginCard.Button.label.install": "Уже установленно",
"app.components.PluginCard.Button.label.support": "Поддержать нас",
"app.components.PluginCard.compatible": "Совместимо с вашим приложением",
"app.components.PluginCard.compatibleCommunity": "Совместимо с сообществом",
"app.components.PluginCard.more-details": "Больше деталей",
"app.components.PluginCard.price.free": "Бесплатно",
"app.components.listPlugins.button": "Добавить новый плагин",
"app.components.listPlugins.title.none": "Нет установленых плагинов",
"app.components.listPlugins.title.none": "Нет установленных плагинов",
"app.components.listPlugins.title.plural": "{number} плагинов установленно",
"app.components.listPlugins.title.singular": "{number} плагин установлен",
"app.components.listPluginsPage.deletePlugin.error": "Возникла ошибка при установке плагина",
@ -109,9 +111,9 @@
"components.Input.error.validation.minLength": "Слишком короткое.",
"components.Input.error.validation.minSupMax": "Не может быть выше",
"components.Input.error.validation.regex": "Не соответствует регулярному выражению.",
"components.Input.error.validation.required": "Необходимое поле для заполнение.",
"components.Input.error.validation.required": "Необходимое поле для заполнения.",
"components.ListRow.empty": "Нет данных для отображения.",
"components.OverlayBlocker.description": "Вы воспользовались функционалом который требует перезапуска сервера. Пожалуста подождете пока подниметься сервер.",
"components.OverlayBlocker.description": "Вы воспользовались функционалом, который требует перезапуска сервера. Пожалуйста, подождете.",
"components.OverlayBlocker.title": "Ожидание перезапуска...",
"components.PageFooter.select": "записей на странице",
"components.ProductionBlocker.description": "Для безопасности мы должны заблокировать его для других вариантов.",
@ -128,12 +130,12 @@
"components.Wysiwyg.selectOptions.title": "Добавить заголовок",
"components.WysiwygBottomControls.charactersIndicators": "букв",
"components.WysiwygBottomControls.fullscreen": "Развернуть",
"components.WysiwygBottomControls.uploadFiles": "Перетащите файлы в эту область, добавляйте из буфер обмена или {browse}.",
"components.WysiwygBottomControls.uploadFiles": "Перетащите файлы в эту область, вставьте из буфера обмена или {browse}.",
"components.WysiwygBottomControls.uploadFiles.browse": "выделите их",
"components.popUpWarning.button.cancel": "Отменить",
"components.popUpWarning.button.confirm": "Подтвердить",
"components.popUpWarning.message": "Вы уверены, что хотите удалить это?",
"components.popUpWarning.title": "Пожалуйста подтвердите",
"components.popUpWarning.title": "Пожалуйста, подтвердите",
"notification.error": "Произошла ошибка",
"notification.error.layout": "Не удалось получить макет",
"request.error.model.unknown": "Модель данных не существует"

View File

@ -75,6 +75,8 @@
"app.components.ListPluginsPage.description": "Projedeki yüklenen eklentiler.",
"app.components.ListPluginsPage.helmet.title": "Eklenti Listesi",
"app.components.ListPluginsPage.title": "Etklentiler",
"app.components.Logout.profile": "Profil",
"app.components.Logout.logout": ıkış Yap",
"app.components.NotFoundPage.back": "Anasayfaya geri dön",
"app.components.NotFoundPage.description": "Bulunamadı",
"app.components.Official": "Resmi",

View File

@ -72,6 +72,8 @@
"app.components.ListPluginsPage.description": "项目中已安装的插件列表",
"app.components.ListPluginsPage.helmet.title": "插件列表",
"app.components.ListPluginsPage.title": "插件",
"app.components.Logout.profile": "轮廓",
"app.components.Logout.logout": "登出",
"app.components.NotFoundPage.back": "返回主页",
"app.components.NotFoundPage.description": "没有找到",
"app.components.Official": "官方",

View File

@ -75,6 +75,8 @@
"app.components.ListPluginsPage.description": "這個專案安裝的擴充功能列表",
"app.components.ListPluginsPage.helmet.title": "擴充功能列表",
"app.components.ListPluginsPage.title": "擴充功能",
"app.components.Logout.profile": "輪廓",
"app.components.Logout.logout": "登出",
"app.components.NotFoundPage.back": "回到主頁",
"app.components.NotFoundPage.description": "找不到此頁面",
"app.components.Official": "官方",

View File

@ -1,6 +1,6 @@
{
"name": "strapi-admin",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Strapi Admin",
"repository": {
"type": "git",
@ -31,8 +31,8 @@
},
"devDependencies": {
"sanitize.css": "^4.1.0",
"strapi-helper-plugin": "3.0.0-alpha.18",
"strapi-utils": "3.0.0-alpha.18"
"strapi-helper-plugin": "3.0.0-alpha.19",
"strapi-utils": "3.0.0-alpha.19"
},
"author": {
"name": "Strapi",

View File

@ -1,6 +1,6 @@
{
"name": "strapi-generate-admin",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Generate the default admin panel for a Strapi application.",
"homepage": "http://strapi.io",
"keywords": [
@ -15,8 +15,8 @@
"dependencies": {
"fs-extra": "^4.0.1",
"lodash": "^4.17.5",
"strapi-admin": "3.0.0-alpha.18",
"strapi-utils": "3.0.0-alpha.18"
"strapi-admin": "3.0.0-alpha.19",
"strapi-utils": "3.0.0-alpha.19"
},
"author": {
"email": "hi@strapi.io",

View File

@ -64,31 +64,6 @@ module.exports = scope => {
}]
};
if (scope.args.tpl && scope.args.tpl !== 'mongoose') {
routes.routes.push({
method: 'POST',
path: '/' + scope.idPluralized + '/:' + tokenID + '/relationships/:relation',
handler: scope.globalID + '.createRelation',
config: {
policies: []
}
}, {
method: 'PUT',
path: '/' + scope.idPluralized + '/:' + tokenID + '/relationships/:relation',
handler: scope.globalID + '.updateRelation',
config: {
policies: []
}
}, {
method: 'DELETE',
path: '/' + scope.idPluralized + '/:' + tokenID + '/relationships/:relation',
handler: scope.globalID + '.destroyRelation',
config: {
policies: []
}
});
}
return routes;
}

View File

@ -1,6 +1,6 @@
{
"name": "strapi-generate-api",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Generate an API for a Strapi application.",
"homepage": "http://strapi.io",
"keywords": [

View File

@ -70,35 +70,5 @@ module.exports = {
destroy: async (ctx, next) => {
return strapi.services.<%= id %>.remove(ctx.params);
},
/**
* Add relation to a/an <%= id %> record.
*
* @return {Object}
*/
createRelation: async (ctx, next) => {
return strapi.services.<%= id %>.addRelation(ctx.params, ctx.request.body);
},
/**
* Update relation to a/an <%= id %> record.
*
* @return {Object}
*/
updateRelation: async (ctx, next) => {
return strapi.services.<%= id %>.editRelation(ctx.params, ctx.request.body);
},
/**
* Destroy relation to a/an <%= id %> record.
*
* @return {Object}
*/
destroyRelation: async (ctx, next) => {
return strapi.services.<%= id %>.removeRelation(ctx.params, ctx.request.body);
}
};

View File

@ -1,3 +1,4 @@
/* global <%= globalID %> */
'use strict';
/**

View File

@ -1,6 +1,6 @@
{
"name": "strapi-generate-controller",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Generate a controller for a Strapi API.",
"homepage": "http://strapi.io",
"keywords": [

View File

@ -1,6 +1,6 @@
{
"name": "strapi-generate-model",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Generate a model for a Strapi API.",
"homepage": "http://strapi.io",
"keywords": [

View File

@ -1,6 +1,7 @@
{
"host": "localhost",
"port": "${process.env.PORT || 1337}",
"production": true,
"proxy": {
"enabled": false
},

View File

@ -1,6 +1,7 @@
{
"host": "localhost",
"port": "${process.env.PORT || 1337}",
"production": true,
"proxy": {
"enabled": false
},

View File

@ -6,7 +6,7 @@
// Public node modules.
const _ = require('lodash');
const uuid = require('uuid/v4');
const { packageManager } = require('strapi-utils');
/**
@ -72,7 +72,7 @@ module.exports = scope => {
}],
'strapi': {
'packageManager': pkgManager,
'uuid': uuid()
'uuid': scope.uuid
},
'engines': {
"node": ">= 10.0.0",

View File

@ -5,8 +5,8 @@
*/
// Node.js core.
const path = require('path');
const { exec, execSync } = require('child_process');
const path = require('path');
// Public node modules.
const _ = require('lodash');
@ -15,6 +15,7 @@ const fs = require('fs-extra');
const npm = require('enpeem');
const ora = require('ora');
const shell = require('shelljs');
const request = require('request');
// Logger.
const { packageManager } = require('strapi-utils');
@ -32,6 +33,8 @@ module.exports = (scope, cb) => {
console.log(`The app has been connected to the database ${green('successfully')}!`);
console.log();
trackSuccess('didConnectDatabase', scope);
console.log('🏗 Application generation:');
let loader = ora('Copy dashboard').start();
@ -193,7 +196,19 @@ module.exports = (scope, cb) => {
console.log('⚡️ Start application:');
console.log(`$ ${green('strapi start')}`);
trackSuccess('didCreateProject', scope);
cb();
});
}
};
function trackSuccess(event, scope) {
request
.post('https://analytics.strapi.io/track')
.form({
event,
uuid: scope.uuid
})
.on('error', () => {});
}

View File

@ -17,6 +17,7 @@ const {cyan} = require('chalk');
const fs = require('fs-extra');
const inquirer = require('inquirer');
const shell = require('shelljs');
const uuid = require('uuid/v4');
// Logger.
const { packageManager } = require('strapi-utils');
@ -46,6 +47,7 @@ module.exports = (scope, cb) => {
// Make changes to the rootPath where the Strapi project will be created.
scope.rootPath = path.resolve(process.cwd(), scope.name || '');
scope.tmpPath = path.resolve(os.tmpdir(), `strapi${ crypto.randomBytes(6).toString('hex') }`);
scope.uuid = uuid();
// Ensure we aren't going to inadvertently delete any files.
try {
@ -190,7 +192,7 @@ module.exports = (scope, cb) => {
default: _.get(scope.database, 'authenticationDatabase', undefined)
},
{
when: !hasDatabaseConfig && scope.client.database === 'mongo',
when: !hasDatabaseConfig,
type: 'boolean',
name: 'ssl',
message: 'Enable SSL connection:',
@ -209,7 +211,11 @@ module.exports = (scope, cb) => {
scope.database.settings.username = answers.username;
scope.database.settings.password = answers.password;
scope.database.options.authenticationDatabase = answers.authenticationDatabase;
scope.database.options.ssl = _.toString(answers.ssl) === 'true';
if (scope.client.database === 'mongo') {
scope.database.options.ssl = _.toString(answers.ssl) === 'true';
} else {
scope.database.settings.ssl = _.toString(answers.ssl) === 'true';
}
console.log();
console.log('⏳ Testing database connection...');

View File

@ -66,7 +66,10 @@ module.exports = {
'public/uploads': {
folder: {}
},
// Copy gitkeep into uploads directory.
'public/uploads/.gitkeep': {
copy: 'gitkeep'
},
// Empty node_modules directory.
'node_modules': {
folder: {}

View File

@ -1,6 +1,6 @@
{
"name": "strapi-generate-new",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Generate a new Strapi application.",
"homepage": "http://strapi.io",
"keywords": [
@ -15,11 +15,12 @@
"dependencies": {
"enpeem": "^2.2.0",
"fs-extra": "^4.0.0",
"inquirer": "^4.0.2",
"inquirer": "^6.2.1",
"listr": "^0.14.1",
"lodash": "^4.17.5",
"ora": "^2.1.0",
"strapi-utils": "3.0.0-alpha.18",
"request": "^2.88.0",
"strapi-utils": "3.0.0-alpha.19",
"uuid": "^3.1.0"
},
"scripts": {

View File

@ -80,7 +80,8 @@ $RECYCLE.BIN/
ssl
.idea
nbproject
public/uploads/*
!public/uploads/.gitkeep
############################
# Node.js

View File

@ -1,6 +1,6 @@
{
"name": "strapi-generate-plugin",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Generate an plugin for a Strapi application.",
"homepage": "http://strapi.io",
"keywords": [

View File

@ -1,6 +1,6 @@
{
"name": "strapi-generate-policy",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Generate a policy for a Strapi API.",
"homepage": "http://strapi.io",
"keywords": [

View File

@ -1,6 +1,6 @@
{
"name": "strapi-generate-service",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Generate a service for a Strapi API.",
"homepage": "http://strapi.io",
"keywords": [

View File

@ -1,6 +1,6 @@
{
"name": "strapi-generate",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Master of ceremonies for the Strapi generators.",
"homepage": "http://strapi.io",
"keywords": [
@ -17,7 +17,7 @@
"fs-extra": "^4.0.0",
"lodash": "^4.17.5",
"reportback": "^2.0.1",
"strapi-utils": "3.0.0-alpha.18"
"strapi-utils": "3.0.0-alpha.19"
},
"author": {
"name": "Strapi team",

View File

@ -1,6 +1,6 @@
{
"name": "strapi-helper-plugin",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Helper for Strapi plugins development",
"engines": {
"node": ">= 10.0.0",

View File

@ -89,7 +89,7 @@ module.exports = function(strapi) {
// Register the final model for Bookshelf.
const loadedModel = _.assign({
tableName: definition.collectionName,
hasTimestamps: _.get(definition, 'options.timestamps') === true,
hasTimestamps: _.get(definition, 'options.timestamps', false),
idAttribute: _.get(definition, 'options.idAttribute', 'id'),
associations: [],
defaults: Object.keys(definition.attributes).reduce((acc, current) => {
@ -100,7 +100,14 @@ module.exports = function(strapi) {
return acc;
}, {})
}, definition.options);
// Use default timestamp column names if value is `true`
if (_.get(loadedModel, 'hasTimestamps') === true) {
_.set(loadedModel, 'hasTimestamps', ['created_at', 'updated_at']);
}
// Use false for values other than `Boolean` or `Array`
if (!_.isArray(_.get(loadedModel, 'hasTimestamps')) && !_.isBoolean(_.get(loadedModel, 'hasTimestamps'))) {
_.set(loadedModel, 'hasTimestamps', false);
}
if (_.isString(_.get(connection, 'options.pivot_prefix'))) {
loadedModel.toJSON = function(options = {}) {
const { shallow = false, omitPivot = false } = options;
@ -619,10 +626,10 @@ module.exports = function(strapi) {
// Add created_at and updated_at field if timestamp option is true
if (loadedModel.hasTimestamps) {
definition.attributes['created_at'] = {
definition.attributes[_.isString(loadedModel.hasTimestamps[0]) ? loadedModel.hasTimestamps[0] : 'created_at'] = {
type: 'timestamp'
};
definition.attributes['updated_at'] = {
definition.attributes[_.isString(loadedModel.hasTimestamps[1]) ? loadedModel.hasTimestamps[1] : 'updated_at'] = {
type: 'timestampUpdate'
};
}
@ -701,8 +708,8 @@ module.exports = function(strapi) {
// Remove from attributes (auto handled by bookshlef and not displayed on ctb)
if (loadedModel.hasTimestamps) {
delete definition.attributes['created_at'];
delete definition.attributes['updated_at'];
delete definition.attributes[_.isString(loadedModel.hasTimestamps[0]) ? loadedModel.hasTimestamps[0] : 'created_at'];
delete definition.attributes[_.isString(loadedModel.hasTimestamps[1]) ? loadedModel.hasTimestamps[1] : 'updated_at'];
}
resolve();

View File

@ -1,6 +1,6 @@
{
"name": "strapi-hook-bookshelf",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Bookshelf hook for the Strapi framework",
"homepage": "http://strapi.io",
"keywords": [
@ -17,12 +17,12 @@
"main": "./lib",
"dependencies": {
"bookshelf": "^0.12.1",
"inquirer": "^5.2.0",
"inquirer": "^6.2.1",
"lodash": "^4.17.5",
"pluralize": "^6.0.0",
"rimraf": "^2.6.2",
"strapi-hook-knex": "3.0.0-alpha.18",
"strapi-utils": "3.0.0-alpha.18"
"strapi-hook-knex": "3.0.0-alpha.19",
"strapi-utils": "3.0.0-alpha.19"
},
"strapi": {
"dependencies": [

View File

@ -1,6 +1,6 @@
{
"name": "strapi-hook-ejs",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "EJS hook for the Strapi framework",
"homepage": "http://strapi.io",
"keywords": [

View File

@ -1,6 +1,6 @@
{
"name": "strapi-hook-knex",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Knex hook for the Strapi framework",
"homepage": "http://strapi.io",
"keywords": [

View File

@ -207,7 +207,16 @@ module.exports = function (strapi) {
});
});
collection.schema.set('timestamps', _.get(definition, 'options.timestamps') === true);
// Use provided timestamps if the elemnets in the array are string else use default.
if (_.isArray(_.get(definition, 'options.timestamps'))) {
const timestamps = {
createdAt: _.isString(_.get(definition, 'options.timestamps[0]')) ? _.get(definition, 'options.timestamps[0]') : 'createdAt',
updatedAt: _.isString(_.get(definition, 'options.timestamps[1]')) ? _.get(definition, 'options.timestamps[1]') : 'updatedAt'
};
collection.schema.set('timestamps', timestamps);
} else {
collection.schema.set('timestamps', _.get(definition, 'options.timestamps') === true);
}
collection.schema.set('minimize', _.get(definition, 'options.minimize', false) === true);
collection.schema.options.toObject = collection.schema.options.toJSON = {

View File

@ -1,6 +1,6 @@
{
"name": "strapi-hook-mongoose",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Mongoose hook for the Strapi framework",
"homepage": "http://strapi.io",
"keywords": [
@ -20,7 +20,7 @@
"mongoose-float": "^1.0.3",
"pluralize": "^6.0.0",
"rimraf": "^2.6.2",
"strapi-utils": "3.0.0-alpha.18"
"strapi-utils": "3.0.0-alpha.19"
},
"author": {
"email": "hi@strapi.io",

View File

@ -1,6 +1,6 @@
{
"name": "strapi-hook-redis",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Redis hook for the Strapi framework",
"homepage": "http://strapi.io",
"keywords": [
@ -19,7 +19,7 @@
"lodash": "^4.17.5",
"rimraf": "^2.6.2",
"stack-trace": "0.0.10",
"strapi-utils": "3.0.0-alpha.18"
"strapi-utils": "3.0.0-alpha.19"
},
"author": {
"email": "hi@strapi.io",

View File

@ -1,6 +1,6 @@
{
"name": "strapi-lint",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Strapi eslint and prettier configurations",
"directories": {
"lib": "lib"

View File

@ -1,6 +1,6 @@
{
"name": "strapi-middleware-views",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Views middleware to enable server-side rendering for the Strapi framework",
"homepage": "http://strapi.io",
"keywords": [

View File

@ -77,15 +77,10 @@ export function* submit() {
let shouldAddTranslationSuffix = false;
// Remove the updated_at & created_at fields so it is updated correctly when using Postgres or MySQL db
if (record.updated_at) {
delete record.created_at;
delete record.updated_at;
}
// Remove the updatedAt & createdAt fields so it is updated correctly when using MongoDB
if (record.updatedAt) {
delete record.createdAt;
delete record.updatedAt;
const timestamps = get(schema, ['models', currentModelName, 'options', 'timestamps'], null);
if (timestamps) {
delete record[timestamps[0]];
delete record[timestamps[1]];
}
try {

View File

@ -12,9 +12,9 @@
"components.FilterOptions.FILTER_TYPES._contains": "содержит",
"components.FilterOptions.FILTER_TYPES._containss": "содержит (с учетом регистра)",
"components.FilterOptions.FILTER_TYPES._gt": "больше чем",
"components.FilterOptions.FILTER_TYPES._gte": "равно или больше чем",
"components.FilterOptions.FILTER_TYPES._gte": "больше или равно",
"components.FilterOptions.FILTER_TYPES._lt": "меньше чем",
"components.FilterOptions.FILTER_TYPES._lte": "меньше или равно чем",
"components.FilterOptions.FILTER_TYPES._lte": "меньше или равно",
"components.FilterOptions.FILTER_TYPES._ne": "не равно",
"components.FilterOptions.button.apply": "Применить",
"components.FiltersPickWrapper.PluginHeader.actions.apply": "Применить",
@ -26,12 +26,12 @@
"containers.ListPage.displayedFields": "Отображаемые поля",
"components.Search.placeholder": "Поиск записей...",
"containers.SettingPage.addRelationalField": "Добавить связанное поле",
"containers.SettingPage.editSettings.description": "Перетащите поля для сборки макета",
"containers.SettingPage.editSettings.title": "Правка — Настройки",
"containers.SettingPage.editSettings.description": "Перетащите поля, чтобы определить макет",
"containers.SettingPage.editSettings.title": "Редактирование — Настройки",
"containers.SettingPage.relations": "Связанные поля",
"components.TableDelete.delete": "Удалить все",
"components.TableDelete.entries.plural": "{число} записей выбрано",
"components.TableDelete.entries.singular": "{число} записей выделено",
"components.TableDelete.entries.plural": "Выбрано {number} записей",
"components.TableDelete.entries.singular": "Выбрана {number} запись",
"components.TableEmpty.withFilters": "Нет {contentType} с примененными фильтрами...",
"components.TableEmpty.withSearch": "Нет {contentType} согласно поиску ({search})",
"components.TableEmpty.withoutFilter": "Нет {contentType}...",
@ -43,23 +43,23 @@
"containers.Home.introduction": "Для того чтобы отредактировать ваши записи используйте соответствующую ссылку в меню слева. У плагина отсутствует полноценная возможность редактировать настройки и он все еще находится в стадии активной разработки.",
"containers.Home.pluginHeaderDescription": "Manage your entries through a powerful and beautiful interface.",
"containers.Home.pluginHeaderTitle": "Редактор контента",
"containers.List.addAnEntry": "Добавить новые {entity}",
"containers.List.addAnEntry": "Добавить {entity}",
"containers.List.errorFetchRecords": "Ошибка",
"containers.List.pluginHeaderDescription": "{label} записей найдено",
"containers.List.pluginHeaderDescription.singular": "{label} запись найдена",
"containers.SettingPage.addField": "Добавить новое поле",
"containers.SettingPage.attributes": "Поля атрибутов",
"containers.SettingPage.attributes.description": "Определить порядок атребутов",
"containers.SettingPage.listSettings.description": "Указать порядок атрибутов",
"containers.SettingPage.attributes.description": "Определить порядок атрибутов",
"containers.SettingPage.listSettings.description": "Настройки списка записей для этого Типа Контента",
"containers.SettingPage.listSettings.title": "Список — Настройки",
"containers.SettingPage.pluginHeaderDescription": "Отдельные настройки для этого Типа Данных",
"containers.SettingPage.pluginHeaderDescription": "Отдельные настройки для этого Типа Контента",
"containers.SettingsPage.Block.contentType.description": "Настроить отдельные параметры",
"containers.SettingsPage.Block.contentType.title": "Типы данных",
"containers.SettingsPage.Block.generalSettings.description": "Настройте опции по умолчанию для ваших Типов Данных",
"containers.SettingsPage.Block.contentType.title": "Типы Контента",
"containers.SettingsPage.Block.generalSettings.description": "Настройте опции по умолчанию для ваших Типов Контента",
"containers.SettingsPage.Block.generalSettings.title": "Общее",
"containers.SettingsPage.pluginHeaderDescription": "Настройте параметры по умолчанию для всех Типов Данных",
"containers.SettingsPage.pluginHeaderDescription": "Настройте параметры по умолчанию для всех ваших Типов Контента",
"emptyAttributes.button": "Перейти в редактор контента",
"emptyAttributes.description": "Добавте новое поле в ваш Тип Данных",
"emptyAttributes.description": "Добавьте новое поле в ваш Тип Контента",
"emptyAttributes.title": "Пока нет полей",
"error.attribute.key.taken": "Это значение уже существует",
"error.attribute.sameKeyAndName": "Не может быть одинаковым",
@ -81,21 +81,21 @@
"error.validation.minSupMax": "Не может быть выше",
"error.validation.regex": "Значение не соответствует регулярному выражению.",
"error.validation.required": "Обязательное значение.",
"form.Input.bulkActions": "Применить массовые действия",
"form.Input.bulkActions": "Включить массовые действия",
"form.Input.defaultSort": "Сортировка по умолчанию",
"form.Input.description": "Description",
"form.Input.description.placeholder": "Display name in the profile",
"form.Input.disabled": "Editable field",
"form.Input.filters": "Применить фильтры",
"form.Input.label": "Метка",
"form.Input.label.inputDescription": "Это знчение переопределит метку, в заголовке таблицы",
"form.Input.pageEntries": "Записей на страницу",
"form.Input.pageEntries.inputDescription": "Заметка: вы можете переопределить это значение на странице настроек Типа Данных",
"form.Input.description": "Описание",
"form.Input.description.placeholder": "Имя, отображаемое в профиле",
"form.Input.disabled": "Редактируемое поле",
"form.Input.filters": "Включить фильтры",
"form.Input.label": "Подпись",
"form.Input.label.inputDescription": "Это значение переопределяет название, отображаемое в заголовке таблицы",
"form.Input.pageEntries": "Записей на странице",
"form.Input.pageEntries.inputDescription": "Примечание: вы можете переопределить это значение в настройках Типа Контента",
"form.Input.placeholder": "Плейсхолдер",
"form.Input.placeholder.placeholder": "Мое значение",
"form.Input.search": "Применить поиск",
"form.Input.search.field": "Применить поиск по этому полю",
"form.Input.sort.field": "Применить сортировку по этому полю",
"form.Input.search": "Включить поиск",
"form.Input.search.field": "Включить поиск по этому полю",
"form.Input.sort.field": "Включить сортировку по этому полю",
"notification.error.displayedFields": "Необходимо добавить хотя бы одно поле",
"notification.error.relationship.fetch": "Возникла ошибка при получении связей.",
"notification.info.SettingPage.disableSort": "У вас должен быть один атрибут с разрешенной сортировкой",
@ -106,8 +106,8 @@
"popUpWarning.bodyMessage.contentType.delete.all": "Вы уверенны, что хотите удалить эти записи?",
"popUpWarning.button.cancel": "Отменить",
"popUpWarning.button.confirm": "Подтвердить",
"popUpWarning.title": "Пожалуйста подтвердите",
"popUpWarning.warning.cancelAllSettings": "Вы уверенны, что хотите отменить ваши модификации?",
"popUpWarning.title": "Пожалуйста, подтвердите",
"popUpWarning.warning.cancelAllSettings": "Вы уверенны, что хотите отменить ваши изменения?",
"popUpWarning.warning.updateAllSettings": "Это изменит все ваши настройки",
"success.record.delete": "Удалено",
"success.record.save": "Сохранено"

View File

@ -17,6 +17,7 @@ const pickData = (model) => _.pick(model, [
'globalId',
'globalName',
'orm',
'options.timestamps',
'loadedModel',
'primaryKey',
'associations'
@ -84,6 +85,7 @@ module.exports = async cb => {
pageEntries: 10,
defaultSort: model.primaryKey,
sort: 'ASC',
options: model.options,
editDisplay: {
availableFields: {},
fields: [],
@ -330,8 +332,9 @@ module.exports = async cb => {
// Here we just need to add the data from the current schema Object
apisToAdd.map(apiPath => {
const api = _.get(schema.models, apiPath);
const { search, filters, bulkActions, pageEntries } = _.get(prevSchema, 'generalSettings');
const { search, filters, bulkActions, pageEntries, options } = _.get(prevSchema, 'generalSettings');
_.set(api, 'options', options);
_.set(api, 'filters', filters);
_.set(api, 'search', search);
_.set(api, 'bulkActions', bulkActions);

View File

@ -1,6 +1,6 @@
{
"name": "strapi-plugin-content-manager",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "A powerful UI to easily manage your data.",
"strapi": {
"name": "Content Manager",
@ -26,7 +26,7 @@
"draft-js": "^0.10.5",
"react-select": "^1.2.1",
"showdown": "^1.8.6",
"strapi-helper-plugin": "3.0.0-alpha.18"
"strapi-helper-plugin": "3.0.0-alpha.19"
},
"dependencies": {
"pluralize": "^7.0.0"

View File

@ -14,8 +14,8 @@
"attribute.string": "String",
"attribute.text": "Text",
"button.attributes.add": "Добавить Новое Поле",
"button.contentType.add": "Добавить Тип Данных",
"button.contentType.create": "Создать Тип Данных",
"button.contentType.add": "Добавить Тип Контента",
"button.contentType.create": "Создать Тип Контента",
"contentType.temporaryDisplay": "(Не сохранено)",
"error.attribute.forbidden": "Такое имя атрибута зарезервировано",
"error.attribute.key.taken": "Это значение уже существует",
@ -29,23 +29,23 @@
"error.validation.minSupMax": "Не может быть выше",
"error.validation.regex": "Не соответствует регулярному выражению.",
"error.validation.required": "Это поле является обязательным.",
"form.attribute.item.appearance.description": "В противном случае значение будет доступно для редактирования как обычное текстовое поле",
"form.attribute.item.appearance.label": "Показывать WYSIWYG",
"form.attribute.item.appearance.description": "Если отключено, значение будет доступно для редактирования как обычное текстовое поле",
"form.attribute.item.appearance.label": "Отображать как WYSIWYG",
"form.attribute.item.appearance.name": "Отображение",
"form.attribute.item.boolean.name": "Название",
"form.attribute.item.customColumnName": "Настраиваемые названия столбца",
"form.attribute.item.customColumnName.description": "Это удобно иметь возможность переименовывать название столбцов для настройки ответов от API.",
"form.attribute.item.customColumnName": "Названия столбцов",
"form.attribute.item.customColumnName.description": "Может быть полезно переименовать названия столбцов для более читаемых ответов API.",
"form.attribute.item.date.name": "Название",
"form.attribute.item.defineRelation.fieldName": "Название поля",
"form.attribute.item.enumeration.graphql": "Name override for GraphQL",
"form.attribute.item.enumeration.graphql.description": "Allows you to override the default generated name for GraphQL",
"form.attribute.item.enumeration.graphql": "Название поля в GraphQL",
"form.attribute.item.enumeration.graphql.description": "Позволяет переопределить название поля в GraphQL, сгенерированное по умолчанию",
"form.attribute.item.enumeration.name": "Название",
"form.attribute.item.enumeration.placeholder": "Например: morning,noon,evening",
"form.attribute.item.enumeration.rules": "Значения (разделять запятой)",
"form.attribute.item.enumeration.rules": "Значения (через запятую)",
"form.attribute.item.json.name": "Название",
"form.attribute.item.maximum": "Максимальное значение",
"form.attribute.item.maximumLength": "Максимальная длина",
"form.attribute.item.media.multiple": "Возможно несколько файлов",
"form.attribute.item.media.multiple": "Разрешить несколько файлов",
"form.attribute.item.media.name": "Название",
"form.attribute.item.minimum": "Минимальное значение",
"form.attribute.item.minimumLength": "Минимальная длина",
@ -55,56 +55,56 @@
"form.attribute.item.number.type.float": "float (ex: 3.33333333)",
"form.attribute.item.number.type.integer": "integer (ex: 10)",
"form.attribute.item.requiredField": "Обязательное поле",
"form.attribute.item.requiredField.description": "Вы не сможете создать запись, если это поле останется пустым",
"form.attribute.item.requiredField.description": "Вы не сможете создать запись, если это поле не заполнено",
"form.attribute.item.settings.name": "Настройки",
"form.attribute.item.string.name": "Название",
"form.attribute.item.textarea.name": "Название",
"form.attribute.item.uniqueField": "Уникальное поле",
"form.attribute.item.uniqueField.description": "Вы не сможете создать запись, если существует запись с аналогичным содержанием",
"form.attribute.item.uniqueField.description": "Вы не сможете создать запись, если уже существует запись с таким значением",
"form.attribute.settings.default": "Стандартное значение",
"form.attribute.settings.default.checkboxLabel": "Установить значение — true",
"form.attribute.settings.default.checkboxLabel": "True",
"form.button.cancel": "Отменить",
"form.button.continue": "Продолжить",
"form.button.save": "Сохранить",
"form.contentType.item.collectionName": "Название коллекции",
"form.contentType.item.collectionName.inputDescription": "Полезно, когда название вашего Типа Данных и название вашей таблицы различаются",
"form.contentType.item.collectionName.inputDescription": "Полезно, когда название вашего Типа Контента и название вашей таблицы различаются",
"form.contentType.item.connections": "Соединение",
"form.contentType.item.description": "Описание",
"form.contentType.item.description.placeholder": "Добавьте ваше короткое описание...",
"form.contentType.item.description.placeholder": "Добавьте короткое описание...",
"form.contentType.item.name": "Название",
"form.contentType.item.name.description": "Название Типов Данных должны быть уникальными: {link}",
"form.contentType.item.name.description": "Название Типа Контента должно быть уникальным: {link}",
"form.contentType.item.name.link.description": "Ознакомьтесь с нашей документацией",
"from": "from",
"home.contentTypeBuilder.description": "Создавайте и обновляйте ваши Типы Данных.",
"home.contentTypeBuilder.name": "Типы Данных",
"home.emptyAttributes.description": "Добавьте первое поле в ваш новый Тип Данных",
"home.contentTypeBuilder.description": "Создавайте и обновляйте ваши Типы Контента.",
"home.contentTypeBuilder.name": "Типы Контента",
"home.emptyAttributes.description": "Добавьте первое поле в ваш новый Тип Контента",
"home.emptyAttributes.title": "Пока ни одного поля не создано",
"home.emptyContentType.description": "Создайте ваш первый Тип Данных и у вас появится возможность загружать ваши данные при помощи API.",
"home.emptyContentType.title": "Нет Типов Данных",
"menu.section.contentTypeBuilder.name.plural": "Типы Данных",
"menu.section.contentTypeBuilder.name.singular": "Тип Данных",
"menu.section.documentation.guide": "Прочтите больше о Типах Данных в нашем",
"home.emptyContentType.description": "Создайте ваш первый Тип Контента и у вас появится возможность загружать ваши данные при помощи API.",
"home.emptyContentType.title": "Нет Типов Контента",
"menu.section.contentTypeBuilder.name.plural": "Типы Контента",
"menu.section.contentTypeBuilder.name.singular": "Тип Контента",
"menu.section.documentation.guide": "Прочтите больше о Типах Контента в нашем",
"menu.section.documentation.guideLink": "руководстве.",
"menu.section.documentation.name": "Документация",
"menu.section.documentation.tutorial": "Посмотрите наши",
"menu.section.documentation.tutorialLink": "обучающие видео.",
"modelPage.attribute.relationWith": "Связан с",
"modelPage.contentHeader.emptyDescription.description": "Нет описания для этого Типа Данных",
"modelPage.contentType.list.relationShipTitle.plural": "связи",
"modelPage.attribute.relationWith": "Связь с",
"modelPage.contentHeader.emptyDescription.description": "Для этого Типа Контента нет описания",
"modelPage.contentType.list.relationShipTitle.plural": "связей",
"modelPage.contentType.list.relationShipTitle.singular": "связь",
"modelPage.contentType.list.title.including": "включает",
"modelPage.contentType.list.title.plural": "поля",
"modelPage.contentType.list.title.singular": "поле",
"modelPage.contentType.list.title.including": "включая",
"modelPage.contentType.list.title.plural": "полей,",
"modelPage.contentType.list.title.singular": "поле,",
"noTableWarning.description": "Не забудьте создать таблицу `{modelName}` в вашей базе данных",
"noTableWarning.infos": "Больше информации",
"notification.error.message": "Возникла ошибка",
"notification.info.contentType.creating.notSaved": "Пожалуйста сохраните ваш текущий Тип Данных перед тем как создавать новый",
"notification.info.contentType.creating.notSaved": "Пожалуйста, сохраните текущий Тип Контента перед тем как создавать новый",
"notification.info.disable": "В данный момент это поле нельзя редактировать...😮",
"notification.info.optimized": "Плагин оптимизирован с вашим localstorage",
"notification.success.contentTypeDeleted": "Ваш Тип Данных удален",
"notification.success.message.contentType.create": "Ваш Тип Данных создан",
"notification.success.message.contentType.edit": "Ваш Тип Данных обновлен",
"plugin.description.long": "Моделируйте структуру данных вашего API. Создавайте новые поля и связи всего за минуту. Файлы автоматически создаются и обновляются в вашем проекте.",
"notification.info.optimized": "Плагин оптимизирован с вашим localStorage",
"notification.success.contentTypeDeleted": "Ваш Тип Контента удален",
"notification.success.message.contentType.create": "Ваш Тип Контента создан",
"notification.success.message.contentType.edit": "Ваш Тип Контента обновлен",
"plugin.description.long": "Моделируйте структуру данных вашего API. Создавайте новые поля и связи всего за минуту. Файлы в вашем проекте создаются и обновляются автоматически.",
"plugin.description.short": "Моделируйте структуру данных вашего API.",
"popUpForm.attributes.boolean.description": "Да или нет, 1 или 0, true или false",
"popUpForm.attributes.boolean.name": "Boolean",
@ -114,7 +114,7 @@
"popUpForm.attributes.email.name": "Email",
"popUpForm.attributes.enumeration.description": "Список вариантов",
"popUpForm.attributes.enumeration.name": "Enumeration",
"popUpForm.attributes.json.description": "Данные в JSON формате",
"popUpForm.attributes.json.description": "Данные в формате JSON",
"popUpForm.attributes.json.name": "JSON",
"popUpForm.attributes.media.description": "Картинки, видео, PDF и другие файлы",
"popUpForm.attributes.media.name": "Media",
@ -122,24 +122,24 @@
"popUpForm.attributes.number.name": "Number",
"popUpForm.attributes.password.description": "Пароль пользователя...",
"popUpForm.attributes.password.name": "Password",
"popUpForm.attributes.relation.description": "Связан с Типом Данных",
"popUpForm.attributes.relation.description": "Ссылка на другой Тип Контента",
"popUpForm.attributes.relation.name": "Relation",
"popUpForm.attributes.string.description": "Заголовки, названия, имена, перечень названий",
"popUpForm.attributes.string.name": "String",
"popUpForm.attributes.text.description": "Описания, текстовые параграфы, статьи",
"popUpForm.attributes.text.description": "Описания, параграфы, статьи",
"popUpForm.attributes.text.name": "Text",
"popUpForm.choose.attributes.header.title": "Добавить новое поле",
"popUpForm.create": "Добавить новое",
"popUpForm.create.contentType.header.title": "Добавить новый Тип Данных",
"popUpForm.create": "Добавить ",
"popUpForm.create.contentType.header.title": "Добавить Тип Контента",
"popUpForm.edit": "Отредактировать",
"popUpForm.edit.contentType.header.title": "Отредактировать Тип Данных",
"popUpForm.edit.contentType.header.title": "Отредактировать Тип Контента",
"popUpForm.field": "Поле",
"popUpForm.navContainer.advanced": "Расширенные настройки",
"popUpForm.navContainer.base": "Базовые настройки",
"popUpForm.navContainer.relation": "Определить связь",
"popUpRelation.title": "Связь",
"popUpWarning.bodyMessage.attribute.delete": "Вы уверены, что хотите удалить это поле?",
"popUpWarning.bodyMessage.contentType.delete": "Вы уверены, что хотите удалить этот Тип Данных?",
"popUpWarning.bodyMessage.contentType.delete": "Вы уверены, что хотите удалить этот Тип Контента?",
"popUpWarning.button.cancel": "Отменить",
"popUpWarning.button.confirm": "Подтвердить",
"popUpWarning.title": "Пожалуйста подтвердите",
@ -152,6 +152,6 @@
"table.contentType.head.description": "Описание",
"table.contentType.head.fields": "Поля",
"table.contentType.head.name": "Название",
"table.contentType.title.plural": "Типа Данных доступны",
"table.contentType.title.singular": "Тип Данных доступен"
"table.contentType.title.plural": "Типов Контента доступны",
"table.contentType.title.singular": "Тип Контента доступен"
}

View File

@ -1,6 +1,6 @@
{
"name": "strapi-plugin-content-type-builder",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Strapi plugin to create content type (API).",
"strapi": {
"name": "Content Type Builder",
@ -24,11 +24,11 @@
"dependencies": {
"immutable": "^3.8.2",
"pluralize": "^7.0.0",
"strapi-generate": "3.0.0-alpha.18",
"strapi-generate-api": "3.0.0-alpha.18"
"strapi-generate": "3.0.0-alpha.19",
"strapi-generate-api": "3.0.0-alpha.19"
},
"devDependencies": {
"strapi-helper-plugin": "3.0.0-alpha.18"
"strapi-helper-plugin": "3.0.0-alpha.19"
},
"author": {
"name": "Strapi team",

View File

@ -1,26 +1,29 @@
{
"containers.HomePage.Button.open": "Open the documentation",
"containers.HomePage.Button.update": "Update",
"containers.HomePage.PluginHeader.title": "Documentation - Settings",
"containers.HomePage.PluginHeader.description": "Configure the documentation plugin",
"containers.HomePage.Block.title": "Versions",
"containers.HomePage.PopUpWarning.message": "Are you sure you want to delete this version?",
"containers.HomePage.PopUpWarning.confirm": "I understand",
"containers.HomePage.Button.open": "Открыть документацию",
"containers.HomePage.Button.update": "Обновить",
"containers.HomePage.copied": "Токен скопирован в буфер обмена",
"containers.HomePage.PluginHeader.title": "Документация - Настройки",
"containers.HomePage.PluginHeader.description": "Настройте плагин документации",
"containers.HomePage.Block.title": "Версии",
"containers.HomePage.PopUpWarning.message": "Вы уверены что хотите удалить эту версию?",
"containers.HomePage.PopUpWarning.confirm": "Я понимаю",
"containers.HomePage.form.restrictedAccess": "Restricted access",
"containers.HomePage.form.restrictedAccess.inputDescription": "Make the documentation endpoint private. By default, the access is public",
"containers.HomePage.form.password": "Password",
"containers.HomePage.form.password.inputDescription": "Set the password to access the documentation",
"containers.HomePage.form.showGeneratedFiles": "Show generated files",
"containers.HomePage.form.showGeneratedFiles.inputDescription": "Useful when you want to override the generated documentation. \nThe plugin will generate files split by model and plugin. \nBy enabling this option it will be easier to customize your documentation",
"containers.HomePage.form.jwtToken": "Получите ваш JWT токен",
"containers.HomePage.form.jwtToken.description": "Скопируйте этот токен и используйте его в swagger, чтобы делать запросы",
"containers.HomePage.form.restrictedAccess": "Закрытый доступ",
"containers.HomePage.form.restrictedAccess.inputDescription": "Сделайте вашу документацию приватной. По умолчанию доступ открыт",
"containers.HomePage.form.password": "Пароль",
"containers.HomePage.form.password.inputDescription": "Установите пароль для доступа к документации",
"containers.HomePage.form.showGeneratedFiles": "Показать сгенерированные файлы",
"containers.HomePage.form.showGeneratedFiles.inputDescription": "Полезно, если вы хотите изменить сгенерированную документацию. \nПлагин разделяет файлы на модели и плагины. \nПри включенной опции вам будет проще кастомизировать документацию",
"components.Row.generatedDate": "Last generation",
"components.Row.open": "Open",
"components.Row.regenerate": "Regenerate",
"components.Row.generatedDate": "Последнее обновление",
"components.Row.open": "Открыть",
"components.Row.regenerate": "Сгенерировать",
"error.regenerateDoc": "An error occurred while regenerating the doc",
"error.noVersion": "A version is required",
"error.regenerateDoc.versionMissing": "The version you are trying to generate doesn't exist",
"error.deleteDoc.versionMissing": "The version you are trying to delete does not exist.",
"notification.update.success": "Settings updated successfully"
"error.regenerateDoc": "При генерации документации возникла ошибка",
"error.noVersion": "Необходимо указать версию",
"error.regenerateDoc.versionMissing": "Версии, которую вы пытаетесь сгенерировать, не существует",
"error.deleteDoc.versionMissing": "Версии, которую вы пытаетесь удалить, не существует.",
"notification.update.success": "Настройки успешно обновлены"
}

View File

@ -1,6 +1,6 @@
{
"name": "strapi-plugin-documentation",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "This is the description of the plugin.",
"strapi": {
"name": "Documentation",
@ -29,7 +29,7 @@
"swagger-ui-dist": "^3.18.3-republish2"
},
"devDependencies": {
"strapi-helper-plugin": "3.0.0-alpha.18"
"strapi-helper-plugin": "3.0.0-alpha.19"
},
"author": {
"name": "soupette",

View File

@ -2,7 +2,7 @@
"ConfigPage.description": "Настройка плагина email",
"ConfigPage.title": "Email - Настройки",
"EditForm.Input.number.label": "Максимально допустимый размер (в МБ)",
"EditForm.Input.select.inputDescription": "Письма могут быть отправлены стандартным провайдером (Sendmail), или внешними провайдерами",
"EditForm.Input.select.inputDescription": "Письма могут быть отправлены стандартным способом (Sendmail) или с помощью внешних провайдеров",
"EditForm.Input.select.label": "Провайдеры",
"EditForm.Input.toggle.label": "Активировать отправку писем",
"notification.config.success": "Настройки успешно обновлены",

View File

@ -1,6 +1,6 @@
{
"name": "strapi-plugin-email",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "This is the description of the plugin.",
"strapi": {
"name": "Email",
@ -22,11 +22,11 @@
"prepublishOnly": "IS_MONOREPO=true npm run build"
},
"dependencies": {
"strapi-provider-email-sendmail": "3.0.0-alpha.18"
"strapi-provider-email-sendmail": "3.0.0-alpha.19"
},
"devDependencies": {
"react-copy-to-clipboard": "5.0.1",
"strapi-helper-plugin": "3.0.0-alpha.18"
"strapi-helper-plugin": "3.0.0-alpha.19"
},
"author": {
"name": "Strapi team",

View File

@ -1,6 +1,6 @@
{
"name": "strapi-plugin-graphql",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "This is the description of the plugin.",
"strapi": {
"name": "graphql",
@ -31,7 +31,7 @@
"graphql-type-datetime": "^0.2.2",
"graphql-type-json": "^0.2.1",
"pluralize": "^7.0.0",
"strapi-utils": "3.0.0-alpha.18"
"strapi-utils": "3.0.0-alpha.19"
},
"author": {
"name": "A Strapi developer",

View File

@ -266,8 +266,10 @@ module.exports = {
resolvers,
});
// Write schema.
this.writeGenerateSchema(graphql.printSchema(schema));
if (!strapi.config.currentEnvironment.server.production) {
// Write schema.
this.writeGenerateSchema(graphql.printSchema(schema));
}
// Remove custom scaler (like Upload);
typeDefs = Types.removeCustomScalar(typeDefs, resolvers);

View File

@ -5,7 +5,7 @@
"form.advanced.item.admin": "URL-адрес панели администратора",
"form.advanced.item.prefix": "Приставка API",
"form.advanced.name": "Расширенные",
"form.application.description": "Зайдайте настройки вашего приложения.",
"form.application.description": "Задайте настройки вашего приложения.",
"form.application.item.description": "Описание",
"form.application.item.name": "Название",
"form.application.item.version": "Версия",
@ -17,7 +17,7 @@
"form.database.item.client": "Клиент",
"form.database.item.connector": "Коннектор",
"form.database.item.database": "Базы данных",
"form.database.item.default": "Задать как стандартное значение",
"form.database.item.default": "Сделать подключением по умолчанию",
"form.database.item.host": "Хост",
"form.database.item.name": "Название соединения",
"form.database.item.password": "Пароль",
@ -28,11 +28,11 @@
"form.database.item.provider.redis": "Redis",
"form.database.item.ssl": "SSL",
"form.database.item.username": "Имя пользователя",
"form.databases.description": "Настройки базы данных в зависимости от окружения.",
"form.databases.description": "Настройки базы данных для разных окружений.",
"form.databases.name": "База данных",
"form.language.choose": "Выберите язык:",
"form.language.description": "Настройте ваш язык.",
"form.language.name": "Язык",
"form.language.description": "Настройте ваши языки.",
"form.language.name": "Языки",
"form.request.description": "Задайте настройки запроса.",
"form.request.item.logger": "Логирование",
"form.request.item.logger.exposeInContext": "Выводить в контексте",
@ -79,7 +79,7 @@
"form.server.item.host": "Host",
"form.server.item.port": "Port",
"form.server.item.proxy": "Настройки прокси",
"form.server.item.proxy.enable": "Прокси включен",
"form.server.item.proxy.enable": "Включить прокси",
"form.server.item.proxy.host": "Хост",
"form.server.item.proxy.port": "Порт",
"form.server.item.proxy.ssl": "SSL",
@ -579,13 +579,13 @@
"language.zu": "isiZulu",
"language.zu_ZA": "isiZulu (iNingizimu Afrika)",
"list.databases.button.label": "Добавить новое соединение",
"list.databases.title.plural": "соединения в этом окружении",
"list.databases.title.plural": "соединений в этом окружении",
"list.databases.title.singular": "соединение в этом окружении",
"list.languages.button.label": "Добавить новый языка",
"list.languages.default.languages": "Стандартный язык",
"list.languages.set.languages": "Задать как стандартный",
"list.languages.title.plural": "языка доступны",
"list.languages.title.singular": "языка доступен",
"list.languages.button.label": "Добавить новый язык",
"list.languages.default.languages": "Язык по умолчанию",
"list.languages.set.languages": "Выбрать по умолчанию",
"list.languages.title.plural": "языков доступно",
"list.languages.title.singular": "язык доступен",
"menu.item.advanced": "Расширенные",
"menu.item.application": "Приложение",
"menu.item.database": "База данных",
@ -596,15 +596,15 @@
"menu.item.server": "Сервер",
"menu.section.environments": "Окружения приложения",
"menu.section.global-settings": "Глобальные настройки",
"pageNotFound": "Cтраница не найдена",
"plugin.description.long": "Настройте ваш проект в течении считаных секунд.",
"plugin.description.short": "Настройте ваш проект в течении считаных секунд.",
"pageNotFound": "Страница не найдена",
"plugin.description.long": "Настройте ваш проект в считанные секунды.",
"plugin.description.short": "Настройте ваш проект в считанные секунды.",
"popUpWarning.danger.ok.message": "Я понимаю",
"popUpWarning.databases.danger.message": "Типы Данных все еще подключены этому соединению. Удалив его, возможна критическая ошибка в приложении. Будте осторожны...",
"popUpWarning.databases.danger.message": "Типы Контента все еще ссылаются на это соединение. При его удалении в приложении может возникнуть критическая ошибка. Будьте осторожны...",
"popUpWarning.databases.delete.message": "Вы уверены, что хотите удалить эту базу данных?",
"popUpWarning.languages.delete.message": "Вы уверены, что хотите удалить этот язык?",
"popUpWarning.title": "Пожалуйта подтвердите",
"request.error.config": "Файл с настройками отсутствует.",
"popUpWarning.title": "Пожалуйста, подтвердите",
"request.error.config": "Файл с настройками не существует.",
"request.error.database.exist": "Это соединение уже существует",
"request.error.database.unknow": "Нет такого соединения",
"request.error.environment.required": "Окружение необходимо.",
@ -625,11 +625,11 @@
"strapi.notification.error": "Возникла ошибка",
"strapi.notification.info.serverRestart": "Сервер будет перезапущен",
"strapi.notification.info.settingsEqual": "Значения идентичны",
"strapi.notification.success.databaseAdd": "База данных успешно добавлен.",
"strapi.notification.success.databaseAdd": "База данных успешно добавлена.",
"strapi.notification.success.databaseDelete": "База данных успешно удалена.",
"strapi.notification.success.databaseDeleted": "База данных была удалена.",
"strapi.notification.success.databaseEdit": "Настройки базы данных успешно обновлены.",
"strapi.notification.success.languageAdd": "Язык успешно добавлен.",
"strapi.notification.success.languageDelete": "Язык успешно удалена.",
"strapi.notification.success.languageDelete": "Язык успешно удален.",
"strapi.notification.success.settingsEdit": "Настройки успешно обновлены."
}

View File

@ -1,6 +1,6 @@
{
"name": "strapi-plugin-settings-manager",
"version": "3.0.0-alpha.18",
"version": "3.0.0-alpha.19",
"description": "Strapi plugin to manage settings.",
"strapi": {
"name": "Settings Manager",
@ -25,7 +25,7 @@
"devDependencies": {
"flag-icon-css": "^2.8.0",
"react-select": "^1.0.0-rc.5",
"strapi-helper-plugin": "3.0.0-alpha.18"
"strapi-helper-plugin": "3.0.0-alpha.19"
},
"author": {
"name": "Strapi team",

Some files were not shown because too many files have changed in this diff Show More