diff options
Diffstat (limited to 'client')
| -rw-r--r-- | client/client.js | 61 | ||||
| -rw-r--r-- | client/components/App.jsx | 19 | ||||
| -rw-r--r-- | client/components/Folder/Folder.jsx | 39 | ||||
| -rw-r--r-- | client/components/Folders/FolderForm.jsx | 26 | ||||
| -rw-r--r-- | client/components/Folders/Folders.jsx | 21 |
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> |
