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
@@ -0,0 +1,118 @@
1
+ # ------------------------------------------------------------------ #
2
+ # Handles Association definitions. #
3
+ # It creates a derived definition for each one #
4
+ # and contains utility functions to operate on them #
5
+ # ------------------------------------------------------------------ #
6
+ class Lanes.Models.AssocationMap
7
+ constructor: (@klass)->
8
+ @klass::derived ||= {}
9
+ @definitions = @klass::associations
10
+ @definitions['created_by'] ||= { model: 'Lanes.Models.User', readOnly: true }
11
+ @definitions['updated_by'] ||= { model: 'Lanes.Models.User', readOnly: true }
12
+ for name, options of @definitions
13
+ @klass::derived[name] = this.derivedDefinition(name,options)
14
+
15
+ getClassFor: (name)->
16
+ definition = @definitions[name]
17
+ object = definition.model || definition.collection
18
+ Lanes.u.findObject( object, 'Models', @klass::FILE)
19
+
20
+ getOptions: (name, definition, model)->
21
+ options = { parent: model }
22
+ if definition.options
23
+ _.extend(options, Lanes.u.resultsFor(model,definition.options))
24
+ options
25
+
26
+ # will be called in the scope of the model
27
+ createModel: (association, name, definition, fk, pk, target_klass)->
28
+ target_klass ||= association.getClassFor(name)
29
+ options = association.getOptions(name,definition,this)
30
+ model_id = this.get(pk)
31
+ if model_id && model_id == this._cache[name]?.id
32
+ this._cache[name]
33
+ else
34
+ target_klass.findOrCreate(options)
35
+
36
+ # will be called in the scope of the model
37
+ createCollection: (association, name, definition, fk, pk, target_klass)->
38
+ target_klass ||= association.getClassFor(name)
39
+ options = association.getOptions(name,definition,this)
40
+ options.filter ||= {}
41
+ options.filter[fk]=this.get(pk)
42
+
43
+ if target_klass::isCollection
44
+ new target_klass(options.models||[],options)
45
+ else
46
+ options.model=target_klass
47
+ new Lanes.Models.AssociationCollection(options.models||[],options)
48
+ # returns the definition for the derived property
49
+ derivedDefinition: (name,definition)->
50
+ # me = this
51
+ # target_klass = this.getClassFor(name)
52
+ # fk = this.fk(name) ; pk = this.pk(name)
53
+
54
+ # if definition.defaultValue
55
+ # _.defaults(args, _.evaluateFunction(definition.defaultValue))
56
+ createFn = _.partial(
57
+ if definition.model then this.createModel else this.createCollection,
58
+ this, name, definition, this.fk(name), this.pk(name), this.getClassFor(name)
59
+ )
60
+ { deps: [this.pk(name)], fn: createFn }
61
+
62
+ # createAssocation = if definition.model then ->
63
+ # target_klass ||= me.getClassFor(name)
64
+ # _.extend(args, parent: this)
65
+ # model_id = this.get(pk)
66
+ # if model_id && model_id == this._cache[name]?.id
67
+ # this._cache[name]
68
+ # else
69
+ # target_klass.findOrCreate(args)
70
+ # else ->
71
+ # target_klass ||= me.getClassFor(name)
72
+ # filter = {}
73
+ # filter[ fk ] = this.get( pk)
74
+ # _.extend(args, filter: filter, parent: this)
75
+ # if target_klass::isCollection
76
+ # new target_klass([],args)
77
+ # else
78
+ # args.model=target_klass
79
+ # new Lanes.Models.AssociationCollection(args)
80
+ # { deps: [pk], fn: createFn }
81
+
82
+ # Sets the assocations for "model"
83
+ set: (model, data)->
84
+ for name, value of data
85
+ if @definitions[name]
86
+ attributes = if _.isFunction(value.serialize) then value.serialize() else value
87
+ model[name].set( attributes )
88
+
89
+ pk: (name)->
90
+ def = @definitions[name]
91
+ return null unless name
92
+ def.pk || ( if def.model then "#{name}_id" else "id" )
93
+
94
+ fk: (name)->
95
+ def = @definitions[name]
96
+ return null unless name
97
+ def.fk || ( if def.model then "id" else "#{name}_id" )
98
+
99
+ # returns the data from all assocations for saving
100
+ dataForSave: (model,options)->
101
+ ret = {}
102
+ options.saveDepth = ( if options.saveDepth then options.saveDepth+1 else 1 )
103
+ return ret if options.saveDepth > 5
104
+ for name, assoc_options of @definitions
105
+ unless assoc_options.readOnly
106
+ data = model[name].dataForSave(options)
107
+ unless _.isEmpty( data )
108
+ ret[name] = data
109
+
110
+ ret
111
+
112
+ # return a list of assocations from "name" that are not loaded
113
+ nonLoaded: (model, names)->
114
+ list = []
115
+ for name in names
116
+ if _.has(@definitions, name) && model[name].isNew()
117
+ list.push(name)
118
+ list
@@ -1,5 +1,5 @@
1
-
2
1
  class ModelType extends Lanes.Models.State
