This commit is contained in:
Xes
2025-08-14 22:44:47 +02:00
parent 8ce45119b6
commit 791cb748ab
39112 changed files with 975901 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
{
"presets": [
["@babel/preset-env"]
]
}

View File

@@ -0,0 +1,32 @@
{
"name": "jt.timepicker",
"version": "1.13.10",
"description": "A jQuery timepicker plugin inspired by Google Calendar.",
"homepage": "http://jonthornton.github.com/jquery-timepicker",
"main": [
"./jquery.timepicker.js",
"./jquery.timepicker.css"
],
"dependencies": {
"jquery": ">= 1.7"
},
"keywords": [
"time",
"picker",
"google calendar"
],
"author": {
"name": "Jon Thornton",
"web": "https://github.com/jonthornton"
},
"license": "MIT",
"_release": "1.13.10",
"_resolution": {
"type": "version",
"tag": "1.13.10",
"commit": "2d497cbb61071f4edd5409f9d3dbe67a9d5f7219"
},
"_source": "https://github.com/jonthornton/jquery-timepicker.git",
"_target": "*",
"_originalSource": "jt.timepicker"
}

View File

@@ -0,0 +1,3 @@
{
}

5
web/assets/jt.timepicker/.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
.DS_store
*.sw*
node_modules
.idea
yarn.lock

View File

