Skip to content

Commit 571a00b

Browse files
authored
feat(datepicker): added month and year view (#2540)
feat(datepicker): added min\max dates boundaries
1 parent 48186fd commit 571a00b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1741
-685
lines changed

.travis.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ script:
2020
- npm i ./dist
2121
- npm run demo.build
2222
# istanbul is broken, should be fixed
23-
#- npm run test-coverage
24-
- ./node_modules/.bin/ng test -sr
23+
- npm run test-coverage
2524

2625
after_success:
2726
- ./node_modules/.bin/codecov

demo/src/app/components/+datepicker/datepicker-section.component.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ let titleDoc = require('html-loader!markdown-loader!./docs/title.md');
3636
<p>Notebale change is additional css for it <code> "/datepicker/bs-datepicker.css"</code></p>
3737
<p>In nearest time will be added:</p>
3838
<ul>
39-
<li>1. Month and year selection</li>
40-
<li>2. Min/max dates restrcitions</li>
39+
<li><s>1. Month and year selection</s></li>
40+
<li><s>2. Min/max dates restrcitions</s></li>
4141
<li>3. Theming - this will be a small breaking change</li>
4242
<li>4. Options to replace any part of template</li>
43-
<li>5. Configuration</li>
43+
<li><s>5. Configuration</s></li>
4444
<li>6. Integration with forms, only for input fields</li>
4545
<li>etc.</li>
4646
</ul>
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
<pre>{{bsValue}}</pre>
22
<input type="text"
33
value="{{ bsValue | date:'yMd'}}"
4+
[minDate]="minDate"
5+
[maxDate]="maxDate"
6+
#dp="bsDatepicker"
47
bsDatepicker [(bsValue)]="bsValue">
58
<span style="display: inline-block">
69
<button class="btn btn-success" (click)="dp.toggle()">Date Picker popup</button>
7-
<bs-datepicker #dp [(bsValue)]="bsValue" style="display: block"></bs-datepicker>
810
</span>
911

1012
<br>
@@ -13,9 +15,9 @@
1315
<pre>{{bsRangeValue}}</pre>
1416
<input type="text"
1517
value="{{ bsRangeValue[0] | date:'yMd'}} - {{ bsRangeValue[1] | date:'yMd'}}"
18+
#drp="bsDaterangepicker"
1619
bsDaterangepicker [(bsValue)]="bsRangeValue">
1720
<span style="display: inline-block">
1821
<button class="btn btn-success" (click)="drp.toggle()">Date Range Picker popup</button>
19-
<bs-daterangepicker #drp [(bsValue)]="bsRangeValue" placement="right" style="display: block"></bs-daterangepicker>
2022
</span>
2123

demo/src/app/components/+datepicker/demos/bs-popup/date-picker-popup.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { Component } from '@angular/core';
55
templateUrl: './date-picker-popup.html'
66
})
77
export class DemoDatePickerPopupComponent {
8-
public bsValue: any ;
9-
public bsRangeValue: any = [new Date(2017, 7, 4), new Date(2017, 7, 20)];
8+
minDate = new Date(2017, 5, 10);
9+
maxDate = new Date(2018, 9, 15);
10+
bsValue: any ;
11+
bsRangeValue: any = [new Date(2017, 7, 4), new Date(2017, 7, 20)];
1012
}

