jinda 0.6.5 → 0.7.0.1

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 (229) 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/assets/stylesheets/jinda.css → app/assets/stylesheets/jinda.scss} +20 -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 +8 -0
  142. data/lib/generators/jinda/install_generator.rb +47 -44
  143. data/lib/generators/jinda/templates/Dockerfile +4 -2
  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/app/views/articles/_report.haml +32 -0
  147. data/lib/generators/jinda/templates/app/views/articles/edit.haml +22 -11
  148. data/lib/generators/jinda/templates/app/views/articles/edit_article/edit_article.html.erb +14 -12
  149. data/lib/generators/jinda/templates/app/views/articles/index.haml +3 -21
  150. data/lib/generators/jinda/templates/app/views/articles/my.haml +1 -16
  151. data/lib/generators/jinda/templates/app/views/articles/new_article/form_article.html.erb +1 -1
  152. data/lib/generators/jinda/templates/app/views/articles/show.html.haml +37 -21
  153. data/lib/generators/jinda/templates/app/views/identities/new.html.erb +29 -24
  154. data/lib/generators/jinda/templates/app/views/password_resets/new.html.erb +13 -7
  155. data/lib/generators/jinda/templates/app/views/sessions/new.html.erb +24 -18
  156. data/lib/generators/jinda/templates/docker-compose.yml +3 -2
  157. data/lib/generators/jinda/templates/entrypoint.sh +2 -1
  158. data/lib/jinda.rb +2 -1
  159. data/lib/jinda/date_helpers.rb +109 -0
  160. data/lib/jinda/{gemhelpers.rb → gem_helpers.rb} +0 -1
  161. data/lib/jinda/gen_class.rb +13 -0
  162. data/lib/jinda/gen_controller.rb +10 -0
  163. data/lib/jinda/gen_freemind.rb +33 -0
  164. data/lib/jinda/gen_helpers.rb +141 -0
  165. data/lib/jinda/gen_models.rb +137 -0
  166. data/lib/jinda/gen_runseq.rb +71 -0
  167. data/lib/jinda/gen_services.rb +90 -0
  168. data/lib/jinda/gen_xmain.rb +38 -0
  169. data/lib/jinda/get_app.rb +34 -0
  170. data/lib/jinda/helpers.rb +17 -998
  171. data/lib/jinda/init_vars.rb +36 -0
  172. data/lib/jinda/rake_views.rb +59 -0
  173. data/lib/jinda/refresh.rb +67 -0
  174. data/lib/jinda/themes.rb +163 -0
  175. data/lib/jinda/version.rb +1 -1
  176. data/test/dummy/Rakefile +6 -0
  177. data/test/dummy/app/assets/config/manifest.js +3 -0
  178. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  179. data/test/dummy/app/channels/application_cable/channel.rb +4 -0
  180. data/test/dummy/app/channels/application_cable/connection.rb +4 -0
  181. data/test/dummy/app/controllers/application_controller.rb +2 -0
  182. data/test/dummy/app/helpers/application_helper.rb +2 -0
  183. data/test/dummy/app/javascript/packs/application.js +15 -0
  184. data/test/dummy/app/jobs/application_job.rb +7 -0
  185. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  186. data/test/dummy/app/models/application_record.rb +3 -0
  187. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  188. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  189. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  190. data/test/dummy/bin/rails +4 -0
  191. data/test/dummy/bin/rake +4 -0
  192. data/test/dummy/bin/setup +33 -0
  193. data/test/dummy/config.ru +5 -0
  194. data/test/dummy/config/application.rb +19 -0
  195. data/test/dummy/config/boot.rb +5 -0
  196. data/test/dummy/config/cable.yml +10 -0
  197. data/test/dummy/config/database.yml +25 -0
  198. data/test/dummy/config/environment.rb +5 -0
  199. data/test/dummy/config/environments/development.rb +62 -0
  200. data/test/dummy/config/environments/production.rb +112 -0
  201. data/test/dummy/config/environments/test.rb +49 -0
  202. data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
  203. data/test/dummy/config/initializers/assets.rb +12 -0
  204. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  205. data/test/dummy/config/initializers/content_security_policy.rb +28 -0
  206. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  207. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  208. data/test/dummy/config/initializers/inflections.rb +16 -0
  209. data/test/dummy/config/initializers/mime_types.rb +4 -0
  210. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  211. data/test/dummy/config/locales/en.yml +33 -0
  212. data/test/dummy/config/puma.rb +38 -0
  213. data/test/dummy/config/routes.rb +3 -0
  214. data/test/dummy/config/spring.rb +6 -0
  215. data/test/dummy/config/storage.yml +34 -0
  216. data/test/dummy/db/development.sqlite3 +0 -0
  217. data/test/dummy/log/development.log +8 -0
  218. data/test/dummy/public/404.html +67 -0
  219. data/test/dummy/public/422.html +67 -0
  220. data/test/dummy/public/500.html +66 -0
  221. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  222. data/test/dummy/public/apple-touch-icon.png +0 -0
  223. data/test/dummy/public/favicon.ico +0 -0
  224. data/test/dummy/tmp/development_secret.txt +1 -0
  225. data/test/integration/navigation_test.rb +7 -0
  226. data/test/jinda_test.rb +7 -0
  227. data/test/test_helper.rb +19 -0
  228. metadata +224 -142
  229. data/lib/generators/jinda/templates/app/controllers/jinda_org/devs_controller.rb +0 -2
