jinda-5 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +177 -0
  4. data/Rakefile +3 -0
  5. data/bin/console +14 -0
  6. data/bin/setup +8 -0
  7. data/lib/generators/jinda/USAGE +2 -0
  8. data/lib/generators/jinda/config_generator.rb +108 -0
  9. data/lib/generators/jinda/install_generator.rb +206 -0
  10. data/lib/generators/jinda/minitest_generator.rb +30 -0
  11. data/lib/generators/jinda/rspec_generator.rb +30 -0
  12. data/lib/generators/jinda/templates/README.md +173 -0
  13. data/lib/generators/jinda/templates/app/assets/config/manifest.js +4 -0
  14. data/lib/generators/jinda/templates/app/assets/images/4dcity-old.ico +0 -0
  15. data/lib/generators/jinda/templates/app/assets/images/4dcity.ico +0 -0
  16. data/lib/generators/jinda/templates/app/assets/images/account.png +0 -0
  17. data/lib/generators/jinda/templates/app/assets/images/add.png +0 -0
  18. data/lib/generators/jinda/templates/app/assets/images/ajax-loader-circle.gif +0 -0
  19. data/lib/generators/jinda/templates/app/assets/images/ajax-loader.gif +0 -0
  20. data/lib/generators/jinda/templates/app/assets/images/anchor.png +0 -0
  21. data/lib/generators/jinda/templates/app/assets/images/application_double.png +0 -0
  22. data/lib/generators/jinda/templates/app/assets/images/application_form_edit.png +0 -0
  23. data/lib/generators/jinda/templates/app/assets/images/arrow_left.png +0 -0
  24. data/lib/generators/jinda/templates/app/assets/images/arrow_right.png +0 -0
  25. data/lib/generators/jinda/templates/app/assets/images/arrow_turn_left.png +0 -0
  26. data/lib/generators/jinda/templates/app/assets/images/arrow_turn_right.png +0 -0
  27. data/lib/generators/jinda/templates/app/assets/images/calendar.png +0 -0
  28. data/lib/generators/jinda/templates/app/assets/images/cancel.png +0 -0
  29. data/lib/generators/jinda/templates/app/assets/images/chart_bar.png +0 -0
  30. data/lib/generators/jinda/templates/app/assets/images/clock.png +0 -0
  31. data/lib/generators/jinda/templates/app/assets/images/cog.png +0 -0
  32. data/lib/generators/jinda/templates/app/assets/images/control_fastforward.png +0 -0
  33. data/lib/generators/jinda/templates/app/assets/images/control_play.png +0 -0
  34. data/lib/generators/jinda/templates/app/assets/images/cross.png +0 -0
  35. data/lib/generators/jinda/templates/app/assets/images/delete.png +0 -0
  36. data/lib/generators/jinda/templates/app/assets/images/external-link.png +0 -0
  37. data/lib/generators/jinda/templates/app/assets/images/facebook-continue-button.png +0 -0
  38. data/lib/generators/jinda/templates/app/assets/images/facebooksmall.png +0 -0
  39. data/lib/generators/jinda/templates/app/assets/images/favicon.ico +0 -0
  40. data/lib/generators/jinda/templates/app/assets/images/freemind(mm).png +0 -0
  41. data/lib/generators/jinda/templates/app/assets/images/google-continue-button.png +0 -0
  42. data/lib/generators/jinda/templates/app/assets/images/help.png +0 -0
  43. data/lib/generators/jinda/templates/app/assets/images/highway-menu.png +0 -0
  44. data/lib/generators/jinda/templates/app/assets/images/highway.png +0 -0
  45. data/lib/generators/jinda/templates/app/assets/images/house.png +0 -0
  46. data/lib/generators/jinda/templates/app/assets/images/icons-18-black.png +0 -0
  47. data/lib/generators/jinda/templates/app/assets/images/icons-18-white.png +0 -0
  48. data/lib/generators/jinda/templates/app/assets/images/icons-36-black.png +0 -0
  49. data/lib/generators/jinda/templates/app/assets/images/icons-36-white.png +0 -0
  50. data/lib/generators/jinda/templates/app/assets/images/logo.png +0 -0
  51. data/lib/generators/jinda/templates/app/assets/images/logo_jinda.png +0 -0
  52. data/lib/generators/jinda/templates/app/assets/images/logout.png +0 -0
  53. data/lib/generators/jinda/templates/app/assets/images/new.gif +0 -0
  54. data/lib/generators/jinda/templates/app/assets/images/new.png +0 -0
  55. data/lib/generators/jinda/templates/app/assets/images/page.png +0 -0
  56. data/lib/generators/jinda/templates/app/assets/images/page_attach.png +0 -0
  57. data/lib/generators/jinda/templates/app/assets/images/page_green.png +0 -0
  58. data/lib/generators/jinda/templates/app/assets/images/page_output.png +0 -0
  59. data/lib/generators/jinda/templates/app/assets/images/page_pdf.png +0 -0
  60. data/lib/generators/jinda/templates/app/assets/images/pencil.png +0 -0
  61. data/lib/generators/jinda/templates/app/assets/images/printer.png +0 -0
  62. data/lib/generators/jinda/templates/app/assets/images/refresh.png +0 -0
  63. data/lib/generators/jinda/templates/app/assets/images/report.png +0 -0
  64. data/lib/generators/jinda/templates/app/assets/images/rssmall.png +0 -0
  65. data/lib/generators/jinda/templates/app/assets/images/tick.png +0 -0
  66. data/lib/generators/jinda/templates/app/assets/images/twittersmall.png +0 -0
  67. data/lib/generators/jinda/templates/app/assets/images/user.png +0 -0
  68. data/lib/generators/jinda/templates/app/assets/images/user_admin_gear.png +0 -0
  69. data/lib/generators/jinda/templates/app/assets/images/view_code.png +0 -0
  70. data/lib/generators/jinda/templates/app/assets/javascripts/application.js +24 -0
  71. data/lib/generators/jinda/templates/app/assets/javascripts/application.js-jqm +28 -0
  72. data/lib/generators/jinda/templates/app/assets/javascripts/cable.js +13 -0
  73. data/lib/generators/jinda/templates/app/assets/javascripts/disable_enter_key.js-org +10 -0
  74. data/lib/generators/jinda/templates/app/assets/javascripts/iscroll-wrapper.js +32 -0
  75. data/lib/generators/jinda/templates/app/assets/javascripts/iscroll.js +1084 -0
  76. data/lib/generators/jinda/templates/app/assets/javascripts/jinda.js +14 -0
  77. data/lib/generators/jinda/templates/app/assets/javascripts/jquery.mobile-1.2.1.js +9272 -0
  78. data/lib/generators/jinda/templates/app/assets/javascripts/jquery.mobile.datebox.js +1778 -0
  79. data/lib/generators/jinda/templates/app/assets/javascripts/jquery.mobile.splitview.js +695 -0
  80. data/lib/generators/jinda/templates/app/assets/stylesheets/app.scss +84 -0
  81. data/lib/generators/jinda/templates/app/assets/stylesheets/application.css.scss +34 -0
  82. data/lib/generators/jinda/templates/app/assets/stylesheets/articles.scss +84 -0
  83. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/sarabun.eot +0 -0
  84. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/sarabun.ttf +0 -0
  85. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/sarabun.woff +0 -0
  86. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/sarabun_bold.ttf +0 -0
  87. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/sarabun_bolditalic.ttf +0 -0
  88. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/sarabun_italic.ttf +0 -0
  89. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew-webfont.eot +0 -0
  90. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew-webfont.ttf +0 -0
  91. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew-webfont.woff +0 -0
  92. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew.css +47 -0
  93. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_bold-webfont.eot +0 -0
  94. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_bold-webfont.ttf +0 -0
  95. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_bold-webfont.woff +0 -0
  96. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.eot +0 -0
  97. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.ttf +0 -0
  98. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.woff +0 -0
  99. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_italic-webfont.eot +0 -0
  100. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_italic-webfont.ttf +0 -0
  101. data/lib/generators/jinda/templates/app/assets/stylesheets/fonts/thsarabunnew_italic-webfont.woff +0 -0
  102. data/lib/generators/jinda/templates/app/assets/stylesheets/images/ajax-loader.gif +0 -0
  103. data/lib/generators/jinda/templates/app/assets/stylesheets/images/button_black.png +0 -0
  104. data/lib/generators/jinda/templates/app/assets/stylesheets/images/button_blue.png +0 -0
  105. data/lib/generators/jinda/templates/app/assets/stylesheets/images/button_red.png +0 -0
  106. data/lib/generators/jinda/templates/app/assets/stylesheets/images/icons-18-black.png +0 -0
  107. data/lib/generators/jinda/templates/app/assets/stylesheets/images/icons-18-white.png +0 -0
  108. data/lib/generators/jinda/templates/app/assets/stylesheets/images/icons-36-black.png +0 -0
  109. data/lib/generators/jinda/templates/app/assets/stylesheets/images/icons-36-white.png +0 -0
  110. data/lib/generators/jinda/templates/app/assets/stylesheets/images/indicator.gif +0 -0
  111. data/lib/generators/jinda/templates/app/assets/stylesheets/jinda.css +52 -0
  112. data/lib/generators/jinda/templates/app/assets/stylesheets/jquery.mobile-1.2.1.css +2339 -0
  113. data/lib/generators/jinda/templates/app/assets/stylesheets/jquery.mobile.datebox.css +65 -0
  114. data/lib/generators/jinda/templates/app/assets/stylesheets/jquery.mobile.grids.collapsible.css +122 -0
  115. data/lib/generators/jinda/templates/app/assets/stylesheets/jquery.mobile.splitview.css +128 -0
  116. data/lib/generators/jinda/templates/app/assets/stylesheets/kul-4.2.css +1516 -0
  117. data/lib/generators/jinda/templates/app/assets/stylesheets/kul-4.2.min.css +11 -0
  118. data/lib/generators/jinda/templates/app/assets/stylesheets/sarabun.css +37 -0
  119. data/lib/generators/jinda/templates/app/assets/stylesheets/social.scss +133 -0
  120. data/lib/generators/jinda/templates/app/channels/application_cable/channel.rb +4 -0
  121. data/lib/generators/jinda/templates/app/channels/application_cable/connection.rb +4 -0
  122. data/lib/generators/jinda/templates/app/controllers/api/v1/notes_controller.rb +81 -0
  123. data/lib/generators/jinda/templates/app/controllers/ctrs_controller.rb-gem-test +2 -0
  124. data/lib/generators/jinda/templates/app/controllers/jinda_org/admins_controller.rb +6 -0
  125. data/lib/generators/jinda/templates/app/controllers/jinda_org/application_controller.rb +42 -0
  126. data/lib/generators/jinda/templates/app/controllers/jinda_org/articles_controller.rb +81 -0
  127. data/lib/generators/jinda/templates/app/controllers/jinda_org/comments_controller.rb +17 -0
  128. data/lib/generators/jinda/templates/app/controllers/jinda_org/devs_controller.rb +2 -0
  129. data/lib/generators/jinda/templates/app/controllers/jinda_org/identities_controller.rb +5 -0
  130. data/lib/generators/jinda/templates/app/controllers/jinda_org/jinda_controller.rb +579 -0
  131. data/lib/generators/jinda/templates/app/controllers/jinda_org/notes_controller.rb +86 -0
  132. data/lib/generators/jinda/templates/app/controllers/jinda_org/password_resets.rb +28 -0
  133. data/lib/generators/jinda/templates/app/controllers/jinda_org/password_resets_controller.rb +34 -0
  134. data/lib/generators/jinda/templates/app/controllers/jinda_org/sessions_controller.rb +43 -0
  135. data/lib/generators/jinda/templates/app/controllers/jinda_org/sitemap_controller.rb +12 -0
  136. data/lib/generators/jinda/templates/app/controllers/jinda_org/users_controller.rb +34 -0
  137. data/lib/generators/jinda/templates/app/helpers/admins_helper.rb +2 -0
  138. data/lib/generators/jinda/templates/app/helpers/application_helper.rb +33 -0
  139. data/lib/generators/jinda/templates/app/helpers/articles_helper.rb +2 -0
  140. data/lib/generators/jinda/templates/app/helpers/basic_helper.rb +2 -0
  141. data/lib/generators/jinda/templates/app/helpers/comments_helper.rb +2 -0
  142. data/lib/generators/jinda/templates/app/helpers/ctrs_helper.rb +2 -0
  143. data/lib/generators/jinda/templates/app/helpers/devs_helper.rb +2 -0
  144. data/lib/generators/jinda/templates/app/helpers/pictures_helper.rb +2 -0
  145. data/lib/generators/jinda/templates/app/helpers/sitemap_helper.rb +2 -0
  146. data/lib/generators/jinda/templates/app/helpers/users_helper.rb +2 -0
  147. data/lib/generators/jinda/templates/app/jinda/index.mm +306 -0
  148. data/lib/generators/jinda/templates/app/jinda/template/linkview.haml +21 -0
  149. data/lib/generators/jinda/templates/app/jinda/template/view.html.erb +27 -0
  150. data/lib/generators/jinda/templates/app/mailers/application_mailer.rb +4 -0
  151. data/lib/generators/jinda/templates/app/mailers/jinda_mailer.rb +7 -0
  152. data/lib/generators/jinda/templates/app/mailers/note_mailer.rb +10 -0
  153. data/lib/generators/jinda/templates/app/mailers/user_mailer.rb +15 -0
  154. data/lib/generators/jinda/templates/app/models/address.rb +14 -0
  155. data/lib/generators/jinda/templates/app/models/article.rb +14 -0
  156. data/lib/generators/jinda/templates/app/models/ckeditor/asset.rb +5 -0
  157. data/lib/generators/jinda/templates/app/models/ckeditor/attachment_file.rb +13 -0
  158. data/lib/generators/jinda/templates/app/models/ckeditor/picture.rb +14 -0
  159. data/lib/generators/jinda/templates/app/models/comment.rb +11 -0
  160. data/lib/generators/jinda/templates/app/models/identity.rb +18 -0
  161. data/lib/generators/jinda/templates/app/models/jinda/doc.rb +22 -0
  162. data/lib/generators/jinda/templates/app/models/jinda/module.rb +11 -0
  163. data/lib/generators/jinda/templates/app/models/jinda/notice.rb +14 -0
  164. data/lib/generators/jinda/templates/app/models/jinda/role.rb +8 -0
  165. data/lib/generators/jinda/templates/app/models/jinda/runseq.rb +24 -0
  166. data/lib/generators/jinda/templates/app/models/jinda/service.rb +17 -0
  167. data/lib/generators/jinda/templates/app/models/jinda/xmain.rb +38 -0
  168. data/lib/generators/jinda/templates/app/models/note.rb +22 -0
  169. data/lib/generators/jinda/templates/app/models/param.rb +41 -0
  170. data/lib/generators/jinda/templates/app/models/person.rb +14 -0
  171. data/lib/generators/jinda/templates/app/models/user.rb +66 -0
  172. data/lib/generators/jinda/templates/app/views/adminbsbs/content.haml +241 -0
  173. data/lib/generators/jinda/templates/app/views/admins/edit_role/edit_role.html.erb +7 -0
  174. data/lib/generators/jinda/templates/app/views/admins/edit_role/select_user.html.erb +4 -0
  175. data/lib/generators/jinda/templates/app/views/api/v1/note.haml +0 -0
  176. data/lib/generators/jinda/templates/app/views/articles/edit.haml +12 -0
  177. data/lib/generators/jinda/templates/app/views/articles/edit_article/edit_article.html.erb +13 -0
  178. data/lib/generators/jinda/templates/app/views/articles/edit_article/select_article.html.erb +12 -0
  179. data/lib/generators/jinda/templates/app/views/articles/index.haml +23 -0
  180. data/lib/generators/jinda/templates/app/views/articles/my.haml +20 -0
  181. data/lib/generators/jinda/templates/app/views/articles/new_article/form_article.html.erb +14 -0
  182. data/lib/generators/jinda/templates/app/views/articles/show.html.haml +24 -0
  183. data/lib/generators/jinda/templates/app/views/articles/xedit_article/edit_article.html.erb +13 -0
  184. data/lib/generators/jinda/templates/app/views/ctrs/vfolder1/viewfile1.html.erb +23 -0
  185. data/lib/generators/jinda/templates/app/views/ctrs/vfolder1/viewfile2.html.erb +23 -0
  186. data/lib/generators/jinda/templates/app/views/ctrs/vfolder2/viewfile2.html.erb +23 -0
  187. data/lib/generators/jinda/templates/app/views/custom/_adsense.haml +6 -0
  188. data/lib/generators/jinda/templates/app/views/identities/new.html.erb +32 -0
  189. data/lib/generators/jinda/templates/app/views/jinda/_activity.md +10 -0
  190. data/lib/generators/jinda/templates/app/views/jinda/_menu.haml +26 -0
  191. data/lib/generators/jinda/templates/app/views/jinda/_menu_mm.haml +44 -0
  192. data/lib/generators/jinda/templates/app/views/jinda/_model.md +5 -0
  193. data/lib/generators/jinda/templates/app/views/jinda/_modul.md +9 -0
  194. data/lib/generators/jinda/templates/app/views/jinda/_pending_home.haml +5 -0
  195. data/lib/generators/jinda/templates/app/views/jinda/_pending_page.haml +24 -0
  196. data/lib/generators/jinda/templates/app/views/jinda/_service.md +24 -0
  197. data/lib/generators/jinda/templates/app/views/jinda/_static.haml +13 -0
  198. data/lib/generators/jinda/templates/app/views/jinda/doc-thai.md +37 -0
  199. data/lib/generators/jinda/templates/app/views/jinda/doc.md +36 -0
  200. data/lib/generators/jinda/templates/app/views/jinda/error_logs.haml +22 -0
  201. data/lib/generators/jinda/templates/app/views/jinda/feed.rss.builder +27 -0
  202. data/lib/generators/jinda/templates/app/views/jinda/help.haml +20 -0
  203. data/lib/generators/jinda/templates/app/views/jinda/index.html.haml +43 -0
  204. data/lib/generators/jinda/templates/app/views/jinda/logs.haml +22 -0
  205. data/lib/generators/jinda/templates/app/views/jinda/notice_logs.haml +18 -0
  206. data/lib/generators/jinda/templates/app/views/jinda/pending.haml +1 -0
  207. data/lib/generators/jinda/templates/app/views/jinda/run_form.haml +42 -0
  208. data/lib/generators/jinda/templates/app/views/jinda/run_output.haml +38 -0
  209. data/lib/generators/jinda/templates/app/views/jinda/search.haml +20 -0
  210. data/lib/generators/jinda/templates/app/views/jinda/status.haml +61 -0
  211. data/lib/generators/jinda/templates/app/views/jinda_mailer/gmail.html.erb +9 -0
  212. data/lib/generators/jinda/templates/app/views/layouts/_head.html.erb +13 -0
  213. data/lib/generators/jinda/templates/app/views/layouts/_meta_tags.html.erb +5 -0
  214. data/lib/generators/jinda/templates/app/views/layouts/_metatag.html.erb +19 -0
  215. data/lib/generators/jinda/templates/app/views/layouts/application.haml +4 -0
  216. data/lib/generators/jinda/templates/app/views/layouts/bsb/_footer.haml +7 -0
  217. data/lib/generators/jinda/templates/app/views/layouts/bsb/_header.haml +147 -0
  218. data/lib/generators/jinda/templates/app/views/layouts/bsb/_menu.haml +47 -0
  219. data/lib/generators/jinda/templates/app/views/layouts/bsb/_menu_mm.haml +34 -0
  220. data/lib/generators/jinda/templates/app/views/layouts/bsb/_rightbar.haml +123 -0
  221. data/lib/generators/jinda/templates/app/views/layouts/bsb/_sidebar.haml +155 -0
  222. data/lib/generators/jinda/templates/app/views/layouts/bsb/application.haml-bsb +47 -0
  223. data/lib/generators/jinda/templates/app/views/layouts/gmail.html.erb +9 -0
  224. data/lib/generators/jinda/templates/app/views/layouts/jqm/_full.haml +41 -0
  225. data/lib/generators/jinda/templates/app/views/layouts/jqm/_page.haml +16 -0
  226. data/lib/generators/jinda/templates/app/views/layouts/jqm/application.haml-jqm +4 -0
  227. data/lib/generators/jinda/templates/app/views/layouts/mailer.html.erb +13 -0
  228. data/lib/generators/jinda/templates/app/views/layouts/mailer.html.haml +3 -0
  229. data/lib/generators/jinda/templates/app/views/layouts/mailer.text.erb +1 -0
  230. data/lib/generators/jinda/templates/app/views/layouts/mailer.text.haml +1 -0
  231. data/lib/generators/jinda/templates/app/views/layouts/mobile.html.erb +13 -0
  232. data/lib/generators/jinda/templates/app/views/layouts/mobilejq.html.erb +31 -0
  233. data/lib/generators/jinda/templates/app/views/layouts/print.html.erb +22 -0
  234. data/lib/generators/jinda/templates/app/views/layouts/utf8.html.erb +22 -0
  235. data/lib/generators/jinda/templates/app/views/new.html.erb +7 -0
  236. data/lib/generators/jinda/templates/app/views/note_mailer/gmail.html.haml +7 -0
  237. data/lib/generators/jinda/templates/app/views/note_mailer/gmail.text.haml +8 -0
  238. data/lib/generators/jinda/templates/app/views/notes/delete/select_note.html.erb +14 -0
  239. data/lib/generators/jinda/templates/app/views/notes/edit/edit_note.html.erb +10 -0
  240. data/lib/generators/jinda/templates/app/views/notes/edit/select_note.html.erb +14 -0
  241. data/lib/generators/jinda/templates/app/views/notes/index.haml +71 -0
  242. data/lib/generators/jinda/templates/app/views/notes/mail/display_mail.html.erb +20 -0
  243. data/lib/generators/jinda/templates/app/views/notes/mail/select_note.html.erb +19 -0
  244. data/lib/generators/jinda/templates/app/views/notes/mail/show.html.haml +13 -0
  245. data/lib/generators/jinda/templates/app/views/notes/my.haml +21 -0
  246. data/lib/generators/jinda/templates/app/views/notes/new/new_note.html.erb +13 -0
  247. data/lib/generators/jinda/templates/app/views/notes/show.haml +10 -0
  248. data/lib/generators/jinda/templates/app/views/notes/xedit/edit_note.html.erb +10 -0
  249. data/lib/generators/jinda/templates/app/views/password_resets/edit.html.erb +21 -0
  250. data/lib/generators/jinda/templates/app/views/password_resets/new.html.erb +7 -0
  251. data/lib/generators/jinda/templates/app/views/sessions/new.html.erb +20 -0
  252. data/lib/generators/jinda/templates/app/views/sitemap/index.xml.haml +10 -0
  253. data/lib/generators/jinda/templates/app/views/user_mailer/password_reset.html.haml +3 -0
  254. data/lib/generators/jinda/templates/app/views/user_mailer/password_reset.text.erb +3 -0
  255. data/lib/generators/jinda/templates/app/views/user_mailer/password_reset.text.haml +3 -0
  256. data/lib/generators/jinda/templates/app/views/users/index.haml +13 -0
  257. data/lib/generators/jinda/templates/app/views/users/pwd/enter.html.erb +6 -0
  258. data/lib/generators/jinda/templates/app/views/users/user/enter_user.html.erb +8 -0
  259. data/lib/generators/jinda/templates/config/cloudinary.yml +9 -0
  260. data/lib/generators/jinda/templates/db/seeds.rb +6 -0
  261. data/lib/generators/jinda/templates/dot/dot.env +2 -0
  262. data/lib/generators/jinda/templates/jinda.yml +10 -0
  263. data/lib/generators/jinda/templates/public/404.html +67 -0
  264. data/lib/generators/jinda/templates/public/422.html +67 -0
  265. data/lib/generators/jinda/templates/public/500.html +66 -0
  266. data/lib/generators/jinda/templates/public/assets/images/logo.png +0 -0
  267. data/lib/generators/jinda/templates/public/favicon.ico +0 -0
  268. data/lib/generators/jinda/templates/public/robots.txt +3 -0
  269. data/lib/generators/jinda/templates/spec/controllers/api/v1_get_index_spec.rb +23 -0
  270. data/lib/generators/jinda/templates/spec/controllers/api/v1_get_my_spec.rb +14 -0
  271. data/lib/generators/jinda/templates/spec/controllers/api/v1_post_spec.rb +19 -0
  272. data/lib/generators/jinda/templates/spec/controllers/sessions_controller_spec.rb +96 -0
  273. data/lib/generators/jinda/templates/spec/features/userlogins_spec.rb +23 -0
  274. data/lib/generators/jinda/templates/spec/mailers/note_spec.rb +24 -0
  275. data/lib/generators/jinda/templates/spec/mailers/previews/note_preview.rb +9 -0
  276. data/lib/generators/jinda/templates/spec/models/note_spec.rb +41 -0
  277. data/lib/generators/jinda/templates/spec/models/user_spec.rb +12 -0
  278. data/lib/generators/jinda/templates/spec/rails_helper.rb +44 -0
  279. data/lib/generators/jinda/templates/spec/spec_helper.rb +77 -0
  280. data/lib/generators/jinda/templates/spec/support/authentication_helper.rb +20 -0
  281. data/lib/generators/jinda/templates/spec/support/factory_bot.rb +12 -0
  282. data/lib/generators/jinda/templates/spec/support/omniauth_macros.rb +38 -0
  283. data/lib/generators/jinda/templates/spec/support/request_spec_helper.rb +8 -0
  284. data/lib/generators/jinda/templates/spec/views/articles/_article.html.erb_spec.rbx +14 -0
  285. data/lib/generators/jinda/templates/test/application_system_test_case.rb +5 -0
  286. data/lib/generators/jinda/templates/test/integration/jinda_routes_test.rb +42 -0
  287. data/lib/generators/jinda/templates/test/test_helper.rb +6 -0
  288. data/lib/jinda.rb +6 -0
  289. data/lib/jinda/ template/view.html.erb +25 -0
  290. data/lib/jinda/app/jinda/template/view.html.erb +27 -0
  291. data/lib/jinda/gemhelpers.rb +50 -0
  292. data/lib/jinda/helpers.rb +853 -0
  293. data/lib/jinda/railtie.rb +18 -0
  294. data/lib/jinda/version.rb +3 -0
  295. data/lib/tasks/jinda.rake +33 -0
  296. metadata +405 -0
