Skip to content

Commit 192e275

Browse files
Merge pull request #337 from jekyll/defaults
Support frontmatter defaults in the front end
2 parents cf7bf79 + 3514243 commit 192e275

16 files changed

+175
-37
lines changed

spec/fixtures/site/_config.yml

+16-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,22 @@ defaults:
1717
scope:
1818
path: ""
1919
values:
20-
some_front_matter: "default"
20+
all: true
21+
- scope:
22+
path: ''
23+
type: pages
24+
values:
25+
page_only: true
26+
- scope:
27+
path: ''
28+
type: puppies
29+
values:
30+
breed: ''
31+
- scope:
32+
path: 'test'
33+
type: posts
34+
values:
35+
post_test_only: true
2136

2237
# Dummy Collection.
2338
collections:

spec/jekyll-admin/apiable_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@
5252
end
5353

5454
it "includes front matter defaults as top-level keys" do
55-
expect(as_api).to have_key("some_front_matter")
56-
expect(as_api["some_front_matter"]).to eql("default")
55+
expect(as_api).to have_key("all")
56+
expect(as_api["all"]).to eql(true)
5757
end
5858

5959
it "includes front matter as top-level keys" do

spec/jekyll-admin/server/collection_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def app
7171
it "includes front matter defaults" do
7272
get "/collections/posts/entries/"
7373
expect(last_response).to be_ok
74-
expect(first_document.key?("some_front_matter")).to eq(true)
74+
expect(first_document.key?("all")).to eq(true)
7575
end
7676

7777
it "doesn't include the raw front matter" do
@@ -181,7 +181,7 @@ def app
181181

182182
it "contains front matter defaults" do
183183
get "/collections/posts/2016-01-01-test-post.md"
184-
expect(last_response_parsed.key?("some_front_matter")).to eql(true)
184+
expect(last_response_parsed.key?("all")).to eql(true)
185185
end
186186

187187
it "contains raw front matter" do

spec/jekyll-admin/server/page_spec.rb

+5-3
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ def app
4545
it "includes front matter defaults" do
4646
get "/pages"
4747
expect(last_response).to be_ok
48-
expect(first_page).to have_key("some_front_matter")
48+
expect(first_page).to have_key("all")
49+
expect(first_page).to have_key("page_only")
4950
end
5051

5152
it "doesn't include the raw front matter" do
@@ -101,7 +102,8 @@ def app
101102

102103
it "contains front matter defaults" do
103104
get "/pages/page.md"
104-
expect(last_response_parsed.key?("some_front_matter")).to eql(true)
105+
expect(last_response_parsed.key?("all")).to eql(true)
106+
expect(last_response_parsed.key?("page_only")).to eql(true)
105107
end
106108

107109
it "contains raw front matter" do
@@ -112,7 +114,7 @@ def app
112114

113115
it "raw front matter doesn't include defaults" do
114116
get "/pages/page.md"
115-
expect(front_matter.key?("some_front_matter")).to eql(false)
117+
expect(front_matter.key?("all")).to eql(false)
116118
end
117119
end
118120

src/containers/MetaFields.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export class MetaFields extends Component {
1717
}
1818

1919
shouldComponentUpdate(nextProps) {
20-
return nextProps.metadata !== this.props.metadata;
20+
return !_.isEqual(nextProps.metadata, this.props.metadata);
2121
}
2222

