diff --git a/.eslintrc.js b/.eslintrc.js
index 753acb04..37bacab7 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -1,5 +1,3 @@
-const fs = require('fs');
-
module.exports = {
parser: 'babel-eslint',
extends: [
@@ -21,9 +19,13 @@ module.exports = {
CMS_ENV: false,
},
rules: {
+ 'react-hooks/rules-of-hooks': 'error', // Checks rules of Hooks
+ 'react-hooks/exhaustive-deps': 'warn', // Checks effect dependencies
'no-console': [0],
'react/prop-types': [0],
+ 'react/require-default-props': 0,
'import/no-named-as-default': 0,
+ "react/react-in-jsx-scope": "off",
'import/order': [
'error',
{
@@ -45,8 +47,16 @@ module.exports = {
],
'unicorn/prefer-string-slice': 'error',
'react/no-unknown-property': ['error', { ignore: ['css'] }],
+ '@typescript-eslint/no-unused-vars': [
+ 'warn',
+ {
+ argsIgnorePattern: '^_',
+ varsIgnorePattern: '^_',
+ caughtErrorsIgnorePattern: '^_',
+ },
+ ],
},
- plugins: ['babel', '@emotion', 'cypress', 'unicorn'],
+ plugins: ['babel', '@emotion', 'cypress', 'unicorn', 'react-hooks'],
settings: {
react: {
version: 'detect',
@@ -79,6 +89,9 @@ module.exports = {
},
},
rules: {
+ "react/react-in-jsx-scope": "off",
+ 'react/prop-types': [0],
+ 'react/require-default-props': 0,
'no-duplicate-imports': [0], // handled by @typescript-eslint
'@typescript-eslint/ban-types': [0], // TODO enable in future
'@typescript-eslint/no-non-null-assertion': [0],
diff --git a/babel.config.js b/babel.config.js
index e5dd9da8..40a4d8b8 100644
--- a/babel.config.js
+++ b/babel.config.js
@@ -84,7 +84,7 @@ function plugins() {
}
if (!isProduction) {
- return [...defaultPlugins, 'react-hot-loader/babel'];
+ return [...defaultPlugins];
}
return defaultPlugins;
diff --git a/dev-test/backends/azure/config.yml b/dev-test/backends/azure/config.yml
new file mode 100644
index 00000000..926817bd
--- /dev/null
+++ b/dev-test/backends/azure/config.yml
@@ -0,0 +1,471 @@
+backend:
+ name: azure
+ branch: master
+ repo: organization/project/repo # replace with actual path
+ tenant_id: tenantId # replace with your tenantId
+ app_id: appId # replace with your appId
+
+media_folder: static/media
+public_folder: /media
+collections:
+ - name: posts
+ label: Posts
+ label_singular: Post
+ description: >
+ The description is a great place for tone setting, high level information,
+ and editing guidelines that are specific to a collection.
+ folder: _posts
+ slug: '{{year}}-{{month}}-{{day}}-{{slug}}'
+ summary: '{{title}} -- {{year}}/{{month}}/{{day}}'
+ sortable_fields:
+ fields:
+ - title
+ - date
+ default:
+ field: title
+ create: true
+ view_filters:
+ - label: Posts With Index
+ field: title
+ pattern: 'This is post #'
+ - label: Posts Without Index
+ field: title
+ pattern: front matter post
+ - label: Drafts
+ field: draft
+ pattern: true
+ view_groups:
+ - label: Year
+ field: date
+ pattern: '\d{4}'
+ - label: Drafts
+ field: draft
+ fields:
+ - label: Title
+ name: title
+ widget: string
+ - label: Draft
+ name: draft
+ widget: boolean
+ default: false
+ - label: Publish Date
+ name: date
+ widget: datetime
+ date_format: yyyy-MM-dd
+ time_format: 'HH:mm'
+ format: 'yyyy-MM-dd HH:mm'
+ - label: Cover Image
+ name: image
+ widget: image
+ required: false
+ - label: Body
+ name: body
+ widget: markdown
+ hint: Main content goes here.
+ - name: faq
+ label: FAQ
+ folder: _faqs
+ create: true
+ fields:
+ - label: Question
+ name: title
+ widget: string
+ - label: Answer
+ name: body
+ widget: markdown
+ - name: posts
+ label: Posts
+ label_singular: Post
+ widget: list
+ summary: '{{fields.post | split(''|'', ''$1'')}}'
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: '{{title}}|{{date}}'
+ - name: settings
+ label: Settings
+ delete: false
+ editor:
+ preview: false
+ files:
+ - name: general
+ label: Site Settings
+ file: _data/settings.json
+ description: General Site Settings
+ fields:
+ - label: Number of posts on frontpage
+ name: front_limit
+ widget: number
+ min: 1
+ max: 10
+ - label: Global title
+ name: site_title
+ widget: string
+ - label: Post Settings
+ name: posts
+ widget: object
+ fields:
+ - label: Number of posts on frontpage
+ name: front_limit
+ widget: number
+ min: 1
+ max: 10
+ - label: Default Author
+ name: author
+ widget: string
+ - label: Default Thumbnail
+ name: thumb
+ widget: image
+ required: false
+ - name: authors
+ label: Authors
+ file: _data/authors.yml
+ description: Author descriptions
+ fields:
+ - name: authors
+ label: Authors
+ label_singular: Author
+ widget: list
+ fields:
+ - label: Name
+ name: name
+ widget: string
+ hint: First and Last
+ - label: Description
+ name: description
+ widget: text
+ - name: kitchenSink
+ label: Kitchen Sink
+ folder: _sink
+ create: true
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: Title
+ name: title
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ default: true
+ - label: Map
+ name: map
+ widget: map
+ - label: Text
+ name: text
+ widget: text
+ hint: 'Plain text, not markdown'
+ - label: Number
+ name: number
+ widget: number
+ hint: To infinity and beyond!
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Color
+ name: color
+ widget: color
+ - label: Color string editable and alpha enabled
+ name: colorEditable
+ widget: color
+ enable_alpha: true
+ allow_input: true
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Select multiple
+ name: select_multiple
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ multiple: true
+ - label: Select numeric
+ name: select_numeric
+ widget: select
+ options:
+ - label: One
+ value: 1
+ - label: Two
+ value: 2
+ - label: Three
+ value: 3
+ - label: Hidden
+ name: hidden
+ widget: hidden
+ default: hidden
+ - label: Object
+ name: object
+ widget: object
+ collapsed: true
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ default: false
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: List
+ name: list
+ widget: list
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Object
+ name: object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: List
+ name: list
+ widget: list
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Hidden
+ name: hidden
+ widget: hidden
+ default: hidden
+ - label: Object
+ name: object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Typed List
+ name: typed_list
+ widget: list
+ types:
+ - label: Type 1 Object
+ name: type_1_object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Type 2 Object
+ name: type_2_object
+ widget: object
+ fields:
+ - label: Number
+ name: number
+ widget: number
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Type 3 Object
+ name: type_3_object
+ widget: object
+ fields:
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
diff --git a/dev-test/backends/azure/index.html b/dev-test/backends/azure/index.html
new file mode 100644
index 00000000..4c589562
--- /dev/null
+++ b/dev-test/backends/azure/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ Static CMS - Azure Development Test
+
+
+
+
+
+
diff --git a/dev-test/backends/bitbucket/config.yml b/dev-test/backends/bitbucket/config.yml
new file mode 100644
index 00000000..3237b24f
--- /dev/null
+++ b/dev-test/backends/bitbucket/config.yml
@@ -0,0 +1,469 @@
+backend:
+ name: bitbucket
+ branch: master
+ repo: owner/repo
+
+media_folder: static/media
+public_folder: /media
+collections:
+ - name: posts
+ label: Posts
+ label_singular: Post
+ description: >
+ The description is a great place for tone setting, high level information,
+ and editing guidelines that are specific to a collection.
+ folder: _posts
+ slug: '{{year}}-{{month}}-{{day}}-{{slug}}'
+ summary: '{{title}} -- {{year}}/{{month}}/{{day}}'
+ sortable_fields:
+ fields:
+ - title
+ - date
+ default:
+ field: title
+ create: true
+ view_filters:
+ - label: Posts With Index
+ field: title
+ pattern: 'This is post #'
+ - label: Posts Without Index
+ field: title
+ pattern: front matter post
+ - label: Drafts
+ field: draft
+ pattern: true
+ view_groups:
+ - label: Year
+ field: date
+ pattern: '\d{4}'
+ - label: Drafts
+ field: draft
+ fields:
+ - label: Title
+ name: title
+ widget: string
+ - label: Draft
+ name: draft
+ widget: boolean
+ default: false
+ - label: Publish Date
+ name: date
+ widget: datetime
+ date_format: yyyy-MM-dd
+ time_format: 'HH:mm'
+ format: 'yyyy-MM-dd HH:mm'
+ - label: Cover Image
+ name: image
+ widget: image
+ required: false
+ - label: Body
+ name: body
+ widget: markdown
+ hint: Main content goes here.
+ - name: faq
+ label: FAQ
+ folder: _faqs
+ create: true
+ fields:
+ - label: Question
+ name: title
+ widget: string
+ - label: Answer
+ name: body
+ widget: markdown
+ - name: posts
+ label: Posts
+ label_singular: Post
+ widget: list
+ summary: '{{fields.post | split(''|'', ''$1'')}}'
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: '{{title}}|{{date}}'
+ - name: settings
+ label: Settings
+ delete: false
+ editor:
+ preview: false
+ files:
+ - name: general
+ label: Site Settings
+ file: _data/settings.json
+ description: General Site Settings
+ fields:
+ - label: Number of posts on frontpage
+ name: front_limit
+ widget: number
+ min: 1
+ max: 10
+ - label: Global title
+ name: site_title
+ widget: string
+ - label: Post Settings
+ name: posts
+ widget: object
+ fields:
+ - label: Number of posts on frontpage
+ name: front_limit
+ widget: number
+ min: 1
+ max: 10
+ - label: Default Author
+ name: author
+ widget: string
+ - label: Default Thumbnail
+ name: thumb
+ widget: image
+ required: false
+ - name: authors
+ label: Authors
+ file: _data/authors.yml
+ description: Author descriptions
+ fields:
+ - name: authors
+ label: Authors
+ label_singular: Author
+ widget: list
+ fields:
+ - label: Name
+ name: name
+ widget: string
+ hint: First and Last
+ - label: Description
+ name: description
+ widget: text
+ - name: kitchenSink
+ label: Kitchen Sink
+ folder: _sink
+ create: true
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: Title
+ name: title
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ default: true
+ - label: Map
+ name: map
+ widget: map
+ - label: Text
+ name: text
+ widget: text
+ hint: 'Plain text, not markdown'
+ - label: Number
+ name: number
+ widget: number
+ hint: To infinity and beyond!
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Color
+ name: color
+ widget: color
+ - label: Color string editable and alpha enabled
+ name: colorEditable
+ widget: color
+ enable_alpha: true
+ allow_input: true
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Select multiple
+ name: select_multiple
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ multiple: true
+ - label: Select numeric
+ name: select_numeric
+ widget: select
+ options:
+ - label: One
+ value: 1
+ - label: Two
+ value: 2
+ - label: Three
+ value: 3
+ - label: Hidden
+ name: hidden
+ widget: hidden
+ default: hidden
+ - label: Object
+ name: object
+ widget: object
+ collapsed: true
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ default: false
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: List
+ name: list
+ widget: list
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Object
+ name: object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: List
+ name: list
+ widget: list
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Hidden
+ name: hidden
+ widget: hidden
+ default: hidden
+ - label: Object
+ name: object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Typed List
+ name: typed_list
+ widget: list
+ types:
+ - label: Type 1 Object
+ name: type_1_object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Type 2 Object
+ name: type_2_object
+ widget: object
+ fields:
+ - label: Number
+ name: number
+ widget: number
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Type 3 Object
+ name: type_3_object
+ widget: object
+ fields:
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
diff --git a/dev-test/backends/bitbucket/index.html b/dev-test/backends/bitbucket/index.html
new file mode 100644
index 00000000..aaf1ec46
--- /dev/null
+++ b/dev-test/backends/bitbucket/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ Static CMS - Bitbucket Development Test
+
+
+
+
+
+
diff --git a/dev-test/backends/git-gateway/config.yml b/dev-test/backends/git-gateway/config.yml
new file mode 100644
index 00000000..e6410057
--- /dev/null
+++ b/dev-test/backends/git-gateway/config.yml
@@ -0,0 +1,468 @@
+backend:
+ name: git-gateway
+ branch: master
+
+media_folder: static/media
+public_folder: /media
+collections:
+ - name: posts
+ label: Posts
+ label_singular: Post
+ description: >
+ The description is a great place for tone setting, high level information,
+ and editing guidelines that are specific to a collection.
+ folder: _posts
+ slug: '{{year}}-{{month}}-{{day}}-{{slug}}'
+ summary: '{{title}} -- {{year}}/{{month}}/{{day}}'
+ sortable_fields:
+ fields:
+ - title
+ - date
+ default:
+ field: title
+ create: true
+ view_filters:
+ - label: Posts With Index
+ field: title
+ pattern: 'This is post #'
+ - label: Posts Without Index
+ field: title
+ pattern: front matter post
+ - label: Drafts
+ field: draft
+ pattern: true
+ view_groups:
+ - label: Year
+ field: date
+ pattern: '\d{4}'
+ - label: Drafts
+ field: draft
+ fields:
+ - label: Title
+ name: title
+ widget: string
+ - label: Draft
+ name: draft
+ widget: boolean
+ default: false
+ - label: Publish Date
+ name: date
+ widget: datetime
+ date_format: yyyy-MM-dd
+ time_format: 'HH:mm'
+ format: 'yyyy-MM-dd HH:mm'
+ - label: Cover Image
+ name: image
+ widget: image
+ required: false
+ - label: Body
+ name: body
+ widget: markdown
+ hint: Main content goes here.
+ - name: faq
+ label: FAQ
+ folder: _faqs
+ create: true
+ fields:
+ - label: Question
+ name: title
+ widget: string
+ - label: Answer
+ name: body
+ widget: markdown
+ - name: posts
+ label: Posts
+ label_singular: Post
+ widget: list
+ summary: '{{fields.post | split(''|'', ''$1'')}}'
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: '{{title}}|{{date}}'
+ - name: settings
+ label: Settings
+ delete: false
+ editor:
+ preview: false
+ files:
+ - name: general
+ label: Site Settings
+ file: _data/settings.json
+ description: General Site Settings
+ fields:
+ - label: Number of posts on frontpage
+ name: front_limit
+ widget: number
+ min: 1
+ max: 10
+ - label: Global title
+ name: site_title
+ widget: string
+ - label: Post Settings
+ name: posts
+ widget: object
+ fields:
+ - label: Number of posts on frontpage
+ name: front_limit
+ widget: number
+ min: 1
+ max: 10
+ - label: Default Author
+ name: author
+ widget: string
+ - label: Default Thumbnail
+ name: thumb
+ widget: image
+ required: false
+ - name: authors
+ label: Authors
+ file: _data/authors.yml
+ description: Author descriptions
+ fields:
+ - name: authors
+ label: Authors
+ label_singular: Author
+ widget: list
+ fields:
+ - label: Name
+ name: name
+ widget: string
+ hint: First and Last
+ - label: Description
+ name: description
+ widget: text
+ - name: kitchenSink
+ label: Kitchen Sink
+ folder: _sink
+ create: true
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: Title
+ name: title
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ default: true
+ - label: Map
+ name: map
+ widget: map
+ - label: Text
+ name: text
+ widget: text
+ hint: 'Plain text, not markdown'
+ - label: Number
+ name: number
+ widget: number
+ hint: To infinity and beyond!
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Color
+ name: color
+ widget: color
+ - label: Color string editable and alpha enabled
+ name: colorEditable
+ widget: color
+ enable_alpha: true
+ allow_input: true
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Select multiple
+ name: select_multiple
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ multiple: true
+ - label: Select numeric
+ name: select_numeric
+ widget: select
+ options:
+ - label: One
+ value: 1
+ - label: Two
+ value: 2
+ - label: Three
+ value: 3
+ - label: Hidden
+ name: hidden
+ widget: hidden
+ default: hidden
+ - label: Object
+ name: object
+ widget: object
+ collapsed: true
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ default: false
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: List
+ name: list
+ widget: list
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Object
+ name: object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: List
+ name: list
+ widget: list
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Hidden
+ name: hidden
+ widget: hidden
+ default: hidden
+ - label: Object
+ name: object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Typed List
+ name: typed_list
+ widget: list
+ types:
+ - label: Type 1 Object
+ name: type_1_object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Type 2 Object
+ name: type_2_object
+ widget: object
+ fields:
+ - label: Number
+ name: number
+ widget: number
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Type 3 Object
+ name: type_3_object
+ widget: object
+ fields:
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
diff --git a/dev-test/backends/git-gateway/index.html b/dev-test/backends/git-gateway/index.html
new file mode 100644
index 00000000..03a2b384
--- /dev/null
+++ b/dev-test/backends/git-gateway/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ Static CMS - Git Gateway Development Test
+
+
+
+
+
+
diff --git a/dev-test/backends/github/config.yml b/dev-test/backends/github/config.yml
new file mode 100644
index 00000000..9a489331
--- /dev/null
+++ b/dev-test/backends/github/config.yml
@@ -0,0 +1,469 @@
+backend:
+ name: github
+ branch: master
+ repo: owner/repo
+
+media_folder: static/media
+public_folder: /media
+collections:
+ - name: posts
+ label: Posts
+ label_singular: Post
+ description: >
+ The description is a great place for tone setting, high level information,
+ and editing guidelines that are specific to a collection.
+ folder: _posts
+ slug: '{{year}}-{{month}}-{{day}}-{{slug}}'
+ summary: '{{title}} -- {{year}}/{{month}}/{{day}}'
+ sortable_fields:
+ fields:
+ - title
+ - date
+ default:
+ field: title
+ create: true
+ view_filters:
+ - label: Posts With Index
+ field: title
+ pattern: 'This is post #'
+ - label: Posts Without Index
+ field: title
+ pattern: front matter post
+ - label: Drafts
+ field: draft
+ pattern: true
+ view_groups:
+ - label: Year
+ field: date
+ pattern: '\d{4}'
+ - label: Drafts
+ field: draft
+ fields:
+ - label: Title
+ name: title
+ widget: string
+ - label: Draft
+ name: draft
+ widget: boolean
+ default: false
+ - label: Publish Date
+ name: date
+ widget: datetime
+ date_format: yyyy-MM-dd
+ time_format: 'HH:mm'
+ format: 'yyyy-MM-dd HH:mm'
+ - label: Cover Image
+ name: image
+ widget: image
+ required: false
+ - label: Body
+ name: body
+ widget: markdown
+ hint: Main content goes here.
+ - name: faq
+ label: FAQ
+ folder: _faqs
+ create: true
+ fields:
+ - label: Question
+ name: title
+ widget: string
+ - label: Answer
+ name: body
+ widget: markdown
+ - name: posts
+ label: Posts
+ label_singular: Post
+ widget: list
+ summary: '{{fields.post | split(''|'', ''$1'')}}'
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: '{{title}}|{{date}}'
+ - name: settings
+ label: Settings
+ delete: false
+ editor:
+ preview: false
+ files:
+ - name: general
+ label: Site Settings
+ file: _data/settings.json
+ description: General Site Settings
+ fields:
+ - label: Number of posts on frontpage
+ name: front_limit
+ widget: number
+ min: 1
+ max: 10
+ - label: Global title
+ name: site_title
+ widget: string
+ - label: Post Settings
+ name: posts
+ widget: object
+ fields:
+ - label: Number of posts on frontpage
+ name: front_limit
+ widget: number
+ min: 1
+ max: 10
+ - label: Default Author
+ name: author
+ widget: string
+ - label: Default Thumbnail
+ name: thumb
+ widget: image
+ required: false
+ - name: authors
+ label: Authors
+ file: _data/authors.yml
+ description: Author descriptions
+ fields:
+ - name: authors
+ label: Authors
+ label_singular: Author
+ widget: list
+ fields:
+ - label: Name
+ name: name
+ widget: string
+ hint: First and Last
+ - label: Description
+ name: description
+ widget: text
+ - name: kitchenSink
+ label: Kitchen Sink
+ folder: _sink
+ create: true
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: Title
+ name: title
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ default: true
+ - label: Map
+ name: map
+ widget: map
+ - label: Text
+ name: text
+ widget: text
+ hint: 'Plain text, not markdown'
+ - label: Number
+ name: number
+ widget: number
+ hint: To infinity and beyond!
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Color
+ name: color
+ widget: color
+ - label: Color string editable and alpha enabled
+ name: colorEditable
+ widget: color
+ enable_alpha: true
+ allow_input: true
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Select multiple
+ name: select_multiple
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ multiple: true
+ - label: Select numeric
+ name: select_numeric
+ widget: select
+ options:
+ - label: One
+ value: 1
+ - label: Two
+ value: 2
+ - label: Three
+ value: 3
+ - label: Hidden
+ name: hidden
+ widget: hidden
+ default: hidden
+ - label: Object
+ name: object
+ widget: object
+ collapsed: true
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ default: false
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: List
+ name: list
+ widget: list
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Object
+ name: object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: List
+ name: list
+ widget: list
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Hidden
+ name: hidden
+ widget: hidden
+ default: hidden
+ - label: Object
+ name: object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Typed List
+ name: typed_list
+ widget: list
+ types:
+ - label: Type 1 Object
+ name: type_1_object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Type 2 Object
+ name: type_2_object
+ widget: object
+ fields:
+ - label: Number
+ name: number
+ widget: number
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Type 3 Object
+ name: type_3_object
+ widget: object
+ fields:
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
diff --git a/dev-test/backends/github/index.html b/dev-test/backends/github/index.html
new file mode 100644
index 00000000..5eb1e792
--- /dev/null
+++ b/dev-test/backends/github/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ Static CMS - GitHub Development Test
+
+
+
+
+
+
diff --git a/dev-test/backends/gitlab/config.yml b/dev-test/backends/gitlab/config.yml
new file mode 100644
index 00000000..6d41d3fa
--- /dev/null
+++ b/dev-test/backends/gitlab/config.yml
@@ -0,0 +1,469 @@
+backend:
+ name: gitlab
+ branch: master
+ repo: owner/repo
+
+media_folder: static/media
+public_folder: /media
+collections:
+ - name: posts
+ label: Posts
+ label_singular: Post
+ description: >
+ The description is a great place for tone setting, high level information,
+ and editing guidelines that are specific to a collection.
+ folder: _posts
+ slug: '{{year}}-{{month}}-{{day}}-{{slug}}'
+ summary: '{{title}} -- {{year}}/{{month}}/{{day}}'
+ sortable_fields:
+ fields:
+ - title
+ - date
+ default:
+ field: title
+ create: true
+ view_filters:
+ - label: Posts With Index
+ field: title
+ pattern: 'This is post #'
+ - label: Posts Without Index
+ field: title
+ pattern: front matter post
+ - label: Drafts
+ field: draft
+ pattern: true
+ view_groups:
+ - label: Year
+ field: date
+ pattern: '\d{4}'
+ - label: Drafts
+ field: draft
+ fields:
+ - label: Title
+ name: title
+ widget: string
+ - label: Draft
+ name: draft
+ widget: boolean
+ default: false
+ - label: Publish Date
+ name: date
+ widget: datetime
+ date_format: yyyy-MM-dd
+ time_format: 'HH:mm'
+ format: 'yyyy-MM-dd HH:mm'
+ - label: Cover Image
+ name: image
+ widget: image
+ required: false
+ - label: Body
+ name: body
+ widget: markdown
+ hint: Main content goes here.
+ - name: faq
+ label: FAQ
+ folder: _faqs
+ create: true
+ fields:
+ - label: Question
+ name: title
+ widget: string
+ - label: Answer
+ name: body
+ widget: markdown
+ - name: posts
+ label: Posts
+ label_singular: Post
+ widget: list
+ summary: '{{fields.post | split(''|'', ''$1'')}}'
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: '{{title}}|{{date}}'
+ - name: settings
+ label: Settings
+ delete: false
+ editor:
+ preview: false
+ files:
+ - name: general
+ label: Site Settings
+ file: _data/settings.json
+ description: General Site Settings
+ fields:
+ - label: Number of posts on frontpage
+ name: front_limit
+ widget: number
+ min: 1
+ max: 10
+ - label: Global title
+ name: site_title
+ widget: string
+ - label: Post Settings
+ name: posts
+ widget: object
+ fields:
+ - label: Number of posts on frontpage
+ name: front_limit
+ widget: number
+ min: 1
+ max: 10
+ - label: Default Author
+ name: author
+ widget: string
+ - label: Default Thumbnail
+ name: thumb
+ widget: image
+ required: false
+ - name: authors
+ label: Authors
+ file: _data/authors.yml
+ description: Author descriptions
+ fields:
+ - name: authors
+ label: Authors
+ label_singular: Author
+ widget: list
+ fields:
+ - label: Name
+ name: name
+ widget: string
+ hint: First and Last
+ - label: Description
+ name: description
+ widget: text
+ - name: kitchenSink
+ label: Kitchen Sink
+ folder: _sink
+ create: true
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: Title
+ name: title
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ default: true
+ - label: Map
+ name: map
+ widget: map
+ - label: Text
+ name: text
+ widget: text
+ hint: 'Plain text, not markdown'
+ - label: Number
+ name: number
+ widget: number
+ hint: To infinity and beyond!
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Color
+ name: color
+ widget: color
+ - label: Color string editable and alpha enabled
+ name: colorEditable
+ widget: color
+ enable_alpha: true
+ allow_input: true
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Select multiple
+ name: select_multiple
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ multiple: true
+ - label: Select numeric
+ name: select_numeric
+ widget: select
+ options:
+ - label: One
+ value: 1
+ - label: Two
+ value: 2
+ - label: Three
+ value: 3
+ - label: Hidden
+ name: hidden
+ widget: hidden
+ default: hidden
+ - label: Object
+ name: object
+ widget: object
+ collapsed: true
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ default: false
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: List
+ name: list
+ widget: list
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Object
+ name: object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: List
+ name: list
+ widget: list
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Hidden
+ name: hidden
+ widget: hidden
+ default: hidden
+ - label: Object
+ name: object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Typed List
+ name: typed_list
+ widget: list
+ types:
+ - label: Type 1 Object
+ name: type_1_object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Type 2 Object
+ name: type_2_object
+ widget: object
+ fields:
+ - label: Number
+ name: number
+ widget: number
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Type 3 Object
+ name: type_3_object
+ widget: object
+ fields:
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
diff --git a/dev-test/backends/gitlab/index.html b/dev-test/backends/gitlab/index.html
new file mode 100644
index 00000000..a63fb7a5
--- /dev/null
+++ b/dev-test/backends/gitlab/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ Static CMS - GitLab Development Test
+
+
+
+
+
+
diff --git a/dev-test/backends/proxy/config.yml b/dev-test/backends/proxy/config.yml
new file mode 100644
index 00000000..5d54289b
--- /dev/null
+++ b/dev-test/backends/proxy/config.yml
@@ -0,0 +1,472 @@
+backend:
+ name: github
+ branch: main
+ repo: owner/repo
+
+media_folder: static/media
+public_folder: /media
+
+local_backend: true
+
+collections:
+ - name: posts
+ label: Posts
+ label_singular: Post
+ description: >
+ The description is a great place for tone setting, high level information,
+ and editing guidelines that are specific to a collection.
+ folder: _posts
+ slug: '{{year}}-{{month}}-{{day}}-{{slug}}'
+ summary: '{{title}} -- {{year}}/{{month}}/{{day}}'
+ sortable_fields:
+ fields:
+ - title
+ - date
+ default:
+ field: title
+ create: true
+ view_filters:
+ - label: Posts With Index
+ field: title
+ pattern: 'This is post #'
+ - label: Posts Without Index
+ field: title
+ pattern: front matter post
+ - label: Drafts
+ field: draft
+ pattern: true
+ view_groups:
+ - label: Year
+ field: date
+ pattern: '\d{4}'
+ - label: Drafts
+ field: draft
+ fields:
+ - label: Title
+ name: title
+ widget: string
+ - label: Draft
+ name: draft
+ widget: boolean
+ default: false
+ - label: Publish Date
+ name: date
+ widget: datetime
+ date_format: yyyy-MM-dd
+ time_format: 'HH:mm'
+ format: 'yyyy-MM-dd HH:mm'
+ - label: Cover Image
+ name: image
+ widget: image
+ required: false
+ - label: Body
+ name: body
+ widget: markdown
+ hint: Main content goes here.
+ - name: faq
+ label: FAQ
+ folder: _faqs
+ create: true
+ fields:
+ - label: Question
+ name: title
+ widget: string
+ - label: Answer
+ name: body
+ widget: markdown
+ - name: posts
+ label: Posts
+ label_singular: Post
+ widget: list
+ summary: '{{fields.post | split(''|'', ''$1'')}}'
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: '{{title}}|{{date}}'
+ - name: settings
+ label: Settings
+ delete: false
+ editor:
+ preview: false
+ files:
+ - name: general
+ label: Site Settings
+ file: _data/settings.json
+ description: General Site Settings
+ fields:
+ - label: Number of posts on frontpage
+ name: front_limit
+ widget: number
+ min: 1
+ max: 10
+ - label: Global title
+ name: site_title
+ widget: string
+ - label: Post Settings
+ name: posts
+ widget: object
+ fields:
+ - label: Number of posts on frontpage
+ name: front_limit
+ widget: number
+ min: 1
+ max: 10
+ - label: Default Author
+ name: author
+ widget: string
+ - label: Default Thumbnail
+ name: thumb
+ widget: image
+ required: false
+ - name: authors
+ label: Authors
+ file: _data/authors.yml
+ description: Author descriptions
+ fields:
+ - name: authors
+ label: Authors
+ label_singular: Author
+ widget: list
+ fields:
+ - label: Name
+ name: name
+ widget: string
+ hint: First and Last
+ - label: Description
+ name: description
+ widget: text
+ - name: kitchenSink
+ label: Kitchen Sink
+ folder: _sink
+ create: true
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: Title
+ name: title
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ default: true
+ - label: Map
+ name: map
+ widget: map
+ - label: Text
+ name: text
+ widget: text
+ hint: 'Plain text, not markdown'
+ - label: Number
+ name: number
+ widget: number
+ hint: To infinity and beyond!
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Color
+ name: color
+ widget: color
+ - label: Color string editable and alpha enabled
+ name: colorEditable
+ widget: color
+ enable_alpha: true
+ allow_input: true
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Select multiple
+ name: select_multiple
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ multiple: true
+ - label: Select numeric
+ name: select_numeric
+ widget: select
+ options:
+ - label: One
+ value: 1
+ - label: Two
+ value: 2
+ - label: Three
+ value: 3
+ - label: Hidden
+ name: hidden
+ widget: hidden
+ default: hidden
+ - label: Object
+ name: object
+ widget: object
+ collapsed: true
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ default: false
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: List
+ name: list
+ widget: list
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Object
+ name: object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: markdown
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: List
+ name: list
+ widget: list
+ fields:
+ - label: Related Post
+ name: post
+ widget: relationKitchenSinkPost
+ collection: posts
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Hidden
+ name: hidden
+ widget: hidden
+ default: hidden
+ - label: Object
+ name: object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Number
+ name: number
+ widget: number
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Typed List
+ name: typed_list
+ widget: list
+ types:
+ - label: Type 1 Object
+ name: type_1_object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Type 2 Object
+ name: type_2_object
+ widget: object
+ fields:
+ - label: Number
+ name: number
+ widget: number
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Type 3 Object
+ name: type_3_object
+ widget: object
+ fields:
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
diff --git a/dev-test/backends/proxy/index.html b/dev-test/backends/proxy/index.html
new file mode 100644
index 00000000..38c207b6
--- /dev/null
+++ b/dev-test/backends/proxy/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ Static CMS - Proxy Development Test
+
+
+
+
+
+
diff --git a/dev-test/config.yml b/dev-test/config.yml
index 350ccccf..94f33736 100644
--- a/dev-test/config.yml
+++ b/dev-test/config.yml
@@ -55,7 +55,7 @@ collections:
required: false
- label: Body
name: body
- widget: text
+ widget: markdown
hint: Main content goes here.
- name: faq
label: FAQ
@@ -67,12 +67,12 @@ collections:
widget: string
- label: Answer
name: body
- widget: text
+ widget: markdown
- name: posts
label: Posts
label_singular: Post
widget: list
- summary: '{{fields.post | split(''|'', ''$1'')}}'
+ summary: "{{fields.post | split('|', '$1')}}"
fields:
- label: Related Post
name: post
@@ -85,6 +85,408 @@ collections:
- title
- body
value_field: '{{title}}|{{date}}'
+ - name: widgets
+ label: Widgets
+ delete: false
+ editor:
+ preview: false
+ files:
+ - name: boolean
+ label: Boolean
+ file: _widgets/boolean.json
+ description: Boolean widget
+ fields:
+ - name: required
+ label: 'Required Validation'
+ widget: boolean
+ - name: pattern
+ label: 'Pattern Validation'
+ widget: boolean
+ pattern: ['true', 'Must be true']
+ required: false
+ - name: code
+ label: Code
+ file: _widgets/code.json
+ description: Code widget
+ fields:
+ - name: required
+ label: 'Required Validation'
+ widget: code
+ - name: pattern
+ label: 'Pattern Validation'
+ widget: code
+ pattern: ['.{12,}', 'Must have at least 12 characters']
+ allow_input: true
+ required: false
+ - name: language
+ label: 'Language Selection'
+ widget: code
+ allow_language_selection: true
+ required: false
+ - name: color
+ label: Color
+ file: _widgets/color.json
+ description: Color widget
+ fields:
+ - name: required
+ label: 'Required Validation'
+ widget: color
+ - name: pattern
+ label: 'Pattern Validation'
+ widget: color
+ pattern: ['^#([0-9a-fA-F]{3})(?:[0-9a-fA-F]{3})?$', 'Must be a valid hex code']
+ allow_input: true
+ required: false
+ - name: alpha
+ label: Alpha
+ widget: color
+ enable_alpha: true
+ required: false
+ - name: datetime
+ label: DateTime
+ file: _widgets/datetime.json
+ description: DateTime widget
+ fields:
+ - name: required
+ label: 'Required Validation'
+ widget: datetime
+ - name: pattern
+ label: 'Pattern Validation'
+ widget: datetime
+ format: 'MMM d, yyyy h:mm aaa'
+ date_format: 'MMM d, yyyy'
+ time_format: 'h:mm aaa'
+ pattern: ['pm', 'Must be in the afternoon']
+ required: false
+ - name: date_and_time
+ label: Date and Time
+ widget: datetime
+ format: 'MMM d, yyyy h:mm aaa'
+ date_format: 'MMM d, yyyy'
+ time_format: 'h:mm aaa'
+ required: false
+ - name: date
+ label: Date
+ widget: datetime
+ format: 'MMM d, yyyy'
+ date_format: 'MMM d, yyyy'
+ required: false
+ - name: time
+ label: Time
+ widget: datetime
+ format: 'h:mm aaa'
+ time_format: 'h:mm aaa'
+ required: false
+ - name: file
+ label: File
+ file: _widgets/file.json
+ description: File widget
+ fields:
+ - name: required
+ label: 'Required Validation'
+ widget: file
+ - name: pattern
+ label: 'Pattern Validation'
+ widget: file
+ pattern: ['\.pdf', 'Must be a pdf']
+ required: false
+ - name: choose_url
+ label: 'Choose URL'
+ widget: file
+ required: false
+ media_library:
+ choose_url: true
+ - name: image
+ label: Image
+ file: _widgets/image.json
+ description: Image widget
+ fields:
+ - name: required
+ label: 'Required Validation'
+ widget: image
+ - name: pattern
+ label: 'Pattern Validation'
+ widget: image
+ pattern: ['\.png', 'Must be a png']
+ required: false
+ - name: choose_url
+ label: 'Choose URL'
+ widget: image
+ required: false
+ media_library:
+ choose_url: true
+ - name: list
+ label: List
+ file: _widgets/list.yml
+ description: List widget
+ fields:
+ - name: list
+ label: List
+ widget: list
+ fields:
+ - label: Name
+ name: name
+ widget: string
+ hint: First and Last
+ - label: Description
+ name: description
+ widget: text
+ - name: typed_list
+ label: Typed List
+ widget: list
+ types:
+ - label: Type 1 Object
+ name: type_1_object
+ widget: object
+ fields:
+ - label: String
+ name: string
+ widget: string
+ - label: Boolean
+ name: boolean
+ widget: boolean
+ - label: Text
+ name: text
+ widget: text
+ - label: Type 2 Object
+ name: type_2_object
+ widget: object
+ fields:
+ - label: Number
+ name: number
+ widget: number
+ - label: Select
+ name: select
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Datetime
+ name: datetime
+ widget: datetime
+ - label: Markdown
+ name: markdown
+ widget: text
+ - label: Type 3 Object
+ name: type_3_object
+ widget: object
+ fields:
+ - label: Image
+ name: image
+ widget: image
+ - label: File
+ name: file
+ widget: file
+ - name: map
+ label: Map
+ file: _widgets/map.json
+ description: Map widget
+ fields:
+ - name: required
+ label: 'Required Validation'
+ widget: map
+ - name: pattern
+ label: 'Pattern Validation'
+ widget: map
+ pattern: ['\[-([7-9][0-9]|1[0-2][0-9])\.', 'Must be between latitude -70 and -129']
+ required: false
+ - name: markdown
+ label: Markdown
+ file: _widgets/markdown.json
+ description: Markdown widget
+ fields:
+ - name: required
+ label: 'Required Validation'
+ widget: markdown
+ - name: pattern
+ label: 'Pattern Validation'
+ widget: markdown
+ pattern: ['# [a-zA-Z0-9]+', 'Must have a header']
+ required: false
+ - name: number
+ label: Number
+ file: _widgets/number.json
+ description: Number widget
+ fields:
+ - name: required
+ label: 'Required Validation'
+ widget: number
+ - name: min
+ label: 'Min Validation'
+ widget: number
+ min: 5
+ required: false
+ - name: max
+ label: 'Max Validation'
+ widget: number
+ max: 10
+ required: false
+ - name: min_and_max
+ label: 'Min and Max Validation'
+ widget: number
+ min: 5
+ max: 10
+ required: false
+ - name: pattern
+ label: 'Pattern Validation'
+ widget: number
+ pattern: ['[0-9]{3,}', 'Must be at least 3 digits']
+ required: false
+ - name: object
+ label: Object
+ file: _widgets/object.json
+ description: Object widget
+ fields:
+ - label: Required Validation
+ name: required
+ widget: object
+ fields:
+ - label: Number of posts on frontpage
+ name: front_limit
+ widget: number
+ - label: Default Author
+ name: author
+ widget: string
+ - label: Default Thumbnail
+ name: thumb
+ widget: image
+ - label: Optional Validation
+ name: optional
+ widget: object
+ required: false
+ fields:
+ - label: Number of posts on frontpage
+ name: front_limit
+ widget: number
+ required: false
+ - label: Default Author
+ name: author
+ widget: string
+ required: false
+ - label: Default Thumbnail
+ name: thumb
+ widget: image
+ required: false
+ - name: relation
+ label: Relation
+ file: _widgets/relation.json
+ description: Relation widget
+ fields:
+ - label: Required Validation
+ name: required
+ widget: relation
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: Optional Validation
+ name: optional
+ widget: relation
+ required: false
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - label: Multiple
+ name: multiple
+ widget: relation
+ multiple: true
+ required: false
+ collection: posts
+ display_fields:
+ - title
+ - date
+ search_fields:
+ - title
+ - body
+ value_field: title
+ - name: select
+ label: Select
+ file: _widgets/select.json
+ description: Select widget
+ fields:
+ - label: Required Validation
+ name: required
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ - label: Pattern Validation
+ name: pattern
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ pattern: ['[a-b]', 'Must be a or b']
+ required: false
+ - label: Value and Label
+ name: value_and_label
+ widget: select
+ options:
+ - value: a
+ label: A fancy label
+ - value: b
+ label: Another fancy label
+ - value: c
+ label: And one more fancy label
+ - label: Multiple
+ name: multiple
+ widget: select
+ options:
+ - a
+ - b
+ - c
+ pattern: ['[a-b]', 'Must be a or b']
+ multiple: true
+ required: false
+ - label: Value and Label Multiple
+ name: value_and_label_multiple
+ widget: select
+ multiple: true
+ options:
+ - value: a
+ label: A fancy label
+ - value: b
+ label: Another fancy label
+ - value: c
+ label: And one more fancy label
+ - name: string
+ label: String
+ file: _widgets/string.json
+ description: String widget
+ fields:
+ - name: required
+ label: 'Required Validation'
+ widget: string
+ - name: pattern
+ label: 'Pattern Validation'
+ widget: string
+ pattern: ['.{12,}', 'Must have at least 12 characters']
+ required: false
+ - name: text
+ label: Text
+ file: _widgets/text.json
+ description: Text widget
+ fields:
+ - name: required
+ label: 'Required Validation'
+ widget: text
+ - name: pattern
+ label: 'Pattern Validation'
+ widget: text
+ pattern: ['.{12,}', 'Must have at least 12 characters']
+ required: false
- name: settings
label: Settings
delete: false
@@ -173,21 +575,18 @@ collections:
hint: To infinity and beyond!
- label: Markdown
name: markdown
- widget: string
+ widget: markdown
- label: Datetime
name: datetime
widget: datetime
- - label: Date
- name: date
- widget: datetime
- label: Color
name: color
widget: color
- label: Color string editable and alpha enabled
name: colorEditable
widget: color
- enableAlpha: true
- allowInput: true
+ enable_alpha: true
+ allow_input: true
- label: Image
name: image
widget: image
@@ -251,13 +650,10 @@ collections:
widget: number
- label: Markdown
name: markdown
- widget: text
+ widget: markdown
- label: Datetime
name: datetime
widget: datetime
- - label: Date
- name: date
- widget: datetime
- label: Image
name: image
widget: image
@@ -289,13 +685,10 @@ collections:
widget: number
- label: Markdown
name: markdown
- widget: text
+ widget: markdown
- label: Datetime
name: datetime
widget: datetime
- - label: Date
- name: date
- widget: datetime
- label: Image
name: image
widget: image
@@ -327,13 +720,10 @@ collections:
widget: number
- label: Markdown
name: markdown
- widget: text
+ widget: markdown
- label: Datetime
name: datetime
widget: datetime
- - label: Date
- name: date
- widget: datetime
- label: Image
name: image
widget: image
@@ -377,9 +767,6 @@ collections:
- label: Datetime
name: datetime
widget: datetime
- - label: Date
- name: date
- widget: datetime
- label: Image
name: image
widget: image
@@ -419,9 +806,6 @@ collections:
- label: Datetime
name: datetime
widget: datetime
- - label: Date
- name: date
- widget: datetime
- label: Image
name: image
widget: image
@@ -476,9 +860,6 @@ collections:
name: type_3_object
widget: object
fields:
- - label: Date
- name: date
- widget: datetime
- label: Image
name: image
widget: image
diff --git a/dev-test/index.html b/dev-test/index.html
index 883ec515..c2e6ecfa 100644
--- a/dev-test/index.html
+++ b/dev-test/index.html
@@ -1,117 +1,184 @@
-
+
-
-
+
+
- Static CMS Development Test
-
-
-
-
-
-
+ };
+
+
+
+
+
+
diff --git a/dev-test/index.js b/dev-test/index.js
index 037e3ca3..11cdcce8 100644
--- a/dev-test/index.js
+++ b/dev-test/index.js
@@ -1,35 +1,4 @@
// Register all the things
-window.CMS.registerBackend('git-gateway', window.CMS.GitGatewayBackend);
-window.CMS.registerBackend('proxy', window.CMS.ProxyBackend);
-window.CMS.registerBackend('test-repo', window.CMS.TestBackend);
-window.CMS.registerWidget([
- window.CMS.StringWidget.Widget(),
- window.CMS.NumberWidget.Widget(),
- window.CMS.TextWidget.Widget(),
- window.CMS.ImageWidget.Widget(),
- window.CMS.FileWidget.Widget(),
- window.CMS.SelectWidget.Widget(),
- window.CMS.MarkdownWidget.Widget(),
- window.CMS.ListWidget.Widget(),
- window.CMS.ObjectWidget.Widget(),
- window.CMS.RelationWidget.Widget(),
- window.CMS.BooleanWidget.Widget(),
- window.CMS.DateTimeWidget.Widget(),
- window.CMS.ColorStringWidget.Widget(),
-]);
-window.CMS.registerEditorComponent(window.CMS.imageEditorComponent);
-window.CMS.registerEditorComponent({
- id: 'code-block',
- label: 'Code Block',
- widget: 'code',
- type: 'code-block',
-});
-window.CMS.registerLocale('en', window.CMS.locales.en);
-
-Object.keys(window.CMS.images).forEach(iconName => {
- window.CMS.registerIcon(iconName, window.h(window.CMS.Icon, { type: iconName }));
-});
-
window.CMS.init();
const PostPreview = window.createClass({
@@ -41,10 +10,10 @@ const PostPreview = window.createClass({
window.h(
'div',
{ className: 'cover' },
- window.h('h1', {}, entry.getIn(['data', 'title'])),
+ window.h('h1', {}, entry.data.title),
this.props.widgetFor('image'),
),
- window.h('p', {}, window.h('small', {}, 'Written ' + entry.getIn(['data', 'date']))),
+ window.h('p', {}, window.h('small', {}, 'Written ' + entry.data.date)),
window.h('div', { className: 'text' }, this.props.widgetFor('body')),
);
},
@@ -53,9 +22,9 @@ const PostPreview = window.createClass({
const GeneralPreview = window.createClass({
render: function () {
const entry = this.props.entry;
- const title = entry.getIn(['data', 'site_title']);
- const posts = entry.getIn(['data', 'posts']);
- const thumb = posts && posts.get('thumb');
+ const title = entry.data.site_title;
+ const posts = entry.data.posts;
+ const thumb = posts && posts.thumb;
return window.h(
'div',
@@ -65,10 +34,10 @@ const GeneralPreview = window.createClass({
'dl',
{},
window.h('dt', {}, 'Posts on Frontpage'),
- window.h('dd', {}, this.props.widgetsFor('posts').getIn(['widgets', 'front_limit']) || 0),
+ window.h('dd', {}, this.props.widgetsFor('posts').widgets.front_limit || 0),
window.h('dt', {}, 'Default Author'),
- window.h('dd', {}, this.props.widgetsFor('posts').getIn(['data', 'author']) || 'None'),
+ window.h('dd', {}, this.props.widgetsFor('posts').data.author || 'None'),
window.h('dt', {}, 'Default Thumbnail'),
window.h(
@@ -91,8 +60,8 @@ const AuthorsPreview = window.createClass({
'div',
{ key: index },
window.h('hr', {}),
- window.h('strong', {}, author.getIn(['data', 'name'])),
- author.getIn(['widgets', 'description']),
+ window.h('strong', {}, author.data.name),
+ author.widgets.description,
);
}),
);
@@ -108,49 +77,31 @@ const RelationKitchenSinkPostPreview = window.createClass({
// the title of the selected post, since our `value_field` in the config
// is "title".
const { value, fieldsMetaData } = this.props;
- const post = fieldsMetaData && fieldsMetaData.getIn(['posts', value]);
+ const post = fieldsMetaData && fieldsMetaData.posts.value;
const style = { border: '2px solid #ccc', borderRadius: '8px', padding: '20px' };
return post
? window.h(
'div',
{ style: style },
window.h('h2', {}, 'Related Post'),
- window.h('h3', {}, post.get('title')),
- window.h('img', { src: post.get('image') }),
- window.h('p', {}, post.get('body', '').slice(0, 100) + '...'),
+ window.h('h3', {}, post.title),
+ window.h('img', { src: post.image }),
+ window.h('p', {}, (post.body ?? '').slice(0, 100) + '...'),
)
: null;
},
});
-const previewStyles = `
- html,
- body {
- color: #444;
- font-size: 14px;
- font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
- }
-
- body {
- padding: 20px;
- }
-
- h1 {
- margin-top: 20px;
- color: #666;
- font-weight: bold;
- font-size: 32px;
- }
-
- img {
- max-width: 100%;
- }
-`;
-
window.CMS.registerPreviewTemplate('posts', PostPreview);
window.CMS.registerPreviewTemplate('general', GeneralPreview);
window.CMS.registerPreviewTemplate('authors', AuthorsPreview);
-window.CMS.registerPreviewStyle(previewStyles, { raw: true });
// Pass the name of a registered control to reuse with a new widget preview.
window.CMS.registerWidget('relationKitchenSinkPost', 'relation', RelationKitchenSinkPostPreview);
-window.CMS.registerAdditionalLink('example', 'Example.com', 'https://example.com', 'page');
+window.CMS.registerAdditionalLink({
+ id: 'example',
+ title: 'Example.com',
+ data: 'https://example.com',
+ options: {
+ icon: 'page',
+ },
+});
diff --git a/index.d.ts b/index.d.ts
deleted file mode 100644
index 807f0f80..00000000
--- a/index.d.ts
+++ /dev/null
@@ -1,924 +0,0 @@
-/* eslint-disable @typescript-eslint/no-explicit-any */
-declare module '@staticcms/core' {
- import type { Iterable as ImmutableIterable, List, Map } from 'immutable';
- import type { ComponentType, FocusEventHandler, ReactNode } from 'react';
- import type { t } from 'react-polyglot';
- import type { Pluggable } from 'unified';
-
- export type CmsBackendType =
- | 'azure'
- | 'git-gateway'
- | 'github'
- | 'gitlab'
- | 'bitbucket'
- | 'test-repo'
- | 'proxy';
-
- export type CmsMapWidgetType = 'Point' | 'LineString' | 'Polygon';
-
- export type CmsMarkdownWidgetButton =
- | 'bold'
- | 'italic'
- | 'code'
- | 'link'
- | 'heading-one'
- | 'heading-two'
- | 'heading-three'
- | 'heading-four'
- | 'heading-five'
- | 'heading-six'
- | 'quote'
- | 'code-block'
- | 'bulleted-list'
- | 'numbered-list';
-
- export interface CmsSelectWidgetOptionObject {
- label: string;
- value: any;
- }
-
- export type CmsCollectionFormatType =
- | 'yml'
- | 'yaml'
- | 'toml'
- | 'json'
- | 'frontmatter'
- | 'yaml-frontmatter'
- | 'toml-frontmatter'
- | 'json-frontmatter';
-
- export type CmsAuthScope = 'repo' | 'public_repo';
-
- export type CmsSlugEncoding = 'unicode' | 'ascii';
-
- export interface CmsI18nConfig {
- structure: 'multiple_folders' | 'multiple_files' | 'single_file';
- locales: string[];
- default_locale?: string;
- }
-
- export interface CmsFieldBase {
- name: string;
- label?: string;
- required?: boolean;
- hint?: string;
- pattern?: [string, string];
- i18n?: boolean | 'translate' | 'duplicate' | 'none';
- media_folder?: string;
- public_folder?: string;
- comment?: string;
- }
-
- export interface CmsFieldBoolean {
- widget: 'boolean';
- default?: boolean;
- }
-
- export interface CmsFieldCode {
- widget: 'code';
- default?: any;
-
- default_language?: string;
- allow_language_selection?: boolean;
- keys?: { code: string; lang: string };
- output_code_only?: boolean;
- }
-
- export interface CmsFieldColor {
- widget: 'color';
- default?: string;
-
- allowInput?: boolean;
- enableAlpha?: boolean;
- }
-
- export interface CmsFieldDateTime {
- widget: 'datetime';
- default?: string;
-
- format?: string;
- date_format?: boolean | string;
- time_format?: boolean | string;
- picker_utc?: boolean;
-
- /**
- * @deprecated Use date_format instead
- */
- dateFormat?: boolean | string;
- /**
- * @deprecated Use time_format instead
- */
- timeFormat?: boolean | string;
- /**
- * @deprecated Use picker_utc instead
- */
- pickerUtc?: boolean;
- }
-
- export interface CmsFieldFileOrImage {
- widget: 'file' | 'image';
- default?: string;
-
- media_library?: CmsMediaLibrary;
- allow_multiple?: boolean;
- config?: any;
- }
-
- export interface CmsFieldObject {
- widget: 'object';
- default?: any;
-
- collapsed?: boolean;
- summary?: string;
- fields: CmsField[];
- }
-
- export interface CmsFieldList {
- widget: 'list';
- default?: any;
-
- allow_add?: boolean;
- collapsed?: boolean;
- summary?: string;
- minimize_collapsed?: boolean;
- label_singular?: string;
- field?: CmsField;
- fields?: CmsField[];
- max?: number;
- min?: number;
- add_to_top?: boolean;
- types?: (CmsFieldBase & CmsFieldObject)[];
- }
-
- export interface CmsFieldMap {
- widget: 'map';
- default?: string;
-
- decimals?: number;
- type?: CmsMapWidgetType;
- }
-
- export interface CmsFieldMarkdown {
- widget: 'markdown';
- default?: string;
-
- minimal?: boolean;
- buttons?: CmsMarkdownWidgetButton[];
- editor_components?: string[];
- modes?: ('raw' | 'rich_text')[];
-
- /**
- * @deprecated Use editor_components instead
- */
- editorComponents?: string[];
- }
-
- export interface CmsFieldNumber {
- widget: 'number';
- default?: string | number;
-
- value_type?: 'int' | 'float' | string;
- min?: number;
- max?: number;
-
- step?: number;
-
- /**
- * @deprecated Use valueType instead
- */
- valueType?: 'int' | 'float' | string;
- }
-
- export interface CmsFieldSelect {
- widget: 'select';
- default?: string | string[];
-
- options: string[] | CmsSelectWidgetOptionObject[];
- multiple?: boolean;
- min?: number;
- max?: number;
- }
-
- export interface CmsFieldRelation {
- widget: 'relation';
- default?: string | string[];
-
- collection: string;
- value_field: string;
- search_fields: string[];
- file?: string;
- display_fields?: string[];
- multiple?: boolean;
- options_length?: number;
-
- /**
- * @deprecated Use value_field instead
- */
- valueField?: string;
- /**
- * @deprecated Use search_fields instead
- */
- searchFields?: string[];
- /**
- * @deprecated Use display_fields instead
- */
- displayFields?: string[];
- /**
- * @deprecated Use options_length instead
- */
- optionsLength?: number;
- }
-
- export interface CmsFieldHidden {
- widget: 'hidden';
- default?: any;
- }
-
- export interface CmsFieldStringOrText {
- // This is the default widget, so declaring its type is optional.
- widget?: 'string' | 'text';
- default?: string;
- }
-
- export interface CmsFieldMeta {
- name: string;
- label: string;
- widget: string;
- required: boolean;
- index_file: string;
- meta: boolean;
- }
-
- export type CmsField = CmsFieldBase &
- (
- | CmsFieldBoolean
- | CmsFieldCode
- | CmsFieldColor
- | CmsFieldDateTime
- | CmsFieldFileOrImage
- | CmsFieldList
- | CmsFieldMap
- | CmsFieldMarkdown
- | CmsFieldNumber
- | CmsFieldObject
- | CmsFieldRelation
- | CmsFieldSelect
- | CmsFieldHidden
- | CmsFieldStringOrText
- | CmsFieldMeta
- );
-
- export interface CmsCollectionFile {
- name: string;
- label: string;
- file: string;
- fields: CmsField[];
- label_singular?: string;
- description?: string;
- i18n?: boolean | CmsI18nConfig;
- media_folder?: string;
- public_folder?: string;
- editor?: {
- preview?: boolean;
- };
- }
-
- export interface ViewFilter {
- label: string;
- field: string;
- pattern: string;
- }
-
- export interface ViewGroup {
- label: string;
- field: string;
- pattern?: string;
- }
-
- export type SortDirection = 'Ascending' | 'Descending' | 'None';
-
- export interface CmsSortableFieldsDefault {
- field: string;
- direction?: SortDirection;
- }
-
- export interface CmsSortableFields {
- default?: CmsSortableFieldsDefault;
- fields: string[];
- }
-
- export interface CmsCollection {
- name: string;
- icon?: string;
- label: string;
- label_singular?: string;
- description?: string;
- folder?: string;
- files?: CmsCollectionFile[];
- identifier_field?: string;
- summary?: string;
- slug?: string;
- create?: boolean;
- delete?: boolean;
- hide?: boolean;
- editor?: {
- preview?: boolean;
- };
- publish?: boolean;
- nested?: {
- depth: number;
- };
- meta?: { path?: { label: string; widget: string; index_file: string } };
-
- /**
- * It accepts the following values: yml, yaml, toml, json, md, markdown, html
- *
- * You may also specify a custom extension not included in the list above, by specifying the format value.
- */
- extension?: string;
- format?: CmsCollectionFormatType;
-
- frontmatter_delimiter?: string[] | string;
- fields?: CmsField[];
- filter?: { field: string; value: any };
- path?: string;
- media_folder?: string;
- public_folder?: string;
- sortable_fields?: CmsSortableFields;
- view_filters?: ViewFilter[];
- view_groups?: ViewGroup[];
- i18n?: boolean | CmsI18nConfig;
- }
-
- export interface CmsBackend {
- name: CmsBackendType;
- auth_scope?: CmsAuthScope;
- repo?: string;
- branch?: string;
- api_root?: string;
- site_domain?: string;
- base_url?: string;
- auth_endpoint?: string;
- app_id?: string;
- auth_type?: 'implicit' | 'pkce';
- proxy_url?: string;
- commit_messages?: {
- create?: string;
- update?: string;
- delete?: string;
- uploadMedia?: string;
- deleteMedia?: string;
- };
- }
-
- export interface CmsSlug {
- encoding?: CmsSlugEncoding;
- clean_accents?: boolean;
- sanitize_replacement?: string;
- }
-
- export interface CmsLocalBackend {
- url?: string;
- allowed_hosts?: string[];
- }
-
- export interface CmsConfig {
- backend: CmsBackend;
- collections: CmsCollection[];
- locale?: string;
- site_url?: string;
- display_url?: string;
- logo_url?: string;
- media_folder?: string;
- public_folder?: string;
- media_folder_relative?: boolean;
- media_library?: CmsMediaLibrary;
- load_config_file?: boolean;
- integrations?: {
- hooks: string[];
- provider: string;
- collections?: '*' | string[];
- applicationID?: string;
- apiKey?: string;
- getSignedFormURL?: string;
- }[];
- slug?: CmsSlug;
- i18n?: CmsI18nConfig;
- local_backend?: boolean | CmsLocalBackend;
- editor?: {
- preview?: boolean;
- };
- }
-
- export interface InitOptions {
- config: CmsConfig;
- }
-
- export interface EditorComponentField {
- name: string;
- label: string;
- widget: string;
- }
-
- export interface EditorComponentWidgetOptions {
- id: string;
- label: string;
- widget: string;
- type: string;
- }
-
- export interface EditorComponentManualOptions {
- id: string;
- label: string;
- fields: EditorComponentField[];
- pattern: RegExp;
- allow_add?: boolean;
- fromBlock: (match: RegExpMatchArray) => any;
- toBlock: (data: any) => string;
- toPreview: (data: any) => string;
- }
-
- export type EditorComponentOptions = EditorComponentManualOptions | EditorComponentWidgetOptions;
-
- export interface PreviewStyleOptions {
- raw: boolean;
- }
-
- export interface PreviewStyle extends PreviewStyleOptions {
- value: string;
- }
-
- export type CmsBackendClass = Implementation;
-
- export interface CmsRegistryBackend {
- init: (args: any) => CmsBackendClass;
- }
-
- export interface CmsWidgetControlProps {
- value: T;
- field: Map;
- onChange: (value: T) => void;
- forID: string;
- classNameWrapper: string;
- setActiveStyle: FocusEventHandler;
- setInactiveStyle: FocusEventHandler;
- t: t;
- }
-
- export interface CmsWidgetPreviewProps {
- value: T;
- field: Map;
- metadata: Map;
- getAsset: GetAssetFunction;
- entry: Map;
- fieldsMetaData: Map;
- }
-
- export interface CmsWidgetParam {
- name: string;
- controlComponent: CmsWidgetControlProps;
- previewComponent?: CmsWidgetPreviewProps;
- validator?: (props: {
- field: Map;
- value: T | undefined | null;
- t: t;
- }) => boolean | { error: any } | Promise;
- globalStyles?: any;
- }
-
- export interface CmsWidget {
- control: ComponentType>;
- preview?: ComponentType>;
- globalStyles?: any;
- }
-
- export type CmsWidgetValueSerializer = any; // TODO: type properly
-
- export type CmsMediaLibraryOptions = any; // TODO: type properly
-
- export interface CmsMediaLibrary {
- name: string;
- config?: CmsMediaLibraryOptions;
- }
-
- export interface CmsEventListener {
- name: 'prePublish' | 'postPublish' | 'preSave' | 'postSave';
- handler: ({
- entry,
- author,
- }: {
- entry: Map;
- author: { login: string; name: string };
- }) => any;
- }
-
- export type CmsEventListenerOptions = any; // TODO: type properly
-
- export type CmsLocalePhrases = any; // TODO: type properly
-
- export interface CmsRegistry {
- backends: {
- [name: string]: CmsRegistryBackend;
- };
- templates: {
- [name: string]: ComponentType;
- };
- previewStyles: PreviewStyle[];
- widgets: {
- [name: string]: CmsWidget;
- };
- editorComponents: Map>;
- widgetValueSerializers: {
- [name: string]: CmsWidgetValueSerializer;
- };
- mediaLibraries: CmsMediaLibrary[];
- locales: {
- [name: string]: CmsLocalePhrases;
- };
- }
-
- type GetAssetFunction = (asset: string) => {
- url: string;
- path: string;
- field?: any;
- fileObj: File;
- };
-
- export type PreviewTemplateComponentProps = {
- entry: Map;
- collection: Map;
- widgetFor: (name: any, fields?: any, values?: any, fieldsMetaData?: any) => JSX.Element | null;
- widgetsFor: (name: any) => any;
- getAsset: GetAssetFunction;
- boundGetAsset: (collection: any, path: any) => GetAssetFunction;
- fieldsMetaData: Map;
- config: Map;
- fields: List