lolita 3.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (402) hide show
  1. data/.document +5 -0
  2. data/.project +17 -0
  3. data/GUIDELINE +15 -0
  4. data/Gemfile +24 -0
  5. data/IDEA +1 -0
  6. data/LICENSE.txt +20 -0
  7. data/README.md +5 -0
  8. data/Rakefile +40 -0
  9. data/VERSION +1 -0
  10. data/app/controllers/lolita/rest_controller.rb +72 -0
  11. data/app/helpers/components/lolita/list_component.rb +9 -0
  12. data/app/helpers/lolita_helper.rb +3 -0
  13. data/app/views/components/lolita/field/_collection.html.erb +5 -0
  14. data/app/views/components/lolita/field/_date.html.erb +1 -0
  15. data/app/views/components/lolita/field/_datetime.html.erb +1 -0
  16. data/app/views/components/lolita/field/_disabled.html.erb +1 -0
  17. data/app/views/components/lolita/field/_display.html.erb +6 -0
  18. data/app/views/components/lolita/field/_integer.html.erb +1 -0
  19. data/app/views/components/lolita/field/_label.html.erb +1 -0
  20. data/app/views/components/lolita/field/_object.html.erb +1 -0
  21. data/app/views/components/lolita/field/_password.html.erb +3 -0
  22. data/app/views/components/lolita/field/_select.html.erb +1 -0
  23. data/app/views/components/lolita/field/_string.html.erb +1 -0
  24. data/app/views/components/lolita/field/_text.html.erb +2 -0
  25. data/app/views/components/lolita/field_set/_display.html.erb +5 -0
  26. data/app/views/components/lolita/list/_body.html.erb +5 -0
  27. data/app/views/components/lolita/list/_body_cell.html.erb +3 -0
  28. data/app/views/components/lolita/list/_checkbox_cell.html.erb +3 -0
  29. data/app/views/components/lolita/list/_checkbox_header.html.erb +3 -0
  30. data/app/views/components/lolita/list/_display.html.erb +11 -0
  31. data/app/views/components/lolita/list/_header.html.erb +9 -0
  32. data/app/views/components/lolita/list/_header_cell.html.erb +5 -0
  33. data/app/views/components/lolita/list/_new_resource.html.erb +4 -0
  34. data/app/views/components/lolita/list/_paginator.html.erb +4 -0
  35. data/app/views/components/lolita/list/_row.html.erb +7 -0
  36. data/app/views/components/lolita/list/_title.html.erb +5 -0
  37. data/app/views/components/lolita/list/_tool_cell.html.erb +4 -0
  38. data/app/views/components/lolita/list/_tool_header.html.erb +3 -0
  39. data/app/views/components/lolita/navigation/_display.html.erb +9 -0
  40. data/app/views/components/lolita/shared/_header.html.erb +7 -0
  41. data/app/views/components/lolita/tab/_content.html.erb +1 -0
  42. data/app/views/components/lolita/tab/_default.html.erb +16 -0
  43. data/app/views/components/lolita/tab/_display.html.erb +7 -0
  44. data/app/views/components/lolita/tabs/_display.html.erb +39 -0
  45. data/app/views/lolita/layouts/application.html.erb +40 -0
  46. data/app/views/lolita/rest/form.html.erb +1 -0
  47. data/app/views/lolita/rest/index.html.erb +1 -0
  48. data/author +1 -0
  49. data/config/locales/en.yml +9 -0
  50. data/db/seed.rb +1 -0
  51. data/lib/generators/helpers/file_helper.rb +22 -0
  52. data/lib/generators/lolita/copy_assets_generator.rb +12 -0
  53. data/lib/generators/lolita/install_generator.rb +25 -0
  54. data/lib/generators/templates/lolita.rb +19 -0
  55. data/lib/lolita.rb +125 -0
  56. data/lib/lolita/adapter/abstract_adapter.rb +13 -0
  57. data/lib/lolita/adapter/active_record.rb +107 -0
  58. data/lib/lolita/adapter/mongoid.rb +101 -0
  59. data/lib/lolita/base_configuration.rb +55 -0
  60. data/lib/lolita/builder.rb +69 -0
  61. data/lib/lolita/configuration/base.rb +76 -0
  62. data/lib/lolita/configuration/column.rb +86 -0
  63. data/lib/lolita/configuration/columns.rb +65 -0
  64. data/lib/lolita/configuration/field.rb +169 -0
  65. data/lib/lolita/configuration/field_extensions/collection.rb +57 -0
  66. data/lib/lolita/configuration/field_set.rb +26 -0
  67. data/lib/lolita/configuration/list.rb +92 -0
  68. data/lib/lolita/configuration/page.rb +98 -0
  69. data/lib/lolita/configuration/tab.rb +181 -0
  70. data/lib/lolita/configuration/tabs.rb +120 -0
  71. data/lib/lolita/controllers/component_helpers.rb +76 -0
  72. data/lib/lolita/controllers/internal_helpers.rb +73 -0
  73. data/lib/lolita/controllers/url_helpers.rb +41 -0
  74. data/lib/lolita/controllers/user_helpers.rb +29 -0
  75. data/lib/lolita/dbi/base.rb +50 -0
  76. data/lib/lolita/errors.rb +10 -0
  77. data/lib/lolita/hooks/base.rb +58 -0
  78. data/lib/lolita/hooks/component.rb +15 -0
  79. data/lib/lolita/hooks/hooks.rb +15 -0
  80. data/lib/lolita/lazy_loader.rb +47 -0
  81. data/lib/lolita/mapping.rb +34 -0
  82. data/lib/lolita/modules.rb +20 -0
  83. data/lib/lolita/modules/rest.rb +9 -0
  84. data/lib/lolita/observed_array.rb +68 -0
  85. data/lib/lolita/rails.rb +18 -0
  86. data/lib/lolita/rails/routes.rb +77 -0
  87. data/lib/lolita/ruby_ext/accessors.rb +27 -0
  88. data/lib/lolita/version.rb +3 -0
  89. data/log/development.log +0 -0
  90. data/lolita.gemspec +506 -0
  91. data/public/javascripts/jquery-1.5.1.min.js +16 -0
  92. data/public/javascripts/lolita/main.js +6 -0
  93. data/public/javascripts/lolita/tab.js +37 -0
  94. data/public/javascripts/modernizr-1.7.min.js +2 -0
  95. data/public/javascripts/rails.js +137 -0
  96. data/public/javascripts/tinymce/jquery.tinymce.js +1 -0
  97. data/public/javascripts/tinymce/langs/en.js +222 -0
  98. data/public/javascripts/tinymce/license.txt +504 -0
  99. data/public/javascripts/tinymce/plugins/advhr/css/advhr.css +5 -0
  100. data/public/javascripts/tinymce/plugins/advhr/editor_plugin.js +1 -0
  101. data/public/javascripts/tinymce/plugins/advhr/editor_plugin_src.js +57 -0
  102. data/public/javascripts/tinymce/plugins/advhr/js/rule.js +43 -0
  103. data/public/javascripts/tinymce/plugins/advhr/langs/en_dlg.js +7 -0
  104. data/public/javascripts/tinymce/plugins/advhr/rule.htm +58 -0
  105. data/public/javascripts/tinymce/plugins/advimage/css/advimage.css +13 -0
  106. data/public/javascripts/tinymce/plugins/advimage/editor_plugin.js +1 -0
  107. data/public/javascripts/tinymce/plugins/advimage/editor_plugin_src.js +50 -0
  108. data/public/javascripts/tinymce/plugins/advimage/image.htm +235 -0
  109. data/public/javascripts/tinymce/plugins/advimage/img/sample.gif +0 -0
  110. data/public/javascripts/tinymce/plugins/advimage/js/image.js +445 -0
  111. data/public/javascripts/tinymce/plugins/advimage/langs/en_dlg.js +45 -0
  112. data/public/javascripts/tinymce/plugins/advlink/css/advlink.css +8 -0
  113. data/public/javascripts/tinymce/plugins/advlink/editor_plugin.js +1 -0
  114. data/public/javascripts/tinymce/plugins/advlink/editor_plugin_src.js +61 -0
  115. data/public/javascripts/tinymce/plugins/advlink/js/advlink.js +525 -0
  116. data/public/javascripts/tinymce/plugins/advlink/langs/en_dlg.js +54 -0
  117. data/public/javascripts/tinymce/plugins/advlink/link.htm +338 -0
  118. data/public/javascripts/tinymce/plugins/advlist/editor_plugin.js +1 -0
  119. data/public/javascripts/tinymce/plugins/advlist/editor_plugin_src.js +154 -0
  120. data/public/javascripts/tinymce/plugins/autoresize/editor_plugin.js +1 -0
  121. data/public/javascripts/tinymce/plugins/autoresize/editor_plugin_src.js +119 -0
  122. data/public/javascripts/tinymce/plugins/autosave/editor_plugin.js +1 -0
  123. data/public/javascripts/tinymce/plugins/autosave/editor_plugin_src.js +431 -0
  124. data/public/javascripts/tinymce/plugins/autosave/langs/en.js +4 -0
  125. data/public/javascripts/tinymce/plugins/bbcode/editor_plugin.js +1 -0
  126. data/public/javascripts/tinymce/plugins/bbcode/editor_plugin_src.js +120 -0
  127. data/public/javascripts/tinymce/plugins/contextmenu/editor_plugin.js +1 -0
  128. data/public/javascripts/tinymce/plugins/contextmenu/editor_plugin_src.js +154 -0
  129. data/public/javascripts/tinymce/plugins/directionality/editor_plugin.js +1 -0
  130. data/public/javascripts/tinymce/plugins/directionality/editor_plugin_src.js +82 -0
  131. data/public/javascripts/tinymce/plugins/emotions/editor_plugin.js +1 -0
  132. data/public/javascripts/tinymce/plugins/emotions/editor_plugin_src.js +43 -0
  133. data/public/javascripts/tinymce/plugins/emotions/emotions.htm +41 -0
  134. data/public/javascripts/tinymce/plugins/emotions/img/smiley-cool.gif +0 -0
  135. data/public/javascripts/tinymce/plugins/emotions/img/smiley-cry.gif +0 -0
  136. data/public/javascripts/tinymce/plugins/emotions/img/smiley-embarassed.gif +0 -0
  137. data/public/javascripts/tinymce/plugins/emotions/img/smiley-foot-in-mouth.gif +0 -0
  138. data/public/javascripts/tinymce/plugins/emotions/img/smiley-frown.gif +0 -0
  139. data/public/javascripts/tinymce/plugins/emotions/img/smiley-innocent.gif +0 -0
  140. data/public/javascripts/tinymce/plugins/emotions/img/smiley-kiss.gif +0 -0
  141. data/public/javascripts/tinymce/plugins/emotions/img/smiley-laughing.gif +0 -0
  142. data/public/javascripts/tinymce/plugins/emotions/img/smiley-money-mouth.gif +0 -0
  143. data/public/javascripts/tinymce/plugins/emotions/img/smiley-sealed.gif +0 -0
  144. data/public/javascripts/tinymce/plugins/emotions/img/smiley-smile.gif +0 -0
  145. data/public/javascripts/tinymce/plugins/emotions/img/smiley-surprised.gif +0 -0
  146. data/public/javascripts/tinymce/plugins/emotions/img/smiley-tongue-out.gif +0 -0
  147. data/public/javascripts/tinymce/plugins/emotions/img/smiley-undecided.gif +0 -0
  148. data/public/javascripts/tinymce/plugins/emotions/img/smiley-wink.gif +0 -0
  149. data/public/javascripts/tinymce/plugins/emotions/img/smiley-yell.gif +0 -0
  150. data/public/javascripts/tinymce/plugins/emotions/js/emotions.js +22 -0
  151. data/public/javascripts/tinymce/plugins/emotions/langs/en_dlg.js +20 -0
  152. data/public/javascripts/tinymce/plugins/example/dialog.htm +22 -0
  153. data/public/javascripts/tinymce/plugins/example/editor_plugin.js +1 -0
  154. data/public/javascripts/tinymce/plugins/example/editor_plugin_src.js +84 -0
  155. data/public/javascripts/tinymce/plugins/example/img/example.gif +0 -0
  156. data/public/javascripts/tinymce/plugins/example/js/dialog.js +19 -0
  157. data/public/javascripts/tinymce/plugins/example/langs/en.js +3 -0
  158. data/public/javascripts/tinymce/plugins/example/langs/en_dlg.js +3 -0
  159. data/public/javascripts/tinymce/plugins/fullpage/css/fullpage.css +182 -0
  160. data/public/javascripts/tinymce/plugins/fullpage/editor_plugin.js +1 -0
  161. data/public/javascripts/tinymce/plugins/fullpage/editor_plugin_src.js +166 -0
  162. data/public/javascripts/tinymce/plugins/fullpage/fullpage.htm +571 -0
  163. data/public/javascripts/tinymce/plugins/fullpage/js/fullpage.js +492 -0
  164. data/public/javascripts/tinymce/plugins/fullpage/langs/en_dlg.js +85 -0
  165. data/public/javascripts/tinymce/plugins/fullscreen/editor_plugin.js +1 -0
  166. data/public/javascripts/tinymce/plugins/fullscreen/editor_plugin_src.js +159 -0
  167. data/public/javascripts/tinymce/plugins/fullscreen/fullscreen.htm +109 -0
  168. data/public/javascripts/tinymce/plugins/iespell/editor_plugin.js +1 -0
  169. data/public/javascripts/tinymce/plugins/iespell/editor_plugin_src.js +54 -0
  170. data/public/javascripts/tinymce/plugins/inlinepopups/editor_plugin.js +1 -0
  171. data/public/javascripts/tinymce/plugins/inlinepopups/editor_plugin_src.js +696 -0
  172. data/public/javascripts/tinymce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
  173. data/public/javascripts/tinymce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
  174. data/public/javascripts/tinymce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
  175. data/public/javascripts/tinymce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
  176. data/public/javascripts/tinymce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
  177. data/public/javascripts/tinymce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
  178. data/public/javascripts/tinymce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
  179. data/public/javascripts/tinymce/plugins/inlinepopups/skins/clearlooks2/window.css +90 -0
  180. data/public/javascripts/tinymce/plugins/inlinepopups/template.htm +387 -0
  181. data/public/javascripts/tinymce/plugins/insertdatetime/editor_plugin.js +1 -0
  182. data/public/javascripts/tinymce/plugins/insertdatetime/editor_plugin_src.js +83 -0
  183. data/public/javascripts/tinymce/plugins/layer/editor_plugin.js +1 -0
  184. data/public/javascripts/tinymce/plugins/layer/editor_plugin_src.js +214 -0
  185. data/public/javascripts/tinymce/plugins/legacyoutput/editor_plugin.js +1 -0
  186. data/public/javascripts/tinymce/plugins/legacyoutput/editor_plugin_src.js +139 -0
  187. data/public/javascripts/tinymce/plugins/media/css/media.css +17 -0
  188. data/public/javascripts/tinymce/plugins/media/editor_plugin.js +1 -0
  189. data/public/javascripts/tinymce/plugins/media/editor_plugin_src.js +770 -0
  190. data/public/javascripts/tinymce/plugins/media/js/embed.js +73 -0
  191. data/public/javascripts/tinymce/plugins/media/js/media.js +340 -0
  192. data/public/javascripts/tinymce/plugins/media/langs/en_dlg.js +109 -0
  193. data/public/javascripts/tinymce/plugins/media/media.htm +812 -0
  194. data/public/javascripts/tinymce/plugins/media/moxieplayer.swf +0 -0
  195. data/public/javascripts/tinymce/plugins/nonbreaking/editor_plugin.js +1 -0
  196. data/public/javascripts/tinymce/plugins/nonbreaking/editor_plugin_src.js +53 -0
  197. data/public/javascripts/tinymce/plugins/noneditable/editor_plugin.js +1 -0
  198. data/public/javascripts/tinymce/plugins/noneditable/editor_plugin_src.js +90 -0
  199. data/public/javascripts/tinymce/plugins/pagebreak/editor_plugin.js +1 -0
  200. data/public/javascripts/tinymce/plugins/pagebreak/editor_plugin_src.js +74 -0
  201. data/public/javascripts/tinymce/plugins/paste/editor_plugin.js +1 -0
  202. data/public/javascripts/tinymce/plugins/paste/editor_plugin_src.js +899 -0
  203. data/public/javascripts/tinymce/plugins/paste/js/pastetext.js +36 -0
  204. data/public/javascripts/tinymce/plugins/paste/js/pasteword.js +51 -0
  205. data/public/javascripts/tinymce/plugins/paste/langs/en_dlg.js +5 -0
  206. data/public/javascripts/tinymce/plugins/paste/pastetext.htm +27 -0
  207. data/public/javascripts/tinymce/plugins/paste/pasteword.htm +21 -0
  208. data/public/javascripts/tinymce/plugins/preview/editor_plugin.js +1 -0
  209. data/public/javascripts/tinymce/plugins/preview/editor_plugin_src.js +53 -0
  210. data/public/javascripts/tinymce/plugins/preview/example.html +28 -0
  211. data/public/javascripts/tinymce/plugins/preview/jscripts/embed.js +73 -0
  212. data/public/javascripts/tinymce/plugins/preview/preview.html +17 -0
  213. data/public/javascripts/tinymce/plugins/print/editor_plugin.js +1 -0
  214. data/public/javascripts/tinymce/plugins/print/editor_plugin_src.js +34 -0
  215. data/public/javascripts/tinymce/plugins/save/editor_plugin.js +1 -0
  216. data/public/javascripts/tinymce/plugins/save/editor_plugin_src.js +101 -0
  217. data/public/javascripts/tinymce/plugins/searchreplace/css/searchreplace.css +6 -0
  218. data/public/javascripts/tinymce/plugins/searchreplace/editor_plugin.js +1 -0
  219. data/public/javascripts/tinymce/plugins/searchreplace/editor_plugin_src.js +61 -0
  220. data/public/javascripts/tinymce/plugins/searchreplace/js/searchreplace.js +140 -0
  221. data/public/javascripts/tinymce/plugins/searchreplace/langs/en_dlg.js +16 -0
  222. data/public/javascripts/tinymce/plugins/searchreplace/searchreplace.htm +100 -0
  223. data/public/javascripts/tinymce/plugins/spellchecker/css/content.css +1 -0
  224. data/public/javascripts/tinymce/plugins/spellchecker/editor_plugin.js +1 -0
  225. data/public/javascripts/tinymce/plugins/spellchecker/editor_plugin_src.js +415 -0
  226. data/public/javascripts/tinymce/plugins/spellchecker/img/wline.gif +0 -0
  227. data/public/javascripts/tinymce/plugins/style/css/props.css +13 -0
  228. data/public/javascripts/tinymce/plugins/style/editor_plugin.js +1 -0
  229. data/public/javascripts/tinymce/plugins/style/editor_plugin_src.js +55 -0
  230. data/public/javascripts/tinymce/plugins/style/js/props.js +635 -0
  231. data/public/javascripts/tinymce/plugins/style/langs/en_dlg.js +70 -0
  232. data/public/javascripts/tinymce/plugins/style/props.htm +838 -0
  233. data/public/javascripts/tinymce/plugins/tabfocus/editor_plugin.js +1 -0
  234. data/public/javascripts/tinymce/plugins/tabfocus/editor_plugin_src.js +114 -0
  235. data/public/javascripts/tinymce/plugins/table/cell.htm +178 -0
  236. data/public/javascripts/tinymce/plugins/table/css/cell.css +17 -0
  237. data/public/javascripts/tinymce/plugins/table/css/row.css +25 -0
  238. data/public/javascripts/tinymce/plugins/table/css/table.css +13 -0
  239. data/public/javascripts/tinymce/plugins/table/editor_plugin.js +1 -0
  240. data/public/javascripts/tinymce/plugins/table/editor_plugin_src.js +1183 -0
  241. data/public/javascripts/tinymce/plugins/table/js/cell.js +284 -0
  242. data/public/javascripts/tinymce/plugins/table/js/merge_cells.js +27 -0
  243. data/public/javascripts/tinymce/plugins/table/js/row.js +232 -0
  244. data/public/javascripts/tinymce/plugins/table/js/table.js +450 -0
  245. data/public/javascripts/tinymce/plugins/table/langs/en_dlg.js +74 -0
  246. data/public/javascripts/tinymce/plugins/table/merge_cells.htm +32 -0
  247. data/public/javascripts/tinymce/plugins/table/row.htm +157 -0
  248. data/public/javascripts/tinymce/plugins/table/table.htm +188 -0
  249. data/public/javascripts/tinymce/plugins/template/blank.htm +12 -0
  250. data/public/javascripts/tinymce/plugins/template/css/template.css +23 -0
  251. data/public/javascripts/tinymce/plugins/template/editor_plugin.js +1 -0
  252. data/public/javascripts/tinymce/plugins/template/editor_plugin_src.js +159 -0
  253. data/public/javascripts/tinymce/plugins/template/js/template.js +106 -0
  254. data/public/javascripts/tinymce/plugins/template/langs/en_dlg.js +15 -0
  255. data/public/javascripts/tinymce/plugins/template/template.htm +31 -0
  256. data/public/javascripts/tinymce/plugins/visualchars/editor_plugin.js +1 -0
  257. data/public/javascripts/tinymce/plugins/visualchars/editor_plugin_src.js +83 -0
  258. data/public/javascripts/tinymce/plugins/wordcount/editor_plugin.js +1 -0
  259. data/public/javascripts/tinymce/plugins/wordcount/editor_plugin_src.js +114 -0
  260. data/public/javascripts/tinymce/plugins/xhtmlxtras/abbr.htm +142 -0
  261. data/public/javascripts/tinymce/plugins/xhtmlxtras/acronym.htm +142 -0
  262. data/public/javascripts/tinymce/plugins/xhtmlxtras/attributes.htm +149 -0
  263. data/public/javascripts/tinymce/plugins/xhtmlxtras/cite.htm +142 -0
  264. data/public/javascripts/tinymce/plugins/xhtmlxtras/css/attributes.css +11 -0
  265. data/public/javascripts/tinymce/plugins/xhtmlxtras/css/popup.css +9 -0
  266. data/public/javascripts/tinymce/plugins/xhtmlxtras/del.htm +162 -0
  267. data/public/javascripts/tinymce/plugins/xhtmlxtras/editor_plugin.js +1 -0
  268. data/public/javascripts/tinymce/plugins/xhtmlxtras/editor_plugin_src.js +132 -0
  269. data/public/javascripts/tinymce/plugins/xhtmlxtras/ins.htm +162 -0
  270. data/public/javascripts/tinymce/plugins/xhtmlxtras/js/abbr.js +28 -0
  271. data/public/javascripts/tinymce/plugins/xhtmlxtras/js/acronym.js +28 -0
  272. data/public/javascripts/tinymce/plugins/xhtmlxtras/js/attributes.js +125 -0
  273. data/public/javascripts/tinymce/plugins/xhtmlxtras/js/cite.js +28 -0
  274. data/public/javascripts/tinymce/plugins/xhtmlxtras/js/del.js +53 -0
  275. data/public/javascripts/tinymce/plugins/xhtmlxtras/js/element_common.js +229 -0
  276. data/public/javascripts/tinymce/plugins/xhtmlxtras/js/ins.js +53 -0
  277. data/public/javascripts/tinymce/plugins/xhtmlxtras/langs/en_dlg.js +32 -0
  278. data/public/javascripts/tinymce/themes/advanced/about.htm +52 -0
  279. data/public/javascripts/tinymce/themes/advanced/anchor.htm +26 -0
  280. data/public/javascripts/tinymce/themes/advanced/charmap.htm +51 -0
  281. data/public/javascripts/tinymce/themes/advanced/color_picker.htm +74 -0
  282. data/public/javascripts/tinymce/themes/advanced/editor_template.js +1 -0
  283. data/public/javascripts/tinymce/themes/advanced/editor_template_src.js +1328 -0
  284. data/public/javascripts/tinymce/themes/advanced/image.htm +80 -0
  285. data/public/javascripts/tinymce/themes/advanced/img/colorpicker.jpg +0 -0
  286. data/public/javascripts/tinymce/themes/advanced/img/flash.gif +0 -0
  287. data/public/javascripts/tinymce/themes/advanced/img/icons.gif +0 -0
  288. data/public/javascripts/tinymce/themes/advanced/img/iframe.gif +0 -0
  289. data/public/javascripts/tinymce/themes/advanced/img/pagebreak.gif +0 -0
  290. data/public/javascripts/tinymce/themes/advanced/img/quicktime.gif +0 -0
  291. data/public/javascripts/tinymce/themes/advanced/img/realmedia.gif +0 -0
  292. data/public/javascripts/tinymce/themes/advanced/img/shockwave.gif +0 -0
  293. data/public/javascripts/tinymce/themes/advanced/img/trans.gif +0 -0
  294. data/public/javascripts/tinymce/themes/advanced/img/video.gif +0 -0
  295. data/public/javascripts/tinymce/themes/advanced/img/windowsmedia.gif +0 -0
  296. data/public/javascripts/tinymce/themes/advanced/js/about.js +73 -0
  297. data/public/javascripts/tinymce/themes/advanced/js/anchor.js +42 -0
  298. data/public/javascripts/tinymce/themes/advanced/js/charmap.js +354 -0
  299. data/public/javascripts/tinymce/themes/advanced/js/color_picker.js +329 -0
  300. data/public/javascripts/tinymce/themes/advanced/js/image.js +247 -0
  301. data/public/javascripts/tinymce/themes/advanced/js/link.js +153 -0
  302. data/public/javascripts/tinymce/themes/advanced/js/source_editor.js +56 -0
  303. data/public/javascripts/tinymce/themes/advanced/langs/en.js +68 -0
  304. data/public/javascripts/tinymce/themes/advanced/langs/en_dlg.js +54 -0
  305. data/public/javascripts/tinymce/themes/advanced/link.htm +57 -0
  306. data/public/javascripts/tinymce/themes/advanced/shortcuts.htm +47 -0
  307. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/content.css +66 -0
  308. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/dialog.css +117 -0
  309. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/img/butt2.png +0 -0
  310. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/img/button-bg.png +0 -0
  311. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/img/buttons.png +0 -0
  312. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/img/down_arrow.gif +0 -0
  313. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/img/fade-butt.png +0 -0
  314. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/img/icons.png +0 -0
  315. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/img/items.gif +0 -0
  316. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/img/menu-arrow.png +0 -0
  317. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/img/menu-check.png +0 -0
  318. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/img/progress.gif +0 -0
  319. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/img/tabs.gif +0 -0
  320. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/img/toolbarbg.png +0 -0
  321. data/public/javascripts/tinymce/themes/advanced/skins/cirkuit/ui.css +988 -0
  322. data/public/javascripts/tinymce/themes/advanced/skins/default/content.css +47 -0
  323. data/public/javascripts/tinymce/themes/advanced/skins/default/dialog.css +117 -0
  324. data/public/javascripts/tinymce/themes/advanced/skins/default/img/buttons.png +0 -0
  325. data/public/javascripts/tinymce/themes/advanced/skins/default/img/items.gif +0 -0
  326. data/public/javascripts/tinymce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  327. data/public/javascripts/tinymce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  328. data/public/javascripts/tinymce/themes/advanced/skins/default/img/progress.gif +0 -0
  329. data/public/javascripts/tinymce/themes/advanced/skins/default/img/tabs.gif +0 -0
  330. data/public/javascripts/tinymce/themes/advanced/skins/default/ui.css +213 -0
  331. data/public/javascripts/tinymce/themes/advanced/skins/highcontrast/content.css +23 -0
  332. data/public/javascripts/tinymce/themes/advanced/skins/highcontrast/dialog.css +105 -0
  333. data/public/javascripts/tinymce/themes/advanced/skins/highcontrast/ui.css +101 -0
  334. data/public/javascripts/tinymce/themes/advanced/skins/o2k7/content.css +46 -0
  335. data/public/javascripts/tinymce/themes/advanced/skins/o2k7/dialog.css +116 -0
  336. data/public/javascripts/tinymce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  337. data/public/javascripts/tinymce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  338. data/public/javascripts/tinymce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  339. data/public/javascripts/tinymce/themes/advanced/skins/o2k7/ui.css +215 -0
  340. data/public/javascripts/tinymce/themes/advanced/skins/o2k7/ui_black.css +8 -0
  341. data/public/javascripts/tinymce/themes/advanced/skins/o2k7/ui_silver.css +5 -0
  342. data/public/javascripts/tinymce/themes/advanced/source_editor.htm +25 -0
  343. data/public/javascripts/tinymce/themes/simple/editor_template.js +1 -0
  344. data/public/javascripts/tinymce/themes/simple/editor_template_src.js +84 -0
  345. data/public/javascripts/tinymce/themes/simple/img/icons.gif +0 -0
  346. data/public/javascripts/tinymce/themes/simple/langs/en.js +11 -0
  347. data/public/javascripts/tinymce/themes/simple/skins/default/content.css +25 -0
  348. data/public/javascripts/tinymce/themes/simple/skins/default/ui.css +32 -0
  349. data/public/javascripts/tinymce/themes/simple/skins/o2k7/content.css +17 -0
  350. data/public/javascripts/tinymce/themes/simple/skins/o2k7/img/button_bg.png +0 -0
  351. data/public/javascripts/tinymce/themes/simple/skins/o2k7/ui.css +35 -0
  352. data/public/javascripts/tinymce/tiny_mce.js +1 -0
  353. data/public/javascripts/tinymce/tiny_mce_popup.js +5 -0
  354. data/public/javascripts/tinymce/tiny_mce_src.js +14724 -0
  355. data/public/javascripts/tinymce/utils/editable_selects.js +70 -0
  356. data/public/javascripts/tinymce/utils/form_utils.js +207 -0
  357. data/public/javascripts/tinymce/utils/mctabs.js +162 -0
  358. data/public/javascripts/tinymce/utils/validate.js +252 -0
  359. data/public/stylesheets/lolita/default.css +169 -0
  360. data/public/stylesheets/lolita/style.css +188 -0
  361. data/spec/adapter_helper.rb +44 -0
  362. data/spec/configuration/base_spec.rb +44 -0
  363. data/spec/configuration/column_spec.rb +45 -0
  364. data/spec/configuration/columns_spec.rb +54 -0
  365. data/spec/configuration/field_set_spec.rb +12 -0
  366. data/spec/configuration/field_spec.rb +107 -0
  367. data/spec/configuration/list_spec.rb +76 -0
  368. data/spec/configuration/page_spec.rb +20 -0
  369. data/spec/configuration/tab_spec.rb +118 -0
  370. data/spec/configuration/tabs_spec.rb +83 -0
  371. data/spec/controllers/internal_helpers_spec.rb +36 -0
  372. data/spec/controllers/lolita_rest_spec.rb +25 -0
  373. data/spec/dbi/base_spec.rb +34 -0
  374. data/spec/lolita_spec.rb +11 -0
  375. data/spec/mapping_spec.rb +29 -0
  376. data/spec/orm/mongoid.rb +15 -0
  377. data/spec/rails_app/app/controllers/application_controller.rb +3 -0
  378. data/spec/rails_app/app/helpers/application_helper.rb +3 -0
  379. data/spec/rails_app/app/mongoid/address.rb +8 -0
  380. data/spec/rails_app/app/mongoid/comment.rb +6 -0
  381. data/spec/rails_app/app/mongoid/post.rb +9 -0
  382. data/spec/rails_app/app/mongoid/preference.rb +6 -0
  383. data/spec/rails_app/app/mongoid/profile.rb +14 -0
  384. data/spec/rails_app/app/views/components/lolita/list/_body_cell.html.erb +1 -0
  385. data/spec/rails_app/config/application.rb +25 -0
  386. data/spec/rails_app/config/boot.rb +14 -0
  387. data/spec/rails_app/config/environment.rb +5 -0
  388. data/spec/rails_app/config/environments/development.rb +19 -0
  389. data/spec/rails_app/config/environments/production.rb +33 -0
  390. data/spec/rails_app/config/environments/test.rb +33 -0
  391. data/spec/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  392. data/spec/rails_app/config/initializers/inflections.rb +2 -0
  393. data/spec/rails_app/config/initializers/load_my_cells.rb +7 -0
  394. data/spec/rails_app/config/initializers/secret_token.rb +2 -0
  395. data/spec/rails_app/config/routes.rb +3 -0
  396. data/spec/rails_app/db/schema.rb +0 -0
  397. data/spec/routing/routes_spec.rb +15 -0
  398. data/spec/spec_helper.rb +48 -0
  399. data/spec/support/factories/post.rb +3 -0
  400. data/test/cells/form_cell_test.rb +15 -0
  401. data/test/test_helper.rb +2 -0
  402. metadata +598 -0