demo/src/assets/css/style.css

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ a:hover {
150150
position: fixed;
151151
bottom: 0;
152152
left: 0;
153-
z-index: 999;
153+
/*z-index: 999;*/
154154
-webkit-transition: left .5s ease;
155155
-moz-transition: left .5s ease;
156156
-ms-transition: left .5s ease;
@@ -585,6 +585,7 @@ a:hover {
585585

586586
.isOpenMenu #main-menu {
587587
left: 0;
588+
z-index: 999;
588589
}
589590

590591
#main {

demo/src/ng-api-doc.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,17 +67,17 @@ export const ngdoc: any = {
6767
"description": "",
6868
"selector": "alert,ngx-alert",
6969
"inputs": [
70+
{
71+
"name": "dismissOnTimeout",
72+
"type": "string | number",
73+
"description": "<p>Number in milliseconds, after which alert will be closed </p>\n"
74+
},
7075
{
7176
"name": "dismissible",
7277
"defaultValue": "false",
7378
"type": "boolean",
7479
"description": "<p>If set, displays an inline &quot;Close&quot; button </p>\n"
7580
},
76-
{
77-
"name": "dismissOnTimeout",
78-
"type": "string | number",
79-
"description": "<p>Number in milliseconds, after which alert will be closed </p>\n"
80-
},
8181
{
8282
"name": "type",
8383
"defaultValue": "warning",
@@ -111,18 +111,18 @@ export const ngdoc: any = {
111111
"description": "",
112112
"methods": [],
113113
"properties": [
114-
{
115-
"name": "dismissible",
116-
"defaultValue": "false",
117-
"type": "boolean",
118-
"description": "<p>is alerts are dismissible by default </p>\n"
119-
},
120114
{
121115
"name": "dismissOnTimeout",
122116
"defaultValue": "undefined",
123117
"type": "number",
124118
"description": "<p>default time before alert will dismiss </p>\n"
125119
},
120+
{
121+
"name": "dismissible",
122+
"defaultValue": "false",
123+
"type": "boolean",
124+
"description": "<p>is alerts are dismissible by default </p>\n"
125+
},
126126
{
127127
"name": "type",
128128
"defaultValue": "warning",

package.json

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
"disable-lint": "tslint \"**/*.ts\" -c tslint.json --fix --type-check -t prose -e \"node_modules/**\" -e \"dist/**\" -e \"temp/**\" -e \"scripts/docs/**\"",
2222
"flow.changelog": "conventional-changelog -i CHANGELOG.md -s -p angular",
2323
"flow.github-release": "conventional-github-releaser -p angular",
24-
"build": "ngm build -p src --clean",
24+
"build": "run-s build.ngm build.sass",
25+
"build.sass": "node-sass --recursive src --output dist --source-map true --source-map-contents sass",
26+
"build.ngm": "ngm build -p src --clean",
2527
"build.watch": "ngm build -p src --watch --skip-bundles",
2628
"start": "ng serve --aot --host 0.0.0.0",
2729
"generate-bs4": "node scripts/generate-bs4.js",
@@ -67,7 +69,7 @@
6769
"@angular/forms": "^2.3.1 || >=4.0.0"
6870
},
6971
"devDependencies": {
70-
"@angular/cli": "1.3.1",
72+
"@angular/cli": "1.3.2",
7173
"@angular/common": "^2.4.4",
7274
"@angular/compiler": "^2.4.4",
7375
"@angular/compiler-cli": "^2.4.4",
@@ -79,10 +81,10 @@
7981
"@angular/platform-browser-dynamic": "^2.4.4",
8082
"@angular/router": "^3.4.4",
8183
"@angular/tsc-wrapped": "0.5.1",
82-
"@types/jasmine": "2.5.53",
84+
"@types/jasmine": "2.5.54",
8385
"@types/marked": "0.3.0",
84-
"@types/node": "8.0.24",
85-
"@types/webpack": "3.0.9",
86+
"@types/node": "8.0.25",
87+
"@types/webpack": "3.0.10",
8688
"bootstrap": "3.3.7",
8789
"classlist-polyfill": "1.2.0",
8890
"codecov": "2.3.0",
@@ -97,8 +99,8 @@
9799
"google-code-prettify": "1.0.5",
98100
"html-loader": "0.5.1",
99101
"intl": "^1.2.5",
100-
"jasmine": "2.7.0",
101-
"jasmine-core": "2.7.0",
102+
"jasmine": "2.8.0",
103+
"jasmine-core": "2.8.0",
102104
"jasmine-data-provider": "2.2.0",
103105
"jasmine-spec-reporter": "4.2.1",
104106
"karma": "1.7.0",
@@ -108,26 +110,26 @@
108110
"karma-jasmine": "^1.0.2",
109111
"karma-jasmine-html-reporter": "^0.2.2",
110112
"karma-remap-istanbul": "0.6.0",
111-
"karma-sauce-launcher": "1.1.0",
113+
"karma-sauce-launcher": "1.2.0",
112114
"lite-server": "2.3.0",
113115
"lodash": "4.17.4",
114116
"markdown-loader": "github:valorkin/markdown-loader",
115117
"marked": "0.3.6",
116118
"ng2-page-scroll": "4.0.0-beta.7",
117119
"ngm-cli": "0.6.1",
118-
"npm-run-all": "4.0.2",
120+
"npm-run-all": "4.1.1",
119121
"protractor": "5.1.2",
120122
"reflect-metadata": "0.1.10",
121123
"require-dir": "0.3.2",
122124
"rxjs": "5.4.3",
123125
"ts-helpers": "^1.1.1",
124-
"tslint": "5.6.0",
126+
"tslint": "5.7.0",
125127
"tslint-config-valorsoft": "2.1.0",
126128
"typedoc": "0.8.0",
127129
"typescript": "2.4.2",
128130
"wallaby-webpack": "0.0.39",
129131
"webdriver-manager": "12.0.6",
130132
"webpack-bundle-analyzer": "2.9.0",
131-
"zone.js": "0.8.16"
133+
"zone.js": "0.8.17"
132134
}
133135
}

src/bs-moment/format-functions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Locale } from './locale/locale.class';
22
import { zeroFill } from './utils';
33
import { isFunction } from './utils/type-checks';
4-
import { DateFormatterFn } from '../datepicker/models/index';
4+
import { DateFormatterFn } from './types';
55

66
export let formatFunctions: { [key: string]: (date: Date, locale: Locale) => string } = {};
77
export let formatTokenFunctions: { [key: string]: DateFormatterFn } = {};

src/bs-moment/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { Locale } from './locale/locale.class';
2+
13
export type UnitOfTime = 'year' | 'month' | 'week' | 'day' | 'hour' |
24
'minute' | 'seconds' | 'milliseconds';
35

@@ -9,3 +11,5 @@ export interface TimeUnit {
911
minute?: number;
1012
seconds?: number;
1113
}
14+
15+
export type DateFormatterFn = (date: Date, format: string, locale?: Locale) => string;

src/bs-moment/utils/date-compare.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { UnitOfTime } from '../types';
2+
import { endOf, startOf } from './start-end-of';
3+
4+
export function isAfter(date1: Date, date2: Date, units: UnitOfTime = 'milliseconds'): boolean {
5+
if (!date1 || !date2) {
6+
return false;
7+
}
8+
9+
if (units === 'milliseconds') {
10+
return date1.valueOf() > date2.valueOf();
11+
}
12+
13+
return date2.valueOf() < startOf(date1, units).valueOf();
14+
}
15+
16+
export function isBefore(date1: Date, date2: Date, units: UnitOfTime = 'milliseconds'): boolean {
17+
if (!date1 || !date2) {
18+
return false;
19+
}
20+
21+
if (units === 'milliseconds') {
22+
return date1.valueOf() < date2.valueOf();
23+
}
24+
25+
return endOf(date1, units).valueOf() < date2.valueOf();
26+
}
27+
28+
export function isBetween(date: Date,
29+
from: Date,
30+
to: Date,
31+
units: UnitOfTime,
32+
inclusivity = '()'): boolean {
33+
const leftBound = inclusivity[0] === '('
34+
? isAfter(date, from, units) :
35+
!isBefore(date, from, units);
36+
const rightBound = inclusivity[1] === ')'
37+
? isBefore(date, to, units)
38+
: !isAfter(date, to, units);
39+
40+
return leftBound && rightBound;
41+
}
42+
43+
export function isSame(date1: Date, date2: Date, units: UnitOfTime = 'milliseconds'): boolean {
44+
if (!date1 || !date2) {
45+
return false;
46+
}
47+
48+
if (units === 'milliseconds') {
49+
return date1.valueOf() === date2.valueOf();
50+
}
51+
52+
const inputMs = date2.valueOf();
53+
54+
return startOf(date1, units).valueOf() <= inputMs
55+
&& inputMs <= endOf(date1, units).valueOf();
56+
}
57+
58+
export function isSameOrAfter(date1: Date, date2: Date, units?: UnitOfTime): boolean {
59+
return isSame(date1, date2, units) || isAfter(date1, date2, units);
60+
}
61+
62+
export function isSameOrBefore(date1: Date, date2: Date, units?: UnitOfTime): boolean {
63+
return isSame(date1, date2, units) || isBefore(date1, date2, units);
64+
}

0 commit comments

Comments
 (0)