ydim-html 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.travis.yml +29 -0
  4. data/Gemfile +12 -0
  5. data/History.txt +11 -0
  6. data/LICENSE.txt +339 -0
  7. data/Manifest.txt +47 -0
  8. data/Rakefile +21 -0
  9. data/bin/ydim-htmld +38 -0
  10. data/doc/favicon.ico +0 -0
  11. data/doc/index.rbx +16 -0
  12. data/doc/resources/javascript/dojo.js +5940 -0
  13. data/doc/resources/javascript/iframe_history.html +53 -0
  14. data/doc/resources/javascript/ydim.js +67 -0
  15. data/doc/resources/ydim/ydim.css +113 -0
  16. data/lib/ydim/html.rb +10 -0
  17. data/lib/ydim/html/config.rb +37 -0
  18. data/lib/ydim/html/state/ajax_values.rb +17 -0
  19. data/lib/ydim/html/state/autoinvoice.rb +94 -0
  20. data/lib/ydim/html/state/confirm.rb +16 -0
  21. data/lib/ydim/html/state/debitor.rb +82 -0
  22. data/lib/ydim/html/state/debitors.rb +24 -0
  23. data/lib/ydim/html/state/global.rb +100 -0
  24. data/lib/ydim/html/state/global_predefine.rb +14 -0
  25. data/lib/ydim/html/state/init.rb +21 -0
  26. data/lib/ydim/html/state/invoice.rb +180 -0
  27. data/lib/ydim/html/state/invoices.rb +70 -0
  28. data/lib/ydim/html/state/pdf.rb +17 -0
  29. data/lib/ydim/html/util/lookandfeel.rb +133 -0
  30. data/lib/ydim/html/util/server.rb +37 -0
  31. data/lib/ydim/html/util/session.rb +29 -0
  32. data/lib/ydim/html/util/validator.rb +63 -0
  33. data/lib/ydim/html/version.rb +7 -0
  34. data/lib/ydim/html/view/ajax_values.rb +27 -0
  35. data/lib/ydim/html/view/autoinvoice.rb +80 -0
  36. data/lib/ydim/html/view/autoinvoices.rb +42 -0
  37. data/lib/ydim/html/view/confirm.rb +28 -0
  38. data/lib/ydim/html/view/debitor.rb +118 -0
  39. data/lib/ydim/html/view/debitors.rb +45 -0
  40. data/lib/ydim/html/view/htmlgrid.rb +104 -0
  41. data/lib/ydim/html/view/init.rb +30 -0
  42. data/lib/ydim/html/view/invoice.rb +218 -0
  43. data/lib/ydim/html/view/invoices.rb +159 -0
  44. data/lib/ydim/html/view/navigation.rb +29 -0
  45. data/lib/ydim/html/view/pdf.rb +24 -0
  46. data/lib/ydim/html/view/template.rb +71 -0
  47. data/readme.md +28 -0
  48. data/spec/smoketest_spec.rb +234 -0
  49. data/spec/spec_helper.rb +117 -0
  50. data/spec/stub/http_server.rb +157 -0
  51. data/test/selenium.rb +1690 -0
  52. data/test/selenium/selenium-server.jar +0 -0
  53. data/test/selenium/test_autoinvoice.rb +319 -0
  54. data/test/selenium/test_debitor.rb +344 -0
  55. data/test/selenium/test_debitors.rb +47 -0
  56. data/test/selenium/test_init.rb +105 -0
  57. data/test/selenium/test_invoice.rb +296 -0
  58. data/test/selenium/test_invoices.rb +176 -0
  59. data/test/selenium/unit.rb +125 -0
  60. data/test/stub/http_server.rb +141 -0
  61. data/test/suite.rb +15 -0
  62. data/ydim-html.gemspec +36 -0
  63. metadata +302 -0
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+ # Html::State::Debitors -- ydim -- 12.01.2006 -- hwyss@ywesee.com
4
+
5
+ require 'ydim/html/state/global_predefine'
6
+ require 'ydim/html/state/debitor'
7
+ require 'ydim/html/view/debitors'
8
+ require 'ydim/debitor'
9
+
10
+ module YDIM
11
+ module Html
12
+ module State
13
+ class Debitors < Global
14
+ VIEW = Html::View::Debitors
15
+ def init
16
+ lnf = @session.lookandfeel
17
+ @model = @session.debitors.sort_by do |deb|
18
+ [ lnf.lookup(deb.debitor_type) || '', deb.name.to_s.downcase ]
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+ # Html::State::Global -- ydim -- 12.01.2006 -- hwyss@ywesee.com
4
+
5
+ require 'sbsm/state'
6
+ require 'ydim/html/state/init'
7
+ require 'ydim/html/state/autoinvoice'
8
+ require 'ydim/html/state/debitor'
9
+ require 'ydim/html/state/debitors'
10
+ require 'ydim/html/state/invoice'
11
+ require 'ydim/html/state/invoices'
12
+ require 'ydim/html/state/pdf'
13
+
14
+ module YDIM
15
+ module Html
16
+ module State
17
+ class Global < SBSM::State
18
+ attr_accessor :sortby, :sort_reverse
19
+ class Stub
20
+ def initialize
21
+ @carry = {}
22
+ end
23
+ def carry(key, val)
24
+ @carry.store(key, val)
25
+ end
26
+ def method_missing(key, *args)
27
+ if(match = /^(.*)=$/.match(key.to_s))
28
+ @carry[match[1].to_sym] = args.first
29
+ else
30
+ @carry[key]
31
+ end
32
+ end
33
+ def respond_to?(key)
34
+ true
35
+ end
36
+ end
37
+ EVENT_MAP = {
38
+ :debitors => Debitors,
39
+ :invoices => Invoices,
40
+ }
41
+ def autoinvoice
42
+ if(id = @session.user_input(:unique_id))
43
+ AutoInvoice.new(@session, @session.autoinvoice(id))
44
+ end
45
+ end
46
+ def create_autoinvoice
47
+ _create_invoice(CreateAutoInvoice, nil)
48
+ end
49
+ def create_debitor
50
+ Debitor.new(@session, YDIM::Debitor.new(nil))
51
+ end
52
+ def create_invoice
53
+ _create_invoice(CreateInvoice)
54
+ end
55
+ def _create_invoice(nextclass, date=Date.today)
56
+ if((id = @session.user_input(:unique_id)) \
57
+ && (debitor = @session.debitor(id.to_i)))
58
+ invoice = Stub.new
59
+ invoice.carry(:debitor, debitor)
60
+ invoice.carry(:date, date)
61
+ invoice.carry(:precision, 2)
62
+ if debitor.foreign?
63
+ invoice.carry(:suppress_vat, true)
64
+ end
65
+ nextclass.new(@session, invoice)
66
+ end
67
+ end
68
+ def debitor
69
+ if(id = @session.user_input(:unique_id))
70
+ Debitor.new(@session, @session.debitor(id.to_i))
71
+ end
72
+ end
73
+ def logout
74
+ @session.logout
75
+ State::Init.new(@session, nil)
76
+ end
77
+ def invoice
78
+ if(id = @session.user_input(:unique_id))
79
+ Invoice.new(@session, @session.invoice(id.to_i))
80
+ end
81
+ end
82
+ def pdf
83
+ if(id = @session.user_input(:unique_id))
84
+ Pdf.new(@session, @session.invoice(id.to_i))
85
+ end
86
+ end
87
+ def send_invoice
88
+ if(id = @session.user_input(:unique_id))
89
+ sort_args = { :sortby => (@sortby || []).first,
90
+ :sort_reverse => @sort_reverse }
91
+ recipients = @session.send_invoice(id.to_i, sort_args)
92
+ message = @session.lookandfeel.lookup(:confirm_send_invoice,
93
+ recipients.join(', '))
94
+ Html::State::Confirm.new(@session, message)
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+ # Html::State::Global -- ydim -- 12.01.2006 -- hwyss@ywesee.com
4
+
5
+ require 'sbsm/state'
6
+
7
+ module YDIM
8
+ module Html
9
+ module State
10
+ class Global < SBSM::State
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+ # Html::State::Init -- ydim -- 12.01.2006 -- hwyss@ywesee.com
4
+
5
+ require 'ydim/html/state/debitors'
6
+ require 'ydim/html/view/init'
7
+
8
+ module YDIM
9
+ module Html
10
+ module State
11
+ class Init < SBSM::State
12
+ VIEW = Html::View::Init
13
+ def login
14
+ if(res = @session.login)
15
+ Debitors.new(@session, nil)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,180 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+ # Html::State::Invoice -- ydim -- 16.01.2006 -- hwyss@ywesee.com
4
+
5
+ require 'ydim/html/state/global_predefine'
6
+ require 'ydim/html/state/ajax_values'
7
+ require 'ydim/html/state/confirm'
8
+ require 'ydim/html/view/invoice'
9
+
10
+ module YDIM
11
+ module Html
12
+ module State
13
+ class AjaxItems < SBSM::State
14
+ VOLATILE = true
15
+ VIEW = Html::View::ItemList
16
+ end
17
+ class AjaxInvoice < SBSM::State
18
+ VOLATILE = true
19
+ VIEW = Html::View::InvoiceComposite
20
+ end
21
+ module InvoiceKeys
22
+ def invoice_key
23
+ :invoice
24
+ end
25
+ def invoice_keys
26
+ invoice_mandatory + [:precision, :suppress_vat]
27
+ end
28
+ def invoice_mandatory
29
+ [:description, :date, :currency]
30
+ end
31
+ end
32
+ class CreateInvoice < Global
33
+ include InvoiceKeys
34
+ VIEW = Html::View::Invoice
35
+ attr_reader :model
36
+ def update
37
+ _update(Invoice)
38
+ end
39
+ def _update(nextclass)
40
+ input = user_input(invoice_keys, invoice_mandatory)
41
+ input[:precision] = (input[:precision] || 2).to_i
42
+ unless(error?)
43
+ @model = @session.send("create_#{invoice_key}",
44
+ @model.debitor.unique_id)
45
+ @model.payment_period = 30
46
+ input.each { |key, val|
47
+ @model.send("#{key}=", val)
48
+ }
49
+ @model.odba_store
50
+ nextclass.new(@session, @model)
51
+ end
52
+ end
53
+ end
54
+ class Invoice < Global
55
+ include InvoiceKeys
56
+ class SortableInvoice
57
+ def initialize invoice
58
+ @invoice = invoice
59
+ end
60
+ def items
61
+ @items ||= @invoice.items
62
+ end
63
+ def reverse!
64
+ items.reverse!
65
+ end
66
+ def respond_to? *args
67
+ @invoice.respond_to?(*args) || super
68
+ end
69
+ def sort! &block
70
+ items.sort! &block
71
+ end
72
+ def update!
73
+ @items = nil
74
+ end
75
+ def method_missing name, *args, &block
76
+ @invoice.send name, *args, &block
77
+ end
78
+ end
79
+ VIEW = Html::View::Invoice
80
+ attr_reader :model
81
+ def init
82
+ @model = SortableInvoice.new @model
83
+ super
84
+ end
85
+ def ajax_create_item
86
+ if(id = @session.user_input(:unique_id))
87
+ begin
88
+ @session.add_items(id.to_i, [{:time => Time.now}], invoice_key)
89
+ rescue IndexError
90
+ end
91
+ @model.update! ## @model is a SortableInvoice
92
+ end
93
+ AjaxItems.new(@session, @model.items)
94
+ end
95
+ def ajax_delete_item
96
+ if((id = @session.user_input(:unique_id)) \
97
+ && (idx = @session.user_input(:index)))
98
+ begin
99
+ @session.delete_item(id.to_i, idx.to_i, invoice_key)
100
+ rescue IndexError
101
+ end
102
+ @model.update! ## @model is a SortableInvoice
103
+ end
104
+ AjaxItems.new(@session, @model.items)
105
+ end
106
+ def ajax_item
107
+ data = {}
108
+ if((id = @session.user_input(:unique_id)) \
109
+ && (idx = @session.user_input(:index)))
110
+ begin
111
+ keys = [:text, :quantity, :unit, :price]
112
+ input = user_input(keys).delete_if { |key, val| val.nil? }
113
+ item = @session.update_item(id.to_i, idx.to_i, input,
114
+ invoice_key)
115
+ input.each { |key, val| data.store("#{key}[#{item.index}]", val) }
116
+ data.store("total_netto#{item.index}", item.total_netto)
117
+ rescue IndexError
118
+ end
119
+ end
120
+ [:total_netto, :vat, :total_brutto].each { |key|
121
+ data.store(key, @model.send(key))
122
+ }
123
+ AjaxValues.new(@session, data)
124
+ end
125
+ def ajax_invoice
126
+ _do_update
127
+ AjaxInvoice.new(@session, @model)
128
+ end
129
+ def pdf
130
+ newstate = super
131
+ newstate.sortby, newstate.sort_reverse = @sortby, @sort_reverse
132
+ newstate
133
+ end
134
+ def send_invoice
135
+ _do_update
136
+ super
137
+ end
138
+ def update
139
+ _do_update
140
+ self
141
+ end
142
+ def _do_update
143
+ if((id = @session.user_input(:unique_id)) \
144
+ && @model.unique_id == id.to_i)
145
+ ## update items
146
+ keys = [:text, :quantity, :unit, :price]
147
+ data = {}
148
+ user_input(keys).each { |key, hash|
149
+ hash.each { |idx, value|
150
+ (data[idx] ||= {}).store(key, value)
151
+ } unless hash.nil?
152
+ }
153
+ target = origin = nil
154
+ converter = if((target = @session.user_input(:currency)) \
155
+ && (origin = @model.currency) \
156
+ && origin != target)
157
+ @session.currency_converter
158
+ end
159
+ data.each { |idx, item|
160
+ if(converter)
161
+ item[:price] = converter.convert(item[:price], origin, target)
162
+ end
163
+ @session.update_item(id.to_i, idx.to_i, item, invoice_key)
164
+ }
165
+
166
+ _do_update_invoice(user_input(invoice_keys, invoice_mandatory))
167
+ @model.update! ## @model is a SortableInvoice
168
+ @model.odba_store
169
+ end
170
+ end
171
+ def _do_update_invoice(input)
172
+ input[:precision] = (input[:precision] || 2).to_i
173
+ input.each { |key, val|
174
+ @model.send("#{key}=", val)
175
+ }
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+ # Html::State::Invoices -- ydim -- 13.01.2006 -- hwyss@ywesee.com
4
+
5
+ require 'ydim/html/state/global_predefine'
6
+ require 'ydim/html/view/invoices'
7
+
8
+ module YDIM
9
+ module Html
10
+ module State
11
+ class AjaxInvoices < SBSM::State
12
+ VOLATILE = true
13
+ VIEW = Html::View::InvoiceList
14
+ end
15
+ module AjaxInvoiceMethods
16
+ def ajax_invoices(model=@model)
17
+ keys = [:payment_received, :unique_id, :deleted]
18
+ input = user_input(keys, [:unique_id])
19
+ id = input.delete(:unique_id).to_i
20
+ if(!error? && !input.empty? && (invoice = @session.invoice(id)))
21
+ input.each { |key, val|
22
+ invoice.send("#{key}=", val)
23
+ }
24
+ invoice.odba_store
25
+ model.delete_if { |info| info.unique_id == id }
26
+ end
27
+ AjaxInvoices.new(@session, model)
28
+ end
29
+ def ajax_status
30
+ AjaxInvoices.new(@session, load_invoices)
31
+ end
32
+ def currency_convert(invoices)
33
+ currency = Html.config.currency
34
+ converter = @session.currency_converter
35
+ invoices.each { |inv|
36
+ if(icur = inv.currency)
37
+ inv.total_netto = converter.convert(inv.total_netto, icur, currency)
38
+ inv.total_brutto = converter.convert(inv.total_brutto, icur, currency)
39
+ end
40
+ inv.currency = currency
41
+ }
42
+ end
43
+ def sort_invoices(invoices)
44
+ null_date = Date.new(9999)
45
+ invoices.sort_by { |inv|
46
+ [null_date - (inv.date || null_date), inv.description.to_s]
47
+ }
48
+ end
49
+ end
50
+ class Invoices < Global
51
+ include AjaxInvoiceMethods
52
+ VIEW = Html::View::Invoices
53
+ def init
54
+ super
55
+ invs = @session.invoice_infos('is_open')
56
+ invs.concat @session.invoice_infos('is_due')
57
+ @model = sort_invoices(currency_convert(invs))
58
+ end
59
+ def ajax_collect_garbage
60
+ @session.collect_garbage
61
+ AjaxInvoices.new(@session, [])
62
+ end
63
+ private
64
+ def load_invoices
65
+ @model = sort_invoices(currency_convert(@session.invoices))
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+ # Html::State::Pdf -- ydim -- 17.01.2006 -- hwyss@ywesee.com
4
+
5
+ require 'ydim/html/view/pdf'
6
+
7
+ module YDIM
8
+ module Html
9
+ module State
10
+ class Pdf < SBSM::State
11
+ VOLATILE = true
12
+ VIEW = Html::View::Pdf
13
+ attr_accessor :sortby, :sort_reverse
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+ # Html::Custom::Lookandfeel -- ydim -- 12.01.2006 -- hwyss@ywesee.com
4
+
5
+ require 'sbsm/lookandfeel'
6
+
7
+ module YDIM
8
+ module Html
9
+ module Custom
10
+ class Lookandfeel < SBSM::Lookandfeel
11
+ DICTIONARIES = {
12
+ 'de' => {
13
+ :address_lines => 'Strasse/Nr.',
14
+ :autoinvoices => 'Vorlagen',
15
+ :CHF => 'CHF',
16
+ :collect_garbage => 'Papierkorb Leeren',
17
+ :comma => ', ',
18
+ :confirm_send_invoice0 => 'Die Rechnung wurde an folgende Email-Adressen verschickt: ',
19
+ :confirm_send_invoice1 => '.',
20
+ :contact => 'Name',
21
+ :contact_firstname => 'Vorname',
22
+ :contact_title => 'Titel',
23
+ :country => 'Land',
24
+ :cpr_link => ' ywesee GmbH',
25
+ :create_debitor => 'Neuer Kunde',
26
+ :create_autoinvoice => 'Neue Vorlage',
27
+ :create_invoice => 'Neue Rechnung',
28
+ :create_item => 'Neue Position',
29
+ :currency => 'W&auml;hrung',
30
+ :dash => '&nbsp;&ndash;&nbsp;',
31
+ :date => 'Rechnungsdatum',
32
+ :date_format => '%d.%m.%Y',
33
+ :debitors => 'Kunden',
34
+ :debitor_name => 'Kunde',
35
+ :debitor_type => 'Kundenart',
36
+ :delete => 'Löschen',
37
+ :description => 'Beschreibung',
38
+ :dt_consulting => 'Beratung',
39
+ :dt_doctor => 'Arzt',
40
+ :dt_health => 'Gesundheitsdienstleister',
41
+ :dt_hospital => 'Spital',
42
+ :dt_hosting => 'Hosting-Kunde',
43
+ :dt_info => 'ODDB.org-User',
44
+ :dt_insurance => 'Krankenkasse',
45
+ :dt_pharma => 'Pharma-Firma',
46
+ :dt_pharmacy => 'Apotheke',
47
+ :e_domainless_email_address => 'Wir akzeptieren keine lokalen Email-Adressen.',
48
+ :e_invalid_email_address => 'Die angegebene Email-Adresse ist ungültig.',
49
+ :e_invalid_numeric_format => 'Ungültiges Zahlenformat',
50
+ :e_invalid_phone => 'Die angegebene Telefonnummer ist ungültig.',
51
+ :e_too_many_emails => 'Es sind maximal 3 Email-Adressen erlaubt.',
52
+ :email => 'Email',
53
+ :emails => 'Email (max. 3)',
54
+ :e_bygone_date => 'Bitte geben Sie ein Datum an, welches in der Zukuft liegt.',
55
+ :e_missing0 => 'Bitte geben Sie das Feld "',
56
+ :e_missing1 => '" an.',
57
+ :EUR => 'EUR',
58
+ :Frau => 'Frau',
59
+ :generate_invoice => 'Generieren',
60
+ :Herr => 'Herr',
61
+ :html_title => 'YDIM',
62
+ :invoice_interval => 'Rechnungs-Intervall',
63
+ :inv_m => 'Nur Manuell',
64
+ :inv_3 => 'Vierteljährlich',
65
+ :inv_6 => 'Halbjährlich',
66
+ :inv_12 => 'Jährlich',
67
+ :inv_24 => 'Alle zwei Jahre',
68
+ :invoices => 'Rechnungen',
69
+ :is_due => 'F&auml;llige Rechnungen',
70
+ :is_open => 'Offene Rechnungen',
71
+ :is_paid => 'Bezahlte Rechnungen',
72
+ :is_trash => 'Papierkorb',
73
+ :lgpl_license => 'LGPL',
74
+ :location => 'PLZ/Ort',
75
+ :login => 'Login',
76
+ :logout => 'Logout',
77
+ :name => 'Firma',
78
+ :pass => 'Passwort',
79
+ :payment_period0 => ' Zahlbar in ',
80
+ :payment_period1 => ' Tagen',
81
+ :pdf => 'PDF',
82
+ :phone => 'Telefon',
83
+ :precision => 'Kommastellen',
84
+ :reminder_body => 'Erinnerungsmail Text',
85
+ :reminder_date => 'Wird am %d.%m.%Y versendet',
86
+ :reminder_none => 'Es wird kein Erinnerungsmail versendet',
87
+ :reminder_subject => 'Erinnerungsmail Betreff',
88
+ :salutation => 'Anrede',
89
+ :send_invoice => 'Email Senden',
90
+ :suppress_vat => 'OHNE MwSt.',
91
+ :th_currency => 'W&auml;hrung',
92
+ :th_debitor_email => 'Email',
93
+ :th_debitor_name => 'Name',
94
+ :th_debitor_type => 'Kundenart',
95
+ :th_description => 'Beschreibung',
96
+ :th_domain => 'Domain',
97
+ :th_email => 'Email',
98
+ :th_formatted_date => 'Datum',
99
+ :th_name => 'Name',
100
+ :th_next_invoice_date => 'Nächste Rechnung',
101
+ :th_phone => 'Telefon',
102
+ :th_price => 'Preis',
103
+ :th_quantity => 'Anzahl',
104
+ :th_text => 'Positionstext',
105
+ :th_time => 'Zeit',
106
+ :th_toggle_payment_received => 'Status',
107
+ :th_total_brutto => 'Brutto',
108
+ :th_total_netto => 'Netto',
109
+ :th_unique_id => 'ID',
110
+ :th_unit => 'Einheit',
111
+ :time_format => '%d.%m.%Y %H:%M',
112
+ :toggle_deleted => 'löschen',
113
+ :toggle_paid => 'offen',
114
+ :toggle_recovered => 'wiederherstellen',
115
+ :toggle_unpaid => 'bezahlt',
116
+ :total => 'Total',
117
+ :total_brutto => 'Total Brutto',
118
+ :total_netto => 'Total Netto',
119
+ :unique_id => 'ID',
120
+ :update => 'Speichern',
121
+ :vat => 'MwSt. (8.0%)',
122
+ :ydim => 'YDIM',
123
+ :ydim_version => 'Commit-ID',
124
+ },
125
+ }
126
+ RESOURCES = {
127
+ :css => 'ydim.css',
128
+ :javascript => 'javascript',
129
+ }
130
+ end
131
+ end
132
+ end
133
+ end