Merge branch 'master' into patch-1

This commit is contained in:
Jim LAURIE 2019-01-15 11:16:24 +01:00 committed by GitHub
commit b79b88b55c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
68 changed files with 230 additions and 142 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

@ -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

@ -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

@ -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

@ -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

@ -256,6 +256,7 @@ AdminPage.propTypes = {
blockApp: PropTypes.bool.isRequired,
disableGlobalOverlayBlocker: PropTypes.func.isRequired,
enableGlobalOverlayBlocker: PropTypes.func.isRequired,
getAdminData: PropTypes.func.isRequired,
hasUserPlugin: PropTypes.bool,
history: PropTypes.object.isRequired,
isAppLoading: PropTypes.bool,

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": "الرسمية",
@ -138,4 +140,4 @@
"notification.error.layout": "تعذّر استرداد التنسيق",
"request.error.model.unknow": "هذا النموذج غير موجود",
"request.error.model.unknown": "هذا النموذج غير موجود"
}
}

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",
@ -138,4 +142,4 @@
"notification.error.layout": "Couldn't retrieve the layout",
"request.error.model.unknown": "This model doesn't exist",
"app.utils.delete": "Delete"
}
}

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",
@ -138,4 +140,4 @@
"notification.error.layout": "No se pudo recuperar el esquema",
"request.error.model.unknown": "Este modelo no existe",
"app.utils.delete": "Eliminar"
}
}

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": "공식",
@ -136,4 +138,4 @@
"notification.error": "에러가 발생했습니다.",
"notification.error.layout": "레이아웃을 가져올 수 없습니다.",
"request.error.model.unknown": "모델이 없습니다."
}
}

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",
@ -137,4 +139,4 @@
"notification.error": "Er is een fout opgetreden",
"notification.error.layout": "Kon de opzet niet laden",
"request.error.model.unknown": "Dit model bestaat niet"
}
}

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",
@ -137,4 +139,4 @@
"notification.error": "Ocorreu um erro",
"notification.error.layout": "Não foi possível recuperar o layout",
"request.error.model.unknown": "Este modelo não existe"
}
}

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.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",
@ -138,4 +140,4 @@
"notification.error.layout": "Düzen alınamadı",
"request.error.model.unknown": "Bu model bulunmamaktadır.",
"app.utils.delete": "Sil"
}
}

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": "官方",
@ -133,4 +135,4 @@
"notification.error": "发生了一个错误",
"notification.error.layout": "无法获取布局",
"request.error.model.unknown": "这个模型已不存在"
}
}

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": "官方",
@ -138,4 +140,4 @@
"notification.error.layout": "無法取得佈局",
"request.error.model.unknown": "不存在的資料",
"app.utils.delete": "刪除"
}
}

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

@ -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,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

@ -15,7 +15,7 @@
"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",
@ -49,4 +49,4 @@
"npm": ">= 6.0.0"
},
"license": "MIT"
}
}

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

@ -17,7 +17,7 @@
"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",
@ -56,4 +56,4 @@
"npm": ">= 6.0.0"
},
"license": "MIT"
}
}

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

@ -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

@ -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

@ -0,0 +1 @@
<svg width="24" height="22" xmlns="http://www.w3.org/2000/svg"><text transform="translate(-23 -7)" fill="#4B515A" fill-rule="evenodd" font-family="AppleColorEmoji, Apple Color Emoji" font-size="24"><tspan x="23" y="28">🗂</tspan></text></svg>

After

Width:  |  Height:  |  Size: 244 B

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

@ -37,7 +37,7 @@ export function* submitForm(action) {
const response = yield call(request, requestURL, { method: 'POST', body: omit(body, 'news') });
if(get(response, 'user.role.name', '') === 'Administrator' || isRegister){
yield call(auth.setToken, response.jwt, body.rememberMe);
yield call(auth.setUserInfo, response.user, body.rememberMe);
}

View File

@ -111,6 +111,14 @@
"policies": []
}
},
{
"method": "GET",
"path": "/permissions",
"handler": "UsersPermissions.getPermissions",
"config": {
"policies": []
}
},
{
"method": "GET",
"path": "/providers",

View File

@ -45,11 +45,9 @@ exports.connect = (provider, query) => {
}
try {
const users = await strapi.query('user', 'users-permissions').find({
where: {
email: profile.email
}
});
const users = await strapi.query('user', 'users-permissions').find(strapi.utils.models.convertParams('user', {
email: profile.email
}));
const advanced = await strapi.store({
environment: '',

View File

@ -438,8 +438,10 @@ module.exports = {
try {
// Disable auto-reload.
strapi.reload.isWatching = false;
// Rewrite actions.json file.
fs.writeFileSync(actionsPath, JSON.stringify({ actions: data }), 'utf8');
if (!strapi.config.currentEnvironment.server.production) {
// Rewrite actions.json file.
fs.writeFileSync(actionsPath, JSON.stringify({ actions: data }), 'utf8');
}
// Set value to AST to avoid restart.
_.set(strapi.plugins['users-permissions'], 'config.actions', data);
// Disable auto-reload.

View File

@ -88,12 +88,18 @@ module.exports = async function() {
return;
}
const existBuildPath = await fs.pathExists(buildPath);
if (strapi.config.currentEnvironment.server.production && existBuildPath) {
return;
} else if (strapi.config.currentEnvironment.server.production && !existBuildPath) {
console.log('The plugins.json file is missing and the front-end cannot work without it. Please, create it first at development environment.');
}
// arrange system directories
await Promise.all([
fs.remove(sourcePath),
(async () => {
const existBuildPath = await fs.pathExists(buildPath);
if (existBuildPath) {
await fs.remove(buildPath);
} else {

View File

@ -37,7 +37,7 @@ module.exports = strapi => {
ctx.status = error.status || 500;
ctx.body = _.get(ctx.body, 'isBoom')
? ctx.body || error && error.message
: Boom.wrap(error, ctx.status, ctx.body || error.message);
: Boom.wrap(error, ctx.status);
}
if (ctx.response.headers.location) {