jinda-5 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
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