@@ -0,0 +1,57 @@
1
+ module Lolita
2
+ module Configuration
3
+ # Field Extensions is used to extend Field instances. FieldExtensions allow
4
+ # different field types have same property with different functionality. For
5
+ # example, <code>:find_options</code>, it is possible to avoid <code>order</code>
6
+ # and <code>group</code> usage when it is not neccessary and allow when you
7
+ # need it.
8
+ # It depends on field
9
+ # _type_. Each different field type, can have one extension module. Instance
10
+ # will be automaticly extended when type is assigned, therefor type should
11
+ # be called before any type-specific method is called.
12
+ module FieldExtensions
13
+ module Collection
14
+
15
+ lolita_accessor :conditions,:text_method,:value_method,:find_options
16
+
17
+ # Collect values for collection type field.
18
+ # Uses <code>text_method</code> for content. By default it search for
19
+ # first _String_ type field in DB. Uses <code>value_method</code> for value,
20
+ # by default it it is <code>id</code>. Use <code>conditions</code> or
21
+ # <code>find_options</code> for advanced search. When <code>find_options</code>
22
+ # is used, than <code>conditions</code> is ignored.
23
+ def association_values() #TODO test
24
+ if @association
25
+ klass=@dbi.association_class_name(@association).camelize.constantize
26
+ current_text_method=@text_method || default_text_method(klass)
27
+ current_value_method=@value_method || :id
28
+ options=@find_options || {}
29
+ options[:conditions]||=@conditions
30
+
31
+ klass.find(:all,options).map{|r|
32
+ [r.send(current_text_method),r.send(current_value_method)]
33
+ }
34
+ else
35
+ []
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def default_text_method(klass)
42
+ assoc_dbi=Lolita::DBI::Base.new(klass)
43
+ field=assoc_dbi.fields.detect{|f| f[:type].downcase=="string"}
44
+ if field
45
+ field[:name]
46
+ else
47
+ raise Lolita::FieldTypeError, %^
48
+ Can't find any content field in #{assoc_dbi.klass}.
49
+ Use text_method in #{klass} to set one.
50
+ ^
51
+ end
52
+ end
53
+ # MODULE end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,26 @@
1
+ module Lolita
2
+ module Configuration
3
+ class FieldSet
4
+
5
+ @@last_fieldset=0
6
+
7
+ attr_reader :parent
8
+ attr_accessor :name
9
+
10
+ def initialize parent,name=nil
11
+ @parent=parent
12
+ self.name=name || "fieldset_#{next_fieldset}"
13
+ end
14
+
15
+ def fields
16
+ self.parent.fields.reject{|f| f.field_set!=self}
17
+ end
18
+
19
+ private
20
+
21
+ def next_fieldset
22
+ @@last_fieldset+=1
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,92 @@
1
+ module Lolita
2
+ module Configuration
3
+ class List
4
+ include Lolita::Builder
5
+
6
+ attr_reader :dbi,:initialized_attributes
7
+
8
+ def initialize(*args,&block)
9
+ if args && args[0].is_a?(Lolita::DBI::Base)
10
+ @dbi=args.shift
11
+ end
12
+ @columns=Lolita::Configuration::Columns.new(self)
13
+ @set_attributes=[]
14
+ set_attributes(*args)
15
+ self.instance_eval(&block) if block_given?
16
+ self.generate!()
17
+ end
18
+
19
+ # Look for methods in Page class. Load @page on demand and call method on it.
20
+ def method_missing(method_name,*args,&block)
21
+ if Lolita::Configuration::Page.public_instance_methods.include?(method_name.to_sym)
22
+ @page||=Lolita::Configuration::Page.new(@dbi)
23
+ @page.send(method_name.to_sym,*args,&block)
24
+ else
25
+ super
26
+ end
27
+ end
28
+ # Set columns. Allowed classes are Lolita::Configuration::Columns or
29
+ # Array.
30
+ def columns=(value)
31
+ set_attribute(:columns)
32
+ if value.is_a?(Lolita::Configuration::Columns)
33
+ @columns=value
34
+ elsif value.is_a?(Array)
35
+ value.each{|el| @columns<<el}
36
+ else
37
+ raise ArgumentError.new("Columns must bet Array or Lolita::Configuration::Columns.")
38
+ end
39
+ end
40
+
41
+ # Get list columns (also block setter)
42
+ def columns(*args)
43
+ if args && !args.empty?
44
+ self.columns=args
45
+ end
46
+ self.generate!
47
+ @columns
48
+ end
49
+
50
+ # Generate uninitialized attributes
51
+ def generate!()
52
+ @columns.generate! unless is_set?(:columns)
53
+ end
54
+
55
+ private
56
+
57
+ # Used to set attributes if block not given.
58
+ def set_attributes(*args)
59
+ if args && args[0]
60
+ if args[0].is_a?(Hash)
61
+ args[0].each{|m,value|
62
+ self.send("#{m}=".to_sym,value)
63
+ }
64
+ else
65
+ raise ArgumentError.new("Lolita::Configuration::List arguments must be Hash instead of #{args[0].class}")
66
+ end
67
+ end
68
+ end
69
+
70
+ # Mark attribute as set.
71
+ def set_attribute(var)
72
+ @set_attributes<<var unless is_set?(var)
73
+ end
74
+
75
+ # Determine if attribute is set and don't need to generate it.
76
+ def is_set?(var)
77
+ @set_attributes.include?(var)
78
+ end
79
+
80
+ # Block setter for columns
81
+ def column(*args,&block)
82
+ set_attribute(:columns)
83
+ if block_given?
84
+ @columns<<block
85
+ else
86
+ @columns<<args[0]
87
+ end
88
+ end
89
+
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,98 @@
1
+ module Lolita
2
+ module Configuration
3
+ class Page
4
+
5
+ # page options is used to define specific options for pagination like :joins or :conditions
6
+ lolita_accessor :page_options
7
+ attr_writer :per_page
8
+ def initialize(dbi)
9
+ @dbi=dbi
10
+ @sort_columns=[]
11
+ end
12
+
13
+ # Records per page (also block setter)
14
+ def per_page(value=nil)
15
+ if value
16
+ @per_page=value
17
+ self
18
+ else
19
+ @per_page
20
+ end
21
+ end
22
+
23
+ # Define new sort column with ascending sort direction
24
+ def asc(column)
25
+ @sort_columns<<[column.to_sym,:asc]
26
+ self
27
+ end
28
+
29
+ # Define new sort columns with descending sort direction
30
+ def desc(column)
31
+ @sort_columns<<[column.to_sym,:desc]
32
+ self
33
+ end
34
+
35
+ # Return all sort columns.
36
+ # Each column is an Array where first element is column name and second is direction
37
+ # ====Example
38
+ # page=Lolita::Configuration::Page.new(@dbi)
39
+ # page.asc(:created_at)
40
+ # page.sort_columns #=> [[:created_at,:asc]]
41
+ def sort_columns
42
+ @sort_columns
43
+ end
44
+
45
+ # Paginate
46
+ # Options:
47
+ # * <tt>:per_page</tt> - record count per page, default uses list.per_page
48
+ # * <tt>:page</tt> - what page to show
49
+ # * <tt>:sort_columns</tt> - sort columns for page. See #sort_columns
50
+ # * <tt>:asc</tt> - column to sort in ascending direction
51
+ # list.paginate(1,:asc=>:created_at)
52
+ # * <tt>:desc</tt> - column to sort in descending direction
53
+ #
54
+ # ====Example
55
+ # list.paginate(1)
56
+ # list.paginate
57
+ # list.paginate(:per_page=>2,:page=>1)
58
+ def paginate *args
59
+ options=args ? args.extract_options! : {}
60
+ hold=options.delete(:hold)
61
+ set_values_from_options(options)
62
+ options[:page]||=((args && args.first) || 1)
63
+ options[:per_page]||=@per_page || 10
64
+ @last_options=options
65
+ @last_options[:sort]=self.sort_columns.empty? ? nil : self.sort_columns
66
+ unless hold
67
+ get_page()
68
+ end
69
+ end
70
+
71
+ def get_page()
72
+ @page=@dbi.paginate((@page_options||{}).merge(@last_options))
73
+ end
74
+ # Return last paginated page
75
+ # ====Example
76
+ # list.paginate(2)
77
+ # # call page to avoid another call to db
78
+ # list.page
79
+ def last_page
80
+ @page
81
+ end
82
+
83
+ private
84
+
85
+ def allowed_options
86
+ [:sort_columns,:asc,:desc]
87
+ end
88
+
89
+ def set_values_from_options(options)
90
+ allowed_options.each{|meth|
91
+ if options.has_key?(meth)
92
+ self.send(meth,options.delete(meth))
93
+ end
94
+ }
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,181 @@
1
+ module Lolita
2
+ module Configuration
3
+ # Tab is used as a container for different type of resource content.
4
+ # It can contain fields, images, audio, video files, maps and other stuff.
5
+ # Tab contain following parts, that also are configurable through block or
6
+ # arguments passed to tab.
7
+ # * <tt>nested_fields_for</tt> Create fields for different DB table/collection than given.
8
+ # * <tt>field_set</tt> Create fields set for ease use in builders.
9
+ # * <tt>field</tt> Create field in tab, fields also can be included in #nested_fields_for and
10
+ # #field_set
11
+ # * <tt>default_fields</tt>
12
+ # To create new tab you should pass Lolita::DBI object and tab type, default is :content
13
+ # ====Example
14
+ # Lolita::Configuration::Tab.new(Lolita::DBI.new(Post),:images)
15
+ # To define tab in ORM model, through lolita configuration do the following
16
+ # ====Example
17
+ # lolita do
18
+ # tab
19
+ class Tab
20
+
21
+ # For different types there are different builders(cells)
22
+ @@available_types=[:content]
23
+
24
+ lolita_accessor :title,:name
25
+ attr_accessor :dbi,:type,:current_fieldset,:current_dbi
26
+ attr_reader :field_sets,:nested_form
27
+
28
+ # To create new tab the following parametrs need to be provided.
29
+ # * <tt>dbi</tt> Lolita::DBI::Base object, that represents database.
30
+ # * <tt>*args</tt> See #set_attributes, for how these args are processed.
31
+ # * <tt>&block</tt> Block can be passed, anything in block will be evaled for current instance.
32
+ def initialize dbi,*args,&block
33
+ @fields=[]
34
+ @field_sets=[]
35
+ self.dbi=dbi
36
+ self.current_dbi=dbi
37
+ self.set_attributes(*args)
38
+ self.instance_eval(&block) if block_given?
39
+ validate
40
+ end
41
+
42
+ # Field setter method, accpet <i>*args</i> and <i>&block</i> to be passed.
43
+ # For details how to pass args and block see Lolita::Configuration::Field.
44
+ # Return field itself.
45
+ def field *args, &block
46
+ field=Lolita::Configuration::Field.new(self.current_dbi,*args,&block)
47
+ field.field_set=current_fieldset
48
+ if self.current_dbi!=self.dbi
49
+ field.nested_in=self.dbi
50
+ end
51
+ @fields<<field
52
+ field
53
+ end
54
+
55
+ # Return all fields in tab. If fields not defined then set default fields.
56
+ def fields
57
+ if @fields.empty?
58
+ set_default_fields
59
+ end
60
+ @fields
61
+ end
62
+
63
+ # Set all fields in tab. Accept <code>fields</code> as Array.
64
+ # Each array element can be Lolita::Configuration::Field object or
65
+ # Hash, that will be passed to #field method.
66
+ def fields=(fields)
67
+ @fields=[]
68
+ if fields.is_a?(Array)
69
+ fields.each{|field_attr|
70
+ if field_attr.is_a?(Lolita::Configuration::Field)
71
+ @fields<<field_attr
72
+ else
73
+ self.field(field_attr)
74
+ end
75
+ }
76
+ end
77
+ end
78
+
79
+ # Create fields for tab from database.
80
+ # See Lolita::Adapter classes for use of DB field method.
81
+ def default_fields
82
+ self.current_dbi.fields.each{|db_field|
83
+ self.field(db_field)
84
+ }
85
+ end
86
+
87
+ # Add tab nested fields for <em>class_or_name</em> and <em>&block</em>
88
+ # that will be evaluted in current tab instance.
89
+ def nested_fields_for class_or_name,&block
90
+ current_class=get_class(class_or_name)
91
+ self.current_dbi=Lolita::DBI::Base.new(current_class)
92
+ self.instance_eval(&block)
93
+ self.current_dbi=self.dbi
94
+ end
95
+
96
+ # Return nested field for given <em>class_or_name</em>
97
+ def nested_fields_of class_or_name
98
+ current_class=get_class(class_or_name)
99
+ self.fields.select{|field|
100
+ field.nested_in?(@dbi) && field.dbi.klass==current_class
101
+ }
102
+ end
103
+
104
+ # Create new field_set for current tab with given _name_ and <em>&block</em>
105
+ # that will be evaluted in current tab instance.
106
+ def field_set name,&block
107
+ field_set=Lolita::Configuration::FieldSet.new(self,name)
108
+ self.current_fieldset=field_set
109
+ @field_sets<<field_set
110
+ self.instance_eval(&block)
111
+ self.current_fieldset=nil
112
+ end
113
+
114
+ def fields_with_field_set
115
+ used_fieldsets=[]
116
+ self.fields.each{|field|
117
+ if !field.field_set || (!used_fieldsets.include?(field.field_set))
118
+ if field.field_set
119
+ yield field.field_set.fields,field.field_set
120
+ used_fieldsets<<field.field_set
121
+ else
122
+ yield field,nil
123
+ end
124
+ end
125
+ }
126
+ end
127
+ # tab.field do
128
+ # tab.fields_with_fieldset do |field,fieldset|
129
+ # =field
130
+ # end
131
+
132
+
133
+ # Set attributes from given <em>*args</em>.
134
+ # First element of args is used as <i>type</i> other interpreted as options.
135
+ # Every Hash key is used as setter method, and value as method value.
136
+ # ====Example
137
+ # set_attributes(:content,:field=>{:name=>"My Field"})
138
+ # set_attributes(:field=>{:name=>"My Field"})
139
+ def set_attributes *args
140
+ if args
141
+ options=args.extract_options!
142
+ self.type=args.first || :default
143
+ options.each{|method,options|
144
+ self.send(:"#{method}=",options)
145
+ }
146
+ end
147
+
148
+ end
149
+
150
+ private
151
+
152
+ def set_default_fields
153
+ if @type==:content && @fields.empty?
154
+ default_fields
155
+ end
156
+ end
157
+
158
+ def set_default_attributes
159
+ @name="tab_#{self.__id__}" unless @name
160
+ @title=@type.to_s.humanize unless @title
161
+ end
162
+
163
+ def get_class(str_or_sym_or_class)
164
+ str_or_sym_or_class.is_a?(Class) ? str_or_sym_or_class : str_or_sym_or_class.to_s.camelize.constantize
165
+ end
166
+
167
+ def validate
168
+ set_default_attributes
169
+ if type==:default && fields.empty?
170
+ raise Lolita::NoFieldsGivenError, "At least one field must be specified for default tab."
171
+ end
172
+ end
173
+
174
+ class << self
175
+ def default_types
176
+ @@available_types
177
+ end
178
+ end
179
+ end
180
+ end
181
+ end