@@ -0,0 +1,303 @@
Timepicker Plugin for jQuery
========================
[<img src="http://jonthornton.github.com/jquery-timepicker/lib/screenshot.png" alt="timepicker screenshot" />](https://www.jonthornton.com/jquery-timepicker)
[See a demo and examples here](https://www.jonthornton.com/jquery-timepicker)
jquery.timepicker is a lightweight timepicker plugin for jQuery inspired by Google Calendar. It supports both mouse and keyboard navigation, and weighs in at 5.5kb minified and gzipped.
Requirements
------------
* [jQuery](http://jquery.com/) (>= 1.7)
Usage
-----
```javascript
$('.some-time-inputs').timepicker(options);
```
Include `jquery.timepicker.css` and `jquery.timepicker.min.js` in your page.
```options``` is an optional javascript object with parameters explained below.
You can also set options as [data attributes](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_data_attributes) on the intput elements, like ```<input type="text" data-time-format="H:i:s" />```. Timepicker still needs to be initialized by calling ```$('#someElement').timepicker(options);```. Data attributes will override any conflicting initialization options.
The defaults for all options are exposed through the ```$.fn.timepicker.defaults``` object. Properties changed in this object (same properties configurable through the constructor) will take effect for every instance created after the change.
Options
-------
- **appendTo**
Override where the dropdown is appended.
Takes either a `string` to use as a selector, a `function` that gets passed the clicked input element as argument or a jquery `object` to use directly.
*default: "body"*
- **className**
A class name to apply to the HTML element that contains the timepicker dropdown.
*default: null*
- **closeOnWindowScroll**
Close the timepicker when the window is scrolled. (Replicates ```<select>``` behavior.)
*default: false*
- **disableTimeRanges**
Disable selection of certain time ranges. Input is an array of time pairs, like ```[['3:00am', '4:30am'], ['5:00pm', '8:00pm']]```. The start of the interval will be disabled but the end won't.
*default: []*
- **disableTextInput**
Disable typing in the timepicker input box; force users to select from list. [More information here.](https://github.com/jonthornton/jquery-timepicker/issues/425#issuecomment-133262458)
*default: false*
- **disableTouchKeyboard**
Disable the onscreen keyboard for touch devices. There can be instances where Firefox or Chrome have touch events enabled (such as on Surface tablets but not actually be a touch device. In this case `disableTouchKeyboard` will prevent the timepicker input field from being focused. [More information here.](https://github.com/jonthornton/jquery-timepicker/issues/413)
*default: false*
- **durationTime**
The time against which ```showDuration``` will compute relative times. If this is a function, its result will be used.
*default: minTime*
- **forceRoundTime**
Force update the time to ```step``` settings as soon as it loses focus.
*default: false*
- **lang**
Language constants used in the timepicker. Can override the defaults by passing an object with one or more of the following properties: decimal, mins, hr, hrs.
*default:* ```{
am: 'am',
pm: 'pm',
AM: 'AM',
PM: 'PM',
decimal: '.',
mins: 'mins',
hr: 'hr',
hrs: 'hrs'
}```
- **listWidth**
Set this to override CSS styling and set the list width to match the input element's width. Set to 1 to match input width, 2 to double input width, .5 to halve input width, etc. Set to `null` to let CSS determine the list width.
*default: null (CSS styling)*
- **maxTime**
The time that should appear last in the dropdown list. Can be used to limit the range of time options.
*default: 24 hours after minTime*
- **minTime**
The time that should appear first in the dropdown list.
*default: 12:00am*
- **noneOption**
Adds one or more custom options to the top of the dropdown. Can accept several different value types:
Boolean (```true```): Adds a "None" option that results in an empty input value
String: Adds an option with a custom label that results in an empty input value
Object: Similar to string, but allows customizing the element's class name and the resulting input value. Can contain ```label```, ```value```, and ```className``` properties. ```value``` must be a string type.
Array: An array of strings or objects to add multiple non-time options
*default: false*
- **orientation**
By default the timepicker dropdown will be aligned to the bottom right of the input element, or aligned to the top left if there isn't enough room below the input. Force alignment with `l` (left), `r` (right), `c` (horizontal center), `t` (top), and `b` (bottom). Examples: `tl`, `rb`.
*default: 'l'*
- **roundingFunction**
Function used to compute rounded times. The function will receive time in seconds and a settings object as arguments. The function should handle a null value for seconds.
*default: round to nearest step*
- **scrollDefault**
If no time value is selected, set the dropdown scroll position to show the time provided, e.g. "09:00". A time string, Date object, or integer (seconds past midnight) is acceptible, as well as the string `'now'`.
*default: null*
- **selectOnBlur**
Update the input with the currently highlighted time value when the timepicker loses focus.
*default: false*
- **show2400**
Show "24:00" as an option when using 24-hour time format. You must also set `timeFormat` for this option to work.
*default: false*
- **showDuration**
Shows the relative time for each item in the dropdown. ```minTime``` or ```durationTime``` must be set.
*default: false*
- **showOn**
Display a timepicker dropdown when the input fires a particular event. Set to null or an empty array to disable automatic display. Setting should be an array of strings.
*default: ['focus']*
- **showOnFocus**
DEPRECATED: Display a timepicker dropdown when the input gains focus.
*default: true*
- **step**
The amount of time, in minutes, between each item in the dropdown. Alternately, you can specify a function to generate steps dynamically. The function will receive a count integer (0, 1, 2...) and is expected to return a step integer.
*default: 30*
- **stopScrollPropagation**
When scrolling on the edge of the picker, it prevent parent containers (<body>) to scroll.
*default: false*
- **timeFormat**
How times should be displayed in the list and input element. Uses [PHP's date() formatting syntax](http://php.net/manual/en/function.date.php). Characters can be escaped with a preceeding double slash (e.g. `H\\hi`). Alternatively, you can specify a function instead of a string, to use completely custom time formatting. In this case, the format function receives a Date object and is expected to return a formatted time as a string.
*default: 'g:ia'*
- **typeaheadHighlight**
Highlight the nearest corresponding time option as a value is typed into the form input.
*default: true*
- **useSelect**
Convert the input to an HTML `<SELECT>` control. This is ideal for small screen devices, or if you want to prevent the user from entering arbitrary values. This option is not compatible with the following options: ```appendTo```, ```closeOnWindowScroll```, ```disableTouchKeyboard```, ```forceRoundTime```, ```scrollDefault```, ```selectOnBlur```, ```typeAheadHighlight```.
*default: false*
- **wrapHours**
If a time greater than 24 hours (27:30, for example) is entered, apply modolo 24 to create a valid time. Setting this to `false` will cause an input of 27:30 to result in a `timeFormatError` event.
*default: true*
Methods
-------
- **getSecondsFromMidnight**
Get the time as an integer, expressed as seconds from 12am.
```javascript
$('#getTimeExample').timepicker('getSecondsFromMidnight');
```
- **getTime**
Get the time using a Javascript Date object, relative to a Date object (default: today's date).
```javascript
$('#getTimeExample').timepicker('getTime');
$('#getTimeExample').timepicker('getTime', new Date());
```
You can get the time as a string using jQuery's built-in ```val()``` function:
```javascript
$('#getTimeExample').val();
```
- **hide**
Close the timepicker dropdown.
```javascript
$('#hideExample').timepicker('hide');
```
- **isVisible**
Check if the timepicker attached to *a specific input* is visible. Not compatible with the `useSelect` option.
```javascript
$('#hideExample').timepicker('isVisible');
```
- **option**
Change the settings of an existing timepicker. Calling ```option``` on a visible timepicker will cause the picker to be hidden.
```javascript
$('#optionExample').timepicker({ 'timeFormat': 'g:ia' }); // initialize the timepicker sometime earlier in your code
...
$('#optionExample').timepicker('option', 'minTime', '2:00am');
$('#optionExample').timepicker('option', { 'minTime': '4:00am', 'timeFormat': 'H:i' });
```
- **remove**
Unbind an existing timepicker element.
```javascript
$('#removeExample').timepicker('remove');
```
- **setTime**
Set the time using a Javascript Date object.
```javascript
$('#setTimeExample').timepicker('setTime', new Date());
```
- **show**
Display the timepicker dropdown.
```javascript
$('#showExample').timepicker('show');
```
Events
------
- **change**
The native ```onChange``` event will fire any time the input value is updated, whether by selection from the timepicker list or manual entry into the text input. Your code should bind to ```change``` after initializing timepicker, or use [event delegation](http://api.jquery.com/on/).
- **changeTime**
Called after a valid time value is entered or selected. See ```timeFormatError``` and ```timeRangeError``` for error events. Fires before ```change``` event.
- **hideTimepicker**
Called after the timepicker is closed.
- **selectTime**
Called after a time value is selected from the timepicker list. Fires before ```change``` event.
- **showTimepicker**
Called after the timepicker is shown.
- **timeFormatError**
Called if an unparseable time string is manually entered into the timepicker input. Fires before ```change``` event.
- **timeRangeError**
Called if maxTime and minTime, or disableTimeRanges is set and an invalid time is manually entered into the timepicker input. Fires before ```change``` event.
The `selectTime` and `hideTimepicker` events fire slightly differently when using the `useSelect` option. See https://github.com/jonthornton/jquery-timepicker/issues/427 for more information.
Theming
-------
Sample markup with class names:
```html
<input value="5:00pm" class="ui-timepicker-input" type="text">
...
<div class="ui-timepicker-wrapper ui-timepicker-positioned-top optional-custom-classname" tabindex="-1">
<ul class="ui-timepicker-list">
<li class="ui-timepicker-am">12:00am</li>
<li class="ui-timepicker-am">12:30am</li>
...
<li class="ui-timepicker-pm">4:30pm</li>
<li class="ui-timepicker-pm ui-timepicker-selected">5:00pm</li>
<li class="ui-timepicker-pm ui-timepicker-disabled">5:30pm</li>
<li class="ui-timepicker-pm">6:00pm <span class="ui-timepicker-duration">(1 hour)</span></li>
<li class="ui-timepicker-pm">6:30pm</li>
...
<li class="ui-timepicker-pm">11:30pm</li>
</ul>
</div>
```
The `ui-timepicker-positioned-top` class will be applied only when the dropdown is positioned above the input.
## Packaging
NPM [npm install --save timepicker](https://www.npmjs.com/package/timepicker)
CDN [https://cdn.jsdelivr.net/npm/timepicker/](https://cdn.jsdelivr.net/npm/timepicker/) [![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/timepicker/badge)](https://www.jsdelivr.com/package/npm/timepicker)
An AngularJS directive is available at https://github.com/Recras/angular-jquery-timepicker
Help
----
Submit a [GitHub Issues request](https://github.com/jonthornton/jquery-timepicker/issues/new). Please try provide code that demonstrates the problem; you can use [this jsFiddle](http://jsfiddle.net/jonthornton/28uvg/) as a starting point.
Development guidelines
----------------------
After cloning, install dev dependencies with `npm install`.
* `npm run build`: compile timepicker and place updated output in the project root
* `npm run watch`: rebuild every time one of the source files changes
* `npm run format`: apply code formatting rules
* `npm run test`: run the jest test suite
jquery-timepicker follows [semantic versioning](http://semver.org/).
- - -
This software is made available under the open source MIT License. &copy; 2020 [Jon Thornton](https://www.jonthornton.com) and [contributors](https://github.com/jonthornton/jquery-timepicker/graphs/contributors)

View File

@@ -0,0 +1,16 @@
{
"name": "jt.timepicker",
"version": "1.13.10",
"description": "A jQuery timepicker plugin inspired by Google Calendar.",
"homepage": "http://jonthornton.github.com/jquery-timepicker",
"main": ["./jquery.timepicker.js", "./jquery.timepicker.css"],
"dependencies": {
"jquery": ">= 1.7"
},
"keywords": ["time", "picker", "google calendar"],
"author": {
"name": "Jon Thornton",
"web": "https://github.com/jonthornton"
},
"license": "MIT"
}

View File

@@ -0,0 +1,23 @@
{
"name": "jonthornton/jquery-timepicker",
"description":
"A javascript timepicker plugin for jQuery inspired by Google Calendar.",
"type": "component",
"homepage": "http://jonthornton.github.io/jquery-timepicker/",
"license": "MIT",
"authors": [
{
"name": "Jon Thornton"
}
],
"require": {
"robloach/component-installer": "*",
"components/jquery": "*"
},
"extra": {
"component": {
"scripts": ["jquery.timepicker.js"],
"files": ["jquery.timepicker.min.js", "jquery.timepicker.css"]
}
}
}

View File

@@ -0,0 +1,512 @@
/*!
* Datepicker for Bootstrap
*
* Copyright 2012 Stefan Petre
* Improvements by Andrew Rowls
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
*/
.datepicker {
padding: 4px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
direction: ltr;
/*.dow {
border-top: 1px solid #ddd !important;
}*/
}
.datepicker-inline {
width: 220px;
}
.datepicker.datepicker-rtl {
direction: rtl;
}
.datepicker.datepicker-rtl table tr td span {
float: right;
}
.datepicker-dropdown {
top: 0;
left: 0;
}
.datepicker-dropdown:before {
content: '';
display: inline-block;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-top: 0;
border-bottom-color: rgba(0, 0, 0, 0.2);
position: absolute;
}
.datepicker-dropdown:after {
content: '';
display: inline-block;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #ffffff;
border-top: 0;
position: absolute;
}
.datepicker-dropdown.datepicker-orient-left:before {
left: 6px;
}
.datepicker-dropdown.datepicker-orient-left:after {
left: 7px;
}
.datepicker-dropdown.datepicker-orient-right:before {
right: 6px;
}
.datepicker-dropdown.datepicker-orient-right:after {
right: 7px;
}
.datepicker-dropdown.datepicker-orient-top:before {
top: -7px;
}
.datepicker-dropdown.datepicker-orient-top:after {
top: -6px;
}
.datepicker-dropdown.datepicker-orient-bottom:before {
bottom: -7px;
border-bottom: 0;
border-top: 7px solid #999;
}
.datepicker-dropdown.datepicker-orient-bottom:after {
bottom: -6px;
border-bottom: 0;
border-top: 6px solid #ffffff;
}
.datepicker > div {
display: none;
}
.datepicker.days div.datepicker-days {
display: block;
}
.datepicker.months div.datepicker-months {
display: block;
}
.datepicker.years div.datepicker-years {
display: block;
}
.datepicker table {
margin: 0;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.datepicker td,
.datepicker th {
text-align: center;
width: 20px;
height: 20px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
border: none;
}
.table-striped .datepicker table tr td,
.table-striped .datepicker table tr th {
background-color: transparent;
}
.datepicker table tr td.day:hover,
.datepicker table tr td.day.focused {
background: #eeeeee;
cursor: pointer;
}
.datepicker table tr td.old,
.datepicker table tr td.new {
color: #999999;
}
.datepicker table tr td.disabled,
.datepicker table tr td.disabled:hover {
background: none;
color: #999999;
cursor: default;
}
.datepicker table tr td.today,
.datepicker table tr td.today:hover,
.datepicker table tr td.today.disabled,
.datepicker table tr td.today.disabled:hover {
background-color: #fde19a;
background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a);
background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a);
background-image: -o-linear-gradient(top, #fdd49a, #fdf59a);
background-image: linear-gradient(top, #fdd49a, #fdf59a);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
border-color: #fdf59a #fdf59a #fbed50;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
color: #000;
}
.datepicker table tr td.today:hover,
.datepicker table tr td.today:hover:hover,
.datepicker table tr td.today.disabled:hover,
.datepicker table tr td.today.disabled:hover:hover,
.datepicker table tr td.today:active,
.datepicker table tr td.today:hover:active,
.datepicker table tr td.today.disabled:active,
.datepicker table tr td.today.disabled:hover:active,
.datepicker table tr td.today.active,
.datepicker table tr td.today:hover.active,
.datepicker table tr td.today.disabled.active,
.datepicker table tr td.today.disabled:hover.active,
.datepicker table tr td.today.disabled,
.datepicker table tr td.today:hover.disabled,
.datepicker table tr td.today.disabled.disabled,
.datepicker table tr td.today.disabled:hover.disabled,
.datepicker table tr td.today[disabled],
.datepicker table tr td.today:hover[disabled],
.datepicker table tr td.today.disabled[disabled],
.datepicker table tr td.today.disabled:hover[disabled] {
background-color: #fdf59a;
}
.datepicker table tr td.today:active,
.datepicker table tr td.today:hover:active,
.datepicker table tr td.today.disabled:active,
.datepicker table tr td.today.disabled:hover:active,
.datepicker table tr td.today.active,
.datepicker table tr td.today:hover.active,
.datepicker table tr td.today.disabled.active,
.datepicker table tr td.today.disabled:hover.active {
background-color: #fbf069 \9;
}
.datepicker table tr td.today:hover:hover {
color: #000;
}
.datepicker table tr td.today.active:hover {
color: #fff;
}
.datepicker table tr td.range,
.datepicker table tr td.range:hover,
.datepicker table tr td.range.disabled,
.datepicker table tr td.range.disabled:hover {
background: #eeeeee;
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
}
.datepicker table tr td.range.today,
.datepicker table tr td.range.today:hover,
.datepicker table tr td.range.today.disabled,
.datepicker table tr td.range.today.disabled:hover {
background-color: #f3d17a;
background-image: -moz-linear-gradient(top, #f3c17a, #f3e97a);
background-image: -ms-linear-gradient(top, #f3c17a, #f3e97a);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));
background-image: -webkit-linear-gradient(top, #f3c17a, #f3e97a);
background-image: -o-linear-gradient(top, #f3c17a, #f3e97a);
background-image: linear-gradient(top, #f3c17a, #f3e97a);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);
border-color: #f3e97a #f3e97a #edde34;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
}
.datepicker table tr td.range.today:hover,
.datepicker table tr td.range.today:hover:hover,
.datepicker table tr td.range.today.disabled:hover,
.datepicker table tr td.range.today.disabled:hover:hover,
.datepicker table tr td.range.today:active,
.datepicker table tr td.range.today:hover:active,
.datepicker table tr td.range.today.disabled:active,
.datepicker table tr td.range.today.disabled:hover:active,
.datepicker table tr td.range.today.active,
.datepicker table tr td.range.today:hover.active,
.datepicker table tr td.range.today.disabled.active,
.datepicker table tr td.range.today.disabled:hover.active,
.datepicker table tr td.range.today.disabled,
.datepicker table tr td.range.today:hover.disabled,
.datepicker table tr td.range.today.disabled.disabled,
.datepicker table tr td.range.today.disabled:hover.disabled,
.datepicker table tr td.range.today[disabled],
.datepicker table tr td.range.today:hover[disabled],
.datepicker table tr td.range.today.disabled[disabled],
.datepicker table tr td.range.today.disabled:hover[disabled] {
background-color: #f3e97a;
}
.datepicker table tr td.range.today:active,
.datepicker table tr td.range.today:hover:active,
.datepicker table tr td.range.today.disabled:active,
.datepicker table tr td.range.today.disabled:hover:active,
.datepicker table tr td.range.today.active,
.datepicker table tr td.range.today:hover.active,
.datepicker table tr td.range.today.disabled.active,
.datepicker table tr td.range.today.disabled:hover.active {
background-color: #efe24b \9;
}
.datepicker table tr td.selected,
.datepicker table tr td.selected:hover,
.datepicker table tr td.selected.disabled,
.datepicker table tr td.selected.disabled:hover {
background-color: #9e9e9e;
background-image: -moz-linear-gradient(top, #b3b3b3, #808080);
background-image: -ms-linear-gradient(top, #b3b3b3, #808080);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080));
background-image: -webkit-linear-gradient(top, #b3b3b3, #808080);
background-image: -o-linear-gradient(top, #b3b3b3, #808080);
background-image: linear-gradient(top, #b3b3b3, #808080);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);
border-color: #808080 #808080 #595959;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
.datepicker table tr td.selected:hover,
.datepicker table tr td.selected:hover:hover,
.datepicker table tr td.selected.disabled:hover,
.datepicker table tr td.selected.disabled:hover:hover,
.datepicker table tr td.selected:active,
.datepicker table tr td.selected:hover:active,
.datepicker table tr td.selected.disabled:active,
.datepicker table tr td.selected.disabled:hover:active,
.datepicker table tr td.selected.active,
.datepicker table tr td.selected:hover.active,
.datepicker table tr td.selected.disabled.active,
.datepicker table tr td.selected.disabled:hover.active,
.datepicker table tr td.selected.disabled,
.datepicker table tr td.selected:hover.disabled,
.datepicker table tr td.selected.disabled.disabled,
.datepicker table tr td.selected.disabled:hover.disabled,
.datepicker table tr td.selected[disabled],
.datepicker table tr td.selected:hover[disabled],
.datepicker table tr td.selected.disabled[disabled],
.datepicker table tr td.selected.disabled:hover[disabled] {
background-color: #808080;
}
.datepicker table tr td.selected:active,
.datepicker table tr td.selected:hover:active,
.datepicker table tr td.selected.disabled:active,
.datepicker table tr td.selected.disabled:hover:active,
.datepicker table tr td.selected.active,
.datepicker table tr td.selected:hover.active,
.datepicker table tr td.selected.disabled.active,
.datepicker table tr td.selected.disabled:hover.active {
background-color: #666666 \9;
}
.datepicker table tr td.active,
.datepicker table tr td.active:hover,
.datepicker table tr td.active.disabled,
.datepicker table tr td.active.disabled:hover {
background-color: #006dcc;
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
background-image: -ms-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(top, #0088cc, #0044cc);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', 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);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
.datepicker table tr td.active:hover,
.datepicker table tr td.active:hover:hover,
.datepicker table tr td.active.disabled:hover,
.datepicker table tr td.active.disabled:hover:hover,
.datepicker table tr td.active:active,
.datepicker table tr td.active:hover:active,
.datepicker table tr td.active.disabled:active,
.datepicker table tr td.active.disabled:hover:active,
.datepicker table tr td.active.active,
.datepicker table tr td.active:hover.active,
.datepicker table tr td.active.disabled.active,
.datepicker table tr td.active.disabled:hover.active,
.datepicker table tr td.active.disabled,
.datepicker table tr td.active:hover.disabled,
.datepicker table tr td.active.disabled.disabled,
.datepicker table tr td.active.disabled:hover.disabled,
.datepicker table tr td.active[disabled],
.datepicker table tr td.active:hover[disabled],
.datepicker table tr td.active.disabled[disabled],
.datepicker table tr td.active.disabled:hover[disabled] {
background-color: #0044cc;
}
.datepicker table tr td.active:active,
.datepicker table tr td.active:hover:active,
.datepicker table tr td.active.disabled:active,
.datepicker table tr td.active.disabled:hover:active,
.datepicker table tr td.active.active,
.datepicker table tr td.active:hover.active,
.datepicker table tr td.active.disabled.active,
.datepicker table tr td.active.disabled:hover.active {
background-color: #003399 \9;
}
.datepicker table tr td span {
display: block;
width: 23%;
height: 54px;
line-height: 54px;
float: left;
margin: 1%;
cursor: pointer;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.datepicker table tr td span:hover {
background: #eeeeee;
}
.datepicker table tr td span.disabled,
.datepicker table tr td span.disabled:hover {
background: none;
color: #999999;
cursor: default;
}
.datepicker table tr td span.active,
.datepicker table tr td span.active:hover,
.datepicker table tr td span.active.disabled,
.datepicker table tr td span.active.disabled:hover {
background-color: #006dcc;
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
background-image: -ms-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(top, #0088cc, #0044cc);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', 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);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
.datepicker table tr td span.active:hover,
.datepicker table tr td span.active:hover:hover,
.datepicker table tr td span.active.disabled:hover,
.datepicker table tr td span.active.disabled:hover:hover,
.datepicker table tr td span.active:active,
.datepicker table tr td span.active:hover:active,
.datepicker table tr td span.active.disabled:active,
.datepicker table tr td span.active.disabled:hover:active,
.datepicker table tr td span.active.active,
.datepicker table tr td span.active:hover.active,
.datepicker table tr td span.active.disabled.active,
.datepicker table tr td span.active.disabled:hover.active,
.datepicker table tr td span.active.disabled,
.datepicker table tr td span.active:hover.disabled,
.datepicker table tr td span.active.disabled.disabled,
.datepicker table tr td span.active.disabled:hover.disabled,
.datepicker table tr td span.active[disabled],
.datepicker table tr td span.active:hover[disabled],
.datepicker table tr td span.active.disabled[disabled],
.datepicker table tr td span.active.disabled:hover[disabled] {
background-color: #0044cc;
}
.datepicker table tr td span.active:active,
.datepicker table tr td span.active:hover:active,
.datepicker table tr td span.active.disabled:active,
.datepicker table tr td span.active.disabled:hover:active,
.datepicker table tr td span.active.active,
.datepicker table tr td span.active:hover.active,
.datepicker table tr td span.active.disabled.active,
.datepicker table tr td span.active.disabled:hover.active {
background-color: #003399 \9;
}
.datepicker table tr td span.old,
.datepicker table tr td span.new {
color: #999999;
}
.datepicker th.datepicker-switch {
width: 145px;
}
.datepicker thead tr:first-child th,
.datepicker tfoot tr th {
cursor: pointer;
}
.datepicker thead tr:first-child th:hover,
.datepicker tfoot tr th:hover {
background: #eeeeee;
}
.datepicker .cw {
font-size: 10px;
width: 12px;
padding: 0 2px 0 5px;
vertical-align: middle;
}
.datepicker thead tr:first-child th.cw {
cursor: default;
background-color: transparent;
}
.input-append.date .add-on i,
.input-prepend.date .add-on i {
cursor: pointer;
width: 16px;
height: 16px;
}
.input-daterange input {
text-align: center;
}
.input-daterange input:first-child {
-webkit-border-radius: 3px 0 0 3px;
-moz-border-radius: 3px 0 0 3px;
border-radius: 3px 0 0 3px;
}
.input-daterange input:last-child {
-webkit-border-radius: 0 3px 3px 0;
-moz-border-radius: 0 3px 3px 0;
border-radius: 0 3px 3px 0;
}
.input-daterange .add-on {
display: inline-block;
width: auto;
min-width: 16px;
height: 20px;
padding: 4px 5px;
font-weight: normal;
line-height: 20px;
text-align: center;
text-shadow: 0 1px 0 #ffffff;
vertical-align: middle;
background-color: #eeeeee;
border: 1px solid #ccc;
margin-left: -5px;
margin-right: -5px;
}
.datepicker.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
z-index: 1000;
float: left;
display: none;
min-width: 160px;
list-style: none;
background-color: #ffffff;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, 0.2);
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
*border-right-width: 2px;
*border-bottom-width: 2px;
color: #333333;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 13px;
line-height: 20px;
}
.datepicker.dropdown-menu th,
.datepicker.dropdown-menu td {
padding: 4px 5px;
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -0,0 +1,195 @@
body {
background: #f0f0f0;
color: #444;
font-family: helvetica, arial, sans-serif;
font-size: 15px;
line-height: 1.3;
margin: 0;
padding: 0;
}
header,
section,
footer {
padding: 20px;
}
header,
footer {
background: #d4d4d4;
color: #666;
position: relative;
}
header h1 {
margin: 0;
padding: 0;
}
header h1 a {
font-family: Lucida Sans Unicode, Lucida Grande, sans-serif;
font-size: 60px;
font-weight: 200;
text-decoration: none;
}
header p {
font-size: 23px;
}
#header-links {
margin: 0;
padding: 0;
list-style: none;
position: absolute;
right: 20px;
top: 30px;
text-align: right;
}
#header-links a {
color: #888;
}
#header-links a:hover {
color: #06c;
}
h2 {
color: #444;
font-size: 35px;
font-weight: normal;
margin: 0;
line-height: 1.1
}
p {
margin: 20px 0 0 0;
}
p:first-child {
margin-top: 0;
}
input {
font-size: 13px;
-webkit-border-radius: 3px;
-moz-border-radius: 5px;
border-radius: 5px;
padding: 3px;
background: #fff;
border: 1px solid #aac;
}
input.time {
width: 80px;
}
input.date {
width: 90px;
}
a {
color: #06c;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
image {
border: 0;
}
.body-text {
width: 700px;
}
#examples article {
padding-top: 100px;
clear: both;
}
#examples article:first-child {
padding-top: 0;
}
#examples .demo {
width: 450px;
float: left;
}
#examples .code {
font-size: 12px;
margin: 0 0 0 470px;
}
footer {
font-size: 12px;
}
/**
* Blackboard theme
*
* Adapted from Domenico Carbotta's TextMate theme of the same name
*
* @author Domenico Carbotta
* @author Craig Campbell
* @version 1.0.2
*/
pre {
background: #0B1022;
word-wrap: break-word;
margin: 0px;
padding: 0px;
padding: 10px;
color: #fff;
font-size: 14px;
margin-bottom: 20px;
}
pre, code {
font-family: 'Monaco', courier, monospace;
}
pre .comment {
color: #727272;
}
pre .constant {
color: #D8FA3C;
}
pre .storage {
color: #FBDE2D;
}
pre .string, pre .comment.docstring {
color: #61CE3C;
}
pre .string.regexp, pre .support.tag.script, pre .support.tag.style {
color: #fff;
}
pre .keyword, pre .selector {
color: #FBDE2D;
}
pre .inherited-class {
font-style: italic;
}
pre .entity {
color: #FF6400;
}
pre .support, *[data-language="c"] .function.call {
color: #8DA6CE;
}
pre .variable.global, pre .variable.class, pre .variable.instance {
color: #FF6400;
}

View File

@@ -0,0 +1,10 @@
/* Rainbow v1.1.9 rainbowco.de | included languages: generic, javascript */
window.Rainbow=function(){function q(a){var b,c=a.getAttribute&&a.getAttribute("data-language")||0;if(!c){a=a.attributes;for(b=0;b<a.length;++b)if("data-language"===a[b].nodeName)return a[b].nodeValue}return c}function B(a){var b=q(a)||q(a.parentNode);if(!b){var c=/\blang(?:uage)?-(\w+)/;(a=a.className.match(c)||a.parentNode.className.match(c))&&(b=a[1])}return b}function C(a,b){for(var c in e[d]){c=parseInt(c,10);if(a==c&&b==e[d][c]?0:a<=c&&b>=e[d][c])delete e[d][c],delete j[d][c];if(a>=c&&a<e[d][c]||
b>c&&b<e[d][c])return!0}return!1}function r(a,b){return'<span class="'+a.replace(/\./g," ")+(l?" "+l:"")+'">'+b+"</span>"}function s(a,b,c,h){var f=a.exec(c);if(f){++t;!b.name&&"string"==typeof b.matches[0]&&(b.name=b.matches[0],delete b.matches[0]);var k=f[0],i=f.index,u=f[0].length+i,g=function(){function f(){s(a,b,c,h)}t%100>0?f():setTimeout(f,0)};if(C(i,u))g();else{var m=v(b.matches),l=function(a,c,h){if(a>=c.length)h(k);else{var d=f[c[a]];if(d){var e=b.matches[c[a]],i=e.language,g=e.name&&e.matches?
e.matches:e,j=function(b,d,e){var i;i=0;var g;for(g=1;g<c[a];++g)f[g]&&(i=i+f[g].length);d=e?r(e,d):d;k=k.substr(0,i)+k.substr(i).replace(b,d);l(++a,c,h)};i?n(d,i,function(a){j(d,a)}):typeof e==="string"?j(d,d,e):w(d,g.length?g:[g],function(a){j(d,a,e.matches?e.name:0)})}else l(++a,c,h)}};l(0,m,function(a){b.name&&(a=r(b.name,a));if(!j[d]){j[d]={};e[d]={}}j[d][i]={replace:f[0],"with":a};e[d][i]=u;g()})}}else h()}function v(a){var b=[],c;for(c in a)a.hasOwnProperty(c)&&b.push(c);return b.sort(function(a,
b){return b-a})}function w(a,b,c){function h(b,k){k<b.length?s(b[k].pattern,b[k],a,function(){h(b,++k)}):D(a,function(a){delete j[d];delete e[d];--d;c(a)})}++d;h(b,0)}function D(a,b){function c(a,b,h,e){if(h<b.length){++x;var g=b[h],l=j[d][g],a=a.substr(0,g)+a.substr(g).replace(l.replace,l["with"]),g=function(){c(a,b,++h,e)};0<x%250?g():setTimeout(g,0)}else e(a)}var h=v(j[d]);c(a,h,0,b)}function n(a,b,c){var d=m[b]||[],f=m[y]||[],b=z[b]?d:d.concat(f);w(a.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/&(?![\w\#]+;)/g,
"&amp;"),b,c)}function o(a,b,c){if(b<a.length){var d=a[b],f=B(d);return!(-1<(" "+d.className+" ").indexOf(" rainbow "))&&f?(f=f.toLowerCase(),d.className+=d.className?" rainbow":"rainbow",n(d.innerHTML,f,function(k){d.innerHTML=k;j={};e={};p&&p(d,f);setTimeout(function(){o(a,++b,c)},0)})):o(a,++b,c)}c&&c()}function A(a,b){var a=a&&"function"==typeof a.getElementsByTagName?a:document,c=a.getElementsByTagName("pre"),d=a.getElementsByTagName("code"),f,e=[];for(f=0;f<d.length;++f)e.push(d[f]);for(f=0;f<
c.length;++f)c[f].getElementsByTagName("code").length||e.push(c[f]);o(e,0,b)}var j={},e={},m={},z={},d=0,y=0,t=0,x=0,l,p;return{extend:function(a,b,c){1==arguments.length&&(b=a,a=y);z[a]=c;m[a]=b.concat(m[a]||[])},b:function(a){p=a},a:function(a){l=a},color:function(a,b,c){if("string"==typeof a)return n(a,b,c);if("function"==typeof a)return A(0,a);A(a,b)}}}();window.addEventListener?window.addEventListener("load",Rainbow.color,!1):window.attachEvent("onload",Rainbow.color);Rainbow.onHighlight=Rainbow.b;
Rainbow.addClass=Rainbow.a;Rainbow.extend([{matches:{1:{name:"keyword.operator",pattern:/\=/g},2:{name:"string",matches:{name:"constant.character.escape",pattern:/\\('|"){1}/g}}},pattern:/(\(|\s|\[|\=|:)(('|")([^\\\1]|\\.)*?(\3))/gm},{name:"comment",pattern:/\/\*[\s\S]*?\*\/|(\/\/|\#)[\s\S]*?$/gm},{name:"constant.numeric",pattern:/\b(\d+(\.\d+)?(e(\+|\-)?\d+)?(f|d)?|0x[\da-f]+)\b/gi},{matches:{1:"keyword"},pattern:/\b(and|array|as|bool(ean)?|c(atch|har|lass|onst)|d(ef|elete|o(uble)?)|e(cho|lse(if)?|xit|xtends|xcept)|f(inally|loat|or(each)?|unction)|global|if|import|int(eger)?|long|new|object|or|pr(int|ivate|otected)|public|return|self|st(ring|ruct|atic)|switch|th(en|is|row)|try|(un)?signed|var|void|while)(?=\(|\b)/gi},
{name:"constant.language",pattern:/true|false|null/g},{name:"keyword.operator",pattern:/\+|\!|\-|&(gt|lt|amp);|\||\*|\=/g},{matches:{1:"function.call"},pattern:/(\w+?)(?=\()/g},{matches:{1:"storage.function",2:"entity.name.function"},pattern:/(function)\s(.*?)(?=\()/g}]);Rainbow.extend("javascript",[{name:"selector",pattern:/(\s|^)\$(?=\.|\()/g},{name:"support",pattern:/\b(window|document)\b/g},{matches:{1:"support.property"},pattern:/\.(length|node(Name|Value))\b/g},{matches:{1:"support.function"},pattern:/(setTimeout|setInterval)(?=\()/g},{matches:{1:"support.method"},pattern:/\.(getAttribute|push|getElementById|getElementsByClassName|log|setTimeout|setInterval)(?=\()/g},{matches:{1:"support.tag.script",2:[{name:"string",pattern:/('|")(.*?)(\1)/g},{name:"entity.tag.script",
pattern:/(\w+)/g}],3:"support.tag.script"},pattern:/(&lt;\/?)(script.*?)(&gt;)/g},{name:"string.regexp",matches:{1:"string.regexp.open",2:{name:"constant.regexp.escape",pattern:/\\(.){1}/g},3:"string.regexp.close",4:"string.regexp.modifier"},pattern:/(\/)(?!\*)(.+)(\/)([igm]{0,3})/g},{matches:{1:"storage",3:"entity.function"},pattern:/(var)?(\s|^)(.*)(?=\s?=\s?function\()/g},{name:"entity.function",pattern:/(\w+)(?=:\s{0,}function)/g}]);

View File

@@ -0,0 +1,72 @@
.ui-timepicker-wrapper {
overflow-y: auto;
max-height: 150px;
width: 6.5em;
background: #fff;
border: 1px solid #ddd;
-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);
-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);
box-shadow:0 5px 10px rgba(0,0,0,0.2);
outline: none;
z-index: 10052;
margin: 0;
}
.ui-timepicker-wrapper.ui-timepicker-with-duration {
width: 13em;
}
.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-30,
.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-60 {
width: 11em;
}
.ui-timepicker-list {
margin: 0;
padding: 0;
list-style: none;
}
.ui-timepicker-duration {
margin-left: 5px; color: #888;
}
.ui-timepicker-list:hover .ui-timepicker-duration {
color: #888;
}
.ui-timepicker-list li {
padding: 3px 0 3px 5px;
cursor: pointer;
white-space: nowrap;
color: #000;
list-style: none;
margin: 0;
}
.ui-timepicker-list:hover .ui-timepicker-selected {
background: #fff; color: #000;
}
li.ui-timepicker-selected,
.ui-timepicker-list li:hover,
.ui-timepicker-list .ui-timepicker-selected:hover {
background: #1980EC; color: #fff;
}
li.ui-timepicker-selected .ui-timepicker-duration,
.ui-timepicker-list li:hover .ui-timepicker-duration {
color: #ccc;
}
.ui-timepicker-list li.ui-timepicker-disabled,
.ui-timepicker-list li.ui-timepicker-disabled:hover,
.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
color: #888;
cursor: default;
}
.ui-timepicker-list li.ui-timepicker-disabled:hover,
.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
background: #f2f2f2;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,72 @@
.ui-timepicker-wrapper {
overflow-y: auto;
max-height: 150px;
width: 6.5em;
background: #fff;
border: 1px solid #ddd;
-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);
-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);
box-shadow:0 5px 10px rgba(0,0,0,0.2);
outline: none;
z-index: 10052;
margin: 0;
}
.ui-timepicker-wrapper.ui-timepicker-with-duration {
width: 13em;
}
.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-30,
.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-60 {
width: 11em;
}
.ui-timepicker-list {
margin: 0;
padding: 0;
list-style: none;
}
.ui-timepicker-duration {
margin-left: 5px; color: #888;
}
.ui-timepicker-list:hover .ui-timepicker-duration {
color: #888;
}
.ui-timepicker-list li {
padding: 3px 0 3px 5px;
cursor: pointer;
white-space: nowrap;
color: #000;
list-style: none;
margin: 0;
}
.ui-timepicker-list:hover .ui-timepicker-selected {
background: #fff; color: #000;
}
li.ui-timepicker-selected,
.ui-timepicker-list li:hover,
.ui-timepicker-list .ui-timepicker-selected:hover {
background: #1980EC; color: #fff;
}
li.ui-timepicker-selected .ui-timepicker-duration,
.ui-timepicker-list li:hover .ui-timepicker-duration {
color: #ccc;
}
.ui-timepicker-list li.ui-timepicker-disabled,
.ui-timepicker-list li.ui-timepicker-disabled:hover,
.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
color: #888;
cursor: default;
}
.ui-timepicker-list li.ui-timepicker-disabled:hover,
.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
background: #f2f2f2;
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,27 @@
{
"name": "jt.timepicker",
"version": "1.13.10",
"title": "jquery-timepicker",
"description": "A jQuery timepicker plugin inspired by Google Calendar. It supports both mouse and keyboard navigation.",
"author": {
"name": "Jon Thornton",
"email": "thornton.jon@gmail.com",
"url": "https://github.com/jonthornton"
},
"licenses": [
{
"type": "MIT",
"url": "MIT-LICENSE.txt"
}
],
"dependencies": {
"jquery": ">=1.7"
},
"keywords": [ "timepicker", "time", "picker", "ui", "calendar", "input", "form" ],
"homepage": "http://jonthornton.github.com/jquery-timepicker/",
"bugs": {
"url": "https://github.com/jonthornton/jquery-timepicker/issues"
},
"docs": "https://github.com/jonthornton/jquery-timepicker",
"download": "https://github.com/jonthornton/jquery-timepicker"
}

9113
web/assets/jt.timepicker/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,53 @@
{
"name": "timepicker",
"version": "1.13.10",
"title": "jquery-timepicker",
"author": {
"name": "Jon Thornton",
"url": "https://github.com/jonthornton"
},
"scripts": {
"build": "rollup --config rollup.config.js",
"watch": "rollup -w --config rollup.config.js",
"format": "prettier-eslint --write \"src/**/*.js\"",
"test": "jest"
},
"license": "MIT",
"dependencies": {
"jquery": ">=1.7"
},
"devDependencies": {
"@babel/core": "^7.0.0",
"@babel/preset-env": "^7.0.0",
"@rollup/plugin-babel": "^5.0.0",
"babel-jest": "^25.4.0",
"jest": "^25.4.0",
"prettier-eslint": "^9.0.1",
"prettier-eslint-cli": "^5.0.0",
"rollup": "^2.7.6",
"rollup-plugin-copy": "^3.3.0",
"rollup-plugin-terser": "^5.3.0"
},
"main": "jquery.timepicker.min.js",
"files": [
"jquery.timepicker.min.js",
"jquery.timepicker.js",
"jquery.timepicker.css"
],
"description": "A jQuery timepicker plugin inspired by Google Calendar. It supports both mouse and keyboard navigation.",
"keywords": [
"timepicker",
"time",
"picker",
"ui",
"google calendar"
],
"homepage": "http://jonthornton.github.com/jquery-timepicker/",
"repository": {
"type": "git",
"url": "https://github.com/jonthornton/jquery-timepicker.git"
},
"bugs": {
"url": "https://github.com/jonthornton/jquery-timepicker/issues"
}
}

View File

@@ -0,0 +1,35 @@
import { terser } from "rollup-plugin-terser";
import copy from 'rollup-plugin-copy'
import { version } from './package.json';
import babel from '@rollup/plugin-babel';
const banner = `/*!
* jquery-timepicker v${version} - A jQuery timepicker plugin inspired by Google Calendar. It supports both mouse and keyboard navigation.
* Copyright (c) 2020 Jon Thornton - https://www.jonthornton.com/jquery-timepicker/
* License: MIT
*/`;
export default {
input: 'src/jquery.timepicker.js',
output: [
{
file: 'jquery.timepicker.js',
format: 'iife',
banner: banner
},
{
file: 'jquery.timepicker.min.js',
format: 'iife',
plugins: [terser()]
}
],
plugins: [
copy({
targets: [
{ src: 'src/static/jquery.timepicker.css', dest: './' },
{ src: 'src/static/jquery.timepicker.css', dest: './', rename: 'jquery.timepicker.min.css' },
]
}),
babel({ babelHelpers: 'bundled' })
]
};

View File

@@ -0,0 +1,59 @@
jest.dontMock("jquery").dontMock("../jquery.timepicker");
import $ from "jquery";
require("../jquery.timepicker");
const TEST_INPUT = "testInput";
beforeEach(() => {
document.body.innerHTML = `<div>
<input type="text" id="${TEST_INPUT}" />
</div>`;
});
test("timepicker initializes", () => {
$(`#${TEST_INPUT}`).timepicker();
});
test("show single string noneOption correctly", () => {
$(`#${TEST_INPUT}`)
.timepicker({
noneOption: "----"
})
.timepicker("show");
$(".ui-timepicker-list li:first-child").trigger("click");
expect($(`#${TEST_INPUT}`).val()).toEqual("");
});
test("timepicker can parse time value", () => {
$(`#${TEST_INPUT}`).val("2:37pm");
$(`#${TEST_INPUT}`).timepicker();
const expectedSecondsFromMidnight = 14 * 3600 + 37 * 60;
expect($(`#${TEST_INPUT}`).timepicker("getSecondsFromMidnight")).toEqual(
expectedSecondsFromMidnight
);
});
test("timepicker can tolerate undefined values", () => {
$(`#${TEST_INPUT}`).val("2:37pm");
$(`#${TEST_INPUT}`).timepicker({ 'disableTimeRanges': null });
});
test("setTime works", () => {
$(`#${TEST_INPUT}`).val("2:37pm");
$(`#${TEST_INPUT}`).timepicker();
$(`#${TEST_INPUT}`).timepicker('setTime', 43200);
expect($(`#${TEST_INPUT}`).val()).toEqual("12:00pm");
$(`#${TEST_INPUT}`).timepicker('setTime', '11pm');
expect($(`#${TEST_INPUT}`).val()).toEqual("11:00pm");
$(`#${TEST_INPUT}`).timepicker('setTime', new Date('December 17, 1995 03:24:00'));
expect($(`#${TEST_INPUT}`).val()).toEqual("3:24am");
});

View File

@@ -0,0 +1,157 @@
// Type definitions for jQuery.timepicker 1.12.0
// https://github.com/jonthornton/jquery-timepicker
/**
* Declaring a namespace because there are several jquery timepickers already out there on DefinitelyTyped. Jt stands for Jon Thornton
*/
declare namespace Jt.Timepicker {
/**
* Options object for the jquery.timepicker
*/
export interface Options {
/**
* Default: 'body'
* Override where the dropdown is appended.
* Takes either a string to use as a selector, a function that gets passed the clicked input element as argument or a jquery object to use directly.
*/
appendTo?: string | JQuery | ((clickedElement: JQuery) => JQuery);
/**
* Default: null
* A class name to apply to the HTML element that contains the timepicker dropdown.
*/
className?: string;
/**
* Default: false
* Close the timepicker when the window is scrolled. (Replicates <select> behavior.)
*/
closeOnWindowScroll?: boolean;
/**
* Default: false
* Disable typing in the timepicker input box; force users to select from list.
* More information https://github.com/jonthornton/jquery-timepicker/issues/425#issuecomment-133262458
*/
disableTextInput?: boolean;
/**
* Default: []
* Disable selection of certain time ranges. Input is an array of time pairs, like `[['3:00am', '4:30am'], ['5:00pm', '8:00pm']].
* The start of the interval will be disabled but the end won't.
*/
disableTimeRanges?: Array<string[]>;
/**
* Default: false
* Disables the onscreen keyboard for touch devices. There can be instances where Firefox or Chrome have touch events enabled
* (such as on Surface tablets but not actually be a touch device. In this case disableTouchKeyboard will prevent the timepicker
* input field from being focused.
* More information: https://github.com/jonthornton/jquery-timepicker/issues/413
*/
disableTouchKeyboard?: boolean;
/**
* Default: Same as the minTime
* The time against which showDuration will compute relative times. This should be given as a formatted date string.
*/
durationTime?: string | Date | (() => string | Date);
/**
* Default: false
* Force update the time to step settings as soon as it loses focus`.
*/
forceRoundTime?: boolean;
/**
* Default: 24 hours after minTime
* The time that should appear last in the dropdown list. Can be used to limit the range of time options.
*/
listWidth?: number;
/**
* Default: null
* Set this to override CSS styling and set the list width to match the input element's width. Set to 1 to match input width, 2 to double input width, .5 to halve input width, etc. Set to `null` to let CSS determine the list width.
*/
maxTime?: Date | string;
/**
* Default: 12:00 am
* The time that should appear first in the dropdown list.
*/
minTime?: Date | string;
/**
* Default: false.
* Adds one or more custom options to the top of the dropdown. Can accept several different value types:
* Boolean (true): Adds a "None" option that results in an empty input value
* String: Adds an option with a custom label that results in an empty input value
* Object: Similar to string, but allows customizing the element's class name and the resulting input value. Can contain label, value, and className properties. The value property must be a string type.
* Array: An array of strings or objects to add multiple non-time options
*/
noneOption?: boolean | string | string[] | NoneObject;
/**
* default: 'l'
* By default the timepicker dropdown will be aligned to the bottom right of the input element, or aligned to the top left if there isn't enough room below the input. Force alignment with l (left), r (right), t (top), and b (bottom). Examples: tl, rb.
*/
orientation?: string;
/**
* Default: Rounds to the nearest step
* Function used to compute rounded times. The function will receive time in seconds and a settings object as arguments. The function should handle a null value for seconds
*/
roundingFunction?: (seconds: number, settings: Options) => number;
/**
* Default: null
* If no time value is selected, set the dropdown scroll position to show the time provided, e.g. "09:00". A time string, Date object, or integer (seconds past midnight) is acceptible, as well as the string 'now'
*/
scrollDefault?: string | Date | number | {};
/**
* Default: false
* Update the input with the currently highlighted time value when the timepicker loses focus.
*/
selectOnBlur?: boolean;
/**
* Default: false
* Show "24:00" as an option when using 24-hour time format
*/
show2400?: boolean;
/**
* Default: false
* Shows the relative time for each item in the dropdown. minTime or durationTime must be set.
*/
showDuration?: boolean;
/**
* Default: ["click", "focus"]
* Display a timepicker dropdown when the input fires a particular event. Set to null or an empty array to disable automatic display. Setting should be an array of strings
*/
showOn?: string[];
/**
* @deprecated Display a timepicker dropdown when the input gains focus.
* Default: true
*/
showOnFocus?: boolean;
/**
* Default: 30
* The amount of time, in minutes, between each item in the dropdown. Alternately, you can specify a function to generate steps dynamically. The function will receive a count integer (0, 1, 2...) and is expected to return a step integer.
*/
step?: number;
/**
* Default: false
* When scrolling on the edge of the picker, it prevent parent containers () to scroll
*/
stopScrollPropagation?: boolean;
/**
* Default: 'g:ia'
* How times should be displayed in the list and input element. Uses PHP's date() formatting syntax. Characters can be escaped with a preceeding double slash (e.g. H\\hi). Alternatively, you can specify a function instead of a string, to use completely custom time formatting. In this case, * the format function receives a Date object and is expected to return a formatted time as a string
*/
timeFormat?: string | ((givenDate: Date) => string);
/**
* Default: true
* Highlight the nearest corresponding time option as a value is typed into the form input.
*/
typeaheadHighlight?: boolean;
/**
* Default: false
* Convert the input to an HTML <SELECT> control. This is ideal for small screen devices, or if you want to prevent the user from entering
* arbitrary values. This option is not compatible with the following options: appendTo, closeOnWindowScroll, disableTouchKeyboard,
* scrollDefault, selectOnBlur, typeAheadHighlight.
*/
useSelect?: boolean;
}
export interface NoneObject {
label: string;
value: string;
className: string;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,72 @@
.ui-timepicker-wrapper {
overflow-y: auto;
max-height: 150px;
width: 6.5em;
background: #fff;
border: 1px solid #ddd;
-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);
-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);
box-shadow:0 5px 10px rgba(0,0,0,0.2);
outline: none;
z-index: 10052;
margin: 0;
}
.ui-timepicker-wrapper.ui-timepicker-with-duration {
width: 13em;
}
.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-30,
.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-60 {
width: 11em;
}
.ui-timepicker-list {
margin: 0;
padding: 0;
list-style: none;
}
.ui-timepicker-duration {
margin-left: 5px; color: #888;
}
.ui-timepicker-list:hover .ui-timepicker-duration {
color: #888;
}
.ui-timepicker-list li {
padding: 3px 0 3px 5px;
cursor: pointer;
white-space: nowrap;
color: #000;
list-style: none;
margin: 0;
}
.ui-timepicker-list:hover .ui-timepicker-selected {
background: #fff; color: #000;
}
li.ui-timepicker-selected,
.ui-timepicker-list li:hover,
.ui-timepicker-list .ui-timepicker-selected:hover {
background: #1980EC; color: #fff;
}
li.ui-timepicker-selected .ui-timepicker-duration,
.ui-timepicker-list li:hover .ui-timepicker-duration {
color: #ccc;
}
.ui-timepicker-list li.ui-timepicker-disabled,
.ui-timepicker-list li.ui-timepicker-disabled:hover,
.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
color: #888;
cursor: default;
}
.ui-timepicker-list li.ui-timepicker-disabled:hover,
.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
background: #f2f2f2;
}

View File

@@ -0,0 +1,3 @@
const ONE_DAY = 86400;
export { ONE_DAY };

View File

@@ -0,0 +1,43 @@
import roundingFunction from "./rounding";
const DEFAULT_SETTINGS = {
appendTo: "body",
className: null,
closeOnWindowScroll: false,
disableTextInput: false,
disableTimeRanges: [],
disableTouchKeyboard: false,
durationTime: null,
forceRoundTime: false,
lang: {},
maxTime: null,
minTime: null,
noneOption: false,
orientation: "l",
roundingFunction,
scrollDefault: null,
selectOnBlur: false,
show2400: false,
showDuration: false,
showOn: ["click", "focus"],
showOnFocus: true,
step: 30,
stopScrollPropagation: false,
timeFormat: "g:ia",
typeaheadHighlight: true,
useSelect: false,
wrapHours: true
};
const DEFAULT_LANG = {
am: "am",
pm: "pm",
AM: "AM",
PM: "PM",
decimal: ".",
mins: "mins",
hr: "hr",
hrs: "hrs"
};
export { DEFAULT_SETTINGS, DEFAULT_LANG };

View File

@@ -0,0 +1,197 @@
import { DEFAULT_SETTINGS, DEFAULT_LANG } from "./defaults";
import { ONE_DAY } from "./constants";
class Timepicker {
constructor(targetEl, options = {}) {
const attrOptions = Timepicker.extractAttrOptions(
targetEl,
Object.keys(DEFAULT_SETTINGS)
);
this.settings = this.parseSettings({
...DEFAULT_SETTINGS,
...options,
...attrOptions
});
}
static extractAttrOptions(element, keys) {
const output = {};
for (const key of keys) {
// console.log(key, element)
if (key in element.dataset) {
output[key] = element.dataset[key];
}
}
return output;
}
time2int(timeString) {
if (timeString === "" || timeString === null || timeString === undefined)
return null;
if (timeString instanceof Date) {
return (
timeString.getHours() * 3600 +
timeString.getMinutes() * 60 +
timeString.getSeconds()
);
}
if (typeof timeString != "string") {
return timeString;
}
timeString = timeString.toLowerCase().replace(/[\s\.]/g, "");
// if the last character is an "a" or "p", add the "m"
if (timeString.slice(-1) == "a" || timeString.slice(-1) == "p") {
timeString += "m";
}
var pattern = /^(([^0-9]*))?([0-9]?[0-9])(\W?([0-5][0-9]))?(\W+([0-5][0-9]))?(([^0-9]*))$/;
var time = timeString.match(pattern);
if (!time) {
return null;
}
var hour = parseInt(time[3] * 1, 10);
var ampm = time[2] || time[9];
var hours = hour;
var minutes = time[5] * 1 || 0;
var seconds = time[7] * 1 || 0;
if (hour <= 12 && ampm) {
ampm = ampm.trim();
var isPm = ampm == this.settings.lang.pm || ampm == this.settings.lang.PM;
if (hour == 12) {
hours = isPm ? 12 : 0;
} else {
hours = hour + (isPm ? 12 : 0);
}
} else {
var t = hour * 3600 + minutes * 60 + seconds;
if (t >= ONE_DAY + (this.settings.show2400 ? 1 : 0)) {
if (this.settings.wrapHours === false) {
return null;
}
hours = hour % 24;
}
}
var timeInt = hours * 3600 + minutes * 60 + seconds;
// if no am/pm provided, intelligently guess based on the scrollDefault
if (
hour < 12 &&
!ampm &&
this.settings._twelveHourTime &&
this.settings.scrollDefault
) {
var delta = timeInt - this.settings.scrollDefault();
if (delta < 0 && delta >= ONE_DAY / -2) {
timeInt = (timeInt + ONE_DAY / 2) % ONE_DAY;
}
}
return timeInt;
}
parseSettings(settings) {
settings.lang = { ...DEFAULT_LANG, ...settings.lang };
// lang is used by other functions the rest of this depends on
// todo: unwind circular dependency on lang
this.settings = settings;
if (settings.minTime) {
settings.minTime = this.time2int(settings.minTime);
}
if (settings.maxTime) {
settings.maxTime = this.time2int(settings.maxTime);
}
if (settings.durationTime && typeof settings.durationTime !== "function") {
settings.durationTime = this.time2int(settings.durationTime);
}
if (settings.scrollDefault == "now") {
settings.scrollDefault = () => {
return settings.roundingFunction(this.time2int(new Date()), settings);
};
} else if (
settings.scrollDefault &&
typeof settings.scrollDefault != "function"
) {
var val = settings.scrollDefault;
settings.scrollDefault = () => {
return settings.roundingFunction(this.time2int(val), settings);
};
} else if (settings.minTime) {
settings.scrollDefault = function() {
return settings.roundingFunction(settings.minTime, settings);
};
}
if (
typeof settings.timeFormat === "string" &&
settings.timeFormat.match(/[gh]/)
) {
settings._twelveHourTime = true;
}
if (
settings.showOnFocus === false &&
settings.showOn.indexOf("focus") != -1
) {
settings.showOn.splice(settings.showOn.indexOf("focus"), 1);
}
if (!settings.disableTimeRanges) {
settings.disableTimeRanges = [];
}
if (settings.disableTimeRanges.length > 0) {
// convert string times to integers
for (var i in settings.disableTimeRanges) {
settings.disableTimeRanges[i] = [
this.time2int(settings.disableTimeRanges[i][0]),
this.time2int(settings.disableTimeRanges[i][1])
];
}
// sort by starting time
settings.disableTimeRanges = settings.disableTimeRanges.sort(function(
a,
b
) {
return a[0] - b[0];
});
// merge any overlapping ranges
for (var i = settings.disableTimeRanges.length - 1; i > 0; i--) {
if (
settings.disableTimeRanges[i][0] <=
settings.disableTimeRanges[i - 1][1]
) {
settings.disableTimeRanges[i - 1] = [
Math.min(
settings.disableTimeRanges[i][0],
settings.disableTimeRanges[i - 1][0]
),
Math.max(
settings.disableTimeRanges[i][1],
settings.disableTimeRanges[i - 1][1]
)
];
settings.disableTimeRanges.splice(i, 1);
}
}
}
return settings;
}
}
export default Timepicker;

View File

@@ -0,0 +1,37 @@
import { ONE_DAY } from "./constants";
const roundingFunction = (seconds, settings) => {
if (seconds === null) {
return null;
} else if (typeof settings.step !== "number") {
// TODO: nearest fit irregular steps
return seconds;
} else {
var offset = seconds % (settings.step * 60); // step is in minutes
var start = settings.minTime || 0;
// adjust offset by start mod step so that the offset is aligned not to 00:00 but to the start
offset -= start % (settings.step * 60);
if (offset >= settings.step * 30) {
// if offset is larger than a half step, round up
seconds += settings.step * 60 - offset;
} else {
// round down
seconds -= offset;
}
return _moduloSeconds(seconds, settings);
}
};
function _moduloSeconds(seconds, settings) {
if (seconds == ONE_DAY && settings.show2400) {
return seconds;
}
return seconds % ONE_DAY;
}
export default roundingFunction;