lanes 0.1.9 → 0.1.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (447) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/client/fonts/fontawesome-webfont.woff +0 -0
  4. data/client/fonts/fontawesome-webfont.woff2 +0 -0
  5. data/client/lanes/Boot.cjsx +9 -0
  6. data/client/lanes/access/Extension.coffee +18 -4
  7. data/client/lanes/access/LoginDialog.cjsx +78 -0
  8. data/client/lanes/access/Roles.coffee +22 -28
  9. data/client/lanes/access/User.coffee +16 -16
  10. data/client/lanes/access/index.js +4 -5
  11. data/client/lanes/access/screens/user-management/Editor.cjsx +20 -0
  12. data/client/lanes/access/screens/user-management/UserManagement.cjsx +41 -0
  13. data/client/lanes/access/screens/user-management/index.js +0 -1
  14. data/client/lanes/components/grid/EditingMixin.cjsx +64 -0
  15. data/client/lanes/components/grid/Grid.cjsx +139 -0
  16. data/client/lanes/components/grid/PopOverMixin.cjsx +28 -0
  17. data/client/lanes/components/grid/PopoverEditor.cjsx +8 -0
  18. data/client/lanes/components/grid/RowEditor.cjsx +10 -0
  19. data/client/lanes/components/grid/Toolbar.cjsx +14 -0
  20. data/client/lanes/components/grid/config.json +1 -1
  21. data/client/lanes/components/grid/editors.scss +94 -53
  22. data/client/lanes/components/grid/index.js +2 -7
  23. data/client/lanes/components/grid/styles.scss +8 -296
  24. data/client/lanes/components/helpers.coffee +2 -0
  25. data/client/lanes/components/index.js +2 -1
  26. data/client/lanes/components/modal/Modal.cjsx +36 -0
  27. data/client/lanes/components/modal/index.js +1 -2
  28. data/client/lanes/components/modal/styles.scss +0 -19
  29. data/client/lanes/components/record-finder/Clause.cjsx +80 -0
  30. data/client/lanes/components/record-finder/Dialog.cjsx +54 -0
  31. data/client/lanes/components/record-finder/RecordFinder.cjsx +38 -0
  32. data/client/lanes/components/record-finder/config.json +1 -1
  33. data/client/lanes/components/record-finder/index.js +1 -2
  34. data/client/lanes/components/request-spinner/index.js +1 -0
  35. data/client/lanes/components/select-field/SelectField.cjsx +78 -0
  36. data/client/lanes/components/select-field/index.js +2 -1
  37. data/client/lanes/components/select-field/styles.scss +1 -0
  38. data/client/lanes/components/shared/CountBadge.cjsx +9 -0
  39. data/client/lanes/components/shared/ErrorDisplay.cjsx +21 -0
  40. data/client/lanes/components/shared/FieldMixin.cjsx +71 -0
  41. data/client/lanes/components/shared/FieldSet.cjsx +58 -0
  42. data/client/lanes/components/shared/GenericField.cjsx +5 -0
  43. data/client/lanes/components/shared/Helpers.coffee +9 -0
  44. data/client/lanes/components/shared/RadioField.cjsx +14 -0
  45. data/client/lanes/components/shared/Resize.cjsx +152 -0
  46. data/client/lanes/components/shared/TextArea.cjsx +19 -0
  47. data/client/lanes/components/shared/TextField.cjsx +25 -0
  48. data/client/lanes/components/shared/Tooltip.cjsx +10 -0
  49. data/client/lanes/components/shared/fields.scss +35 -0
  50. data/client/lanes/components/shared/fieldset.scss +29 -0
  51. data/client/lanes/components/shared/index.js +3 -0
  52. data/client/lanes/components/shared/styles.scss +32 -0
  53. data/client/lanes/components/toolbar/RemoteChangeSets.cjsx +75 -0
  54. data/client/lanes/components/toolbar/SaveButton.cjsx +3 -0
  55. data/client/lanes/components/toolbar/Toolbar.cjsx +58 -0
  56. data/client/lanes/{workspace/styles → components/toolbar}/changes-notification.scss +10 -23
  57. data/client/lanes/components/toolbar/index.js +3 -0
  58. data/client/lanes/components/toolbar/styles.scss +51 -0
  59. data/client/lanes/extension/Extensions.coffee +19 -10
  60. data/client/lanes/extension/LateLoaded.js.erb +4 -3
  61. data/client/lanes/index.js +3 -5
  62. data/client/lanes/index.scss.erb +6 -14
  63. data/client/lanes/lib/HotReload.coffee +35 -0
  64. data/client/lanes/lib/MakeBaseClass.coffee +10 -11
  65. data/client/lanes/lib/development.coffee +3 -0
  66. data/client/lanes/lib/dom.coffee +49 -0
  67. data/client/lanes/lib/el.coffee +23 -0
  68. data/client/lanes/lib/index.js.erb +16 -0
  69. data/client/lanes/lib/loader.coffee +34 -34
  70. data/client/lanes/lib/namespace.coffee +1 -1
  71. data/client/lanes/lib/objToParam.coffee +37 -0
  72. data/client/lanes/{access/views/.gitkeep → lib/production.coffee} +0 -0
  73. data/client/lanes/lib/utilFunctions.coffee +44 -26
  74. data/client/lanes/models/AssociationMap.coffee +51 -38
  75. data/client/lanes/models/Base.coffee +89 -88
  76. data/client/lanes/models/ChangeMonitor.coffee +10 -10
  77. data/client/lanes/models/ChangeSet.coffee +14 -24
  78. data/client/lanes/models/Collection.coffee +40 -41
  79. data/client/lanes/models/PubSub.coffee +28 -19
  80. data/client/lanes/models/Query.coffee +78 -45
  81. data/client/lanes/models/QueryResults.coffee +93 -0
  82. data/client/lanes/models/ServerCache.coffee +12 -12
  83. data/client/lanes/models/Sync.coffee +53 -50
  84. data/client/lanes/models/User.coffee +31 -17
  85. data/client/lanes/react/Component.coffee +31 -0
  86. data/client/lanes/react/DefaultComponentNotFound.cjsx +9 -0
  87. data/client/lanes/{views → react}/FormBindings.coffee +0 -0
  88. data/client/lanes/{views → react}/ModelObserver.coffee +0 -0
  89. data/client/lanes/{views → react}/ModelUpdate.coffee +0 -0
  90. data/client/lanes/{views → react}/PubSub.coffee +0 -0
  91. data/client/lanes/react/Root.cjsx +14 -0
  92. data/client/lanes/react/Router.cjsx +18 -0
  93. data/client/lanes/react/Screen.coffee +15 -0
  94. data/client/lanes/{views → react}/TimedHighlight.coffee +0 -0
  95. data/client/lanes/{views → react}/TimedMask.coffee +0 -0
  96. data/client/lanes/react/TypeValidators.coffee +21 -0
  97. data/client/lanes/{lib/create-namespace.js → react/Utils.coffee} +0 -0
  98. data/client/lanes/react/Viewport.coffee +30 -0
  99. data/client/lanes/react/index.js +8 -0
  100. data/client/lanes/react/mixins/Access.coffee +27 -0
  101. data/client/lanes/react/mixins/Component.coffee +4 -0
  102. data/client/lanes/react/mixins/Data.coffee +136 -0
  103. data/client/lanes/react/mixins/MonitorSize.coffee +11 -0
  104. data/client/lanes/react/mixins/ReadEditingState.coffee +11 -0
  105. data/client/lanes/react/mixins/RelayEditingState.coffee +17 -0
  106. data/client/lanes/react/mixins/RelayFieldChange.coffee +11 -0
  107. data/client/lanes/react/mixins/Screen.coffee +7 -0
  108. data/client/lanes/react/mixins/Viewport.coffee +11 -0
  109. data/client/lanes/screens/ChangeListener.coffee +3 -3
  110. data/client/lanes/screens/Commands.coffee +27 -0
  111. data/client/lanes/screens/Definitions.coffee +74 -65
  112. data/client/lanes/screens/all.js.erb +1 -1
  113. data/client/lanes/screens/index.js +1 -2
  114. data/client/lanes/screens/mixins/index.js +0 -1
  115. data/client/lanes/screens/register.js.erb +0 -1
  116. data/client/lanes/screens/styles.scss +7 -0
  117. data/client/lanes/styles/bootstrap-custom-grid.scss +67 -37
  118. data/client/lanes/styles/bootstrap.scss +4 -5
  119. data/client/lanes/styles/fonts.scss +10 -23
  120. data/client/lanes/styles/fonts/_animated.scss +34 -0
  121. data/client/lanes/styles/fonts/_bordered-pulled.scss +16 -0
  122. data/client/lanes/styles/fonts/_core.scss +13 -0
  123. data/client/lanes/styles/fonts/_fixed-width.scss +6 -0
  124. data/client/lanes/styles/fonts/_icons.scss +596 -0
  125. data/client/lanes/styles/fonts/_larger.scss +13 -0
  126. data/client/lanes/styles/fonts/_list.scss +19 -0
  127. data/client/lanes/styles/fonts/_mixins.scss +27 -0
  128. data/client/lanes/styles/fonts/_path.scss +10 -0
  129. data/client/lanes/styles/fonts/_rotated-flipped.scss +20 -0
  130. data/client/lanes/styles/fonts/_stacked.scss +20 -0
  131. data/client/lanes/styles/fonts/_variables.scss +606 -0
  132. data/client/lanes/styles/fonts/font-awesome.scss +16 -0
  133. data/client/lanes/styles/fonts/index.scss +2 -0
  134. data/client/lanes/styles/global.scss +2 -0
  135. data/client/lanes/styles/global/fancy-header.scss +14 -0
  136. data/client/lanes/testing/BeforeEach.coffee +15 -40
  137. data/client/lanes/testing/Helpers.coffee +27 -0
  138. data/client/lanes/testing/ModelSaver.coffee +14 -24
  139. data/client/lanes/testing/StubRouter.coffee +27 -0
  140. data/client/lanes/testing/TestObjects.coffee +27 -0
  141. data/client/lanes/testing/index.js +3 -1
  142. data/client/lanes/vendor/base.js +85256 -0
  143. data/client/lanes/vendor/commons.js +20579 -0
  144. data/client/lanes/vendor/development.js +2511 -0
  145. data/client/lanes/vendor/grid.js +6689 -0
  146. data/client/lanes/vendor/grid.scss +387 -0
  147. data/client/lanes/vendor/index.js +3 -0
  148. data/client/lanes/vendor/message-bus.coffee +264 -0
  149. data/client/lanes/vendor/widgets.js +8798 -0
  150. data/client/lanes/vendor/widgets.scss +723 -0
  151. data/client/lanes/workspace/ActiveScreenSwitcher.cjsx +38 -0
  152. data/client/lanes/workspace/Extension.coffee +6 -0
  153. data/client/lanes/workspace/Layout.cjsx +28 -0
  154. data/client/lanes/workspace/Navbar.cjsx +25 -0
  155. data/client/lanes/workspace/ScreenView.cjsx +27 -0
  156. data/client/lanes/workspace/ScreensMenu.cjsx +57 -0
  157. data/client/lanes/workspace/UIState.coffee +17 -16
  158. data/client/lanes/workspace/index.js +7 -2
  159. data/client/lanes/workspace/styles.scss +0 -3
  160. data/client/lanes/workspace/styles/forms.scss +2 -73
  161. data/client/lanes/workspace/styles/header.scss +0 -2
  162. data/client/lanes/workspace/styles/layout.scss +9 -2
  163. data/client/lanes/workspace/styles/screens.scss +0 -59
  164. data/client/lanes/workspace/styles/tabs.scss +16 -15
  165. data/coffeelint.json +49 -0
  166. data/config.ru +1 -0
  167. data/config/database.yml +2 -2
  168. data/config/routes.rb +7 -0
  169. data/docs/command.md +11 -8
  170. data/docs/model.md +2 -5
  171. data/docs/react.md +137 -0
  172. data/lanes.gemspec +1 -0
  173. data/lib/lanes.rb +1 -1
  174. data/lib/lanes/access/authentication_provider.rb +1 -0
  175. data/lib/lanes/access/config/routes.rb +2 -0
  176. data/lib/lanes/access/config/screens.rb +15 -12
  177. data/lib/lanes/access/extension.rb +2 -1
  178. data/lib/lanes/access/role.rb +8 -4
  179. data/lib/lanes/api.rb +4 -3
  180. data/lib/lanes/api/coffeescript_processor.rb +47 -6
  181. data/lib/lanes/api/controller.rb +4 -3
  182. data/lib/lanes/api/default_routes.rb +16 -0
  183. data/lib/lanes/api/javascript_processor.rb +14 -68
  184. data/lib/lanes/api/pub_sub.rb +17 -3
  185. data/lib/lanes/api/request_wrapper.rb +2 -2
  186. data/lib/lanes/api/root.rb +16 -13
  187. data/lib/lanes/api/routing.rb +0 -18
  188. data/lib/lanes/api/sprockets_extension.rb +10 -4
  189. data/lib/lanes/api/test_specs.rb +3 -3
  190. data/lib/lanes/cli.rb +6 -1
  191. data/lib/lanes/command/app.rb +7 -11
  192. data/lib/lanes/command/generate.rb +3 -3
  193. data/lib/lanes/command/generate_component.rb +28 -0
  194. data/lib/lanes/command/generate_component.usage +11 -0
  195. data/lib/lanes/command/generate_screen.rb +24 -7
  196. data/lib/lanes/command/generate_screen.usage +5 -8
  197. data/lib/lanes/configuration.rb +3 -2
  198. data/lib/lanes/extension.rb +12 -18
  199. data/lib/lanes/extension/definition.rb +20 -8
  200. data/lib/lanes/guard_tasks.rb +22 -5
  201. data/lib/lanes/hot_reload_plugin.rb +47 -0
  202. data/lib/lanes/logger.rb +41 -5
  203. data/lib/lanes/screen.rb +40 -16
  204. data/lib/lanes/spec_helper.rb +6 -3
  205. data/lib/lanes/version.rb +1 -1
  206. data/lib/lanes/workspace/extension.rb +1 -0
  207. data/npm-build/{template.js → base.js} +17 -17
  208. data/{client/lanes/workspace/tab.html → npm-build/common.js} +0 -0
  209. data/npm-build/compile.coffee +13 -4
  210. data/npm-build/development.js +7 -0
  211. data/npm-build/grid.js +11 -0
  212. data/npm-build/package.json +62 -58
  213. data/npm-build/react-widgets.js +5 -0
  214. data/npm-build/react-widgets.less +35 -0
  215. data/npm-build/webpack.config.js +39 -0
  216. data/spec/command-reference-files/component/client/appy-app/components/Big.cjsx +4 -0
  217. data/spec/command-reference-files/component/spec/appy-app/components/BigSpec.coffee +5 -0
  218. data/spec/command-reference-files/initial/.rubocop.yml +7 -0
  219. data/spec/command-reference-files/initial/Gemfile +1 -1
  220. data/spec/command-reference-files/initial/client/appy-app/Extension.coffee +17 -5
  221. data/spec/command-reference-files/initial/client/appy-app/components/Base.coffee +9 -0
  222. data/spec/command-reference-files/initial/client/appy-app/index.js +1 -3
  223. data/spec/command-reference-files/initial/client/appy-app/screens/Base.coffee +8 -2
  224. data/spec/command-reference-files/initial/coffeelint.json +49 -0
  225. data/spec/command-reference-files/initial/config.ru +2 -0
  226. data/spec/command-reference-files/initial/config/screens.rb +10 -0
  227. data/spec/command-reference-files/initial/lib/appy-app/extension.rb +7 -0
  228. data/spec/command-reference-files/model/client/appy-app/models/TestTest.coffee +0 -1
  229. data/spec/command-reference-files/screen/client/appy-app/Extension.coffee +34 -0
  230. data/spec/command-reference-files/screen/client/appy-app/screens/ready-set-go/ReadySetGo.cjsx +7 -0
  231. data/spec/command-reference-files/screen/config/screens.rb +19 -9
  232. data/spec/command-reference-files/screen/spec/appy-app/screens/ready-set-go/ReadySetGoSpec.coffee +3 -3
  233. data/spec/lanes/components/grid/GridSpec.coffee +26 -26
  234. data/spec/lanes/models/AssociationMapSpec.coffee +6 -6
  235. data/spec/lanes/models/BaseSpec.coffee +24 -35
  236. data/spec/lanes/models/CollectionSpec.coffee +19 -18
  237. data/spec/lanes/models/EnumMapSpec.coffee +1 -1
  238. data/spec/lanes/models/PubSubSpec.coffee +17 -15
  239. data/spec/lanes/models/SyncSpec.coffee +28 -0
  240. data/spec/lanes/models/UserSpec.coffee +17 -0
  241. data/spec/lanes/react/mixins/DataSpec.coffee +72 -0
  242. data/spec/lanes/screens/DefinitionsSpec.coffee +33 -0
  243. data/spec/lanes/views/BaseSpec.coffee +133 -133
  244. data/spec/lanes/views/FormBindingsSpec.coffee +30 -30
  245. data/spec/server/api/coffeescript_processor_spec.rb +2 -2
  246. data/spec/server/command_spec.rb +3 -3
  247. data/templates/client/Extension.coffee +17 -5
  248. data/templates/client/components/BaseComponent.coffee +9 -0
  249. data/templates/client/components/Component.cjsx +4 -0
  250. data/templates/client/{views → components}/template.html +0 -0
  251. data/templates/client/index.js +1 -3
  252. data/templates/client/models/Model.coffee +0 -1
  253. data/templates/client/screens/BaseScreen.coffee +9 -0
  254. data/templates/client/screens/Screen.cjsx +7 -0
  255. data/templates/config.ru +2 -0
  256. data/templates/config/screen.rb +10 -10
  257. data/templates/config/screens.rb +10 -0
  258. data/templates/lib/namespace/extension.rb +7 -0
  259. data/templates/spec/client/Screen.coffee +4 -4
  260. data/templates/spec/client/components/ComponentSpec.coffee +5 -0
  261. metadata +157 -201
  262. data/client/fonts/lanes/icomoon.eot +0 -0
  263. data/client/fonts/lanes/icomoon.svg +0 -160
  264. data/client/fonts/lanes/icomoon.ttf +0 -0
  265. data/client/fonts/lanes/icomoon.woff +0 -0
  266. data/client/fonts/lanes/selection.json +0 -3565
  267. data/client/lanes/Boot.coffee +0 -50
  268. data/client/lanes/access/LoginDialog.coffee +0 -46
  269. data/client/lanes/access/login-dialog.html +0 -16
  270. data/client/lanes/access/screens/user-management/GridUserEditor.coffee +0 -26
  271. data/client/lanes/access/screens/user-management/UserManagement.coffee +0 -23
  272. data/client/lanes/access/screens/user-management/grid-popover-editor.html +0 -33
  273. data/client/lanes/access/screens/user-management/screen.html +0 -7
  274. data/client/lanes/components/Base.coffee +0 -39
  275. data/client/lanes/components/ChoicesInput.coffee +0 -47
  276. data/client/lanes/components/grid/Editor.coffee +0 -62
  277. data/client/lanes/components/grid/Grid.coffee +0 -205
  278. data/client/lanes/components/grid/PopOverEditor.coffee +0 -29
  279. data/client/lanes/components/grid/RowEditor.coffee +0 -30
  280. data/client/lanes/components/grid/popover-editor.html +0 -18
  281. data/client/lanes/components/grid/row-editor.html +0 -16
  282. data/client/lanes/components/grid/template.html +0 -4
  283. data/client/lanes/components/grid/vendor/dataTables.scroller.js +0 -1262
  284. data/client/lanes/components/grid/vendor/index.js +0 -2
  285. data/client/lanes/components/grid/vendor/jquery.dataTables.js +0 -14839
  286. data/client/lanes/components/modal/ModalDialog.coffee +0 -68
  287. data/client/lanes/components/modal/template.html +0 -18
  288. data/client/lanes/components/multi-select/MultiSelect.coffee +0 -65
  289. data/client/lanes/components/popover/PopOver.coffee +0 -55
  290. data/client/lanes/components/popover/index.js +0 -2
  291. data/client/lanes/components/popover/styles.scss +0 -2
  292. data/client/lanes/components/popover/template.html +0 -5
  293. data/client/lanes/components/radio-group/RadioGroup.coffee +0 -47
  294. data/client/lanes/components/radio-group/index.js +0 -1
  295. data/client/lanes/components/radio-group/styles.scss +0 -1
  296. data/client/lanes/components/record-finder/Clause.coffee +0 -37
  297. data/client/lanes/components/record-finder/Dialog.coffee +0 -45
  298. data/client/lanes/components/record-finder/RecordFinder.coffee +0 -61
  299. data/client/lanes/components/record-finder/clause.html +0 -37
  300. data/client/lanes/components/record-finder/dialog.html +0 -4
  301. data/client/lanes/components/record-finder/field.html +0 -8
  302. data/client/lanes/components/select-field/SelectField.coffee +0 -63
  303. data/client/lanes/components/select2/Select2.coffee +0 -8
  304. data/client/lanes/components/select2/index.js +0 -2
  305. data/client/lanes/lib/Templates.coffee +0 -51
  306. data/client/lanes/lib/debounce.coffee +0 -15
  307. data/client/lanes/lib/defer.coffee +0 -7
  308. data/client/lanes/lib/el.js +0 -115
  309. data/client/lanes/lib/index.js +0 -5
  310. data/client/lanes/plugins/overlay.coffee +0 -41
  311. data/client/lanes/screens/Base.coffee +0 -35
  312. data/client/lanes/screens/Router.coffee +0 -4
  313. data/client/lanes/screens/mixins/Editing.coffee +0 -38
  314. data/client/lanes/styles/bootstrap/old/_alerts.scss +0 -68
  315. data/client/lanes/styles/bootstrap/old/_badges.scss +0 -57
  316. data/client/lanes/styles/bootstrap/old/_breadcrumbs.scss +0 -26
  317. data/client/lanes/styles/bootstrap/old/_button-groups.scss +0 -240
  318. data/client/lanes/styles/bootstrap/old/_buttons.scss +0 -157
  319. data/client/lanes/styles/bootstrap/old/_carousel.scss +0 -243
  320. data/client/lanes/styles/bootstrap/old/_close.scss +0 -35
  321. data/client/lanes/styles/bootstrap/old/_code.scss +0 -68
  322. data/client/lanes/styles/bootstrap/old/_component-animations.scss +0 -35
  323. data/client/lanes/styles/bootstrap/old/_dropdowns.scss +0 -215
  324. data/client/lanes/styles/bootstrap/old/_forms.scss +0 -538
  325. data/client/lanes/styles/bootstrap/old/_glyphicons.scss +0 -237
  326. data/client/lanes/styles/bootstrap/old/_grid.scss +0 -84
  327. data/client/lanes/styles/bootstrap/old/_input-groups.scss +0 -166
  328. data/client/lanes/styles/bootstrap/old/_jumbotron.scss +0 -48
  329. data/client/lanes/styles/bootstrap/old/_labels.scss +0 -66
  330. data/client/lanes/styles/bootstrap/old/_list-group.scss +0 -132
  331. data/client/lanes/styles/bootstrap/old/_media.scss +0 -56
  332. data/client/lanes/styles/bootstrap/old/_mixins.scss +0 -39
  333. data/client/lanes/styles/bootstrap/old/_modals.scss +0 -150
  334. data/client/lanes/styles/bootstrap/old/_navbar.scss +0 -659
  335. data/client/lanes/styles/bootstrap/old/_navs.scss +0 -242
  336. data/client/lanes/styles/bootstrap/old/_normalize.scss +0 -425
  337. data/client/lanes/styles/bootstrap/old/_pager.scss +0 -55
  338. data/client/lanes/styles/bootstrap/old/_pagination.scss +0 -88
  339. data/client/lanes/styles/bootstrap/old/_panels.scss +0 -243
  340. data/client/lanes/styles/bootstrap/old/_popovers.scss +0 -133
  341. data/client/lanes/styles/bootstrap/old/_print.scss +0 -101
  342. data/client/lanes/styles/bootstrap/old/_progress-bars.scss +0 -105
  343. data/client/lanes/styles/bootstrap/old/_responsive-embed.scss +0 -34
  344. data/client/lanes/styles/bootstrap/old/_responsive-utilities.scss +0 -174
  345. data/client/lanes/styles/bootstrap/old/_scaffolding.scss +0 -150
  346. data/client/lanes/styles/bootstrap/old/_tables.scss +0 -233
  347. data/client/lanes/styles/bootstrap/old/_theme.scss +0 -258
  348. data/client/lanes/styles/bootstrap/old/_thumbnails.scss +0 -38
  349. data/client/lanes/styles/bootstrap/old/_tooltip.scss +0 -95
  350. data/client/lanes/styles/bootstrap/old/_type.scss +0 -304
  351. data/client/lanes/styles/bootstrap/old/_utilities.scss +0 -57
  352. data/client/lanes/styles/bootstrap/old/_variables.scss +0 -850
  353. data/client/lanes/styles/bootstrap/old/_wells.scss +0 -29
  354. data/client/lanes/styles/bootstrap/old/bootstrap.scss +0 -50
  355. data/client/lanes/styles/bootstrap/old/mixins/_alerts.scss +0 -14
  356. data/client/lanes/styles/bootstrap/old/mixins/_background-variant.scss +0 -11
  357. data/client/lanes/styles/bootstrap/old/mixins/_border-radius.scss +0 -18
  358. data/client/lanes/styles/bootstrap/old/mixins/_buttons.scss +0 -50
  359. data/client/lanes/styles/bootstrap/old/mixins/_center-block.scss +0 -7
  360. data/client/lanes/styles/bootstrap/old/mixins/_clearfix.scss +0 -22
  361. data/client/lanes/styles/bootstrap/old/mixins/_forms.scss +0 -84
  362. data/client/lanes/styles/bootstrap/old/mixins/_gradients.scss +0 -58
  363. data/client/lanes/styles/bootstrap/old/mixins/_grid-framework.scss +0 -81
  364. data/client/lanes/styles/bootstrap/old/mixins/_grid.scss +0 -122
  365. data/client/lanes/styles/bootstrap/old/mixins/_hide-text.scss +0 -21
  366. data/client/lanes/styles/bootstrap/old/mixins/_image.scss +0 -34
  367. data/client/lanes/styles/bootstrap/old/mixins/_labels.scss +0 -12
  368. data/client/lanes/styles/bootstrap/old/mixins/_list-group.scss +0 -31
  369. data/client/lanes/styles/bootstrap/old/mixins/_nav-divider.scss +0 -10
  370. data/client/lanes/styles/bootstrap/old/mixins/_nav-vertical-align.scss +0 -9
  371. data/client/lanes/styles/bootstrap/old/mixins/_opacity.scss +0 -8
  372. data/client/lanes/styles/bootstrap/old/mixins/_pagination.scss +0 -23
  373. data/client/lanes/styles/bootstrap/old/mixins/_panels.scss +0 -24
  374. data/client/lanes/styles/bootstrap/old/mixins/_progress-bar.scss +0 -10
  375. data/client/lanes/styles/bootstrap/old/mixins/_reset-filter.scss +0 -8
  376. data/client/lanes/styles/bootstrap/old/mixins/_resize.scss +0 -6
  377. data/client/lanes/styles/bootstrap/old/mixins/_responsive-visibility.scss +0 -21
  378. data/client/lanes/styles/bootstrap/old/mixins/_size.scss +0 -10
  379. data/client/lanes/styles/bootstrap/old/mixins/_tab-focus.scss +0 -9
  380. data/client/lanes/styles/bootstrap/old/mixins/_table-row.scss +0 -28
  381. data/client/lanes/styles/bootstrap/old/mixins/_text-emphasis.scss +0 -11
  382. data/client/lanes/styles/bootstrap/old/mixins/_text-overflow.scss +0 -8
  383. data/client/lanes/styles/bootstrap/old/mixins/_vendor-prefixes.scss +0 -219
  384. data/client/lanes/styles/font-definitions.scss +0 -451
  385. data/client/lanes/testing/TestModels.coffee +0 -23
  386. data/client/lanes/vendor/bootstrap/affix.js +0 -162
  387. data/client/lanes/vendor/bootstrap/alert.js +0 -94
  388. data/client/lanes/vendor/bootstrap/button.js +0 -116
  389. data/client/lanes/vendor/bootstrap/carousel.js +0 -240
  390. data/client/lanes/vendor/bootstrap/collapse.js +0 -211
  391. data/client/lanes/vendor/bootstrap/dropdown.js +0 -161
  392. data/client/lanes/vendor/bootstrap/modal.js +0 -324
  393. data/client/lanes/vendor/bootstrap/popover.js +0 -119
  394. data/client/lanes/vendor/bootstrap/scrollspy.js +0 -175
  395. data/client/lanes/vendor/bootstrap/tab.js +0 -153
  396. data/client/lanes/vendor/bootstrap/tooltip.js +0 -478
  397. data/client/lanes/vendor/bootstrap/transition.js +0 -59
  398. data/client/lanes/vendor/message-bus.js +0 -285
  399. data/client/lanes/vendor/modern-stack.js +0 -27
  400. data/client/lanes/vendor/packaged.js +0 -19533
  401. data/client/lanes/views/Assets.coffee +0 -9
  402. data/client/lanes/views/Base.coffee +0 -426
  403. data/client/lanes/views/Functions.coffee +0 -13
  404. data/client/lanes/views/Helpers.coffee +0 -76
  405. data/client/lanes/views/Keys.coffee +0 -59
  406. data/client/lanes/views/RenderContext.coffee +0 -32
  407. data/client/lanes/views/SaveNotify.coffee +0 -32
  408. data/client/lanes/views/Viewport.coffee +0 -18
  409. data/client/lanes/views/_button.html +0 -3
  410. data/client/lanes/views/_toolbar.html +0 -23
  411. data/client/lanes/views/empty-span.html +0 -1
  412. data/client/lanes/views/index.js +0 -2
  413. data/client/lanes/views/model-update.html +0 -15
  414. data/client/lanes/workspace/ActiveScreensSwitcher.coffee +0 -112
  415. data/client/lanes/workspace/Layout.coffee +0 -29
  416. data/client/lanes/workspace/Navbar.coffee +0 -31
  417. data/client/lanes/workspace/Pages.coffee +0 -39
  418. data/client/lanes/workspace/ScreensMenu.coffee +0 -126
  419. data/client/lanes/workspace/WorkspaceView.coffee +0 -8
  420. data/client/lanes/workspace/layout.html +0 -4
  421. data/client/lanes/workspace/menu.html +0 -356
  422. data/client/lanes/workspace/menu_toggle.html +0 -9
  423. data/client/lanes/workspace/navbar.html +0 -17
  424. data/client/lanes/workspace/pages.html +0 -6
  425. data/client/lanes/workspace/screens-menu.html +0 -11
  426. data/client/lanes/workspace/screens-switcher.html +0 -7
  427. data/docs/view.md +0 -292
  428. data/lib/lanes/command/generate_view.rb +0 -38
  429. data/lib/lanes/command/generate_view.usage +0 -13
  430. data/spec/command-reference-files/initial/client/appy-app/Router.coffee +0 -4
  431. data/spec/command-reference-files/initial/client/appy-app/controllers/.gitkeep +0 -0
  432. data/spec/command-reference-files/initial/client/appy-app/views/.gitkeep +0 -0
  433. data/spec/command-reference-files/initial/client/appy-app/views/Base.coffee +0 -5
  434. data/spec/command-reference-files/initial/spec/appy-app/screens/Base.coffee +0 -5
  435. data/spec/command-reference-files/screen/client/appy-app/screens/ready-set-go/ReadySetGo.coffee +0 -6
  436. data/spec/command-reference-files/screen/client/appy-app/screens/ready-set-go/layout.html +0 -3
  437. data/spec/command-reference-files/view/client/appy-app/views/BigView.coffee +0 -10
  438. data/spec/command-reference-files/view/spec/appy-app/views/BigViewSpec.coffee +0 -5
  439. data/templates/client/Router.coffee +0 -4
  440. data/templates/client/components/Component.coffee +0 -1
  441. data/templates/client/screens/Base.coffee +0 -3
  442. data/templates/client/screens/Screen.coffee +0 -11
  443. data/templates/client/screens/layout.html +0 -3
  444. data/templates/client/views/.gitkeep +0 -0
  445. data/templates/client/views/BaseView.coffee +0 -5
  446. data/templates/client/views/View.coffee +0 -10
  447. data/templates/spec/client/views/ViewSpec.coffee +0 -5