@@ -0,0 +1,853 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+
4
+ # -*- encoding : utf-8 -*-
5
+ # This helper handle
6
+ # 1. Read xml from mm file to run core program:
7
+ # process_services
8
+ # 2. Update Models, Services, Runseqs from index.mm (XML)
9
+ # 3. Rake Task to create app models, views and controller from index.mm(updated)
10
+ #
11
+ # What is xmain, runseq and xvar ?
12
+ #
13
+ # |---- xmain 1 -----|
14
+ # runseq1 runseq2
15
+ #
16
+ # Let make analogy or example compare with Invoicing
17
+ # Each xmain is like each invoice header
18
+ # Each invoice detail is like runseq
19
+ # So, There are only certain number of services limit in freemind index.mm
20
+ # But xmain will increase when entering each menu (services) and will increase along with activities by each user just like log file
21
+ #
22
+ #
23
+ # xvar is (become) global variable of current program including user, runseq, and services
24
+ #
25
+ ################################################################################
26
+
27
+
28
+ module Jinda
29
+ module Helpers
30
+ require "rexml/document"
31
+ include REXML
32
+ # methods from application_controller
33
+ def b(s)
34
+ "<b>#{s}</b>".html_safe
35
+ end
36
+ def link_to_blank(body, url_options = {}, html_options = {})
37
+ link_to(body, url_options, html_options.merge(target: "_blank"))
38
+ end
39
+ def code_text(s) # old def code(s)
40
+ "<pre style='background-color: #efffef;'><code class='ruby' lang='ruby'>#{s}</code></pre>".html_safe
41
+ end
42
+
43
+ def refresh_to(url='/', option={})
44
+ if option[:alert]
45
+ ma_log option[:alert]
46
+ end
47
+ # skip #
48
+ # Rails 5.2 not allow to use js inline call
49
+ render inline: "<script>window.location.replace('#{url}')</script>"
50
+ # redirect_to url
51
+ # render js: "window.location.replace(\'#{url}\')"
52
+ end
53
+
54
+ # def refresh_to
55
+ # respond_to do |format|
56
+ # format.js { render :js => "refresh();" }
57
+ # end
58
+ # end
59
+
60
+ def read_binary(path)
61
+ File.open path, "rb" do |f| f.read end
62
+ end
63
+ def redirect_to_root
64
+ redirect_to root_path
65
+ end
66
+ def get_option(opt, runseq=@runseq)
67
+ xml= REXML::Document.new(runseq.xml).root
68
+ url=''
69
+ xml.each_element('///node') do |n|
70
+ text= n.attributes['TEXT']
71
+ url= text if text =~/^#{opt}:\s*/
72
+ end
73
+ c, h= url.split(':', 2)
74
+ opt= h ? h.strip : false
75
+ end
76
+ def ma_comment?(s)
77
+ s[0]==35
78
+ end
79
+ def get_ip
80
+ request.env['HTTP_X_FORWARDED_FOR'] || request.env['REMOTE_ADDR']
81
+ end
82
+ def get_default_role
83
+ default_role= Jinda::Role.where(:code =>'default').first
84
+ return default_role ? default_role.name.to_s : ''
85
+ end
86
+
87
+ def sign_in?
88
+ if current_ma_user.present?
89
+ return true
90
+ else
91
+ return false
92
+ end
93
+ end
94
+
95
+ # ############################### Themes ###################################
96
+ #
97
+ # Check login user information from User model: name(code), image for Themes
98
+ #
99
+ # ##########################################################################
100
+ def get_login_user_info
101
+ if current_ma_user.present?
102
+ $user_image = current_ma_user.image
103
+ $user_name = current_ma_user.code
104
+ $user_email = current_ma_user.email
105
+ $user_id = current_ma_user.try(:id)
106
+ else
107
+ $user_image = asset_url("user.png", :width => "48")
108
+ $user_name = 'Guest User'
109
+ $user_email = 'guest@sample.com'
110
+ $user_id = ''
111
+ end
112
+ return $user_image, $user_name, $user_email,$user_id
113
+ end
114
+
115
+ def name2code(s)
116
+ # rather not ignore # symbol cause it could be comment
117
+ code, name = s.split(':')
118
+ code.downcase.strip.gsub(' ','_').gsub(/[^#_\/a-zA-Z0-9]/,'')
119
+ end
120
+ def name2camel(s)
121
+ s.gsub(' ','_').camelcase
122
+ end
123
+ def true_action?(s)
124
+ %w(call ws redirect invoke email).include? s
125
+ end
126
+ def set_global
127
+ $xmain= @xmain ; $runseq = @runseq ; $user = current_ma_user ; $xvars= @xmain.xvars; $ip = request.env["REMOTE_ADDR"]
128
+ end
129
+ def authorize? # use in pending tasks
130
+ @runseq= @xmain.runseqs.find @xmain.current_runseq
131
+ return false unless @runseq
132
+ @user = current_ma_user
133
+ set_global
134
+ return false unless eval(@runseq.rule) if @runseq.rule
135
+ return true if true_action?(@runseq.action)
136
+ # return false if check_wait
137
+ return true if @runseq.role.blank?
138
+ unless @runseq.role.empty?
139
+ return false unless @user.role
140
+ return @user.role.upcase.split(',').include?(@runseq.role.upcase)
141
+ end
142
+ return true
143
+ end
144
+ def authorize_init? # use when initialize new transaction
145
+ # check module role
146
+ mrole = @service.module.role
147
+ return false if mrole && !current_ma_user
148
+ return false if mrole && !current_ma_user.has_role(mrole)
149
+
150
+ # check step 1 role
151
+ xml= @service.xml
152
+ step1 = REXML::Document.new(xml).root.elements['node']
153
+ role= get_option_xml("role", step1) || ""
154
+ # rule= get_option_xml("rule", step1) || true
155
+ return true if role==""
156
+ unless current_ma_user
157
+ return role.blank?
158
+ else
159
+ return false unless current_ma_user.role
160
+ return current_ma_user.has_role(role)
161
+ end
162
+ end
163
+ def ma_log(message)
164
+ # Jinda::Notice.create :message => ERB::Util.html_escape(message.gsub("`","'")),
165
+ # :unread=> true, :ip=> ($ip || request.env["REMOTE_ADDR"])
166
+ if session[:user_id]
167
+ Jinda::Notice.create :message => ERB::Util.html_escape(message.gsub("`","'")),
168
+ :user_id => $user.id, :unread=> true, :ip=>request.env["REMOTE_ADDR"]
169
+ else
170
+ Jinda::Notice.create :message => ERB::Util.html_escape(message.gsub("`","'")),
171
+ :unread=> true, :ip=>request.env["REMOTE_ADDR"]
172
+ end
173
+ end
174
+
175
+ alias :ma_notice :ma_log
176
+
177
+ # methods from application_helper
178
+ def markdown(text)
179
+ erbified = ERB.new(text.html_safe).result(binding)
180
+ red = Redcarpet::Markdown.new(Redcarpet::Render::HTML, :autolink => true, :space_after_headers => true)
181
+ red.render(erbified).html_safe
182
+ end
183
+ def align_text(s, pixel=3)
184
+ "<span style='position:relative; top:-#{pixel}px;'>#{s}</span>".html_safe
185
+ end
186
+ def status_icon(status)
187
+ case status
188
+ when 'R'
189
+ image_tag 'user.png'
190
+ when 'F'
191
+ image_tag 'tick.png'
192
+ when 'I'
193
+ image_tag 'control_play.png'
194
+ when 'E'
195
+ image_tag 'logout.png'
196
+ when 'X'
197
+ image_tag 'cross.png'
198
+ else
199
+ image_tag 'cancel.png'
200
+ end
201
+ end
202
+ def role_name(code)
203
+ role= Jinda::Role.where(code:code).first
204
+ return role ? role.name : ""
205
+ end
206
+ def uncomment(s)
207
+ s.sub(/^#\s/,'')
208
+ end
209
+ def code_div(s)
210
+ "<pre style='background-color: #efffef;'><code class='ruby' lang='ruby'> #{s}</code></pre>".html_safe
211
+ end
212
+ def ajax?(s)
213
+ return s.match('file_field') ? false : true
214
+ end
215
+ def step(s, total) # square text
216
+ s = (s==0)? 1: s.to_i
217
+ total = total.to_i
218
+ out ="<div class='step'>"
219
+ (s-1).times {|ss| out += "<span class='steps_done'>#{(ss+1)}</span>" }
220
+ out += %Q@<span class='step_now' >@
221
+ out += s.to_s
222
+ out += "</span>"
223
+ out += %Q@@
224
+ for i in s+1..total
225
+ out += "<span class='steps_more'>#{i}</span>"
226
+ end
227
+ out += "</div>"
228
+ out.html_safe
229
+ end
230
+
231
+ def current_ma_user
232
+ # if session[:user_id]
233
+ # return @user ||= User.find(session[:user_id]['$oid'])
234
+ # else
235
+ # return nil
236
+ # end
237
+ #@user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
238
+ @user ||= User.where(:auth_token => cookies[:auth_token]).first if cookies[:auth_token]
239
+ return @user
240
+ end
241
+
242
+ def ui_action?(s)
243
+ %w(form output mail pdf).include? s
244
+ end
245
+ # def handle_ma_notice
246
+ # if Jinda::Notice.recent.count>0
247
+ # notice= Jinda::Notice.recent.last
248
+ # notice.update_attribute :unread, false
249
+ # "<script>notice('#{notice.message}');</script>"
250
+ # else
251
+ # ""
252
+ # end
253
+ # end
254
+
255
+ # ##########################################################################
256
+ #
257
+ # Create / Update Modules, Runseqs, Services from XML
258
+ #
259
+ # ##########################################################################
260
+ def process_services
261
+ # todo: persist mm_md5
262
+ xml= @app||get_app
263
+ if defined? session
264
+ md5= Digest::MD5.hexdigest(xml.to_s)
265
+ if session[:mm_md5]
266
+ return if session[:mm_md5]==md5
267
+ else
268
+ session[:mm_md5]= md5
269
+ end
270
+ end
271
+ protected_services = []
272
+ protected_modules = []
273
+ mseq= 0
274
+ @services= xml.elements["//node[@TEXT='services']"] || REXML::Document.new
275
+ @services.each_element('node') do |m|
276
+ # get icon for service menu
277
+ ss= m.attributes["TEXT"]
278
+ code, name= ss.split(':', 2)
279
+ next if code.blank?
280
+ next if code.comment?
281
+ module_code= code.to_code
282
+ menu_icon = m_icon(m)
283
+
284
+ # ##########################################################################
285
+ # First Node eg: Module Name
286
+ # ##########################################################################
287
+ # create or update to GmaModule
288
+ ma_module= Jinda::Module.find_or_create_by :code=>module_code
289
+ ma_module.update_attributes :uid=>ma_module.id.to_s, :icon=>menu_icon
290
+ protected_modules << ma_module.uid
291
+ name = module_code if name.blank?
292
+ ma_module.update_attributes :name=> name.strip, :seq=> mseq
293
+ mseq += 1
294
+ seq= 0
295
+
296
+ # ##########################################################################
297
+ # Second Nodes eg: Role, Link otherwise Services
298
+ # ##########################################################################
299
+ m.each_element('node') do |s|
300
+ service_name= s.attributes["TEXT"].to_s
301
+ scode, sname= service_name.split(':', 2)
302
+ sname ||= scode; sname.strip!
303
+ scode= scode.to_code
304
+ if scode=="role"
305
+ ma_module.update_attribute :role, sname
306
+ next
307
+ end
308
+ if scode.downcase=="link"
309
+ role= get_option_xml("role", s) || ""
310
+ rule= get_option_xml("rule", s) || ""
311
+ ma_service= Jinda::Service.find_or_create_by :module_code=> ma_module.code, :code=> scode, :name=> sname
312
+ ma_service.update_attributes :xml=>s.to_s, :name=>sname,
313
+ :list=>listed(s), :ma_secured=>ma_secured?(s),
314
+ :module_id=>ma_module.id, :seq => seq,
315
+ :confirm=> get_option_xml("confirm", xml),
316
+ :role => role, :rule => rule, :uid=> ma_service.id.to_s
317
+ seq += 1
318
+ protected_services << ma_service.uid
319
+ else
320
+
321
+ # ##########################################################################
322
+ # Second and Third Nodes eg: Role, Normal Services
323
+ # ##########################################################################
324
+ # normal service
325
+ step1 = s.elements['node']
326
+ role= get_option_xml("role", step1) || ""
327
+ rule= get_option_xml("rule", step1) || ""
328
+ ma_service= Jinda::Service.find_or_create_by :module_code=> ma_module.code, :code=> scode
329
+ ma_service.update_attributes :xml=>s.to_s, :name=>sname,
330
+ :list=>listed(s), :ma_secured=>ma_secured?(s),
331
+ :module_id=>ma_module.id, :seq => seq,
332
+ :confirm=> get_option_xml("confirm", xml),
333
+ :role => role, :rule => rule, :uid=> ma_service.id.to_s
334
+ seq += 1
335
+ protected_services << ma_service.uid
336
+ end
337
+ end
338
+ end
339
+ Jinda::Module.not_in(:uid=>protected_modules).delete_all
340
+ Jinda::Service.not_in(:uid=>protected_services).delete_all
341
+ end
342
+
343
+ # ##########################################################################
344
+ # Load index.mm from Rails
345
+ # ##########################################################################
346
+ def get_app
347
+ # MM was defined in Rails: config/initializer/jinda.rb
348
+ f= MM || "#{Rails.root}/app/jinda/index.mm"
349
+ dir= File.dirname(f)
350
+ t= REXML::Document.new(File.read(MM).gsub("\n","")).root
351
+ recheck= true ; first_pass= true
352
+ while recheck
353
+ recheck= false
354
+ t.elements.each("//node") do |n|
355
+ if n.attributes['LINK'] # has attached file
356
+ if first_pass
357
+ f= "#{dir}/#{n.attributes['LINK']}"
358
+ else
359
+ f= n.attributes['LINK']
360
+ end
361
+ next unless File.exists?(f)
362
+ tt= REXML::Document.new(File.read(f).gsub("\n","")).root.elements["node"]
363
+ make_folders_absolute(f,tt)
364
+ tt.elements.each("node") do |tt_node|
365
+ n.parent.insert_before n, tt_node
366
+ end
367
+ recheck= true
368
+ n.parent.delete_element n
369
+ end
370
+ end
371
+ first_pass = false
372
+ end
373
+ return t
374
+ end
375
+
376
+ ########################################################################
377
+ # Jinda Rake Task #
378
+ ########################################################################
379
+
380
+ def gen_views
381
+ t = ["*** generate ui ***"]
382
+
383
+ # create array of files to be tested
384
+ $afile = Array.new
385
+
386
+ Jinda::Module.all.each do |m|
387
+ m.services.each do |s|
388
+ dir ="app/views/#{s.module.code}"
389
+ unless gen_view_file_exist?(dir)
390
+ gen_view_mkdir(dir,t)
391
+ end
392
+
393
+ if s.code=='link'
394
+ f= "app/views/#{s.module.code}/index.haml"
395
+ $afile << f
396
+ unless gen_view_file_exist?(f)
397
+ sv = "app/jinda/template/linkview.haml"
398
+ f= "app/views/#{s.module.code}/index.haml"
399
+ gen_view_createfile(sv,f,t)
400
+ end
401
+ next
402
+ end
403
+
404
+ dir ="app/views/#{s.module.code}/#{s.code}"
405
+ unless gen_view_file_exist?(dir)
406
+ gen_view_mkdir(dir,t)
407
+ end
408
+
409
+ xml= REXML::Document.new(s.xml)
410
+ xml.elements.each('*/node') do |activity|
411
+ icon = activity.elements['icon']
412
+ next unless icon
413
+ action= freemind2action(icon.attributes['BUILTIN'])
414
+ next unless ui_action?(action)
415
+ code_name = activity.attributes["TEXT"].to_s
416
+ next if code_name.comment?
417
+ code= name2code(code_name)
418
+ if action=="pdf"
419
+ f= "app/views/#{s.module.code}/#{s.code}/#{code}.pdf.prawn"
420
+ else
421
+ f= "app/views/#{s.module.code}/#{s.code}/#{code}.html.erb"
422
+ end
423
+ $afile << f
424
+ unless gen_view_file_exist?(f)
425
+ sv = "app/jinda/template/view.html.erb"
426
+ gen_view_createfile(sv,f,t)
427
+ end
428
+ end
429
+ end
430
+ end
431
+ puts $afile.join("\n")
432
+ puts t.join("\n")
433
+ return $afile
434
+ end
435
+
436
+ def process_controllers
437
+ process_services
438
+ modules= Jinda::Module.all
439
+ modules.each do |m|
440
+ next if controller_exists?(m.code)
441
+ system("rails generate controller #{m.code}")
442
+ end
443
+ end
444
+
445
+ def process_models
446
+
447
+ # app= get_app
448
+ # t= ["process models"]
449
+ # xml map sample from index.mm
450
+ # node @CREATED=1273819432637 @ID=ID_1098419600 @MODIFIED=1334737006485 @TEXT=Jinda
451
+ # node @CREATED=1273819462973 @ID=ID_282419531 @MODIFIED=1493705904561 @POSITION=right @TEXT=services
452
+ # node @CREATED=1273819465949 @FOLDED=true @ID=ID_855471610 @MODIFIED=1493768913078 @POSITION=right @TEXT=roles
453
+ # node @CREATED=1273819456867 @ID=ID_1677010054 @MODIFIED=1493418874718 @POSITION=left @TEXT=models
454
+ # node @CREATED=1292122118499 @FOLDED=true @ID=ID_1957754752 @MODIFIED=1493705885123 @TEXT=person
455
+ # node @CREATED=1292122236285 @FOLDED=true @ID=ID_959987887 @MODIFIED=1493768919147 @TEXT=address
456
+ # node @CREATED=1493418879485 @ID=ID_1995497233 @MODIFIED=1493718770637 @TEXT=article
457
+ # node @CREATED=1493418915637 @ID=ID_429078131 @MODIFIED=1493418930081 @TEXT=comment
458
+
459
+ models= @app.elements["//node[@TEXT='models']"] || REXML::Document.new
460
+ models.each_element('node') do |model|
461
+ # t << "= "+model.attributes["TEXT"]
462
+ model_name= model.attributes["TEXT"]
463
+ next if model_name.comment?
464
+ model_code= name2code(model_name)
465
+ model_file= "#{Rails.root}/app/models/#{model_code}.rb"
466
+
467
+ if File.exists?(model_file)
468
+ doc= File.read(model_file)
469
+ else
470
+ system("rails generate model #{model_code}")
471
+ doc= File.read(model_file)
472
+ end
473
+
474
+ doc = add_utf8(doc)
475
+ attr_hash= make_fields(model)
476
+ doc = add_jinda(doc, attr_hash)
477
+ # t << "modified: #{model_file}"
478
+ File.open(model_file, "w") do |f|
479
+ f.puts doc
480
+ end
481
+
482
+ end
483
+
484
+ # puts t.join("\n")
485
+ end
486
+
487
+ def add_jinda(doc, attr_hash)
488
+ if doc =~ /#{@btext}/
489
+ s1,s2,s3= doc.partition(/ #{@btext}.*#{@etext}\n/m)
490
+ s2= ""
491
+ else
492
+ s1,s2,s3= doc.partition("include Mongoid::Document\n")
493
+ end
494
+ doc= s1+s2+ <<-EOT
495
+ #{@btext}
496
+ include Mongoid::Timestamps
497
+ EOT
498
+
499
+ attr_hash.each do |a|
500
+ # doc+= "\n*****"+a.to_s+"\n"
501
+ if a[:edit]
502
+ doc += " #{a[:text]}\n"
503
+ else
504
+ doc += " field :#{a[:code]}, :type => #{a[:type].capitalize}\n"
505
+ end
506
+ end
507
+ doc += " #{@etext}\n"
508
+ doc + s3
509
+ end
510
+
511
+ def add_utf8(doc)
512
+ unless doc =~ /encoding\s*:\s*utf-8/
513
+ doc.insert 0, "# encoding: utf-8\n"
514
+ else
515
+ doc
516
+ end
517
+ end
518
+
519
+ # inspect all nodes that has attached file (2 cases) and replace relative path with absolute path
520
+ def make_folders_absolute(f,tt)
521
+ tt.elements.each("//node") do |nn|
522
+ if nn.attributes['LINK']
523
+ nn.attributes['LINK']= File.expand_path(File.dirname(f))+"/#{nn.attributes['LINK']}"
524
+ end
525
+ end
526
+ end
527
+
528
+ def name2code(s)
529
+ # rather not ignore # symbol cause it could be comment
530
+ code, name = s.split(':')
531
+ code.downcase.strip.gsub(' ','_').gsub(/[^#_\/a-zA-Z0-9]/,'')
532
+ end
533
+
534
+ def model_exists?(model)
535
+ File.exists? "#{Rails.root}/app/models/#{model}.rb"
536
+ end
537
+
538
+ def make_fields(n)
539
+ # s= field string used by generate model cli (old style jinda)
540
+ s= ""
541
+ # h= hash :code, :type, :edit, :text
542
+ h= []
543
+ n.each_element('node') do |nn|
544
+ text = nn.attributes['TEXT']
545
+ icon = nn.elements['icon']
546
+ edit= (icon && icon.attribute('BUILTIN').value=="edit")
547
+ next if text.comment? && !edit
548
+
549
+ # sometimes freemind puts all fields inside a blank node
550
+ unless text.empty?
551
+ k,v= text.split(/:\s*/,2)
552
+ v ||= 'string'
553
+ v= 'float' if v=~/double/i
554
+ s << " #{name2code(k.strip)}:#{v.strip} "
555
+ h << {:code=>name2code(k.strip), :type=>v.strip, :edit=>edit, :text=>text}
556
+ else
557
+ nn.each_element('node') do |nnn|
558
+ icon = nnn.elements['icon']
559
+ edit1= (icon && icon.attribute('BUILTIN').value=="edit")
560
+ text1 = nnn.attributes['TEXT']
561
+ next if text1 =~ /\#.*/
562
+ k,v= text1.split(/:\s*/,2)
563
+ v ||= 'string'
564
+ v= 'float' if v=~/double/i
565
+ s << " #{name2code(k.strip)}:#{v.strip} "
566
+ h << {:code=>name2code(k.strip), :type=>v.strip, :edit=>edit1, :text=>text1}
567
+ end
568
+ end
569
+ end
570
+ # f
571
+ h
572
+ end
573
+
574
+ # Add method to ruby class String
575
+ # ###############################
576
+ class String
577
+ def comment?
578
+ self[0]=='#'
579
+ # self[0]==35 # check if first char is #
580
+ end
581
+ def to_code
582
+ s= self.dup
583
+ s.downcase.strip.gsub(' ','_').gsub(/[^#_\/a-zA-Z0-9]/,'')
584
+ end
585
+ end
586
+
587
+ ########################################################################
588
+ # END code from jinda.rake #
589
+ ########################################################################
590
+
591
+
592
+ ########################################################################
593
+ # Methods to be overrided by gemhelp #
594
+ # for Rspec Test
595
+ ########################################################################
596
+ def gen_view_file_exist?(dir)
597
+ File.exists?(dir)
598
+ end
599
+
600
+ def gen_view_mkdir(dir,t)
601
+ Dir.mkdir(dir)
602
+ t << "create directory #{dir}"
603
+ end
604
+
605
+ def gen_view_createfile(s,f,t)
606
+ FileUtils.cp s,f
607
+ # FileUtils.cp "app/jinda/template/linkview.haml",f
608
+ t << "create file #{f}"
609
+ end
610
+ ########################################################################
611
+
612
+ def controller_exists?(modul)
613
+ File.exists? "#{Rails.root}/app/controllers/#{modul}_controller.rb"
614
+ end
615
+ def dup_hash(a)
616
+ h = Hash.new(0)
617
+ a.each do |aa|
618
+ h[aa] += 1
619
+ end
620
+ return h
621
+ end
622
+ def login?
623
+ ## To use remember me cookies then remove
624
+ #session[:user_id] != nil
625
+ current_ma_user != nil
626
+ #cookies[:auth_token] != nil
627
+ end
628
+ def own_xmain?
629
+ if $xmain
630
+ return current_ma_user.id==$xvars['user_id']
631
+ else
632
+ # if eval on first step would return true so user can start service
633
+ return true
634
+ end
635
+ end
636
+ def get_option_xml(opt, xml)
637
+ if xml
638
+ url=''
639
+ xml.each_element('node') do |n|
640
+ text= n.attributes['TEXT']
641
+ url= text if text =~/^#{opt}/
642
+ end
643
+ return nil if url.blank?
644
+ c, h= url.split(':', 2)
645
+ opt= h ? h.strip : true
646
+ else
647
+ return nil
648
+ end
649
+ end
650
+ def m_icon(node)
651
+ mcons=[]
652
+ node.each_element("icon") do |mn|
653
+ mcons << mn.attributes["BUILTIN"]
654
+ end
655
+ ticon = mcons[0].to_s
656
+ return ticon
657
+ end
658
+
659
+ # Option to unlisted in the menu_mm if icon 'button_cancel'
660
+ def listed(node)
661
+ icons=[]
662
+ node.each_element("icon") do |nn|
663
+ icons << nn.attributes["BUILTIN"]
664
+ end
665
+
666
+ return !icons.include?("button_cancel")
667
+ end
668
+ def ma_secured?(node)
669
+ icons=[]
670
+ node.each_element("icon") do |nn|
671
+ icons << nn.attributes["BUILTIN"]
672
+ end
673
+ return icons.include?("password")
674
+ end
675
+ def ma_menu?
676
+ icons=[]
677
+ node.each_element("icon") do |mn|
678
+ icons << mn.attributes["BUILTIN"]
679
+ end
680
+ return icons.include?("menu")
681
+ end
682
+
683
+ def freemind2action(s)
684
+ case s.downcase
685
+ #when 'bookmark' # Excellent
686
+ # 'call'
687
+ when 'bookmark' # Excellent
688
+ 'do'
689
+ when 'attach' # Look here
690
+ 'form'
691
+ when 'edit' # Refine
692
+ 'pdf'
693
+ when 'wizard' # Magic
694
+ 'ws'
695
+ when 'help' # Question
696
+ 'if'
697
+ when 'forward' # Forward
698
+ 'redirect'
699
+ when 'kaddressbook' #Phone
700
+ 'invoke' # invoke new service along the way
701
+ when 'list' # Output
702
+ 'output'
703
+ when 'mail'
704
+ 'mail'
705
+ when 'xmag' # Tobe discussed
706
+ 'search'
707
+ end
708
+ end
709
+ def affirm(s)
710
+ return s =~ /[y|yes|t|true]/i ? true : false
711
+ end
712
+ def negate(s)
713
+ return s =~ /[n|no|f|false]/i ? true : false
714
+ end
715
+
716
+ # module FormBuilder
717
+ # def date_field(method, options = {})
718
+ # default= self.object.send(method) || Date.today
719
+ # data_options= ({"mode"=>"calbox"}).merge(options)
720
+ # %Q(<input name='#{self.object_name}[#{method}]' id='#{self.object_name}_#{method}' value='#{default.strftime("%F")}' type='date' data-role='datebox' data-options='#{data_options.to_json}'>).html_safe
721
+ # end
722
+ # end
723
+ end
724
+ end
725
+
726
+ class String
727
+ #
728
+ # Put comment in freemind with #
729
+ # Sample Freemind
730
+ # #ctrs:ctrs&Menu
731
+ #
732
+ def comment?
733
+ self[0]=='#'
734
+ end
735
+ def to_code
736
+ s= self.dup
737
+ # s.downcase!
738
+ # s.gsub! /[\s\-_]/, ""
739
+ # s
740
+ code, name = s.split(':')
741
+ code.downcase.strip.gsub(' ','_').gsub(/[^#_\/a-zA-Z0-9]/,'')
742
+ end
743
+ end
744
+
745
+ module ActionView
746
+ module Helpers
747
+ module DateHelper
748
+ def date_field_tag(method, options = {})
749
+ default= options[:default] || Date.today
750
+ data_options= ({"mode"=>"calbox"}).merge(options)
751
+ %Q(<input name='#{method}' id='#{method}' value='#{default.strftime("%F")}' type='date' data-role='datebox' data-options='#{data_options.to_json}'>).html_safe
752
+ end
753
+ end
754
+ class FormBuilder
755
+ def date_select_thai(method)
756
+ self.date_select method, :use_month_names=>THAI_MONTHS, :order=>[:day, :month, :year]
757
+ end
758
+ def date_field(method, options = {})
759
+ default= options[:default] || self.object.send(method) || Date.today
760
+ data_options= ({"mode"=>"calbox"}).merge(options)
761
+ out= %Q(<input name='#{self.object_name}[#{method}]' id='#{self.object_name}_#{method}' value='#{default.strftime("%F")}' type='date' data-role='datebox' data-options='#{data_options.to_json}'>)
762
+ out.html_safe
763
+ end
764
+ def time_field(method, options = {})
765
+ default= self.object.send(method) || Time.now
766
+ data_options= ({"mode"=>"timebox"}).merge(options)
767
+ out=%Q(<input name='#{self.object_name}[#{method}]' id='#{self.object_name}_#{method}' value='#{default}' type='date' data-role='datebox' data-options='#{data_options.to_json}'>)
768
+ out.html_safe
769
+ end
770
+ def date_select_thai(method, default= Time.now, disabled=false)
771
+ date_select method, :default => default, :use_month_names=>THAI_MONTHS, :order=>[:day, :month, :year], :disabled=>disabled
772
+ end
773
+ def datetime_select_thai(method, default= Time.now, disabled=false)
774
+ datetime_select method, :default => default, :use_month_names=>THAI_MONTHS, :order=>[:day, :month, :year], :disabled=>disabled
775
+ end
776
+
777
+ def point(o={})
778
+ o[:zoom]= 11 unless o[:zoom]
779
+ o[:width]= '100%' unless o[:width]
780
+ o[:height]= '300px' unless o[:height]
781
+ o[:lat] = 13.91819 unless o[:lat]
782
+ o[:lng] = 100.48889 unless o[:lng]
783
+
784
+ out = <<-EOT
785
+ <script type='text/javascript'>
786
+ //<![CDATA[
787
+ var latLng;
788
+ var map_#{self.object_name};
789
+ var marker_#{self.object_name};
790
+
791
+ function init_map() {
792
+ var lat = #{o[:lat]};
793
+ var lng = #{o[:lng]};
794
+ //var lat = position.coords.latitude"; // HTML5 pass position in function initialize(position)
795
+ // google.loader.ClientLocation.latitude;
796
+ //var lng = position.coords.longitude;
797
+ // google.loader.ClientLocation.longitude;
798
+ latLng = new google.maps.LatLng(lat, lng);
799
+ map_#{self.object_name} = new google.maps.Map(document.getElementById("map_#{self.object_name}"), {
800
+ zoom: #{o[:zoom]},
801
+ center: latLng,
802
+ mapTypeId: google.maps.MapTypeId.ROADMAP
803
+ });
804
+ marker_#{self.object_name} = new google.maps.Marker({
805
+ position: latLng,
806
+ map: map_#{self.object_name},
807
+ draggable: true,
808
+ });
809
+ google.maps.event.addListener(marker_#{self.object_name}, 'dragend', function(event) {
810
+ $('##{self.object_name}_lat').val(event.latLng.lat());
811
+ $('##{self.object_name}_lng').val(event.latLng.lng());
812
+ });
813
+ google.maps.event.addListener(map_#{self.object_name}, 'click', function(event) {
814
+ $('##{self.object_name}_lat').val(event.latLng.lat());
815
+ $('##{self.object_name}_lng').val(event.latLng.lng());
816
+ move();
817
+ });
818
+ $('##{self.object_name}_lat').val(lat);
819
+ $('##{self.object_name}_lng').val(lng);
820
+ };
821
+
822
+ function move() {
823
+ latLng = new google.maps.LatLng($('##{self.object_name}_lat').val(), $('##{self.object_name}_lng').val());
824
+ map_#{self.object_name}.panTo(latLng);
825
+ marker_#{self.object_name}.setPosition(latLng);
826
+ }
827
+
828
+ //google.maps.event.addDomListener(window, 'load', init_map);
829
+
830
+ //]]>
831
+ </script>
832
+ <div class="field" data-role="fieldcontain">
833
+ Latitude: #{self.text_field :lat, :style=>"width:300px;" }
834
+ Longitude: #{self.text_field :lng, :style=>"width:300px;" }
835
+ </div>
836
+ <p/>
837
+ <div id='map_#{self.object_name}' style='max-width: none !important; width:#{o[:width]}; height:#{o[:height]};' class='map'></div>
838
+ <script>
839
+ $('##{self.object_name}_lat').change(function() {move()});
840
+ $('##{self.object_name}_lng').change(function() {move()});
841
+ //var w= $("input[id*=lat]").parent().width();
842
+ //$("input[id*=lat]").css('width','300px');
843
+ //$("input[id*=lng]").css('width','300px');
844
+ $( document ).one( "pagechange", function(){
845
+ init_map();
846
+ });
847
+ </script>
848
+ EOT
849
+ out.html_safe
850
+ end
851
+ end
852
+ end
853
+ end