recurring_select 3.0.1 → 4.0.0.rc1

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.
@@ -1,372 +0,0 @@
1
- window.RecurringSelectDialog =
2
- class RecurringSelectDialog
3
- constructor: (@recurring_selector) ->
4
- @current_rule = @recurring_selector.recurring_select('current_rule')
5
- @initDialogBox()
6
- if not @current_rule.hash? or not @current_rule.hash.rule_type?
7
- @freqChanged()
8
- else
9
- setTimeout @positionDialogVert, 10 # allow initial render
10
-
11
- initDialogBox: ->
12
- $(".rs_dialog_holder").remove()
13
-
14
- open_in = $("body")
15
- open_in = $(".ui-page-active") if $(".ui-page-active").length
16
- open_in.append @template()
17
- @outer_holder = $(".rs_dialog_holder")
18
- @inner_holder = @outer_holder.find ".rs_dialog"
19
- @content = @outer_holder.find ".rs_dialog_content"
20
- @positionDialogVert(true)
21
- @mainEventInit()
22
- @freqInit()
23
- @summaryInit()
24
- @outer_holder.trigger "recurring_select:dialog_opened"
25
- @freq_select.focus()
26
-
27
- positionDialogVert: (initial_positioning) =>
28
- window_height = $(window).height()
29
- window_width = $(window).width()
30
- dialog_height = @content.outerHeight()
31
- if dialog_height < 80
32
- dialog_height = 80
33
- margin_top = (window_height - dialog_height)/2 - 30
34
- margin_top = 10 if margin_top < 10
35
- # if dialog_height > window_height - 20
36
- # dialog_height = window_height - 20
37
-
38
- new_style_hash =
39
- "margin-top" : margin_top+"px"
40
- "min-height" : dialog_height+"px"
41
-
42
- if initial_positioning?
43
- @inner_holder.css new_style_hash
44
- @inner_holder.trigger "recurring_select:dialog_positioned"
45
- else
46
- @inner_holder.addClass "animated"
47
- @inner_holder.animate new_style_hash, 200, =>
48
- @inner_holder.removeClass "animated"
49
- @content.css {"width": "auto"}
50
- @inner_holder.trigger "recurring_select:dialog_positioned"
51
-
52
- cancel: =>
53
- @outer_holder.remove()
54
- @recurring_selector.recurring_select('cancel')
55
-
56
- outerCancel: (event) =>
57
- if $(event.target).hasClass("rs_dialog_holder")
58
- @cancel()
59
-
60
- save: =>
61
- return if !@current_rule.str?
62
- @outer_holder.remove()
63
- @recurring_selector.recurring_select('save', @current_rule)
64
-
65
- # ========================= Init Methods ===============================
66
-
67
- mainEventInit: ->
68
- # Tap hooks are for jQueryMobile
69
- @outer_holder.on 'click tap', @outerCancel
70
- @content.on 'click tap', 'h1 a', @cancel
71
- @save_button = @content.find('input.rs_save').on "click tap", @save
72
- @content.find('input.rs_cancel').on "click tap", @cancel
73
-
74
- freqInit: ->
75
- @freq_select = @outer_holder.find ".rs_frequency"
76
- if @current_rule.hash? && (rule_type = @current_rule.hash.rule_type)?
77
- if rule_type.search(/Weekly/) != -1
78
- @freq_select.prop('selectedIndex', 1)
79
- @initWeeklyOptions()
80
- else if rule_type.search(/Monthly/) != -1
81
- @freq_select.prop('selectedIndex', 2)
82
- @initMonthlyOptions()
83
- else if rule_type.search(/Yearly/) != -1
84
- @freq_select.prop('selectedIndex', 3)
85
- @initYearlyOptions()
86
- else
87
- @initDailyOptions()
88
- @freq_select.on "change", @freqChanged
89
-
90
- initDailyOptions: ->
91
- section = @content.find('.daily_options')
92
- interval_input = section.find('.rs_daily_interval')
93
- interval_input.val(@current_rule.hash.interval)
94
- interval_input.on "change keyup", @intervalChanged
95
- section.show()
96
-
97
- initWeeklyOptions: ->
98
- section = @content.find('.weekly_options')
99
-
100
- # connect the interval field
101
- interval_input = section.find('.rs_weekly_interval')
102
- interval_input.val(@current_rule.hash.interval)
103
- interval_input.on "change keyup", @intervalChanged
104
-
105
- # clear selected days
106
- section.find(".day_holder a").each (index, element) ->
107
- $(element).removeClass("selected")
108
-
109
- # connect the day fields
110
- if @current_rule.hash.validations? && @current_rule.hash.validations.day?
111
- $(@current_rule.hash.validations.day).each (index, val) ->
112
- section.find(".day_holder a[data-value='"+val+"']").addClass("selected")
113
-
114
- section.off('click', '.day_holder a').on "click", ".day_holder a", @daysChanged
115
-
116
- section.show()
117
-
118
- initMonthlyOptions: ->
119
- section = @content.find('.monthly_options')
120
- interval_input = section.find('.rs_monthly_interval')
121
- interval_input.val(@current_rule.hash.interval)
122
- interval_input.on "change keyup", @intervalChanged
123
-
124
- @current_rule.hash.validations ||= {}
125
- @current_rule.hash.validations.day_of_month ||= []
126
- @current_rule.hash.validations.day_of_week ||= {}
127
- @init_calendar_days(section)
128
- @init_calendar_weeks(section)
129
-
130
- in_week_mode = Object.keys(@current_rule.hash.validations.day_of_week).length > 0
131
- section.find(".monthly_rule_type_week").prop("checked", in_week_mode)
132
- section.find(".monthly_rule_type_day").prop("checked", !in_week_mode)
133
- @toggle_month_view()
134
- section.find("input[name=monthly_rule_type]").on "change", @toggle_month_view
135
- section.show()
136
-
137
- initYearlyOptions: ->
138
- section = @content.find('.yearly_options')
139
- interval_input = section.find('.rs_yearly_interval')
140
- interval_input.val(@current_rule.hash.interval)
141
- interval_input.on "change keyup", @intervalChanged
142
- section.show()
143
-
144
-
145
- summaryInit: ->
146
- @summary = @outer_holder.find(".rs_summary")
147
- @summaryUpdate()
148
-
149
- # ========================= render methods ===============================
150
-
151
- summaryUpdate: (new_string) =>
152
- @summary.width @content.width()
153
- if @current_rule.hash? && @current_rule.str?
154
- @summary.removeClass "fetching"
155
- @save_button.removeClass("disabled")
156
- rule_str = @current_rule.str.replace("*", "")
157
- if rule_str.length < 20
158
- rule_str = "#{$.fn.recurring_select.texts["summary"]}: "+rule_str
159
- @summary.find("span").html rule_str
160
- else
161
- @summary.addClass "fetching"
162
- @save_button.addClass("disabled")
163
- @summary.find("span").html ""
164
- @summaryFetch()
165
-
166
- summaryFetch: ->
167
- return if !(@current_rule.hash? && (rule_type = @current_rule.hash.rule_type)?)
168
- @current_rule.hash['week_start'] = $.fn.recurring_select.texts["first_day_of_week"]
169
- $.ajax
170
- url: "<%= Rails.application.config.action_controller.relative_url_root %>/recurring_select/translate/#{$.fn.recurring_select.texts["locale_iso_code"]}",
171
- type: "POST",
172
- data: @current_rule.hash
173
- success: @summaryFetchSuccess
174
-
175
- summaryFetchSuccess: (data) =>
176
- @current_rule.str = data
177
- @summaryUpdate()
178
- @content.css {"width": "auto"}
179
-
180
- init_calendar_days: (section) =>
181
- monthly_calendar = section.find(".rs_calendar_day")
182
- monthly_calendar.html ""
183
- for num in [1..31]
184
- monthly_calendar.append (day_link = $(document.createElement("a")).text(num))
185
- if $.inArray(num, @current_rule.hash.validations.day_of_month) != -1
186
- day_link.addClass("selected")
187
-
188
- # add last day of month button
189
- monthly_calendar.append (end_of_month_link = $(document.createElement("a")).text($.fn.recurring_select.texts["last_day"]))
190
- end_of_month_link.addClass("end_of_month")
191
- if $.inArray(-1, @current_rule.hash.validations.day_of_month) != -1
192
- end_of_month_link.addClass("selected")
193
-
194
- monthly_calendar.find("a").on "click tap", @dateOfMonthChanged
195
-
196
- init_calendar_weeks: (section) =>
197
- monthly_calendar = section.find(".rs_calendar_week")
198
- monthly_calendar.html ""
199
- row_labels = $.fn.recurring_select.texts["order"]
200
- show_row = $.fn.recurring_select.options["monthly"]["show_week"]
201
- cell_str = $.fn.recurring_select.texts["days_first_letter"]
202
-
203
- for num, index in [1, 2, 3, 4, 5, -1]
204
- if show_row[index]
205
- monthly_calendar.append "<span>#{row_labels[num - 1]}</span>"
206
- for day_of_week in [$.fn.recurring_select.texts["first_day_of_week"]...(7 + $.fn.recurring_select.texts["first_day_of_week"])]
207
- day_of_week = day_of_week % 7
208
- day_link = $("<a>", {text: cell_str[day_of_week] })
209
- day_link.attr("day", day_of_week)
210
- day_link.attr("instance", num)
211
- monthly_calendar.append day_link
212
-
213
- $.each @current_rule.hash.validations.day_of_week, (key, value) ->
214
- $.each value, (index, instance) ->
215
- section.find("a[day='#{key}'][instance='#{instance}']").addClass("selected")
216
- monthly_calendar.find("a").on "click tap", @weekOfMonthChanged
217
-
218
- toggle_month_view: =>
219
- week_mode = @content.find(".monthly_rule_type_week").prop("checked")
220
- @content.find(".rs_calendar_week").toggle(week_mode)
221
- @content.find(".rs_calendar_day").toggle(!week_mode)
222
-
223
- # ========================= Change callbacks ===============================
224
-
225
- freqChanged: =>
226
- @current_rule.hash = null unless $.isPlainObject(@current_rule.hash) # for custom values
227
-
228
- @current_rule.hash ||= {}
229
- @current_rule.hash.interval = 1
230
- @current_rule.hash.until = null
231
- @current_rule.hash.count = null
232
- @current_rule.hash.validations = null
233
- @content.find(".freq_option_section").hide();
234
- @content.find("input[type=radio], input[type=checkbox]").prop("checked", false)
235
- switch @freq_select.val()
236
- when "Weekly"
237
- @current_rule.hash.rule_type = "IceCube::WeeklyRule"
238
- @current_rule.str = $.fn.recurring_select.texts["weekly"]
239
- @initWeeklyOptions()
240
- when "Monthly"
241
- @current_rule.hash.rule_type = "IceCube::MonthlyRule"
242
- @current_rule.str = $.fn.recurring_select.texts["monthly"]
243
- @initMonthlyOptions()
244
- when "Yearly"
245
- @current_rule.hash.rule_type = "IceCube::YearlyRule"
246
- @current_rule.str = $.fn.recurring_select.texts["yearly"]
247
- @initYearlyOptions()
248
- else
249
- @current_rule.hash.rule_type = "IceCube::DailyRule"
250
- @current_rule.str = $.fn.recurring_select.texts["daily"]
251
- @initDailyOptions()
252
- @summaryUpdate()
253
- @positionDialogVert()
254
-
255
- intervalChanged: (event) =>
256
- @current_rule.str = null
257
- @current_rule.hash ||= {}
258
- @current_rule.hash.interval = parseInt($(event.currentTarget).val())
259
- if @current_rule.hash.interval < 1 || isNaN(@current_rule.hash.interval)
260
- @current_rule.hash.interval = 1
261
- @summaryUpdate()
262
-
263
- daysChanged: (event) =>
264
- $(event.currentTarget).toggleClass("selected")
265
- @current_rule.str = null
266
- @current_rule.hash ||= {}
267
- @current_rule.hash.validations = {}
268
- raw_days = @content.find(".day_holder a.selected").map -> parseInt($(this).data("value"))
269
- @current_rule.hash.validations.day = raw_days.get()
270
- @summaryUpdate()
271
- false # this prevents default and propogation
272
-
273
- dateOfMonthChanged: (event) =>
274
- $(event.currentTarget).toggleClass("selected")
275
- @current_rule.str = null
276
- @current_rule.hash ||= {}
277
- @current_rule.hash.validations = {}
278
- raw_days = @content.find(".monthly_options .rs_calendar_day a.selected").map ->
279
- res = if $(this).text() == $.fn.recurring_select.texts["last_day"] then -1 else parseInt($(this).text())
280
- res
281
- @current_rule.hash.validations.day_of_week = {}
282
- @current_rule.hash.validations.day_of_month = raw_days.get()
283
- @summaryUpdate()
284
- false
285
-
286
- weekOfMonthChanged: (event) =>
287
- $(event.currentTarget).toggleClass("selected")
288
- @current_rule.str = null
289
- @current_rule.hash ||= {}
290
- @current_rule.hash.validations = {}
291
- @current_rule.hash.validations.day_of_month = []
292
- @current_rule.hash.validations.day_of_week = {}
293
- @content.find(".monthly_options .rs_calendar_week a.selected").each (index, elm) =>
294
- day = parseInt($(elm).attr("day"))
295
- instance = parseInt($(elm).attr("instance"))
296
- @current_rule.hash.validations.day_of_week[day] ||= []
297
- @current_rule.hash.validations.day_of_week[day].push instance
298
- @summaryUpdate()
299
- false
300
-
301
- # ========================= Change callbacks ===============================
302
-
303
- template: () ->
304
- str = "
305
- <div class='rs_dialog_holder'>
306
- <div class='rs_dialog'>
307
- <div class='rs_dialog_content'>
308
- <h1>#{$.fn.recurring_select.texts["repeat"]} <a href='#' title='#{$.fn.recurring_select.texts["cancel"]}' Alt='#{$.fn.recurring_select.texts["cancel"]}'></a> </h1>
309
- <p class='frequency-select-wrapper'>
310
- <label for='rs_frequency'>#{$.fn.recurring_select.texts["frequency"]}:</label>
311
- <select data-wrapper-class='ui-recurring-select' id='rs_frequency' class='rs_frequency' name='rs_frequency'>
312
- <option value='Daily'>#{$.fn.recurring_select.texts["daily"]}</option>
313
- <option value='Weekly'>#{$.fn.recurring_select.texts["weekly"]}</option>
314
- <option value='Monthly'>#{$.fn.recurring_select.texts["monthly"]}</option>
315
- <option value='Yearly'>#{$.fn.recurring_select.texts["yearly"]}</option>
316
- </select>
317
- </p>
318
-
319
- <div class='daily_options freq_option_section'>
320
- <p>
321
- #{$.fn.recurring_select.texts["every"]}
322
- <input type='text' data-wrapper-class='ui-recurring-select' name='rs_daily_interval' class='rs_daily_interval rs_interval' value='1' size='2' />
323
- #{$.fn.recurring_select.texts["days"]}
324
- </p>
325
- </div>
326
- <div class='weekly_options freq_option_section'>
327
- <p>
328
- #{$.fn.recurring_select.texts["every"]}
329
- <input type='text' data-wrapper-class='ui-recurring-select' name='rs_weekly_interval' class='rs_weekly_interval rs_interval' value='1' size='2' />
330
- #{$.fn.recurring_select.texts["weeks_on"]}:
331
- </p>
332
- <div class='day_holder'>
333
- "
334
- for day_of_week in [$.fn.recurring_select.texts["first_day_of_week"]...(7 + $.fn.recurring_select.texts["first_day_of_week"])]
335
- day_of_week = day_of_week % 7
336
- str += "<a href='#' data-value='#{day_of_week}'>#{$.fn.recurring_select.texts["days_first_letter"][day_of_week]}</a>"
337
-
338
- str += "
339
- </div>
340
- <span style='clear:both; visibility:hidden; height:1px;'>.</span>
341
- </div>
342
- <div class='monthly_options freq_option_section'>
343
- <p>
344
- #{$.fn.recurring_select.texts["every"]}
345
- <input type='text' data-wrapper-class='ui-recurring-select' name='rs_monthly_interval' class='rs_monthly_interval rs_interval' value='1' size='2' />
346
- #{$.fn.recurring_select.texts["months"]}:
347
- </p>
348
- <p class='monthly_rule_type'>
349
- <span><label for='monthly_rule_type_day'>#{$.fn.recurring_select.texts["day_of_month"]}</label><input type='radio' class='monthly_rule_type_day' name='monthly_rule_type' id='monthly_rule_type_day' value='true' /></span>
350
- <span><label for='monthly_rule_type_week'>#{$.fn.recurring_select.texts["day_of_week"]}</label><input type='radio' class='monthly_rule_type_week' name='monthly_rule_type' id='monthly_rule_type_week' value='true' /></span>
351
- </p>
352
- <p class='rs_calendar_day'></p>
353
- <p class='rs_calendar_week'></p>
354
- </div>
355
- <div class='yearly_options freq_option_section'>
356
- <p>
357
- #{$.fn.recurring_select.texts["every"]}
358
- <input type='text' data-wrapper-class='ui-recurring-select' name='rs_yearly_interval' class='rs_yearly_interval rs_interval' value='1' size='2' />
359
- #{$.fn.recurring_select.texts["years"]}
360
- </p>
361
- </div>
362
- <p class='rs_summary'>
363
- <span></span>
364
- </p>
365
- <div class='controls'>
366
- <input type='button' data-wrapper-class='ui-recurring-select' class='rs_save' value='#{$.fn.recurring_select.texts["ok"]}' />
367
- <input type='button' data-wrapper-class='ui-recurring-select' class='rs_cancel' value='#{$.fn.recurring_select.texts["cancel"]}' />
368
- </div>
369
- </div>
370
- </div>
371
- </div>
372
- "