@@ -4,7 +4,7 @@
4
4
 
5
5
  .header-top {
6
6
 
7
-
7
+
8
8
  .menu-container {
9
9
  position:absolute;
10
10
  left: 0;
@@ -16,16 +16,18 @@
16
16
  transition: all 0.15s ease-in-out 0s;
17
17
  overflow-x: visible;
18
18
  overflow-y: auto;
19
- left: 200px;
19
+ left: 215px;
20
20
  right: 35px;
21
21
  }
22
22
 
23
- /* &.with-screen-menu { */
24
- /* .menu-container { */
25
- /* left: 0px; */
26
- /* } */
27
- /* } */
28
-
23
+ .screens-menu-toggle {
24
+ margin-left: 20px;
25
+ .icon {
26
+ @extend .icon;
27
+ @extend .icon-navicon;
28
+ @extend .icon-rotate-90;
29
+ }
30
+ }
29
31
 
30
32
  .active-screens {
31
33
  display: inline-block;
@@ -47,7 +49,6 @@
47
49
  left:0px;
48
50
  top: 1px;
49
51
  min-width:3000px;
50
- /* margin-left:12px; */
51
52
  margin-top:0px;
52
53
 
53
54
  li {
@@ -77,11 +78,11 @@
77
78
  visibility: visible;
78
79
  }
79
80
  }
80
-
81
+
81
82
  .scroller-right{
82
83
  float:right;
83
84
  &:before {
84
- @extend .font-icon-display;
85
+ @extend .icon;
85
86
  @extend .icon-arrow-right:before;
86
87
  }
87
88
  }
@@ -89,7 +90,7 @@
89
90
  .scroller-left {
90
91
  float:left;
91
92
  &:before {
92
- @extend .font-icon-display;
93
+ @extend .icon;
93
94
  @extend .icon-arrow-left:before;
94
95
  }
95
96
  }
@@ -103,7 +104,7 @@
103
104
  overflow: hidden;
104
105
  }
