user_announcements 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +5 -0
- data/README.md +26 -8
- data/app/controllers/admin/announcements_controller.rb +2 -0
- data/app/helpers/user_announcements/admin_helper.rb +24 -4
- data/app/helpers/user_announcements/misc_helper.rb +5 -0
- data/app/models/announcement.rb +2 -2
- data/app/models/announcement_finder.rb +1 -1
- data/app/views/admin/announcements/_form.html.erb +11 -7
- data/lib/generators/user_announcements/install_generator.rb +43 -10
- data/lib/generators/user_announcements/templates/README +10 -0
- data/lib/generators/user_announcements/templates/app/assets/javascripts/user_announcements/bootstrap-datetimepicker.min.js +26 -0
- data/lib/generators/user_announcements/templates/app/assets/stylesheets/user_announcements/bootstrap-datetimepicker.min.css +8 -0
- data/lib/generators/user_announcements/templates/app/assets/stylesheets/user_announcements/user_announcements.css.scss +103 -0
- data/lib/generators/user_announcements/templates/config/initializers/user_announcements.rb +32 -0
- data/lib/user_announcements/version.rb +1 -1
- metadata +23 -4
- data/lib/generators/user_announcements/templates/initializer.rb +0 -26
- data/lib/generators/user_announcements/templates/template.css +0 -81
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -23,6 +23,7 @@ episode of [RailsCasts](http://railscasts.com/). If you don't have a premium ac
|
|
23
23
|
|
24
24
|
## Assumptions
|
25
25
|
|
26
|
+
* you are using the Bootstrap framework. If not, use the `--no-bootstrap` option when you run the installer
|
26
27
|
* your controllers respond to `ensure_admin_user` which ensures only admin users can create/edit/delete
|
27
28
|
announcemets
|
28
29
|
* your controllers respond to `current_user`, which is also a `helper_method`
|
@@ -40,6 +41,17 @@ From the command line:
|
|
40
41
|
|
41
42
|
```sh
|
42
43
|
$ bundle install
|
44
|
+
```
|
45
|
+
|
46
|
+
See the installer options:
|
47
|
+
|
48
|
+
```sh
|
49
|
+
$ rails generate user_announcements:install --help
|
50
|
+
```
|
51
|
+
|
52
|
+
Run the installer and run migrations:
|
53
|
+
|
54
|
+
```sh
|
43
55
|
$ rails generate user_announcements:install
|
44
56
|
$ rake db:migrate
|
45
57
|
```
|
@@ -130,13 +142,17 @@ There are several configuration settings found in `../config/initializers/user_a
|
|
130
142
|
|
131
143
|
UserAnnouncements.config do |config|
|
132
144
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
145
|
+
using_bootstrap = true
|
146
|
+
|
147
|
+
if using_bootstrap
|
148
|
+
config.bootstrap = true
|
149
|
+
config.bootstrap_datetime_picker = true
|
150
|
+
config.styles = [['Yellow', ''], ['Red', 'alert-error'], ['Green', 'alert-success'], ['Blue', 'alert-info']]
|
151
|
+
else
|
152
|
+
config.bootstrap = false
|
153
|
+
config.bootstrap_datetime_picker = false
|
154
|
+
config.styles = [['Yellow', 'yellow'], ['Red', 'red'], ['Green', 'green'], ['Blue', 'blue']]
|
155
|
+
end
|
140
156
|
|
141
157
|
# Announcement defaults
|
142
158
|
config.default_active = true
|
@@ -146,10 +162,12 @@ UserAnnouncements.config do |config|
|
|
146
162
|
# config.default_roles = ['admin']
|
147
163
|
|
148
164
|
# Roles
|
165
|
+
# Setting config.roles will show roles on the Announcment detail form and cause
|
166
|
+
# roles to be considered in showing announcements to users
|
149
167
|
# config.roles = []
|
150
168
|
# config.roles = ['', 'admin']
|
151
169
|
# config.roles = [ ['Public', ''], ['Administrator', 'admin'] ]
|
152
|
-
# config.roles = lambda { MyRoleClass.map { |role| [role.name, role.id] } }
|
170
|
+
# config.roles = lambda { MyRoleClass.all.map { |role| [role.name, role.id] } }
|
153
171
|
|
154
172
|
end
|
155
173
|
```
|
@@ -49,11 +49,13 @@ class Admin::AnnouncementsController < ApplicationController
|
|
49
49
|
params.require(:announcement).permit(
|
50
50
|
:active,
|
51
51
|
:message,
|
52
|
+
:starts_at,
|
52
53
|
:"starts_at(1i)",
|
53
54
|
:"starts_at(2i)",
|
54
55
|
:"starts_at(3i)",
|
55
56
|
:"starts_at(4i)",
|
56
57
|
:"starts_at(5i)",
|
58
|
+
:ends_at,
|
57
59
|
:"ends_at(1i)",
|
58
60
|
:"ends_at(2i)",
|
59
61
|
:"ends_at(3i)",
|
@@ -22,10 +22,10 @@ module UserAnnouncements::AdminHelper
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def ua_datetime_p(f, method)
|
25
|
-
|
26
|
-
f
|
27
|
-
|
28
|
-
f
|
25
|
+
if ua_bootstrap_datetime_picker?
|
26
|
+
ua_datetime_p_bootstrap(f, method)
|
27
|
+
else
|
28
|
+
ua_datetime_p_non_bootstrap(f, method)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -39,5 +39,25 @@ module UserAnnouncements::AdminHelper
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
+
def ua_datetime_p_bootstrap(f, method)
|
43
|
+
value = f.object.send(method).try(:strftime, "%Y-%m-%d %H:%M")
|
44
|
+
%(<p class="input-append date ua-datetimepicker" style: "display:block !important">
|
45
|
+
#{f.label(method)}
|
46
|
+
#{f.text_field(method, value: value, data: {format: "yyyy-MM-dd hh:mm"})}
|
47
|
+
<span class="add-on">
|
48
|
+
<i data-time-icon="icon-time" data-date-icon="icon-calendar">
|
49
|
+
</i>
|
50
|
+
</span>
|
51
|
+
</p>).html_safe
|
52
|
+
end
|
53
|
+
|
54
|
+
def ua_datetime_p_non_bootstrap(f, method)
|
55
|
+
content_tag(:p, class: 'datetime-select') do
|
56
|
+
f.label(method) +
|
57
|
+
ua_br +
|
58
|
+
f.datetime_select(method)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
42
62
|
|
43
63
|
end
|
data/app/models/announcement.rb
CHANGED
@@ -75,7 +75,7 @@ class AnnouncementFinder
|
|
75
75
|
# @param roles [Array<String>]
|
76
76
|
# @return [Boolean]
|
77
77
|
def user_can_see(user, roles)
|
78
|
-
if roles.
|
78
|
+
if roles.index(&:blank?) || roles.blank?
|
79
79
|
true
|
80
80
|
else
|
81
81
|
roles.any? { |role| user.has_role?(role) }
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<%= form_for [:admin, @announcement], :html => {:class => '
|
1
|
+
<%= form_for [:admin, @announcement], :html => {:class => 'announcement-detail'} do |f| %>
|
2
2
|
<%= _ua_active_model_errors(f.object) %>
|
3
3
|
|
4
4
|
<p>
|
@@ -28,11 +28,15 @@
|
|
28
28
|
<%= f.submit :class => 'btn btn-primary' %>
|
29
29
|
<%= link_to("Cancel", admin_announcements_path, :class => 'btn') %>
|
30
30
|
</div>
|
31
|
+
|
31
32
|
<% end %>
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
<%- if ua_bootstrap_datetime_picker? %>
|
35
|
+
<script>
|
36
|
+
|
37
|
+
$(function() {
|
38
|
+
$('.ua-datetimepicker').datetimepicker({
|
39
|
+
});
|
40
|
+
})
|
41
|
+
</script>
|
42
|
+
<% end %>
|
@@ -7,20 +7,53 @@ module UserAnnouncements
|
|
7
7
|
extend ActiveRecord::Generators::Migration
|
8
8
|
source_root File.join(File.dirname(__FILE__), "templates")
|
9
9
|
|
10
|
-
desc
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
desc %(Copy user_announcements files.
|
11
|
+
* assumes Bootstrap by default
|
12
|
+
* if you are not using Bootstrap or have your own copy of the Bootstrap datetimepicker assets, see:
|
13
|
+
* --no_bootstrap
|
14
|
+
* --no_bootstrap_dtp
|
15
|
+
|
16
|
+
)
|
17
|
+
|
18
|
+
class_option :no_bootstrap, aliases: '-n', type: :boolean, desc: 'Do not configure for Bootstrap; do not copy Bootstrap datetimepicker assets'
|
19
|
+
class_option :no_bootstrap_dtp, aliases: '-d', type: :boolean, desc: 'Do not copy Bootstrap datetimepicker assets'
|
20
|
+
class_option :readme, aliases: '-r', type: :boolean, desc: 'Display README and exit'
|
17
21
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
22
|
+
def readme_only
|
23
|
+
puts "behavior: #{behavior}"
|
24
|
+
# if options.readme?
|
25
|
+
# readme_to_console
|
26
|
+
# exit
|
27
|
+
# end
|
28
|
+
end
|
29
|
+
|
30
|
+
def copy_bootstrap_datetime_picker_assets
|
31
|
+
return if options.readme?
|
32
|
+
unless options.no_bootstrap? || options.no_bootstrap_dtp?
|
33
|
+
copy_file 'app/assets/javascripts/user_announcements/bootstrap-datetimepicker.min.js'
|
34
|
+
copy_file 'app/assets/stylesheets/user_announcements/bootstrap-datetimepicker.min.css'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def install_base_files
|
39
|
+
return if options.readme?
|
40
|
+
copy_file 'app/assets/stylesheets/user_announcements/user_announcements.css.scss'
|
41
|
+
template 'config/initializers/user_announcements.rb'
|
21
42
|
migration_template "migration.rb", "db/migrate/create_user_announcement_tables.rb"
|
22
43
|
end
|
23
44
|
|
45
|
+
def show_readme
|
46
|
+
if behavior == :invoke
|
47
|
+
readme_to_console
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def readme_to_console
|
54
|
+
readme "README"
|
55
|
+
end
|
56
|
+
|
24
57
|
end
|
25
58
|
end
|
26
59
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
|
2
|
+
****************************************************************************
|
3
|
+
* Check configuration settings in config/initializers/user_announcements.rb
|
4
|
+
|
5
|
+
* Put the view helper `user_announcements` in your layout(s)
|
6
|
+
|
7
|
+
* These url helpers are available:
|
8
|
+
* admin_announcements_path
|
9
|
+
* hidden_anouncements_path
|
10
|
+
****************************************************************************
|
@@ -0,0 +1,26 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* =========================================================
|
4
|
+
* bootstrap-datetimepicker.js
|
5
|
+
* http://www.eyecon.ro/bootstrap-datepicker
|
6
|
+
* =========================================================
|
7
|
+
* Copyright 2012 Stefan Petre
|
8
|
+
*
|
9
|
+
* Contributions:
|
10
|
+
* - Andrew Rowls
|
11
|
+
* - Thiago de Arruda
|
12
|
+
*
|
13
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
14
|
+
* you may not use this file except in compliance with the License.
|
15
|
+
* You may obtain a copy of the License at
|
16
|
+
*
|
17
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
18
|
+
*
|
19
|
+
* Unless required by applicable law or agreed to in writing, software
|
20
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
21
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
22
|
+
* See the License for the specific language governing permissions and
|
23
|
+
* limitations under the License.
|
24
|
+
* =========================================================
|
25
|
+
*/
|
26
|
+
(function($){var smartPhone=window.orientation!=undefined;var DateTimePicker=function(element,options){this.id=dpgId++;this.init(element,options)};var dateToDate=function(dt){if(typeof dt==="string"){return new Date(dt)}return dt};DateTimePicker.prototype={constructor:DateTimePicker,init:function(element,options){var icon;if(!(options.pickTime||options.pickDate))throw new Error("Must choose at least one picker");this.options=options;this.$element=$(element);this.language=options.language in dates?options.language:"en";this.pickDate=options.pickDate;this.pickTime=options.pickTime;this.isInput=this.$element.is("input");this.component=false;if(this.$element.find(".input-append")||this.$element.find(".input-prepend"))this.component=this.$element.find(".add-on");this.format=options.format;if(!this.format){if(this.isInput)this.format=this.$element.data("format");else this.format=this.$element.find("input").data("format");if(!this.format)this.format="MM/dd/yyyy"}this._compileFormat();if(this.component){icon=this.component.find("i")}if(this.pickTime){if(icon&&icon.length)this.timeIcon=icon.data("time-icon");if(!this.timeIcon)this.timeIcon="icon-time";icon.addClass(this.timeIcon)}if(this.pickDate){if(icon&&icon.length)this.dateIcon=icon.data("date-icon");if(!this.dateIcon)this.dateIcon="icon-calendar";icon.removeClass(this.timeIcon);icon.addClass(this.dateIcon)}this.widget=$(getTemplate(this.timeIcon,options.pickDate,options.pickTime,options.pick12HourFormat,options.pickSeconds,options.collapse)).appendTo("body");this.minViewMode=options.minViewMode||this.$element.data("date-minviewmode")||0;if(typeof this.minViewMode==="string"){switch(this.minViewMode){case"months":this.minViewMode=1;break;case"years":this.minViewMode=2;break;default:this.minViewMode=0;break}}this.viewMode=options.viewMode||this.$element.data("date-viewmode")||0;if(typeof this.viewMode==="string"){switch(this.viewMode){case"months":this.viewMode=1;break;case"years":this.viewMode=2;break;default:this.viewMode=0;break}}this.startViewMode=this.viewMode;this.weekStart=options.weekStart||this.$element.data("date-weekstart")||0;this.weekEnd=this.weekStart===0?6:this.weekStart-1;this.setStartDate(options.startDate||this.$element.data("date-startdate"));this.setEndDate(options.endDate||this.$element.data("date-enddate"));this.fillDow();this.fillMonths();this.fillHours();this.fillMinutes();this.fillSeconds();this.update();this.showMode();this._attachDatePickerEvents()},show:function(e){this.widget.show();this.height=this.component?this.component.outerHeight():this.$element.outerHeight();this.place();this.$element.trigger({type:"show",date:this._date});this._attachDatePickerGlobalEvents();if(e){e.stopPropagation();e.preventDefault()}},disable:function(){this.$element.find("input").prop("disabled",true);this._detachDatePickerEvents()},enable:function(){this.$element.find("input").prop("disabled",false);this._attachDatePickerEvents()},hide:function(){var collapse=this.widget.find(".collapse");for(var i=0;i<collapse.length;i++){var collapseData=collapse.eq(i).data("collapse");if(collapseData&&collapseData.transitioning)return}this.widget.hide();this.viewMode=this.startViewMode;this.showMode();this.set();this.$element.trigger({type:"hide",date:this._date});this._detachDatePickerGlobalEvents()},set:function(){var formatted="";if(!this._unset)formatted=this.formatDate(this._date);if(!this.isInput){if(this.component){var input=this.$element.find("input");input.val(formatted);this._resetMaskPos(input)}this.$element.data("date",formatted)}else{this.$element.val(formatted);this._resetMaskPos(this.$element)}},setValue:function(newDate){if(!newDate){this._unset=true}else{this._unset=false}if(typeof newDate==="string"){this._date=this.parseDate(newDate)}else if(newDate){this._date=new Date(newDate)}this.set();this.viewDate=UTCDate(this._date.getUTCFullYear(),this._date.getUTCMonth(),1,0,0,0,0);this.fillDate();this.fillTime()},getDate:function(){if(this._unset)return null;return new Date(this._date.valueOf())},setDate:function(date){if(!date)this.setValue(null);else this.setValue(date.valueOf())},setStartDate:function(date){if(date instanceof Date){this.startDate=date}else if(typeof date==="string"){this.startDate=new UTCDate(date);if(!this.startDate.getUTCFullYear()){this.startDate=-Infinity}}else{this.startDate=-Infinity}if(this.viewDate){this.update()}},setEndDate:function(date){if(date instanceof Date){this.endDate=date}else if(typeof date==="string"){this.endDate=new UTCDate(date);if(!this.endDate.getUTCFullYear()){this.endDate=Infinity}}else{this.endDate=Infinity}if(this.viewDate){this.update()}},getLocalDate:function(){if(this._unset)return null;var d=this._date;return new Date(d.getUTCFullYear(),d.getUTCMonth(),d.getUTCDate(),d.getUTCHours(),d.getUTCMinutes(),d.getUTCSeconds(),d.getUTCMilliseconds())},setLocalDate:function(localDate){if(!localDate)this.setValue(null);else this.setValue(Date.UTC(localDate.getFullYear(),localDate.getMonth(),localDate.getDate(),localDate.getHours(),localDate.getMinutes(),localDate.getSeconds(),localDate.getMilliseconds()))},place:function(){var position="absolute";var offset=this.component?this.component.offset():this.$element.offset();this.width=this.component?this.component.outerWidth():this.$element.outerWidth();offset.top=offset.top+this.height;var $window=$(window);if(this.options.width!=undefined){this.widget.width(this.options.width)}if(this.options.orientation=="left"){this.widget.addClass("left-oriented");offset.left=offset.left-this.widget.width()+20}if(this._isInFixed()){position="fixed";offset.top-=$window.scrollTop();offset.left-=$window.scrollLeft()}if($window.width()<offset.left+this.widget.outerWidth()){offset.right=$window.width()-offset.left-this.width;offset.left="auto";this.widget.addClass("pull-right")}else{offset.right="auto";this.widget.removeClass("pull-right")}this.widget.css({position:position,top:offset.top,left:offset.left,right:offset.right})},notifyChange:function(){this.$element.trigger({type:"changeDate",date:this.getDate(),localDate:this.getLocalDate()})},update:function(newDate){var dateStr=newDate;if(!dateStr){if(this.isInput){dateStr=this.$element.val()}else{dateStr=this.$element.find("input").val()}if(dateStr){this._date=this.parseDate(dateStr)}if(!this._date){var tmp=new Date;this._date=UTCDate(tmp.getFullYear(),tmp.getMonth(),tmp.getDate(),tmp.getHours(),tmp.getMinutes(),tmp.getSeconds(),tmp.getMilliseconds())}}this.viewDate=UTCDate(this._date.getUTCFullYear(),this._date.getUTCMonth(),1,0,0,0,0);this.fillDate();this.fillTime()},fillDow:function(){var dowCnt=this.weekStart;var html=$("<tr>");while(dowCnt<this.weekStart+7){html.append('<th class="dow">'+dates[this.language].daysMin[dowCnt++%7]+"</th>")}this.widget.find(".datepicker-days thead").append(html)},fillMonths:function(){var html="";var i=0;while(i<12){html+='<span class="month">'+dates[this.language].monthsShort[i++]+"</span>"}this.widget.find(".datepicker-months td").append(html)},fillDate:function(){var year=this.viewDate.getUTCFullYear();var month=this.viewDate.getUTCMonth();var currentDate=UTCDate(this._date.getUTCFullYear(),this._date.getUTCMonth(),this._date.getUTCDate(),0,0,0,0);var startYear=typeof this.startDate==="object"?this.startDate.getUTCFullYear():-Infinity;var startMonth=typeof this.startDate==="object"?this.startDate.getUTCMonth():-1;var endYear=typeof this.endDate==="object"?this.endDate.getUTCFullYear():Infinity;var endMonth=typeof this.endDate==="object"?this.endDate.getUTCMonth():12;this.widget.find(".datepicker-days").find(".disabled").removeClass("disabled");this.widget.find(".datepicker-months").find(".disabled").removeClass("disabled");this.widget.find(".datepicker-years").find(".disabled").removeClass("disabled");this.widget.find(".datepicker-days th:eq(1)").text(dates[this.language].months[month]+" "+year);var prevMonth=UTCDate(year,month-1,28,0,0,0,0);var day=DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(),prevMonth.getUTCMonth());prevMonth.setUTCDate(day);prevMonth.setUTCDate(day-(prevMonth.getUTCDay()-this.weekStart+7)%7);if(year==startYear&&month<=startMonth||year<startYear){this.widget.find(".datepicker-days th:eq(0)").addClass("disabled")}if(year==endYear&&month>=endMonth||year>endYear){this.widget.find(".datepicker-days th:eq(2)").addClass("disabled")}var nextMonth=new Date(prevMonth.valueOf());nextMonth.setUTCDate(nextMonth.getUTCDate()+42);nextMonth=nextMonth.valueOf();var html=[];var row;var clsName;while(prevMonth.valueOf()<nextMonth){if(prevMonth.getUTCDay()===this.weekStart){row=$("<tr>");html.push(row)}clsName="";if(prevMonth.getUTCFullYear()<year||prevMonth.getUTCFullYear()==year&&prevMonth.getUTCMonth()<month){clsName+=" old"}else if(prevMonth.getUTCFullYear()>year||prevMonth.getUTCFullYear()==year&&prevMonth.getUTCMonth()>month){clsName+=" new"}if(prevMonth.valueOf()===currentDate.valueOf()){clsName+=" active"}if(prevMonth.valueOf()+864e5<=this.startDate){clsName+=" disabled"}if(prevMonth.valueOf()>this.endDate){clsName+=" disabled"}row.append('<td class="day'+clsName+'">'+prevMonth.getUTCDate()+"</td>");prevMonth.setUTCDate(prevMonth.getUTCDate()+1)}this.widget.find(".datepicker-days tbody").empty().append(html);var currentYear=this._date.getUTCFullYear();var months=this.widget.find(".datepicker-months").find("th:eq(1)").text(year).end().find("span").removeClass("active");if(currentYear===year){months.eq(this._date.getUTCMonth()).addClass("active")}if(currentYear-1<startYear){this.widget.find(".datepicker-months th:eq(0)").addClass("disabled")}if(currentYear+1>endYear){this.widget.find(".datepicker-months th:eq(2)").addClass("disabled")}for(var i=0;i<12;i++){if(year==startYear&&startMonth>i||year<startYear){$(months[i]).addClass("disabled")}else if(year==endYear&&endMonth<i||year>endYear){$(months[i]).addClass("disabled")}}html="";year=parseInt(year/10,10)*10;var yearCont=this.widget.find(".datepicker-years").find("th:eq(1)").text(year+"-"+(year+9)).end().find("td");this.widget.find(".datepicker-years").find("th").removeClass("disabled");if(startYear>year){this.widget.find(".datepicker-years").find("th:eq(0)").addClass("disabled")}if(endYear<year+9){this.widget.find(".datepicker-years").find("th:eq(2)").addClass("disabled")}year-=1;for(var i=-1;i<11;i++){html+='<span class="year'+(i===-1||i===10?" old":"")+(currentYear===year?" active":"")+(year<startYear||year>endYear?" disabled":"")+'">'+year+"</span>";year+=1}yearCont.html(html)},fillHours:function(){var table=this.widget.find(".timepicker .timepicker-hours table");table.parent().hide();var html="";if(this.options.pick12HourFormat){var current=1;for(var i=0;i<3;i+=1){html+="<tr>";for(var j=0;j<4;j+=1){var c=current.toString();html+='<td class="hour">'+padLeft(c,2,"0")+"</td>";current++}html+="</tr>"}}else{var current=0;for(var i=0;i<6;i+=1){html+="<tr>";for(var j=0;j<4;j+=1){var c=current.toString();html+='<td class="hour">'+padLeft(c,2,"0")+"</td>";current++}html+="</tr>"}}table.html(html)},fillMinutes:function(){var table=this.widget.find(".timepicker .timepicker-minutes table");table.parent().hide();var html="";var current=0;for(var i=0;i<5;i++){html+="<tr>";for(var j=0;j<4;j+=1){var c=current.toString();html+='<td class="minute">'+padLeft(c,2,"0")+"</td>";current+=3}html+="</tr>"}table.html(html)},fillSeconds:function(){var table=this.widget.find(".timepicker .timepicker-seconds table");table.parent().hide();var html="";var current=0;for(var i=0;i<5;i++){html+="<tr>";for(var j=0;j<4;j+=1){var c=current.toString();html+='<td class="second">'+padLeft(c,2,"0")+"</td>";current+=3}html+="</tr>"}table.html(html)},fillTime:function(){if(!this._date)return;var timeComponents=this.widget.find(".timepicker span[data-time-component]");var table=timeComponents.closest("table");var is12HourFormat=this.options.pick12HourFormat;var hour=this._date.getUTCHours();var period="AM";if(is12HourFormat){if(hour>=12)period="PM";if(hour===0)hour=12;else if(hour!=12)hour=hour%12;this.widget.find(".timepicker [data-action=togglePeriod]").text(period)}hour=padLeft(hour.toString(),2,"0");var minute=padLeft(this._date.getUTCMinutes().toString(),2,"0");var second=padLeft(this._date.getUTCSeconds().toString(),2,"0");timeComponents.filter("[data-time-component=hours]").text(hour);timeComponents.filter("[data-time-component=minutes]").text(minute);timeComponents.filter("[data-time-component=seconds]").text(second)},click:function(e){e.stopPropagation();e.preventDefault();this._unset=false;var target=$(e.target).closest("span, td, th");if(target.length===1){if(!target.is(".disabled")){switch(target[0].nodeName.toLowerCase()){case"th":switch(target[0].className){case"switch":this.showMode(1);break;case"prev":case"next":var vd=this.viewDate;var navFnc=DPGlobal.modes[this.viewMode].navFnc;var step=DPGlobal.modes[this.viewMode].navStep;if(target[0].className==="prev")step=step*-1;vd["set"+navFnc](vd["get"+navFnc]()+step);this.fillDate();this.set();break}break;case"span":if(target.is(".month")){var month=target.parent().find("span").index(target);this.viewDate.setUTCMonth(month)}else{var year=parseInt(target.text(),10)||0;this.viewDate.setUTCFullYear(year)}if(this.viewMode!==0){this._date=UTCDate(this.viewDate.getUTCFullYear(),this.viewDate.getUTCMonth(),this.viewDate.getUTCDate(),this._date.getUTCHours(),this._date.getUTCMinutes(),this._date.getUTCSeconds(),this._date.getUTCMilliseconds());this.notifyChange()}this.showMode(-1);this.fillDate();this.set();break;case"td":if(target.is(".day")){var day=parseInt(target.text(),10)||1;var month=this.viewDate.getUTCMonth();var year=this.viewDate.getUTCFullYear();if(target.is(".old")){if(month===0){month=11;year-=1}else{month-=1}}else if(target.is(".new")){if(month==11){month=0;year+=1}else{month+=1}}this._date=UTCDate(year,month,day,this._date.getUTCHours(),this._date.getUTCMinutes(),this._date.getUTCSeconds(),this._date.getUTCMilliseconds());this.viewDate=UTCDate(year,month,Math.min(28,day),0,0,0,0);this.fillDate();this.set();this.notifyChange()}break}}}},actions:{incrementHours:function(e){this._date.setUTCHours(this._date.getUTCHours()+1)},incrementMinutes:function(e){this._date.setUTCMinutes(this._date.getUTCMinutes()+1)},incrementSeconds:function(e){this._date.setUTCSeconds(this._date.getUTCSeconds()+1)},decrementHours:function(e){this._date.setUTCHours(this._date.getUTCHours()-1)},decrementMinutes:function(e){this._date.setUTCMinutes(this._date.getUTCMinutes()-1)},decrementSeconds:function(e){this._date.setUTCSeconds(this._date.getUTCSeconds()-1)},togglePeriod:function(e){var hour=this._date.getUTCHours();if(hour>=12)hour-=12;else hour+=12;this._date.setUTCHours(hour)},showPicker:function(){this.widget.find(".timepicker > div:not(.timepicker-picker)").hide();this.widget.find(".timepicker .timepicker-picker").show()},showHours:function(){this.widget.find(".timepicker .timepicker-picker").hide();this.widget.find(".timepicker .timepicker-hours").show()},showMinutes:function(){this.widget.find(".timepicker .timepicker-picker").hide();this.widget.find(".timepicker .timepicker-minutes").show()},showSeconds:function(){this.widget.find(".timepicker .timepicker-picker").hide();this.widget.find(".timepicker .timepicker-seconds").show()},selectHour:function(e){var tgt=$(e.target);var value=parseInt(tgt.text(),10);if(this.options.pick12HourFormat){var current=this._date.getUTCHours();if(current>=12){if(value!=12)value=(value+12)%24}else{if(value===12)value=0;else value=value%12}}this._date.setUTCHours(value);this.actions.showPicker.call(this)},selectMinute:function(e){var tgt=$(e.target);var value=parseInt(tgt.text(),10);this._date.setUTCMinutes(value);this.actions.showPicker.call(this)},selectSecond:function(e){var tgt=$(e.target);var value=parseInt(tgt.text(),10);this._date.setUTCSeconds(value);this.actions.showPicker.call(this)}},doAction:function(e){e.stopPropagation();e.preventDefault();if(!this._date)this._date=UTCDate(1970,0,0,0,0,0,0);var action=$(e.currentTarget).data("action");var rv=this.actions[action].apply(this,arguments);this.set();this.fillTime();this.notifyChange();return rv},stopEvent:function(e){e.stopPropagation();e.preventDefault()},keydown:function(e){var self=this,k=e.which,input=$(e.target);if(k==8||k==46){setTimeout(function(){self._resetMaskPos(input)})}},keypress:function(e){var k=e.which;if(k==8||k==46){return}var input=$(e.target);var c=String.fromCharCode(k);var val=input.val()||"";val+=c;var mask=this._mask[this._maskPos];if(!mask){return false}if(mask.end!=val.length){return}if(!mask.pattern.test(val.slice(mask.start))){val=val.slice(0,val.length-1);while((mask=this._mask[this._maskPos])&&mask.character){val+=mask.character;this._maskPos++}val+=c;if(mask.end!=val.length){input.val(val);return false}else{if(!mask.pattern.test(val.slice(mask.start))){input.val(val.slice(0,mask.start));return false}else{input.val(val);this._maskPos++;return false}}}else{this._maskPos++}},change:function(e){var input=$(e.target);var val=input.val();if(this._formatPattern.test(val)){this.update();this.setValue(this._date.getTime());this.notifyChange();this.set()}else if(val&&val.trim()){this.setValue(this._date.getTime());if(this._date)this.set();else input.val("")}else{if(this._date){this.setValue(null);this.notifyChange();this._unset=true}}this._resetMaskPos(input)},showMode:function(dir){if(dir){this.viewMode=Math.max(this.minViewMode,Math.min(2,this.viewMode+dir))}this.widget.find(".datepicker > div").hide().filter(".datepicker-"+DPGlobal.modes[this.viewMode].clsName).show()},destroy:function(){this._detachDatePickerEvents();this._detachDatePickerGlobalEvents();this.widget.remove();this.$element.removeData("datetimepicker");this.component.removeData("datetimepicker")},formatDate:function(d){return this.format.replace(formatReplacer,function(match){var methodName,property,rv,len=match.length;if(match==="ms")len=1;property=dateFormatComponents[match].property;if(property==="Hours12"){rv=d.getUTCHours();if(rv===0)rv=12;else if(rv!==12)rv=rv%12}else if(property==="Period12"){if(d.getUTCHours()>=12)return"PM";else return"AM"}else{methodName="get"+property;rv=d[methodName]()}if(methodName==="getUTCMonth")rv=rv+1;if(methodName==="getUTCYear")rv=rv+1900-2e3;return padLeft(rv.toString(),len,"0")})},parseDate:function(str){var match,i,property,methodName,value,parsed={};if(!(match=this._formatPattern.exec(str)))return null;for(i=1;i<match.length;i++){property=this._propertiesByIndex[i];if(!property)continue;value=match[i];if(/^\d+$/.test(value))value=parseInt(value,10);parsed[property]=value}return this._finishParsingDate(parsed)},_resetMaskPos:function(input){var val=input.val();for(var i=0;i<this._mask.length;i++){if(this._mask[i].end>val.length){this._maskPos=i;break}else if(this._mask[i].end===val.length){this._maskPos=i+1;break}}},_finishParsingDate:function(parsed){var year,month,date,hours,minutes,seconds,milliseconds;year=parsed.UTCFullYear;if(parsed.UTCYear)year=2e3+parsed.UTCYear;if(!year)year=1970;if(parsed.UTCMonth)month=parsed.UTCMonth-1;else month=0;date=parsed.UTCDate||1;hours=parsed.UTCHours||0;minutes=parsed.UTCMinutes||0;seconds=parsed.UTCSeconds||0;milliseconds=parsed.UTCMilliseconds||0;if(parsed.Hours12){hours=parsed.Hours12}if(parsed.Period12){if(/pm/i.test(parsed.Period12)){if(hours!=12)hours=(hours+12)%24}else{hours=hours%12}}return UTCDate(year,month,date,hours,minutes,seconds,milliseconds)},_compileFormat:function(){var match,component,components=[],mask=[],str=this.format,propertiesByIndex={},i=0,pos=0;while(match=formatComponent.exec(str)){component=match[0];if(component in dateFormatComponents){i++;propertiesByIndex[i]=dateFormatComponents[component].property;components.push("\\s*"+dateFormatComponents[component].getPattern(this)+"\\s*");mask.push({pattern:new RegExp(dateFormatComponents[component].getPattern(this)),property:dateFormatComponents[component].property,start:pos,end:pos+=component.length})}else{components.push(escapeRegExp(component));mask.push({pattern:new RegExp(escapeRegExp(component)),character:component,start:pos,end:++pos})}str=str.slice(component.length)}this._mask=mask;this._maskPos=0;this._formatPattern=new RegExp("^\\s*"+components.join("")+"\\s*$");this._propertiesByIndex=propertiesByIndex},_attachDatePickerEvents:function(){var self=this;this.widget.on("click",".datepicker *",$.proxy(this.click,this));this.widget.on("click","[data-action]",$.proxy(this.doAction,this));this.widget.on("mousedown",$.proxy(this.stopEvent,this));if(this.pickDate&&this.pickTime){this.widget.on("click.togglePicker",".accordion-toggle",function(e){e.stopPropagation();var $this=$(this);var $parent=$this.closest("ul");var expanded=$parent.find(".collapse.in");var closed=$parent.find(".collapse:not(.in)");if(expanded&&expanded.length){var collapseData=expanded.data("collapse");if(collapseData&&collapseData.transitioning)return;expanded.collapse("hide");closed.collapse("show");$this.find("i").toggleClass(self.timeIcon+" "+self.dateIcon);self.$element.find(".add-on i").toggleClass(self.timeIcon+" "+self.dateIcon)}})}if(this.isInput){this.$element.on({focus:$.proxy(this.show,this),change:$.proxy(this.change,this)});if(this.options.maskInput){this.$element.on({keydown:$.proxy(this.keydown,this),keypress:$.proxy(this.keypress,this)})}}else{this.$element.on({change:$.proxy(this.change,this)},"input");if(this.options.maskInput){this.$element.on({keydown:$.proxy(this.keydown,this),keypress:$.proxy(this.keypress,this)},"input")}if(this.component){this.component.on("click",$.proxy(this.show,this))}else{this.$element.on("click",$.proxy(this.show,this))}}},_attachDatePickerGlobalEvents:function(){$(window).on("resize.datetimepicker"+this.id,$.proxy(this.place,this));if(!this.isInput){$(document).on("mousedown.datetimepicker"+this.id,$.proxy(this.hide,this))}},_detachDatePickerEvents:function(){this.widget.off("click",".datepicker *",this.click);this.widget.off("click","[data-action]");this.widget.off("mousedown",this.stopEvent);if(this.pickDate&&this.pickTime){this.widget.off("click.togglePicker")}if(this.isInput){this.$element.off({focus:this.show,change:this.change});if(this.options.maskInput){this.$element.off({keydown:this.keydown,keypress:this.keypress})}}else{this.$element.off({change:this.change},"input");if(this.options.maskInput){this.$element.off({keydown:this.keydown,keypress:this.keypress},"input")}if(this.component){this.component.off("click",this.show)}else{this.$element.off("click",this.show)}}},_detachDatePickerGlobalEvents:function(){$(window).off("resize.datetimepicker"+this.id);if(!this.isInput){$(document).off("mousedown.datetimepicker"+this.id)}},_isInFixed:function(){if(this.$element){var parents=this.$element.parents();var inFixed=false;for(var i=0;i<parents.length;i++){if($(parents[i]).css("position")=="fixed"){inFixed=true;break}}return inFixed}else{return false}}};$.fn.datetimepicker=function(option,val){return this.each(function(){var $this=$(this),data=$this.data("datetimepicker"),options=typeof option==="object"&&option;if(!data){$this.data("datetimepicker",data=new DateTimePicker(this,$.extend({},$.fn.datetimepicker.defaults,options)))}if(typeof option==="string")data[option](val)})};$.fn.datetimepicker.defaults={maskInput:false,pickDate:true,pickTime:true,pick12HourFormat:false,pickSeconds:true,startDate:-Infinity,endDate:Infinity,collapse:true};$.fn.datetimepicker.Constructor=DateTimePicker;var dpgId=0;var dates=$.fn.datetimepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}};var dateFormatComponents={dd:{property:"UTCDate",getPattern:function(){return"(0?[1-9]|[1-2][0-9]|3[0-1])\\b"}},MM:{property:"UTCMonth",getPattern:function(){return"(0?[1-9]|1[0-2])\\b"}},yy:{property:"UTCYear",getPattern:function(){return"(\\d{2})\\b"}},yyyy:{property:"UTCFullYear",getPattern:function(){return"(\\d{4})\\b"}},hh:{property:"UTCHours",getPattern:function(){return"(0?[0-9]|1[0-9]|2[0-3])\\b"}},mm:{property:"UTCMinutes",getPattern:function(){return"(0?[0-9]|[1-5][0-9])\\b"}},ss:{property:"UTCSeconds",getPattern:function(){return"(0?[0-9]|[1-5][0-9])\\b"}},ms:{property:"UTCMilliseconds",getPattern:function(){return"([0-9]{1,3})\\b"}},HH:{property:"Hours12",getPattern:function(){return"(0?[1-9]|1[0-2])\\b"}},PP:{property:"Period12",getPattern:function(){return"(AM|PM|am|pm|Am|aM|Pm|pM)\\b"}}};var keys=[];for(var k in dateFormatComponents)keys.push(k);keys[keys.length-1]+="\\b";keys.push(".");var formatComponent=new RegExp(keys.join("\\b|"));keys.pop();var formatReplacer=new RegExp(keys.join("\\b|"),"g");function escapeRegExp(str){return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}function padLeft(s,l,c){if(l<s.length)return s;else return Array(l-s.length+1).join(c||" ")+s}function getTemplate(timeIcon,pickDate,pickTime,is12Hours,showSeconds,collapse){if(pickDate&&pickTime){return'<div class="bootstrap-datetimepicker-widget dropdown-menu">'+"<ul>"+"<li"+(collapse?' class="collapse in"':"")+">"+'<div class="datepicker">'+DPGlobal.template+"</div>"+"</li>"+'<li class="picker-switch accordion-toggle"><a><i class="'+timeIcon+'"></i></a></li>'+"<li"+(collapse?' class="collapse"':"")+">"+'<div class="timepicker">'+TPGlobal.getTemplate(is12Hours,showSeconds)+"</div>"+"</li>"+"</ul>"+"</div>"}else if(pickTime){return'<div class="bootstrap-datetimepicker-widget dropdown-menu">'+'<div class="timepicker">'+TPGlobal.getTemplate(is12Hours,showSeconds)+"</div>"+"</div>"}else{return'<div class="bootstrap-datetimepicker-widget dropdown-menu">'+'<div class="datepicker">'+DPGlobal.template+"</div>"+"</div>"}}function UTCDate(){return new Date(Date.UTC.apply(Date,arguments))}var DPGlobal={modes:[{clsName:"days",navFnc:"UTCMonth",navStep:1},{clsName:"months",navFnc:"UTCFullYear",navStep:1},{clsName:"years",navFnc:"UTCFullYear",navStep:10}],isLeapYear:function(year){return year%4===0&&year%100!==0||year%400===0},getDaysInMonth:function(year,month){return[31,DPGlobal.isLeapYear(year)?29:28,31,30,31,30,31,31,30,31,30,31][month]},headTemplate:"<thead>"+"<tr>"+'<th class="prev">‹</th>'+'<th colspan="5" class="switch"></th>'+'<th class="next">›</th>'+"</tr>"+"</thead>",contTemplate:'<tbody><tr><td colspan="7"></td></tr></tbody>'};DPGlobal.template='<div class="datepicker-days">'+'<table class="table-condensed">'+DPGlobal.headTemplate+"<tbody></tbody>"+"</table>"+"</div>"+'<div class="datepicker-months">'+'<table class="table-condensed">'+DPGlobal.headTemplate+DPGlobal.contTemplate+"</table>"+"</div>"+'<div class="datepicker-years">'+'<table class="table-condensed">'+DPGlobal.headTemplate+DPGlobal.contTemplate+"</table>"+"</div>";var TPGlobal={hourTemplate:'<span data-action="showHours" data-time-component="hours" class="timepicker-hour"></span>',minuteTemplate:'<span data-action="showMinutes" data-time-component="minutes" class="timepicker-minute"></span>',secondTemplate:'<span data-action="showSeconds" data-time-component="seconds" class="timepicker-second"></span>'};TPGlobal.getTemplate=function(is12Hours,showSeconds){return'<div class="timepicker-picker">'+'<table class="table-condensed"'+(is12Hours?' data-hour-format="12"':"")+">"+"<tr>"+'<td><a href="#" class="btn" data-action="incrementHours"><i class="icon-chevron-up"></i></a></td>'+'<td class="separator"></td>'+'<td><a href="#" class="btn" data-action="incrementMinutes"><i class="icon-chevron-up"></i></a></td>'+(showSeconds?'<td class="separator"></td>'+'<td><a href="#" class="btn" data-action="incrementSeconds"><i class="icon-chevron-up"></i></a></td>':"")+(is12Hours?'<td class="separator"></td>':"")+"</tr>"+"<tr>"+"<td>"+TPGlobal.hourTemplate+"</td> "+'<td class="separator">:</td>'+"<td>"+TPGlobal.minuteTemplate+"</td> "+(showSeconds?'<td class="separator">:</td>'+"<td>"+TPGlobal.secondTemplate+"</td>":"")+(is12Hours?'<td class="separator"></td>'+"<td>"+'<button type="button" class="btn btn-primary" data-action="togglePeriod"></button>'+"</td>":"")+"</tr>"+"<tr>"+'<td><a href="#" class="btn" data-action="decrementHours"><i class="icon-chevron-down"></i></a></td>'+'<td class="separator"></td>'+'<td><a href="#" class="btn" data-action="decrementMinutes"><i class="icon-chevron-down"></i></a></td>'+(showSeconds?'<td class="separator"></td>'+'<td><a href="#" class="btn" data-action="decrementSeconds"><i class="icon-chevron-down"></i></a></td>':"")+(is12Hours?'<td class="separator"></td>':"")+"</tr>"+"</table>"+"</div>"+'<div class="timepicker-hours" data-action="selectHour">'+'<table class="table-condensed">'+"</table>"+"</div>"+'<div class="timepicker-minutes" data-action="selectMinute">'+'<table class="table-condensed">'+"</table>"+"</div>"+(showSeconds?'<div class="timepicker-seconds" data-action="selectSecond">'+'<table class="table-condensed">'+"</table>"+"</div>":"")}})(window.jQuery);
|
@@ -0,0 +1,8 @@
|
|
1
|
+
/*!
|
2
|
+
* Datepicker for Bootstrap
|
3
|
+
*
|
4
|
+
* Copyright 2012 Stefan Petre
|
5
|
+
* Licensed under the Apache License v2.0
|
6
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
*
|
8
|
+
*/.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-datetimepicker-widget{top:0;left:0;width:250px;padding:4px;margin-top:1px;z-index:3000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.bootstrap-datetimepicker-widget:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:6px}.bootstrap-datetimepicker-widget:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:7px}.bootstrap-datetimepicker-widget.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget>ul{list-style-type:none;margin:0}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:100%;font-weight:bold;font-size:1.2em}.bootstrap-datetimepicker-widget table[data-hour-format="12"] .separator{width:4px;padding:0;margin:0}.bootstrap-datetimepicker-widget .datepicker>div{display:none}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget td,.bootstrap-datetimepicker-widget th{text-align:center;width:20px;height:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.bootstrap-datetimepicker-widget td.day:hover,.bootstrap-datetimepicker-widget td.hour:hover,.bootstrap-datetimepicker-widget td.minute:hover,.bootstrap-datetimepicker-widget td.second:hover{background:#eee;cursor:pointer}.bootstrap-datetimepicker-widget td.old,.bootstrap-datetimepicker-widget td.new{color:#999}.bootstrap-datetimepicker-widget td.active,.bootstrap-datetimepicker-widget td.active:hover{color:#fff;background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#04c;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget td.active:hover,.bootstrap-datetimepicker-widget td.active:hover:hover,.bootstrap-datetimepicker-widget td.active:active,.bootstrap-datetimepicker-widget td.active:hover:active,.bootstrap-datetimepicker-widget td.active.active,.bootstrap-datetimepicker-widget td.active:hover.active,.bootstrap-datetimepicker-widget td.active.disabled,.bootstrap-datetimepicker-widget td.active:hover.disabled,.bootstrap-datetimepicker-widget td.active[disabled],.bootstrap-datetimepicker-widget td.active:hover[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.bootstrap-datetimepicker-widget td.active:active,.bootstrap-datetimepicker-widget td.active:hover:active,.bootstrap-datetimepicker-widget td.active.active,.bootstrap-datetimepicker-widget td.active:hover.active{background-color:#039 \9}.bootstrap-datetimepicker-widget td.disabled,.bootstrap-datetimepicker-widget td.disabled:hover{background:0;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget td span{display:block;width:47px;height:54px;line-height:54px;float:left;margin:2px;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.bootstrap-datetimepicker-widget td span:hover{background:#eee}.bootstrap-datetimepicker-widget td span.active{color:#fff;background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);*background-color:#04c;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget td span.active:hover,.bootstrap-datetimepicker-widget td span.active:active,.bootstrap-datetimepicker-widget td span.active.active,.bootstrap-datetimepicker-widget td span.active.disabled,.bootstrap-datetimepicker-widget td span.active[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.bootstrap-datetimepicker-widget td span.active:active,.bootstrap-datetimepicker-widget td span.active.active{background-color:#039 \9}.bootstrap-datetimepicker-widget td span.old{color:#999}.bootstrap-datetimepicker-widget td span.disabled,.bootstrap-datetimepicker-widget td span.disabled:hover{background:0;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget th.switch{width:145px}.bootstrap-datetimepicker-widget th.next,.bootstrap-datetimepicker-widget th.prev{font-size:21px}.bootstrap-datetimepicker-widget th.disabled,.bootstrap-datetimepicker-widget th.disabled:hover{background:0;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget thead tr:first-child th:hover{background:#eee}.input-append.date .add-on i,.input-prepend.date .add-on i{display:block;cursor:pointer;width:16px;height:16px}.bootstrap-datetimepicker-widget.left-oriented:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.left-oriented:after{left:auto;right:7px}
|
@@ -0,0 +1,103 @@
|
|
1
|
+
table.ua-table {
|
2
|
+
|
3
|
+
td.status {
|
4
|
+
width: 1%;
|
5
|
+
text-align: center;
|
6
|
+
}
|
7
|
+
|
8
|
+
th.active {
|
9
|
+
width: 1%;
|
10
|
+
}
|
11
|
+
|
12
|
+
td.active {
|
13
|
+
text-align: center;
|
14
|
+
}
|
15
|
+
|
16
|
+
td.datetime {
|
17
|
+
width: 6em;
|
18
|
+
white-space: nowrap;
|
19
|
+
}
|
20
|
+
|
21
|
+
th.roles {
|
22
|
+
width: 1%;
|
23
|
+
}
|
24
|
+
|
25
|
+
td {
|
26
|
+
vertical-align: top;
|
27
|
+
}
|
28
|
+
|
29
|
+
&.non-bootstrap {
|
30
|
+
border-collapse:collapse;
|
31
|
+
|
32
|
+
th, td {
|
33
|
+
border: 1px solid black;
|
34
|
+
padding: 0.5em;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
.announcement {
|
40
|
+
|
41
|
+
&.non-bootstrap {
|
42
|
+
background-color: #fcf8e3;
|
43
|
+
color: #c09853;
|
44
|
+
border-bottom: solid 1px black;
|
45
|
+
width: 100%;
|
46
|
+
padding: 10px;
|
47
|
+
text-align: center;
|
48
|
+
|
49
|
+
a {
|
50
|
+
font-size: 12px;
|
51
|
+
margin-left: 5px;
|
52
|
+
color: #6E5910;
|
53
|
+
}
|
54
|
+
|
55
|
+
&.yellow {
|
56
|
+
background-color: #fcf8e3;
|
57
|
+
color: #c09853;
|
58
|
+
}
|
59
|
+
|
60
|
+
&.red {
|
61
|
+
background-color: #f2dede;
|
62
|
+
/* border-color: #eed3d7;*/
|
63
|
+
color: #b94a48;
|
64
|
+
}
|
65
|
+
|
66
|
+
&.green {
|
67
|
+
background-color: #dff0d8;
|
68
|
+
/* border-color: #d6e9c6;*/
|
69
|
+
color: #468847;
|
70
|
+
}
|
71
|
+
|
72
|
+
&.blue {
|
73
|
+
background-color: #d9edf7;
|
74
|
+
/* border-color: #bce8f1;*/
|
75
|
+
color: #3a87ad;
|
76
|
+
}
|
77
|
+
|
78
|
+
}
|
79
|
+
|
80
|
+
}
|
81
|
+
|
82
|
+
form.announcement-detail {
|
83
|
+
|
84
|
+
p {
|
85
|
+
margin-top: 1em;
|
86
|
+
margin-bottom: 1em;
|
87
|
+
}
|
88
|
+
|
89
|
+
label {
|
90
|
+
margin-bottom: 0.4em;
|
91
|
+
}
|
92
|
+
|
93
|
+
.ua-datetimepicker {
|
94
|
+
input {
|
95
|
+
width: 8em;
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
p.datetime-select select {
|
100
|
+
width: 8em;
|
101
|
+
}
|
102
|
+
|
103
|
+
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# note: all options accept lambdas
|
2
|
+
|
3
|
+
UserAnnouncements.config do |config|
|
4
|
+
|
5
|
+
using_bootstrap = <%= !options.no_bootstrap? %>
|
6
|
+
|
7
|
+
if using_bootstrap
|
8
|
+
config.bootstrap = true
|
9
|
+
config.bootstrap_datetime_picker = <%= !options.no_bootstrap_dtp? %>
|
10
|
+
config.styles = [['Yellow', ''], ['Red', 'alert-error'], ['Green', 'alert-success'], ['Blue', 'alert-info']]
|
11
|
+
else
|
12
|
+
config.bootstrap = false
|
13
|
+
config.bootstrap_datetime_picker = false
|
14
|
+
config.styles = [['Yellow', 'yellow'], ['Red', 'red'], ['Green', 'green'], ['Blue', 'blue']]
|
15
|
+
end
|
16
|
+
|
17
|
+
# Announcement defaults
|
18
|
+
config.default_active = true
|
19
|
+
config.default_starts_at = lambda { Time.now.in_time_zone }
|
20
|
+
config.default_ends_at = lambda { 1.week.from_now.in_time_zone.end_of_day }
|
21
|
+
config.default_style = ''
|
22
|
+
# config.default_roles = ['admin']
|
23
|
+
|
24
|
+
# Roles
|
25
|
+
# Setting config.roles will show roles on the Announcment detail form and cause
|
26
|
+
# roles to be considered in showing announcements to users
|
27
|
+
# config.roles = []
|
28
|
+
# config.roles = ['', 'admin']
|
29
|
+
# config.roles = [ ['Public', ''], ['Administrator', 'admin'] ]
|
30
|
+
# config.roles = lambda { MyRoleClass.all.map { |role| [role.name, role.id] } }
|
31
|
+
|
32
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: user_announcements
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-06-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -91,6 +91,22 @@ dependencies:
|
|
91
91
|
- - ! '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: generator_spec
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
94
110
|
- !ruby/object:Gem::Dependency
|
95
111
|
name: capybara
|
96
112
|
requirement: !ruby/object:Gem::Requirement
|
@@ -359,9 +375,12 @@ files:
|
|
359
375
|
- app/views/hidden_announcements/index.html.erb
|
360
376
|
- config/routes.rb
|
361
377
|
- lib/generators/user_announcements/install_generator.rb
|
362
|
-
- lib/generators/user_announcements/templates/
|
378
|
+
- lib/generators/user_announcements/templates/app/assets/javascripts/user_announcements/bootstrap-datetimepicker.min.js
|
379
|
+
- lib/generators/user_announcements/templates/app/assets/stylesheets/user_announcements/bootstrap-datetimepicker.min.css
|
380
|
+
- lib/generators/user_announcements/templates/app/assets/stylesheets/user_announcements/user_announcements.css.scss
|
381
|
+
- lib/generators/user_announcements/templates/config/initializers/user_announcements.rb
|
363
382
|
- lib/generators/user_announcements/templates/migration.rb
|
364
|
-
- lib/generators/user_announcements/templates/
|
383
|
+
- lib/generators/user_announcements/templates/README
|
365
384
|
- lib/tasks/user_announcements_tasks.rake
|
366
385
|
- lib/user_announcements/engine.rb
|
367
386
|
- lib/user_announcements/version.rb
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# note: all options accept lambdas
|
2
|
-
|
3
|
-
UserAnnouncements.config do |config|
|
4
|
-
|
5
|
-
# Bootstrap
|
6
|
-
config.bootstrap = true
|
7
|
-
config.styles = [['Yellow', ''], ['Red', 'alert-error'], ['Green', 'alert-success'], ['Blue', 'alert-info']]
|
8
|
-
|
9
|
-
# non-Bootstrap
|
10
|
-
# config.bootstrap = false
|
11
|
-
# config.styles = [['Yellow', 'yellow'], ['Red', 'red'], ['Green', 'green'], ['Blue', 'blue']]
|
12
|
-
|
13
|
-
# Announcement defaults
|
14
|
-
config.default_active = true
|
15
|
-
config.default_starts_at = lambda { Time.now.in_time_zone }
|
16
|
-
config.default_ends_at = lambda { 1.week.from_now.in_time_zone.end_of_day }
|
17
|
-
config.default_style = ''
|
18
|
-
# config.default_roles = ['admin']
|
19
|
-
|
20
|
-
# Roles
|
21
|
-
# config.roles = []
|
22
|
-
# config.roles = ['', 'admin']
|
23
|
-
# config.roles = [ ['Public', ''], ['Administrator', 'admin'] ]
|
24
|
-
# config.roles = lambda { MyRoleClass.map { |role| [role.name, role.id] } }
|
25
|
-
|
26
|
-
end
|
@@ -1,81 +0,0 @@
|
|
1
|
-
table.ua-table td.status {
|
2
|
-
width: 1%;
|
3
|
-
text-align: center;
|
4
|
-
}
|
5
|
-
|
6
|
-
table.ua-table th.active {
|
7
|
-
width: 1%;
|
8
|
-
}
|
9
|
-
|
10
|
-
table.ua-table td.active {
|
11
|
-
text-align: center;
|
12
|
-
}
|
13
|
-
|
14
|
-
table.ua-table td.datetime {
|
15
|
-
width: 6em;
|
16
|
-
white-space: nowrap;
|
17
|
-
}
|
18
|
-
|
19
|
-
table.ua-table th.roles {
|
20
|
-
width: 1%;
|
21
|
-
}
|
22
|
-
|
23
|
-
table.ua-table.non-bootstrap {
|
24
|
-
border-collapse:collapse;
|
25
|
-
}
|
26
|
-
|
27
|
-
table.ua-table.non-bootstrap th, table.ua-table.non-bootstrap td {
|
28
|
-
border: 1px solid black;
|
29
|
-
padding: 0.5em;
|
30
|
-
}
|
31
|
-
|
32
|
-
table.ua-table td {
|
33
|
-
vertical-align: top;
|
34
|
-
}
|
35
|
-
|
36
|
-
.announcement.bootstrap {
|
37
|
-
width: 40em;
|
38
|
-
}
|
39
|
-
|
40
|
-
.announcement.non-bootstrap {
|
41
|
-
background-color: #fcf8e3;
|
42
|
-
color: #c09853;
|
43
|
-
border-bottom: solid 1px black;
|
44
|
-
width: 100%;
|
45
|
-
padding: 10px;
|
46
|
-
text-align: center;
|
47
|
-
}
|
48
|
-
|
49
|
-
.announcement.non-bootstrap a {
|
50
|
-
font-size: 12px;
|
51
|
-
margin-left: 5px;
|
52
|
-
color: #6E5910;
|
53
|
-
}
|
54
|
-
}
|
55
|
-
|
56
|
-
.announcement.non-bootstrap.yellow {
|
57
|
-
background-color: #fcf8e3;
|
58
|
-
color: #c09853;
|
59
|
-
}
|
60
|
-
|
61
|
-
.announcement.non-bootstrap.red {
|
62
|
-
background-color: #f2dede;
|
63
|
-
/* border-color: #eed3d7;*/
|
64
|
-
color: #b94a48;
|
65
|
-
}
|
66
|
-
|
67
|
-
.announcement.non-bootstrap.green {
|
68
|
-
background-color: #dff0d8;
|
69
|
-
/* border-color: #d6e9c6;*/
|
70
|
-
color: #468847;
|
71
|
-
}
|
72
|
-
|
73
|
-
.announcement.non-bootstrap.blue {
|
74
|
-
background-color: #d9edf7;
|
75
|
-
/* border-color: #bce8f1;*/
|
76
|
-
color: #3a87ad;
|
77
|
-
}
|
78
|
-
|
79
|
-
form.announcement-detail label{
|
80
|
-
margin-bottom: 0.4em;
|
81
|
-
}
|