2323
render() {

src/containers/views/DocumentEdit.js

+9-4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Metadata from '../../containers/MetaFields';
1515
import { fetchDocument, deleteDocument, putDocument } from '../../actions/collections';
1616
import { updateTitle, updateBody, updatePath } from '../../actions/metadata';
1717
import { clearErrors } from '../../actions/utils';
18+
import { injectDefaultFields } from '../../utils/metadata';
1819
import { preventDefault } from '../../utils/helpers';
1920
import {
2021
getLeaveMessage, getDeleteMessage, getNotFoundMessage
@@ -97,7 +98,7 @@ export class DocumentEdit extends Component {
9798
render() {
9899
const {
99100
isFetching, currentDocument, errors, updateTitle, updateBody, updatePath, updated,
100-
fieldChanged, params
101+
fieldChanged, params, config
101102
} = this.props;
102103

103104
if (isFetching) {
@@ -113,6 +114,8 @@ export class DocumentEdit extends Component {
113114
} = currentDocument;
114115
const [directory, ...rest] = params.splat;
115116

117+
const metafields = injectDefaultFields(config, directory, collection, front_matter);
118+
116119
const keyboardHandlers = {
117120
'save': this.handleClickSave,
118121
};
@@ -139,7 +142,7 @@ export class DocumentEdit extends Component {
139142
initialValue={raw_content}
140143
ref="editor" />
141144
<Splitter />
142-
<Metadata fields={{title, path: name, raw_content, ...front_matter}} />
145+
<Metadata fields={{title, path: name, raw_content, ...metafields}} />
143146
</div>
144147

145148
<div className="content-side">
@@ -188,15 +191,17 @@ DocumentEdit.propTypes = {
188191
fieldChanged: PropTypes.bool.isRequired,
189192
params: PropTypes.object.isRequired,
190193
router: PropTypes.object.isRequired,
191-
route: PropTypes.object.isRequired
194+
route: PropTypes.object.isRequired,
195+
config: PropTypes.object.isRequired
192196
};
193197

194198
const mapStateToProps = (state) => ({
195199
currentDocument: state.collections.currentDocument,
196200
isFetching: state.collections.isFetching,
197201
fieldChanged: state.metadata.fieldChanged,
198202
updated: state.collections.updated,
199-
errors: state.utils.errors
203+
errors: state.utils.errors,
204+
config: state.config.config
200205
});
201206

202207
const mapDispatchToProps = (dispatch) => bindActionCreators({

src/containers/views/DocumentNew.js

+11-9
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { updateTitle, updateBody, updatePath } from '../../actions/metadata';
1414
import { createDocument } from '../../actions/collections';
1515
import { clearErrors } from '../../actions/utils';
1616
import { getFilenameFromPath } from '../../utils/helpers';
17+
import { injectDefaultFields } from '../../utils/metadata';
1718
import {
1819
getLeaveMessage, getDeleteMessage, getNotFoundMessage
1920
} from '../../constants/lang';
@@ -59,13 +60,14 @@ export class DocumentNew extends Component {
5960
}
6061

6162
render() {
62-
const {
63-
errors, updated, updateTitle, updateBody, updatePath, fieldChanged, params
64-
} = this.props;
63+
const { errors, updated, updateTitle, updateBody, updatePath, fieldChanged,
64+
params, config } = this.props;
6565

6666
const collection = params.collection_name;
6767
const link = `${ADMIN_PREFIX}/collections/${collection}`;
6868

69+
const metafields = injectDefaultFields(config, params.splat, collection);
70+
6971
return (
7072
<div className="single">
7173
{errors.length > 0 && <Errors errors={errors} />}
@@ -86,7 +88,7 @@ export class DocumentNew extends Component {
8688
initialValue=""
8789
ref="editor" />
8890
<Splitter />
89-
<Metadata fields={{}} />
91+
<Metadata fields={metafields} />
9092
</div>
9193

9294
<div className="content-side">
@@ -115,14 +117,16 @@ DocumentNew.propTypes = {
115117
updated: PropTypes.bool.isRequired,
116118
params: PropTypes.object.isRequired,
117119
router: PropTypes.object.isRequired,
118-
route: PropTypes.object.isRequired
120+
route: PropTypes.object.isRequired,
121+
config: PropTypes.object.isRequired
119122
};
120123

121124
const mapStateToProps = (state) => ({
122125
currentDocument: state.collections.currentDocument,
123126
fieldChanged: state.metadata.fieldChanged,
124127
errors: state.utils.errors,
125-
updated: state.collections.updated
128+
updated: state.collections.updated,
129+
config: state.config.config
126130
});
127131

128132
const mapDispatchToProps = (dispatch) => bindActionCreators({
@@ -133,6 +137,4 @@ const mapDispatchToProps = (dispatch) => bindActionCreators({
133137
clearErrors
134138
}, dispatch);
135139

136-
export default withRouter(
137-
connect(mapStateToProps, mapDispatchToProps)(DocumentNew)
138-
);
140+
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(DocumentNew));

src/containers/views/PageEdit.js

+10-4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Metadata from '../MetaFields';
1515
import { fetchPage, deletePage, putPage } from '../../actions/pages';
1616
import { updateTitle, updateBody, updatePath } from '../../actions/metadata';
1717
import { clearErrors } from '../../actions/utils';
18+
import { injectDefaultFields } from '../../utils/metadata';
1819
import { preventDefault } from '../../utils/helpers';
1920
import {
2021
getLeaveMessage, getDeleteMessage, getNotFoundMessage
@@ -89,7 +90,7 @@ export class PageEdit extends Component {
8990

9091
render() {
9192
const { isFetching, page, errors, updateTitle, updateBody, updatePath,
92-
updated, fieldChanged, params } = this.props;
93+
updated, fieldChanged, params, config } = this.props;
9394

9495
if (isFetching) {
9596
return null;
@@ -105,7 +106,10 @@ export class PageEdit extends Component {
105106

106107
const { name, raw_content, http_url, path, front_matter } = page;
107108
const [directory, ...rest] = params.splat;
109+
108110
const title = front_matter && front_matter.title ? front_matter.title : '';
111+
const metafields = injectDefaultFields(config, directory, 'pages', front_matter);
112+
109113
return (
110114
<HotKeys
111115
handlers={keyboardHandlers}
@@ -126,7 +130,7 @@ export class PageEdit extends Component {
126130
initialValue={raw_content}
127131
ref="editor" />
128132
<Splitter />
129-
<Metadata fields={{title, raw_content, path: name, ...front_matter}} />
133+
<Metadata fields={{title, raw_content, path: name, ...metafields}} />
130134
</div>
131135

132136
<div className="content-side">
@@ -173,15 +177,17 @@ PageEdit.propTypes = {
173177
updated: PropTypes.bool.isRequired,
174178
params: PropTypes.object.isRequired,
175179
router: PropTypes.object.isRequired,
176-
route: PropTypes.object.isRequired
180+
route: PropTypes.object.isRequired,
181+
config: PropTypes.object.isRequired
177182
};
178183

179184
const mapStateToProps = (state) => ({
180185
page: state.pages.page,
181186
isFetching: state.pages.isFetching,
182187
fieldChanged: state.metadata.fieldChanged,
183188
updated: state.pages.updated,
184-
errors: state.utils.errors
189+
errors: state.utils.errors,
190+
config: state.config.config
185191
});
186192

187193
const mapDispatchToProps = (dispatch) => bindActionCreators({

src/containers/views/PageNew.js

+8-4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Metadata from '../../containers/MetaFields';
1515
import { updateTitle, updateBody, updatePath, updateDraft } from '../../actions/metadata';
1616
import { createPage } from '../../actions/pages';
1717
import { clearErrors } from '../../actions/utils';
18+
import { injectDefaultFields } from '../../utils/metadata';
1819
import {
1920
getLeaveMessage, getDeleteMessage, getNotFoundMessage
2021
} from '../../constants/lang';
@@ -55,8 +56,9 @@ export class PageNew extends Component {
5556

5657
render() {
5758
const { errors, updated, updateTitle, updateBody, updatePath,
58-
updateDraft, fieldChanged, params } = this.props;
59+
updateDraft, fieldChanged, params, config } = this.props;
5960

61+
const metafields = injectDefaultFields(config, params.splat, 'pages');
6062
return (
6163
<div className="single">
6264
{errors.length > 0 && <Errors errors={errors} />}
@@ -77,7 +79,7 @@ export class PageNew extends Component {
7779
initialValue=""
7880
ref="editor" />
7981
<Splitter />
80-
<Metadata fields={{}} />
82+
<Metadata fields={metafields} />
8183
</div>
8284

8385
<div className="content-side">
@@ -107,14 +109,16 @@ PageNew.propTypes = {
107109
updated: PropTypes.bool.isRequired,
108110
router: PropTypes.object.isRequired,
109111
route: PropTypes.object.isRequired,
110-
params: PropTypes.object.isRequired
112+
params: PropTypes.object.isRequired,
113+
config: PropTypes.object.isRequired
111114
};
112115

113116
const mapStateToProps = (state) => ({
114117
page: state.pages.page,
115118
fieldChanged: state.metadata.fieldChanged,
116119
errors: state.utils.errors,
117-
updated: state.pages.updated
120+
updated: state.pages.updated,
121+
config: state.config.config
118122
});
119123

120124
const mapDispatchToProps = (dispatch) => bindActionCreators({

src/containers/views/tests/documentedit.spec.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { DocumentEdit } from '../DocumentEdit';
77
import Errors from '../../../components/Errors';
88
import Button from '../../../components/Button';
99

10-
import { doc } from './fixtures';
10+
import { config, doc } from './fixtures';
1111

1212
const defaultProps = {
1313
currentDocument: doc,
@@ -17,6 +17,7 @@ const defaultProps = {
1717
isFetching: false,
1818
router: {},
1919
route: {},
20+
config: config,
2021
params: { collection_name: "movies", splat: [null, "inception", "md"] }
2122
};
2223

src/containers/views/tests/documentnew.spec.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ import { DocumentNew } from '../DocumentNew';
77
import Errors from '../../../components/Errors';
88
import Button from '../../../components/Button';
99

10-
import { doc } from './fixtures';
10+
import { config, doc } from './fixtures';
1111

1212
const defaultProps = {
1313
errors: [],
1414
fieldChanged: false,
1515
updated: false,
1616
router: {},
1717
route: {},
18+
config: config,
1819
params: { collection_name: doc.collection }
1920
};
2021

src/containers/views/tests/pageedit.spec.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { PageEdit } from '../PageEdit';
77
import Errors from '../../../components/Errors';
88
import Button from '../../../components/Button';
99

10-
import { page } from './fixtures';
10+
import { config, page } from './fixtures';
1111

1212
const defaultProps = {
1313
page: page,
@@ -17,6 +17,7 @@ const defaultProps = {
1717
isFetching: false,
1818
router: {},
1919
route: {},
20+
config: config,
2021
params: { splat: [null, "page", "md"] }
2122
};
2223

src/containers/views/tests/pagenew.spec.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ import { PageNew } from '../PageNew';
77
import Errors from '../../../components/Errors';
88
import Button from '../../../components/Button';
99

10-
import { page } from './fixtures';
10+
import { config, page } from './fixtures';
1111

1212
const defaultProps = {
1313
errors: [],
1414
fieldChanged: false,
1515
updated: false,
1616
router: {},
1717
route: {},
18+
config: config,
1819
params: { splat: 'page-dir' }
1920
};
2021

0 commit comments

Comments
 (0)