105
106
  .screens-menu {
106
-
107
+
107
108
  }
108
109
  }
109
110
 
@@ -121,7 +122,7 @@
121
122
  }
122
123
 
123
124
  .active-screens {
124
-
125
+
125
126
  height: 45px;
126
127
  padding: 0 5px;
127
128
 
@@ -134,7 +135,7 @@
134
135
  .close {
135
136
  position: absolute;
136
137
  right: 7px;
137
- top: 0px;
138
+ top: 0px;
138
139
  }
139
140
 
140
141
  /* a { */
data/coffeelint.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "coffeelint": {
3
+ "transforms": [
4
+ "coffee-react-transform"
5
+ ]
6
+ },
7
+ "indentation": {
8
+ "level": "error",
9
+ "value": 4
10
+ },
11
+ "line_endings": {
12
+ "value": "unix",
13
+ "level": "error"
14
+ },
15
+ "arrow_spacing": {
16
+ "level": "error"
17
+ },
18
+ "no_empty_functions": {
19
+ "level": "error"
20
+ },
21
+ "no_empty_param_list": {
22
+ "level": "error"
23
+ },
24
+ "no_interpolation_in_single_quotes": {
25
+ "level": "error"
26
+ },
27
+ "no_throwing_strings": {
28
+ "level": "error"
29
+ },
30
+ "no_unnecessary_double_quotes": {
31
+ "level": "ignore"
32
+ },
33
+ "no_unnecessary_fat_arrows": {
34
+ "level": "error"
35
+ },
36
+ "prefer_english_operator": {
37
+ "level": "ignore"
38
+ },
39
+ "space_operators": {
40
+ "level": "error"
41
+ },
42
+ "spacing_after_comma": {
43
+ "level": "error"
44
+ },
45
+ "max_line_length": {
46
+ "value": 135,
47
+ "level": "error"
48
+ }
49
+ }
data/config.ru CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'bundler'
2
2
  Bundler.require
