Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
b1944c6a
Commit
b1944c6a
authored
Feb 07, 2018
by
Kushal Pandya
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add more date helper functions
parent
847d1a27
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
185 additions
and
1 deletion
+185
-1
app/assets/javascripts/lib/utils/datetime_utility.js
app/assets/javascripts/lib/utils/datetime_utility.js
+121
-1
spec/javascripts/datetime_utility_spec.js
spec/javascripts/datetime_utility_spec.js
+64
-0
No files found.
app/assets/javascripts/lib/utils/datetime_utility.js
View file @
b1944c6a
...
...
@@ -9,6 +9,20 @@ import {
window
.
timeago
=
timeago
;
window
.
dateFormat
=
dateFormat
;
/**
* Returns i18n month names array.
* If `abbreviated` is provided, returns abbreviated
* name.
*
* @param {Boolean} abbreviated
*/
const
getMonthNames
=
(
abbreviated
)
=>
{
if
(
abbreviated
)
{
return
[
s__
(
'
Jan
'
),
s__
(
'
Feb
'
),
s__
(
'
Mar
'
),
s__
(
'
Apr
'
),
s__
(
'
May
'
),
s__
(
'
Jun
'
),
s__
(
'
Jul
'
),
s__
(
'
Aug
'
),
s__
(
'
Sep
'
),
s__
(
'
Oct
'
),
s__
(
'
Nov
'
),
s__
(
'
Dec
'
)];
}
return
[
s__
(
'
January
'
),
s__
(
'
February
'
),
s__
(
'
March
'
),
s__
(
'
April
'
),
s__
(
'
May
'
),
s__
(
'
June
'
),
s__
(
'
July
'
),
s__
(
'
August
'
),
s__
(
'
September
'
),
s__
(
'
October
'
),
s__
(
'
November
'
),
s__
(
'
December
'
)];
};
/**
* Given a date object returns the day of the week in English
* @param {date} date
...
...
@@ -157,7 +171,7 @@ export function timeIntervalInWords(intervalInSeconds) {
return
text
;
}
export
function
dateInWords
(
date
,
abbreviated
=
false
)
{
export
function
dateInWords
(
date
,
abbreviated
=
false
,
hideYear
=
false
)
{
if
(
!
date
)
return
date
;
const
month
=
date
.
getMonth
();
...
...
@@ -168,9 +182,115 @@ export function dateInWords(date, abbreviated = false) {
const
monthName
=
abbreviated
?
monthNamesAbbr
[
month
]
:
monthNames
[
month
];
if
(
hideYear
)
{
return
`
${
monthName
}
${
date
.
getDate
()}
`
;
}
return
`
${
monthName
}
${
date
.
getDate
()}
,
${
year
}
`
;
}
/**
* Returns month name based on provided date.
*
* @param {Date} date
* @param {Boolean} abbreviated
*/
export
const
monthInWords
=
(
date
,
abbreviated
=
false
)
=>
{
if
(
!
date
)
{
return
''
;
}
return
getMonthNames
(
abbreviated
)[
date
.
getMonth
()];
};
/**
* Returns number of days in a month for provided date.
* courtesy: https://stacko(verflow.com/a/1185804/414749
*
* @param {Date} date
*/
export
const
totalDaysInMonth
=
(
date
)
=>
{
if
(
!
date
)
{
return
0
;
}
return
new
Date
(
date
.
getFullYear
(),
date
.
getMonth
()
+
1
,
0
).
getDate
();
};
/**
* Returns list of Dates referring to Sundays of the month
* based on provided date
*
* @param {Date} date
*/
export
const
getSundays
=
(
date
)
=>
{
if
(
!
date
)
{
return
[];
}
const
daysToSunday
=
[
'
Saturday
'
,
'
Friday
'
,
'
Thursday
'
,
'
Wednesday
'
,
'
Tuesday
'
,
'
Monday
'
,
'
Sunday
'
];
const
month
=
date
.
getMonth
();
const
year
=
date
.
getFullYear
();
const
sundays
=
[];
const
dateOfMonth
=
new
Date
(
year
,
month
,
1
);
while
(
dateOfMonth
.
getMonth
()
===
month
)
{
const
dayName
=
getDayName
(
dateOfMonth
);
if
(
dayName
===
'
Sunday
'
)
{
sundays
.
push
(
new
Date
(
dateOfMonth
.
getTime
()));
}
const
daysUntilNextSunday
=
daysToSunday
.
indexOf
(
dayName
)
+
1
;
dateOfMonth
.
setDate
(
dateOfMonth
.
getDate
()
+
daysUntilNextSunday
);
}
return
sundays
;
};
/**
* Returns list of Dates representing a timeframe of Months from month of provided date (inclusive)
* up to provided length
*
* For eg;
* If current month is January 2018 and `length` provided is `6`
* Then this method will return list of Date objects as follows;
*
* [ October 2017, November 2017, December 2017, January 2018, February 2018, March 2018 ]
*
* If current month is March 2018 and `length` provided is `3`
* Then this method will return list of Date objects as follows;
*
* [ February 2018, March 2018, April 2018 ]
*
* @param {Number} length
* @param {Date} date
*/
export
const
getTimeframeWindow
=
(
length
,
date
)
=>
{
if
(
!
length
)
{
return
[];
}
const
currentDate
=
date
instanceof
Date
?
date
:
new
Date
();
const
currentMonthIndex
=
Math
.
floor
(
length
/
2
);
const
timeframe
=
[];
// Move date object backward to the first month of timeframe
currentDate
.
setDate
(
1
);
currentDate
.
setMonth
(
currentDate
.
getMonth
()
-
currentMonthIndex
);
// Iterate and update date for the size of length
// and push date reference to timeframe list
for
(
let
i
=
0
;
i
<
length
;
i
+=
1
)
{
timeframe
.
push
(
new
Date
(
currentDate
.
getTime
()));
currentDate
.
setMonth
(
currentDate
.
getMonth
()
+
1
);
}
// Change date of last timeframe item to last date of the month
timeframe
[
length
-
1
].
setDate
(
totalDaysInMonth
(
timeframe
[
length
-
1
]));
return
timeframe
;
};
window
.
gl
=
window
.
gl
||
{};
window
.
gl
.
utils
=
{
...(
window
.
gl
.
utils
||
{}),
...
...
spec/javascripts/datetime_utility_spec.js
View file @
b1944c6a
...
...
@@ -105,4 +105,68 @@ describe('dateInWords', () => {
it
(
'
should return abbreviated month name
'
,
()
=>
{
expect
(
datetimeUtility
.
dateInWords
(
date
,
true
)).
toEqual
(
'
Jul 1, 2016
'
);
});
it
(
'
should return date in words without year
'
,
()
=>
{
expect
(
datetimeUtility
.
dateInWords
(
date
,
true
,
true
)).
toEqual
(
'
Jul 1
'
);
});
});
describe
(
'
monthInWords
'
,
()
=>
{
const
date
=
new
Date
(
'
2017-01-20
'
);
it
(
'
returns month name from provided date
'
,
()
=>
{
expect
(
datetimeUtility
.
monthInWords
(
date
)).
toBe
(
'
January
'
);
});
it
(
'
returns abbreviated month name from provided date
'
,
()
=>
{
expect
(
datetimeUtility
.
monthInWords
(
date
,
true
)).
toBe
(
'
Jan
'
);
});
});
describe
(
'
totalDaysInMonth
'
,
()
=>
{
it
(
'
returns number of days in a month for given date
'
,
()
=>
{
// 1st Feb, 2016 (leap year)
expect
(
datetimeUtility
.
totalDaysInMonth
(
new
Date
(
2016
,
1
,
1
))).
toBe
(
29
);
// 1st Feb, 2017
expect
(
datetimeUtility
.
totalDaysInMonth
(
new
Date
(
2017
,
1
,
1
))).
toBe
(
28
);
// 1st Jan, 2017
expect
(
datetimeUtility
.
totalDaysInMonth
(
new
Date
(
2017
,
0
,
1
))).
toBe
(
31
);
});
});
describe
(
'
getSundays
'
,
()
=>
{
it
(
'
returns array of dates representing all Sundays of the month
'
,
()
=>
{
// December, 2017 (it has 5 Sundays)
const
dateOfSundays
=
[
3
,
10
,
17
,
24
,
31
];
const
sundays
=
datetimeUtility
.
getSundays
(
new
Date
(
2017
,
11
,
1
));
expect
(
sundays
.
length
).
toBe
(
5
);
sundays
.
forEach
((
sunday
,
index
)
=>
{
expect
(
sunday
.
getDate
()).
toBe
(
dateOfSundays
[
index
]);
});
});
});
describe
(
'
getTimeframeWindow
'
,
()
=>
{
it
(
'
returns array of dates representing a timeframe based on provided length and date
'
,
()
=>
{
const
date
=
new
Date
(
2018
,
0
,
1
);
const
mockTimeframe
=
[
new
Date
(
2017
,
9
,
1
),
new
Date
(
2017
,
10
,
1
),
new
Date
(
2017
,
11
,
1
),
new
Date
(
2018
,
0
,
1
),
new
Date
(
2018
,
1
,
1
),
new
Date
(
2018
,
2
,
31
),
];
const
timeframe
=
datetimeUtility
.
getTimeframeWindow
(
6
,
date
);
expect
(
timeframe
.
length
).
toBe
(
6
);
timeframe
.
forEach
((
timeframeItem
,
index
)
=>
{
expect
(
timeframeItem
.
getFullYear
()
===
mockTimeframe
[
index
].
getFullYear
()).
toBeTruthy
();
expect
(
timeframeItem
.
getMonth
()
===
mockTimeframe
[
index
].
getMonth
()).
toBeTruthy
();
expect
(
timeframeItem
.
getDate
()
===
mockTimeframe
[
index
].
getDate
()).
toBeTruthy
();
});
});
});
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment