lanes 0.1.2 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (399) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -0
  3. data/client/lanes/access/Extension.coffee +19 -0
  4. data/client/lanes/access/LoginDialog.coffee +47 -0
  5. data/client/lanes/access/Roles.coffee +88 -0
  6. data/client/lanes/access/User.coffee +72 -0
  7. data/client/lanes/access/index.js +5 -0
  8. data/client/lanes/access/login-dialog.html +16 -0
  9. data/client/lanes/access/screens/user-management/GridUserEditor.coffee +25 -0
  10. data/client/lanes/access/screens/user-management/UserManagement.coffee +24 -0
  11. data/client/lanes/access/screens/user-management/grid-popover-editor.html +33 -0
  12. data/client/lanes/access/screens/user-management/index.js +3 -0
  13. data/client/lanes/access/screens/user-management/index.scss +7 -0
  14. data/client/lanes/access/screens/user-management/screen.html +7 -0
  15. data/client/lanes/{components/enabled.scss.erb → access/styles.scss} +0 -0
  16. data/{lib/lanes/command/templates/client/components → client/lanes/access/views}/.gitkeep +0 -0
  17. data/client/lanes/components/Base.coffee +3 -4
  18. data/client/lanes/components/enabled.js.erb +2 -0
  19. data/client/lanes/components/grid/Editor.coffee +1 -1
  20. data/client/lanes/components/grid/Grid.coffee +26 -27
  21. data/client/lanes/components/grid/{_index.scss → styles.scss} +0 -0
  22. data/client/lanes/components/grid/template.html +1 -1
  23. data/client/lanes/components/grid/vendor/dataTables.scroller.js +119 -42
  24. data/client/lanes/components/grid/vendor/jquery.dataTables.js +984 -526
  25. data/client/lanes/components/modal/ModalDialog.coffee +25 -4
  26. data/client/lanes/components/modal/styles.scss +19 -0
  27. data/client/lanes/components/modal/template.html +2 -2
  28. data/client/lanes/components/multi-select/MultiSelect.coffee +46 -0
  29. data/client/lanes/components/popover/PopOver.coffee +1 -1
  30. data/client/lanes/components/popover/styles.scss +2 -0
  31. data/client/lanes/components/{radio_group → radio-group}/RadioGroup.coffee +12 -23
  32. data/client/lanes/components/radio-group/index.js +1 -0
  33. data/client/lanes/components/radio-group/styles.scss +1 -0
  34. data/client/lanes/components/record-finder/Clause.coffee +38 -0
  35. data/client/lanes/components/record-finder/Dialog.coffee +45 -0
  36. data/client/lanes/components/record-finder/RecordFinder.coffee +55 -0
  37. data/client/lanes/components/{record_finder/clause.skr → record-finder/clause.html} +7 -5
  38. data/client/lanes/components/record-finder/config.json +3 -0
  39. data/client/lanes/components/{record_finder/dialog.skr → record-finder/dialog.html} +0 -0
  40. data/client/lanes/components/{record_finder/field.skr → record-finder/field.html} +1 -1
  41. data/client/lanes/components/record-finder/index.js +4 -0
  42. data/client/lanes/{styles/components/record-finder.scss → components/record-finder/styles.scss} +22 -20
  43. data/client/lanes/components/select-field/SelectField.coffee +62 -0
  44. data/client/lanes/components/{select_field → select-field}/index.js +0 -0
  45. data/client/lanes/components/{select_field/_index.scss → select-field/styles.scss} +0 -0
  46. data/client/lanes/extension/EarlyExtensions.js.erb +3 -3
  47. data/client/lanes/extension/Extensions.coffee +4 -1
  48. data/client/lanes/extension/LateLoaded.js.erb +3 -3
  49. data/client/lanes/index.js +2 -2
  50. data/client/lanes/index.scss.erb +30 -0
  51. data/client/lanes/lib/MakeBaseClass.coffee +20 -19
  52. data/client/lanes/lib/ModuleSupport.coffee +1 -1
  53. data/client/lanes/lib/results.coffee +1 -9
  54. data/client/lanes/lib/utilFunctions.coffee +56 -10
  55. data/client/lanes/models/Base.coffee +57 -116
  56. data/client/lanes/models/ChangeMonitor.coffee +29 -0
  57. data/client/lanes/models/ChangeSet.coffee +3 -3
  58. data/client/lanes/models/Collection.coffee +36 -4
  59. data/client/lanes/models/ModelAssociations.coffee +118 -0
  60. data/client/lanes/models/PubSub.coffee +5 -5
  61. data/client/lanes/models/Query.coffee +37 -27
  62. data/client/lanes/models/Sync.coffee +1 -1
  63. data/client/lanes/models/index.js +1 -0
  64. data/client/lanes/screens/Base.coffee +5 -8
  65. data/client/lanes/screens/ChangeListener.coffee +6 -3
  66. data/client/lanes/{models/Screens.coffee → screens/Definitions.coffee} +22 -9
  67. data/client/lanes/screens/Instance.coffee +22 -22
  68. data/client/lanes/screens/Router.coffee +1 -3
  69. data/client/lanes/screens/all.js.erb +3 -0
  70. data/client/lanes/screens/index.js +6 -1
  71. data/client/lanes/screens/{screen-definitions.js.erb → register.js.erb} +3 -3
  72. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_alerts.scss +0 -0
  73. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_badges.scss +0 -0
  74. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_breadcrumbs.scss +0 -0
  75. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_button-groups.scss +0 -0
  76. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_buttons.scss +0 -0
  77. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_carousel.scss +0 -0
  78. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_close.scss +0 -0
  79. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_code.scss +0 -0
  80. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_component-animations.scss +0 -0
  81. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_dropdowns.scss +0 -0
  82. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_forms.scss +0 -0
  83. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_glyphicons.scss +0 -0
  84. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_grid.scss +0 -0
  85. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_input-groups.scss +0 -0
  86. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_jumbotron.scss +0 -0
  87. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_labels.scss +0 -0
  88. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_list-group.scss +0 -0
  89. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_media.scss +0 -0
  90. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_mixins.scss +0 -0
  91. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_modals.scss +0 -0
  92. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_navbar.scss +0 -0
  93. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_navs.scss +0 -0
  94. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_normalize.scss +0 -0
  95. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_pager.scss +0 -0
  96. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_pagination.scss +0 -0
  97. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_panels.scss +0 -0
  98. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_popovers.scss +0 -0
  99. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_print.scss +0 -0
  100. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_progress-bars.scss +0 -0
  101. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_responsive-embed.scss +0 -0
  102. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_responsive-utilities.scss +0 -0
  103. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_scaffolding.scss +0 -0
  104. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_tables.scss +0 -0
  105. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_theme.scss +0 -0
  106. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_thumbnails.scss +0 -0
  107. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_tooltip.scss +0 -0
  108. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_type.scss +0 -0
  109. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_utilities.scss +0 -0
  110. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_variables.scss +0 -0
  111. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/_wells.scss +0 -0
  112. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_alerts.scss +0 -0
  113. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_background-variant.scss +0 -0
  114. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_border-radius.scss +0 -0
  115. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_buttons.scss +0 -0
  116. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_center-block.scss +0 -0
  117. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_clearfix.scss +0 -0
  118. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_forms.scss +0 -0
  119. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_gradients.scss +0 -0
  120. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_grid-framework.scss +0 -0
  121. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_grid.scss +0 -0
  122. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_hide-text.scss +0 -0
  123. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_image.scss +0 -0
  124. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_labels.scss +0 -0
  125. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_list-group.scss +0 -0
  126. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_nav-divider.scss +0 -0
  127. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_nav-vertical-align.scss +0 -0
  128. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_opacity.scss +0 -0
  129. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_pagination.scss +0 -0
  130. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_panels.scss +0 -0
  131. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_progress-bar.scss +0 -0
  132. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_reset-filter.scss +0 -0
  133. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_resize.scss +0 -0
  134. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_responsive-visibility.scss +0 -0
  135. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_size.scss +0 -0
  136. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_tab-focus.scss +0 -0
  137. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_table-row.scss +0 -0
  138. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_text-emphasis.scss +0 -0
  139. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_text-overflow.scss +0 -0
  140. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/mixins/_vendor-prefixes.scss +0 -0
  141. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_alerts.scss +0 -0
  142. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_badges.scss +0 -0
  143. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_breadcrumbs.scss +0 -0
  144. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_button-groups.scss +0 -0
  145. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_buttons.scss +0 -0
  146. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_carousel.scss +0 -0
  147. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_close.scss +0 -0
  148. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_code.scss +0 -0
  149. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_component-animations.scss +0 -0
  150. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_dropdowns.scss +0 -0
  151. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_forms.scss +0 -0
  152. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_glyphicons.scss +0 -0
  153. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_grid.scss +0 -0
  154. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_input-groups.scss +0 -0
  155. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_jumbotron.scss +0 -0
  156. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_labels.scss +0 -0
  157. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_list-group.scss +0 -0
  158. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_media.scss +0 -0
  159. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_mixins.scss +0 -0
  160. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_modals.scss +0 -0
  161. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_navbar.scss +0 -0
  162. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_navs.scss +0 -0
  163. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_normalize.scss +0 -0
  164. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_pager.scss +0 -0
  165. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_pagination.scss +0 -0
  166. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_panels.scss +0 -0
  167. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_popovers.scss +0 -0
  168. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_print.scss +0 -0
  169. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_progress-bars.scss +0 -0
  170. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_responsive-embed.scss +0 -0
  171. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_responsive-utilities.scss +0 -0
  172. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_scaffolding.scss +0 -0
  173. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_tables.scss +0 -0
  174. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_theme.scss +0 -0
  175. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_thumbnails.scss +0 -0
  176. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_tooltip.scss +0 -0
  177. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_type.scss +0 -0
  178. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_utilities.scss +0 -0
  179. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_variables.scss +0 -0
  180. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/_wells.scss +0 -0
  181. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/bootstrap.scss +0 -0
  182. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_alerts.scss +0 -0
  183. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_background-variant.scss +0 -0
  184. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_border-radius.scss +0 -0
  185. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_buttons.scss +0 -0
  186. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_center-block.scss +0 -0
  187. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_clearfix.scss +0 -0
  188. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_forms.scss +0 -0
  189. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_gradients.scss +0 -0
  190. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_grid-framework.scss +0 -0
  191. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_grid.scss +0 -0
  192. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_hide-text.scss +0 -0
  193. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_image.scss +0 -0
  194. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_labels.scss +0 -0
  195. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_list-group.scss +0 -0
  196. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_nav-divider.scss +0 -0
  197. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_nav-vertical-align.scss +0 -0
  198. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_opacity.scss +0 -0
  199. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_pagination.scss +0 -0
  200. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_panels.scss +0 -0
  201. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_progress-bar.scss +0 -0
  202. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_reset-filter.scss +0 -0
  203. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_resize.scss +0 -0
  204. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_responsive-visibility.scss +0 -0
  205. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_size.scss +0 -0
  206. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_tab-focus.scss +0 -0
  207. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_table-row.scss +0 -0
  208. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_text-emphasis.scss +0 -0
  209. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_text-overflow.scss +0 -0
  210. data/client/lanes/styles/{vendor/bootstrap → bootstrap}/old/mixins/_vendor-prefixes.scss +0 -0
  211. data/client/lanes/styles/{vendor/bootstrap-custom-grid.scss → bootstrap-custom-grid.scss} +0 -0
  212. data/client/lanes/styles/{vendor/bootstrap-custom-modals.scss → bootstrap-custom-modals.scss} +0 -0
  213. data/client/lanes/styles/bootstrap.scss +71 -0
  214. data/client/lanes/styles/{vendor/dataTables.scss → dataTables.scss} +0 -0
  215. data/client/lanes/styles/fonts.scss +9 -20
  216. data/client/lanes/vendor/packaged.js +27 -25
  217. data/client/lanes/views/Base.coffee +47 -34
  218. data/client/lanes/views/FormBindings.coffee +10 -9
  219. data/client/lanes/views/Helpers.coffee +14 -16
  220. data/client/lanes/views/ModelObserver.coffee +4 -4
  221. data/client/lanes/views/ModelUpdate.coffee +5 -2
  222. data/client/lanes/views/PubSub.coffee +1 -1
  223. data/client/lanes/views/Viewport.coffee +8 -78
  224. data/client/lanes/views/_button.html +1 -1
  225. data/client/lanes/views/_toolbar.html +21 -25
  226. data/client/lanes/views/model-update.html +7 -5
  227. data/client/lanes/workspace/ActiveScreensSwitcher.coffee +6 -12
  228. data/client/lanes/workspace/Extension.coffee +3 -0
  229. data/client/lanes/workspace/Layout.coffee +13 -9
  230. data/client/lanes/workspace/Navbar.coffee +2 -18
  231. data/client/lanes/workspace/Pages.coffee +13 -14
  232. data/client/lanes/workspace/ScreensMenu.coffee +9 -18
  233. data/client/lanes/workspace/UIState.coffee +78 -0
  234. data/client/lanes/workspace/WorkspaceView.coffee +4 -1
  235. data/client/lanes/workspace/index.js +0 -3
  236. data/client/lanes/workspace/navbar.html +0 -4
  237. data/client/lanes/workspace/pages.html +1 -1
  238. data/client/lanes/workspace/styles/changes-notification.scss +57 -0
  239. data/client/lanes/{styles → workspace/styles}/forms.scss +0 -0
  240. data/client/lanes/workspace/styles/header.scss +42 -0
  241. data/client/lanes/{styles → workspace/styles}/keybindings.scss +0 -0
  242. data/client/lanes/workspace/styles/layout.scss +209 -0
  243. data/client/lanes/workspace/styles/screens.scss +67 -0
  244. data/client/lanes/workspace/styles/tabs.scss +147 -0
  245. data/client/lanes/workspace/styles/toolbar.scss +4 -0
  246. data/client/lanes/workspace/styles.scss +20 -0
  247. data/docs/model.md +39 -7
  248. data/docs/todo-example-part-1.md +7 -7
  249. data/docs/view.md +57 -40
  250. data/lib/lanes/access/authentication_provider.rb +59 -0
  251. data/lib/lanes/access/config/routes.rb +26 -0
  252. data/lib/lanes/access/config/screens.rb +16 -0
  253. data/lib/lanes/access/db/migrate/20140615031600_create_lanes_users.rb +12 -0
  254. data/lib/lanes/access/extension.rb +40 -0
  255. data/lib/lanes/access/locked_fields.rb +43 -0
  256. data/lib/lanes/access/role.rb +60 -0
  257. data/lib/lanes/access/role_collection.rb +76 -0
  258. data/lib/lanes/access/roles/administrator.rb +39 -0
  259. data/lib/lanes/access/roles/support.rb +15 -0
  260. data/lib/lanes/access/track_modifications.rb +48 -0
  261. data/lib/lanes/access/user.rb +128 -0
  262. data/lib/lanes/access/version.rb +5 -0
  263. data/lib/lanes/access.rb +51 -0
  264. data/lib/lanes/api/helper_methods.rb +2 -2
  265. data/lib/lanes/api/javascript_processor.rb +3 -3
  266. data/lib/lanes/api/null_authentication_provider.rb +1 -1
  267. data/lib/lanes/api/pub_sub.rb +3 -3
  268. data/lib/lanes/api/request_wrapper.rb +1 -1
  269. data/lib/lanes/api/root.rb +1 -2
  270. data/lib/lanes/api/sprockets_extension.rb +6 -4
  271. data/lib/lanes/api/test_specs.rb +2 -8
  272. data/lib/lanes/command/app.rb +30 -12
  273. data/lib/lanes/command/db.rb +3 -0
  274. data/lib/lanes/command/generate_model.rb +4 -4
  275. data/lib/lanes/command/generate_screen.rb +12 -10
  276. data/lib/lanes/command/generate_view.rb +12 -9
  277. data/lib/lanes/command/named_command.rb +7 -5
  278. data/lib/lanes/command/server.rb +1 -1
  279. data/lib/lanes/command.rb +2 -5
  280. data/lib/lanes/components.rb +1 -1
  281. data/lib/lanes/concerns/queries.rb +1 -1
  282. data/lib/lanes/concerns/set_attribute_data.rb +5 -7
  283. data/lib/lanes/db.rb +5 -4
  284. data/lib/lanes/extension/definition.rb +95 -0
  285. data/lib/lanes/extension.rb +34 -69
  286. data/lib/lanes/guard_tasks.rb +2 -2
  287. data/lib/lanes/screen.rb +8 -0
  288. data/lib/lanes/spec_helper.rb +1 -37
  289. data/lib/lanes/version.rb +1 -1
  290. data/lib/lanes/workspace/extension.rb +28 -0
  291. data/lib/lanes/workspace.rb +7 -0
  292. data/npm-build/package.json +2 -2
  293. data/spec/api/javascript_processor_spec.rb +1 -1
  294. data/spec/lanes/components/grid/GridSpec.coffee +31 -0
  295. data/{lib/lanes/command/templates/client/views → spec/lanes/helpers}/.gitkeep +0 -0
  296. data/spec/{helpers → lanes/helpers}/jasmine-matchers.js +0 -0
  297. data/spec/{helpers → lanes/helpers}/lanes-helpers.coffee +2 -4
  298. data/spec/lanes/helpers/mock-ajax.js +576 -0
  299. data/spec/lanes/models/BaseSpec.coffee +24 -37
  300. data/spec/lanes/models/CollectionSpec.coffee +15 -2
  301. data/spec/lanes/models/ModelAssociationsSpec.coffee +51 -0
  302. data/spec/lanes/views/BaseSpec.coffee +14 -14
  303. data/spec/server/command_spec.rb +39 -0
  304. data/spec/{concerns → server/concerns}/api_path_spec.rb +1 -1
  305. data/spec/{concerns → server/concerns}/association_extensions_spec.rb +1 -2
  306. data/spec/{concerns → server/concerns}/attr_accessor_with_default_spec.rb +0 -0
  307. data/spec/{concerns → server/concerns}/export_associations_spec.rb +1 -2
  308. data/spec/{concerns → server/concerns}/export_methods_spec.rb +1 -3
  309. data/spec/{concerns → server/concerns}/export_scope_spec.rb +2 -2
  310. data/spec/{concerns → server/concerns}/exported_limits_spec.rb +1 -2
  311. data/spec/{concerns → server/concerns}/pub_sub_spec.rb +1 -1
  312. data/spec/{concerns → server/concerns}/set_attribute_data_spec.rb +1 -1
  313. data/spec/{configuration_spec.rb → server/configuration_spec.rb} +1 -1
  314. data/spec/{helpers → server}/minitest_assertions.rb +1 -1
  315. data/spec/{numbers_spec.rb → server/numbers_spec.rb} +1 -2
  316. data/{lib/lanes/testing_models.rb → spec/server/spec_helper.rb} +17 -3
  317. data/spec/{strings_spec.rb → server/strings_spec.rb} +1 -1
  318. data/templates/Gemfile +6 -0
  319. data/{lib/lanes/command/templates → templates}/Guardfile +0 -0
  320. data/templates/Rakefile +2 -0
  321. data/templates/client/Extension.coffee +7 -0
  322. data/templates/client/Router.coffee +4 -0
  323. data/{lib/lanes/command/templates/public → templates/client/components}/.gitkeep +0 -0
  324. data/templates/client/components/Component.coffee +1 -0
  325. data/{lib/lanes/command/templates → templates}/client/index.js +1 -0
  326. data/templates/client/models/BaseModel.coffee +5 -0
  327. data/{lib/lanes/command/templates → templates}/client/models/Model.coffee +2 -3
  328. data/{lib/lanes/command/templates → templates}/client/screens/Screen.coffee +6 -1
  329. data/{lib/lanes/command/templates → templates}/client/screens/index.js +0 -0
  330. data/{lib/lanes/command/templates → templates}/client/screens/layout.html +0 -0
  331. data/{lib/lanes/command/templates → templates}/client/screens/styles.scss +1 -2
  332. data/{lib/lanes/command/templates → templates}/client/styles.scss +0 -0
  333. data/{spec/helpers → templates/client/views}/.gitkeep +0 -0
  334. data/templates/client/views/BaseView.coffee +5 -0
  335. data/templates/client/views/View.coffee +10 -0
  336. data/{lib/lanes/command/templates → templates}/client/views/template.html +0 -0
  337. data/{lib/lanes/command/templates → templates}/config/database.yml +0 -0
  338. data/{lib/lanes/command/templates → templates}/config/lanes.rb +0 -0
  339. data/{lib/lanes/command/templates → templates}/config/routes.rb +0 -0
  340. data/templates/config/screen.rb +12 -0
  341. data/{lib/lanes/command/templates → templates}/config.ru +1 -1
  342. data/{lib/lanes/command/templates → templates}/db/create_table_migration.rb +1 -1
  343. data/{lib/lanes/command/templates → templates}/gitignore +1 -0
  344. data/templates/lib/namespace/base_model.rb +11 -0
  345. data/{lib/lanes/command/templates → templates}/lib/namespace/extension.rb +3 -3
  346. data/{lib/lanes/command/templates → templates}/lib/namespace/model.rb +1 -1
  347. data/templates/lib/namespace/version.rb +3 -0
  348. data/templates/lib/namespace.rb +14 -0
  349. data/templates/public/.gitkeep +0 -0
  350. data/templates/spec/client/Screen.coffee +5 -0
  351. data/templates/spec/client/helpers/ClientHelpers.coffee +5 -0
  352. data/templates/spec/client/models/ModelSpec.coffee +5 -0
  353. data/templates/spec/client/views/ViewSpec.coffee +5 -0
  354. data/{lib/lanes/command/templates → templates}/spec/fixtures/namespace/model.yml +0 -0
  355. data/{lib/lanes/command/templates/spec/namespace → templates/spec/server}/model_spec.rb +2 -2
  356. data/{lib/lanes/command/templates/spec/spec_helper.rb → templates/spec/server/spec_helpers.rb} +3 -2
  357. data/views/index.erb +5 -4
  358. data/views/specs.erb +2 -1
  359. metadata +273 -238
  360. data/client/lanes/components/grid/vendor/dataTables.bootstrap.js +0 -156
  361. data/client/lanes/components/grid/vendor/datatables.responsive.js +0 -666
  362. data/client/lanes/components/modal/_index.scss +0 -20
  363. data/client/lanes/components/popover/_index.scss +0 -1
  364. data/client/lanes/components/record_finder/RecordFinder.coffee +0 -143
  365. data/client/lanes/components/select_field/SelectField.coffee +0 -87
  366. data/client/lanes/extension/GlAccounts.coffee +0 -9
  367. data/client/lanes/minimal.js +0 -11
  368. data/client/lanes/minimal.scss.erb +0 -12
  369. data/client/lanes/styles/components/all.scss +0 -6
  370. data/client/lanes/styles/components/changes-notification.scss +0 -44
  371. data/client/lanes/styles/components/suggest.scss +0 -266
  372. data/client/lanes/styles/index.css +0 -4
  373. data/client/lanes/styles/layout.scss +0 -272
  374. data/client/lanes/styles/screens.scss +0 -66
  375. data/client/lanes/styles/tabs.scss +0 -148
  376. data/client/lanes/styles/vendor/bootstrap.scss +0 -74
  377. data/client/lanes/workspace.scss.erb +0 -29
  378. data/client/lanes-complete.js +0 -3
  379. data/client/lanes-workspace.scss.erb +0 -21
  380. data/db/migrate/20140615031600_create_hip_users.rb +0 -17
  381. data/lib/lanes/command/templates/Gemfile +0 -9
  382. data/lib/lanes/command/templates/Rakefile +0 -2
  383. data/lib/lanes/command/templates/client/Extension.coffee +0 -5
  384. data/lib/lanes/command/templates/client/components/Component.coffee +0 -1
  385. data/lib/lanes/command/templates/client/models/BaseModel.coffee +0 -5
  386. data/lib/lanes/command/templates/client/views/BaseView.coffee +0 -5
  387. data/lib/lanes/command/templates/client/views/View.coffee +0 -7
  388. data/lib/lanes/command/templates/config/screen.rb +0 -8
  389. data/lib/lanes/command/templates/lib/namespace/base_model.rb +0 -9
  390. data/lib/lanes/command/templates/lib/namespace/version.rb +0 -3
  391. data/lib/lanes/command/templates/lib/namespace.rb +0 -12
  392. data/lib/lanes/command/templates/spec/client/Screen.coffee +0 -7
  393. data/lib/lanes/command/templates/spec/client/models/ModelSpec.coffee +0 -5
  394. data/lib/lanes/command/templates/spec/client/views/ViewSpec.coffee +0 -5
  395. data/lib/lanes/db/migration_helpers.rb +0 -178
  396. data/public/javascripts/jasmine_examples/Player.js +0 -22
  397. data/public/javascripts/jasmine_examples/Song.js +0 -7
  398. data/spec/command_spec.rb +0 -49
  399. data/spec/helpers/jasmine-jquery.js +0 -813
@@ -21,8 +21,11 @@ module Lanes
21
21
  def run_task(task)
22
22
  Command.load_current_extension
23
23
  require_relative "../rake_tasks"
24
+ say("Executing " + task)
24
25
  Extensions.each do |ext|
25
26
  Dir.chdir(ext.root_path) do
27
+ say("\t" + ext.identifier)
28
+ Rake::Task[task].reenable
26
29
  Rake::Task[task].invoke
27
30
  end
28
31
  end
@@ -35,17 +35,17 @@ module Lanes
35
35
  end
36
36
 
37
37
  def create_model
38
- template "lib/namespace/model.rb", "lib/#{namespace}/#{file_name}.rb"
39
- template "spec/namespace/model_spec.rb", "#{spec_dir}/#{file_name}.rb"
38
+ template "lib/namespace/model.rb", "lib/#{namespace}/models/#{file_name}.rb"
39
+ template "spec/server/model_spec.rb", "spec/server/#{file_name}_spec.rb"
40
40
  template "spec/fixtures/namespace/model.yml",
41
41
  "spec/fixtures/#{namespace}/#{file_name}.yml"
42
42
  end
43
43
 
44
44
  def create_client
45
45
  self.fields.unshift ModelAttribute.parse("id:integer")
46
- template "client/models/Model.coffee", \
46
+ template "client/models/Model.coffee",
47
47
  "#{client_dir}/models/#{class_name}.coffee"
48
- template "spec/client/models/ModelSpec.coffee", \
48
+ template "spec/client/models/ModelSpec.coffee",
49
49
  "#{spec_dir}/models/#{class_name}Spec.coffee"
50
50
  end
51
51
 
@@ -8,31 +8,33 @@ module Lanes
8
8
  title: '',
9
9
  description: '',
10
10
  icon: '',
11
- group_id: '',
11
+ group_id: 'system',
12
12
  model_class: '',
13
13
  namespace: nil
14
14
  }
15
15
  class_options( OPTIONS )
16
16
 
17
- def set_defaults
17
+ attr_reader :screen_id
18
+
19
+ def set_variables
20
+ super
18
21
  options[:title] = name.titleize if options[:title].blank?
22
+ @screen_id = class_name.underscore.dasherize
19
23
  end
20
24
 
21
25
  def create_screen
22
- template "client/screens/index.js", "#{client_dir}/screens/#{name}/index.js"
23
- template "client/screens/styles.scss", "#{client_dir}/screens/#{name}/index.scss"
24
- template "client/screens/Screen.coffee",
25
- "#{client_dir}/screens/#{name}/#{class_name}.coffee"
26
- template "client/screens/layout.html", "#{client_dir}/screens/#{name}/layout.html"
27
- template "spec/client/Screen.coffee", "#{spec_dir}/screens/#{class_name}.coffee"
26
+ template "client/screens/index.js", "#{client_dir}/screens/#{screen_id}/index.js"
27
+ template "client/screens/styles.scss", "#{client_dir}/screens/#{screen_id}/index.scss"
28
+ template "client/screens/Screen.coffee", "#{client_dir}/screens/#{screen_id}/#{class_name}.coffee"
29
+ template "client/screens/layout.html", "#{client_dir}/screens/#{screen_id}/layout.html"
30
+ template "spec/client/Screen.coffee", "#{spec_dir}/screens/#{screen_id}/#{class_name}Spec.coffee"
28
31
  end
29
32
 
30
33
  def add_definition
31
- insert_into_file "config/screens.rb", after: "" do
34
+ append_to_file "config/screens.rb" do
32
35
  source = File.expand_path(find_in_source_paths("config/screen.rb"))
33
36
  ERB.new(::File.binread(source), nil, "-","@output_buffer").result(binding)
34
37
  end
35
-
36
38
  end
37
39
  end
38
40
  end
@@ -10,24 +10,27 @@ module Lanes
10
10
  }
11
11
  class_options( OPTIONS )
12
12
 
13
+ def set_variables
14
+ super
15
+ if options[:screen] == 'global'
16
+ @client_dir << "/views"
17
+ @spec_dir << "/views"
18
+ else
19
+ @client_dir << "/screens/#{options[:screen].underscore.dasherize}"
20
+ @spec_dir << "/screens/#{options[:screen].underscore.dasherize}"
21
+ end
22
+ end
23
+
13
24
  # desc "foo bar"
14
25
  # option :from, :required => true
15
26
 
16
27
  def create_screen
17
28
  template "client/views/View.coffee", "#{client_dir}/#{name.classify}.coffee"
18
29
  template "spec/client/views/ViewSpec.coffee", \
19
- "#{spec_dir}/views/#{class_name}Spec.coffee"
30
+ "#{spec_dir}/#{class_name}Spec.coffee"
20
31
  end