3
3
  require 'lanes/api'
4
+
4
5
  run Lanes::API::Root
data/config/database.yml CHANGED
@@ -1,9 +1,9 @@
1
1
  development:
2
2
  adapter: postgresql
3
- database: lanes_dev
3
+ database: skr_dev
4
4
  host: /tmp
5
5
 
6
6
  test:
7
7
  adapter: postgresql
8
- database: lanes_test
8
+ database: skr_dev
9
9
  host: /tmp
data/config/routes.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'lanes/access/user'
2
+
3
+ module Lanes
4
+ API.routes.draw do
5
+ resources User
6
+ end
7
+ end
data/docs/command.md CHANGED
@@ -60,13 +60,13 @@ Notable directories created are:
60
60
 
61
61
  # lanes generate
62
62
 
63
- Constructs either a model, view or screen.
63
+ Constructs either a model, component or screen.
64
64
 
65
- ## View
65
+ ## Component
66
66
 
67
- `lanes generate view <name>`
67
+ `lanes generate component <name>`
68
68
 
69
- Will create a new view file, template and an accompanying spec. By default the view will have no content, and it's template is composed of a single DIV.
69
+ Will create a new component file along with an accompanying spec. By default the content will only render a simple [I am a {class_name} component] message.
70
70
 
71
71
 
