Skip to content

Commit fed6a81

Browse files
committed
Implement a basic api.contentTypes.create
& a very primitive UI to test the api
1 parent 04cb955 commit fed6a81

9 files changed

Lines changed: 279 additions & 140 deletions

File tree

package-lock.json

Lines changed: 17 additions & 136 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"scripts": {
1010
"start": "node src/ssg",
1111
"hookup": "husky install",
12-
"tape": "tape \"src/**/*.spec.js\" \"src/ssg/e2e-tests/**/*.test.js\" | tap-nyan",
12+
"tape": "tape \"src/**/*.spec.js\" \"src/ssg/e2e-tests/**/*.test.js\" | tap-nyan",
1313
"tape:ci": "tape \"src/**/*.spec.js\" \"src/ssg/e2e-tests/**/*.test.js\" | tap-spec",
1414
"test": "nyc --reporter=text-summary npm run tape",
1515
"test:ci": "nyc --reporter=lcov npm run tape:ci",
@@ -42,7 +42,8 @@
4242
"posthtml": "^0.16.6",
4343
"posthtml-urls": "^1.0.0",
4444
"slug": "^8.2.3",
45-
"turndown": "^7.1.1"
45+
"turndown": "^7.1.1",
46+
"yaml": "^2.8.2"
4647
},
4748
"devDependencies": {
4849
"cheerio": "^1.1.2",

src/cms/api/models/contentTypes.js

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,26 @@
1-
const createContentTypesModel = ({ getContentTypes }) => {
1+
const { join } = require('path')
2+
const { mkdir, writeFile } = require('fs/promises')
3+
const { stringify } = require('yaml')
4+
5+
const createContentTypesModel = ({ getSettings, getContentTypes }) => {
6+
const createContentType = async ({ name, description = '', attributes, ...config }) => {
7+
const { rootDirectory } = getSettings()
8+
const schemaDirectory = join(rootDirectory, 'schema')
9+
const filePath = join(schemaDirectory, `${name}.md`)
10+
const frontMatter = stringify({
11+
name,
12+
attributes,
13+
...config
14+
})
15+
const fileContent = ['---', frontMatter.replace(/\s+$/, ''), '---', description].join('\n')
16+
await mkdir(schemaDirectory, { recursive: true })
17+
await writeFile(filePath, fileContent)
18+
return { ok: true }
19+
}
20+
221
return {
3-
get: getContentTypes
22+
get: getContentTypes,
23+
create: createContentType
424
}
525
}
626

src/cms/server/public/api.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,17 @@ const api = {
118118
}
119119
})
120120
return response.json()
121+
},
122+
123+
create: async (options) => {
124+
const response = await fetch('/api/contentTypes', {
125+
method: 'post',
126+
headers: {
127+
'content-type': 'application/json'
128+
},
129+
body: JSON.stringify(options)
130+
})
131+
return response.json()
121132
}
122133
},
123134

src/cms/server/public/app.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ const editProject = async ({ ssgOptions }) => {
3232
console.log('starting editor with ssgOptions', ssgOptions)
3333
await api.ssg.watch(ssgOptions)
3434
setIframeSrc()
35+
36+
const contentTypes = await api.contentTypes.get()
37+
if (contentTypes.length) {
38+
console.log('contentTypes', contentTypes)
39+
} else {
40+
console.log('no contentTypes')
41+
}
3542
}
3643

3744
window.addEventListener('DOMContentLoaded', async () => {

src/cms/server/public/app/components/dialog.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ const dialog = {
44
$el: query('#dialog'),
55
$content: query('#dialog-content'),
66

7+
find(selector) {
8+
return this.$content.querySelector(selector)
9+
},
10+
711
textContent(content) {
812
if (content) {
913
this.$content.textContent = content
@@ -12,6 +16,14 @@ const dialog = {
1216
return this.$content.textContent
1317
},
1418

19+
html(html) {
20+
if (html) {
21+
this.$content.innerHTML = html
22+
return this
23+
}
24+
return this.$content.innerHTML
25+
},
26+
1527
show() {
1628
this.$el.showModal()
1729
}

src/cms/server/public/app/explorePanel.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import getSSGOptions from './explorePanel/getSSGOptions.js'
66
import getSettings from './explorePanel/getSettings.js'
77
import updateSettings from './explorePanel/updateSettings.js'
88
import getContentTypes from './explorePanel/getContentTypes.js'
9+
import createContentType from './explorePanel/createContentType.js'
910
import getContentModel from './explorePanel/getContentModel.js'
1011
import getFileSystemTree from './explorePanel/getFileSystemTree.js'
1112
import getCollections from './explorePanel/getCollections.js'
@@ -30,6 +31,7 @@ const template = () => {
3031
3132
<p>contentTypes</p>
3233
<button type="button" id="get-content-types-btn">get contentTypes</button>
34+
<button type="button" id="create-content-type-btn">create contentType</button>
3335
3436
<p>contentModel</p>
3537
<button type="button" id="get-content-model-btn">get contentModel</button>
@@ -69,6 +71,7 @@ const makeButtonsWork = (panel) => {
6971
panel.querySelector('#get-settings-btn').addEventListener('click', getSettings)
7072
panel.querySelector('#update-settings-btn').addEventListener('click', updateSettings)
7173
panel.querySelector('#get-content-types-btn').addEventListener('click', getContentTypes)
74+
panel.querySelector('#create-content-type-btn').addEventListener('click', createContentType)
7275
panel.querySelector('#get-content-model-btn').addEventListener('click', getContentModel)
7376
panel.querySelector('#get-file-system-tree-btn').addEventListener('click', getFileSystemTree)
7477
panel.querySelector('#get-collections-btn').addEventListener('click', getCollections)

0 commit comments

Comments
 (0)