21
32
 
22
- private
23
33
 
24
- def client_dir
25
- if options[:screen] == 'global'
26
- "client/#{namespace}/views"
27
- else
28
- "client/#{namespace}/screens/#{options[:screen].dasherize}"
29
- end
30
- end
31
34
  end
32
35
 
33
36
  end
@@ -6,21 +6,23 @@ module Lanes
6
6
 
7
7
  argument :name
8
8
 
9
- attr_reader :namespace, :class_name, :client_dir, :spec_dir
9
+ attr_reader :namespace, :class_name, :client_dir, :spec_dir, :identifier
10
10
 
11
11
  def self.source_root
12
- Pathname.new(__FILE__).dirname.join("templates")
12
+ Pathname.new(__FILE__).dirname.join("..","..","..","templates")
13
13
  end
14
14
 
15
15
  def load_namespace
16
16
  @namespace = options[:namespace] ||
17
- Command.load_current_extension(raise_on_fail:true).identifier
17
+ Command.load_current_extension(raise_on_fail:true)
18
+ .identifier.underscore.camelize
19
+ @identifier = @namespace.underscore.dasherize
18
20
  end
19
21
 
20
22
  def set_variables
21
23
  @class_name = name.underscore.classify
22
- @spec_dir = "spec/#{namespace}"
23
- @client_dir = "client/#{namespace}"
24
+ @spec_dir = "spec/#{identifier}"
25
+ @client_dir = "client/#{identifier}"
24
26
  end
25
27
 
26
28
  end
@@ -1,4 +1,4 @@
1
- require 'guard'
1
+ require 'guard/cli'
2
2
 
3
3
  module Lanes
4
4
  module Command
data/lib/lanes/command.rb CHANGED
@@ -28,11 +28,7 @@ module Lanes
28
28
  stack = e.backtrace[0..4].join("\n")
29
29
  raise Thor::Error.new("Loading ./lib/*/extension.rb failed with: #{e}\n#{stack}")
30
30
  end
31
- all = Extensions.all
32
- if all.any?
33
- diff = all - previous
34
- return diff.any? ? diff.first.new : Extensions.all.first.new
35
- end
31
+ Extensions.controlling
36
32
  else
37
33
  return _maybe_fail(raise_on_fail)
38
34
  end
@@ -42,6 +38,7 @@ module Lanes
42
38
  raise Thor::Error.new("Unable to locate Lanes environment.\nDoes ./lib/*/extension.rb exist?") if should_raise
43
39
  return nil
44
40
  end
41
+
45
42
  end
46
43
  end
47
44
  end
@@ -7,7 +7,7 @@ module Lanes
7
7
 
8
8
  # @param names [Symbol] list of components to include in applications
9
9
  def enable(*names)
10
- @@enabled += names.map(&:to_sym)
10
+ @@enabled += names.map(&:to_s)
11
11
  @@enabled.uniq!
12
12
  end
13
13
 
@@ -8,7 +8,7 @@ module Lanes
8
8
 
9
9
  module ClassMethods
10
10
 
11
- def compose_query_using_detail_view( view: view, join_to: join_to )
11
+ def compose_query_using_detail_view( view: nil, join_to: nil )
12
12
  view = Lanes.config.table_prefix + view.to_s
13
13
  joins("join #{view} as details on details.#{join_to} = #{table_name}.#{primary_key}")
14
14
  .select("#{table_name}.*, details.*")
@@ -1,6 +1,5 @@
1
1
  module Lanes::Concerns
2
2
 
3
-
4
3
  module ApiAttributeAccess
5
4
 
6
5
 
@@ -15,7 +14,7 @@ module Lanes::Concerns
15
14
  module AccessChecks
16
15
  # Can the API read data from the model?
17
16
  def can_read_attributes?(params, user)
18
- return user.can_write?(self, params)
17
+ return user.can_read?(self, params)
19
18
  end
20
19
 
21
20
  # Can the API write data to the model?
@@ -88,13 +87,12 @@ module Lanes::Concerns
88
87
 
89
88
  return {} unless self.can_write_attributes?(data, user)
90
89
 
91
- data.each_with_object(Hash.new) do | kv, result |
92
- ( key, value ) = kv
93
-
90
+ data.each_with_object(Hash.new) do | (key, value), result |
94
91
  # First we set all the attributes that are allowed
95
92
  if self.setting_attribute_is_allowed?(key.to_sym, user)
96
- public_send("#{key}=",result[key] = value)
97
- else
93
+ result[key] = value
94
+ public_send("#{key}=", value)
95
+ elsif value.present?
98
96
  # allow nested params to be specified using Rails _attributes
99
97
  name = key.to_s.gsub(/_attributes$/,'').to_sym
100
98
 
data/lib/lanes/db.rb CHANGED
@@ -9,7 +9,8 @@ module Lanes
9
9
  if ENV['DATABASE_URL']
10
10
  ::ActiveRecord::Base.establish_connection( ENV['DATABASE_URL'] )
11
11
  else
12
- config = YAML::load( IO.read( config_file || "config/database.yml" ) )
12
+ file = config_file || Extensions.controlling.root_path.join("config","database.yml")
13
+ config = YAML::load( IO.read(file) )
13
14
  ::ActiveRecord::Base.configurations = config
14
15
  ::ActiveRecord::Base.establish_connection( ::ActiveRecord::Base.configurations[ env ] )
15
16
  end
@@ -22,10 +23,10 @@ module Lanes
22
23
 
23
24
  def configure_rake_environment
24
25
  ActiveRecord::Tasks::DatabaseTasks.seed_loader = Lanes::DB
26
+ default_schema = Extensions.controlling.root_path.join("db","schema.sql")
25
27
  env = ENV['RAILS_ENV'] || 'development'
26
- Lanes::DB.config_file ||= 'config/database.yml'
27
- ENV['SCHEMA'] ||= 'db/schema.sql'
28
- ENV['DB_STRUCTURE'] ||= 'db/schema.sql'
28
+ ENV['SCHEMA'] ||= default_schema.to_s
29
+ ENV['DB_STRUCTURE'] ||= default_schema.to_s
29
30
  ActiveRecord::Base.schema_format = :sql
30
31
  Lanes::DB.establish_connection( env )
31
32
  ActiveRecord::Tasks::DatabaseTasks.database_configuration = ActiveRecord::Base.configurations
@@ -0,0 +1,95 @@
1
+ module Lanes
2
+ module Extensions
3
+
4
+ class Definition
5
+ include ::Lanes::Concerns::AttrAccessorWithDefault
6
+
7
+ def self.inherited(klass)
8
+ if Extensions.controlling_locked
9
+ ALL.unshift(klass)
10
+ else
11
+ ALL << klass
12
+ end
13
+ end
14
+
15
+ attr_reader :context
16
+
17
+ attr_accessor_with_default :load_phase, :late
18
+
19
+ attr_accessor_with_default :identifier
20
+
21
+ # Array of Pathname's to add to sprockets
22
+ attr_accessor_with_default :root_path
23
+
24
+ # Does the extension use PubSub functionality
25
+ class_attribute :uses_pub_sub
26
+
27
+ # Load extension before/after the named extensions
28
+ class_attribute :before
29
+ class_attribute :after
30
+
31
+ def self.components(*names)
32
+ Components.enable(*names)
33
+ end
34
+
35
+ def client_bootstrap_data(view)
36
+ {}
37
+ end
38
+
39
+ def stylesheet_include
40
+ self.identifier + '/styles'
41
+ end
42
+
43
+ def javascript_include
44
+ self.identifier
45
+ end
46
+
47
+ def client_namespace
48
+ identifier.underscore.camelize
49
+ end
50
+
51
+ def client_paths
52
+ [ root_path.join('client') ]
53
+ end
54
+
55
+ def client_images
56
+ images = []
57
+ root_path.join('client','images').find{|path| images << path if path.file? }
58
+ images
59
+ end
60
+
61
+ def route(route_set)
62
+ routes_config = root_path.join('config','routes.rb')
63
+ if routes_config.exist?
64
+ require routes_config
65
+ end
66
+ end
67
+
68
+ def on_boot
69
+ end
70
+
71
+ end
72
+
73
+ class Base < Definition
74
+ identifier "lanes"
75
+
76
+ root_path Pathname.new(__FILE__).dirname.join("..","..","..").expand_path
77
+ def stylesheet_include
78
+ nil
79
+ end
80
+
81
+ def javascript_include
82
+ nil
83
+ end
84
+
85
+ def on_boot
86
+ if Lanes.env.test? && Extensions.controlling.class == self.class
87
+ Extensions.lock_controlling!
88
+ require_relative("../workspace/extension")
89
+ end
90
+ end
91
+
92
+ end
93
+
94
+ end
95
+ end
@@ -1,65 +1,9 @@
1
1
  module Lanes
2
2
 
3
3
  module Extensions
4
+ mattr_accessor :controlling_locked
4
5
 
5
- class Definition
6
- include Concerns::AttrAccessorWithDefault
7
-
8
- attr_reader :context
9
-
10
- attr_accessor_with_default :load_phase, :late
11
-
12
- attr_accessor_with_default :identifier
13
-
14
- # Array of Pathname's to add to sprockets
15
- attr_accessor_with_default :root_path
16
-
17
- # Does the extension use PubSub functionality
18
- class_attribute :uses_pub_sub
19
- class_attribute :uses_workspace
20
-
21
- # Load extension before/after the named extensions
22
- class_attribute :before
23
- class_attribute :after
24
-
25
- def self.components(*names)
26
- Components.enable(*names)
27
- end
28
-
29
- def client_bootstrap_data(view)
30
- {}
31
- end
32
-
33
- def stylesheet_include
34
- self.identifier + '/styles'
35
- end
36
-
37
- def javascript_include
38
- self.identifier
39
- end
40
-
41
- def client_namespace
42
- identifier.underscore.camelize
43
- end
44
-
45
- def client_paths
46
- [ root_path.join('client') ]
47
- end
48
-
49
- def client_images
50
- images = []
51
- root_path.join('client','images').find{|path| images << path if path.file? }
52
- images
53
- end
54
-
55
- def route(route_set)
56
- routes_config = root_path.join('config','routes.rb')
57
- if routes_config.exist?
58
- require routes_config
59
- end
60
- end
61
-
62
- end
6
+ ALL=Array.new
63
7
 
64
8
  class << self
65
9
 
@@ -72,6 +16,12 @@ module Lanes
72
16
  end
73
17
  end
74
18
 
19
+ # lock the current controlling extension so that it can't
20
+ # be changed by other extensions that are loaded later
21
+ def lock_controlling!
22
+ self.controlling_locked=true
23
+ end
24
+
75
25
  def load_after(extension)
76
26
  self.after = extension
77
27
  end
@@ -81,15 +31,28 @@ module Lanes
81
31
  end
82
32
 
83
33
  def all
84
- Definition.descendants
34
+ ALL
85
35
  end
86
36
 
87
37
  def require_workspace?
88
- all.detect{|ext| ext.uses_workspace }
38
+ all.any?{|ext| ext.uses_workspace }
89
39
  end
90
40
 
91
41
  def require_pub_sub?
92
- all.detect{|ext| ext.uses_pub_sub }
42
+ all.any?{|ext| ext.uses_pub_sub }
43
+ end
44
+
45
+ def each_asset(phase: :early, type: :js)
46
+ each do |ext|
47
+ if phase == :all || ext.load_phase == phase
48
+ asset = case type
49
+ when :js then ext.javascript_include
50
+ when :css then ext.stylesheet_include
51
+ else nil
52
+ end
53
+ yield asset unless asset.nil?
54
+ end
55
+ end
93
56
  end
94
57
 
95
58
  def sorted
@@ -120,17 +83,16 @@ module Lanes
120
83
  sorted.map{ |klass| yield klass.new }
121
84
  end
122
85
 
123
- def early_loaded
124
- each{ |ext| yield ext if ext.load_phase == :early }
125
- end
126
-
127
- def late_loaded
128
- each{ |ext| yield ext if ext.load_phase == :late }
86
+ def controlling
87
+ last = ALL.last
88
+ each{|ext| return ext if ext.is_a?(last) }
89
+ LanesExtension.new # fallback if can't find an extension
129
90
  end
130
91
 
131
92
  def client_bootstrap_data(view)
132
93
  data = {
133
94
  csrf_token: Rack::Csrf.csrf_token(view.env),
95
+ controlling_extension: controlling.identifier,
134
96
  root_view: Lanes.config.root_view,
135
97
  api_path: Lanes.config.mounted_at,
136
98
  initial_workspace_screen_id: Lanes.config.initial_workspace_screen_id,
@@ -146,8 +108,8 @@ module Lanes
146
108
  each{|ext| }
147
109
  end
148
110
 
149
- def load_current_config
150
- config_file = Pathname.getwd.join('config','lanes.rb')
111
+ def load_controlling_config
112
+ config_file = self.controlling.root_path.join('config','lanes.rb')
151
113
  if config_file.exist?
152
114
  require config_file
153
115
  end
@@ -157,4 +119,7 @@ module Lanes
157
119
 
158
120
  end
159
121
 
122
+
160
123
  end
124
+
125
+ require_relative 'extension/definition'
@@ -35,8 +35,8 @@ module Lanes
35
35
  dsl.guard :minitest, :all_on_start => true do
36
36
  dsl.watch(%r{^spec/spec_helper\.rb}) { 'test' }
37
37
  dsl.watch(%r{^spec/.+_spec\.rb})
38
- dsl.watch(%r{^spec/fixtures/#{app_name}/(.+)s\.yml}) { |m| "spec/#{m[1]}_spec.rb" }
39
- dsl.watch(%r{^lib/#{app_name}/(.+)\.rb}) { |m| "spec/#{m[1]}_spec.rb" }
38
+ dsl.watch(%r{^spec/fixtures/#{app_name}/(.+)s\.yml}) { |m| "spec/server/#{m[1]}_spec.rb" }
39
+ dsl.watch(%r{^lib/#{app_name}/(.+)\.rb}) { |m| "spec/server/#{m[1]}_spec.rb" }
40
40
  matchers.server_matches.call if matchers.server_matches
41
41
  end
42
42
 
data/lib/lanes/screen.rb CHANGED
@@ -36,6 +36,14 @@ module Lanes
36
36
  Extensions.load_screens
37
37
  GROUPS.values.each{ | group | yield group }
38
38
  end
39
+
40
+ def config_file
41
+ Lanes::Extensions.controlling.root_path.join("config","screens.rb")
42
+ end
43
+
44
+ def uncache_file_on_update(asset)
45
+ asset.depend_on(config_file) if config_file.exist?
46
+ end
39
47
  end
40
48
 
41
49
  class Group
@@ -11,9 +11,6 @@ require 'minitest/spec'
11
11
  require 'minitest/autorun'
12
12
  require 'mocha/mini_test'
13
13
 
14
- require_relative 'testing_models'
15
-
16
-
17
14
  RAILS_ENV = "test"
18
15
  I18n.enforce_available_locales = true
19
16
  Lanes::DB.establish_connection('test')
@@ -37,14 +34,9 @@ module Lanes
37
34
 
38
35
  class TestCase < ActiveSupport::TestCase
39
36
  include Lanes
40
- include ActiveRecordMocks::IncludeMe
41
37
 
42
38
  include ActiveRecord::TestFixtures
43
39
  self.fixture_path = Pathname.new(__FILE__).dirname.join('fixtures')
44
- # setup do
45
- # #Thread.current[:lanes_current_user] = lanes_users(:admin)
46
- # #Lanes::Access.calculate_model_access!
47
- # end
48
40
 
49
41
  self.use_transactional_fixtures = true
50
42
  fixtures :all
@@ -121,6 +113,7 @@ module MiniTest
121
113
  def assert_saves( model )
122
114
  assert model.save, "#{model.class} failed to save: #{model.errors.full_messages.join(',')}"
123
115
  end
116
+
124
117
  def refute_saves( model, *errors )
125
118
  refute model.save, "#{model.class} saved successfully when it should not have"
126
119
  errors.each do |error|
@@ -131,7 +124,6 @@ module MiniTest
131
124
 
132
125
  end
133
126
 
134
-
135
127
  def assert_event_fires( klass, event, &block )
136
128
  @event_results = []
137
129
  klass.observe(event) do | *args |
@@ -146,31 +138,3 @@ module MiniTest
146
138
  end
147
139
  end
148
140
  end
149
-
150
-
151
- module FixtureHelpers
152
-
153
- extend ActiveSupport::Concern
154
-
155
- included do
156
- alias_method_chain :table_rows, :custom_autoset_fields
157
- end
158
-
159
- def table_rows_with_custom_autoset_fields
160
- results = table_rows_without_custom_autoset_fields
161
- if model_class
162
- results[ table_name ].each do | row |
163
- row['visible_id'] = Lanes::SequentialId.next_for( model_class ) if model_class.column_names.include?('visible_id')
164
- row['hash_code' ] = Lanes::Strings.random if model_class.column_names.include?('hash_code')
165
- row['created_at'] = Time.now if model_class.column_names.include?('created_at')
166
- row['updated_at'] = Time.now if model_class.column_names.include?('updated_at')
167
- # 135138680 == "admin"
168
- row['created_by_id'] = 135138680 if model_class.column_names.include?('created_by_id')
169
- row['updated_by_id'] = 135138680 if model_class.column_names.include?('updated_by_id')
170
- end
171
- end
172
- results
173
- end
174
- end
175
-
176
- ActiveRecord::FixtureSet.send :include, FixtureHelpers
data/lib/lanes/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Lanes
2
2
 
3
- VERSION = "0.1.2"
3
+ VERSION = "0.1.5"
4
4
 
5
5
  end
@@ -0,0 +1,28 @@
1
+ module Lanes
2
+ module Workspace
3
+ class Extension < Lanes::Extensions::Definition
4
+
5
+ identifier "lanes-workspace"
6
+
7
+ root_path Pathname.new(__FILE__).dirname.expand_path
8
+
9
+ def stylesheet_include
10
+ 'lanes/workspace/styles'
11
+ end
12
+
13
+ def javascript_include
14
+ 'lanes/workspace'
15
+ end
16
+
17
+ def client_namespace
18
+ 'Workspace'
19
+ end
20
+
21
+ def client_paths
22
+ []
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,7 @@
1
+ module Lanes
2
+ module Workspace
3
+ end
4
+ end
5
+
6
+ require_relative 'access'
7
+ require_relative 'workspace/extension'
@@ -12,8 +12,8 @@
12
12
  "ampersand-collection-view": "~1.1",
13
13
  "ampersand-rest-collection": "~2.0",
14
14
  "ampersand-collection-underscore-mixin": "~1.0",
15
- "ampersand-collection": "~1.3",
16
- "ampersand-subcollection": "~1.5",
15
+ "ampersand-collection": "~1.4",
16
+ "ampersand-subcollection": "~2.0",
17
17
  "ampersand-router": "~1.0",
18
18
  "ampersand-dom-bindings": "~3.3",
19
19
  "underscore.inflections": "~0.2.1",
@@ -95,7 +95,7 @@ Foo = (function() {
95
95
 
96
96
  Bar.extend(Foo);
97
97
 
98
- })(window.Lanes,(window.Lanes ? window.Lanes['Foo'] : null),window._, window,{namespace:(window.Lanes ? window.Lanes['Foo'] : null),extensionName:'Foo',path:'baz'});
98
+ })(window.Lanes,(window.Lanes ? window.Lanes['Foo'] : null),window._, window,{namespace:(window.Lanes ? window.Lanes['Foo'] : null),extensionName:'Foo',path:["foo","bar","baz"]});
99
99
  EOS
100
100
 
101
101
  Scope = Struct.new(:logical_path)