72
72
  ## Model
@@ -87,11 +87,9 @@ For instance, `lanes generate model comment user:references title:string{80} con
87
87
 
88
88
  `lanes generate screen <name>`
89
89
 
90
- In the Lanes lexicon, a screen is a View that has a few extra properties, "title" and "specification". It is capable of being dynamically loaded and also consolidates pubsub events for all it's client views.
90
+ In the Lanes lexicon, a screen is a Component that is able to be loaded on demand. By default, the styles and Javascript code that make up a screen are not loaded as part of the applications main bundles. Instead the screen is loaded on demand when the user clicks on a menu.
91
91
 
92
- The specification contains attributes that are checked to see if the logged in user can access the screen or not. If they are not allowed access, then the screen will not be listed as available and they will not be able to load it or it's data.
93
-
94
- Remote data events for all subviews are applied by the view, and then bubble up to the screen. This allows the screen to display a notification to the user alerting them that another user edited the data that is being currently displayed.
92
+ Remote data events for all sub components bubble up to the screen. This allows the screen to display a notification to the user alerting them that another user edited data that is being currently displayed somewhere on the view.
95
93
 
96
94
  # lanes update
97
95
 
@@ -109,3 +107,8 @@ When developing a data driven application, the data model usually undergoes seve
109
107
 
110
108
  Calls rake db:migrate for each extension that is loaded. Since lanes extensions ship with migrations, this provides an easy way to install their data structures as well as keep them up to date.
111
109
 
110
+ ## Seed
111
+
112
+ `lanes db seed`
113
+
114
+ Calls rake db:seed for each extension that is loaded. Often an extension will need to ship with certain default records. This provides a way to provision them on install. Commands can be placed in db/seeds.rb to be executed.
data/docs/model.md CHANGED
@@ -9,17 +9,14 @@ Lanes provides a Lanes.Models.Base class that all other models extend from.
9
9
  A Model is an extension of [Ampersand State](http://ampersandjs.com/docs#ampersand-state), and supports all the features that AmpersandState does.
10
10
 
11
11
  <aside class="note">
12
- Unlike the Models in Backbonejs, Lanes' Models track thier "dirty" state. This allows them to perform true HTTP "patch" requests and only send the attributes that have been modified to the server. They can also be interogated and only saved if they contain unsaved data.
12
+ Unlike the Models in Backbonejs, Lanes' Models track their "dirty" state. This allows them to perform true HTTP "patch" requests and only send the attributes that have been modified to the server. They can also be interogated and only saved if they contain unsaved data.
13
13
  </aside>
14
14
 
15
- Models also have associations, which are lazily instanciated and can be optionally fetched along with the model/collection.
16
-
17
- Models and collections use an Identity Map that stores models that are bound to {% doc_link view title:Views %%}
15
+ Models also have associations, which are lazily instantiated and can be optionally fetched along with the model/collection.
18
16
 
19
17
  Model methods that make requests to the server can specify options to control what data is returned. An explanation of the options can be found under [Request Options](#request-options)
20
18
 
21
19
 
22
-
23
20
  ### API Reference
24
21
 
25
22
  # @where
data/docs/react.md ADDED
@@ -0,0 +1,137 @@
1
+ ---
2
+ title: React
3
+ heading: Lanes.React.Component
4
+ ---
5
+
6
+ Lanes uses [React](reactjs.com) for the view layer. It provides an easy-to-use data bindings between it and the data layouer's {% doc_link model %}
7
+
8
+ A simple example of a React component bound to a data model:
9
+
10
+ ``` coffee
11
+
12
+ class MyView extends Lanes.React.Component
13
+
14
+ propTypes:
15
+ model: Lanes.PropTypes.Model.isRequired
16
+
17
+ render: ->
18
+ <h1>Hello {@model.name}</h1>
19
+
20
+ ```
21
+
22
+ Note a few interesting things about this component compared to a standard React one. The first is the non-standard "model" propType, and the second is the @model instance variable used in the `render` method.
23
+
24
+ # propType validators
25
+
26
+ As show above, Lanes provides validators for it's data types. These include:
27
+
28
+
29
+ * `Lanes.PropTypes.Model` Verifies that the property is an instance of `Lanes.Models.Base`
30
+ * `Lanes.PropTypes.State` Checks that the property is an instance of `Lanes.Models.State`. State objects are like models, but do not have the ability to be retreived from or saved to the server. They're usefull for storing lightweight session objects.
31
+ * `Lanes.PropTypes.Collection` Like the models above but for collections.
32
+
33
+ Each of the validators also has a `.isRequired` helper, just like React's built in ones.
34
+
35
+ # dataObjects
36
+
37
+ Lanes data bindings for components will be automatically setup for any prop that is named `model`.
38
+
39
+ If a property named `model` is given, it will be mapped to the `@model` instance. Other properties can also be setup by specifying attributes for `dataObject` In this example, a '@bank` and `@customer` objects are mapped.
40
+
41
+ ``` coffee
42
+
43
+ class MyView extends Lanes.React.Component
44
+
45
+ dataObjects:
46
+ bank: 'props'
47
+ customer: -> GlobalCustomer.lookup('foo')
48
+
49
+ render: ->
50
+ <h1>{@customer.name} has {@bank.balance}</h1>
51
+
52
+ ```
53
+
54
+ As you can see, the bank mapping will be read from the props, while the customer uses a custom lookup strategy. It's function will be called to obtain the value whenever the component is mounted.
55
+
56
+
57
+
58
+ # events
59
+
60
+ By default, Lanes will listen for all events on both models and collections.
61
+
62
+ Every time the events fires, Lanes will call `setState` on the component, causing a re-render. While React is great about making the re-render as efficient as possible, it can sometimes be a good idea to only listen for events that the compoent will be interested int.
63
+
64
+ The events bound can be modified by using the `bindDataEvents` attribute. For instance this component will only render when the name is changed. This makes sense since that's the only attribute of the model that is used.
65
+
66
+
67
+ ``` coffee
68
+
69
+ class MyView extends Lanes.React.Component
70
+
71
+ bindDataEvents:
72
+ model: 'change:name'
73
+
74
+
75
+ render: ->
76
+ <h1>Your name is: {@model.name}</h1>
77
+
78
+ ```
79
+
80
+ The complete list of events Lanes listens to is:
81
+
82
+ * Models:
83
+ * `change`: an attribute was modified
84
+ * `request`: A network request was began
85
+ * `sync`: The network request completed
86
+ * `invalid`: An attempted update failed validation
87
+ * `error`: An error was encountered, usually only fired during network access.
88
+ * Collections:
89
+ * `add`: A model was added
90
+ * `remove`: Model removed
91
+ * `change`: one of the models was changed
92
+ * `sort`: The collection was re-sorted
93
+ * `reset`: All models were removed
94
+ * `request`: A network request was started
95
+ * `sync`: Network request completed
96
+ * `error`: An error occured, usually during network access
97
+
98
+ # setDataState
99
+
100
+ When a bound event is fired for a model, Lanes will call setState on the model with the affected model as the key. Sometimes a component would rather have other information injected into state, or perhaps wants to selectively ignore some changes.
101
+
102
+ Components can do so by implementing a `setDataState` method. If this method exists, it is soley responsible for calling `setState` to trigger a `render`
103
+
104
+ ``` coffee
105
+
106
+ class MyView extends Lanes.React.Component
107
+
108
+ setDataState: (newState) ->
109
+ if newState.model?.name == 'Bob'
110
+ this.setState(wasBob: true)
111
+
112
+ render: ->
113
+ <h1>Has Bob been seen? {if @state.wasBob then 'Yes' else 'No'}</h1>
114
+
115
+ ```
116
+
117
+ # PubSub
118
+
119
+ Publish/Subscribe often abbreviated as simply PubSub is a mechanism where amodel can subscribe to updates for itself and be notified when other users modify it.
120
+
121
+ By default whenever a model is bound to a React component, Lanes will also subscribe that model to updates. When model is unbound or the component is unmounted, Lanes will remove the model from receiving updates as well. This applies only to Models, not State object or Collections.
122
+
123
+ Set `pubsub: false` if Lanes should not bind any models, or to an object with keys for the models that should not be bound
124
+
125
+
126
+ ``` coffee
127
+
128
+ class MyView extends Lanes.React.Component
129
+
130
+ pubsub:
131
+ model: false
132
+
133
+ # could also have just been:
134
+ pubsub: false
135
+
136
+
137
+ ```
data/lanes.gemspec CHANGED
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
33
33
  spec.add_dependency "rack_csrf", "~> 2.5"
