jinda 0.6.3 → 0.6.9

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 (221) 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/config/routes.rb +44 -0
  141. data/lib/generators/jinda/config_generator.rb +7 -0
  142. data/lib/generators/jinda/install_generator.rb +45 -42
  143. data/lib/generators/jinda/templates/Dockerfile +24 -0
  144. data/lib/generators/jinda/templates/app/assets/javascripts/application.js +1 -10
  145. data/lib/generators/jinda/templates/app/assets/stylesheets/application.css.scss +1 -20
  146. data/lib/generators/jinda/templates/config/mongoid.yml-docker +182 -0
  147. data/lib/generators/jinda/templates/config/mongoid.yml-localhost +182 -0
  148. data/lib/generators/jinda/templates/docker-compose.yml +16 -0
  149. data/lib/generators/jinda/templates/entrypoint.sh +12 -0
  150. data/lib/jinda.rb +2 -1
  151. data/lib/jinda/date_helpers.rb +109 -0
  152. data/lib/jinda/{gemhelpers.rb → gem_helpers.rb} +0 -1
  153. data/lib/jinda/gen_class.rb +13 -0
  154. data/lib/jinda/gen_controller.rb +10 -0
  155. data/lib/jinda/gen_freemind.rb +33 -0
  156. data/lib/jinda/gen_helpers.rb +141 -0
  157. data/lib/jinda/gen_models.rb +137 -0
  158. data/lib/jinda/gen_runseq.rb +71 -0
  159. data/lib/jinda/gen_services.rb +90 -0
  160. data/lib/jinda/gen_xmain.rb +38 -0
  161. data/lib/jinda/get_app.rb +34 -0
  162. data/lib/jinda/helpers.rb +17 -999
  163. data/lib/jinda/init_vars.rb +36 -0
  164. data/lib/jinda/rake_views.rb +59 -0
  165. data/lib/jinda/refresh.rb +67 -0
  166. data/lib/jinda/themes.rb +163 -0
  167. data/lib/jinda/version.rb +1 -1
  168. data/test/dummy/Rakefile +6 -0
  169. data/test/dummy/app/assets/config/manifest.js +3 -0
  170. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  171. data/test/dummy/app/channels/application_cable/channel.rb +4 -0
  172. data/test/dummy/app/channels/application_cable/connection.rb +4 -0
  173. data/test/dummy/app/controllers/application_controller.rb +2 -0
  174. data/test/dummy/app/helpers/application_helper.rb +2 -0
  175. data/test/dummy/app/javascript/packs/application.js +15 -0
  176. data/test/dummy/app/jobs/application_job.rb +7 -0
  177. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  178. data/test/dummy/app/models/application_record.rb +3 -0
  179. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  180. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  181. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  182. data/test/dummy/bin/rails +4 -0
  183. data/test/dummy/bin/rake +4 -0
  184. data/test/dummy/bin/setup +33 -0
  185. data/test/dummy/config.ru +5 -0
  186. data/test/dummy/config/application.rb +19 -0
  187. data/test/dummy/config/boot.rb +5 -0
  188. data/test/dummy/config/cable.yml +10 -0
  189. data/test/dummy/config/database.yml +25 -0
  190. data/test/dummy/config/environment.rb +5 -0
  191. data/test/dummy/config/environments/development.rb +62 -0
  192. data/test/dummy/config/environments/production.rb +112 -0
  193. data/test/dummy/config/environments/test.rb +49 -0
  194. data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
  195. data/test/dummy/config/initializers/assets.rb +12 -0
  196. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  197. data/test/dummy/config/initializers/content_security_policy.rb +28 -0
  198. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  199. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  200. data/test/dummy/config/initializers/inflections.rb +16 -0
  201. data/test/dummy/config/initializers/mime_types.rb +4 -0
  202. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  203. data/test/dummy/config/locales/en.yml +33 -0
  204. data/test/dummy/config/puma.rb +38 -0
  205. data/test/dummy/config/routes.rb +3 -0
  206. data/test/dummy/config/spring.rb +6 -0
  207. data/test/dummy/config/storage.yml +34 -0
  208. data/test/dummy/db/development.sqlite3 +0 -0
  209. data/test/dummy/log/development.log +8 -0
  210. data/test/dummy/public/404.html +67 -0
  211. data/test/dummy/public/422.html +67 -0
  212. data/test/dummy/public/500.html +66 -0
  213. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  214. data/test/dummy/public/apple-touch-icon.png +0 -0
  215. data/test/dummy/public/favicon.ico +0 -0
  216. data/test/dummy/tmp/development_secret.txt +1 -0
  217. data/test/integration/navigation_test.rb +7 -0
  218. data/test/jinda_test.rb +7 -0
  219. data/test/test_helper.rb +19 -0
  220. metadata +227 -141
  221. 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,1009 +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
