jinda 0.6.2 → 0.6.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (220) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/assets/config/manifest.js +4 -0
  4. data/{lib/generators/jinda/templates/app → app}/assets/images/4dcity-old.ico +0 -0
  5. data/{lib/generators/jinda/templates/app → app}/assets/images/4dcity.ico +0 -0
  6. data/{lib/generators/jinda/templates/app → app}/assets/images/account.png +0 -0
  7. data/{lib/generators/jinda/templates/app → app}/assets/images/add.png +0 -0
  8. data/{lib/generators/jinda/templates/app → app}/assets/images/ajax-loader-circle.gif +0 -0
  9. data/{lib/generators/jinda/templates/app → app}/assets/images/ajax-loader.gif +0 -0
  10. data/{lib/generators/jinda/templates/app → app}/assets/images/anchor.png +0 -0
  11. data/{lib/generators/jinda/templates/app → app}/assets/images/application_double.png +0 -0
  12. data/{lib/generators/jinda/templates/app → app}/assets/images/application_form_edit.png +0 -0
  13. data/{lib/generators/jinda/templates/app → app}/assets/images/arrow_left.png +0 -0
  14. data/{lib/generators/jinda/templates/app → app}/assets/images/arrow_right.png +0 -0
  15. data/{lib/generators/jinda/templates/app → app}/assets/images/arrow_turn_left.png +0 -0
  16. data/{lib/generators/jinda/templates/app → app}/assets/images/arrow_turn_right.png +0 -0
  17. data/{lib/generators/jinda/templates/app → app}/assets/images/calendar.png +0 -0
  18. data/{lib/generators/jinda/templates/app → app}/assets/images/cancel.png +0 -0
  19. data/{lib/generators/jinda/templates/app → app}/assets/images/chart_bar.png +0 -0
  20. data/{lib/generators/jinda/templates/app → app}/assets/images/clock.png +0 -0
  21. data/{lib/generators/jinda/templates/app → app}/assets/images/cog.png +0 -0
  22. data/{lib/generators/jinda/templates/app → app}/assets/images/control_fastforward.png +0 -0
  23. data/{lib/generators/jinda/templates/app → app}/assets/images/control_play.png +0 -0
  24. data/{lib/generators/jinda/templates/app → app}/assets/images/cross.png +0 -0
  25. data/{lib/generators/jinda/templates/app → app}/assets/images/delete.png +0 -0
  26. data/{lib/generators/jinda/templates/app → app}/assets/images/external-link.png +0 -0
  27. data/{lib/generators/jinda/templates/app → app}/assets/images/facebook-continue-button.png +0 -0
  28. data/{lib/generators/jinda/templates/app → app}/assets/images/facebooksmall.png +0 -0
  29. data/{lib/generators/jinda/templates/app → app}/assets/images/favicon.ico +0 -0
  30. data/{lib/generators/jinda/templates/app → app}/assets/images/freemind(mm).png +0 -0
  31. data/{lib/generators/jinda/templates/app → app}/assets/images/google-continue-button.png +0 -0
  32. data/{lib/generators/jinda/templates/app → app}/assets/images/help.png +0 -0
  33. data/{lib/generators/jinda/templates/app → app}/assets/images/highway-menu.png +0 -0
  34. data/{lib/generators/jinda/templates/app → app}/assets/images/highway.png +0 -0
  35. data/{lib/generators/jinda/templates/app → app}/assets/images/house.png +0 -0
  36. data/{lib/generators/jinda/templates/app → app}/assets/images/icons-18-black.png +0 -0
  37. data/{lib/generators/jinda/templates/app → app}/assets/images/icons-18-white.png +0 -0
  38. data/{lib/generators/jinda/templates/app → app}/assets/images/icons-36-black.png +0 -0
  39. data/{lib/generators/jinda/templates/app → app}/assets/images/icons-36-white.png +0 -0
  40. data/{lib/generators/jinda/templates/app → app}/assets/images/logo.png +0 -0
  41. data/{lib/generators/jinda/templates/app → app}/assets/images/logo_jinda.png +0 -0
  42. data/{lib/generators/jinda/templates/app → app}/assets/images/logout.png +0 -0
  43. data/{lib/generators/jinda/templates/app → app}/assets/images/new.gif +0 -0
  44. data/{lib/generators/jinda/templates/app → app}/assets/images/new.png +0 -0
  45. data/{lib/generators/jinda/templates/app → app}/assets/images/page.png +0 -0
  46. data/{lib/generators/jinda/templates/app → app}/assets/images/page_attach.png +0 -0
  47. data/{lib/generators/jinda/templates/app → app}/assets/images/page_green.png +0 -0
  48. data/{lib/generators/jinda/templates/app → app}/assets/images/page_output.png +0 -0
  49. data/{lib/generators/jinda/templates/app → app}/assets/images/page_pdf.png +0 -0
  50. data/{lib/generators/jinda/templates/app → app}/assets/images/pencil.png +0 -0
  51. data/{lib/generators/jinda/templates/app → app}/assets/images/printer.png +0 -0
  52. data/{lib/generators/jinda/templates/app → app}/assets/images/refresh.png +0 -0
  53. data/{lib/generators/jinda/templates/app → app}/assets/images/report.png +0 -0
  54. data/{lib/generators/jinda/templates/app → app}/assets/images/rssmall.png +0 -0
  55. data/{lib/generators/jinda/templates/app → app}/assets/images/tick.png +0 -0
  56. data/{lib/generators/jinda/templates/app → app}/assets/images/twittersmall.png +0 -0
  57. data/{lib/generators/jinda/templates/app → app}/assets/images/user.png +0 -0
  58. data/{lib/generators/jinda/templates/app → app}/assets/images/user_admin_gear.png +0 -0
  59. data/{lib/generators/jinda/templates/app → app}/assets/images/view_code.png +0 -0
  60. data/{lib/generators/jinda/templates/app/assets/javascripts/application.js-jqm → app/assets/javascripts/application.js-org} +8 -11
  61. data/{lib/generators/jinda/templates/app → app}/assets/javascripts/cable.js +0 -0
  62. data/{lib/generators/jinda/templates/app → app}/assets/javascripts/disable_enter_key.js +0 -0
  63. data/{lib/generators/jinda/templates/app → app}/assets/javascripts/iscroll-wrapper.js +0 -0
  64. data/{lib/generators/jinda/templates/app → app}/assets/javascripts/iscroll.js +0 -0
  65. data/{lib/generators/jinda/templates/app → app}/assets/javascripts/jinda.js +0 -0
  66. data/app/assets/javascripts/jinda_jqm.js +24 -0
  67. data/{lib/generators/jinda/templates/app → app}/assets/javascripts/jquery.mobile-1.2.1.js +0 -0
  68. data/{lib/generators/jinda/templates/app → app}/assets/javascripts/jquery.mobile.datebox.js +0 -0
  69. data/{lib/generators/jinda/templates/app → app}/assets/javascripts/jquery.mobile.splitview.js +0 -0
  70. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/app.scss +0 -0
  71. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/articles.scss +0 -0
  72. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/sarabun.eot +0 -0
  73. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/sarabun.ttf +0 -0
  74. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/sarabun.woff +0 -0
  75. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/sarabun_bold.ttf +0 -0
  76. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/sarabun_bolditalic.ttf +0 -0
  77. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/sarabun_italic.ttf +0 -0
  78. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew-webfont.eot +0 -0
  79. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew-webfont.ttf +0 -0
  80. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew-webfont.woff +0 -0
  81. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew.css +0 -0
  82. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_bold-webfont.eot +0 -0
  83. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_bold-webfont.ttf +0 -0
  84. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_bold-webfont.woff +0 -0
  85. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.eot +0 -0
  86. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.ttf +0 -0
  87. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.woff +0 -0
  88. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_italic-webfont.eot +0 -0
  89. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_italic-webfont.ttf +0 -0
  90. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_italic-webfont.woff +0 -0
  91. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/ajax-loader.gif +0 -0
  92. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/button_black.png +0 -0
  93. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/button_blue.png +0 -0
  94. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/button_red.png +0 -0
  95. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/icons-18-black.png +0 -0
  96. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/icons-18-white.png +0 -0
  97. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/icons-36-black.png +0 -0
  98. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/icons-36-white.png +0 -0
  99. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/indicator.gif +0 -0
  100. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/jinda.css +0 -0
  101. data/app/assets/stylesheets/jinda_jqm.css.scss +32 -0
  102. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/jquery.mobile-1.2.1.css +0 -0
  103. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/jquery.mobile.datebox.css +0 -0
  104. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/jquery.mobile.grids.collapsible.css +0 -0
  105. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/jquery.mobile.splitview.css +0 -0
  106. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/kul-4.2.css +0 -0
  107. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/kul-4.2.min.css +0 -0
  108. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/modules.scss +0 -0
  109. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/sarabun.css +0 -0
  110. data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/social.scss +0 -0
  111. data/{lib/generators/jinda/templates/app → app}/controllers/concerns/jinda_general_concern.rb +0 -0
  112. data/{lib/generators/jinda/templates/app → app}/controllers/concerns/jinda_run_concern.rb +0 -0
  113. data/{lib/generators/jinda/templates/app/controllers/jinda_org → app/controllers}/jinda_controller.rb +0 -0
  114. data/app/jinda/index.mm +369 -0
  115. data/app/jinda/template/index.mm +366 -0
  116. data/app/jinda/template/linkview.haml +21 -0
  117. data/app/jinda/template/view.html.erb +26 -0
  118. data/{lib/generators/jinda/templates/app → app}/views/jinda/_activity.md +0 -0
  119. data/{lib/generators/jinda/templates/app → app}/views/jinda/_menu.haml +0 -0
  120. data/{lib/generators/jinda/templates/app → app}/views/jinda/_menu_mm.haml +0 -0
  121. data/{lib/generators/jinda/templates/app → app}/views/jinda/_model.md +0 -0
  122. data/{lib/generators/jinda/templates/app → app}/views/jinda/_modul.md +0 -0
  123. data/{lib/generators/jinda/templates/app → app}/views/jinda/_pending_home.haml +0 -0
  124. data/{lib/generators/jinda/templates/app → app}/views/jinda/_pending_page.haml +0 -0
  125. data/{lib/generators/jinda/templates/app → app}/views/jinda/_service.md +0 -0
  126. data/{lib/generators/jinda/templates/app → app}/views/jinda/_static.haml +0 -0
  127. data/{lib/generators/jinda/templates/app → app}/views/jinda/doc-thai.md +0 -0
  128. data/{lib/generators/jinda/templates/app → app}/views/jinda/doc.md +0 -0
  129. data/{lib/generators/jinda/templates/app → app}/views/jinda/error_logs.haml +0 -0
  130. data/{lib/generators/jinda/templates/app → app}/views/jinda/feed.rss.builder +0 -0
  131. data/{lib/generators/jinda/templates/app → app}/views/jinda/help.haml +0 -0
  132. data/{lib/generators/jinda/templates/app → app}/views/jinda/index.html.haml +1 -1
  133. data/{lib/generators/jinda/templates/app → app}/views/jinda/logs.haml +0 -0
  134. data/{lib/generators/jinda/templates/app → app}/views/jinda/notice_logs.haml +0 -0
  135. data/{lib/generators/jinda/templates/app → app}/views/jinda/pending.haml +0 -0
  136. data/{lib/generators/jinda/templates/app → app}/views/jinda/run_form.haml +0 -0
  137. data/{lib/generators/jinda/templates/app → app}/views/jinda/run_output.haml +0 -0
  138. data/{lib/generators/jinda/templates/app → app}/views/jinda/search.haml +0 -0
  139. data/{lib/generators/jinda/templates/app → app}/views/jinda/status.haml +0 -0
  140. data/lib/generators/jinda/config_generator.rb +7 -0
  141. data/lib/generators/jinda/install_generator.rb +45 -42
  142. data/lib/generators/jinda/templates/Dockerfile +24 -0
  143. data/lib/generators/jinda/templates/app/assets/javascripts/application.js +1 -10
  144. data/lib/generators/jinda/templates/app/assets/stylesheets/application.css.scss +1 -20
  145. data/lib/generators/jinda/templates/config/mongoid.yml-docker +182 -0
  146. data/lib/generators/jinda/templates/config/mongoid.yml-localhost +182 -0
  147. data/lib/generators/jinda/templates/docker-compose.yml +16 -0
  148. data/lib/generators/jinda/templates/entrypoint.sh +12 -0
  149. data/lib/jinda.rb +2 -1
  150. data/lib/jinda/date_helpers.rb +109 -0
  151. data/lib/jinda/{gemhelpers.rb → gem_helpers.rb} +0 -1
  152. data/lib/jinda/gen_class.rb +13 -0
  153. data/lib/jinda/gen_controller.rb +10 -0
  154. data/lib/jinda/gen_freemind.rb +33 -0
  155. data/lib/jinda/gen_helpers.rb +141 -0
  156. data/lib/jinda/gen_models.rb +137 -0
  157. data/lib/jinda/gen_runseq.rb +71 -0
  158. data/lib/jinda/gen_services.rb +90 -0
  159. data/lib/jinda/gen_xmain.rb +38 -0
  160. data/lib/jinda/get_app.rb +34 -0
  161. data/lib/jinda/helpers.rb +17 -998
  162. data/lib/jinda/init_vars.rb +36 -0
  163. data/lib/jinda/rake_views.rb +59 -0
  164. data/lib/jinda/refresh.rb +67 -0
  165. data/lib/jinda/themes.rb +163 -0
  166. data/lib/jinda/version.rb +1 -1
  167. data/test/dummy/Rakefile +6 -0
  168. data/test/dummy/app/assets/config/manifest.js +3 -0
  169. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  170. data/test/dummy/app/channels/application_cable/channel.rb +4 -0
  171. data/test/dummy/app/channels/application_cable/connection.rb +4 -0
  172. data/test/dummy/app/controllers/application_controller.rb +2 -0
  173. data/test/dummy/app/helpers/application_helper.rb +2 -0
  174. data/test/dummy/app/javascript/packs/application.js +15 -0
  175. data/test/dummy/app/jobs/application_job.rb +7 -0
  176. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  177. data/test/dummy/app/models/application_record.rb +3 -0
  178. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  179. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  180. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  181. data/test/dummy/bin/rails +4 -0
  182. data/test/dummy/bin/rake +4 -0
  183. data/test/dummy/bin/setup +33 -0
  184. data/test/dummy/config.ru +5 -0
  185. data/test/dummy/config/application.rb +19 -0
  186. data/test/dummy/config/boot.rb +5 -0
  187. data/test/dummy/config/cable.yml +10 -0
  188. data/test/dummy/config/database.yml +25 -0
  189. data/test/dummy/config/environment.rb +5 -0
  190. data/test/dummy/config/environments/development.rb +62 -0
  191. data/test/dummy/config/environments/production.rb +112 -0
  192. data/test/dummy/config/environments/test.rb +49 -0
  193. data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
  194. data/test/dummy/config/initializers/assets.rb +12 -0
  195. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  196. data/test/dummy/config/initializers/content_security_policy.rb +28 -0
  197. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  198. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  199. data/test/dummy/config/initializers/inflections.rb +16 -0
  200. data/test/dummy/config/initializers/mime_types.rb +4 -0
  201. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  202. data/test/dummy/config/locales/en.yml +33 -0
  203. data/test/dummy/config/puma.rb +38 -0
  204. data/test/dummy/config/routes.rb +3 -0
  205. data/test/dummy/config/spring.rb +6 -0
  206. data/test/dummy/config/storage.yml +34 -0
  207. data/test/dummy/db/development.sqlite3 +0 -0
  208. data/test/dummy/log/development.log +8 -0
  209. data/test/dummy/public/404.html +67 -0
  210. data/test/dummy/public/422.html +67 -0
  211. data/test/dummy/public/500.html +66 -0
  212. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  213. data/test/dummy/public/apple-touch-icon.png +0 -0
  214. data/test/dummy/public/favicon.ico +0 -0
  215. data/test/dummy/tmp/development_secret.txt +1 -0
  216. data/test/integration/navigation_test.rb +7 -0
  217. data/test/jinda_test.rb +7 -0
  218. data/test/test_helper.rb +19 -0
  219. metadata +232 -161
  220. data/lib/generators/jinda/templates/app/controllers/jinda_org/devs_controller.rb +0 -2