2
+
3
3
  constructor: ->
4
4
  super
5
5
  @records = {}
@@ -9,7 +9,7 @@ class ModelType extends Lanes.Models.State
9
9
  records: 'object'
10
10
 
11
11
  subscribe: (model)->
12
- channel = "/#{model.api_path}/#{model.id}"
12
+ channel = "/#{model.api_path()}/#{model.id}"
13
13
  Lanes.Vendor.MessageBus.subscribe(channel,(changes)->
14
14
  model.addChangeSet(changes)
15
15
  )
@@ -27,13 +27,13 @@ class ModelType extends Lanes.Models.State
27
27
  delete @records[model.id]
28
28
 
29
29
 
30
-
31
30
  class ModelTypesCollection extends Lanes.Models.BasicCollection
31
+
32
32
  constructor: -> super
33
33
  model: ModelType
34
34
 
35
35
  forModel: (model)->
36
- models = this.get(model.api_path) || this.add(id: model.api_path)
36
+ models = this.get(model.api_path()) || this.add(id: model.api_path())
37
37
 
38
38
 
39
39
  Lanes.Models.PubSub = {
@@ -51,7 +51,7 @@ Lanes.Models.PubSub = {
51
51
  @types.forModel(model).remove(model)
52
52
 
53
53
  instanceFor: ( model_klass, id )->
54
- @types.get(model_klass.prototype.api_path)?.records[id]?.model
54
+ @types.get(model_klass.prototype.api_path())?.records[id]?.model
55
55
 
56
56
  clear: ->
57
57
  @types = new ModelTypesCollection
@@ -2,21 +2,21 @@ class Field extends Lanes.Models.Base
2
2
 
3
3
  constructor: (attributes)->
4
4
  super( _.defaults( attributes, {
5
- title: _.titleize(attributes.field)
5
+ title: _.titleize(attributes.id)
6
6
  }))
7
7
 
8
8
  session:
9
+ id: 'string'
9
10
  title: 'string'
10
- field: 'string'
11
11
  selected: 'boolean'
12
- type:
13
- type: 'string'
14
- default: -> @model_field?.type
15
12
 
16
13
  derived:
17
14
  model_field:
18
- deps: ['field'], fn:->
19
- this.collection.query.model_class::_definition[@field]
15
+ deps: ['id'], fn:->
16
+ this.collection.query.modelClass::_definition[@id]
17
+ type:
18
+ deps: ['model_field'], fn: ->
19
+ @model_field?.type
20
20
 
21
21
  validValue: (value)->
22
22
  if this.type == 'n'
@@ -30,8 +30,8 @@ class AvailableFields extends Lanes.Models.Collection
30
30
  constructor: (models,options)->
31
31
  @query = options.query
32
32
  super
33
- model: Field
34
33
 
34
+ model: Field
35
35
 
36
36
 
37
37
  class Operator extends Lanes.Models.Base
@@ -76,9 +76,15 @@ class Clause extends Lanes.Models.Base
76
76
 
77
77
  session:
78
78
  value : { type: 'string', default: '' }
79
- operators : 'collection'
80
- field : 'model'
81
- operator : 'model'
79
+ field : 'state'
80
+ operator : 'state'
81
+
82
+ associations:
83
+ operators : { collection: Operators }
84
+ fields:
85
+ collection: AvailableFields, options: ->
86
+ query: this.collection.query
87
+
82
88
 
83
89
  derived:
84
90
  description:
@@ -89,10 +95,9 @@ class Clause extends Lanes.Models.Base
89
95
  deps: ['field', 'operator', 'value']
90
96
  fn: -> this.field.validValue(@value)
91
97
 
92
- initialize:(attrs,options)->
98
+ constructor: (options)->
93
99
  super
94
- @operators = new Operators
95
- @fields = @collection.fields
100
+ this.fields.reset(options.available_fields.models)
96
101
  @operators.field = @fields.first()
97
102
  @fields.on('change:selected', this.setField, this)
98
103
  @operators.on('change:selected', this.setOperator, this)
@@ -100,7 +105,12 @@ class Clause extends Lanes.Models.Base
100
105
  @fields.at(0).selected = true
101
106
  @operators.at(0).selected = true
102
107
 
103
- window.q = this
108
+
109
+ setFromView: (type, val)->
110
+ if type=="fields" || type == "operators"
111
+ this[type].get(val).selected=true
112
+ else
113
+ super
104
114
 
105
115
  setField: (field)->
106
116
  return unless field.selected
@@ -120,7 +130,7 @@ class Clause extends Lanes.Models.Base
120
130
  value = this.get('value')
121
131
  value +='%' if 'like' == op
122
132
  value = parseFloat(value) if @field.type == "n"
123
- param[ this.field.field ] = if 'eq' == op then value else { op: op, value: value }
133
+ param[ this.field.id ] = if 'eq' == op then value else { op: op, value: value }
124
134
  param
125
135
 
126
136
 
@@ -139,26 +149,26 @@ class Lanes.Models.Query extends Lanes.Models.Base
139
149
  session:
140
150
  fields: 'collection'
141
151
  clauses: 'collection'
142
- collection_class: 'function'
143
- initial_field: 'string'
152
+ modelClass: 'function'
153
+ initialField: 'state'
144
154
 
145
155
  derived:
146
- model_class:
147
- deps:['collection_class'], fn: -> @collection_class::model
156
+ collection_class:
157
+ deps:['modelClass'], fn: -> @modelClass?.Collection
148
158
  url:
149
- deps:['collection_class'], fn: -> @collection_class::url()
159
+ deps:['modelClass'], fn: -> @modelClass?::urlRoot()
150
160
 
151
161
  constructor: (options={})->
152
162
  super
153
163
  @fields = new AvailableFields(
154
- _.map( options.fields, (col)-> if _.isObject(col) then col else { field: col } ),
164
+ _.map( options.fields, (col)-> if _.isObject(col) then col else { id: col } ),
155
165
  query: this
156
166
  )
157
167
  @clauses = new Clauses([], query: this )
158
168
  this.listenTo(@clauses,'change remove reset', ->
159
169
  this.trigger('change', arguments...)
160
170
  )
161
- @initial_field = @fields.first.field
171
+ @initialField = @fields.first()
162
172
  this.addNewClause()
163
173
  this
164
174
 
@@ -167,11 +177,11 @@ class Lanes.Models.Query extends Lanes.Models.Base
167
177
 
168
178
  loadSingle: (code,options)->
169
179
  options.query = {}
170
- options.query[ @initial_field ] = code
171
- @collection_class::model.fetch(options)
180
+ options.query[ @initialField ] = code
181
+ @modelClass.fetch(options)
172
182
 
173
183
  defaultField: ->
174
- @fields.findWhere( field: @initial_field )
184
+ @fields.findWhere( field: @initialField )
175
185
 
176
186
  asParams: ->
177
187
  params = {}
@@ -181,4 +191,4 @@ class Lanes.Models.Query extends Lanes.Models.Base
181
191
  params
182
192
 
183
193
  addNewClause: ->
184
- @clauses.add({ field: @initial_field, operator: 'like' })
194
+ @clauses.add({ available_fields: @fields, field: @initialField })
@@ -48,7 +48,7 @@ Lanes.Models.Sync = {
48
48
  options.error = (reply, status, req)->
49
49
  options.rejectPromise(
50
50
  Lanes.Models.Sync.copyServerReply( record,
51
- resp.responseJSON || {error: resp.responseText}
51
+ reply.responseJSON || {error: reply.responseText}
52
52
  )
53
53
  )
54
54
  delete record.requestInProgress
@@ -1,5 +1,6 @@
1
1
  //= require_self
2
2
  //= require ./Sync
3
+ //= require ./ModelAssociations
3
4
  //= require ./Base
4
5
  //= require ./Collection
5
6
  //= require_tree ./mixins
@@ -2,26 +2,23 @@
2
2
 
3
3
  class ScreenBase
4
4
 
5
- constructor: -> super
5
+ abstractClass: true
6
6
 
7
+ constructor: ->
8
+ super
7
9
 
8
10
  mixins:[
9
11
  Lanes.Screens.ChangeListener
10
12
  ]
11
13
 
12
- initializeChanges:->
13
- @_changeListeners = {}
14
- for keypath in ( @usingModels || ['model'] )
15
- @_changeListeners[keypath] = new Lanes.Views.ScreenChangeListener(this, keypath)
16
-
17
14
  reset: Lanes.emptyFn
18
15
 
19
- templatePrefix: -> this.FILE.extensionName.toLowerCase() + "/screens/"
16
+ templateName: 'layout'
20
17
 
21
18
  render: ->
22
19
  previouslyRendered = this.rendered
23
20
  Lanes.Views.RenderContext.start(this)
24
- # Lanes.re we cheat and skip ViewBase so it doesn't push to context
21
+ # Here we cheat and skip ViewBase so it doesn't push to context
25
22
  this.reset()
26
23
  this.renderContextFree()
27
24
  #Lanes.Views.Base.__super__.render.apply(this, arguments)
@@ -1,9 +1,9 @@
1
1
  Lanes.Screens.ChangeListener = {
2
2
 
3
- model_events:
3
+ modelEvents:
4
4
  'remote-update': 'onChange'
5
5
 
6
- events:
6
+ domEvents:
7
7
  'show.bs.dropdown .changes-notification': 'onChangesShow'
8
8
 
9
9
  session:
@@ -24,7 +24,7 @@ Lanes.Screens.ChangeListener = {
24
24
  subviews:
25
25
  changesDropDown:
26
26
  hook: 'changes-display'
27
- view: 'ModelUpdate'
27
+ view: 'Lanes.Views.ModelUpdate'
28
28
  collection: 'changes'
29
29
 
30
30
  onChange: (model,change)->
@@ -40,4 +40,7 @@ Lanes.Screens.ChangeListener = {
40
40
  this.changes.invoke('updateTimeAgo')
41
41
  this.$('.changes-notification .scroller').animate({ scrollTop: 0 })
42
42
 
43
+ # included: ->
44
+ # console.log this
45
+
43
46
  }
@@ -1,4 +1,5 @@
1
1
  class ScreenView extends Lanes.Models.BasicModel
2
+ FILE: FILE
2
3
 
3
4
  session:
4
5
  screen: 'object'
@@ -18,18 +19,19 @@ class ScreenView extends Lanes.Models.BasicModel
18
19
  initialize: (options)->
19
20
  super
20
21
  @screen=options.screen
21
- Lanes.Models.Screens.displaying.add( this )
22
+ Lanes.Screens.Definitions.displaying.add( this )
22
23
  this.active=true
23
24
 
24
25
  renderScreen: ->
25
26
  this.view.render()
26
27
 
27
28
  remove: ->
28
- Lanes.Models.Screens.displaying.remove( this )
29
+ Lanes.Screens.Definitions.displaying.remove( this )
29
30
 
30
31
 
31
32
 
32
33
  class ScreenDefinition extends Lanes.Models.BasicModel
34
+ FILE: FILE
33
35
 
34
36
  session:
35
37
  id: 'string'
@@ -47,7 +49,7 @@ class ScreenDefinition extends Lanes.Models.BasicModel
47
49
  derived:
48
50
  model_type:
49
51
  deps: ['model'], fn: ->
50
- Lanes.getPath(this.model,"Lanes.Models")
52
+ Lanes.u.findObject(@model, "Models", this.FILE)
51
53
 
52
54
  initialize: ->
53
55
  @views = []
@@ -56,7 +58,7 @@ class ScreenDefinition extends Lanes.Models.BasicModel
56
58
  @views.push( new ScreenView( screen: this, viewport: viewport ) )
57
59
 
58
60
  getScreen: ->
59
- @viewModel ||= Lanes.getPath(this.view)
61
+ @viewModel ||= Lanes.u.getPath(this.view,@FILE?['Views'])
60
62
  if @viewModel?
61
63
  _.Promise.resolve(@viewMOdel)
62
64
  else
@@ -69,7 +71,7 @@ class ScreenDefinition extends Lanes.Models.BasicModel
69
71
  Lanes.lib.Request(me.assets)
70
72
  .then ->
71
73
  me.loading=false
72
- me.viewModel = Lanes.getPath(me.view)
74
+ me.viewModel = Lanes.u.getPath(me.view, me.FILE?['Views'])
73
75
  if me.viewModel then resolve(me.viewModel)
74
76
  else reject("Screen #{me.view} not definied after file retrieval")
75
77
  ,(msg)->
@@ -84,6 +86,7 @@ class ScreenDefinition extends Lanes.Models.BasicModel
84
86
 
85
87
 
86
88
  class ScreenViewSet extends Lanes.Models.BasicCollection
89
+ FILE: FILE
87
90
 
88
91
  model: ScreenView
89
92
 
@@ -122,6 +125,7 @@ class ScreenViewSet extends Lanes.Models.BasicCollection
122
125
 
123
126
 
124
127
  class ScreenSet extends Lanes.Models.BasicCollection
128
+ FILE: FILE
125
129
 
126
130
  model: ScreenDefinition
127
131
 
@@ -134,6 +138,7 @@ class ScreenSet extends Lanes.Models.BasicCollection
134
138
 
135
139
 
136
140
  class MenuGroup extends Lanes.Models.BasicModel
141
+ FILE: FILE
137
142
 
138
143
  session:
139
144
  id: 'string'
@@ -143,13 +148,16 @@ class MenuGroup extends Lanes.Models.BasicModel
143
148
  active: ['boolean', true, false]
144
149
 
145
150
  screens: ->
146
- @avail ||= new Lanes.Models.SubCollection( Lanes.Models.Screens.all, {
151
+ @avail ||= new Lanes.Models.SubCollection( Lanes.Screens.Definitions.all, {
147
152
  filter: (screen)=>
148
- screen.group_id == @id && Lanes.current_user.canRead(screen.model_type)
153
+ screen.group_id == @id &&
154
+ (!screen.model_type || Lanes.current_user.canRead(screen.model_type))
149
155
  watched: ['group_id']
150
156
  })
151
157
 
152
158
  class MenuGroupSet extends Lanes.Models.BasicCollection
159
+ FILE: FILE
160
+
153
161
  constructor: -> super
154
162
  model: MenuGroup
155
163
 
@@ -160,9 +168,14 @@ class MenuGroupSet extends Lanes.Models.BasicCollection
160
168
  mgs.screens().length > 0
161
169
  })
162
170
 
171
+ Lanes.Screens.display_id = (screen_id)->
172
+ definition = Lanes.Screens.Definitions.all.get(screen_id)
173
+ if (definition)
174
+ definition.display()
175
+ else
176
+ Lanes.warn "Unable to find definition for screen #{screen_id}"
163
177
 
164
-
165
- Lanes.Models.Screens = {
178
+ Lanes.Screens.Definitions = {
166
179
  all: new ScreenSet
167
180
  displaying: new ScreenViewSet([],{ single_active_only: true })
168
181
  groups: new MenuGroupSet
@@ -5,45 +5,45 @@ Lanes.renderScreenTo = (selector, options)->
5
5
  class Lanes.Screens.Instance
6
6
 
7
7
  constructor: (selector, options)->
8
- this.viewport = new Lanes.Views.Viewport({ selector: selector, instance: this });
9
- Lanes.Models.Bootstrap.initialize(options);
8
+ this.viewport = new Lanes.Views.Viewport({ selector: selector, instance: this })
9
+ Lanes.Models.Bootstrap.initialize(options)
10
10
  Lanes.$(document).ready => @boot(options)
11
11
 
12
12
  boot: (options)->
13
- this.root = Lanes.$( this.viewport.selector );
14
- this.root.data().workspace = this;
15
- this.viewport.root = this.root;
13
+ this.root = Lanes.$( this.viewport.selector )
14
+ this.root.data().workspace = this
15
+ this.viewport.root = this.root
16
16
 
17
17
  Lanes.lib.ResizeSensor(this.root[0], _.bind( _.debounce( =>
18
- @viewport.set({ width: this.root.width(), height: this.root.height() });
19
- , 250 ), this) );
18
+ @viewport.set({ width: this.root.width(), height: this.root.height() })
19
+ , 250 ), this) )
20
20
 
21
- this.root.addClass('lanes root');
21
+ this.root.addClass('lanes root')
22
22
  this.root.tooltip({
23
23
  viewport: '.lanes'
24
24
  selector: '[data-tooltip-message]'
25
25
  title: -> this.getAttribute('data-tooltip-message')
26
- });
27
- Lanes.Views.Keys.initialize();
28
- Lanes.Models.PubSub.initialize() if options.pub_sub;
29
-
30
- view = Lanes.getPath(options.root_view);
26
+ })
27
+ Lanes.Views.Keys.initialize()
28
+ Lanes.Models.PubSub.initialize() if options.pub_sub
29
+ cntrl = Lanes.Extensions.controlling()
30
+ view = Lanes.u.getPath(options.root_view)
31
31
  if view
32
- this.displayInitialView(view);
32
+ this.displayInitialView(view)
33
33
  else
34
- definition=Lanes.Models.Screens.all.findWhere({view: options.root_view});
34
+ definition=Lanes.Screens.Definitions.all.findWhere({view: options.root_view})
35
35
  if definition
36
36
  definition.getScreen().then( (screen)=>
37
37
  # break out of the promise so an errors during render get thrown properly
38
- _.defer( => @displayInitialView(screen); )
38
+ _.defer( => @displayInitialView(screen) )
39
39
  ,(msg)->
40
- Lanes.fatal("Unable to load initial screen ${options.root_view}", msg);
40
+ Lanes.fatal("Unable to load initial screen ${options.root_view}", msg)
41
41
  )
42
42
  else
43
- Lanes.fatal(options.root_view + " doesn't exist!");
43
+ Lanes.fatal(options.root_view + " doesn't exist!")
44
44
 
45
45
  displayInitialView:(view)->
46
- this.view = new view({parent: this, model: this.viewport}).render();
47
- this.viewport.el = this.view.$el;
48
- this.root.append( this.view.el );
49
- Lanes.Extensions.fireOnAvailable(this);
46
+ this.view = new view({parent: this, model: this.viewport}).render()
47
+ this.viewport.el = this.view.$el
48
+ this.root.append( this.view.el )
49
+ Lanes.Extensions.fireOnAvailable(this)
@@ -1,6 +1,4 @@
1
-
2
1
  class Router
3
2
  constructor: -> super
4
-
5
-
3
+
6
4
  Lanes.Screens.Router = Lanes.lib.MakeBaseClass( Lanes.Vendor.Ampersand.Router, Router )
@@ -0,0 +1,3 @@
1
+ <% Lanes::Screen.each do | screen |
2
+ require_asset screen.js if screen.js
3
+ end %>
@@ -1 +1,6 @@
1
- //= require_tree .
1
+ //= require ./ChangeListener
2
+ //= require ./Base
3
+ //= require ./Router
4
+ //= require ./Instance
5
+ //= require ./Definitions
6
+ //= require ./register
@@ -4,12 +4,12 @@ require_asset screen.js
4
4
  end %>
5
5
 
6
6
  <% Lanes::Screen.each_group do | spec | %>
7
- Lanes.Models.Screens.groups.add( <%= spec.to_json %> );
7
+ Lanes.Screens.Definitions.groups.add( <%= spec.to_json %> );
8
8
  <% end %>
9
9
 
10
10
  <% Lanes::Screen.each do | spec | %>
11
- Lanes.Models.Screens.register( <%= spec.to_json %> );
11
+ Lanes.Screens.Definitions.register( <%= spec.to_json %> );
12
12
  <% end %>
13
13
 
14
- <% depend_on "/Users/nas/code/lanes-access/config/screens.rb" %>
14
+ <% Lanes::Screen.uncache_file_on_update(self) %>
15
15