vademecum.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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. console.log(process.env.MODE, CONFIG[process.env.MODE]);
  50. const Tag = (label, key, className) => (
  51. <span className={`tag ${className||''}`} key={key}>{label}</span>
  52. );
  53. const Section = (title, paragraph, prepend) => (
  54. <div className="section-container">
  55. <h4 className="section-name">
  56. { title }
  57. </h4>
  58. <p className="section-body">
  59. { prepend }{ paragraph }
  60. </p>
  61. </div>
  62. );
  63. const Product = (product, key) => (
  64. <div className="product-container">
  65. <h3 className="product-name">
  66. {product.name}
  67. </h3>
  68. <div className="product-body">
  69. <p className="product-short-desc">
  70. {product.shortDesc}
  71. </p>
  72. {
  73. Section('Descripción', product.fullDesc)
  74. }
  75. {
  76. product.application && Section('Aplicación', product.application)
  77. }
  78. {
  79. product.actives &&
  80. Section(
  81. 'Activos',
  82. product.actives.join(', '),
  83. product.ph && Tag(`PH ${product.ph}`, null, 'is-ph')
  84. )
  85. }
  86. </div>
  87. </div>
  88. );
  89. const Category = (category, products) => (
  90. <table className="category-container table is-fullwidth">
  91. <thead className="category" id={category[TAG]}>
  92. <tr>
  93. <th>
  94. <h2 className="category-name">{category[LABEL]}</h2>
  95. </th>
  96. </tr>
  97. </thead>
  98. <tbody>
  99. {
  100. products.map((p, i) => (
  101. <tr><td>
  102. { Product(p, i) }
  103. </td></tr>
  104. ))
  105. }
  106. </tbody>
  107. <tfoot><tr><td>
  108. <div class="footer-space" height="20px">&nbsp;</div>
  109. </td></tr></tfoot>
  110. </table>
  111. );
  112. const ToC = (categories, products) => (
  113. <table className='toc-table table is-fullwidth'>
  114. <thead>
  115. <tr><th><h2>Indice</h2></th></tr>
  116. </thead>
  117. <tbody>
  118. {
  119. categories.map((category, i) => (
  120. <tr><td>
  121. <div className='toc-section'>
  122. <div>
  123. <a href={`#${category[TAG]}`} className='toc-title'>{category[LABEL]}
  124. <img src="images/arrow.png" className="toc-goto"/>
  125. </a>
  126. </div>
  127. {
  128. products[category[LABEL]].map(product => (
  129. <div className='toc-content'>
  130. { product.name }
  131. </div>
  132. ))
  133. }
  134. </div>
  135. </td></tr>
  136. ))
  137. }
  138. </tbody>
  139. </table>
  140. )
  141. const Vademecum = (categories, products, prices) => {
  142. console.log(prices);
  143. return categories.map((categoryName, i) => (
  144. <div key={i}>
  145. {
  146. Category(categoryName, products[categoryName[LABEL]])
  147. }
  148. </div>
  149. ))
  150. }
  151. const domContainer = document.querySelector('#vademecum');
  152. const LABEL = 0,
  153. TAG = 1;
  154. class VademecumData extends React.Component {
  155. constructor(props) {
  156. super(props);
  157. const config = CONFIG[process.env.MODE];
  158. this.state = {
  159. config: config,
  160. categories: config.categories,
  161. products: null,
  162. }
  163. }
  164. componentDidMount() {
  165. fetch('data/products-by-category.json')
  166. .then(response => response.json())
  167. .then(this.state.config.productFilter)
  168. .then(data => {
  169. this.setState({
  170. products: data,
  171. })
  172. })
  173. }
  174. render() {
  175. const { categories, products, config } = this.state;
  176. if (products) {
  177. return (
  178. <div>
  179. { ToC(categories, products) }
  180. { Vademecum(categories, products, config.prices) }
  181. </div>
  182. )
  183. } else {
  184. return (<div></div>);
  185. }
  186. }
  187. }
  188. ReactDOM.render(dom(VademecumData), domContainer);