- binding.pry
434
- ma_module.update_attributes :uid=>ma_module.id.to_s, :icon=>menu_icon
435
- protected_modules << ma_module.uid
436
- name = module_code if name.blank?
437
- ma_module.update_attributes :name=> name.strip, :seq=> mseq
438
- mseq += 1
439
- seq= 0
440
-
441
- # ##########################################################################
442
- # Second Nodes eg: Role, Link otherwise Services
443
- # ##########################################################################
444
- m.each_element('node') do |s|
445
- service_name= s.attributes["TEXT"].to_s
446
- scode, sname= service_name.split(':', 2)
447
- sname ||= scode; sname.strip!
448
- scode= scode.to_code
449
- if scode=="role"
450
- ma_module.update_attribute :role, sname
451
- next
452
- end
453
- if scode.downcase=="link"
454
- role= get_option_xml("role", s) || ""
455
- rule= get_option_xml("rule", s) || ""
456
- ma_service= Jinda::Service.find_or_create_by :module_code=> ma_module.code, :code=> scode, :name=> sname
457
- ma_service.update_attributes :xml=>s.to_s, :name=>sname,
458
- :list=>listed(s), :ma_secured=>ma_secured?(s),
459
- :module_id=>ma_module.id, :seq => seq,
460
- :confirm=> get_option_xml("confirm", xml),
461
- :role => role, :rule => rule, :uid=> ma_service.id.to_s
462
- seq += 1
463
- protected_services << ma_service.uid
464
- else
465
-
466
- # ##########################################################################
467
- # Second and Third Nodes eg: Role, Normal Services
468
- # ##########################################################################
469
- # normal service
470
- step1 = s.elements['node']
471
- role= get_option_xml("role", step1) || ""
472
- rule= get_option_xml("rule", step1) || ""
473
- ma_service= Jinda::Service.find_or_create_by :module_code=> ma_module.code, :code=> scode
474
- ma_service.update_attributes :xml=>s.to_s, :name=>sname,
475
- :list=>listed(s), :ma_secured=>ma_secured?(s),
476
- :module_id=>ma_module.id, :seq => seq,
477
- :confirm=> get_option_xml("confirm", xml),
478
- :role => role, :rule => rule, :uid=> ma_service.id.to_s
479
- seq += 1
480
- protected_services << ma_service.uid
481
- end
482
- end
483
- end
484
- Jinda::Module.not_in(:uid=>protected_modules).delete_all
485
- Jinda::Service.not_in(:uid=>protected_services).delete_all
486
- end
487
-
488
- # ##########################################################################
489
- # Load index.mm from Rails
490
- # ##########################################################################
491
- def get_app
492
- # MM was defined in Rails: config/initializer/jinda.rb
493
- f= MM || "#{Rails.root}/app/jinda/index.mm"
494
- dir= File.dirname(f)
495
- t= REXML::Document.new(File.read(MM).gsub("\n","")).root
496
- recheck= true ; first_pass= true
497
- while recheck
498
- recheck= false
499
- t.elements.each("//node") do |n|
500
- if n.attributes['LINK'] # has attached file
501
- if first_pass
502
- f= "#{dir}/#{n.attributes['LINK']}"
503
- else
504
- f= n.attributes['LINK']
505
- end
506
- next unless File.exists?(f)
507
- tt= REXML::Document.new(File.read(f).gsub("\n","")).root.elements["node"]
508
- make_folders_absolute(f,tt)
509
- tt.elements.each("node") do |tt_node|
510
- n.parent.insert_before n, tt_node
511
- end
512
- recheck= true
513
- n.parent.delete_element n
514
- end
515
- end
516
- first_pass = false
517
- end
518
- return t
519
- end
520
-
521
- ########################################################################
522
- # Jinda Rake Task #
523
- ########################################################################
524
-
525
- def gen_views
526
- t = ["*** generate ui ***"]
527
-
528
- # create array of files to be tested
529
- $afile = Array.new
530
-
531
- Jinda::Module.all.each do |m|
532
- m.services.each do |s|
533
- dir ="app/views/#{s.module.code}"
534
- unless gen_view_file_exist?(dir)
535
- gen_view_mkdir(dir,t)
536
- end
537
-
538
- if s.code=='link'
539
- f= "app/views/#{s.module.code}/index.haml"
540
- $afile << f
541
- unless gen_view_file_exist?(f)
542
- sv = "app/jinda/template/linkview.haml"
543
- f= "app/views/#{s.module.code}/index.haml"
544
- gen_view_createfile(sv,f,t)
545
- end
546
- next
547
- end
548
-
549
- dir ="app/views/#{s.module.code}/#{s.code}"
550
- unless gen_view_file_exist?(dir)
551
- gen_view_mkdir(dir,t)
552
- end
553
-
554
- xml= REXML::Document.new(s.xml)
555
- xml.elements.each('*/node') do |activity|
556
- icon = activity.elements['icon']
557
- next unless icon
558
- action= freemind2action(icon.attributes['BUILTIN'])
559
- next unless ui_action?(action)
560
- code_name = activity.attributes["TEXT"].to_s
561
- next if code_name.comment?
562
- code= name2code(code_name)
563
- if action=="pdf"
564
- f= "app/views/#{s.module.code}/#{s.code}/#{code}.pdf.prawn"
565
- else
566
- f= "app/views/#{s.module.code}/#{s.code}/#{code}.html.erb"
567
- end
568
- $afile << f
569
- unless gen_view_file_exist?(f)
570
- sv = "app/jinda/template/view.html.erb"
571
- gen_view_createfile(sv,f,t)
572
- end
573
- end
574
- end
575
- end
576
- puts $afile.join("\n")
577
- puts t.join("\n")
578
- return $afile
579
- end
580
-
581
- def process_controllers
582
- process_services
583
- modules= Jinda::Module.all
584
- modules.each do |m|
585
- next if controller_exists?(m.code)
586
- system("rails generate controller #{m.code}")
587
- end
588
- end
589
-
590
- def process_models
591
-
592
- # app= get_app
593
- # t= ["process models"]
594
- # xml map sample from index.mm
595
- # node @CREATED=1273819432637 @ID=ID_1098419600 @MODIFIED=1334737006485 @TEXT=Jinda
596
- # node @CREATED=1273819462973 @ID=ID_282419531 @MODIFIED=1493705904561 @POSITION=right @TEXT=services
597
- # node @CREATED=1273819465949 @FOLDED=true @ID=ID_855471610 @MODIFIED=1493768913078 @POSITION=right @TEXT=roles
598
- # node @CREATED=1273819456867 @ID=ID_1677010054 @MODIFIED=1493418874718 @POSITION=left @TEXT=models
599
- # node @CREATED=1292122118499 @FOLDED=true @ID=ID_1957754752 @MODIFIED=1493705885123 @TEXT=person
600
- # node @CREATED=1292122236285 @FOLDED=true @ID=ID_959987887 @MODIFIED=1493768919147 @TEXT=address
601
- # node @CREATED=1493418879485 @ID=ID_1995497233 @MODIFIED=1493718770637 @TEXT=article
602
- # node @CREATED=1493418915637 @ID=ID_429078131 @MODIFIED=1493418930081 @TEXT=comment
603
-
604
- models= @app.elements["//node[@TEXT='models']"] || REXML::Document.new
605
- models.each_element('node') do |model|
606
- # t << "= "+model.attributes["TEXT"]
607
- model_name= model.attributes["TEXT"]
608
- next if model_name.comment?
609
- model_code= name2code(model_name)
610
- model_file= "#{Rails.root}/app/models/#{model_code}.rb"
611
-
612
- if File.exists?(model_file)
613
- doc= File.read(model_file)
614
- else
615
- system("rails generate model #{model_code}")
616
- doc= File.read(model_file)
617
- end
618
-
619
- doc = add_utf8(doc)
620
- attr_hash= make_fields(model)
621
- doc = add_jinda(doc, attr_hash)
622
- # t << "modified: #{model_file}"
623
- File.open(model_file, "w") do |f|
624
- f.puts doc
625
- end
626
-
627
- end
628
-
629
- # puts t.join("\n")
630
- end
631
-
632
- def add_jinda(doc, attr_hash)
633
- if doc =~ /#{@btext}/
634
- s1,s2,s3= doc.partition(/ #{@btext}.*#{@etext}\n/m)
635
- s2= ""
636
- else
637
- s1,s2,s3= doc.partition("include Mongoid::Document\n")
638
- end
639
- doc= s1+s2+ <<-EOT
640
- #{@btext}
641
- include Mongoid::Timestamps
642
- EOT
643
-
644
- attr_hash.each do |a|
645
- # doc+= "\n*****"+a.to_s+"\n"
646
- if a[:edit]
647
- doc += " #{a[:text]}\n"
648
- else
649
- # Fixed: Capitalize only first char
650
- # doc += " field :#{a[:code]}, :type => #{a[:type].capitalize}\n"
651
- a[:type][0] = a[:type][0].capitalize
652
- doc += " field :#{a[:code]}, :type => #{a[:type]}\n"
653
- end
654
- end
655
- doc += " #{@etext}\n"
656
- doc + s3
657
- end
658
-
659
- def add_utf8(doc)
660
- unless doc =~ /encoding\s*:\s*utf-8/
661
- doc.insert 0, "# encoding: utf-8\n"
662
- else
663
- doc
664
- end
665
- end
666
-
667
- # inspect all nodes that has attached file (2 cases) and replace relative path with absolute path
668
- def make_folders_absolute(f,tt)
669
- tt.elements.each("//node") do |nn|
670
- if nn.attributes['LINK']
671
- nn.attributes['LINK']= File.expand_path(File.dirname(f))+"/#{nn.attributes['LINK']}"
672
- end
673
- end
674
- end
675
-
676
- def name2code(s)
677
- # rather not ignore # symbol cause it could be comment
678
- code, name = s.split(':')
679
- code.downcase.strip.gsub(' ','_').gsub(/[^#_\/a-zA-Z0-9]/,'')
680
- end
681
-
682
- def model_exists?(model)
683
- File.exists? "#{Rails.root}/app/models/#{model}.rb"
684
- end
685
-
686
- def make_fields(n)
687
- # s= field string used by generate model cli (old style jinda)
688
- s= ""
689
- # h= hash :code, :type, :edit, :text
690
- h= []
691
- n.each_element('node') do |nn|
692
- text = nn.attributes['TEXT']
693
- icon = nn.elements['icon']
694
- edit= (icon && icon.attribute('BUILTIN').value=="edit")
695
- next if text.comment? && !edit
696
-
697
- # sometimes freemind puts all fields inside a blank node
698
- unless text.empty?
699
- k,v= text.split(/:\s*/,2)
700
- v ||= 'string'
701
- v= 'float' if v=~/double/i
702
- s << " #{name2code(k.strip)}:#{v.strip} "
703
- h << {:code=>name2code(k.strip), :type=>v.strip, :edit=>edit, :text=>text}
704
- else
705
- nn.each_element('node') do |nnn|
706
- icon = nnn.elements['icon']
707
- edit1= (icon && icon.attribute('BUILTIN').value=="edit")
708
- text1 = nnn.attributes['TEXT']
709
- next if text1 =~ /\#.*/
710
- k,v= text1.split(/:\s*/,2)
711
- v ||= 'string'
712
- v= 'float' if v=~/double/i
713
- s << " #{name2code(k.strip)}:#{v.strip} "
714
- h << {:code=>name2code(k.strip), :type=>v.strip, :edit=>edit1, :text=>text1}
715
- end
716
- end
717
- end
718
- # f
719
- h
720
- end
721
-
722
- # Add method to ruby class String
723
- # ###############################
724
- class String
725
- def comment?
726
- self[0]=='#'
727
- # self[0]==35 # check if first char is #
728
- end
729
- def to_code
730
- s= self.dup
731
- s.downcase.strip.gsub(' ','_').gsub(/[^#_\/a-zA-Z0-9]/,'')
732
- end
733
- end
734
-
735
- ########################################################################
736
- # END code from jinda.rake #
737
- ########################################################################
738
-
739
-
740
- ########################################################################
741
- # Methods to be overrided by gemhelp #
742
- # for Rspec Test
743
- ########################################################################
744
- def gen_view_file_exist?(dir)
745
- File.exists?(dir)
746
- end
747
-
748
- def gen_view_mkdir(dir,t)
749
- Dir.mkdir(dir)
750
- t << "create directory #{dir}"
751
- end
752
-
753
- def gen_view_createfile(s,f,t)
754
- FileUtils.cp s,f
755
- # FileUtils.cp "app/jinda/template/linkview.haml",f
756
- t << "create file #{f}"
757
- end
758
- ########################################################################
759
-
760
- def controller_exists?(modul)
761
- File.exists? "#{Rails.root}/app/controllers/#{modul}_controller.rb"
762
- end
763
- def dup_hash(a)
764
- h = Hash.new(0)
765
- a.each do |aa|
766
- h[aa] += 1
767
- end
768
- return h
769
- end
770
- def login?
771
- ## To use remember me cookies then remove
772
- #session[:user_id] != nil
773
- current_ma_user != nil
774
- #cookies[:auth_token] != nil
775
- end
776
- def own_xmain?
777
- if $xmain
778
- return current_ma_user.id==$xvars['user_id']
779
- else
780
- # if eval on first step would return true so user can start service
781
- return true
782
- end
783
- end
784
- # return nil or value of opt: if provided
785
- def get_option_xml(opt, xml)
786
- if xml
787
- url=''
788
- xml.each_element('node') do |n|
789
- text= n.attributes['TEXT']
790
- # check if opt match from beginning of text
791
- url= text if text =~/^#{opt}/
792
- end
793
- return nil if url.blank?
794
- c, h= url.split(':', 2)
795
- opt= h ? h.strip : true
796
- else
797
- return nil
798
- end
799
- end
800
- def m_icon(node)
801
- mcons=[]
802
- node.each_element("icon") do |mn|
803
- mcons << mn.attributes["BUILTIN"]
804
- end
805
- ticon = mcons[0].to_s
806
- return ticon
807
- end
808
-
809
- # Option to unlisted in the menu_mm if icon 'button_cancel'
810
- def listed(node)
811
- icons=[]
812
- node.each_element("icon") do |nn|
813
- icons << nn.attributes["BUILTIN"]
814
- end
815
-
816
- return !icons.include?("button_cancel")
817
- end
818
- def ma_secured?(node)
819
- icons=[]
820
- node.each_element("icon") do |nn|
821
- icons << nn.attributes["BUILTIN"]
822
- end
823
- return icons.include?("password")
824
- end
825
- def ma_menu?
826
- icons=[]
827
- node.each_element("icon") do |mn|
828
- icons << mn.attributes["BUILTIN"]
829
- end
830
- return icons.include?("menu")
831
- end
832
-
833
- def freemind2action(s)
834
- case s.downcase
835
- #when 'bookmark' # Excellent
836
- # 'call'
837
- when 'bookmark' # Excellent
838
- 'do'
839
- when 'attach' # Look here
840
- 'form'
841
- when 'edit' # Refine
842
- 'pdf'
843
- when 'wizard' # Magic
844
- 'ws'
845
- when 'help' # Question
846
- 'if'
847
- when 'forward' # Forward
848
- # 'redirect'
849
- 'direct_to'
850
- when 'kaddressbook' #Phone
851
- 'invoke' # invoke new service along the way
852
- when 'idea' # output
853
- 'output'
854
- when 'list' # List
855
- 'list'
856
- when 'folder' # Folder
857
- 'folder'
858
- when 'mail'
859
- 'mail'
860
- # when 'xmag' # Tobe discussed
861
- when 'To be discusssed'
862
- 'search'
863
- end
864
- end
865
- def affirm(s)
866
- return s =~ /[y|yes|t|true]/i ? true : false
867
- end
868
- def negate(s)
869
- return s =~ /[n|no|f|false]/i ? true : false
870
- end
871
-
872
- # module FormBuilder
873
- # def date_field(method, options = {})
874
- # default= self.object.send(method) || Date.today
875
- # data_options= ({"mode"=>"calbox"}).merge(options)
876
- # %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
877
- # end
878
- # end
879
- end
880
- end
881
-
882
- class String
883
- #
884
- # Put comment in freemind with #
885
- # Sample Freemind
886
- # #ctrs:ctrs&Menu
887
- #
888
- def comment?
889
- self[0]=='#'
890
- end
891
- def to_code
892
- s= self.dup
893
- # s.downcase!
894
- # s.gsub! /[\s\-_]/, ""
895
- # s
896
- code, name = s.split(':')
897
- 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'
898
25
  end
899
26
  end
900
27
 
901
- module ActionView
902
- module Helpers
903
- module DateHelper
904
- def date_field_tag(method, options = {})
905
- default= options[:default] || Date.today
906
- data_options= ({"mode"=>"calbox"}).merge(options)
907
- %Q(<input name='#{method}' id='#{method}' value='#{default.strftime("%F")}' type='date' data-role='datebox' data-options='#{data_options.to_json}'>).html_safe
908
- end
909
- end
910
- class FormBuilder
911
- def date_select_thai(method)
912
- self.date_select method, :use_month_names=>THAI_MONTHS, :order=>[:day, :month, :year]
913
- end
914
- def date_field(method, options = {})
915
- default= options[:default] || self.object.send(method) || Date.today
916
- data_options= ({"mode"=>"calbox"}).merge(options)
917
- 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}'>)
918
- out.html_safe
919
- end
920
- def time_field(method, options = {})
921
- default= self.object.send(method) || Time.now
922
- data_options= ({"mode"=>"timebox"}).merge(options)
923
- 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}'>)
924
- out.html_safe
925
- end
926
- def date_select_thai(method, default= Time.now, disabled=false)
927
- date_select method, :default => default, :use_month_names=>THAI_MONTHS, :order=>[:day, :month, :year], :disabled=>disabled
928
- end
929
- def datetime_select_thai(method, default= Time.now, disabled=false)
930
- datetime_select method, :default => default, :use_month_names=>THAI_MONTHS, :order=>[:day, :month, :year], :disabled=>disabled
931
- end
932
-
933
- def point(o={})
934
- o[:zoom]= 11 unless o[:zoom]
935
- o[:width]= '100%' unless o[:width]
936
- o[:height]= '300px' unless o[:height]
937
- o[:lat] = 13.91819 unless o[:lat]
938
- o[:lng] = 100.48889 unless o[:lng]
939
-
940
- out = <<-EOT
941
- <script type='text/javascript'>
942
- //<![CDATA[
943
- var latLng;
944
- var map_#{self.object_name};
945
- var marker_#{self.object_name};
946
-
947
- function init_map() {
948
- var lat = #{o[:lat]};
949
- var lng = #{o[:lng]};
950
- //var lat = position.coords.latitude"; // HTML5 pass position in function initialize(position)
951
- // google.loader.ClientLocation.latitude;
952
- //var lng = position.coords.longitude;
953
- // google.loader.ClientLocation.longitude;
954
- latLng = new google.maps.LatLng(lat, lng);
955
- map_#{self.object_name} = new google.maps.Map(document.getElementById("map_#{self.object_name}"), {
956
- zoom: #{o[:zoom]},
957
- center: latLng,
958
- mapTypeId: google.maps.MapTypeId.ROADMAP
959
- });
960
- marker_#{self.object_name} = new google.maps.Marker({
961
- position: latLng,
962
- map: map_#{self.object_name},
963
- draggable: true,
964
- });
965
- google.maps.event.addListener(marker_#{self.object_name}, 'dragend', function(event) {
966
- $('##{self.object_name}_lat').val(event.latLng.lat());
967
- $('##{self.object_name}_lng').val(event.latLng.lng());
968
- });
969
- google.maps.event.addListener(map_#{self.object_name}, 'click', function(event) {
970
- $('##{self.object_name}_lat').val(event.latLng.lat());
971
- $('##{self.object_name}_lng').val(event.latLng.lng());
972
- move();
973
- });
974
- $('##{self.object_name}_lat').val(lat);
975
- $('##{self.object_name}_lng').val(lng);
976
- };
977
-
978
- function move() {
979
- latLng = new google.maps.LatLng($('##{self.object_name}_lat').val(), $('##{self.object_name}_lng').val());
980
- map_#{self.object_name}.panTo(latLng);
981
- marker_#{self.object_name}.setPosition(latLng);
982
- }
983
-
984
- //google.maps.event.addDomListener(window, 'load', init_map);
985
-
986
- //]]>
987
- </script>
988
- <div class="field" data-role="fieldcontain">
989
- Latitude: #{self.text_field :lat, :style=>"width:300px;" }
990
- Longitude: #{self.text_field :lng, :style=>"width:300px;" }
991
- </div>
992
- <p/>
993
- <div id='map_#{self.object_name}' style='max-width: none !important; width:#{o[:width]}; height:#{o[:height]};' class='map'></div>
994
- <script>
995
- $('##{self.object_name}_lat').change(function() {move()});
996
- $('##{self.object_name}_lng').change(function() {move()});
997
- //var w= $("input[id*=lat]").parent().width();
998
- //$("input[id*=lat]").css('width','300px');
999
- //$("input[id*=lng]").css('width','300px');
1000
- $( document ).one( "pagechange", function(){
1001
- init_map();
1002
- });
1003
- </script>
1004
- EOT
1005
- out.html_safe
1006
- end
1007
- end
1008
- end
1009
- end