user_announcements 0.0.5 → 0.0.6
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/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
|
-
}
|