mirror of https://github.com/fspc/BikeShed-1.git
Jason Denney
11 years ago
13 changed files with 1973 additions and 2 deletions
@ -0,0 +1,474 @@ |
|||||
|
/* ========================================================= |
||||
|
* bootstrap-datepicker.js |
||||
|
* http://www.eyecon.ro/bootstrap-datepicker
|
||||
|
* ========================================================= |
||||
|
* Copyright 2012 Stefan Petre |
||||
|
* |
||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
* you may not use this file except in compliance with the License. |
||||
|
* You may obtain a copy of the License at |
||||
|
* |
||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
* |
||||
|
* Unless required by applicable law or agreed to in writing, software |
||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
* See the License for the specific language governing permissions and |
||||
|
* limitations under the License. |
||||
|
* ========================================================= */ |
||||
|
|
||||
|
!function( $ ) { |
||||
|
|
||||
|
// Picker object
|
||||
|
|
||||
|
var Datepicker = function(element, options){ |
||||
|
this.element = $(element); |
||||
|
this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||'mm/dd/yyyy'); |
||||
|
this.picker = $(DPGlobal.template) |
||||
|
.appendTo('body') |
||||
|
.on({ |
||||
|
click: $.proxy(this.click, this)//,
|
||||
|
//mousedown: $.proxy(this.mousedown, this)
|
||||
|
}); |
||||
|
this.isInput = this.element.is('input'); |
||||
|
this.component = this.element.is('.date') ? this.element.find('.add-on') : false; |
||||
|
|
||||
|
if (this.isInput) { |
||||
|
this.element.on({ |
||||
|
focus: $.proxy(this.show, this), |
||||
|
//blur: $.proxy(this.hide, this),
|
||||
|
keyup: $.proxy(this.update, this) |
||||
|
}); |
||||
|
} else { |
||||
|
if (this.component){ |
||||
|
this.component.on('click', $.proxy(this.show, this)); |
||||
|
} else { |
||||
|
this.element.on('click', $.proxy(this.show, this)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
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.onRender = options.onRender; |
||||
|
this.fillDow(); |
||||
|
this.fillMonths(); |
||||
|
this.update(); |
||||
|
this.showMode(); |
||||
|
}; |
||||
|
|
||||
|
Datepicker.prototype = { |
||||
|
constructor: Datepicker, |
||||
|
|
||||
|
show: function(e) { |
||||
|
this.picker.show(); |
||||
|
this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); |
||||
|
this.place(); |
||||
|
$(window).on('resize', $.proxy(this.place, this)); |
||||
|
if (e ) { |
||||
|
e.stopPropagation(); |
||||
|
e.preventDefault(); |
||||
|
} |
||||
|
if (!this.isInput) { |
||||
|
} |
||||
|
var that = this; |
||||
|
$(document).on('mousedown', function(ev){ |
||||
|
if ($(ev.target).closest('.datepicker').length == 0) { |
||||
|
that.hide(); |
||||
|
} |
||||
|
}); |
||||
|
this.element.trigger({ |
||||
|
type: 'show', |
||||
|
date: this.date |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
hide: function(){ |
||||
|
this.picker.hide(); |
||||
|
$(window).off('resize', this.place); |
||||
|
this.viewMode = this.startViewMode; |
||||
|
this.showMode(); |
||||
|
if (!this.isInput) { |
||||
|
$(document).off('mousedown', this.hide); |
||||
|
} |
||||
|
//this.set();
|
||||
|
this.element.trigger({ |
||||
|
type: 'hide', |
||||
|
date: this.date |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
set: function() { |
||||
|
var formated = DPGlobal.formatDate(this.date, this.format); |
||||
|
if (!this.isInput) { |
||||
|
if (this.component){ |
||||
|
this.element.find('input').prop('value', formated); |
||||
|
} |
||||
|
this.element.data('date', formated); |
||||
|
} else { |
||||
|
this.element.prop('value', formated); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
setValue: function(newDate) { |
||||
|
if (typeof newDate === 'string') { |
||||
|
this.date = DPGlobal.parseDate(newDate, this.format); |
||||
|
} else { |
||||
|
this.date = new Date(newDate); |
||||
|
} |
||||
|
this.set(); |
||||
|
this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0); |
||||
|
this.fill(); |
||||
|
}, |
||||
|
|
||||
|
place: function(){ |
||||
|
var offset = this.component ? this.component.offset() : this.element.offset(); |
||||
|
this.picker.css({ |
||||
|
top: offset.top + this.height, |
||||
|
left: offset.left |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
update: function(newDate){ |
||||
|
this.date = DPGlobal.parseDate( |
||||
|
typeof newDate === 'string' ? newDate : (this.isInput ? this.element.prop('value') : this.element.data('date')), |
||||
|
this.format |
||||
|
); |
||||
|
this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0); |
||||
|
this.fill(); |
||||
|
}, |
||||
|
|
||||
|
fillDow: function(){ |
||||
|
var dowCnt = this.weekStart; |
||||
|
var html = '<tr>'; |
||||
|
while (dowCnt < this.weekStart + 7) { |
||||
|
html += '<th class="dow">'+DPGlobal.dates.daysMin[(dowCnt++)%7]+'</th>'; |
||||
|
} |
||||
|
html += '</tr>'; |
||||
|
this.picker.find('.datepicker-days thead').append(html); |
||||
|
}, |
||||
|
|
||||
|
fillMonths: function(){ |
||||
|
var html = ''; |
||||
|
var i = 0 |
||||
|
while (i < 12) { |
||||
|
html += '<span class="month">'+DPGlobal.dates.monthsShort[i++]+'</span>'; |
||||
|
} |
||||
|
this.picker.find('.datepicker-months td').append(html); |
||||
|
}, |
||||
|
|
||||
|
fill: function() { |
||||
|
var d = new Date(this.viewDate), |
||||
|
year = d.getFullYear(), |
||||
|
month = d.getMonth(), |
||||
|
currentDate = this.date.valueOf(); |
||||
|
this.picker.find('.datepicker-days th:eq(1)') |
||||
|
.text(DPGlobal.dates.months[month]+' '+year); |
||||
|
var prevMonth = new Date(year, month-1, 28,0,0,0,0), |
||||
|
day = DPGlobal.getDaysInMonth(prevMonth.getFullYear(), prevMonth.getMonth()); |
||||
|
prevMonth.setDate(day); |
||||
|
prevMonth.setDate(day - (prevMonth.getDay() - this.weekStart + 7)%7); |
||||
|
var nextMonth = new Date(prevMonth); |
||||
|
nextMonth.setDate(nextMonth.getDate() + 42); |
||||
|
nextMonth = nextMonth.valueOf(); |
||||
|
var html = []; |
||||
|
var clsName, |
||||
|
prevY, |
||||
|
prevM; |
||||
|
while(prevMonth.valueOf() < nextMonth) { |
||||
|
if (prevMonth.getDay() === this.weekStart) { |
||||
|
html.push('<tr>'); |
||||
|
} |
||||
|
clsName = this.onRender(prevMonth); |
||||
|
prevY = prevMonth.getFullYear(); |
||||
|
prevM = prevMonth.getMonth(); |
||||
|
if ((prevM < month && prevY === year) || prevY < year) { |
||||
|
clsName += ' old'; |
||||
|
} else if ((prevM > month && prevY === year) || prevY > year) { |
||||
|
clsName += ' new'; |
||||
|
} |
||||
|
if (prevMonth.valueOf() === currentDate) { |
||||
|
clsName += ' active'; |
||||
|
} |
||||
|
html.push('<td class="day '+clsName+'">'+prevMonth.getDate() + '</td>'); |
||||
|
if (prevMonth.getDay() === this.weekEnd) { |
||||
|
html.push('</tr>'); |
||||
|
} |
||||
|
prevMonth.setDate(prevMonth.getDate()+1); |
||||
|
} |
||||
|
this.picker.find('.datepicker-days tbody').empty().append(html.join('')); |
||||
|
var currentYear = this.date.getFullYear(); |
||||
|
|
||||
|
var months = this.picker.find('.datepicker-months') |
||||
|
.find('th:eq(1)') |
||||
|
.text(year) |
||||
|
.end() |
||||
|
.find('span').removeClass('active'); |
||||
|
if (currentYear === year) { |
||||
|
months.eq(this.date.getMonth()).addClass('active'); |
||||
|
} |
||||
|
|
||||
|
html = ''; |
||||
|
year = parseInt(year/10, 10) * 10; |
||||
|
var yearCont = this.picker.find('.datepicker-years') |
||||
|
.find('th:eq(1)') |
||||
|
.text(year + '-' + (year + 9)) |
||||
|
.end() |
||||
|
.find('td'); |
||||
|
year -= 1; |
||||
|
for (var i = -1; i < 11; i++) { |
||||
|
html += '<span class="year'+(i === -1 || i === 10 ? ' old' : '')+(currentYear === year ? ' active' : '')+'">'+year+'</span>'; |
||||
|
year += 1; |
||||
|
} |
||||
|
yearCont.html(html); |
||||
|
}, |
||||
|
|
||||
|
click: function(e) { |
||||
|
e.stopPropagation(); |
||||
|
e.preventDefault(); |
||||
|
var target = $(e.target).closest('span, td, th'); |
||||
|
if (target.length === 1) { |
||||
|
switch(target[0].nodeName.toLowerCase()) { |
||||
|
case 'th': |
||||
|
switch(target[0].className) { |
||||
|
case 'switch': |
||||
|
this.showMode(1); |
||||
|
break; |
||||
|
case 'prev': |
||||
|
case 'next': |
||||
|
this.viewDate['set'+DPGlobal.modes[this.viewMode].navFnc].call( |
||||
|
this.viewDate, |
||||
|
this.viewDate['get'+DPGlobal.modes[this.viewMode].navFnc].call(this.viewDate) + |
||||
|
DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1) |
||||
|
); |
||||
|
this.fill(); |
||||
|
this.set(); |
||||
|
break; |
||||
|
} |
||||
|
break; |
||||
|
case 'span': |
||||
|
if (target.is('.month')) { |
||||
|
var month = target.parent().find('span').index(target); |
||||
|
this.viewDate.setMonth(month); |
||||
|
} else { |
||||
|
var year = parseInt(target.text(), 10)||0; |
||||
|
this.viewDate.setFullYear(year); |
||||
|
} |
||||
|
if (this.viewMode !== 0) { |
||||
|
this.date = new Date(this.viewDate); |
||||
|
this.element.trigger({ |
||||
|
type: 'changeDate', |
||||
|
date: this.date, |
||||
|
viewMode: DPGlobal.modes[this.viewMode].clsName |
||||
|
}); |
||||
|
} |
||||
|
this.showMode(-1); |
||||
|
this.fill(); |
||||
|
this.set(); |
||||
|
break; |
||||
|
case 'td': |
||||
|
if (target.is('.day') && !target.is('.disabled')){ |
||||
|
var day = parseInt(target.text(), 10)||1; |
||||
|
var month = this.viewDate.getMonth(); |
||||
|
if (target.is('.old')) { |
||||
|
month -= 1; |
||||
|
} else if (target.is('.new')) { |
||||
|
month += 1; |
||||
|
} |
||||
|
var year = this.viewDate.getFullYear(); |
||||
|
this.date = new Date(year, month, day,0,0,0,0); |
||||
|
this.viewDate = new Date(year, month, Math.min(28, day),0,0,0,0); |
||||
|
this.fill(); |
||||
|
this.set(); |
||||
|
this.element.trigger({ |
||||
|
type: 'changeDate', |
||||
|
date: this.date, |
||||
|
viewMode: DPGlobal.modes[this.viewMode].clsName |
||||
|
}); |
||||
|
} |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
mousedown: function(e){ |
||||
|
e.stopPropagation(); |
||||
|
e.preventDefault(); |
||||
|
}, |
||||
|
|
||||
|
showMode: function(dir) { |
||||
|
if (dir) { |
||||
|
this.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir)); |
||||
|
} |
||||
|
this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show(); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
$.fn.datepicker = function ( option, val ) { |
||||
|
return this.each(function () { |
||||
|
var $this = $(this), |
||||
|
data = $this.data('datepicker'), |
||||
|
options = typeof option === 'object' && option; |
||||
|
if (!data) { |
||||
|
$this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults,options)))); |
||||
|
} |
||||
|
if (typeof option === 'string') data[option](val); |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
$.fn.datepicker.defaults = { |
||||
|
onRender: function(date) { |
||||
|
return ''; |
||||
|
} |
||||
|
}; |
||||
|
$.fn.datepicker.Constructor = Datepicker; |
||||
|
|
||||
|
var DPGlobal = { |
||||
|
modes: [ |
||||
|
{ |
||||
|
clsName: 'days', |
||||
|
navFnc: 'Month', |
||||
|
navStep: 1 |
||||
|
}, |
||||
|
{ |
||||
|
clsName: 'months', |
||||
|
navFnc: 'FullYear', |
||||
|
navStep: 1 |
||||
|
}, |
||||
|
{ |
||||
|
clsName: 'years', |
||||
|
navFnc: 'FullYear', |
||||
|
navStep: 10 |
||||
|
}], |
||||
|
dates:{ |
||||
|
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"] |
||||
|
}, |
||||
|
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] |
||||
|
}, |
||||
|
parseFormat: function(format){ |
||||
|
var separator = format.match(/[.\/\-\s].*?/), |
||||
|
parts = format.split(/\W+/); |
||||
|
if (!separator || !parts || parts.length === 0){ |
||||
|
throw new Error("Invalid date format."); |
||||
|
} |
||||
|
return {separator: separator, parts: parts}; |
||||
|
}, |
||||
|
parseDate: function(date, format) { |
||||
|
var parts = date.split(format.separator), |
||||
|
date = new Date(), |
||||
|
val; |
||||
|
date.setHours(0); |
||||
|
date.setMinutes(0); |
||||
|
date.setSeconds(0); |
||||
|
date.setMilliseconds(0); |
||||
|
if (parts.length === format.parts.length) { |
||||
|
var year = date.getFullYear(), day = date.getDate(), month = date.getMonth(); |
||||
|
for (var i=0, cnt = format.parts.length; i < cnt; i++) { |
||||
|
val = parseInt(parts[i], 10)||1; |
||||
|
switch(format.parts[i]) { |
||||
|
case 'dd': |
||||
|
case 'd': |
||||
|
day = val; |
||||
|
date.setDate(val); |
||||
|
break; |
||||
|
case 'mm': |
||||
|
case 'm': |
||||
|
month = val - 1; |
||||
|
date.setMonth(val - 1); |
||||
|
break; |
||||
|
case 'yy': |
||||
|
year = 2000 + val; |
||||
|
date.setFullYear(2000 + val); |
||||
|
break; |
||||
|
case 'yyyy': |
||||
|
year = val; |
||||
|
date.setFullYear(val); |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
date = new Date(year, month, day, 0 ,0 ,0); |
||||
|
} |
||||
|
return date; |
||||
|
}, |
||||
|
formatDate: function(date, format){ |
||||
|
var val = { |
||||
|
d: date.getDate(), |
||||
|
m: date.getMonth() + 1, |
||||
|
yy: date.getFullYear().toString().substring(2), |
||||
|
yyyy: date.getFullYear() |
||||
|
}; |
||||
|
val.dd = (val.d < 10 ? '0' : '') + val.d; |
||||
|
val.mm = (val.m < 10 ? '0' : '') + val.m; |
||||
|
var date = []; |
||||
|
for (var i=0, cnt = format.parts.length; i < cnt; i++) { |
||||
|
date.push(val[format.parts[i]]); |
||||
|
} |
||||
|
return date.join(format.separator); |
||||
|
}, |
||||
|
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 dropdown-menu">'+ |
||||
|
'<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>'+ |
||||
|
'</div>'; |
||||
|
|
||||
|
}( window.jQuery ); |
File diff suppressed because it is too large
@ -0,0 +1,11 @@ |
|||||
|
$(document).ready(function(){ |
||||
|
|
||||
|
var currentdate = new Date(); |
||||
|
$("#date_id").datepicker().on('changeDate', function(ev){ |
||||
|
$("#date_id").datepicker('hide'); |
||||
|
}); |
||||
|
$("#date_id").datepicker('setValue', currentdate); |
||||
|
|
||||
|
$("#start_time_id").timepicker(); |
||||
|
$("#end_time_id").timepicker(); |
||||
|
}); |
@ -0,0 +1,146 @@ |
|||||
|
/*! |
||||
|
* Timepicker Component for Twitter Bootstrap |
||||
|
* |
||||
|
* Copyright 2013 Joris de Wit |
||||
|
* |
||||
|
* Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors |
||||
|
* |
||||
|
* For the full copyright and license information, please view the LICENSE |
||||
|
* file that was distributed with this source code. |
||||
|
*/ |
||||
|
.bootstrap-timepicker { |
||||
|
position: relative; |
||||
|
} |
||||
|
.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu { |
||||
|
left: auto; |
||||
|
right: 0; |
||||
|
} |
||||
|
.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before { |
||||
|
left: auto; |
||||
|
right: 12px; |
||||
|
} |
||||
|
.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after { |
||||
|
left: auto; |
||||
|
right: 13px; |
||||
|
} |
||||
|
.bootstrap-timepicker .add-on { |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
.bootstrap-timepicker .add-on i { |
||||
|
display: inline-block; |
||||
|
width: 16px; |
||||
|
height: 16px; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget.dropdown-menu { |
||||
|
padding: 4px; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget.dropdown-menu.open { |
||||
|
display: inline-block; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget.dropdown-menu:before { |
||||
|
border-bottom: 7px solid rgba(0, 0, 0, 0.2); |
||||
|
border-left: 7px solid transparent; |
||||
|
border-right: 7px solid transparent; |
||||
|
content: ""; |
||||
|
display: inline-block; |
||||
|
position: absolute; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget.dropdown-menu:after { |
||||
|
border-bottom: 6px solid #FFFFFF; |
||||
|
border-left: 6px solid transparent; |
||||
|
border-right: 6px solid transparent; |
||||
|
content: ""; |
||||
|
display: inline-block; |
||||
|
position: absolute; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget.timepicker-orient-left:before { |
||||
|
left: 6px; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget.timepicker-orient-left:after { |
||||
|
left: 7px; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget.timepicker-orient-right:before { |
||||
|
right: 6px; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget.timepicker-orient-right:after { |
||||
|
right: 7px; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget.timepicker-orient-top:before { |
||||
|
top: -7px; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget.timepicker-orient-top:after { |
||||
|
top: -6px; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget.timepicker-orient-bottom:before { |
||||
|
bottom: -7px; |
||||
|
border-bottom: 0; |
||||
|
border-top: 7px solid #999; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget.timepicker-orient-bottom:after { |
||||
|
bottom: -6px; |
||||
|
border-bottom: 0; |
||||
|
border-top: 6px solid #ffffff; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget a.btn, |
||||
|
.bootstrap-timepicker-widget input { |
||||
|
border-radius: 4px; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget table { |
||||
|
width: 100%; |
||||
|
margin: 0; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget table td { |
||||
|
text-align: center; |
||||
|
height: 30px; |
||||
|
margin: 0; |
||||
|
padding: 2px; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget table td:not(.separator) { |
||||
|
min-width: 30px; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget table td span { |
||||
|
width: 100%; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget table td a { |
||||
|
border: 1px transparent solid; |
||||
|
width: 100%; |
||||
|
display: inline-block; |
||||
|
margin: 0; |
||||
|
padding: 8px 0; |
||||
|
outline: 0; |
||||
|
color: #333; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget table td a:hover { |
||||
|
text-decoration: none; |
||||
|
background-color: #eee; |
||||
|
-webkit-border-radius: 4px; |
||||
|
-moz-border-radius: 4px; |
||||
|
border-radius: 4px; |
||||
|
border-color: #ddd; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget table td a i { |
||||
|
margin-top: 2px; |
||||
|
font-size: 18px; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget table td input { |
||||
|
width: 25px; |
||||
|
margin: 0; |
||||
|
text-align: center; |
||||
|
} |
||||
|
.bootstrap-timepicker-widget .modal-content { |
||||
|
padding: 4px; |
||||
|
} |
||||
|
@media (min-width: 767px) { |
||||
|
.bootstrap-timepicker-widget.modal { |
||||
|
width: 200px; |
||||
|
margin-left: -100px; |
||||
|
} |
||||
|
} |
||||
|
@media (max-width: 767px) { |
||||
|
.bootstrap-timepicker { |
||||
|
width: 100%; |
||||
|
} |
||||
|
.bootstrap-timepicker .dropdown-menu { |
||||
|
width: 100%; |
||||
|
} |
||||
|
} |
@ -0,0 +1,182 @@ |
|||||
|
/*! |
||||
|
* Datepicker for Bootstrap |
||||
|
* |
||||
|
* Copyright 2012 Stefan Petre |
||||
|
* Licensed under the Apache License v2.0 |
||||
|
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
|
* |
||||
|
*/ |
||||
|
.datepicker { |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
padding: 4px; |
||||
|
margin-top: 1px; |
||||
|
-webkit-border-radius: 4px; |
||||
|
-moz-border-radius: 4px; |
||||
|
border-radius: 4px; |
||||
|
/*.dow { |
||||
|
border-top: 1px solid #ddd !important; |
||||
|
}*/ |
||||
|
|
||||
|
} |
||||
|
.datepicker: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; |
||||
|
} |
||||
|
.datepicker:after { |
||||
|
content: ''; |
||||
|
display: inline-block; |
||||
|
border-left: 6px solid transparent; |
||||
|
border-right: 6px solid transparent; |
||||
|
border-bottom: 6px solid #ffffff; |
||||
|
position: absolute; |
||||
|
top: -6px; |
||||
|
left: 7px; |
||||
|
} |
||||
|
.datepicker > div { |
||||
|
display: none; |
||||
|
} |
||||
|
.datepicker table { |
||||
|
width: 100%; |
||||
|
margin: 0; |
||||
|
} |
||||
|
.datepicker td, |
||||
|
.datepicker th { |
||||
|
text-align: center; |
||||
|
width: 20px; |
||||
|
height: 20px; |
||||
|
-webkit-border-radius: 4px; |
||||
|
-moz-border-radius: 4px; |
||||
|
border-radius: 4px; |
||||
|
} |
||||
|
.datepicker td.day:hover { |
||||
|
background: #eeeeee; |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
.datepicker td.day.disabled { |
||||
|
color: #eeeeee; |
||||
|
} |
||||
|
.datepicker td.old, |
||||
|
.datepicker td.new { |
||||
|
color: #999999; |
||||
|
} |
||||
|
.datepicker td.active, |
||||
|
.datepicker td.active:hover { |
||||
|
color: #ffffff; |
||||
|
background-color: #006dcc; |
||||
|
background-image: -moz-linear-gradient(top, #0088cc, #0044cc); |
||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); |
||||
|
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); |
||||
|
background-image: -o-linear-gradient(top, #0088cc, #0044cc); |
||||
|
background-image: linear-gradient(to bottom, #0088cc, #0044cc); |
||||
|
background-repeat: repeat-x; |
||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); |
||||
|
border-color: #0044cc #0044cc #002a80; |
||||
|
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); |
||||
|
*background-color: #0044cc; |
||||
|
/* Darken IE7 buttons by default so they stand out more given they won't have borders */ |
||||
|
|
||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
||||
|
color: #fff; |
||||
|
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); |
||||
|
} |
||||
|
.datepicker td.active:hover, |
||||
|
.datepicker td.active:hover:hover, |
||||
|
.datepicker td.active:focus, |
||||
|
.datepicker td.active:hover:focus, |
||||
|
.datepicker td.active:active, |
||||
|
.datepicker td.active:hover:active, |
||||
|
.datepicker td.active.active, |
||||
|
.datepicker td.active:hover.active, |
||||
|
.datepicker td.active.disabled, |
||||
|
.datepicker td.active:hover.disabled, |
||||
|
.datepicker td.active[disabled], |
||||
|
.datepicker td.active:hover[disabled] { |
||||
|
color: #ffffff; |
||||
|
background-color: #0044cc; |
||||
|
*background-color: #003bb3; |
||||
|
} |
||||
|
.datepicker td.active:active, |
||||
|
.datepicker td.active:hover:active, |
||||
|
.datepicker td.active.active, |
||||
|
.datepicker td.active:hover.active { |
||||
|
background-color: #003399 \9; |
||||
|
} |
||||
|
.datepicker 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; |
||||
|
} |
||||
|
.datepicker td span:hover { |
||||
|
background: #eeeeee; |
||||
|
} |
||||
|
.datepicker td span.active { |
||||
|
color: #ffffff; |
||||
|
background-color: #006dcc; |
||||
|
background-image: -moz-linear-gradient(top, #0088cc, #0044cc); |
||||
|
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); |
||||
|
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); |
||||
|
background-image: -o-linear-gradient(top, #0088cc, #0044cc); |
||||
|
background-image: linear-gradient(to bottom, #0088cc, #0044cc); |
||||
|
background-repeat: repeat-x; |
||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); |
||||
|
border-color: #0044cc #0044cc #002a80; |
||||
|
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); |
||||
|
*background-color: #0044cc; |
||||
|
/* Darken IE7 buttons by default so they stand out more given they won't have borders */ |
||||
|
|
||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
||||
|
color: #fff; |
||||
|
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); |
||||
|
} |
||||
|
.datepicker td span.active:hover, |
||||
|
.datepicker td span.active:focus, |
||||
|
.datepicker td span.active:active, |
||||
|
.datepicker td span.active.active, |
||||
|
.datepicker td span.active.disabled, |
||||
|
.datepicker td span.active[disabled] { |
||||
|
color: #ffffff; |
||||
|
background-color: #0044cc; |
||||
|
*background-color: #003bb3; |
||||
|
} |
||||
|
.datepicker td span.active:active, |
||||
|
.datepicker td span.active.active { |
||||
|
background-color: #003399 \9; |
||||
|
} |
||||
|
.datepicker td span.old { |
||||
|
color: #999999; |
||||
|
} |
||||
|
.datepicker th.switch { |
||||
|
width: 145px; |
||||
|
} |
||||
|
.datepicker th.next, |
||||
|
.datepicker th.prev { |
||||
|
font-size: 21px; |
||||
|
} |
||||
|
.datepicker thead tr:first-child th { |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
.datepicker thead tr:first-child th:hover { |
||||
|
background: #eeeeee; |
||||
|
} |
||||
|
.input-append.date .add-on i, |
||||
|
.input-prepend.date .add-on i { |
||||
|
display: block; |
||||
|
cursor: pointer; |
||||
|
width: 16px; |
||||
|
height: 16px; |
||||
|
} |
@ -0,0 +1,10 @@ |
|||||
|
class TimeEntriesController < AuthenticatedController |
||||
|
|
||||
|
def new |
||||
|
|
||||
|
end |
||||
|
|
||||
|
def index |
||||
|
|
||||
|
end |
||||
|
end |
@ -0,0 +1,41 @@ |
|||||
|
%a{ class: "btn btn-default btn-lg", href: root_path} |
||||
|
%span{ class:"icon-home"} |
||||
|
%h2 Add Time Entry |
||||
|
|
||||
|
%p |
||||
|
.control-group |
||||
|
.controls |
||||
|
%input{id: "date_id", placeholder: "Date", type: "text", class: "datepicker input-small" } |
||||
|
.help-block |
||||
|
.control-group |
||||
|
.controls{ class: "bootstrap-timepicker"} |
||||
|
%label Start |
||||
|
%input{id: "start_time_id", placeholder: "Time ID", type: "text", class: "input-small" } |
||||
|
.help-block |
||||
|
.control-group |
||||
|
.controls |
||||
|
%label End |
||||
|
%input{id: "end_time_id", placeholder: "Time ID", type: "text", class: "input-small" } |
||||
|
.help-block |
||||
|
.control-group |
||||
|
.controls |
||||
|
.btn-group{ "data-toggle" => "buttons-radio"} |
||||
|
%label{ class: "btn btn-default"} |
||||
|
%input{ type: "radio", name: "action_id", value: 3} Volunteer |
||||
|
%label{ class: "btn btn-default"} |
||||
|
%input{ type: "radio", name: "action_id", value: 1} Personal |
||||
|
%label{ class: "btn btn-default"} |
||||
|
%input{ type: "radio", name: "action_id", value: 2} Staff |
||||
|
%input{ id: "bike_style_id", type: "hidden"} |
||||
|
.help-block |
||||
|
.control-group |
||||
|
.controls |
||||
|
%label |
||||
|
Worked on a bike? |
||||
|
%input{ type: "checkbox"} |
||||
|
.control-group |
||||
|
.controls |
||||
|
%textarea{id: "work_description", placeholder: "Work description", class: "input-lg" } |
||||
|
.control-group |
||||
|
.controls |
||||
|
%input{id: "add_bike_submit", value: "Add Time Entry", type: "button", class: "btn btn-lg btn-block btn-primary", "data-url" => "#{api_create_bike_path}"} |
Loading…
Reference in new issue