@@ -0,0 +1,137 @@
1
+
2
+
3
+ def process_models
4
+
5
+ # app= get_app
6
+ # t= ["process models"]
7
+ # xml map sample from index.mm
8
+ # node @CREATED=1273819432637 @ID=ID_1098419600 @MODIFIED=1334737006485 @TEXT=Jinda
9
+ # node @CREATED=1273819462973 @ID=ID_282419531 @MODIFIED=1493705904561 @POSITION=right @TEXT=services
10
+ # node @CREATED=1273819465949 @FOLDED=true @ID=ID_855471610 @MODIFIED=1493768913078 @POSITION=right @TEXT=roles
11
+ # node @CREATED=1273819456867 @ID=ID_1677010054 @MODIFIED=1493418874718 @POSITION=left @TEXT=models
12
+ # node @CREATED=1292122118499 @FOLDED=true @ID=ID_1957754752 @MODIFIED=1493705885123 @TEXT=person
13
+ # node @CREATED=1292122236285 @FOLDED=true @ID=ID_959987887 @MODIFIED=1493768919147 @TEXT=address
14
+ # node @CREATED=1493418879485 @ID=ID_1995497233 @MODIFIED=1493718770637 @TEXT=article
15
+ # node @CREATED=1493418915637 @ID=ID_429078131 @MODIFIED=1493418930081 @TEXT=comment
16
+
17
+ models= @app.elements["//node[@TEXT='models']"] || REXML::Document.new
18
+ models.each_element('node') do |model|
19
+ # t << "= "+model.attributes["TEXT"]
20
+ model_name= model.attributes["TEXT"]
21
+ next if model_name.comment?
22
+ model_code= name2code(model_name)
23
+ model_file= "#{Rails.root}/app/models/#{model_code}.rb"
24
+
25
+ if File.exists?(model_file)
26
+ doc= File.read(model_file)
27
+ else
28
+ system("rails generate model #{model_code}")
29
+ doc= File.read(model_file)
30
+ end
31
+
32
+ doc = add_utf8(doc)
33
+ attr_hash= make_fields(model)
34
+ doc = add_jinda(doc, attr_hash)
35
+ # t << "modified: #{model_file}"
36
+ File.open(model_file, "w") do |f|
37
+ f.puts doc
38
+ end
39
+
40
+ end
41
+
42
+ # puts t.join("\n")
43
+ end
44
+
45
+ def add_jinda(doc, attr_hash)
46
+ if doc =~ /#{@btext}/
47
+ s1,s2,s3= doc.partition(/ #{@btext}.*#{@etext}\n/m)
48
+ s2= ""
49
+ else
50
+ s1,s2,s3= doc.partition("include Mongoid::Document\n")
51
+ end
52
+ doc= s1+s2+ <<-EOT
53
+ #{@btext}
54
+ include Mongoid::Timestamps
55
+ EOT
56
+
57
+ attr_hash.each do |a|
58
+ # doc+= "\n*****"+a.to_s+"\n"
59
+ if a[:edit]
60
+ doc += " #{a[:text]}\n"
61
+ else
62
+ # Fixed: Capitalize only first char
63
+ # doc += " field :#{a[:code]}, :type => #{a[:type].capitalize}\n"
64
+ a[:type][0] = a[:type][0].capitalize
65
+ doc += " field :#{a[:code]}, :type => #{a[:type]}\n"
66
+ end
67
+ end
68
+ doc += " #{@etext}\n"
69
+ doc + s3
70
+ end
71
+
72
+ def add_utf8(doc)
73
+ unless doc =~ /encoding\s*:\s*utf-8/
74
+ doc.insert 0, "# encoding: utf-8\n"
75
+ else
76
+ doc
77
+ end
78
+ end
79
+
80
+ # inspect all nodes that has attached file (2 cases) and replace relative path with absolute path
81
+ def make_folders_absolute(f,tt)
82
+ tt.elements.each("//node") do |nn|
83
+ if nn.attributes['LINK']
84
+ nn.attributes['LINK']= File.expand_path(File.dirname(f))+"/#{nn.attributes['LINK']}"
85
+ end
86
+ end
87
+ end
88
+
89
+ def name2code(s)
90
+ # rather not ignore # symbol cause it could be comment
91
+ code, name = s.split(':')
92
+ code.downcase.strip.gsub(' ','_').gsub(/[^#_\/a-zA-Z0-9]/,'')
93
+ end
94
+
95
+ def model_exists?(model)
96
+ File.exists? "#{Rails.root}/app/models/#{model}.rb"
97
+ end
98
+
99
+ def make_fields(n)
100
+ # s= field string used by generate model cli (old style jinda)
101
+ s= ""
102
+ # h= hash :code, :type, :edit, :text
103
+ h= []
104
+ n.each_element('node') do |nn|
105
+ text = nn.attributes['TEXT']
106
+ icon = nn.elements['icon']
107
+ edit= (icon && icon.attribute('BUILTIN').value=="edit")
108
+ next if text.comment? && !edit
109
+
110
+ # sometimes freemind puts all fields inside a blank node
111
+ unless text.empty?
112
+ k,v= text.split(/:\s*/,2)
113
+ v ||= 'string'
114
+ v= 'float' if v=~/double/i
115
+ s << " #{name2code(k.strip)}:#{v.strip} "
116
+ h << {:code=>name2code(k.strip), :type=>v.strip, :edit=>edit, :text=>text}
117
+ else
118
+ nn.each_element('node') do |nnn|
119
+ icon = nnn.elements['icon']
120
+ edit1= (icon && icon.attribute('BUILTIN').value=="edit")
121
+ text1 = nnn.attributes['TEXT']
122
+ next if text1 =~ /\#.*/
123
+ k,v= text1.split(/:\s*/,2)
124
+ v ||= 'string'
125
+ v= 'float' if v=~/double/i
126
+ s << " #{name2code(k.strip)}:#{v.strip} "
127
+ h << {:code=>name2code(k.strip), :type=>v.strip, :edit=>edit1, :text=>text1}
128
+ end
129
+ end
130
+ end
131
+ # f
132
+ h
133
+ end
134
+
135
+ ########################################################################
136
+ # END code from jinda.rake #
137
+ ########################################################################
@@ -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