hippo-fw 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (535) hide show
  1. checksums.yaml +7 -0
  2. data/.dir-locals.el +8 -0
  3. data/.eslintrc.js +7 -0
  4. data/.flowconfig +2 -0
  5. data/.gitignore +22 -0
  6. data/.jshintrc +3 -0
  7. data/.rubocop.yml +9 -0
  8. data/.ruby-version +1 -0
  9. data/.travis.yml +24 -0
  10. data/Gemfile +17 -0
  11. data/Guardfile +19 -0
  12. data/LICENSE-MIT.txt +21 -0
  13. data/README.md +36 -0
  14. data/Rakefile +39 -0
  15. data/bin/hippo +5 -0
  16. data/client/extension.js +0 -0
  17. data/client/hippo/__mocks__/config.js +17 -0
  18. data/client/hippo/access/index.js +4 -0
  19. data/client/hippo/access/login-dialog.jsx +38 -0
  20. data/client/hippo/access/styles.scss +0 -0
  21. data/client/hippo/boot.jsx +41 -0
  22. data/client/hippo/components/asset.jsx +81 -0
  23. data/client/hippo/components/asset.scss +15 -0
  24. data/client/hippo/components/calendar/Calendar.jsx +25 -0
  25. data/client/hippo/components/calendar/index.js +3 -0
  26. data/client/hippo/components/calendar/styles.scss +3 -0
  27. data/client/hippo/components/data-list.jsx +105 -0
  28. data/client/hippo/components/data-table.jsx +243 -0
  29. data/client/hippo/components/data-table/header-cell.jsx +94 -0
  30. data/client/hippo/components/data-table/table-styles.scss +34 -0
  31. data/client/hippo/components/enabled.js.erb +5 -0
  32. data/client/hippo/components/field-validation.js +7 -0
  33. data/client/hippo/components/form.jsx +65 -0
  34. data/client/hippo/components/form/field-prop-type.js +16 -0
  35. data/client/hippo/components/form/fields.jsx +76 -0
  36. data/client/hippo/components/form/fields/checkbox-wrapper.jsx +21 -0
  37. data/client/hippo/components/form/fields/date-wrapper.jsx +49 -0
  38. data/client/hippo/components/form/fields/form-field.scss +4 -0
  39. data/client/hippo/components/form/fields/select-wrapper.jsx +31 -0
  40. data/client/hippo/components/form/fields/text-wrapper.jsx +20 -0
  41. data/client/hippo/components/form/model.js +95 -0
  42. data/client/hippo/components/form/validations.js +0 -0
  43. data/client/hippo/components/form/wrapper.jsx +40 -0
  44. data/client/hippo/components/grid/config.json +3 -0
  45. data/client/hippo/components/grid/editors.scss +78 -0
  46. data/client/hippo/components/grid/index.js +2 -0
  47. data/client/hippo/components/grid/row-editor.scss +74 -0
  48. data/client/hippo/components/grid/styles.scss +118 -0
  49. data/client/hippo/components/icon.jsx +70 -0
  50. data/client/hippo/components/index.js +3 -0
  51. data/client/hippo/components/modal/index.js +1 -0
  52. data/client/hippo/components/modal/styles.scss +12 -0
  53. data/client/hippo/components/network-activity-overlay.jsx +127 -0
  54. data/client/hippo/components/network-activity-overlay.scss +52 -0
  55. data/client/hippo/components/query-builder.jsx +157 -0
  56. data/client/hippo/components/record-finder.jsx +95 -0
  57. data/client/hippo/components/record-finder/config.json +3 -0
  58. data/client/hippo/components/record-finder/query-layer.jsx +74 -0
  59. data/client/hippo/components/record-finder/record-finder.scss +12 -0
  60. data/client/hippo/components/request-spinner/index.js +1 -0
  61. data/client/hippo/components/screen.jsx +34 -0
  62. data/client/hippo/components/select-field/index.js +2 -0
  63. data/client/hippo/components/select-field/styles.scss +27 -0
  64. data/client/hippo/components/shared/AssetsListing.jsx +23 -0
  65. data/client/hippo/components/shared/Checkbox.jsx +49 -0
  66. data/client/hippo/components/shared/CountBadge.jsx +13 -0
  67. data/client/hippo/components/shared/DateTime.jsx +58 -0
  68. data/client/hippo/components/shared/DisplayValue.jsx +15 -0
  69. data/client/hippo/components/shared/ErrorDisplay.jsx +37 -0
  70. data/client/hippo/components/shared/FieldMixin.jsx +254 -0
  71. data/client/hippo/components/shared/FieldSet.jsx +52 -0
  72. data/client/hippo/components/shared/FieldWrapper.jsx +94 -0
  73. data/client/hippo/components/shared/FormGroup.jsx +41 -0
  74. data/client/hippo/components/shared/GenericField.jsx +7 -0
  75. data/client/hippo/components/shared/IconButton.jsx +13 -0
  76. data/client/hippo/components/shared/ImageAsset.jsx +78 -0
  77. data/client/hippo/components/shared/IndeterminateCheckbox.jsx +31 -0
  78. data/client/hippo/components/shared/Input.jsx +16 -0
  79. data/client/hippo/components/shared/InputFieldMixin.jsx +78 -0
  80. data/client/hippo/components/shared/JobProgress.jsx +46 -0
  81. data/client/hippo/components/shared/NumberInput.jsx +37 -0
  82. data/client/hippo/components/shared/PanelHeader.jsx +15 -0
  83. data/client/hippo/components/shared/RadioField.jsx +33 -0
  84. data/client/hippo/components/shared/ResizeSensor.jsx +18 -0
  85. data/client/hippo/components/shared/ScreenWrapper.jsx +17 -0
  86. data/client/hippo/components/shared/TextArea.jsx +19 -0
  87. data/client/hippo/components/shared/Throbber.jsx +8 -0
  88. data/client/hippo/components/shared/ToggleField.jsx +2 -0
  89. data/client/hippo/components/shared/Tooltip.jsx +23 -0
  90. data/client/hippo/components/shared/fields.scss +58 -0
  91. data/client/hippo/components/shared/fieldset.scss +27 -0
  92. data/client/hippo/components/shared/image-asset.scss +53 -0
  93. data/client/hippo/components/shared/index.js +5 -0
  94. data/client/hippo/components/shared/overlay.scss +83 -0
  95. data/client/hippo/components/shared/resize-sensor.scss +30 -0
  96. data/client/hippo/components/shared/styles.scss +64 -0
  97. data/client/hippo/components/shared/throbber.scss +53 -0
  98. data/client/hippo/components/toolbar/changes-notification.scss +63 -0
  99. data/client/hippo/components/toolbar/index.js +3 -0
  100. data/client/hippo/components/toolbar/styles.scss +74 -0
  101. data/client/hippo/components/warning-notification.jsx +14 -0
  102. data/client/hippo/config.js +72 -0
  103. data/client/hippo/extensions/EarlyExtensions.js.erb +3 -0
  104. data/client/hippo/extensions/LateLoaded.js.erb +4 -0
  105. data/client/hippo/extensions/base.js +23 -0
  106. data/client/hippo/extensions/hippo.js +11 -0
  107. data/client/hippo/extensions/index.js +47 -0
  108. data/client/hippo/extensions/namespace-available.js.erb +3 -0
  109. data/client/hippo/fonts/fontawesome-webfont.woff +0 -0
  110. data/client/hippo/fonts/fontawesome-webfont.woff2 +0 -0
  111. data/client/hippo/index.js +1 -0
  112. data/client/hippo/index.scss.erb +31 -0
  113. data/client/hippo/lib/__mocks__/loader.js +11 -0
  114. data/client/hippo/lib/__mocks__/request-assets.js +6 -0
  115. data/client/hippo/lib/all.js +14 -0
  116. data/client/hippo/lib/bootstrap.js +45 -0
  117. data/client/hippo/lib/index.js.erb +6 -0
  118. data/client/hippo/lib/loader.js +67 -0
  119. data/client/hippo/lib/request-assets.js +38 -0
  120. data/client/hippo/lib/smooth-scroll.js +68 -0
  121. data/client/hippo/lib/util.js +101 -0
  122. data/client/hippo/models/PubSub.js +208 -0
  123. data/client/hippo/models/__mocks__/sync.js +17 -0
  124. data/client/hippo/models/asset.js +104 -0
  125. data/client/hippo/models/base.js +142 -0
  126. data/client/hippo/models/collection.js +58 -0
  127. data/client/hippo/models/decorators.js +72 -0
  128. data/client/hippo/models/index.js +10 -0
  129. data/client/hippo/models/query.js +116 -0
  130. data/client/hippo/models/query/array-result.js +188 -0
  131. data/client/hippo/models/query/clause.js +52 -0
  132. data/client/hippo/models/query/field.js +63 -0
  133. data/client/hippo/models/query/info.js +43 -0
  134. data/client/hippo/models/query/operator.js +21 -0
  135. data/client/hippo/models/query/result.js +21 -0
  136. data/client/hippo/models/query/types.js +5 -0
  137. data/client/hippo/models/sync.js +135 -0
  138. data/client/hippo/models/system-setting.js +26 -0
  139. data/client/hippo/react/DefaultComponentNotFound.jsx +23 -0
  140. data/client/hippo/react/Root.jsx +24 -0
  141. data/client/hippo/react/index.js +7 -0
  142. data/client/hippo/react/viewport-root.jsx +44 -0
  143. data/client/hippo/screens/all.js.erb +3 -0
  144. data/client/hippo/screens/definition.js +67 -0
  145. data/client/hippo/screens/group.js +35 -0
  146. data/client/hippo/screens/index.js +34 -0
  147. data/client/hippo/screens/instance.js +99 -0
  148. data/client/hippo/screens/mixins/index.js +0 -0
  149. data/client/hippo/screens/register.js.erb +14 -0
  150. data/client/hippo/screens/styles.scss +8 -0
  151. data/client/hippo/screens/system-settings.jsx +92 -0
  152. data/client/hippo/screens/system-settings/mailer-config.jsx +53 -0
  153. data/client/hippo/screens/system-settings/system-settings.scss +8 -0
  154. data/client/hippo/screens/user-management.jsx +67 -0
  155. data/client/hippo/screens/user-management/edit-form.jsx +94 -0
  156. data/client/hippo/screens/user-management/index.scss +7 -0
  157. data/client/hippo/styles/fonts.scss +23 -0
  158. data/client/hippo/styles/fonts/_animated.scss +34 -0
  159. data/client/hippo/styles/fonts/_bordered-pulled.scss +25 -0
  160. data/client/hippo/styles/fonts/_core.scss +12 -0
  161. data/client/hippo/styles/fonts/_fixed-width.scss +6 -0
  162. data/client/hippo/styles/fonts/_icons.scss +789 -0
  163. data/client/hippo/styles/fonts/_larger.scss +13 -0
  164. data/client/hippo/styles/fonts/_list.scss +19 -0
  165. data/client/hippo/styles/fonts/_mixins.scss +60 -0
  166. data/client/hippo/styles/fonts/_path.scss +10 -0
  167. data/client/hippo/styles/fonts/_rotated-flipped.scss +20 -0
  168. data/client/hippo/styles/fonts/_screen-reader.scss +5 -0
  169. data/client/hippo/styles/fonts/_stacked.scss +20 -0
  170. data/client/hippo/styles/fonts/_variables.scss +800 -0
  171. data/client/hippo/styles/fonts/font-awesome.scss +18 -0
  172. data/client/hippo/styles/fonts/index.scss +2 -0
  173. data/client/hippo/styles/global.scss +3 -0
  174. data/client/hippo/styles/global/fancy-header.scss +14 -0
  175. data/client/hippo/styles/global/mixins.scss +5 -0
  176. data/client/hippo/styles/global/styles.scss +6 -0
  177. data/client/hippo/styles/variables.scss +28 -0
  178. data/client/hippo/testing/index.js +6 -0
  179. data/client/hippo/testing/matchers.js +14 -0
  180. data/client/hippo/testing/mocks/fetch.js +54 -0
  181. data/client/hippo/testing/screens.js +64 -0
  182. data/client/hippo/testing/utils.js +1 -0
  183. data/client/hippo/user.js +93 -0
  184. data/client/hippo/workspace/content.jsx +22 -0
  185. data/client/hippo/workspace/foo.js +0 -0
  186. data/client/hippo/workspace/index.jsx +85 -0
  187. data/client/hippo/workspace/menu-group.jsx +39 -0
  188. data/client/hippo/workspace/menu-option.jsx +41 -0
  189. data/client/hippo/workspace/menu.jsx +71 -0
  190. data/client/hippo/workspace/navbar.jsx +46 -0
  191. data/client/hippo/workspace/screen.jsx +50 -0
  192. data/client/hippo/workspace/styles.scss +61 -0
  193. data/client/hippo/workspace/styles/forms.scss +4 -0
  194. data/client/hippo/workspace/styles/header.scss +69 -0
  195. data/client/hippo/workspace/styles/keybindings.scss +6 -0
  196. data/client/hippo/workspace/styles/layout.scss +230 -0
  197. data/client/hippo/workspace/styles/screens.scss +15 -0
  198. data/client/hippo/workspace/styles/tabs.scss +141 -0
  199. data/client/hippo/workspace/tabs.jsx +60 -0
  200. data/client/hippo/workspace/viewport.jsx +82 -0
  201. data/client/images/hippo/ajax-loader.gif +0 -0
  202. data/client/images/hippo/logo-sm.png +0 -0
  203. data/coffeelint.json +49 -0
  204. data/command-reference-files/initial/.babelrc +20 -0
  205. data/command-reference-files/initial/.eslintrc.js +7 -0
  206. data/command-reference-files/initial/.gitignore +4 -0
  207. data/command-reference-files/initial/.rubocop.yml +9 -0
  208. data/command-reference-files/initial/Gemfile +9 -0
  209. data/command-reference-files/initial/Guardfile +13 -0
  210. data/command-reference-files/initial/Rakefile +2 -0
  211. data/command-reference-files/initial/client/appy-app/components/.gitkeep +0 -0
  212. data/command-reference-files/initial/client/appy-app/extension.js +32 -0
  213. data/command-reference-files/initial/client/appy-app/index.js +6 -0
  214. data/command-reference-files/initial/client/appy-app/models/.gitkeep +0 -0
  215. data/command-reference-files/initial/client/appy-app/models/base.js +11 -0
  216. data/command-reference-files/initial/client/appy-app/screens/.gitkeep +0 -0
  217. data/command-reference-files/initial/client/appy-app/styles.scss +1 -0
  218. data/command-reference-files/initial/config.ru +7 -0
  219. data/command-reference-files/initial/config/database.yml +11 -0
  220. data/command-reference-files/initial/config/initialize.rb +10 -0
  221. data/command-reference-files/initial/config/jest.config.json +19 -0
  222. data/command-reference-files/initial/config/jest/babel-transform.js +47 -0
  223. data/command-reference-files/initial/config/routes.rb +4 -0
  224. data/command-reference-files/initial/config/screens.rb +10 -0
  225. data/command-reference-files/initial/config/webpack.config.js +106 -0
  226. data/command-reference-files/initial/db/.gitkeep +0 -0
  227. data/command-reference-files/initial/lib/appy-app.rb +15 -0
  228. data/command-reference-files/initial/lib/appy-app/extension.rb +22 -0
  229. data/command-reference-files/initial/lib/appy-app/model.rb +11 -0
  230. data/command-reference-files/initial/lib/appy-app/version.rb +3 -0
  231. data/command-reference-files/initial/package.json +6 -0
  232. data/command-reference-files/initial/spec/client/.eslintrc.js +20 -0
  233. data/command-reference-files/initial/spec/client/setup.js +17 -0
  234. data/command-reference-files/initial/spec/server/spec_helper.rb +8 -0
  235. data/command-reference-files/initial/views/index.html +69 -0
  236. data/command-reference-files/model/client/appy-app/models/test_test.js +12 -0
  237. data/command-reference-files/model/config/routes.rb +4 -0
  238. data/command-reference-files/model/db/migrate/20150218032025_create_test_tests.rb +10 -0
  239. data/command-reference-files/model/lib/appy-app/model.rb +12 -0
  240. data/command-reference-files/model/lib/appy-app/models/test_test.rb +7 -0
  241. data/command-reference-files/model/spec/client/models/test_test.spec.js +8 -0
  242. data/command-reference-files/model/spec/fixtures/appy-app/test_test.yml +11 -0
  243. data/command-reference-files/model/spec/server/test_test_spec.rb +10 -0
  244. data/command-reference-files/screen/client/appy-app/extension.js +32 -0
  245. data/command-reference-files/screen/client/appy-app/screens/ready-set-go.jsx +22 -0
  246. data/command-reference-files/screen/config/screens.rb +19 -0
  247. data/command-reference-files/screen/spec/client/screens/ready-set-go.spec.jsx +12 -0
  248. data/config.ru +5 -0
  249. data/config/database.yml +9 -0
  250. data/config/jest.config.json +27 -0
  251. data/config/jest/babel-transform.js +47 -0
  252. data/config/jest/style-mock.js +2 -0
  253. data/config/jest/yaml-transform.js +19 -0
  254. data/config/routes.rb +28 -0
  255. data/config/screens.rb +42 -0
  256. data/config/webpack.config.js +105 -0
  257. data/db/migrate/01_create_system_settings.rb +10 -0
  258. data/db/migrate/02_create_assets.rb +13 -0
  259. data/db/migrate/20140615031600_create_users.rb +12 -0
  260. data/db/seed.rb +1 -0
  261. data/docs/command.md +114 -0
  262. data/docs/model.md +217 -0
  263. data/docs/react.md +137 -0
  264. data/docs/todo-example-part-1.md +69 -0
  265. data/docs/welcome.md +0 -0
  266. data/hippo-fw.gemspec +79 -0
  267. data/lib/generators/hippo/migrations/install_generator.rb +42 -0
  268. data/lib/hippo-fw.rb +1 -0
  269. data/lib/hippo.rb +34 -0
  270. data/lib/hippo/access.rb +49 -0
  271. data/lib/hippo/access/authentication_provider.rb +79 -0
  272. data/lib/hippo/access/config/database.yml +9 -0
  273. data/lib/hippo/access/config/routes.rb +20 -0
  274. data/lib/hippo/access/locked_fields.rb +43 -0
  275. data/lib/hippo/access/public/files/1nty/7ebo/n7k0/8b2ac0bbd97f401951fe40546f977200.png +0 -0
  276. data/lib/hippo/access/public/files/6hgp/eiw1/8dua/ba944287e36e101713a9c1ad793353b8.png +0 -0
  277. data/lib/hippo/access/public/files/94bd/9agc/2ua3/33800e285d7145760650ac88d1c558fb.png +0 -0
  278. data/lib/hippo/access/public/files/cr1e/vfwc/fvrh/0e7fe6ef12d622bfb93e024883c2f81c.png +0 -0
  279. data/lib/hippo/access/public/files/kezo/fm8j/u6xl/dfc47658aedd8e546abff63366a7285d.png +0 -0
  280. data/lib/hippo/access/public/files/n5c4/uovf/jec6/7ee9a3519e2b60430e095160a23f1d77.png +0 -0
  281. data/lib/hippo/access/role.rb +86 -0
  282. data/lib/hippo/access/role_collection.rb +88 -0
  283. data/lib/hippo/access/roles/administrator.rb +32 -0
  284. data/lib/hippo/access/roles/basic_user.rb +13 -0
  285. data/lib/hippo/access/roles/support.rb +15 -0
  286. data/lib/hippo/access/test_fixture_extensions.rb +16 -0
  287. data/lib/hippo/access/track_modifications.rb +79 -0
  288. data/lib/hippo/access/version.rb +5 -0
  289. data/lib/hippo/api.rb +23 -0
  290. data/lib/hippo/api/cable.rb +57 -0
  291. data/lib/hippo/api/controller_base.rb +299 -0
  292. data/lib/hippo/api/default_routes.rb +38 -0
  293. data/lib/hippo/api/error_formatter.rb +37 -0
  294. data/lib/hippo/api/formatted_reply.rb +62 -0
  295. data/lib/hippo/api/generic_controller.rb +35 -0
  296. data/lib/hippo/api/handlers/asset.rb +38 -0
  297. data/lib/hippo/api/handlers/print.rb +15 -0
  298. data/lib/hippo/api/handlers/user_session.rb +42 -0
  299. data/lib/hippo/api/helper_methods.rb +58 -0
  300. data/lib/hippo/api/pub_sub.rb +36 -0
  301. data/lib/hippo/api/request_wrapper.rb +105 -0
  302. data/lib/hippo/api/root.rb +70 -0
  303. data/lib/hippo/api/routing.rb +111 -0
  304. data/lib/hippo/api/sprockets_extension.rb +105 -0
  305. data/lib/hippo/api/to_json.rb +7 -0
  306. data/lib/hippo/api/updates.rb +37 -0
  307. data/lib/hippo/asset.rb +18 -0
  308. data/lib/hippo/capistrano.rb +30 -0
  309. data/lib/hippo/cli.rb +50 -0
  310. data/lib/hippo/command.rb +43 -0
  311. data/lib/hippo/command/app.rb +90 -0
  312. data/lib/hippo/command/client_config.rb +69 -0
  313. data/lib/hippo/command/client_model_update.rb +65 -0
  314. data/lib/hippo/command/console.rb +23 -0
  315. data/lib/hippo/command/db.rb +36 -0
  316. data/lib/hippo/command/db.usage +1 -0
  317. data/lib/hippo/command/generate.rb +24 -0
  318. data/lib/hippo/command/generate_component.rb +28 -0
  319. data/lib/hippo/command/generate_component.usage +11 -0
  320. data/lib/hippo/command/generate_migration.rb +33 -0
  321. data/lib/hippo/command/generate_model.rb +91 -0
  322. data/lib/hippo/command/generate_model.usage +45 -0
  323. data/lib/hippo/command/generate_screen.rb +40 -0
  324. data/lib/hippo/command/generate_screen.usage +8 -0
  325. data/lib/hippo/command/guard.rb +18 -0
  326. data/lib/hippo/command/jest.rb +40 -0
  327. data/lib/hippo/command/migration_support.rb +29 -0
  328. data/lib/hippo/command/model_attribute.rb +193 -0
  329. data/lib/hippo/command/named_command.rb +33 -0
  330. data/lib/hippo/command/puma.rb +56 -0
  331. data/lib/hippo/command/server.rb +19 -0
  332. data/lib/hippo/command/server.usage +3 -0
  333. data/lib/hippo/command/update.rb +13 -0
  334. data/lib/hippo/command/update_model.rb +127 -0
  335. data/lib/hippo/command/update_model.usage +2 -0
  336. data/lib/hippo/command/webpack.rb +57 -0
  337. data/lib/hippo/command/webpack_view.rb +32 -0
  338. data/lib/hippo/concerns/all.rb +15 -0
  339. data/lib/hippo/concerns/api_path.rb +21 -0
  340. data/lib/hippo/concerns/asset_uploader.rb +38 -0
  341. data/lib/hippo/concerns/association_extensions.rb +94 -0
  342. data/lib/hippo/concerns/attr_accessor_with_default.rb +68 -0
  343. data/lib/hippo/concerns/code_identifier.rb +43 -0
  344. data/lib/hippo/concerns/export_associations.rb +52 -0
  345. data/lib/hippo/concerns/export_join_tables.rb +39 -0
  346. data/lib/hippo/concerns/export_methods.rb +104 -0
  347. data/lib/hippo/concerns/export_scope.rb +64 -0
  348. data/lib/hippo/concerns/exported_limit_evaluator.rb +17 -0
  349. data/lib/hippo/concerns/pub_sub.rb +127 -0
  350. data/lib/hippo/concerns/queries.rb +24 -0
  351. data/lib/hippo/concerns/random_identifier.rb +37 -0
  352. data/lib/hippo/concerns/sanitize_fields.rb +32 -0
  353. data/lib/hippo/concerns/set_attribute_data.rb +125 -0
  354. data/lib/hippo/concerns/sorting_expressions.rb +34 -0
  355. data/lib/hippo/configuration.rb +143 -0
  356. data/lib/hippo/db.rb +57 -0
  357. data/lib/hippo/db/migrations.rb +32 -0
  358. data/lib/hippo/environment.rb +22 -0
  359. data/lib/hippo/extension.rb +112 -0
  360. data/lib/hippo/extension/definition.rb +90 -0
  361. data/lib/hippo/guard_tasks.rb +62 -0
  362. data/lib/hippo/hippo_guard_plugin.rb +80 -0
  363. data/lib/hippo/job.rb +82 -0
  364. data/lib/hippo/job/failure_logger.rb +33 -0
  365. data/lib/hippo/logger.rb +64 -0
  366. data/lib/hippo/mailer.rb +28 -0
  367. data/lib/hippo/model.rb +24 -0
  368. data/lib/hippo/multi_server_boot.rb +26 -0
  369. data/lib/hippo/numbers.rb +72 -0
  370. data/lib/hippo/rails_engine.rb +5 -0
  371. data/lib/hippo/rake_tasks.rb +69 -0
  372. data/lib/hippo/redis.rb +13 -0
  373. data/lib/hippo/reloadable_sinatra.rb +24 -0
  374. data/lib/hippo/reloadable_view.rb +13 -0
  375. data/lib/hippo/screen.rb +152 -0
  376. data/lib/hippo/spec_helper.rb +141 -0
  377. data/lib/hippo/strings.rb +56 -0
  378. data/lib/hippo/system_settings.rb +72 -0
  379. data/lib/hippo/templates/base.rb +44 -0
  380. data/lib/hippo/templates/latex.rb +101 -0
  381. data/lib/hippo/templates/liquid.rb +28 -0
  382. data/lib/hippo/user.rb +152 -0
  383. data/lib/hippo/validators/all.rb +2 -0
  384. data/lib/hippo/validators/email.rb +17 -0
  385. data/lib/hippo/validators/set.rb +18 -0
  386. data/lib/hippo/version.rb +5 -0
  387. data/lib/hippo/workspace.rb +4 -0
  388. data/lib/hippo/workspace/config/screens.rb +6 -0
  389. data/package.json +82 -0
  390. data/spec/client/.eslintrc.js +20 -0
  391. data/spec/client/access/login-dialog.spec.jsx +28 -0
  392. data/spec/client/components/__snapshots__/asset.spec.jsx.snap +48 -0
  393. data/spec/client/components/__snapshots__/network-activity-overlay.spec.jsx.snap +35 -0
  394. data/spec/client/components/__snapshots__/query-builder.spec.jsx.snap +82 -0
  395. data/spec/client/components/asset.spec.jsx +16 -0
  396. data/spec/client/components/data-list.spec.jsx +36 -0
  397. data/spec/client/components/data-table.spec.jsx +55 -0
  398. data/spec/client/components/form.spec.jsx +63 -0
  399. data/spec/client/components/network-activity-overlay.spec.jsx +30 -0
  400. data/spec/client/components/query-builder.spec.jsx +45 -0
  401. data/spec/client/components/record-finder.spec.jsx +45 -0
  402. data/spec/client/extension/base.spec.js +15 -0
  403. data/spec/client/lib/util.spec.js +48 -0
  404. data/spec/client/models/asset.spec.js +50 -0
  405. data/spec/client/models/base.spec.js +95 -0
  406. data/spec/client/models/collection.spec.js +51 -0
  407. data/spec/client/models/query.spec.js +243 -0
  408. data/spec/client/models/sync.spec.js +42 -0
  409. data/spec/client/models/system-setting.spec.js +19 -0
  410. data/spec/client/screens/__snapshots__/system-settings.spec.jsx.snap +364 -0
  411. data/spec/client/screens/__snapshots__/tabs.spec.jsx.snap +127 -0
  412. data/spec/client/screens/definition.spec.js +24 -0
  413. data/spec/client/screens/group.spec.js +33 -0
  414. data/spec/client/screens/instance.spec.js +61 -0
  415. data/spec/client/screens/system-settings.spec.jsx +22 -0
  416. data/spec/client/screens/tabs.spec.jsx +36 -0
  417. data/spec/client/screens/user-management.spec.jsx +48 -0
  418. data/spec/client/setup.js +12 -0
  419. data/spec/client/test-logo.json +41 -0
  420. data/spec/client/test-models.js +94 -0
  421. data/spec/client/user.spec.js +19 -0
  422. data/spec/client/workspace/__snapshots__/menu.spec.jsx.snap +380 -0
  423. data/spec/client/workspace/menu.spec.jsx +52 -0
  424. data/spec/factories/user.rb +11 -0
  425. data/spec/fixtures/logo.png +0 -0
  426. data/spec/fixtures/system_settings.yml +8 -0
  427. data/spec/fixtures/test_printer.tex +22 -0
  428. data/spec/fixtures/user.yml +2 -0
  429. data/spec/hippo/components/grid/GridSpec.coffee +56 -0
  430. data/spec/hippo/components/grid/PopoverEditorSpec.coffee +47 -0
  431. data/spec/hippo/components/grid/RowEditorSpec.coffee +98 -0
  432. data/spec/hippo/components/select-field/SelectFieldSpec.coffee +106 -0
  433. data/spec/hippo/components/shared/NetworkActivityOverlaySpec.coffee +34 -0
  434. data/spec/hippo/helpers/.gitkeep +0 -0
  435. data/spec/hippo/helpers/hippo-helpers.coffee +5 -0
  436. data/spec/hippo/helpers/jasmine-matchers.js +1580 -0
  437. data/spec/hippo/helpers/mock-ajax.js +573 -0
  438. data/spec/hippo/models/AssociationMapSpec.coffee +85 -0
  439. data/spec/hippo/models/AssociationProxySpec.coffee +76 -0
  440. data/spec/hippo/models/BaseSpec.coffee +155 -0
  441. data/spec/hippo/models/CollectionSpec.coffee +32 -0
  442. data/spec/hippo/models/EnumMapSpec.coffee +26 -0
  443. data/spec/hippo/models/PubSubSpec.coffee +71 -0
  444. data/spec/hippo/models/QuerySpec.coffee +19 -0
  445. data/spec/hippo/models/SyncSpec.coffee +28 -0
  446. data/spec/hippo/models/UserSpec.coffee +17 -0
  447. data/spec/hippo/react/mixins/DataSpec.coffee +74 -0
  448. data/spec/hippo/screens/DefinitionsSpec.coffee +33 -0
  449. data/spec/hippo/views/BaseSpec.coffee +147 -0
  450. data/spec/hippo/views/FormBindingsSpec.coffee +32 -0
  451. data/spec/server/api/controller_base_spec.rb +101 -0
  452. data/spec/server/assertions.rb +11 -0
  453. data/spec/server/asset_spec.rb +42 -0
  454. data/spec/server/command_spec.rb +73 -0
  455. data/spec/server/concerns/api_path_spec.rb +20 -0
  456. data/spec/server/concerns/association_extensions_spec.rb +24 -0
  457. data/spec/server/concerns/attr_accessor_with_default_spec.rb +63 -0
  458. data/spec/server/concerns/export_methods_spec.rb +34 -0
  459. data/spec/server/concerns/export_scope_spec.rb +14 -0
  460. data/spec/server/concerns/exported_limits_spec.rb +51 -0
  461. data/spec/server/concerns/pub_sub_spec.rb +132 -0
  462. data/spec/server/concerns/set_attribute_data_spec.rb +76 -0
  463. data/spec/server/concerns/sorting_expressions_spec.rb +34 -0
  464. data/spec/server/concerns/track_modifications_spec.rb +18 -0
  465. data/spec/server/configuration_spec.rb +26 -0
  466. data/spec/server/job_spec.rb +54 -0
  467. data/spec/server/mailer_spec.rb +33 -0
  468. data/spec/server/numbers_spec.rb +25 -0
  469. data/spec/server/print/form_spec.rb +29 -0
  470. data/spec/server/spec_helper.rb +74 -0
  471. data/spec/server/strings_spec.rb +41 -0
  472. data/spec/server/system_settings_spec.rb +39 -0
  473. data/tasks/migrations.rake +22 -0
  474. data/tasks/publish.rake +8 -0
  475. data/templates/.babelrc +20 -0
  476. data/templates/.gitignore +4 -0
  477. data/templates/Gemfile +9 -0
  478. data/templates/Guardfile +13 -0
  479. data/templates/Rakefile +2 -0
  480. data/templates/client/components/.gitkeep +0 -0
  481. data/templates/client/components/BaseComponent.coffee +9 -0
  482. data/templates/client/components/Component.cjsx +4 -0
  483. data/templates/client/components/template.html +3 -0
  484. data/templates/client/extension.js +32 -0
  485. data/templates/client/index.js +6 -0
  486. data/templates/client/models/base.js +11 -0
  487. data/templates/client/models/model.js +17 -0
  488. data/templates/client/screens/screen.jsx +22 -0
  489. data/templates/client/styles.scss +1 -0
  490. data/templates/config.ru +7 -0
  491. data/templates/config/database.yml +11 -0
  492. data/templates/config/initialize.rb +10 -0
  493. data/templates/config/jest.config.json +19 -0
  494. data/templates/config/jest/babel-transform.js +47 -0
  495. data/templates/config/routes.rb +4 -0
  496. data/templates/config/screen.rb +9 -0
  497. data/templates/config/screens.rb +10 -0
  498. data/templates/config/webpack.config.js +106 -0
  499. data/templates/db/create_table_migration.rb +19 -0
  500. data/templates/gitignore +4 -0
  501. data/templates/js/config-data.js +10 -0
  502. data/templates/js/jest.config.json +11 -0
  503. data/templates/js/root-view.html +71 -0
  504. data/templates/js/screen-definitions.js +22 -0
  505. data/templates/lib/namespace.rb +15 -0
  506. data/templates/lib/namespace/base_model.rb +11 -0
  507. data/templates/lib/namespace/extension.rb +22 -0
  508. data/templates/lib/namespace/model.rb +7 -0
  509. data/templates/lib/namespace/version.rb +3 -0
  510. data/templates/public/.gitkeep +0 -0
  511. data/templates/spec/client/components/ComponentSpec.coffee +5 -0
  512. data/templates/spec/client/models/model.spec.js +8 -0
  513. data/templates/spec/client/screen.spec.jsx +12 -0
  514. data/templates/spec/client/setup.js +17 -0
  515. data/templates/spec/fixtures/namespace/model.yml +16 -0
  516. data/templates/spec/server/model_spec.rb +10 -0
  517. data/templates/spec/server/spec_helper.rb +8 -0
  518. data/test.js +7 -0
  519. data/views/hippo_root_view.erb +68 -0
  520. data/views/index.html +71 -0
  521. data/yard_ext/all.rb +9 -0
  522. data/yard_ext/code_identifier_handler.rb +33 -0
  523. data/yard_ext/concern_meta_methods.rb +60 -0
  524. data/yard_ext/config_options.rb +27 -0
  525. data/yard_ext/exported_scope.rb +4 -0
  526. data/yard_ext/immutable_handler.rb +17 -0
  527. data/yard_ext/json_attr_accessor.rb +22 -0
  528. data/yard_ext/locked_fields_handler.rb +21 -0
  529. data/yard_ext/templates/default/layout/html/layout.erb +20 -0
  530. data/yard_ext/templates/default/method_details/html/github_link.erb +1 -0
  531. data/yard_ext/templates/default/method_details/setup.rb +3 -0
  532. data/yard_ext/validators.rb +1 -0
  533. data/yard_ext/visible_id_handler.rb +38 -0
  534. data/yarn.lock +6562 -0
  535. metadata +1182 -0
