Advertisement
Guest User

Untitled

a guest
Jun 27th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.62 KB | None | 0 0
  1. type Category implements Node {
  2. id: ID!
  3. name: String
  4. hasChildren: Boolean
  5. categories(before: String, after: String, first: Int, last: Int): CategoryConnection
  6. }
  7.  
  8. type CategoryConnection {
  9. edges: [CategoryEdge]
  10. pageInfo: PageInfo!
  11. }
  12.  
  13. type CategoryEdge {
  14. node: Category
  15. cursor: String!
  16. }
  17.  
  18. interface Node {
  19. id: ID!
  20. }
  21.  
  22. type PageInfo {
  23. hasNextPage: Boolean!
  24. hasPreviousPage: Boolean!
  25. startCursor: String
  26. endCursor: String
  27. }
  28.  
  29. type Query {
  30. category(id: ID!): Category
  31. node(id: ID!): Node
  32. }
  33.  
  34. import React from 'react';
  35. import Relay from 'react-relay';
  36.  
  37.  
  38. class CategoryRoute extends Relay.Route {
  39. static queries = {
  40. category: () => Relay.QL`
  41. query {
  42. category(id: $id)
  43. }
  44. `,
  45. };
  46.  
  47. static paramDefinitions = {
  48. id: { required: true },
  49. };
  50.  
  51. static routeName = 'CategoryRoute';
  52. }
  53.  
  54. class CategoryItemSubCategoryList extends React.Component {
  55. static propTypes = {
  56. currentLevel: React.PropTypes.number.isRequired,
  57. maxLevel: React.PropTypes.number,
  58. activeCats: React.PropTypes.array,
  59. elementSelectedCallback: React.PropTypes.func,
  60.  
  61. categories: React.PropTypes.object,
  62. };
  63.  
  64. render() {
  65. const currentLevel = this.props.currentLevel;
  66. const maxLevel = this.props.maxLevel;
  67. const elementSelectedCallback = this.props.elementSelectedCallback;
  68.  
  69. return (
  70. <ul className="dropdown-menu" aria-labelledby="dLabel">
  71. {this.props.categories.map(({ node }) => (
  72. currentLevel < maxLevel && node.hasChildren ?
  73. <li><CategoryItemContainer key={node.id}
  74. category={node}
  75. maxLevel={maxLevel}
  76. currentLevel={currentLevel + 1}
  77. activeCats={this.props.activeCats}
  78. elementSelectedCallback={elementSelectedCallback}/></li> :
  79. <li>{elementSelectedCallback ?
  80. <a onClick={elementSelectedCallback.bind(this, node.id)}>{node.name}</a> :
  81. <a href={`search?c=${node.id}`}>{node.name}</a>
  82. }</li>
  83. ))}
  84. </ul>
  85. );
  86. }
  87. }
  88.  
  89. const CategoryItemSubcategoryListContainer = Relay.createContainer(CategoryItemSubCategoryList, {
  90. fragments: {
  91. categories: () => Relay.QL`
  92. fragment on Category {
  93. categories(first: 10000) {
  94. edges {
  95. node {
  96. ${CategoryItemContainer.getFragment('category')}
  97. }
  98. }
  99. }
  100. }
  101. `,
  102. },
  103. });
  104.  
  105. class CategoryItem extends React.Component {
  106. static propTypes = {
  107. category: React.PropTypes.object.isRequired,
  108. currentLevel: React.PropTypes.number.isRequired,
  109. maxLevel: React.PropTypes.number,
  110. activeCats: React.PropTypes.array,
  111. elementSelectedCallback: React.PropTypes.func,
  112.  
  113. relay: React.PropTypes.object,
  114. };
  115.  
  116. static getDefaultProps = {
  117. maxLevel: 100,
  118. activeCats: [],
  119. };
  120.  
  121. render() {
  122. const category = this.props.category;
  123. const currentLevel = this.props.currentLevel;
  124. const maxLevel = this.props.maxLevel;
  125. const elementSelectedCallback = this.props.elementSelectedCallback;
  126.  
  127. return (
  128. <div className="list-group-item" onMouseOver={this.openCategory.bind(this)}>
  129. {elementSelectedCallback ?
  130. <a onClick={elementSelectedCallback.bind(this, category.id)}>{category.name}
  131. {currentLevel < maxLevel && category.hasChildren ?
  132. <span className="glyphicon glyphicon-menu-right" aria-hidden="true"></span> : ''}</a> :
  133. <a href={`search?c=${category.id}`}>{category.name}
  134. {currentLevel < maxLevel && category.hasChildren ?
  135. <span className="glyphicon glyphicon-menu-right" aria-hidden="true"></span> : ''}</a>
  136. }
  137.  
  138. {/* Выводим список подкатегорий */}
  139. {currentLevel < maxLevel && category.hasChildren && this.props.relay.variables.expanded &&
  140. <CategoryItemSubcategoryListContainer key={category.id}
  141. categories={category.categories}
  142. currentLevel={currentLevel}/>
  143. }
  144. </div>
  145. );
  146. }
  147.  
  148. openCategory() {
  149. this.props.relay.setVariables({ expanded: true });
  150. }
  151. }
  152.  
  153. const CategoryItemContainer = Relay.createContainer(CategoryItem, {
  154. initialVariables: {
  155. expanded: false,
  156. },
  157.  
  158. fragments: {
  159. category: (variables) => Relay.QL`
  160. fragment on Category {
  161. id
  162. name
  163. hasChildren
  164.  
  165. ${CategoryItemSubcategoryListContainer.getFragment('categories').if(variables.expanded)}
  166. }
  167. `,
  168. },
  169. });
  170.  
  171. export default class Classifier extends React.Component {
  172. static propTypes = {
  173. rootCategoryId: React.PropTypes.string.isRequired,
  174. maxLevel: React.PropTypes.number,
  175. title: React.PropTypes.string,
  176. activeCats: React.PropTypes.array,
  177. elementSelectedCallback: React.PropTypes.func,
  178. };
  179.  
  180. render() {
  181. return (
  182. <Relay.RootContainer
  183. Component={CategoryItemContainer}
  184. route={new CategoryRoute({ id: this.props.rootCategoryId })}
  185. renderFetched={(data) => <CategoryItemContainer {...data}
  186. currentLevel={0}
  187. maxLevel={this.props.maxLevel}
  188. title={this.props.title}
  189. activeCats={this.props.activeCats}
  190. elementSelectedCallback={this.props.elementSelectedCallback}/>}
  191. />
  192. );
  193. }
  194. }
  195.  
  196. query Classifier($id_0:ID!) {
  197. category(id:$id_0) {
  198. id,
  199. ...F0
  200. }
  201. }
  202. fragment F0 on Category {
  203. id,
  204. name,
  205. hasChildren
  206. }
  207.  
  208. query Classifier_CategoryRelayQL($id_0:ID!) {
  209. node(id:$id_0) {
  210. ...F2
  211. }
  212. }
  213. fragment F0 on Category {
  214. id,
  215. name,
  216. hasChildren
  217. }
  218. fragment F1 on Category {
  219. _categories2slDfj:categories(first:10000) {
  220. edges {
  221. node {
  222. id,
  223. ...F0
  224. },
  225. cursor
  226. },
  227. pageInfo {
  228. hasNextPage,
  229. hasPreviousPage
  230. }
  231. },
  232. id
  233. }
  234. fragment F2 on Category {
  235. id,
  236. ...F1
  237. }
  238.  
  239. {
  240. "data": {
  241. "node": {
  242. "id": "101510000566",
  243. "_categories2slDfj": {
  244. "edges": [
  245. {
  246. "node": {
  247. "id": "101510000170",
  248. "name": "Оружие",
  249. "hasChildren": false
  250. },
  251. "cursor": "c2ltcGxlLWN1cnNvcjA="
  252. },
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement