omf_web 0.9.9 → 1.0.0
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 +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
|