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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/assets/config/manifest.js +4 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/4dcity-old.ico +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/4dcity.ico +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/account.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/add.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/ajax-loader-circle.gif +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/ajax-loader.gif +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/anchor.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/application_double.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/application_form_edit.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/arrow_left.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/arrow_right.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/arrow_turn_left.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/arrow_turn_right.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/calendar.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/cancel.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/chart_bar.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/clock.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/cog.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/control_fastforward.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/control_play.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/cross.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/delete.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/external-link.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/facebook-continue-button.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/facebooksmall.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/favicon.ico +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/freemind(mm).png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/google-continue-button.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/help.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/highway-menu.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/highway.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/house.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/icons-18-black.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/icons-18-white.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/icons-36-black.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/icons-36-white.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/logo.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/logo_jinda.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/logout.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/new.gif +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/new.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/page.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/page_attach.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/page_green.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/page_output.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/page_pdf.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/pencil.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/printer.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/refresh.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/report.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/rssmall.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/tick.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/twittersmall.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/user.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/user_admin_gear.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/images/view_code.png +0 -0
- data/{lib/generators/jinda/templates/app/assets/javascripts/application.js-jqm → app/assets/javascripts/application.js-org} +8 -11
- data/{lib/generators/jinda/templates/app → app}/assets/javascripts/cable.js +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/javascripts/disable_enter_key.js +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/javascripts/iscroll-wrapper.js +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/javascripts/iscroll.js +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/javascripts/jinda.js +0 -0
- data/app/assets/javascripts/jinda_jqm.js +24 -0
- data/{lib/generators/jinda/templates/app → app}/assets/javascripts/jquery.mobile-1.2.1.js +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/javascripts/jquery.mobile.datebox.js +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/javascripts/jquery.mobile.splitview.js +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/app.scss +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/articles.scss +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/sarabun.eot +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/sarabun.ttf +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/sarabun.woff +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/sarabun_bold.ttf +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/sarabun_bolditalic.ttf +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/sarabun_italic.ttf +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew-webfont.eot +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew-webfont.ttf +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew-webfont.woff +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew.css +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_bold-webfont.eot +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_bold-webfont.ttf +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_bold-webfont.woff +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.eot +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.ttf +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_bolditalic-webfont.woff +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_italic-webfont.eot +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_italic-webfont.ttf +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/fonts/thsarabunnew_italic-webfont.woff +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/ajax-loader.gif +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/button_black.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/button_blue.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/button_red.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/icons-18-black.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/icons-18-white.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/icons-36-black.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/icons-36-white.png +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/images/indicator.gif +0 -0
- data/{lib/generators/jinda/templates/app/assets/stylesheets/jinda.css → app/assets/stylesheets/jinda.scss} +20 -0
- data/app/assets/stylesheets/jinda_jqm.css.scss +32 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/jquery.mobile-1.2.1.css +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/jquery.mobile.datebox.css +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/jquery.mobile.grids.collapsible.css +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/jquery.mobile.splitview.css +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/kul-4.2.css +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/kul-4.2.min.css +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/modules.scss +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/sarabun.css +0 -0
- data/{lib/generators/jinda/templates/app → app}/assets/stylesheets/social.scss +0 -0
- data/{lib/generators/jinda/templates/app → app}/controllers/concerns/jinda_general_concern.rb +0 -0
- data/{lib/generators/jinda/templates/app → app}/controllers/concerns/jinda_run_concern.rb +0 -0
- data/{lib/generators/jinda/templates/app/controllers/jinda_org → app/controllers}/jinda_controller.rb +0 -0
- data/app/jinda/index.mm +369 -0
- data/app/jinda/template/index.mm +366 -0
- data/app/jinda/template/linkview.haml +21 -0
- data/app/jinda/template/view.html.erb +26 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/_activity.md +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/_menu.haml +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/_menu_mm.haml +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/_model.md +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/_modul.md +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/_pending_home.haml +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/_pending_page.haml +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/_service.md +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/_static.haml +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/doc-thai.md +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/doc.md +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/error_logs.haml +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/feed.rss.builder +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/help.haml +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/index.html.haml +1 -1
- data/{lib/generators/jinda/templates/app → app}/views/jinda/logs.haml +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/notice_logs.haml +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/pending.haml +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/run_form.haml +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/run_output.haml +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/search.haml +0 -0
- data/{lib/generators/jinda/templates/app → app}/views/jinda/status.haml +0 -0
- data/config/routes.rb +44 -0
- data/lib/generators/jinda/config_generator.rb +8 -0
- data/lib/generators/jinda/install_generator.rb +47 -44
- data/lib/generators/jinda/templates/Dockerfile +4 -2
- data/lib/generators/jinda/templates/app/assets/javascripts/application.js +1 -10
- data/lib/generators/jinda/templates/app/assets/stylesheets/application.css.scss +1 -20
- data/lib/generators/jinda/templates/app/views/articles/_report.haml +32 -0
- data/lib/generators/jinda/templates/app/views/articles/edit.haml +22 -11
- data/lib/generators/jinda/templates/app/views/articles/edit_article/edit_article.html.erb +14 -12
- data/lib/generators/jinda/templates/app/views/articles/index.haml +3 -21
- data/lib/generators/jinda/templates/app/views/articles/my.haml +1 -16
- data/lib/generators/jinda/templates/app/views/articles/new_article/form_article.html.erb +1 -1
- data/lib/generators/jinda/templates/app/views/articles/show.html.haml +37 -21
- data/lib/generators/jinda/templates/app/views/identities/new.html.erb +29 -24
- data/lib/generators/jinda/templates/app/views/password_resets/new.html.erb +13 -7
- data/lib/generators/jinda/templates/app/views/sessions/new.html.erb +24 -18
- data/lib/generators/jinda/templates/docker-compose.yml +3 -2
- data/lib/generators/jinda/templates/entrypoint.sh +2 -1
- data/lib/jinda.rb +2 -1
- data/lib/jinda/date_helpers.rb +109 -0
- data/lib/jinda/{gemhelpers.rb → gem_helpers.rb} +0 -1
- data/lib/jinda/gen_class.rb +13 -0
- data/lib/jinda/gen_controller.rb +10 -0
- data/lib/jinda/gen_freemind.rb +33 -0
- data/lib/jinda/gen_helpers.rb +141 -0
- data/lib/jinda/gen_models.rb +137 -0
- data/lib/jinda/gen_runseq.rb +71 -0
- data/lib/jinda/gen_services.rb +90 -0
- data/lib/jinda/gen_xmain.rb +38 -0
- data/lib/jinda/get_app.rb +34 -0
- data/lib/jinda/helpers.rb +17 -998
- data/lib/jinda/init_vars.rb +36 -0
- data/lib/jinda/rake_views.rb +59 -0
- data/lib/jinda/refresh.rb +67 -0
- data/lib/jinda/themes.rb +163 -0
- data/lib/jinda/version.rb +1 -1
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/config/manifest.js +3 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/channels/application_cable/channel.rb +4 -0
- data/test/dummy/app/channels/application_cable/connection.rb +4 -0
- data/test/dummy/app/controllers/application_controller.rb +2 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/javascript/packs/application.js +15 -0
- data/test/dummy/app/jobs/application_job.rb +7 -0
- data/test/dummy/app/mailers/application_mailer.rb +4 -0
- data/test/dummy/app/models/application_record.rb +3 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +33 -0
- data/test/dummy/config.ru +5 -0
- data/test/dummy/config/application.rb +19 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/cable.yml +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +62 -0
- data/test/dummy/config/environments/production.rb +112 -0
- data/test/dummy/config/environments/test.rb +49 -0
- data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
- data/test/dummy/config/initializers/assets.rb +12 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/content_security_policy.rb +28 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +33 -0
- data/test/dummy/config/puma.rb +38 -0
- data/test/dummy/config/routes.rb +3 -0
- data/test/dummy/config/spring.rb +6 -0
- data/test/dummy/config/storage.yml +34 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/log/development.log +8 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/test/dummy/public/apple-touch-icon.png +0 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/tmp/development_secret.txt +1 -0
- data/test/integration/navigation_test.rb +7 -0
- data/test/jinda_test.rb +7 -0
- data/test/test_helper.rb +19 -0
- metadata +224 -142
- 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
|
data/lib/jinda/helpers.rb
CHANGED
@@ -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
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
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
|