glimmer-dsl-opal 0.0.4 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +35 -0
- data/README.md +983 -34
- data/VERSION +1 -1
- data/lib/glimmer-dsl-opal.rb +5 -2
- data/lib/glimmer/data_binding/ext/observable_model.rb +40 -0
- data/lib/glimmer/data_binding/table_items_binding.rb +70 -0
- data/lib/glimmer/dsl/opal/async_exec_expression.rb +17 -0
- data/lib/glimmer/dsl/opal/browser_expression.rb +17 -0
- data/lib/glimmer/dsl/opal/column_properties_expression.rb +22 -0
- data/lib/glimmer/dsl/opal/dsl.rb +11 -0
- data/lib/glimmer/dsl/opal/message_box_expression.rb +20 -0
- data/lib/glimmer/dsl/opal/observe_expression.rb +32 -0
- data/lib/glimmer/dsl/opal/tab_folder_expression.rb +17 -0
- data/lib/glimmer/dsl/opal/tab_item_expression.rb +17 -0
- data/lib/glimmer/dsl/opal/table_column_expression.rb +17 -0
- data/lib/glimmer/dsl/opal/table_expression.rb +17 -0
- data/lib/glimmer/dsl/opal/table_items_data_binding_expression.rb +29 -0
- data/lib/glimmer/opal/display_proxy.rb +23 -0
- data/lib/glimmer/opal/div_proxy.rb +11 -2
- data/lib/glimmer/opal/document_proxy.rb +124 -4
- data/lib/glimmer/opal/element_proxy.rb +45 -14
- data/lib/glimmer/opal/grid_layout_proxy.rb +3 -1
- data/lib/glimmer/opal/iframe_proxy.rb +23 -0
- data/lib/glimmer/opal/input_proxy.rb +8 -4
- data/lib/glimmer/opal/label_proxy.rb +1 -1
- data/lib/glimmer/opal/layout_data_proxy.rb +23 -2
- data/lib/glimmer/opal/list_proxy.rb +2 -2
- data/lib/glimmer/opal/modal.rb +94 -0
- data/lib/glimmer/opal/point.rb +5 -0
- data/lib/glimmer/opal/select_proxy.rb +1 -1
- data/lib/glimmer/opal/tab_folder.rb +53 -0
- data/lib/glimmer/opal/tab_item.rb +98 -0
- data/lib/glimmer/opal/table_column.rb +50 -0
- data/lib/glimmer/opal/table_item.rb +136 -0
- data/lib/glimmer/opal/table_proxy.rb +149 -0
- data/lib/samples/elaborate/contact_manager.rb +1 -2
- data/lib/samples/elaborate/login.rb +0 -1
- data/lib/samples/elaborate/tic_tac_toe.rb +5 -5
- data/lib/samples/hello/hello_tab.rb +2 -2
- metadata +28 -16
- data/lib/glimmer/config.rb +0 -22
- data/lib/glimmer/dsl/engine.rb +0 -193
- data/lib/glimmer/dsl/expression.rb +0 -42
- data/lib/glimmer/dsl/expression_handler.rb +0 -48
- data/lib/glimmer/dsl/parent_expression.rb +0 -12
- data/lib/glimmer/dsl/static_expression.rb +0 -36
- data/lib/glimmer/dsl/top_level_expression.rb +0 -7
- data/lib/glimmer/error.rb +0 -6
- data/lib/glimmer/invalid_keyword_error.rb +0 -6
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.9
|
data/lib/glimmer-dsl-opal.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'opal'
|
2
|
-
require 'opal-
|
2
|
+
require 'opal-async'
|
3
|
+
require 'browser'
|
4
|
+
require 'browser/effects'
|
3
5
|
require 'glimmer'
|
4
6
|
|
5
7
|
GLIMMER_DSL_OPAL_ROOT = File.expand_path('../..', __FILE__)
|
@@ -7,4 +9,5 @@ GLIMMER_DSL_OPAL_LIB = File.join(GLIMMER_DSL_OPAL_ROOT, 'lib')
|
|
7
9
|
|
8
10
|
$LOAD_PATH.unshift(GLIMMER_DSL_OPAL_LIB)
|
9
11
|
|
10
|
-
require 'glimmer/dsl/opal/dsl'
|
12
|
+
require 'glimmer/dsl/opal/dsl'
|
13
|
+
require 'glimmer/data_binding/ext/observable_model'
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'glimmer/data_binding/observable'
|
2
|
+
require 'glimmer/data_binding/observer'
|
3
|
+
require 'glimmer/opal/display_proxy'
|
4
|
+
|
5
|
+
# This ensures all data-binding events happen async and block on modal display
|
6
|
+
|
7
|
+
module Glimmer
|
8
|
+
module DataBinding
|
9
|
+
# TODO prefix utility methods with double-underscore
|
10
|
+
module ObservableModel
|
11
|
+
include Observable
|
12
|
+
# include Glimmer
|
13
|
+
|
14
|
+
def add_property_writer_observers(property_name)
|
15
|
+
property_writer_name = "#{property_name}="
|
16
|
+
method(property_writer_name)
|
17
|
+
ensure_array_object_observer(property_name, send(property_name))
|
18
|
+
begin
|
19
|
+
method("__original_#{property_writer_name}")
|
20
|
+
rescue
|
21
|
+
old_method = self.class.instance_method(property_writer_name)
|
22
|
+
define_singleton_method("__original_#{property_writer_name}", old_method)
|
23
|
+
define_singleton_method(property_writer_name) do |value|
|
24
|
+
old_value = self.send(property_name)
|
25
|
+
unregister_dependent_observers(property_name, old_value)
|
26
|
+
self.send("__original_#{property_writer_name}", value)
|
27
|
+
Glimmer::Opal::DisplayProxy.instance.async_exec do
|
28
|
+
notify_observers(property_name)
|
29
|
+
ensure_array_object_observer(property_name, value, old_value)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
rescue => e
|
34
|
+
# ignore writing if no property writer exists
|
35
|
+
Glimmer::Config.logger&.debug "No need to observe property writer: #{property_writer_name}\n#{e.message}\n#{e.backtrace.join("\n")}"
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'glimmer/data_binding/observable_array'
|
2
|
+
require 'glimmer/data_binding/observable_model'
|
3
|
+
require 'glimmer/data_binding/observable'
|
4
|
+
require 'glimmer/data_binding/observer'
|
5
|
+
require 'glimmer/opal/table_proxy'
|
6
|
+
require 'glimmer/opal/table_item'
|
7
|
+
|
8
|
+
module Glimmer
|
9
|
+
module DataBinding
|
10
|
+
class TableItemsBinding
|
11
|
+
include DataBinding::Observable
|
12
|
+
include DataBinding::Observer
|
13
|
+
|
14
|
+
def initialize(parent, model_binding, column_properties)
|
15
|
+
@last_model_collection = nil
|
16
|
+
@table = parent
|
17
|
+
@model_binding = model_binding
|
18
|
+
@column_properties = column_properties
|
19
|
+
if @table.respond_to?(:column_properties=)
|
20
|
+
@table.column_properties = @column_properties
|
21
|
+
##else # assume custom widget
|
22
|
+
## @table.body_root.column_properties = @column_properties
|
23
|
+
end
|
24
|
+
call(@model_binding.evaluate_property)
|
25
|
+
model = model_binding.base_model
|
26
|
+
observe(model, model_binding.property_name_expression)
|
27
|
+
##@table.on_widget_disposed do |dispose_event| # doesn't seem needed within Opal
|
28
|
+
## unregister_all_observables
|
29
|
+
##end
|
30
|
+
end
|
31
|
+
|
32
|
+
def call(new_model_collection=nil)
|
33
|
+
if new_model_collection and new_model_collection.is_a?(Array)
|
34
|
+
observe(new_model_collection, @column_properties)
|
35
|
+
@model_collection = new_model_collection
|
36
|
+
end
|
37
|
+
populate_table(@model_collection, @table, @column_properties)
|
38
|
+
sort_table(@model_collection, @table, @column_properties)
|
39
|
+
end
|
40
|
+
|
41
|
+
def populate_table(model_collection, parent, column_properties)
|
42
|
+
return if model_collection&.sort_by(&:hash) == @last_model_collection&.sort_by(&:hash)
|
43
|
+
@last_model_collection = model_collection
|
44
|
+
# TODO improve performance
|
45
|
+
selected_table_item_models = parent.selection.map(&:get_data)
|
46
|
+
old_items = parent.items
|
47
|
+
old_item_ids_per_model = old_items.reduce({}) {|hash, item| hash.merge(item.get_data.hash => item.id) }
|
48
|
+
parent.remove_all
|
49
|
+
model_collection.each do |model|
|
50
|
+
table_item = Glimmer::Opal::TableItem.new(parent)
|
51
|
+
for index in 0..(column_properties.size-1)
|
52
|
+
table_item.set_text(index, model.send(column_properties[index]).to_s)
|
53
|
+
end
|
54
|
+
table_item.set_data(model)
|
55
|
+
table_item.id = old_item_ids_per_model[model.hash] if old_item_ids_per_model[model.hash]
|
56
|
+
end
|
57
|
+
selected_table_items = parent.search {|item| selected_table_item_models.include?(item.get_data) }
|
58
|
+
selected_table_items = [parent.items.first] if selected_table_items.empty? && !parent.items.empty?
|
59
|
+
parent.selection = selected_table_items unless selected_table_items.empty?
|
60
|
+
parent.redraw
|
61
|
+
end
|
62
|
+
|
63
|
+
def sort_table(model_collection, parent, column_properties)
|
64
|
+
return if model_collection == @last_model_collection
|
65
|
+
parent.items = parent.items.sort_by { |item| model_collection.index(item.get_data) }
|
66
|
+
@last_model_collection = model_collection
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/dsl/top_level_expression'
|
3
|
+
require 'glimmer/opal/display_proxy'
|
4
|
+
|
5
|
+
module Glimmer
|
6
|
+
module DSL
|
7
|
+
module Opal
|
8
|
+
class AsyncExecExpression < StaticExpression
|
9
|
+
include TopLevelExpression
|
10
|
+
|
11
|
+
def interpret(parent, keyword, *args, &block)
|
12
|
+
Glimmer::Opal::DisplayProxy.instance.async_exec(&block)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/dsl/parent_expression'
|
3
|
+
require 'glimmer/opal/iframe_proxy'
|
4
|
+
|
5
|
+
module Glimmer
|
6
|
+
module DSL
|
7
|
+
module Opal
|
8
|
+
class BrowserExpression < StaticExpression
|
9
|
+
include ParentExpression
|
10
|
+
|
11
|
+
def interpret(parent, keyword, *args, &block)
|
12
|
+
Glimmer::Opal::IframeProxy.new(parent, args)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/opal/table_proxy'
|
3
|
+
|
4
|
+
module Glimmer
|
5
|
+
module DSL
|
6
|
+
module Opal
|
7
|
+
# Responsible for providing a readable keyword (command symbol) to capture
|
8
|
+
# and return column properties for use in TreeItemsDataBindingCommandHandler
|
9
|
+
class ColumnPropertiesExpression < StaticExpression
|
10
|
+
def can_interpret?(parent, keyword, *args, &block)
|
11
|
+
keyword == 'column_properties' and
|
12
|
+
block.nil? and
|
13
|
+
parent.is_a?(Glimmer::Opal::TableProxy)
|
14
|
+
end
|
15
|
+
|
16
|
+
def interpret(parent, keyword, *args, &block)
|
17
|
+
args
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/glimmer/dsl/opal/dsl.rb
CHANGED
@@ -16,8 +16,18 @@ require 'glimmer/dsl/opal/widget_listener_expression'
|
|
16
16
|
require 'glimmer/dsl/opal/grid_layout_expression'
|
17
17
|
require 'glimmer/dsl/opal/text_expression'
|
18
18
|
require 'glimmer/dsl/opal/list_expression'
|
19
|
+
require 'glimmer/dsl/opal/browser_expression'
|
20
|
+
require 'glimmer/dsl/opal/tab_folder_expression'
|
21
|
+
require 'glimmer/dsl/opal/tab_item_expression'
|
22
|
+
require 'glimmer/dsl/opal/message_box_expression'
|
23
|
+
require 'glimmer/dsl/opal/async_exec_expression'
|
24
|
+
require 'glimmer/dsl/opal/observe_expression'
|
19
25
|
require 'glimmer/dsl/opal/layout_data_expression'
|
20
26
|
require 'glimmer/dsl/opal/list_selection_data_binding_expression'
|
27
|
+
require 'glimmer/dsl/opal/table_expression'
|
28
|
+
require 'glimmer/dsl/opal/table_column_expression'
|
29
|
+
require 'glimmer/dsl/opal/table_items_data_binding_expression'
|
30
|
+
require 'glimmer/dsl/opal/column_properties_expression'
|
21
31
|
|
22
32
|
module Glimmer
|
23
33
|
module DSL
|
@@ -26,6 +36,7 @@ module Glimmer
|
|
26
36
|
Opal,
|
27
37
|
%w[
|
28
38
|
widget_listener
|
39
|
+
table_items_data_binding
|
29
40
|
combo_selection_data_binding
|
30
41
|
list_selection_data_binding
|
31
42
|
data_binding
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/dsl/top_level_expression'
|
3
|
+
require 'glimmer/dsl/parent_expression'
|
4
|
+
require 'glimmer/opal/modal'
|
5
|
+
|
6
|
+
module Glimmer
|
7
|
+
module DSL
|
8
|
+
module Opal
|
9
|
+
class MessageBoxExpression < StaticExpression
|
10
|
+
include TopLevelExpression
|
11
|
+
include ParentExpression
|
12
|
+
|
13
|
+
def interpret(parent, keyword, *args, &block)
|
14
|
+
parent = args.delete_at(0)
|
15
|
+
Glimmer::Opal::Modal.new(parent, args)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/dsl/top_level_expression'
|
3
|
+
require 'glimmer/data_binding/observer'
|
4
|
+
require 'glimmer/data_binding/model_binding'
|
5
|
+
|
6
|
+
module Glimmer
|
7
|
+
module DSL
|
8
|
+
module Opal
|
9
|
+
class ObserveExpression < StaticExpression
|
10
|
+
include TopLevelExpression
|
11
|
+
|
12
|
+
REGEX_NESTED_OR_INDEXED_PROPERTY = /([^\[]+)(\[[^\]]+\])?/
|
13
|
+
|
14
|
+
def can_interpret?(parent, keyword, *args, &block)
|
15
|
+
keyword == 'observe' and
|
16
|
+
block_given? and
|
17
|
+
(args.size == 2) and
|
18
|
+
textual?(args[1])
|
19
|
+
end
|
20
|
+
|
21
|
+
def interpret(parent, keyword, *args, &block)
|
22
|
+
observer = DataBinding::Observer.proc(&block)
|
23
|
+
if args[1].to_s.match(REGEX_NESTED_OR_INDEXED_PROPERTY)
|
24
|
+
observer.observe(DataBinding::ModelBinding.new(args[0], args[1]))
|
25
|
+
else
|
26
|
+
observer.observe(args[0], args[1])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/dsl/parent_expression'
|
3
|
+
require 'glimmer/opal/tab_folder'
|
4
|
+
|
5
|
+
module Glimmer
|
6
|
+
module DSL
|
7
|
+
module Opal
|
8
|
+
class TabFolderExpression < StaticExpression
|
9
|
+
include ParentExpression
|
10
|
+
|
11
|
+
def interpret(parent, keyword, *args, &block)
|
12
|
+
Glimmer::Opal::TabFolder.new(parent, args)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/dsl/parent_expression'
|
3
|
+
require 'glimmer/opal/tab_item'
|
4
|
+
|
5
|
+
module Glimmer
|
6
|
+
module DSL
|
7
|
+
module Opal
|
8
|
+
class TabItemExpression < StaticExpression
|
9
|
+
include ParentExpression
|
10
|
+
|
11
|
+
def interpret(parent, keyword, *args, &block)
|
12
|
+
Glimmer::Opal::TabItem.new(parent, args)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/dsl/parent_expression'
|
3
|
+
require 'glimmer/opal/table_column'
|
4
|
+
|
5
|
+
module Glimmer
|
6
|
+
module DSL
|
7
|
+
module Opal
|
8
|
+
class TableColumnExpression < StaticExpression
|
9
|
+
include ParentExpression
|
10
|
+
|
11
|
+
def interpret(parent, keyword, *args, &block)
|
12
|
+
Glimmer::Opal::TableColumn.new(parent, args)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'glimmer/dsl/static_expression'
|
2
|
+
require 'glimmer/dsl/parent_expression'
|
3
|
+
require 'glimmer/opal/table_proxy'
|
4
|
+
|
5
|
+
module Glimmer
|
6
|
+
module DSL
|
7
|
+
module Opal
|
8
|
+
class TableExpression < StaticExpression
|
9
|
+
include ParentExpression
|
10
|
+
|
11
|
+
def interpret(parent, keyword, *args, &block)
|
12
|
+
Glimmer::Opal::TableProxy.new(parent, args)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'glimmer/dsl/expression'
|
2
|
+
require 'glimmer/data_binding/model_binding'
|
3
|
+
require 'glimmer/data_binding/table_items_binding'
|
4
|
+
require 'glimmer/opal/table_proxy'
|
5
|
+
|
6
|
+
module Glimmer
|
7
|
+
module DSL
|
8
|
+
module Opal
|
9
|
+
#Depends on BindCommandHandler and TableColumnPropertiesDataBindingCommandHandler
|
10
|
+
class TableItemsDataBindingExpression < Expression
|
11
|
+
def can_interpret?(parent, keyword, *args, &block)
|
12
|
+
keyword == "items" and
|
13
|
+
block.nil? and
|
14
|
+
parent.is_a?(Glimmer::Opal::TableProxy) and
|
15
|
+
args.size == 2 and
|
16
|
+
args[0].is_a?(DataBinding::ModelBinding) and
|
17
|
+
args[0].evaluate_property.is_a?(Array) and
|
18
|
+
args[1].is_a?(Array)
|
19
|
+
end
|
20
|
+
|
21
|
+
def interpret(parent, keyword, *args, &block)
|
22
|
+
model_binding = args[0]
|
23
|
+
column_properties = args[1]
|
24
|
+
DataBinding::TableItemsBinding.new(parent, model_binding, column_properties)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Glimmer
|
2
|
+
module Opal
|
3
|
+
class DisplayProxy
|
4
|
+
class << self
|
5
|
+
def instance
|
6
|
+
@instance ||= new
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def async_exec(&block)
|
11
|
+
executer = lambda do
|
12
|
+
if $document.at_css('.modal')
|
13
|
+
sleep(0.05)
|
14
|
+
Async::Task.new(&executer)
|
15
|
+
else
|
16
|
+
block.call
|
17
|
+
end
|
18
|
+
end
|
19
|
+
Async::Task.new(&executer)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -3,14 +3,23 @@ require 'glimmer/opal/element_proxy'
|
|
3
3
|
module Glimmer
|
4
4
|
module Opal
|
5
5
|
class DivProxy < ElementProxy
|
6
|
+
attr_reader :layout
|
7
|
+
|
6
8
|
def initialize(parent, args)
|
7
9
|
super(parent, args)
|
8
|
-
GridLayoutProxy.new(self, [])
|
10
|
+
@layout = GridLayoutProxy.new(self, [])
|
11
|
+
end
|
12
|
+
|
13
|
+
def redraw
|
14
|
+
super()
|
15
|
+
@children.each do |child|
|
16
|
+
add_child(child) # TODO think of impact of this on performance, and of other alternatives
|
17
|
+
end
|
9
18
|
end
|
10
19
|
|
11
20
|
def dom
|
12
21
|
div_id = id
|
13
|
-
div_style =
|
22
|
+
div_style = css
|
14
23
|
@dom ||= DOM {
|
15
24
|
div(id: div_id, class: 'grid-layout', style: div_style)
|
16
25
|
}
|
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'glimmer/opal/element_proxy'
|
2
|
+
require 'glimmer/opal/point'
|
2
3
|
|
3
4
|
module Glimmer
|
4
5
|
module Opal
|
5
6
|
class DocumentProxy < ElementProxy
|
6
7
|
# TODO consider renaming to ShellProxy to match SWT API
|
8
|
+
attr_reader :minimum_size
|
7
9
|
|
8
10
|
def initialize(args)
|
9
11
|
@args = args
|
@@ -23,6 +25,11 @@ module Glimmer
|
|
23
25
|
$document.title = value
|
24
26
|
end
|
25
27
|
end
|
28
|
+
|
29
|
+
def minimum_size=(width_or_minimum_size, height = nil)
|
30
|
+
@minimum_size = height.nil? ? width_or_minimum_size : Point.new(width_or_minimum_size, height)
|
31
|
+
redraw
|
32
|
+
end
|
26
33
|
|
27
34
|
def head_dom
|
28
35
|
# TODO make grid-layout support grab excess space false
|
@@ -30,6 +37,19 @@ module Glimmer
|
|
30
37
|
head {
|
31
38
|
<<~CSS
|
32
39
|
<style>
|
40
|
+
html {
|
41
|
+
width: 100%;
|
42
|
+
height: 100%;
|
43
|
+
}
|
44
|
+
body {
|
45
|
+
width: 100%;
|
46
|
+
height: 100%;
|
47
|
+
margin: 0;
|
48
|
+
}
|
49
|
+
body > iframe {
|
50
|
+
width: 100%;
|
51
|
+
height: 100%;
|
52
|
+
}
|
33
53
|
ul {
|
34
54
|
list-style: none;
|
35
55
|
padding: 0;
|
@@ -39,13 +59,110 @@ module Glimmer
|
|
39
59
|
padding-left: 10px;
|
40
60
|
padding-right: 10px;
|
41
61
|
}
|
42
|
-
li.
|
62
|
+
li.empty-list-item {
|
63
|
+
color: transparent;
|
64
|
+
}
|
65
|
+
.tabs {
|
66
|
+
overflow: hidden;
|
67
|
+
border: 1px solid #ccc;
|
68
|
+
background-color: #f1f1f1;
|
69
|
+
}
|
70
|
+
|
71
|
+
/* Style the buttons inside the tab */
|
72
|
+
.tabs .tab {
|
73
|
+
background-color: inherit;
|
74
|
+
float: left;
|
75
|
+
border: none;
|
76
|
+
outline: none;
|
77
|
+
cursor: pointer;
|
78
|
+
padding: 14px 16px;
|
79
|
+
transition: 0.3s;
|
80
|
+
font-size: 17px;
|
81
|
+
}
|
82
|
+
|
83
|
+
/* Change background color of buttons on hover */
|
84
|
+
.tabs .tab:hover {
|
85
|
+
background-color: #ddd;
|
86
|
+
}
|
87
|
+
|
88
|
+
/* Create an active/current tablink class */
|
89
|
+
.tabs .tab.active {
|
90
|
+
background-color: #ccc;
|
91
|
+
}
|
92
|
+
|
93
|
+
/* Style the tab content */
|
94
|
+
.tab-item {
|
95
|
+
padding: 6px 12px;
|
96
|
+
border: 1px solid #ccc;
|
97
|
+
border-top: none;
|
98
|
+
}
|
99
|
+
|
100
|
+
.hide {
|
101
|
+
display: none !important;
|
102
|
+
}
|
103
|
+
|
104
|
+
/* The Modal (background) */
|
105
|
+
.modal {
|
106
|
+
position: fixed; /* Stay in place */
|
107
|
+
z-index: 1; /* Sit on top */
|
108
|
+
padding-top: 100px; /* Location of the box */
|
109
|
+
left: 0;
|
110
|
+
top: 0;
|
111
|
+
width: 100%; /* Full width */
|
112
|
+
height: 100%; /* Full height */
|
113
|
+
overflow: auto; /* Enable scroll if needed */
|
114
|
+
background-color: rgb(0,0,0); /* Fallback color */
|
115
|
+
background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
|
116
|
+
text-align: center;
|
117
|
+
}
|
118
|
+
|
119
|
+
/* Modal Content */
|
120
|
+
.modal-content {
|
121
|
+
background-color: #fefefe;
|
122
|
+
margin: auto;
|
123
|
+
border: 1px solid #888;
|
124
|
+
display: inline-block;
|
125
|
+
min-width: 200px;
|
126
|
+
}
|
127
|
+
|
128
|
+
.modal-content .text {
|
43
129
|
background: rgb(80, 116, 211);
|
44
130
|
color: white;
|
131
|
+
padding: 5px;
|
45
132
|
}
|
46
|
-
|
47
|
-
|
133
|
+
|
134
|
+
.modal-content .message {
|
135
|
+
padding: 20px;
|
48
136
|
}
|
137
|
+
|
138
|
+
/* The Close Button */
|
139
|
+
.close {
|
140
|
+
color: #aaaaaa;
|
141
|
+
float: right;
|
142
|
+
font-weight: bold;
|
143
|
+
margin: 5px;
|
144
|
+
}
|
145
|
+
|
146
|
+
.close:hover,
|
147
|
+
.close:focus {
|
148
|
+
color: #000;
|
149
|
+
text-decoration: none;
|
150
|
+
cursor: pointer;
|
151
|
+
}
|
152
|
+
|
153
|
+
.selected {
|
154
|
+
background: rgb(80, 116, 211);
|
155
|
+
color: white;
|
156
|
+
}
|
157
|
+
|
158
|
+
table {
|
159
|
+
border-spacing: 0;
|
160
|
+
}
|
161
|
+
|
162
|
+
table tr th,td {
|
163
|
+
cursor: default;
|
164
|
+
}
|
165
|
+
|
49
166
|
</style>
|
50
167
|
CSS
|
51
168
|
}
|
@@ -53,8 +170,11 @@ module Glimmer
|
|
53
170
|
end
|
54
171
|
|
55
172
|
def dom
|
173
|
+
i = 0
|
174
|
+
body_style = ''
|
175
|
+
body_style += "min-width: #{@minimum_size.x}px; min-height: #{@minimum_size.y}px;" if @minimum_size
|
56
176
|
@dom ||= DOM {
|
57
|
-
body {
|
177
|
+
body(style: body_style) {
|
58
178
|
}
|
59
179
|
}
|
60
180
|
end
|