omf_web 0.9.9 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +31 -0
- data/bin/omf_web_server.rb +157 -0
- data/doc/screenshot2.png +0 -0
- data/doc/widget_detail.png +0 -0
- data/example/demo/data_sources/downloads.rb +2 -1
- data/example/simple/README.md +12 -13
- data/example/simple/create_waveform.rb +29 -0
- data/example/simple/introduction.md +17 -0
- data/example/simple/sample.sq3 +0 -0
- data/example/simple/sample.sql +1008 -0
- data/example/simple/simple.yaml +62 -0
- data/example/simple/simple_dynamic.yaml +66 -0
- data/lib/irods4r/file.rb +15 -14
- data/lib/irods4r/icommands.rb +18 -18
- data/lib/irods4r.rb +9 -9
- data/lib/omf-web/config.ru +41 -16
- data/lib/omf-web/content/git_repository.rb +32 -31
- data/lib/omf-web/content/irods_repository.rb +34 -33
- data/lib/omf-web/content/repository.rb +48 -44
- data/lib/omf-web/data_source_proxy.rb +33 -22
- data/lib/omf-web/rack/session_authenticator.rb +48 -12
- data/lib/omf-web/rack/tab_mapper.rb +30 -36
- data/lib/omf-web/rack/websocket_handler.rb +26 -25
- data/lib/omf-web/session_store.rb +16 -13
- data/lib/omf-web/theme/abstract_page.rb +26 -22
- data/lib/omf-web/theme/bright/page.rb +84 -34
- data/lib/omf-web/theme/bright/stacked_renderer.rb +20 -19
- data/lib/omf-web/theme.rb +14 -9
- data/lib/omf-web/thin/runner.rb +38 -36
- data/lib/omf-web/thin/server.rb +255 -0
- data/lib/omf-web/version.rb +1 -1
- data/lib/omf-web/widget/data_widget.rb +6 -6
- data/lib/omf-web/widget/text/maruku/helpers.rb +33 -30
- data/lib/omf-web/widget/text/maruku/input/parse_block.rb +117 -117
- data/lib/omf-web/widget/text/maruku/output/to_html.rb +155 -154
- data/lib/omf-web/widget/text/maruku.rb +17 -16
- data/omf_web.gemspec +6 -2
- data/sample.sq3 +0 -0
- data/share/htdocs/graph/js/gauge.js +524 -0
- data/share/htdocs/vendor/VERSION_MAP.yaml +3 -3
- data/share/htdocs/vendor/backbone-1.0.0/backbone.js +1571 -0
- data/share/htdocs/vendor/d3-3.0/LICENSE.brewer.txt +38 -0
- data/share/htdocs/vendor/d3-3.0/colorbrewer.js +1 -0
- data/share/htdocs/vendor/d3-3.0/d3.js +8810 -0
- data/share/htdocs/vendor/d3-3.0/d3.min.js +5 -0
- data/share/htdocs/vendor/geo_json/Readme.txt +71 -0
- data/share/htdocs/vendor/geo_json/regions.json +41 -0
- data/share/htdocs/vendor/geo_json/switzerland.json +24 -0
- data/share/htdocs/vendor/geo_json/world.json +497 -0
- data/share/htdocs/vendor/nv_d3/js/nv.d3.js +8801 -4447
- data/share/htdocs/vendor/spin/jquery.spin.js +46 -0
- data/share/htdocs/vendor/spin/spin.js +349 -0
- data/share/htdocs/vendor/spin/spin.min.js +1 -0
- data/share/htdocs/vendor/underscore-1.4.4/underscore.js +1227 -0
- metadata +63 -48
- data/example/simple/data_sources/gimi31.sq3 +0 -0
- data/example/simple/data_sources/ping_source.rb +0 -56
- data/example/simple/simple_viz_server.rb +0 -39
- data/example/simple/widgets/charts_tab.yaml +0 -38
- data/share/.DS_Store +0 -0
- data/share/htdocs/.DS_Store +0 -0
- data/share/htdocs/vendor/backbone-0.5.3/backbone.js +0 -1158
- data/share/htdocs/vendor/underscore-1.2.1/underscore.js +0 -958
@@ -9,10 +9,10 @@ require 'omf-web/session_store'
|
|
9
9
|
require 'omf-web/widget'
|
10
10
|
require 'omf-web/theme'
|
11
11
|
|
12
|
-
|
13
|
-
module OMF::Web::Rack
|
12
|
+
|
13
|
+
module OMF::Web::Rack
|
14
14
|
class TabMapper < OMF::Common::LObject
|
15
|
-
|
15
|
+
|
16
16
|
|
17
17
|
def initialize(opts = {})
|
18
18
|
@opts = opts
|
@@ -20,38 +20,31 @@ module OMF::Web::Rack
|
|
20
20
|
@tabs = {}
|
21
21
|
find_tabs()
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def find_tabs()
|
25
25
|
tabs = OMF::Web::Widget.toplevel_widgets(@opts[:use_tabs])
|
26
|
-
@enabled_tabs = {}
|
27
|
-
tabs.each do |t|
|
26
|
+
@enabled_tabs = {}
|
27
|
+
tabs.each do |t|
|
28
28
|
name = t[:id].to_sym
|
29
|
-
@enabled_tabs[name] = t
|
29
|
+
@enabled_tabs[name] = t
|
30
30
|
end
|
31
31
|
@opts[:tabs] = tabs
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def call(env)
|
35
35
|
#puts env.keys.inspect
|
36
36
|
|
37
37
|
req = ::Rack::Request.new(env)
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
# sessionID = req.params['sid']
|
42
|
-
# if sessionID.nil? || sessionID.empty?
|
43
|
-
# sessionID = "s#{(rand * 10000000).to_i}"
|
44
|
-
# end
|
45
|
-
# Thread.current["sessionID"] = sessionID
|
46
|
-
|
47
|
-
OMF::Web::Theme.require 'page'
|
38
|
+
debug "Requesting #{req.path}"
|
39
|
+
|
40
|
+
OMF::Web::Theme.require 'page'
|
48
41
|
body, headers = render_page(req)
|
49
42
|
if headers.kind_of? String
|
50
43
|
headers = {"Content-Type" => headers}
|
51
44
|
end
|
52
|
-
[200, headers, [body]] # required for ruby > 1.9.2
|
45
|
+
[200, headers, [body]] # required for ruby > 1.9.2
|
53
46
|
end
|
54
|
-
|
47
|
+
|
55
48
|
def _component_name(path)
|
56
49
|
unless comp_name = path[1]
|
57
50
|
comp_name = ((@opts[:tabs] || [])[0] || {})[:id]
|
@@ -60,17 +53,18 @@ module OMF::Web::Rack
|
|
60
53
|
#puts "PATH: #{path} - #{comp_name}"
|
61
54
|
comp_name
|
62
55
|
end
|
63
|
-
|
56
|
+
|
64
57
|
def render_card(req)
|
65
58
|
#puts ">>>> REQ: #{req.path_info}::#{req.inspect}"
|
66
|
-
|
59
|
+
|
67
60
|
opts = @opts.dup
|
68
61
|
opts[:prefix] = req.script_name
|
69
|
-
opts[:request] = req
|
62
|
+
opts[:request] = req
|
70
63
|
opts[:path] = req.path_info
|
71
64
|
|
72
65
|
path = req.path_info.split('/')
|
73
66
|
unless comp_name = _component_name(path)
|
67
|
+
puts ">>>>> #{path} - #{opts[:tabs]}"
|
74
68
|
return render_no_card(opts)
|
75
69
|
end
|
76
70
|
opts[:component_name] = comp_name.to_sym
|
@@ -82,24 +76,24 @@ module OMF::Web::Rack
|
|
82
76
|
return render_unknown_card(comp_name, opts)
|
83
77
|
end
|
84
78
|
opts[:tab] = tab_id = tab[:id]
|
85
|
-
|
79
|
+
|
86
80
|
widget = find_top_widget(tab, req)
|
87
81
|
OMF::Web::Theme.require 'page'
|
88
82
|
page = OMF::Web::Theme::Page.new(widget, opts)
|
89
83
|
[page.to_html, 'text/html']
|
90
84
|
end
|
91
|
-
|
92
|
-
|
85
|
+
|
86
|
+
|
93
87
|
def find_top_widget(tab, req)
|
94
88
|
sid = req.params['sid']
|
95
89
|
tab_id = tab[:id]
|
96
|
-
@tabs[tab_id] ||= OMF::Web::Widget.create_widget(tab_id)
|
97
|
-
#inst = OMF::Web::SessionStore[tab_id, :tab]
|
90
|
+
@tabs[tab_id] ||= OMF::Web::Widget.create_widget(tab_id)
|
91
|
+
#inst = OMF::Web::SessionStore[tab_id, :tab]
|
98
92
|
end
|
99
|
-
|
93
|
+
|
100
94
|
def render_unknown_card(comp_name, popts)
|
101
95
|
#popts[:active_id] = 'unknown'
|
102
|
-
popts[:flash] = {:alert => %{Unknonw component '#{comp_name}'. To select any of the available
|
96
|
+
popts[:flash] = {:alert => %{Unknonw component '#{comp_name}'. To select any of the available
|
103
97
|
components, please click on one of the tabs above.}}
|
104
98
|
|
105
99
|
[OMF::Web::Theme::Page.new(nil, popts).to_html, 'text/html']
|
@@ -108,18 +102,18 @@ module OMF::Web::Rack
|
|
108
102
|
def render_no_card(popts)
|
109
103
|
popts[:active_id] = 'unknown'
|
110
104
|
popts[:flash] = {:alert => %{There are no components defined for this site.}}
|
111
|
-
popts[:tabs] = []
|
105
|
+
popts[:tabs] = []
|
112
106
|
[OMF::Web::Theme::Page.new(nil, popts).to_html, 'text/html']
|
113
107
|
end
|
114
|
-
|
108
|
+
|
115
109
|
def render_page(req)
|
116
110
|
render_card(req)
|
117
111
|
end
|
118
|
-
|
112
|
+
|
119
113
|
end # Tab Mapper
|
120
|
-
|
114
|
+
|
121
115
|
end # OMF:Common::Web2
|
122
116
|
|
123
117
|
|
124
|
-
|
125
|
-
|
118
|
+
|
119
|
+
|
@@ -1,22 +1,23 @@
|
|
1
1
|
|
2
|
+
|
2
3
|
require 'rack/websocket'
|
3
4
|
require 'omf_common/lobject'
|
4
5
|
require 'omf-web/session_store'
|
5
6
|
require 'thread'
|
6
7
|
|
7
8
|
module OMF::Web::Rack
|
8
|
-
|
9
|
+
|
9
10
|
class WebsocketHandler < ::Rack::WebSocket::Application
|
10
11
|
include OMF::Common::Loggable
|
11
|
-
extend OMF::Common::Loggable
|
12
|
-
|
13
|
-
MESSAGE_DELAY = 0.5 # Delay in pushing action message to browser
|
14
|
-
# after receiving a 'on_change' from monitored data proxy
|
15
|
-
|
12
|
+
extend OMF::Common::Loggable
|
13
|
+
|
14
|
+
MESSAGE_DELAY = 0.5 # Delay in pushing action message to browser
|
15
|
+
# after receiving a 'on_change' from monitored data proxy
|
16
|
+
|
16
17
|
def on_open(env)
|
17
18
|
#puts ">>>>> OPEN"
|
18
|
-
end
|
19
|
-
|
19
|
+
end
|
20
|
+
|
20
21
|
def on_message(env, msg_s)
|
21
22
|
begin
|
22
23
|
req = ::Rack::Request.new(env)
|
@@ -41,7 +42,7 @@ module OMF::Web::Rack
|
|
41
42
|
send_data({type: 'reply', status: 'exception', err_msg: ex.to_s}.to_json)
|
42
43
|
end
|
43
44
|
end
|
44
|
-
|
45
|
+
|
45
46
|
def on_close(env)
|
46
47
|
begin
|
47
48
|
debug "client disconnected"
|
@@ -51,29 +52,29 @@ module OMF::Web::Rack
|
|
51
52
|
error(ex)
|
52
53
|
end
|
53
54
|
end
|
54
|
-
|
55
|
+
|
55
56
|
def on_register_data_source(args, context)
|
56
57
|
dsp = find_data_source(args)
|
57
58
|
return unless dsp # should define appropriate exception
|
58
59
|
debug "Received registration for datasource proxy '#{dsp}'"
|
59
60
|
send_data({type: 'reply', status: 'ok'}.to_json)
|
60
|
-
|
61
|
+
|
61
62
|
mutex = Mutex.new
|
62
63
|
semaphore = ConditionVariable.new
|
63
64
|
action_queue = {}
|
64
|
-
|
65
|
+
|
65
66
|
dsp.on_changed(args['offset']) do |action, rows|
|
66
67
|
mutex.synchronize do
|
67
68
|
(action_queue[action] ||= []).concat(rows)
|
68
69
|
semaphore.signal
|
69
70
|
end
|
70
71
|
end
|
71
|
-
|
72
|
+
|
72
73
|
# Send the rows in a separate thread, waiting a bit after the first one arriving
|
73
74
|
# to 'bunch' things into more manageable number of messages
|
74
75
|
Thread.new do
|
75
|
-
begin
|
76
|
-
loop do
|
76
|
+
begin
|
77
|
+
loop do
|
77
78
|
# Now lets send them
|
78
79
|
mutex.synchronize do
|
79
80
|
action_queue.each do |action, rows|
|
@@ -86,14 +87,14 @@ module OMF::Web::Rack
|
|
86
87
|
action: action
|
87
88
|
#offset: offset
|
88
89
|
}
|
89
|
-
send_data(msg.to_json)
|
90
|
+
send_data(msg.to_json.force_encoding("UTF-8"))
|
90
91
|
rows.clear
|
91
92
|
end
|
92
93
|
|
93
94
|
# wait until there is more to send
|
94
95
|
semaphore.wait(mutex)
|
95
96
|
end
|
96
|
-
|
97
|
+
|
97
98
|
# OK, there is something to do, but let's wait a bit, maybe there is more
|
98
99
|
sleep MESSAGE_DELAY
|
99
100
|
end
|
@@ -102,19 +103,19 @@ module OMF::Web::Rack
|
|
102
103
|
debug "#{ex.backtrace.join("\n")}"
|
103
104
|
end
|
104
105
|
end
|
105
|
-
|
106
|
+
|
106
107
|
end
|
107
|
-
|
108
|
+
|
108
109
|
# args {"slice"=>{"col_name"=>"id", "col_value"=>"e8..."}, "ds_name"=>"individual_link"}}
|
109
110
|
def on_request_slice(args, context)
|
110
111
|
dsp = find_data_source(args)
|
111
112
|
return unless dsp # should define appropriate exception
|
112
|
-
|
113
|
+
|
113
114
|
sargs = args['slice']
|
114
115
|
col_name = sargs['col_name']
|
115
116
|
col_value = sargs['col_value']
|
116
117
|
debug "Creating slice '#{col_name}:#{col_value}' data source '#{dsp}'"
|
117
|
-
|
118
|
+
|
118
119
|
if old_sdsp = context[:sliced_datasource]
|
119
120
|
return if old_sdsp[:column_name] == col_name
|
120
121
|
old_sdsp[:dsp].release
|
@@ -129,8 +130,8 @@ module OMF::Web::Rack
|
|
129
130
|
action: action
|
130
131
|
#offset: offset
|
131
132
|
}
|
132
|
-
send_data(msg.to_json)
|
133
|
-
#
|
133
|
+
send_data(msg.to_json.force_encoding("UTF-8"))
|
134
|
+
#
|
134
135
|
# do |new_rows, offset|
|
135
136
|
# msg = {
|
136
137
|
# type: 'datasource_update',
|
@@ -141,7 +142,7 @@ module OMF::Web::Rack
|
|
141
142
|
# send_data(msg.to_json)
|
142
143
|
end
|
143
144
|
end
|
144
|
-
|
145
|
+
|
145
146
|
def find_data_source(args)
|
146
147
|
ds_name = args['ds_name']
|
147
148
|
unless dsp = OMF::Web::DataSourceProxy[ds_name]
|
@@ -153,5 +154,5 @@ module OMF::Web::Rack
|
|
153
154
|
end
|
154
155
|
|
155
156
|
end # WebsocketHandler
|
156
|
-
|
157
|
+
|
157
158
|
end # module
|
@@ -3,18 +3,18 @@ require 'omf_common/lobject'
|
|
3
3
|
|
4
4
|
|
5
5
|
module OMF::Web
|
6
|
-
|
6
|
+
|
7
7
|
# Keeps session state.
|
8
8
|
#
|
9
9
|
# TODO: Implement cleanup thread
|
10
10
|
#
|
11
11
|
class SessionStore < OMF::Common::LObject
|
12
12
|
@@sessions = {}
|
13
|
-
|
13
|
+
|
14
14
|
def self.[](key, domain)
|
15
15
|
self.session["#{domain}:#{key}"]
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def self.[]=(key, domain, value)
|
19
19
|
self.session["#{domain}:#{key}"] = value
|
20
20
|
end
|
@@ -25,30 +25,33 @@ module OMF::Web
|
|
25
25
|
#puts "STORE>> #{sid} = #{session[:content].keys.inspect}"
|
26
26
|
session[:ts] = Time.now
|
27
27
|
session[:content]
|
28
|
-
end
|
29
|
-
|
28
|
+
end
|
29
|
+
|
30
30
|
def self.session_id
|
31
31
|
sid = Thread.current["sessionID"]
|
32
|
-
|
33
|
-
|
34
|
-
end
|
32
|
+
raise "Missing session id 'sid'" if sid.nil?
|
33
|
+
sid
|
35
34
|
end
|
36
|
-
|
35
|
+
|
37
36
|
def self.find_tab_from_path(comp_path)
|
38
37
|
sid = comp_path.shift
|
39
38
|
unless session = self.session(sid)
|
40
39
|
raise "Can't find session '#{sid}', may have timed out"
|
41
40
|
end
|
42
41
|
tid = comp_path.shift.to_sym
|
43
|
-
unless tab_inst = session[tid]
|
44
|
-
raise "Can't find tab '#{tid}'"
|
42
|
+
unless tab_inst = session[tid]
|
43
|
+
raise "Can't find tab '#{tid}'"
|
45
44
|
end
|
46
45
|
{:sid => sid, :tab_inst => tab_inst, :sub_path => comp_path}
|
47
46
|
end
|
47
|
+
|
48
|
+
def self.find_across_sessions(&block)
|
49
|
+
@@sessions.values.map { |v| v[:content] }.find(&block)
|
50
|
+
end
|
48
51
|
end # SessionStore
|
49
52
|
|
50
53
|
end # OMF:Web
|
51
54
|
|
52
55
|
|
53
|
-
|
54
|
-
|
56
|
+
|
57
|
+
|
@@ -4,40 +4,45 @@ require 'omf-web/data_source_proxy'
|
|
4
4
|
|
5
5
|
module OMF::Web::Theme
|
6
6
|
class AbstractPage < Erector::Widget
|
7
|
-
|
7
|
+
|
8
8
|
depends_on :js, '/resource/vendor/stacktrace/stacktrace.js'
|
9
9
|
depends_on :js, '/resource/vendor/jquery/jquery.js'
|
10
10
|
#depends_on :js, '/resource/js/stacktrace.js'
|
11
11
|
depends_on :js, '/resource/vendor/underscore/underscore.js'
|
12
|
-
depends_on :js, '/resource/vendor/backbone/backbone.js'
|
12
|
+
depends_on :js, '/resource/vendor/backbone/backbone.js'
|
13
13
|
depends_on :js, "/resource/js/require3.js"
|
14
14
|
|
15
15
|
depends_on :js, "/resource/theme/abstract/abstract.js"
|
16
|
-
depends_on :js, "/resource/js/data_source2.js"
|
16
|
+
depends_on :js, "/resource/js/data_source2.js"
|
17
17
|
|
18
18
|
attr_reader :opts
|
19
|
-
|
19
|
+
|
20
|
+
def self.add_depends_on(type, url)
|
21
|
+
depends_on type.to_sym, url
|
22
|
+
end
|
23
|
+
|
20
24
|
def initialize(widget, opts)
|
21
25
|
#puts "KEYS>>>>> #{opts.keys.inspect}"
|
22
26
|
super opts
|
23
27
|
@widget = widget
|
24
28
|
@opts = opts
|
25
29
|
end
|
26
|
-
|
30
|
+
|
27
31
|
def content
|
28
32
|
javascript %{
|
29
33
|
if (typeof(LW) == "undefined") LW = {};
|
30
34
|
LW.session_id = OML.session_id = '#{Thread.current["sessionID"]}';
|
31
|
-
|
32
|
-
L.provide('jquery', ['vendor/jquery/jquery.js']);
|
33
|
-
|
35
|
+
|
36
|
+
//L.provide('jquery', ['vendor/jquery/jquery.js']);
|
37
|
+
L.already_loaded('/resource/vendor/jquery/jquery.js');
|
38
|
+
//L.provide('jquery.periodicalupdater', ['vendor/jquery/jquery.periodicalupdater.js']);
|
34
39
|
//L.provide('jquery.ui', ['vendor/jquery-ui/js/jquery-ui.min.js']);
|
35
|
-
}
|
40
|
+
}
|
36
41
|
end
|
37
42
|
|
38
43
|
def render_flash
|
39
44
|
return unless @flash
|
40
|
-
if @flash[:notice]
|
45
|
+
if @flash[:notice]
|
41
46
|
div :class => 'flash_notice flash' do
|
42
47
|
text @flash[:notice]
|
43
48
|
end
|
@@ -55,7 +60,7 @@ module OMF::Web::Theme
|
|
55
60
|
end
|
56
61
|
end
|
57
62
|
end # render_flesh
|
58
|
-
|
63
|
+
|
59
64
|
# Return an array of widgets to collect data sources from
|
60
65
|
#
|
61
66
|
def data_source_widgets
|
@@ -66,13 +71,13 @@ module OMF::Web::Theme
|
|
66
71
|
[@widget]
|
67
72
|
# end
|
68
73
|
end
|
69
|
-
|
74
|
+
|
70
75
|
def render_data_sources
|
71
76
|
return unless @widget
|
72
|
-
|
77
|
+
|
73
78
|
require 'omf_oml/table'
|
74
79
|
require 'set'
|
75
|
-
|
80
|
+
|
76
81
|
dss = Set.new
|
77
82
|
data_source_widgets.each do |w|
|
78
83
|
w.collect_data_sources(dss)
|
@@ -86,11 +91,11 @@ module OMF::Web::Theme
|
|
86
91
|
|
87
92
|
#puts ">>>> #{dsh.inspect}"
|
88
93
|
return if dss.empty?
|
89
|
-
|
94
|
+
|
90
95
|
js = dss.map do |ds|
|
91
96
|
render_data_source(ds)
|
92
97
|
end
|
93
|
-
|
98
|
+
|
94
99
|
# js = dsh.values.to_a.collect do |ds|
|
95
100
|
# render_data_source(ds)
|
96
101
|
# end
|
@@ -103,7 +108,7 @@ module OMF::Web::Theme
|
|
103
108
|
</script>
|
104
109
|
}
|
105
110
|
end
|
106
|
-
|
111
|
+
|
107
112
|
def render_data_source(ds)
|
108
113
|
dspa = OMF::Web::DataSourceProxy.for_source(ds)
|
109
114
|
dspa.collect do |dsp|
|
@@ -111,7 +116,7 @@ module OMF::Web::Theme
|
|
111
116
|
dsp.to_javascript(ds)
|
112
117
|
end.join("\n")
|
113
118
|
end
|
114
|
-
|
119
|
+
|
115
120
|
def render_additional_headers
|
116
121
|
#"\n\n<link href='/resource/css/incoming.css' media='all' rel='stylesheet' type='text/css' />\n"
|
117
122
|
end
|
@@ -119,9 +124,9 @@ module OMF::Web::Theme
|
|
119
124
|
def collect_data_sources(dsa)
|
120
125
|
dsa
|
121
126
|
end
|
122
|
-
|
127
|
+
|
123
128
|
def to_html(opts = {})
|
124
|
-
page_title = @
|
129
|
+
page_title = @page_title # context may get screwed up below, so put title into scope
|
125
130
|
b = super
|
126
131
|
if @opts[:request].params.key?('embedded')
|
127
132
|
b
|
@@ -141,9 +146,8 @@ module OMF::Web::Theme
|
|
141
146
|
end
|
142
147
|
end
|
143
148
|
end
|
144
|
-
r.to_html(opts)
|
149
|
+
r.to_html(opts)
|
145
150
|
end
|
146
151
|
end
|
147
152
|
end # class AbstractPage
|
148
153
|
end # OMF::Web::Theme
|
149
|
-
|
@@ -1,37 +1,37 @@
|
|
1
1
|
require 'omf-web/theme/abstract_page'
|
2
|
-
require 'omf-web/rack/session_authenticator'
|
2
|
+
require 'omf-web/rack/session_authenticator'
|
3
3
|
|
4
4
|
module OMF::Web::Theme
|
5
5
|
class Page < OMF::Web::Theme::AbstractPage
|
6
|
-
|
6
|
+
|
7
7
|
depends_on :css, '/resource/theme/bright/css/reset-fonts-grids.css'
|
8
8
|
depends_on :css, "/resource/theme/bright/css/bright.css"
|
9
|
-
|
9
|
+
|
10
10
|
depends_on :script, %{
|
11
11
|
OML.session_id = '#{Thread.current["sessionID"]}'
|
12
12
|
OML.show_widget = function(opts) {
|
13
13
|
var prefix = opts.inner_class;
|
14
14
|
var index = opts.index;
|
15
15
|
var widget_id = opts.widget_id;
|
16
|
-
|
16
|
+
|
17
17
|
$('.' + prefix).hide();
|
18
18
|
$('#' + prefix + '_' + index).show();
|
19
|
-
|
19
|
+
|
20
20
|
var current = $('#' + prefix + '_l_' + index);
|
21
21
|
current.addClass('current');
|
22
22
|
current.siblings().removeClass('current');
|
23
|
-
|
23
|
+
|
24
24
|
// May be a bit overkill, but this should shake out the widgets hidden so far
|
25
|
-
OHUB.trigger('layout.resize', {});
|
26
|
-
|
25
|
+
OHUB.trigger('layout.resize', {});
|
26
|
+
|
27
27
|
return false;
|
28
28
|
};
|
29
29
|
}
|
30
|
-
|
30
|
+
|
31
31
|
# def initialize(widget, opts)
|
32
32
|
# super
|
33
33
|
# end
|
34
|
-
|
34
|
+
|
35
35
|
def content
|
36
36
|
super
|
37
37
|
@renderer = @widget.content
|
@@ -42,8 +42,8 @@ module OMF::Web::Theme
|
|
42
42
|
render_top_line
|
43
43
|
end
|
44
44
|
if @renderer.render? :title
|
45
|
-
|
46
|
-
end
|
45
|
+
render_title
|
46
|
+
end
|
47
47
|
end
|
48
48
|
end
|
49
49
|
div :id => 'bd' do
|
@@ -56,19 +56,19 @@ module OMF::Web::Theme
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
def render_top_line
|
61
61
|
div :id => :top_line do
|
62
62
|
render_tab_menu
|
63
63
|
render_tools_menu
|
64
64
|
end
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
def render_tab_menu
|
68
68
|
ol :id => :tab_menu do
|
69
69
|
@tabs.each do |h|
|
70
70
|
lopts = h[:id] == @tab ? {:class => :current} : {}
|
71
|
-
li lopts do
|
71
|
+
li lopts do
|
72
72
|
#a :href => "#{@prefix}/#{h[:id]}?sid=#{Thread.current["sessionID"]}" do
|
73
73
|
a :href => "#{@prefix}/#{h[:id]}" do
|
74
74
|
span h[:name], :class => :tab_text
|
@@ -77,38 +77,88 @@ module OMF::Web::Theme
|
|
77
77
|
end
|
78
78
|
end
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
|
+
# def render_tools_menu
|
82
|
+
# div :id => :tools_menu do
|
83
|
+
# render_authentication
|
84
|
+
# end
|
85
|
+
# end
|
86
|
+
|
81
87
|
def render_tools_menu
|
82
|
-
|
83
|
-
|
88
|
+
ol :id => :tools_menu do
|
89
|
+
render_tools_menu_authenticate
|
84
90
|
end
|
85
91
|
end
|
86
|
-
|
87
|
-
def
|
88
|
-
if OMF::Web::Rack::SessionAuthenticator.
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
92
|
+
|
93
|
+
def render_tools_menu_authenticate
|
94
|
+
if user = OMF::Web::Rack::SessionAuthenticator.user()
|
95
|
+
puts "USER>>>>> #{user}"
|
96
|
+
li do
|
97
|
+
a href: '#', class: 'user' do
|
98
|
+
i class: "icon-user icon-white"
|
99
|
+
text user[:name]
|
100
|
+
end
|
101
|
+
end
|
102
|
+
li id: 'logout_li' do
|
103
|
+
a id: 'logout_a', href: '#', class: 'logout' do
|
104
|
+
i class: "icon-off icon-white"
|
105
|
+
text 'Log out'
|
106
|
+
end
|
107
|
+
end
|
108
|
+
am = "render_tools_menu_authenticate_#{user[:method]}".to_sym
|
109
|
+
puts "METHOD>>>>> #{am}"
|
110
|
+
if respond_to?(am)
|
111
|
+
send(am, user)
|
93
112
|
else
|
94
|
-
|
113
|
+
javascript %{
|
114
|
+
$('#logout_a').href = '/auth/logout'
|
115
|
+
}
|
95
116
|
end
|
96
117
|
end
|
97
|
-
|
98
|
-
|
99
118
|
end
|
100
|
-
|
119
|
+
|
120
|
+
def render_tools_menu_authenticate_persona(user)
|
121
|
+
javascript %{
|
122
|
+
$('#logout_li').hide();
|
123
|
+
$.getScript("https://login.persona.org/include.js")
|
124
|
+
.done(function(script, textStatus) {
|
125
|
+
$('#logout_li').show();
|
126
|
+
$('#logout_a').click(function() {
|
127
|
+
navigator.id.logout();
|
128
|
+
})
|
129
|
+
navigator.id.watch({
|
130
|
+
loggedInUser: '#{user}',
|
131
|
+
onlogin: function(assertion) {},
|
132
|
+
onlogout: function() {
|
133
|
+
$.ajax({
|
134
|
+
type: 'POST',
|
135
|
+
url: '/auth/logout',
|
136
|
+
success: function(res, status, xhr) {
|
137
|
+
window.location = '/';
|
138
|
+
},
|
139
|
+
error: function(xhr, status, err) { alert("Logout failure: " + err); }
|
140
|
+
});
|
141
|
+
}
|
142
|
+
})
|
143
|
+
});
|
144
|
+
}
|
145
|
+
end
|
146
|
+
|
147
|
+
def render_title
|
148
|
+
h1 @page_title || 'Missing :page_title'
|
149
|
+
end
|
150
|
+
|
101
151
|
def render_body
|
102
152
|
render_flash
|
103
153
|
render_card_body
|
104
154
|
end
|
105
|
-
|
155
|
+
|
106
156
|
def render_card_body
|
107
157
|
return unless @widget
|
108
158
|
Thread.current["top_renderer"] = self
|
109
159
|
rawtext @renderer.to_html
|
110
160
|
end
|
111
|
-
|
161
|
+
|
112
162
|
def render_footer
|
113
163
|
if @footer_right.is_a? Proc
|
114
164
|
widget(Erector.inline(&@footer_right))
|
@@ -122,11 +172,11 @@ module OMF::Web::Theme
|
|
122
172
|
else
|
123
173
|
text @footer_left || 'Brought to you by the TEMPO Team'
|
124
174
|
end
|
125
|
-
|
175
|
+
|
126
176
|
end
|
127
|
-
|
128
177
|
|
129
|
-
|
178
|
+
|
179
|
+
|
130
180
|
|
131
181
|
end # class Page
|
132
182
|
end # OMF::Web::Theme
|