cuca 0.01 → 0.02
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.
- data/application_skeleton/app/index.rb +2 -2
- data/lib/cuca/app.rb +14 -1
- data/lib/cuca/const.rb +1 -1
- data/lib/cuca/controller.rb +62 -32
- data/lib/cuca/generator/view.rb +1 -1
- data/lib/cuca/session.rb +26 -4
- data/lib/cuca/sessionflash.rb +6 -3
- data/lib/cuca/sessionpage.rb +0 -1
- data/lib/cuca/stdlib/arform.rb +5 -11
- data/lib/cuca/stdlib/arview.rb +10 -2
- data/lib/cuca/stdlib/form.rb +1 -10
- data/lib/cuca/stdlib/link.rb +8 -1
- data/lib/cuca/stdlib/list.rb +0 -1
- data/lib/cuca/stdlib/listwidget/dblist.rb +4 -4
- data/lib/cuca/stdlib/listwidget/list.rb +36 -6
- data/lib/cuca/stdlib/listwidget/querydef.rb +14 -4
- data/lib/cuca/stdlib/listwidget/staticdatalist.rb +1 -0
- data/lib/cuca/stdlib/slink.rb +5 -2
- data/lib/cuca/widget.rb +7 -0
- metadata +2 -2
@@ -14,7 +14,7 @@ class IndexController < ApplicationController
|
|
14
14
|
br
|
15
15
|
text "Thank you for installing the cuca framework.";br;
|
16
16
|
br
|
17
|
-
h2 { "If you want to
|
17
|
+
h2 { "If you want to learn cuca" }
|
18
18
|
ul do
|
19
19
|
li { text "Have a look at the Demo Widgets: "; SLink('demo', 'Here') }
|
20
20
|
li { text "Checkout the cuca website: "; SLink("http://cuca.rubyforge.net") }
|
@@ -32,7 +32,7 @@ class IndexController < ApplicationController
|
|
32
32
|
end
|
33
33
|
br
|
34
34
|
h2 { "Good Luck..." }
|
35
|
-
text "If you like cuca use
|
35
|
+
text "If you like cuca use rubyforge to give any type of feedback."
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
data/lib/cuca/app.rb
CHANGED
@@ -20,6 +20,9 @@ class Sandbox
|
|
20
20
|
when 'GET'
|
21
21
|
controller.send('_do'.intern, 'get', subcall)
|
22
22
|
end
|
23
|
+
|
24
|
+
controller.run_after_filters
|
25
|
+
|
23
26
|
return controller.send(:to_s)
|
24
27
|
end
|
25
28
|
end
|
@@ -68,7 +71,7 @@ class App
|
|
68
71
|
self['session_key'] = 'cuca_session'
|
69
72
|
self['session_prefix'] = 'cuca.'
|
70
73
|
self['session_valid'] = 3600*24
|
71
|
-
self['
|
74
|
+
self['view_directory'] = 'app/_view' # where to find views for the view/erb generator
|
72
75
|
|
73
76
|
end
|
74
77
|
|
@@ -77,6 +80,7 @@ class App
|
|
77
80
|
attr_reader :conf, :cgi, :logger, :urlmap
|
78
81
|
|
79
82
|
@@app_config = Config.new
|
83
|
+
@@oncall = []
|
80
84
|
|
81
85
|
## Application configuration
|
82
86
|
public
|
@@ -88,6 +92,13 @@ class App
|
|
88
92
|
@@app_config
|
89
93
|
end
|
90
94
|
|
95
|
+
# if you should need to get notified on every
|
96
|
+
# (cgi)-call you can register a proc here.
|
97
|
+
# The SessionFlash/Page is makeing use of this
|
98
|
+
def self.oncall(&block)
|
99
|
+
@@oncall << block
|
100
|
+
end
|
101
|
+
|
91
102
|
|
92
103
|
# cgi implementation test
|
93
104
|
private
|
@@ -257,6 +268,8 @@ class App
|
|
257
268
|
return
|
258
269
|
end
|
259
270
|
|
271
|
+
# Notify who needs to know
|
272
|
+
@@oncall.each { |p| p.call }
|
260
273
|
|
261
274
|
# 3rd: Load additional files
|
262
275
|
load_support_files
|
data/lib/cuca/const.rb
CHANGED
data/lib/cuca/controller.rb
CHANGED
@@ -85,53 +85,83 @@ class Controller < Widget
|
|
85
85
|
attr_reader :cancel_execution # this can be set by anyone,
|
86
86
|
# methods get/post/run will not be executed
|
87
87
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
nil
|
93
|
-
end
|
88
|
+
|
89
|
+
# get layout
|
90
|
+
def self.def_layout
|
91
|
+
self.run_attr_method('def_layout_name')
|
94
92
|
end
|
95
93
|
|
94
|
+
# define a layout
|
96
95
|
def self.layout(name)
|
97
96
|
define_attr_method(:def_layout_name, name)
|
98
97
|
end
|
99
98
|
|
100
|
-
|
99
|
+
private
|
100
|
+
def self.define_filter_method(chain_name, method_name)
|
101
101
|
begin
|
102
|
-
filters = self.
|
103
|
-
filters = "#{filters};#{
|
104
|
-
define_attr_method(
|
105
|
-
rescue => e
|
106
|
-
define_attr_method(
|
102
|
+
filters = self.send(chain_name)
|
103
|
+
filters = "#{filters};#{method_name}"
|
104
|
+
define_attr_method(chain_name, filters)
|
105
|
+
rescue NoMethodError => e
|
106
|
+
define_attr_method(chain_name, method_name)
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
|
-
|
111
|
-
#
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
110
|
+
# One or more before filter can set by an application Controller
|
111
|
+
# The instance methods will be run before the action get ran (get/post/run)
|
112
|
+
public
|
113
|
+
def self.before_filter(method)
|
114
|
+
define_filter_method(:def_before_filter, method)
|
115
|
+
end
|
116
|
+
|
117
|
+
# Priority before filters will be ran before any before filters
|
118
|
+
# this should be only used internally
|
119
|
+
public
|
120
|
+
def self.priority_before_filter(method)
|
121
|
+
define_filter_method(:def_priority_before_filter, method)
|
122
|
+
end
|
123
|
+
|
124
|
+
# after_filter - get run after the controller action has be executed
|
125
|
+
public
|
126
|
+
def self.after_filter(method)
|
127
|
+
define_filter_method(:def_after_filter, method)
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
def run_filters(chain_name, debug_filter_names)
|
132
|
+
filters = self.class.run_attr_method(chain_name.to_s)
|
133
|
+
return if filters.nil?
|
134
|
+
filters.split(';').each do |filter|
|
135
|
+
next if filter.strip == ''
|
136
|
+
|
137
|
+
begin
|
138
|
+
if (!self.methods.include?(filter)) then
|
139
|
+
raise ApplicationException.new("Filter not found in chain #{debug_filter_names}: #{filter}")
|
140
|
+
end
|
141
|
+
# $stderr.puts "Running Filter (#{debug_filter_names}): #{filter}"
|
142
|
+
ret = self.send(filter.intern)
|
143
|
+
@cancel_execution = true if ret == false
|
144
|
+
rescue BreakControllerException => bc
|
129
145
|
handle_exception(bc)
|
130
|
-
|
146
|
+
end
|
131
147
|
end
|
132
148
|
end
|
133
149
|
|
134
150
|
|
151
|
+
# this will run defined before filters on a controller instance
|
152
|
+
public
|
153
|
+
def run_before_filters
|
154
|
+
run_filters(:def_priority_before_filter, 'Priority Before Filters')
|
155
|
+
run_filters(:def_before_filter, 'Before Filters')
|
156
|
+
end
|
157
|
+
|
158
|
+
# run defined after_filters
|
159
|
+
public
|
160
|
+
def run_after_filters
|
161
|
+
run_filters(:def_after_filter, 'After Filters')
|
162
|
+
end
|
163
|
+
|
164
|
+
|
135
165
|
# this method will stop execution of the controller
|
136
166
|
# it's usefull to break somewhere in the middle or to
|
137
167
|
# set a different layout
|
data/lib/cuca/generator/view.rb
CHANGED
@@ -86,7 +86,7 @@ module View
|
|
86
86
|
def viewtext(filename=nil)
|
87
87
|
view_dir = $cuca_path + '/' + App::config['view_directory']
|
88
88
|
begin
|
89
|
-
f = File.open(
|
89
|
+
f = File.open(view_dir + "/#{filename}", 'r')
|
90
90
|
rescue => e
|
91
91
|
return "Error opening template: #{e}"
|
92
92
|
end
|
data/lib/cuca/session.rb
CHANGED
@@ -86,6 +86,7 @@ class Session
|
|
86
86
|
make_session
|
87
87
|
end
|
88
88
|
|
89
|
+
|
89
90
|
# returns true/false if a session exists
|
90
91
|
def exists?
|
91
92
|
begin
|
@@ -126,18 +127,39 @@ class Session
|
|
126
127
|
@sess.close
|
127
128
|
end
|
128
129
|
|
130
|
+
def update
|
131
|
+
@sess.update
|
132
|
+
end
|
133
|
+
|
134
|
+
def delete
|
135
|
+
@sess.delete
|
136
|
+
end
|
137
|
+
|
138
|
+
|
129
139
|
end
|
130
140
|
|
131
|
-
class
|
141
|
+
class Controller
|
142
|
+
# This will create filters that initialize the session before the action and
|
143
|
+
# close it afterwards.
|
132
144
|
def self.use_session
|
133
|
-
|
145
|
+
priority_before_filter('ses_initialize_session')
|
146
|
+
after_filter('ses_close_session')
|
134
147
|
end
|
135
|
-
|
136
|
-
|
148
|
+
|
149
|
+
def ses_initialize_session
|
150
|
+
$session = Session.new($cgi)
|
151
|
+
end
|
152
|
+
def ses_close_session
|
153
|
+
$session.close
|
137
154
|
end
|
138
155
|
end
|
139
156
|
|
140
157
|
|
158
|
+
class Widget
|
159
|
+
def session
|
160
|
+
$session
|
161
|
+
end
|
162
|
+
end
|
141
163
|
|
142
164
|
end
|
143
165
|
|
data/lib/cuca/sessionflash.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
module Cuca
|
2
2
|
|
3
3
|
# Whatever you write into flash will be valid for the current and for the
|
4
|
-
# next
|
4
|
+
# next http request. You can keep the content for another cycle by calling the
|
5
5
|
# keep method. Access via session.flash. (See Cuca::Session)
|
6
6
|
class SessionFlash
|
7
|
-
class SessionFlashItem # :nodoc:
|
7
|
+
class SessionFlashItem # :nodoc:
|
8
8
|
def value
|
9
9
|
@value
|
10
10
|
end
|
@@ -49,7 +49,10 @@ class SessionFlash
|
|
49
49
|
|
50
50
|
private
|
51
51
|
def expire
|
52
|
-
flashmem.each_pair
|
52
|
+
flashmem.each_pair do |k,v|
|
53
|
+
v.inc
|
54
|
+
flashmem.delete(k) if v.expired?
|
55
|
+
end
|
53
56
|
end
|
54
57
|
end
|
55
58
|
|
data/lib/cuca/sessionpage.rb
CHANGED
data/lib/cuca/stdlib/arform.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'form'
|
1
|
+
require 'cuca/stdlib/form'
|
4
2
|
require 'cuca/generator/markaby'
|
5
3
|
|
6
4
|
# == Form's for ActiveRecord
|
7
5
|
# AR Form can work just by providing one model of ActiveRecord.
|
8
6
|
# Likly that you want to overwrite the form method to
|
9
7
|
# run a custom layout. You can use the fe* methods to
|
10
|
-
# build form elements for the model columns
|
8
|
+
# build form elements for the model columns definition.
|
9
|
+
#
|
10
|
+
# This Widget will call <form_name>_submit(model) if Form is submitted
|
11
|
+
# and validation passed. You still have to ::save the model.
|
11
12
|
#
|
12
13
|
# = Example:
|
13
14
|
#
|
@@ -43,15 +44,11 @@ class ARFormWidget < FormWidget
|
|
43
44
|
p.delete(@submit_name)
|
44
45
|
|
45
46
|
# don't save empty passwords!!
|
46
|
-
$stderr.puts "Before validate: #{@password_fields.inspect}"
|
47
47
|
@password_fields ||= []
|
48
48
|
@password_fields.each do |pwf|
|
49
|
-
$stderr.puts "PWS: #{pwf} - #{p[pwf]}"
|
50
49
|
p.delete(pwf) if p[pwf].chomp.empty?
|
51
|
-
$stderr.puts "PWS: #{p.inspect}"
|
52
50
|
end
|
53
51
|
|
54
|
-
$stderr.puts "ARFORM Validate #{p.inspect}"
|
55
52
|
@model.attributes = p
|
56
53
|
|
57
54
|
return true if @model.valid?
|
@@ -203,6 +200,3 @@ end
|
|
203
200
|
|
204
201
|
end
|
205
202
|
|
206
|
-
|
207
|
-
|
208
|
-
end
|
data/lib/cuca/stdlib/arview.rb
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
|
2
|
-
#
|
2
|
+
# == ARViewWidget - Display an ActiveRecord record.
|
3
|
+
#
|
4
|
+
# This is a small widget to quick&dirty display the content
|
5
|
+
# of a record.
|
6
|
+
#
|
7
|
+
# = Example
|
8
|
+
#
|
9
|
+
# mab { ARView(User.find(:id=>123)) }
|
10
|
+
#
|
3
11
|
class ARViewWidget < Cuca::Widget
|
4
12
|
|
5
|
-
def output(model
|
13
|
+
def output(model)
|
6
14
|
@model = model
|
7
15
|
|
8
16
|
r = "<table>"
|
data/lib/cuca/stdlib/form.rb
CHANGED
@@ -1,11 +1,3 @@
|
|
1
|
-
#
|
2
|
-
# == Cuca Standard Widget Library
|
3
|
-
# This namespace should contain a standard widget library.
|
4
|
-
#
|
5
|
-
# <b>Warning: The widgets you find here are fairly untested and might not work!!</b>
|
6
|
-
# Any request and patches - Welcome
|
7
|
-
# module Cuca::Stdlib
|
8
|
-
|
9
1
|
# == FormWidget
|
10
2
|
#
|
11
3
|
# To implement a form inherit this class and overwrite:
|
@@ -30,8 +22,7 @@ class FormWidget < Cuca::Widget
|
|
30
22
|
|
31
23
|
# get from params and set instance variables
|
32
24
|
def load_variables
|
33
|
-
|
34
|
-
params.each_pair { |k,v| instance_variable_set('@'+k, v) ; $stderr.puts "Form: Setting #{k} - #{v}" }
|
25
|
+
params.each_pair { |k,v| instance_variable_set('@'+k, v) }
|
35
26
|
end
|
36
27
|
|
37
28
|
# get from params and return them as hash
|
data/lib/cuca/stdlib/link.rb
CHANGED
@@ -1,7 +1,14 @@
|
|
1
1
|
require 'cuca/generator/markaby'
|
2
2
|
|
3
3
|
|
4
|
-
# A markaby link
|
4
|
+
# == A markaby link
|
5
|
+
# WARNING: This is a very slow way of creating a link. Better to use
|
6
|
+
# SLinkWidget if you call this many times per page!
|
7
|
+
#
|
8
|
+
# = Example:
|
9
|
+
#
|
10
|
+
# mab { Link('http://cuca.rubyforge.org') { b { "Click here" } }
|
11
|
+
#
|
5
12
|
class LinkWidget < Cuca::Widget
|
6
13
|
|
7
14
|
include Cuca::Generator::Markaby
|
data/lib/cuca/stdlib/list.rb
CHANGED
@@ -55,9 +55,8 @@ class DBListWidget < BaseList
|
|
55
55
|
ar_res.each do |r|
|
56
56
|
c = []
|
57
57
|
columns.each do |col|
|
58
|
-
|
59
|
-
|
60
|
-
c << r.send(col[:id].to_sym)
|
58
|
+
if r.attributes[col[:id]] then
|
59
|
+
c << r.send(col[:id].intern)
|
61
60
|
else
|
62
61
|
c << ''
|
63
62
|
end
|
@@ -69,7 +68,7 @@ class DBListWidget < BaseList
|
|
69
68
|
|
70
69
|
def query(query_def)
|
71
70
|
findstuff = {:conditions => where_clause(query_def) }
|
72
|
-
findstuff[:order] = query_def.order_by unless (query_def.order_by.nil? || query_def.order_by == '')
|
71
|
+
findstuff[:order] = "#{query_def.order_by} #{query_def.order}" unless (query_def.order_by.nil? || query_def.order_by == '')
|
73
72
|
findstuff[:offset] = query_def.range.first
|
74
73
|
findstuff[:limit] = query_def.range.last-query_def.range.first+1
|
75
74
|
findstuff[:joins] = @joins || nil
|
@@ -83,6 +82,7 @@ class DBListWidget < BaseList
|
|
83
82
|
@data = @model_class.find(:all, findstuff)
|
84
83
|
@data = normalize_result(@data)
|
85
84
|
@total_rows= @model_class.count(:conditions => where_clause(query_def), :joins => @joins)
|
85
|
+
|
86
86
|
# $stderr.puts "Query: #{@data.inspect} - #{query_def.order_by.inspect}"
|
87
87
|
end
|
88
88
|
|
@@ -46,17 +46,37 @@ class BaseList < Cuca::Widget
|
|
46
46
|
return
|
47
47
|
end
|
48
48
|
|
49
|
-
# TODO: Load from Session
|
49
|
+
# TODO: Load from Session?
|
50
50
|
def load_query_definition
|
51
51
|
qd = QueryDef.new(@list_name)
|
52
52
|
qd.from_params(params)
|
53
|
+
if request_method == 'POST' then
|
54
|
+
qd.range = nil # reset pagination if someone submitted a filter
|
55
|
+
end
|
56
|
+
qd
|
53
57
|
end
|
54
58
|
|
59
|
+
# check query_def was makes sense ... raise error if manipulated!
|
60
|
+
def check_query_def
|
61
|
+
# check if filters match possible column names
|
62
|
+
cn = columns.collect { |c| c[:id] }
|
63
|
+
@query_def.filters.each_pair do |f,v|
|
64
|
+
raise Cuca::ApplicationException.new("Unknown column in filters: #{f}") unless cn.include?(f)
|
65
|
+
end
|
66
|
+
|
67
|
+
return if @query_def.order_by == ''
|
68
|
+
# check if order_by is a valid column
|
69
|
+
raise Cuca::ApplicationException.new("Unknown sort order: #{@query_def.order_by}") \
|
70
|
+
unless cn.include?(@query_def.order_by)
|
71
|
+
end
|
72
|
+
|
55
73
|
def output(list_name)
|
56
74
|
@list_name = list_name
|
57
75
|
|
58
76
|
@columns = columns
|
59
77
|
@query_def = load_query_definition
|
78
|
+
check_query_def
|
79
|
+
# $stderr.puts "Query: Range #{@query_def.range.inspect} Filters: #{@query_def.filters.inspect} Order: #{@query_def.order.inspect} By: #{@query_def.order_by.inspect}"
|
60
80
|
query(@query_def)
|
61
81
|
@paginate = paginate_links()
|
62
82
|
@params = params
|
@@ -64,9 +84,8 @@ class BaseList < Cuca::Widget
|
|
64
84
|
|
65
85
|
callback_method = "#{@list_name}_data"
|
66
86
|
|
67
|
-
# $stderr.puts "Callback check: #{controller.nil?.inspect} \n\n -- #{controller.methods.sort.inspect} --\n\n NAME #{controller.class.inspect}"
|
68
87
|
if !controller.nil? && controller.methods.include?(callback_method)
|
69
|
-
controller.send(callback_method, @data)
|
88
|
+
controller.send(callback_method, @data, @total_rows)
|
70
89
|
end
|
71
90
|
|
72
91
|
view_p(erb_template)
|
@@ -119,8 +138,19 @@ end
|
|
119
138
|
|
120
139
|
<% @columns.each do |c| %>
|
121
140
|
<td class='hl'>
|
122
|
-
|
123
|
-
|
141
|
+
<%
|
142
|
+
# this will swap the sort order if the same columns is clicked
|
143
|
+
if @query_def.order_by == c[:id] then
|
144
|
+
order = @query_def.order == 'ASC' ? 'DESC' : 'ASC'
|
145
|
+
display = "#{c[:display]} (#{@query_def.order})"
|
146
|
+
else
|
147
|
+
order = 'ASC'
|
148
|
+
display = c[:display]
|
149
|
+
end
|
150
|
+
%>
|
151
|
+
<%= (c[:sortable] == false) ? display : SLink('',display,
|
152
|
+
@query_def.to_h('order_by', c[:id],
|
153
|
+
'order', order))
|
124
154
|
%>
|
125
155
|
</td>
|
126
156
|
<% end %>
|
@@ -156,7 +186,7 @@ ENDTEMPLATE
|
|
156
186
|
end
|
157
187
|
|
158
188
|
|
159
|
-
# This
|
189
|
+
# This was the old markaby template for the listwidget. I find it less readable so will not
|
160
190
|
# continue working on it.
|
161
191
|
#
|
162
192
|
#
|
@@ -3,7 +3,7 @@
|
|
3
3
|
#
|
4
4
|
# FIXME: Change name or put into namespace
|
5
5
|
class QueryDef
|
6
|
-
ATTRIBS = ['order_by','range', 'filters']
|
6
|
+
ATTRIBS = ['order_by', 'order','range', 'filters']
|
7
7
|
ATTRIBS_ENCODE =
|
8
8
|
{
|
9
9
|
'range' =>
|
@@ -15,6 +15,10 @@ class QueryDef
|
|
15
15
|
s = '';
|
16
16
|
e.each_pair { |k,v| s << "#{k}:#{v};" };
|
17
17
|
s
|
18
|
+
end,
|
19
|
+
'order' =>
|
20
|
+
Proc.new do |e|
|
21
|
+
['ASC', 'DESC'].include?(e) ? e : 'ASC'
|
18
22
|
end
|
19
23
|
}
|
20
24
|
ATTRIBS_DECODE =
|
@@ -31,10 +35,15 @@ class QueryDef
|
|
31
35
|
h[vals[0]] = vals[1] if (vals.size == 2)
|
32
36
|
end
|
33
37
|
h
|
34
|
-
end
|
38
|
+
end,
|
39
|
+
'order' =>
|
40
|
+
Proc.new do |e|
|
41
|
+
['ASC', 'DESC'].include?(e) ? e : 'ASC'
|
42
|
+
end
|
35
43
|
}
|
36
44
|
ATTRIBS_DEFAULTS = { 'range' => 0..9,
|
37
45
|
'order_by' => '',
|
46
|
+
'order' => 'ASC',
|
38
47
|
'filters' => {} }
|
39
48
|
|
40
49
|
# take from CGI class
|
@@ -54,7 +63,7 @@ class QueryDef
|
|
54
63
|
|
55
64
|
#getter
|
56
65
|
if (ATTRIBS.include?(met)) then
|
57
|
-
return @data[met] ||
|
66
|
+
return @data[met] || ATTRIBS_DEFAULTS[met].dup
|
58
67
|
end
|
59
68
|
|
60
69
|
#setter
|
@@ -103,10 +112,11 @@ class QueryDef
|
|
103
112
|
|
104
113
|
# returns an hash with the values and escaped names and attributes
|
105
114
|
# attr and newval with swap a value for this return without changing the actual data
|
106
|
-
def to_h(attr=nil, newval=nil)
|
115
|
+
def to_h(attr=nil, newval=nil, attr2=nil, newval2=nil)
|
107
116
|
if attr then
|
108
117
|
@backup = @data.dup
|
109
118
|
@data[attr] = newval
|
119
|
+
@data[attr2] = newval2 unless attr2.nil?
|
110
120
|
end
|
111
121
|
|
112
122
|
u = {}
|
@@ -60,6 +60,7 @@ class StaticDataListWidget < BaseList
|
|
60
60
|
cidx = col_idx_by_id(query_def.order_by) || 0
|
61
61
|
|
62
62
|
@data = @sd_data.sort { |a,b| a[cidx] <=> b[cidx] }
|
63
|
+
@data = @data.reverse if query_def.order == 'DESC'
|
63
64
|
apply_filters(query_def)
|
64
65
|
@total_rows = @data.size
|
65
66
|
@data = @data[query_def.range]
|
data/lib/cuca/stdlib/slink.rb
CHANGED
data/lib/cuca/widget.rb
CHANGED
@@ -207,6 +207,13 @@ class Widget
|
|
207
207
|
# $stderr.puts "def #{name}; #{value.to_s.inspect}; end"
|
208
208
|
end
|
209
209
|
|
210
|
+
# tries to run a class method if defined and return it
|
211
|
+
def self.run_attr_method(name)
|
212
|
+
return nil unless self.methods.include?(name)
|
213
|
+
self.send(name.intern)
|
214
|
+
end
|
215
|
+
|
216
|
+
|
210
217
|
end
|
211
218
|
|
212
219
|
end # Module
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cuca
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.02"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martin Boese
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-05-
|
12
|
+
date: 2008-05-11 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|