44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# File 'lib/glimmer/dsl/opal/custom_widget_expression.rb', line 44
def interpret(parent, keyword, *args, &block)
begin
require_path = LocalStorage[keyword]
require(require_path) if require_path
rescue => e
Glimmer::Config.logger.debug e.message
end
custom_widget_class = UI::CustomWidget.for(keyword)
if !Glimmer::UI::CustomShell.requested? && custom_widget_class&.ancestors&.to_a.include?(Glimmer::UI::CustomShell)
if Glimmer::SWT::DisplayProxy.instance.shells.empty? || Glimmer::SWT::DisplayProxy.open_custom_shells_in_current_window?
custom_widget_class.new(parent, args, {}, &block)
else
options = args.last.is_a?(Hash) ? args.pop : {}
options = options.merge('swt_style' => args.join(',')) unless args.join(',').empty?
params = {
'custom_shell' => keyword
}.merge(options)
param_string = params.to_a.map {|k, v| "#{k}=#{URI.encode_www_form_component(v)}"}.join('&')
url = "#{`document.location.href`}?#{param_string}"
`window.open(#{url})`
Glimmer::SWT::MakeShiftShellProxy.new
end
else
if Glimmer::UI::CustomShell.requested_and_not_handled?
parameters = Glimmer::UI::CustomShell.request_parameter_string.split("&").map {|str| str.split("=")}.to_h
`history.pushState(#{parameters.merge('custom_shell_handled' => 'true')}, document.title, #{"?#{Glimmer::UI::CustomShell.encoded_request_parameter_string}&custom_shell_handled=true"})`
custom_shell_keyword = parameters.delete('custom_shell')
CustomWidgetExpression.new.interpret(nil, custom_shell_keyword, *[parameters])
`history.pushState(#{parameters.reject {|k,v| k == 'custom_shell_handled'}}, document.title, #{"?#{Glimmer::UI::CustomShell.encoded_request_parameter_string.sub('&custom_shell_handled=true', '')}"})`
Glimmer::SWT::MakeShiftShellProxy.new
else
custom_widget_class&.new(parent, args, {}, &block)
end
end
end
|