jinda_engine 0.6.0

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