summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2017-06-29 03:09:00 +0200
committerJules Laplace <julescarbon@gmail.com>2017-06-29 03:09:00 +0200
commit1726a81b320e92ce412c0fa2b2b05f73798cc4ee (patch)
treeeb3314621f652098ca8d046ad081b78aa89ba78d /client
parent50904f4b010c417d558174005a7b4c5868e7d8d9 (diff)
folder browser
Diffstat (limited to 'client')
-rw-r--r--client/client.js61
-rw-r--r--client/components/App.jsx19
-rw-r--r--client/components/Folder/Folder.jsx39
-rw-r--r--client/components/Folders/FolderForm.jsx26
-rw-r--r--client/components/Folders/Folders.jsx21
5 files changed, 129 insertions, 37 deletions
diff --git a/client/client.js b/client/client.js
index a48b53e..a769367 100644
--- a/client/client.js
+++ b/client/client.js
@@ -1,10 +1,10 @@
-function get() {
+function _get(data) {
return {
method: 'GET',
headers: {
'Accept': 'application/json',
- 'Content-Type': 'application/json'
},
+ query: data,
}
}
function post(data) {
@@ -20,16 +20,26 @@ function post(data) {
function postBody(data) {
return {
method: 'POST',
+ body: data,
headers: {
'Accept': 'application/json',
},
- body: data,
}
}
function put(data) {
return {
method: 'PUT',
- body: data,
+ body: JSON.stringify(data),
+ headers: {
+ 'Accept': 'application/json',
+ 'Content-Type': 'application/json'
+ },
+ }
+}
+function destroy(data) {
+ return {
+ method: 'DELETE',
+ body: JSON.stringify(data),
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
@@ -39,44 +49,51 @@ function put(data) {
function error(err) {
console.warn(err)
}
-
-export default {
- folder: {
- index: () => {
- return fetch('/folders/')
+function crud(type_s) {
+ const type = '/' + type_s + 's/'
+ return {
+ index: (data) => {
+ return fetch(type, _get(data))
.then(req => req.json())
.catch(error)
},
show: (id) => {
- return fetch('/folders/' + id)
+ return fetch(type + id)
.then(req => req.json())
.catch(error)
},
create: (data) => {
- return fetch('/folders/new', post(data))
+ return fetch(type, post(data))
.then(req => req.json())
.catch(error)
},
update: (data) => {
- return fetch('/folders/' + data.id, put(data))
+ return fetch(type + data.id, put(data))
.then(req => req.json())
.catch(error)
},
- },
-
- file: {
- upload: (folder_id, files) => {
- var data = new FormData()
- for (var i = 0; i < files.length; i++) {
- data.append('file', files[i])
- }
- return fetch('/folders/' + folder_id, postBody(files))
+
+ destroy: (data) => {
+ return fetch(type + data.id, destroy(data))
.then(req => req.json())
.catch(error)
},
+ }
+}
+
+export default {
+ folder: crud('folder'),
+ file: crud('file'),
+ upload: (folder_id, files) => {
+ var data = new FormData()
+ for (var i = 0; i < files.length; i++) {
+ data.append('file', files[i])
+ }
+ return fetch('/folders/' + folder_id, postBody(files))
+ .then(req => req.json())
+ .catch(error)
},
-
} \ No newline at end of file
diff --git a/client/components/App.jsx b/client/components/App.jsx
index bbb50d6..f7122b2 100644
--- a/client/components/App.jsx
+++ b/client/components/App.jsx
@@ -5,23 +5,38 @@ import { Link, withRouter } from 'react-router-dom'
import Header from './Header.jsx'
import Folders from './Folders/Folders.jsx'
+import Folder from './Folder/Folder.jsx'
+
+import client from '../client'
class App extends Component {
constructor(props) {
super()
this.state = {
folders: null,
+ openFolders: [],
+ }
+ client.folder.index().then( folders => this.setState({ folders }) )
+ }
+ openFolder(folder) {
+ if (this.state.openFolders.indexOf(folder) === -1) {
+ this.setState({ openFolders: this.state.openFolders.concat([folder]) })
}
}
render() {
+ const openFolders = this.state.openFolders.map((folder) => {
+ return (
+ <Folder folder={folder} />
+ )
+ })
return (
<div>
<Header />
- <Folders />
+ <Folders folders={this.state.folders} openFolder={(folder) => this.openFolder(folder)} />
+ {openFolders}
</div>
)
}
}
export default withRouter(App)
-
diff --git a/client/components/Folder/Folder.jsx b/client/components/Folder/Folder.jsx
new file mode 100644
index 0000000..891451c
--- /dev/null
+++ b/client/components/Folder/Folder.jsx
@@ -0,0 +1,39 @@
+import { h, Component } from 'preact'
+import { Link } from 'react-router-dom'
+
+import Modal from '../Modal.jsx'
+
+import client from '../../client.js'
+
+export default class Folder extends Component {
+ constructor(props) {
+ super()
+ this.state = {
+ adding: false,
+ }
+ }
+ toggle(folder) {
+ folder.open = ! folder.open
+ if (folder.open && ! folder.files) {
+ client.files.index({ 'folder_id': folder.id }).then( files => {
+ this.props.openFolder(folder)
+ })
+ }
+ }
+ render() {
+ console.log(this.props)
+ const folders = (this.props.folders || []).map( (folder,i) => {
+ return (
+ <div key={i} onClick={() => this.toggle(folder)}>
+ {folder.name}
+ </div>
+ )
+ })
+ return (
+ <div class='folders'>
+ <b>{this.props.folder.name}</b> <button onClick={() => {}}>+ file</button>
+ {folders}
+ </div>
+ )
+ }
+}
diff --git a/client/components/Folders/FolderForm.jsx b/client/components/Folders/FolderForm.jsx
index 3a3c54e..6068400 100644
--- a/client/components/Folders/FolderForm.jsx
+++ b/client/components/Folders/FolderForm.jsx
@@ -23,23 +23,25 @@ export default class FolderForm extends Component {
}
handleSubmit(event) {
event.preventDefault()
- client.folders.create( this.state ).then( (data) => {
-
+ let rec = Object.assign({}, this.state)
+ delete rec.error
+ client.folder.create( rec ).then( (data) => {
+ console.log(data)
})
}
render() {
return (
- <div class='folderForm'>
+ <div class='form'>
+ <h1>Create a new folder</h1>
<div>
- <h1>Create a new folder</h1>
- <div>
- <label for='folders_folder_name'>Folder name</label>
- <input type='text' id='folders_folder_name' name='name' value={this.state.name} onChange={this.updateState} />
- </div>
- <div>
- <label></label>
- <button onClick={() => this.create()>Create</button>
- </div>
+ <label for='folders_folder_name'>Name</label>
+ <input type='text' id='folders_folder_name' name='name' value={this.state.name} onChange={this.updateState} />
+ <label for='folders_folder_description'>Description</label>
+ <textarea id='folders_folder_description' name='description' value={this.state.description} onChange={this.updateState} />
+ </div>
+ <div>
+ <label></label>
+ <button onClick={this.handleSubmit}>Create</button>
</div>
</div>
)
diff --git a/client/components/Folders/Folders.jsx b/client/components/Folders/Folders.jsx
index 7c27311..e5d5d76 100644
--- a/client/components/Folders/Folders.jsx
+++ b/client/components/Folders/Folders.jsx
@@ -4,6 +4,8 @@ import { Link } from 'react-router-dom'
import Modal from '../Modal.jsx'
import FolderForm from './FolderForm.jsx'
+import client from '../../client.js'
+
export default class Folders extends Component {
constructor(props) {
super()
@@ -17,10 +19,27 @@ export default class Folders extends Component {
closeModal() {
this.setState({ adding: false })
}
+ toggle(folder) {
+ folder.open = ! folder.open
+ if (folder.open && ! folder.files) {
+ client.file.index({ 'folder_id': folder.id }).then( files => {
+ this.props.openFolder(folder)
+ })
+ }
+ }
render() {
+ console.log(this.props)
+ const folders = (this.props.folders || []).map( (folder,i) => {
+ return (
+ <div key={i} onClick={() => this.toggle(folder)}>
+ {folder.name}
+ </div>
+ )
+ })
return (
<div class='folders'>
- <button onClick={() => this.openModal()}>+</button>
+ <b>folders</b> <button onClick={() => this.openModal()}>+ folder</button>
+ {folders}
<Modal visible={this.state.adding} onClose={() => this.closeModal()}>
<FolderForm />
</Modal>