@@ -0,0 +1,71 @@
1
+
2
+
3
+ ########################################################################]
4
+ # Each xmain will create many run_seq as many as steps and form_steps
5
+ ########################################################################]
6
+ #
7
+ ############################## @runseq ################################]
8
+ # @runseq => #<Jinda::Runseq _id: 5df31912a54d758417a7afc9,
9
+ # created_at: 2019-12-13 04:52:34 UTC,
10
+ # updated_at: 2019-12-13 04:52:43 UTC,
11
+ # user_id: nil,
12
+ # xmain_id: BSON::ObjectId('5df31912a54d758417a7afc7'),
13
+ # action: "do",
14
+ # status: "R",
15
+ # code: "create",
16
+ # name: "Create Article",
17
+ # role: "",
18
+ # rule: "true",
19
+ # rstep: 2,
20
+ # form_step: 1,
21
+ # start: 2019-12-13 04:52:43 UTC,
22
+ # stop: nil,
23
+ # end: true,
24
+ # xml: "<node CREATED='1493419491125' ID='ID_1687683396' MODIFIED='1493483244848' TEXT='create: Create Article'><icon BUILTIN='bookmark'/></node>",
25
+ # ip: nil>
26
+ ########################################################################]
27
+
28
+ def create_runseq(xmain)
29
+ @xvars= xmain.xvars
30
+ default_role= get_default_role
31
+ xml= xmain.service.xml
32
+ root = REXML::Document.new(xml).root
33
+ i= 0; j= 0 # i= step, j= form_step
34
+ root.elements.each('node') do |activity|
35
+ text= activity.attributes['TEXT']
36
+ next if ma_comment?(text)
37
+ next if text =~/^rule:\s*/
38
+ action= freemind2action(activity.elements['icon'].attributes['BUILTIN']) if activity.elements['icon']
39
+ return false unless action
40
+ i= i + 1
41
+ output_ma_display= false
42
+ if action== ('output'|| 'list' ||'folder')
43
+ ma_display= get_option_xml("display", activity)
44
+ if ma_display && !affirm(ma_display)
45
+ output_ma_display= false
46
+ else
47
+ output_ma_display= true
48
+ end
49
+ end
50
+ j= j + 1 if (action=='form' || output_ma_display)
51
+ @xvars['referer'] = activity.attributes['TEXT'] if action=='redirect'
52
+ if action!= 'if' && !text.blank?
53
+ scode, name= text.split(':', 2)
54
+ name ||= scode; name.strip!
55
+ code= name2code(scode)
56
+ else
57
+ code= text
58
+ name= text
59
+ end
60
+ role= get_option_xml("role", activity) || default_role
61
+ rule= get_option_xml("rule", activity) || "true"
62
+ runseq= Jinda::Runseq.create :xmain=>xmain.id,
63
+ :name=> name, :action=> action,
64
+ :code=> code, :role=>role.upcase, :rule=> rule,
65
+ :rstep=> i, :form_step=> j, :status=>'I',
66
+ :xml=>activity.to_s
67
+ xmain.current_runseq= runseq.id if i==1
68
+ end
69
+ @xvars['total_steps']= i
70
+ @xvars['total_form_steps']= j
71
+ end
@@ -0,0 +1,90 @@
1
+
2
+
3
+ # ##########################################################################
4
+ #
5
+ # Create / Update Modules, Runseqs, Services from XML
6
+ #
7
+ # ##########################################################################
8
+ def process_services
9
+ # todo: persist mm_md5
10
+ xml= @app||get_app
11
+ if defined? session
12
+ md5= Digest::MD5.hexdigest(xml.to_s)
13
+ if session[:mm_md5]
14
+ return if session[:mm_md5]==md5
15
+ else
16
+ session[:mm_md5]= md5
17
+ end
18
+ end
19
+ protected_services = []
20
+ protected_modules = []
21
+ mseq= 0
22
+ @services= xml.elements["//node[@TEXT='services']"] || REXML::Document.new
23
+ @services.each_element('node') do |m|
24
+ # get icon for service menu
25
+ ss= m.attributes["TEXT"]
26
+ code, name= ss.split(':', 2)
27
+ next if code.blank?
28
+ next if code.comment?
29
+ module_code= code.to_code
30
+ menu_icon = m_icon(m)
31
+
32
+ # ##########################################################################
33
+ # First Node eg: Module Name
34
+ # ##########################################################################
35
+ # create or update to GmaModule
36
+ ma_module= Jinda::Module.find_or_create_by :code=>module_code
37
+ ma_module.update_attributes :uid=>ma_module.id.to_s, :icon=>menu_icon
38
+ protected_modules << ma_module.uid
39
+ name = module_code if name.blank?
40
+ ma_module.update_attributes :name=> name.strip, :seq=> mseq
41
+ mseq += 1
42
+ seq= 0
43
+
44
+ # ##########################################################################
45
+ # Second Nodes eg: Role, Link otherwise Services
46
+ # ##########################################################################
47
+ m.each_element('node') do |s|
48
+ service_name= s.attributes["TEXT"].to_s
49
+ scode, sname= service_name.split(':', 2)
50
+ sname ||= scode; sname.strip!
51
+ scode= scode.to_code
52
+ if scode=="role"
53
+ ma_module.update_attribute :role, sname
54
+ next
55
+ end
56
+ if scode.downcase=="link"
57
+ role= get_option_xml("role", s) || ""
58
+ rule= get_option_xml("rule", s) || ""
59
+ ma_service= Jinda::Service.find_or_create_by :module_code=> ma_module.code, :code=> scode, :name=> sname
60
+ ma_service.update_attributes :xml=>s.to_s, :name=>sname,
61
+ :list=>listed(s), :ma_secured=>ma_secured?(s),
62
+ :module_id=>ma_module.id, :seq => seq,
63
+ :confirm=> get_option_xml("confirm", xml),
64
+ :role => role, :rule => rule, :uid=> ma_service.id.to_s
65
+ seq += 1
66
+ protected_services << ma_service.uid
67
+ else
68
+
69
+ # ##########################################################################
70
+ # Second and Third Nodes eg: Role, Normal Services
71
+ # ##########################################################################
72
+ # normal service
73
+ step1 = s.elements['node']
74
+ role= get_option_xml("role", step1) || ""
75
+ rule= get_option_xml("rule", step1) || ""
76
+ ma_service= Jinda::Service.find_or_create_by :module_code=> ma_module.code, :code=> scode
77
+ ma_service.update_attributes :xml=>s.to_s, :name=>sname,
78
+ :list=>listed(s), :ma_secured=>ma_secured?(s),
79
+ :module_id=>ma_module.id, :seq => seq,
80
+ :confirm=> get_option_xml("confirm", xml),
81
+ :role => role, :rule => rule, :uid=> ma_service.id.to_s
82
+ seq += 1
83
+ protected_services << ma_service.uid
84
+ end
85
+ end
86
+ end
87
+ Jinda::Module.not_in(:uid=>protected_modules).delete_all
88
+ Jinda::Service.not_in(:uid=>protected_services).delete_all
89
+ end
90
+
@@ -0,0 +1,38 @@
1
+
2
+
3
+ ########################################################################]
4
+ # Each Service at one moment will create one xmain
5
+ ########################################################################]
6
+ def create_xmain(service)
7
+ c = name2camel(service.module.code)
8
+ custom_controller= "#{c}Controller"
9
+ params["return"] = request.env['HTTP_REFERER']
10
+ Jinda::Xmain.create :service=>service,
11
+ :start=>Time.now,
12
+ :name=>service.name,
13
+ :ip=> get_ip,
14
+ :status=>'I', # init
15
+ :user=>current_ma_user,
16
+ :xvars=> {
17
+ :service_id=>service.id,
18
+ :p=>params.to_unsafe_h,
19
+ :id=>params[:id],
20
+ :user_id=>current_ma_user.try(:id),
21
+ :custom_controller=>custom_controller,
22
+ :host=>request.host,
23
+ :referer=>request.env['HTTP_REFERER']
24
+ }
25
+ end
26
+ def clear_xmains
27
+ Jinda::Xmain.where(:status =>{'$in'=>['R','I']}).update_all(:status=>'X')
28
+ redirect_to action:"pending"
29
+ end
30
+ def ajax_notice
31
+ if notice=Jinda::Notice.recent(current_ma_user, request.env["REMOTE_ADDR"])
32
+ notice.update_attribute :unread, false
33
+ js = "notice('#{notice.message}');"
34
+ else
35
+ js = ""
36
+ end
37
+ render plain: "<script>#{js}</script>"
38
+ end
@@ -0,0 +1,34 @@
1
+
2
+
3
+ # ##########################################################################
4
+ # Load index.mm from Rails
5
+ # ##########################################################################
6
+ def get_app
7
+ # MM was defined in Rails: config/initializer/jinda.rb
8
+ f= MM || "#{Rails.root}/app/jinda/index.mm"
9
+ dir= File.dirname(f)
10
+ t= REXML::Document.new(File.read(MM).gsub("\n","")).root
11
+ recheck= true ; first_pass= true
12
+ while recheck
13
+ recheck= false
14
+ t.elements.each("//node") do |n|
15
+ if n.attributes['LINK'] # has attached file
16
+ if first_pass
17
+ f= "#{dir}/#{n.attributes['LINK']}"
18
+ else
19
+ f= n.attributes['LINK']
20
+ end
21
+ next unless File.exists?(f)
22
+ tt= REXML::Document.new(File.read(f).gsub("\n","")).root.elements["node"]
23
+ make_folders_absolute(f,tt)
24
+ tt.elements.each("node") do |tt_node|
25
+ n.parent.insert_before n, tt_node
26
+ end
27
+ recheck= true
28
+ n.parent.delete_element n
29
+ end
30
+ end
31
+ first_pass = false
32
+ end
33
+ return t
34
+ end
@@ -1,1008 +1,27 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  require 'active_support'
2
3
  require 'active_support/core_ext'