@@ -0,0 +1,10 @@
1
+ class CreateSystemSettings < ActiveRecord::Migration[5.0]
2
+ def change
3
+
4
+ create_table "system_settings" do |t|
5
+ t.integer :configuration_id
6
+ t.jsonb "settings", null: false, default: {}
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ class CreateAssets < ActiveRecord::Migration[5.0]
2
+ def change
3
+
4
+ create_table "assets" do |t|
5
+ t.references :owner, polymorphic: true, null: false
6
+ t.integer :order
7
+ t.jsonb :file_data, null: false, default: {}
8
+ end
9
+
10
+ add_index :assets, [:owner_id, :owner_type]
11
+
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ class CreateUsers < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :users do | t |
4
+ t.string :login, :name, :email, null: false
5
+ t.string :password_digest, null: false
6
+ t.string "role_names", array: true, null:false, default: []
7
+ t.jsonb "options", null: false, default: {}
8
+ t.timestamps null:false
9
+ end
10
+ add_index :users, :role_names, using: 'gin'
11
+ end
12
+ end
@@ -0,0 +1 @@
1
+ Hippo::User.seed_admin_account
@@ -0,0 +1,114 @@
1
+ ---
2
+ # Front matter comment to ensure Jekyll properly reads file.
3
+ # Do not remove
4
+ title: hippo command
5
+ heading: The "hippo" command
6
+ position_after: model
7
+ ---
8
+
9
+ Hippo framework installs a command line application which can be used to create and modify applicatons.
10
+
11
+ The command "hippo" utilizes subcommands that direct it's activities.
12
+
13
+ # hippo help
14
+
15
+ Built-in help can be accessed by either running `hippo help` or command specific help by prefixing the final part of the command with 'help'. For instance `hippo generate help model` will display comphrensive help for the 'hippo generate model' subcommand.
16
+
17
+ # hippo new
18
+
19
+ Executing `hippo new <app name>` will create a skeleton application that contains all the components needed to develop and deploy a single page application.
20
+
21
+ It generates the following directory structure:
22
+
23
+ <pre class="ascii-tree">
24
+ ├── Gemfile
25
+ ├── Guardfile
26
+ ├── Rakefile
27
+ ├── config.ru
28
+ ├── tmp
29
+ ├── client
30
+ │ └── todo
31
+ │ ├── Extension.coffee
32
+ │ ├── components, data, views, styles, (empty directories)
33
+ │ ├── index.js
34
+ │ ├── screens
35
+ │ │ └── base
36
+ │ │ ├── Base.coffee
37
+ │ │ ├── index.js
38
+ │ │ ├── index.scss
39
+ │ │ └── layout.html
40
+ │ └── styles.scss
41
+ ├── config
42
+ │ ├── database.yml
43
+ │ ├── hippo.rb
44
+ │ └── routes.rb
45
+ ├── spec
46
+ │ └── todo
47
+ └── lib
48
+ ├── todo
49
+ │ ├── extension.rb
50
+ │ └── version.rb
51
+ └── todo.rb
52
+ </pre>
53
+
54
+
55
+ Notable directories created are:
56
+
57
+ * *lib/<app_name>* This directory will hold all server-side Ruby files that are needed by your application such as ActiveRecord models.
58
+ * *config* Contains the routes and a config file for modifying Lane's behaviour.
59
+ * *client/<app_name>* Contains all the client code that makes up your application. It has directories for views, data (models and collections), and screens. A "Base" screen is created to start you off with. You can use that screen as a base class for further screens if your application will be complex, or simply use it for your application if there will only be a single screen. That's how the TODO MVC Example app is written.
60
+
61
+ # hippo generate
62
+
63
+ Constructs either a model, component or screen.
64
+
65
+ ## Component
66
+
67
+ `hippo generate component <name>`
68
+
69
+ Will create a new component file along with an accompanying spec. By default the content will only render a simple [I am a {class_name} component] message.
70
+
71
+
72
+ ## Model
73
+
74
+ `hippo generate model <name> [field definitions]`
75
+
76
+ Creates a new model server and client side, a migration, fixtures file and accompanying specs. It may be accompanied by a list of field names, which if given will be set on the appropriate files.
77
+
78
+ The field specifications are given as `field:type` and seperated by spaces.
79
+
80
+ For instance, `hippo generate model comment user:references title:string{80} content:text`, when executed inside of a project called "Blog":
81
+
82
+ * Will create a Ruby ActiveRecord model called `Blog::Comment` and an accompanying migration to add a user_id, a title and content fields.
83
+ * Setup a client model Blog.Data.Comment and a collection Blog.Data.BlogCollection
84
+ * Spec files will be created to test both the ActiveRecord model and the client Model and Collection.
85
+
86
+ ## Screen
87
+
88
+ `hippo generate screen <name>`
89
+
90
+ In the Hippo lexicon, a screen is a Component that is able to be loaded on demand. By default, the styles and Javascript code that make up a screen are not loaded as part of the applications main bundles. Instead the screen is loaded on demand when the user clicks on a menu.
91
+
92
+ Remote data events for all sub components bubble up to the screen. This allows the screen to display a notification to the user alerting them that another user edited data that is being currently displayed somewhere on the view.
93
+
94
+ # hippo update
95
+
96
+ ## Model
97
+
98
+ `hippo update model <name>`
99
+
100
+ When developing a data driven application, the data model usually undergoes several revisions. The update command reads the schema from the database and updates the client model with the updated field names, types, null conditions. It also reads the assocations from the ActiveRecord model and applies them to the model as well.
101
+
102
+ # hippo db
103
+
104
+ ## Migrate
105
+
106
+ `hippo db migrate`
107
+
108
+ Calls rake db:migrate for each extension that is loaded. Since hippo extensions ship with migrations, this provides an easy way to install their data structures as well as keep them up to date.
109
+
110
+ ## Seed
111
+
112
+ `hippo db seed`
113
+
114
+ Calls rake db:seed for each extension that is loaded. Often an extension will need to ship with certain default records. This provides a way to provision them on install. Commands can be placed in db/seeds.rb to be executed.
@@ -0,0 +1,217 @@
1
+ ---
2
+ title: Model
3
+ heading: Hippo.Models.Base
4
+ position_after: view
5
+ ---
6
+
7
+ Hippo provides a Hippo.Models.Base class that all other models extend from.
8
+
9
+ A Model is an extension of [Ampersand State](http://ampersandjs.com/docs#ampersand-state), and supports all the features that AmpersandState does.
10
+
11
+ <aside class="note">
12
+ Unlike the Models in Backbonejs, Hippo' Models track their "dirty" state. This allows them to perform true HTTP "patch" requests and only send the attributes that have been modified to the server. They can also be interogated and only saved if they contain unsaved data.
13
+ </aside>
14
+
15
+ Models also have associations, which are lazily instantiated and can be optionally fetched along with the model/collection.
16
+
17
+ Model methods that make requests to the server can specify options to control what data is returned. An explanation of the options can be found under [Request Options](#request-options)
18
+
19
+
20
+ ### API Reference
21
+
22
+ # @where
23
+
24
+ Load models from server that match the query. Returns [Collection](#@query)
25
+
26
+ ``` coffee
27
+ class Person extends Hippo.Models.Base
28
+ props:
29
+ id: 'integer'
30
+ name: 'string'
31
+
32
+
33
+ collection = Person.where( last_name: "smith" )
34
+ ````
35
+
36
+
37
+ # @Collection
38
+
39
+ A collection definition is provided for each model.
40
+
41
+ Read more about [Request Options](#request-options)
42
+
43
+ ``` coffee
44
+ class Person extends Hippo.Models.Base
45
+ props:
46
+ id: 'integer'
47
+ name: 'string'
48
+
49
+
50
+ collection = Person.Collection.fetch(query:{ name: "John" }, limit: 10, with: [ 'address','photo' ] )
51
+ ````
52
+
53
+
54
+ # initialize
55
+
56
+ `new Model({options})`
57
+
58
+ Called by the constructor after the models initialized. Initialize can be used by to perform additional initialization of the class.
59
+
60
+ If a collection reference is provided to initalize, it will be copied onto the model.
61
+
62
+ # Model.fetch(id,options)
63
+
64
+ Fetches and instantiates a record. Is useful for when you all you know is the record's ID. The identity map is consulted, and if the record is present there the existing copy is returned.
65
+
66
+ ``` coffee
67
+ class Balance extends Hippo.Models.Base
68
+ props:
69
+ id: 'integer'
70
+ amount: 'bigdec'
71
+
72
+ balance = new Balance(id: 10, amount:42.11)
73
+ view = new MyApp.Views.Checkbook( model: balance )
74
+
75
+ Balance.fetch(10) # retrieves balance from idmap
76
+ Balance.fetch(11) # fetches balance with id 11 from server
77
+ ```
78
+
79
+ # fetch(options)
80
+
81
+ Retrieves the current state of the model from the server. Options can be any of the valid
82
+ [load options](#request-options)
83
+
84
+ # save(options)
85
+
86
+ Saves record state to server. If options.saveAll is true, then the entire data set will be sent to the server, otherwise only modified fields are saved and a `PATCH` is performed.
87
+
88
+ Save also saves it's associations along with itself.
89
+
90
+ ``` coffee
91
+ class Car extends Hippo.Models.Base
92
+ associations:
93
+ driver: { model: Person }
94
+ props:
95
+ id: 'integer'
96
+ color: 'string'
97
+
98
+ driver = new Driver(name: 'Jane')
99
+ car = new Car(color: 'red', driver: driver )
100
+ car.color = 'Blue'
101
+ car.save() # will send { color: 'Blue', driver:{ name: 'Jane' } }
102
+ ```
103
+
104
+ # destroy()
105
+
106
+ Deletes the record from the server
107
+
108
+ # set()
109
+
110
+ Sets field and values. Marks the fields as unsaved and the record as "dirty". Can be invoked as either `set(field,value)` or `set({ field:value, field2:value2 })`
111
+
112
+ # unsavedData()
113
+
114
+ returns the field and values that have been modified and the unsavedData from associations as well.
115
+
116
+ ``` coffee
117
+ class Car extends Hippo.Models.Base
118
+ associations:
119
+ driver: { model: Person }
120
+ props:
121
+ id: 'integer'
122
+ color: 'string'
123
+
124
+ driver = new Driver(name: 'Jane')
125
+ car = new Car()
126
+ car.set(color: 'red', driver: driver)
127
+ car.unsavedData() # { color: 'Blue', driver:{ name: 'Jane' } }
128
+ ```
129
+
130
+ # isDirty
131
+
132
+ True if there are unsaved fields, false otherwise. **Note**: this does not check
133
+ associations, only fields that belong to the record itself.
134
+
135
+ # hasAttribute(attr)
136
+
137
+ Checks if the given field is defined on the Model.
138
+
139
+ # errorMsg(field,value)
140
+
141
+ Returns a string with an appropriate error message for setting the field to value.
142
+
143
+ If the change is considered valid, an empty string is returned.
144
+
145
+ The default implementation only checks the 'required' status of the field. Models inheriting from `Hippo.Models.Base` may provide an alternative implementation.
146
+
147
+ # withAssociations(list...)
148
+
149
+ Loads any assocations in list if they are not already present.
150
+
151
+
152
+ # Request Options
153
+
154
+ The following options can be used with any method that make requests to the server.
155
+
156
+ * **with** use an exported query scope to limit records returned.
157
+ * **query** an array of objects to query the record with
158
+ * **include** an array of exported associations that should be included with the results.
159
+ * **fields** an array of fields (usually methods) to include in the result set.
160
+ * **order** an object containing fields and ASC/DESC strings.
161
+ * **limit** number of records to return
162
+ * **offset** to start query at row
163
+ * **format** If set to "array", the results will be returned as an array, otherwise stand JSON objects are returned.
164
+
165
+
166
+ Given a server-side model such as:
167
+
168
+ ``` ruby
169
+ class Invoice < Hippo::Model
170
+ belongs_to :customer, export: true
171
+ has_many :lines, export: true
172
+ export_scope :payment_reference, lambda{ | value |
173
+ joins(:payments).where( payments: { amount: value } )
174
+ }
175
+ def trust_factor
176
+ return invoke_magic_formula
177
+ end
178
+ export_methods :trust_factor
179
+ end
180
+ ```
181
+
182
+ It can be queried by the client:
183
+
184
+ ``` coffee
185
+ class Invoice extends Hippo.Models.Base
186
+ props:
187
+ id: 'integer'
188
+ total: 'bigdec'
189
+ session:
190
+ trust_factor: 'string'
191
+ associations:
192
+ customer: { model: Customer }
193
+ lines: { collection: InvoiceLines }
194
+
195
+ # Fetch the Invoice with id 1 and it's associated customer and lines.
196
+ # The results from calling the "trust_factor" method will also be included
197
+ Invoice.fetch({
198
+ include: ['customer','lines'],
199
+ fields: ['trust_factor']
200
+ })
201
+
202
+ # Fetch using the "payment_reference" scope on the model
203
+ Invoice.where( with: { payment_reference: 'ABRACADABRA' } )
204
+
205
+ # Fetch using an fairly complex adhoc query to find
206
+ # all invoices by a customer who's name starts with "Bob"
207
+ Invoice.where( query: { customer: { name: { value: 'Bob%', op: 'like' } )
208
+
209
+ # A simple query to find records who's "tag" field is set to "GOOD"
210
+ # 100 records will be returned, sorted by "name" and
211
+ # will start at the 101st record
212
+ Invoice.where(
213
+ query: {tag: 'GOOD'},
214
+ order: { name: 'DESC' },
215
+ limit: 100, start: 100
216
+ )
217
+ ```
@@ -0,0 +1,137 @@
1
+ ---
2
+ title: React
3
+ heading: Hippo.React.Component
4
+ ---
5
+
6
+ Hippo uses [React](reactjs.com) for the view layer. It provides an easy-to-use data bindings between it and the data layouer's {% doc_link model %}
7
+
8
+ A simple example of a React component bound to a data model:
9
+
10
+ ``` coffee
11
+
12
+ class MyView extends Hippo.React.Component
13
+
14
+ propTypes:
15
+ model: Hippo.PropTypes.Model.isRequired
16
+
17
+ render: ->
18
+ <h1>Hello {@model.name}</h1>
19
+
20
+ ```
21
+
22
+ Note a few interesting things about this component compared to a standard React one. The first is the non-standard "model" propType, and the second is the @model instance variable used in the `render` method.
23
+
24
+ # propType validators
25
+
26
+ As show above, Hippo provides validators for it's data types. These include:
27
+
28
+
29
+ * `Hippo.PropTypes.Model` Verifies that the property is an instance of `Hippo.Models.Base`
30
+ * `Hippo.PropTypes.State` Checks that the property is an instance of `Hippo.Models.State`. State objects are like models, but do not have the ability to be retreived from or saved to the server. They're usefull for storing lightweight session objects.
31
+ * `Hippo.PropTypes.Collection` Like the models above but for collections.
32
+
33
+ Each of the validators also has a `.isRequired` helper, just like React's built in ones.
34
+
35
+ # dataObjects
36
+
37
+ Hippo data bindings for components will be automatically setup for any prop that is named `model`.
38
+
39
+ If a property named `model` is given, it will be mapped to the `@model` instance. Other properties can also be setup by specifying attributes for `dataObject` In this example, a '@bank` and `@customer` objects are mapped.
40
+
41
+ ``` coffee
42
+
43
+ class MyView extends Hippo.React.Component
44
+
45
+ dataObjects:
46
+ bank: 'props'
47
+ customer: -> GlobalCustomer.lookup('foo')
48
+
49
+ render: ->
50
+ <h1>{@customer.name} has {@bank.balance}</h1>
51
+
52
+ ```
53
+
54
+ As you can see, the bank mapping will be read from the props, while the customer uses a custom lookup strategy. It's function will be called to obtain the value whenever the component is mounted.
55
+
56
+
57
+
58
+ # events
59
+
60
+ By default, Hippo will listen for all events on both models and collections.
61
+
62
+ Every time the events fires, Hippo will call `setState` on the component, causing a re-render. While React is great about making the re-render as efficient as possible, it can sometimes be a good idea to only listen for events that the compoent will be interested int.
63
+
64
+ The events bound can be modified by using the `bindDataEvents` attribute. For instance this component will only render when the name is changed. This makes sense since that's the only attribute of the model that is used.
65
+
66
+
67
+ ``` coffee
68
+
69
+ class MyView extends Hippo.React.Component
70
+
71
+ bindDataEvents:
72
+ model: 'change:name'
73
+
74
+
75
+ render: ->
76
+ <h1>Your name is: {@model.name}</h1>
77
+
78
+ ```
79
+
80
+ The complete list of events Hippo listens to is:
81
+
82
+ * Models:
83
+ * `change`: an attribute was modified
84
+ * `request`: A network request was began
85
+ * `sync`: The network request completed
86
+ * `invalid`: An attempted update failed validation
87
+ * `error`: An error was encountered, usually only fired during network access.
88
+ * Collections:
89
+ * `add`: A model was added
90
+ * `remove`: Model removed
91
+ * `change`: one of the models was changed
92
+ * `sort`: The collection was re-sorted
93
+ * `reset`: All models were removed
94
+ * `request`: A network request was started
95
+ * `sync`: Network request completed
96
+ * `error`: An error occured, usually during network access
97
+
98
+ # setDataState
99
+
100
+ When a bound event is fired for a model, Hippo will call setState on the model with the affected model as the key. Sometimes a component would rather have other information injected into state, or perhaps wants to selectively ignore some changes.
101
+
102
+ Components can do so by implementing a `setDataState` method. If this method exists, it is soley responsible for calling `setState` to trigger a `render`
103
+
104
+ ``` coffee
105
+
106
+ class MyView extends Hippo.React.Component
107
+
108
+ setDataState: (newState) ->
109
+ if newState.model?.name == 'Bob'
110
+ this.setState(wasBob: true)
111
+
112
+ render: ->
113
+ <h1>Has Bob been seen? {if @state.wasBob then 'Yes' else 'No'}</h1>
114
+
115
+ ```
116
+
117
+ # PubSub
118
+
119
+ Publish/Subscribe often abbreviated as simply PubSub is a mechanism where amodel can subscribe to updates for itself and be notified when other users modify it.
120
+
121
+ By default whenever a model is bound to a React component, Hippo will also subscribe that model to updates. When model is unbound or the component is unmounted, Hippo will remove the model from receiving updates as well. This applies only to Models, not State object or Collections.
122
+
123
+ Set `pubsub: false` if Hippo should not bind any models, or to an object with keys for the models that should not be bound
124
+
125
+
126
+ ``` coffee
127
+
128
+ class MyView extends Hippo.React.Component
129
+
130
+ pubsub:
131
+ model: false
132
+
133
+ # could also have just been:
134
+ pubsub: false
135
+
136
+
137
+ ```