소스 검색

Working on Tree component

Benoît Hubert 7 년 전
부모
커밋
7ecc19d8fd
1개의 변경된 파일118개의 추가작업 그리고 0개의 파일을 삭제
  1. 118 0
      react-admin/src/components/Home.js

+ 118 - 0
react-admin/src/components/Home.js

@@ -0,0 +1,118 @@
+import React from 'react';
+import ReactMarkdown from 'react-markdown';
+import { Link } from 'react-router-dom';
+import { intro } from '../resources/const';
+const markdown = require('../resources/markdown.json');
+
+const getHandleId = (() => {
+  let id = 0;
+  return () => ('handle-' + (++id));
+})();
+console.log(getHandleId(), getHandleId());
+
+function getSectionLinks() {
+  return (
+    <ul>
+    {markdown.map((section, sIndex) => (
+      <li key={sIndex}><Link to={section.path}>{section.title}</Link></li>
+    ))}
+    </ul>
+  );
+}
+
+const tutos = [
+  { name: 'JavaScript', items: [
+    { name: 'pouet', items: [
+      { name: 'pouet child', items: [] }
+    ] },
+    { name: 'popop', items: [] },
+    { name: 'douap', items: [] }
+  ] },
+  { name: 'jQuery', items: [] },
+  { name: 'AngularJS', items: [] },
+  { name: 'React', items: [] }
+];
+
+class Tree extends React.Component {
+  render() {
+    const { items } = this.props;
+    return (
+      <div>
+        <h2>X</h2>
+        {items.map(item =>
+          <TreeNode item={item} key={item.name} level={0} />
+        )}
+      </div>
+    );
+  }
+}
+
+/*
+ * get DOM ref    =>  https://reactjs.org/docs/refs-and-the-dom.html
+ * dnd w/ handle  =>  https://github.com/jdiamond/html5-examples/blob/master/drag-and-drop/drag-handle.html
+ */
+class TreeNode extends React.Component {
+  constructor(props) {
+    super(props);
+    this.onMouseDown = this.onMouseDown.bind(this);
+    this.onDragStart = this.onDragStart.bind(this);
+  }
+
+  onMouseDown(e) {
+    this.dragTarget = e.target;
+    console.log('onMouseDown', this.dragTarget);
+  }
+
+  onDragStart(e) {
+    // e.preventDefault();
+    e.stopPropagation();
+    console.log('onDragStart', this.props.item.name, this.draggable);
+    
+    const { draggable } = this;
+    var handle = draggable.getElementsByClassName('drag-handle')[0];
+    console.log(this.draggable, handle.id)
+    // draggable.onmousedown = function(e) {
+    //     target = e.target;
+    // };
+    // draggable.ondragstart = function(e) {
+        if (handle.contains(this.dragTarget)) {
+          console.log('transfer to handle')
+            e.dataTransfer.setData('text/plain', handle.id);
+        } else {
+          console.log('abord onDragStart')
+            e.preventDefault();
+        }
+    // };
+  }
+
+  render() {
+    const { name, items } = this.props.item;
+    const { level } = this.props;
+    const paddingLeft = (level * 15) + 'px';
+    return (
+      <div className="tree-node" style={{ paddingLeft }} onMouseDown={this.onMouseDown} onDragStart={this.onDragStart} ref={(div) => { this.draggable = div; }} draggable>
+        <h5><i id={ getHandleId() } className="material-icons drag-handle">drag_handle</i><span>{ name }</span></h5>
+        {items.map(item =>
+          <TreeNode item={item} key={item.name} level={level + 1} />
+        )}
+      </div>
+    );
+  }
+}
+
+class Home extends React.Component {
+  render() {
+    return (
+      <div className="page">
+        <div className="breadcrumb-wrapper">
+          <span className="breadcrumb light-blue-text"><i className="material-icons">home</i></span>
+          <span className="breadcrumb grey-text">Accueil</span>
+        </div>
+
+        <Tree items={tutos} />
+      </div>
+    );
+  }
+}
+
+export default Home;