vademecum.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. 'use strict';
  2. const dom = React.createElement;
  3. const CONFIG = {
  4. "prof-a": {
  5. contactInformation: true,
  6. productFilter: products => products,
  7. prices: false,
  8. categories: [
  9. [ "Higiene", "higiene" ],
  10. [ "Máscaras", "mascaras" ],
  11. [ "Ácido Hialurónico", "acido-hialuronico" ],
  12. [ "Peeling", "peeling" ],
  13. [ "Corporales", "corporales" ],
  14. [ "Hombres", "hombres" ],
  15. [ "Protección Intensiva", "proteccion-intensiva" ],
  16. [ "Monodosis", "monodosis" ],
  17. [ "Activos Concentrados", "activos-concentrados" ],
  18. [ "Protección Solar", "proteccion-solar" ]
  19. ]
  20. },
  21. "prof-b": {
  22. contactInformation: false,
  23. productFilter: products => products,
  24. prices: false,
  25. categories: [
  26. [ "Higiene", "higiene" ],
  27. [ "Máscaras", "mascaras" ],
  28. [ "Ácido Hialurónico", "acido-hialuronico" ],
  29. [ "Peeling", "peeling" ],
  30. [ "Corporales", "corporales" ],
  31. [ "Hombres", "hombres" ],
  32. [ "Protección Intensiva", "proteccion-intensiva" ],
  33. [ "Monodosis", "monodosis" ],
  34. [ "Activos Concentrados", "activos-concentrados" ],
  35. [ "Protección Solar", "proteccion-solar" ]
  36. ]
  37. },
  38. "dom-a": {
  39. contactInformation: false,
  40. productFilter: products => products,
  41. prices: true,
  42. },
  43. "dom-a": {
  44. contactInformation: false,
  45. productFilter: products => products,
  46. prices: false,
  47. },
  48. };
  49. const Tag = (label, key, className) => (
  50. <div className={`chip ${className||''}`} key={key}>{label}</div>
  51. );
  52. const Section = (title, paragraph, prepend) => (
  53. <div className="section-container">
  54. <h4 className="section-name">
  55. { title }
  56. </h4>
  57. <p className="section-body" lang="es">
  58. { prepend }{ paragraph }
  59. </p>
  60. </div>
  61. );
  62. const Product = (product, key) => (
  63. <div className="product-container">
  64. <div className="row valign-wrapper">
  65. <div class="col s2">
  66. <img
  67. src={`images/_img/${product.img || product.variants[0].img}.png`}
  68. className="responsive-img"
  69. />
  70. </div>
  71. <div class="col s10">
  72. <h4 className="product-name">
  73. {product.name}
  74. </h4>
  75. <div className="product-body">
  76. <p className="product-short-desc" lang="es">
  77. {product.shortDesc}
  78. </p>
  79. </div>
  80. </div>
  81. </div>
  82. <div>
  83. {
  84. Section('Descripción', product.fullDesc)
  85. }
  86. {
  87. product.application && Section('Aplicación', product.application)
  88. }
  89. {
  90. product.actives &&
  91. Section(
  92. '',
  93. product.actives.map(p => Tag(p)),
  94. product.ph && Tag(`PH ${product.ph}`, null, 'is-ph')
  95. )
  96. }
  97. </div>
  98. <div className="divider"></div>
  99. </div>
  100. );
  101. const Category = (category, products, prices) => (
  102. <section id={category[TAG]} className="container">
  103. <h2 className="category-name">{category[LABEL]}</h2>
  104. <div className="collection">
  105. {
  106. products.map((p, i) => (
  107. <div className="collection-item">
  108. { Product(p, i) }
  109. </div>
  110. ))
  111. }
  112. </div>
  113. </section>
  114. );
  115. const ToC = (categories, products) => (
  116. <section id="eba-toc" className="container">
  117. <h2 className="pagebreak">Indice</h2>
  118. <div class="col s8">
  119. {
  120. categories.map((category, i) => (
  121. <div>
  122. <div>
  123. <a href={`#${category[TAG]}`}>
  124. <h5>{category[LABEL]} <i className="material-icons">chevron_right</i></h5>
  125. </a>
  126. </div>
  127. {
  128. products[category[LABEL]].map(product => (
  129. <div>
  130. { product.name }
  131. </div>
  132. ))
  133. }
  134. </div>
  135. ))
  136. }
  137. </div>
  138. </section>
  139. )
  140. const Vademecum = (categories, products, prices) => {
  141. return categories.map((categoryName, i) => (
  142. <div key={i}>
  143. {
  144. Category(categoryName, products[categoryName[LABEL]], prices)
  145. }
  146. </div>
  147. ))
  148. }
  149. const domContainer = document.querySelector('#vademecum');
  150. const LABEL = 0,
  151. TAG = 1;
  152. class VademecumData extends React.Component {
  153. constructor(props) {
  154. super(props);
  155. const config = CONFIG[process.env.MODE];
  156. this.state = {
  157. config: config,
  158. categories: config.categories,
  159. products: null,
  160. }
  161. }
  162. componentDidMount() {
  163. fetch('data/products-by-category.json')
  164. .then(response => response.json())
  165. .then(this.state.config.productFilter)
  166. .then(data => {
  167. this.setState({
  168. products: data,
  169. })
  170. })
  171. }
  172. render() {
  173. const { categories, products, config } = this.state;
  174. if (products) {
  175. return (
  176. <div>
  177. { ToC(categories, products) }
  178. { Vademecum(categories, products, config.prices) }
  179. </div>
  180. )
  181. } else {
  182. return (<div></div>);
  183. }
  184. }
  185. }
  186. ReactDOM.render(dom(VademecumData), domContainer);