34
34
  spec.add_dependency "sprockets", "~> 2.0"
35
35
  spec.add_dependency "coffee-script", "~> 2.3"
36
+ spec.add_dependency "coffee-react", "~> 3.0"
36
37
  spec.add_dependency "execjs", "~> 2.2"
37
38
  spec.add_dependency "thor", "~> 0.19"
38
39
  spec.add_dependency "sass", "~> 3.4"
data/lib/lanes.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  require 'active_record'
2
2
 
3
3
  require_relative "lanes/version"
4
- require_relative "lanes/logger"
5
4
  require_relative "lanes/environment"
6
5
  require_relative "lanes/configuration"
6
+ require_relative "lanes/logger"
7
7
  if defined?(::Rails)
8
8
  require_relative "lanes/rails_engine"
9
9
  end
@@ -13,6 +13,7 @@ module Lanes
13
13
  if Lanes.env.test? && request.env['HTTP_X_TESTING_USER'].present?
14
14
  Lanes::User.where(login: request.env['HTTP_X_TESTING_USER']).first
15
15
  else
16
+ return Lanes::User.first
16
17
  Lanes::User.where(id: request.session['user_id']).first
17
18
  end
18
19
  )
@@ -4,6 +4,8 @@ module Lanes
4
4
  post "/user-session.json" do