3
4
 
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
5
  module Jinda
29
6
  module Helpers
30
7
  require "rexml/document"
31
8
  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
- # Fixed: Capitalize only first char
649
- # doc += " field :#{a[:code]}, :type => #{a[:type].capitalize}\n"
650
- a[:type][0] = a[:type][0].capitalize
651
- doc += " field :#{a[:code]}, :type => #{a[:type]}\n"
652
- end
653
- end
654
- doc += " #{@etext}\n"
655
- doc + s3
656
- end
657
-
658
- def add_utf8(doc)
659
- unless doc =~ /encoding\s*:\s*utf-8/
660
- doc.insert 0, "# encoding: utf-8\n"
661
- else
662
- doc
663
- end
664
- end
665
-
666
- # inspect all nodes that has attached file (2 cases) and replace relative path with absolute path
667
- def make_folders_absolute(f,tt)
668
- tt.elements.each("//node") do |nn|
669
- if nn.attributes['LINK']
670
- nn.attributes['LINK']= File.expand_path(File.dirname(f))+"/#{nn.attributes['LINK']}"
671
- end
672
- end
673
- end
674
-
675
- def name2code(s)
676
- # rather not ignore # symbol cause it could be comment
677
- code, name = s.split(':')
678
- code.downcase.strip.gsub(' ','_').gsub(/[^#_\/a-zA-Z0-9]/,'')
679
- end
680
-
681
- def model_exists?(model)
682
- File.exists? "#{Rails.root}/app/models/#{model}.rb"
683
- end
684
-
685
- def make_fields(n)
686
- # s= field string used by generate model cli (old style jinda)
687
- s= ""
688
- # h= hash :code, :type, :edit, :text
689
- h= []
690
- n.each_element('node') do |nn|
691
- text = nn.attributes['TEXT']
692
- icon = nn.elements['icon']
693
- edit= (icon && icon.attribute('BUILTIN').value=="edit")
694
- next if text.comment? && !edit
695
-
696
- # sometimes freemind puts all fields inside a blank node
697
- unless text.empty?
698
- k,v= text.split(/:\s*/,2)
699
- v ||= 'string'
700
- v= 'float' if v=~/double/i
701
- s << " #{name2code(k.strip)}:#{v.strip} "
702
- h << {:code=>name2code(k.strip), :type=>v.strip, :edit=>edit, :text=>text}
703
- else
704
- nn.each_element('node') do |nnn|
705
- icon = nnn.elements['icon']
706
- edit1= (icon && icon.attribute('BUILTIN').value=="edit")
707
- text1 = nnn.attributes['TEXT']
708
- next if text1 =~ /\#.*/
709
- k,v= text1.split(/:\s*/,2)
710
- v ||= 'string'
711
- v= 'float' if v=~/double/i
712
- s << " #{name2code(k.strip)}:#{v.strip} "
713
- h << {:code=>name2code(k.strip), :type=>v.strip, :edit=>edit1, :text=>text1}
714
- end
715
- end
716
- end
717
- # f
718
- h
719
- end
720
-
721
- # Add method to ruby class String
722
- # ###############################
723
- class String
724
- def comment?
725
- self[0]=='#'
726
- # self[0]==35 # check if first char is #
727
- end
728
- def to_code
729
- s= self.dup
730
- s.downcase.strip.gsub(' ','_').gsub(/[^#_\/a-zA-Z0-9]/,'')
731
- end
732
- end
733
-
734
- ########################################################################
735
- # END code from jinda.rake #
736
- ########################################################################
737
-
738
-
739
- ########################################################################
740
- # Methods to be overrided by gemhelp #
741
- # for Rspec Test
742
- ########################################################################
743
- def gen_view_file_exist?(dir)
744
- File.exists?(dir)
745
- end
746
-
747
- def gen_view_mkdir(dir,t)
748
- Dir.mkdir(dir)
749
- t << "create directory #{dir}"
750
- end
751
-
752
- def gen_view_createfile(s,f,t)
753
- FileUtils.cp s,f
754
- # FileUtils.cp "app/jinda/template/linkview.haml",f
755
- t << "create file #{f}"
756
- end
757
- ########################################################################
758
-
759
- def controller_exists?(modul)
760
- File.exists? "#{Rails.root}/app/controllers/#{modul}_controller.rb"
761
- end
762
- def dup_hash(a)
763
- h = Hash.new(0)
764
- a.each do |aa|
765
- h[aa] += 1
766
- end
767
- return h
768
- end
769
- def login?
770
- ## To use remember me cookies then remove
771
- #session[:user_id] != nil
772
- current_ma_user != nil
773
- #cookies[:auth_token] != nil
774
- end
775
- def own_xmain?
776
- if $xmain
777
- return current_ma_user.id==$xvars['user_id']
778
- else
779
- # if eval on first step would return true so user can start service
780
- return true
781
- end
782
- end
783
- # return nil or value of opt: if provided
784
- def get_option_xml(opt, xml)
785
- if xml
786
- url=''
787
- xml.each_element('node') do |n|
788
- text= n.attributes['TEXT']
789
- # check if opt match from beginning of text
790
- url= text if text =~/^#{opt}/
791
- end
792
- return nil if url.blank?
793
- c, h= url.split(':', 2)
794
- opt= h ? h.strip : true
795
- else
796
- return nil
797
- end
798
- end
799
- def m_icon(node)
800
- mcons=[]
801
- node.each_element("icon") do |mn|
802
- mcons << mn.attributes["BUILTIN"]
803
- end
804
- ticon = mcons[0].to_s
805
- return ticon
806
- end
807
-
808
- # Option to unlisted in the menu_mm if icon 'button_cancel'
809
- def listed(node)
810
- icons=[]
811
- node.each_element("icon") do |nn|
812
- icons << nn.attributes["BUILTIN"]
813
- end
814
-
815
- return !icons.include?("button_cancel")
816
- end
817
- def ma_secured?(node)
818
- icons=[]
819
- node.each_element("icon") do |nn|
820
- icons << nn.attributes["BUILTIN"]
821
- end
822
- return icons.include?("password")
823
- end
824
- def ma_menu?
825
- icons=[]
826
- node.each_element("icon") do |mn|
827
- icons << mn.attributes["BUILTIN"]
828
- end
829
- return icons.include?("menu")
830
- end
831
-
832
- def freemind2action(s)
833
- case s.downcase
834
- #when 'bookmark' # Excellent
835
- # 'call'
836
- when 'bookmark' # Excellent
837
- 'do'
838
- when 'attach' # Look here
839
- 'form'
840
- when 'edit' # Refine
841
- 'pdf'
842
- when 'wizard' # Magic
843
- 'ws'
844
- when 'help' # Question
845
- 'if'
846
- when 'forward' # Forward
847
- # 'redirect'
848
- 'direct_to'
849
- when 'kaddressbook' #Phone
850
- 'invoke' # invoke new service along the way
851
- when 'idea' # output
852
- 'output'
853
- when 'list' # List
854
- 'list'
855
- when 'folder' # Folder
856
- 'folder'
857
- when 'mail'
858
- 'mail'
859
- # when 'xmag' # Tobe discussed
860
- when 'To be discusssed'
861
- 'search'
862
- end
863
- end
864
- def affirm(s)
865
- return s =~ /[y|yes|t|true]/i ? true : false
866
- end
867
- def negate(s)
868
- return s =~ /[n|no|f|false]/i ? true : false
869
- end
870
-
871
- # module FormBuilder
872
- # def date_field(method, options = {})
873
- # default= self.object.send(method) || Date.today
874
- # data_options= ({"mode"=>"calbox"}).merge(options)
875
- # %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
876
- # end
877
- # end
878
- end
879
- end
880
-
881
- class String
882
- #
883
- # Put comment in freemind with #
884
- # Sample Freemind
885
- # #ctrs:ctrs&Menu
886
- #
887
- def comment?
888
- self[0]=='#'
889
- end
890
- def to_code
891
- s= self.dup
892
- # s.downcase!
893
- # s.gsub! /[\s\-_]/, ""
894
- # s
895
- code, name = s.split(':')
896
- code.downcase.strip.gsub(' ','_').gsub(/[^#_\/a-zA-Z0-9]/,'')
9
+ require_relative 'date_helpers'
10
+ require_relative 'gen_helpers'
11
+ require_relative 'gen_class'
12
+ require_relative 'gen_freemind'
13
+ require_relative 'gem_helpers'
14
+ require_relative 'refresh'
15
+ require_relative 'init_vars'
16
+ require_relative 'themes'
17
+ require_relative 'gen_xmain'
18
+ require_relative 'gen_models'
19
+ require_relative 'date_helpers'
20
+ require_relative 'rake_views'
21
+ require_relative 'gen_runseq'
22
+ require_relative 'gen_services'
23
+ require_relative 'gen_controller'
24
+ require_relative 'get_app'
897
25
  end
898
26
  end
899
27
 
900
- module ActionView
901
- module Helpers
902
- module DateHelper
903
- def date_field_tag(method, options = {})
904
- default= options[:default] || Date.today
905
- data_options= ({"mode"=>"calbox"}).merge(options)
906
- %Q(<input name='#{method}' id='#{method}' value='#{default.strftime("%F")}' type='date' data-role='datebox' data-options='#{data_options.to_json}'>).html_safe
907
- end
908
- end
909
- class FormBuilder
910
- def date_select_thai(method)
911
- self.date_select method, :use_month_names=>THAI_MONTHS, :order=>[:day, :month, :year]
912
- end
913
- def date_field(method, options = {})
914
- default= options[:default] || self.object.send(method) || Date.today
915
- data_options= ({"mode"=>"calbox"}).merge(options)
916
- 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}'>)
917
- out.html_safe
918
- end
919
- def time_field(method, options = {})
920
- default= self.object.send(method) || Time.now
921
- data_options= ({"mode"=>"timebox"}).merge(options)
922
- 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}'>)
923
- out.html_safe
924
- end
925
- def date_select_thai(method, default= Time.now, disabled=false)
926
- date_select method, :default => default, :use_month_names=>THAI_MONTHS, :order=>[:day, :month, :year], :disabled=>disabled
927
- end
928
- def datetime_select_thai(method, default= Time.now, disabled=false)
929
- datetime_select method, :default => default, :use_month_names=>THAI_MONTHS, :order=>[:day, :month, :year], :disabled=>disabled
930
- end
931
-
932
- def point(o={})
933
- o[:zoom]= 11 unless o[:zoom]
934
- o[:width]= '100%' unless o[:width]
935
- o[:height]= '300px' unless o[:height]
936
- o[:lat] = 13.91819 unless o[:lat]
937
- o[:lng] = 100.48889 unless o[:lng]
938
-
939
- out = <<-EOT
940
- <script type='text/javascript'>
941
- //<![CDATA[
942
- var latLng;
943
- var map_#{self.object_name};
944
- var marker_#{self.object_name};
945
-
946
- function init_map() {
947
- var lat = #{o[:lat]};
948
- var lng = #{o[:lng]};
949
- //var lat = position.coords.latitude"; // HTML5 pass position in function initialize(position)
950
- // google.loader.ClientLocation.latitude;
951
- //var lng = position.coords.longitude;
952
- // google.loader.ClientLocation.longitude;
953
- latLng = new google.maps.LatLng(lat, lng);
954
- map_#{self.object_name} = new google.maps.Map(document.getElementById("map_#{self.object_name}"), {
955
- zoom: #{o[:zoom]},
956
- center: latLng,
957
- mapTypeId: google.maps.MapTypeId.ROADMAP
958
- });
959
- marker_#{self.object_name} = new google.maps.Marker({
960
- position: latLng,
961
- map: map_#{self.object_name},
962
- draggable: true,
963
- });
964
- google.maps.event.addListener(marker_#{self.object_name}, 'dragend', function(event) {
965
- $('##{self.object_name}_lat').val(event.latLng.lat());
966
- $('##{self.object_name}_lng').val(event.latLng.lng());
967
- });
968
- google.maps.event.addListener(map_#{self.object_name}, 'click', function(event) {
969
- $('##{self.object_name}_lat').val(event.latLng.lat());
970
- $('##{self.object_name}_lng').val(event.latLng.lng());
971
- move();
972
- });
973
- $('##{self.object_name}_lat').val(lat);
974
- $('##{self.object_name}_lng').val(lng);
975
- };
976
-
977
- function move() {
978
- latLng = new google.maps.LatLng($('##{self.object_name}_lat').val(), $('##{self.object_name}_lng').val());
979
- map_#{self.object_name}.panTo(latLng);
980
- marker_#{self.object_name}.setPosition(latLng);
981
- }
982
-
983
- //google.maps.event.addDomListener(window, 'load', init_map);
984
-
985
- //]]>
986
- </script>
987
- <div class="field" data-role="fieldcontain">
988
- Latitude: #{self.text_field :lat, :style=>"width:300px;" }
989
- Longitude: #{self.text_field :lng, :style=>"width:300px;" }
990
- </div>
991
- <p/>
992
- <div id='map_#{self.object_name}' style='max-width: none !important; width:#{o[:width]}; height:#{o[:height]};' class='map'></div>
993
- <script>
994
- $('##{self.object_name}_lat').change(function() {move()});
995
- $('##{self.object_name}_lng').change(function() {move()});
996
- //var w= $("input[id*=lat]").parent().width();
997
- //$("input[id*=lat]").css('width','300px');
998
- //$("input[id*=lng]").css('width','300px');
999
- $( document ).one( "pagechange", function(){
1000
- init_map();
1001
- });
1002
- </script>
1003
- EOT
1004
- out.html_safe
1005
- end
1006
- end
1007
- end
1008
- end