5
5
  wrap_reply do
6
6
  user = User.where(login: data['login']).first
7
+ Lanes.logger.warn "Found User: #{user}"
8
+
7
9
  if user && user.authenticate(data['password'])
8
10
  session[:user_id] = user.id
9
11
  { success: true, message: "Login succeeded", data: user.workspace_data }
@@ -1,16 +1,19 @@
1
- Lanes::Screen.define "user-management" do | screen |
2
- screen.title = "User Management"
3
- screen.description = "Add/Remove/Modify User Accounts"
4
- screen.icon = "icon-group"
5
- screen.group_id = "system-settings"
6
- screen.model_class = "User"
7
- screen.view_class = "Lanes.Access.Screens.UserManagement"
8
- screen.js = 'lanes/access/screens/user-management.js'
9
- screen.css = 'lanes/access/screens/user-management.css'
10
- end
11
-
12
1
  Lanes::Screen.define_group "system-settings" do | group |
13
2
  group.title = "System Settings"
14
3
  group.description = "Modify system settings"
15
- group.icon = "icon-wrench"
4
+ group.icon = "wrench"
5
+ end
6
+
7
+ Lanes::Screen.for_extension 'access' do | screens |
8
+ screens.define "user-management" do | screen |
9
+ screen.title = "User Management"
10
+ screen.description = "Add/Remove/Modify User Accounts"
11
+ screen.icon = "group"
12
+ screen.group_id = "system-settings"
13
+ screen.model_class = "User"
14
+ screen.view_class = "UserManagement"
15
+ screen.url_prefix = 'lanes/access/screens'
16
+ screen.js = 'user-management.js'
17
+ screen.css = 'user-management.css'
18
+ end
16
19
  end
@@ -6,7 +6,7 @@ module Lanes
6
6
 
7
7
  identifier "lanes-access"
8
8
 
9
- components 'modal', 'grid', 'select-field'
9
+ components 'grid', 'modal'
10
10
 
11
11
  root_path Pathname.new(__FILE__).dirname.expand_path
12
12
 
@@ -25,6 +25,7 @@ module Lanes
25
25
  def client_paths
26
26
  []
27
27
  end
28
+
28
29
  def roles_for_client
29
30
  Lanes::Access::Role.all_available.map do |role|
30
31
  { id: role.to_s.demodulize.underscore, name: role.to_s.demodulize }