以å‰ã®è¨˜äº‹ã§æ›¸ã„ãŸã‚ˆã†ã«ã€ã—ã°ã‚‰ãAngularUIã®ui-calendarを使ã£ã¦ã„ãŸã®ã§ã™ãŒã€ä¾å˜ãƒ©ã‚¤ãƒ–ラリãŒå¤šã„割りã«ã‚ã¾ã‚Šæ©Ÿèƒ½ã‚’使ã£ã¦ãªã„ã®ã§ä¸æº€ã§ã—ãŸã€‚
ã¾ãŸã€æ˜¨æ—¥ã®è¨˜äº‹ã§æ›¸ã„ãŸã‚ˆã†ã«ã€jQueryä¾å˜ã¯ã‚„ã‚ãŸã„ã¨æ€ã£ã¦ã¾ã—ãŸã€‚
ä»–ã«ã‚‚ã„ã„ライブラリã¯ãªã„ã®ã‹ã¨æ€ã£ã¦èª¿ã¹ãŸã®ã§ã™ãŒã€è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。ã¨ã„ã†ã®ã‚‚ã€ã©ã‚Œã‚‚UI(CSS)ã¨ãƒã‚¸ãƒƒã‚¯(JS)ãŒã‚»ãƒƒãƒˆã«ãªã£ã¦ã„ã¦ãƒªãƒƒãƒãªã®ã§ã™ã€‚ã‚‚ã£ã¨æ‰‹è»½ã«ã§ããªã„ã‚‚ã®ã§ã—ょã†ã‹ã€‚
ãã“ã§ã€ã¾ãšã¯ã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã‚’表示ã™ã‚‹ã ã‘ã§ã„ã„ã¨æ€ã£ã¦ã€ä»¥å‰ç´¹ä»‹ã—ãŸinkを使ã£ã¦è‡ªåŠ›ã§ã‚„ã£ã¦ã¿ã‚‹ã“ã¨ã«ã—ã¾ã—ãŸã€‚
ãƒã‚¸ãƒƒã‚¯ã¯ã€moment.jsを使ã„ã¾ã™ã€‚ã“ã®ãƒ©ã‚¤ãƒ–ラリã¯å˜æ©Ÿèƒ½ã§APIãŒãれã„ã§ã„ã„ã§ã™ã€‚
最åˆã«å®Œæˆç³»ã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆãŒã“ã¡ã‚‰ã€‚
ç¶šã„ã¦ã€ã‚³ãƒ¼ãƒ‰ã‚¹ãƒ‹ãƒšãƒƒãƒˆã‚’貼り付ã‘ã¦ãŠãã¾ã™ã€‚ ã¾ãšã€jadeãƒ•ã‚¡ã‚¤ãƒ«ã¯æ¬¡ã®ã‚ˆã†ãªæ„Ÿã˜ã§ã™ã€‚
.ink-grid(ng-controller="CalendarCtrl")
.column-group.top-space.horizontal-space
.large-20.content-left
a(ng-click="updateCalendar(calTable.prevMonth)")
i.icon-caret-left.icon-large
.large-60.content-center
.calendar-title {{calTable.title}}
.large-20.content-right
a(ng-click="updateCalendar(calTable.nextMonth)")
i.icon-caret-right.icon-large
.column-group.content-center.horizontal-space
.large-100
table.ink-table.bordered
tr
th æ—¥
th 月
th ç«
th æ°´
th 木
th 金
th 土
tr(ng-repeat="row in calTable.data")
td(ng-repeat="cell in row", ng-class="{selected: cell.selected}", ng-click="selectCalendar(cell)") {{cell.display}}
ã¡ã‚‡ã£ã¨é•·ã„ã§ã™ã。HTMLã«å¤‰æ›ã—ã¦ãªãã¦ã™ã¿ã¾ã›ã‚“。
次ã«ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã§ã™ã€ä¸‹è¨˜ã€‚
angular.module('MyApp', []).controller('CalendarCtrl',function($scope, CalendarUtil) {
$scope.updateCalendar = function(date) {
$scope.calTable = CalendarUtil.getTableData(date);
};
$scope.updateCalendar(new Date());
$scope.selectCalendar = function(cell) {
if (cell.date) {
$scope.calTable.selectedCell.selected = false;
$scope.calTable.selectedCell = cell;
$scope.calTable.selectedCell.selected = true;
}
};
});
最後ã«ã€CalendarUtilã§ã™ã€‚ã“れも長ã„。もã£ã¨æ©Ÿèƒ½ãŒå……実ã—ãŸã‚‰ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¨ã—ã¦åˆ‡ã‚Šå‡ºã—ã¦ã‚‚ã„ã„ã‹ã‚‚ã—れã¾ã›ã‚“。
angular.module('MyApp', []).factory('CalendarUtil', function() {
var dowList = [0, 1, 2, 3, 4, 5, 6];
function getTableData(selectedDate) {
var selected = moment(selectedDate);
var start = selected.clone().startOf('month');
var end = selected.clone().endOf('month');
var curr = null;
var selectedCell;
var data = [];
for (var j = 0; j < 5; j++) {
var row = [];
for (var i = 0; i < dowList.length; i++) {
var dow = dowList[i];
if (end) {
if (!curr && dow === start.day()) {
curr = start;
}
if (curr) {
var cell = {
display: curr.date(),
date: curr.clone().toDate(),
selected: curr.isSame(selected, 'day')
};
row.push(cell);
if (cell.selected) {
selectedCell = cell;
}
if (curr.isSame(end, 'day')) {
end = null;
} else {
curr.add(1, 'days');
}
} else {
row.push({});
}
} else {
row.push({});
}
}
data.push(row);
}
return {
title: selected.format('YYYY年MM月'),
data: data,
selectedCell: selectedCell,
nextMonth: selected.clone().startOf('month').add(1, 'months').toDate(),
prevMonth: selected.clone().startOf('month').subtract(1, 'months').toDate()
};
}
return {
getTableData: getTableData
};
});
ãªã‚“ã‹èªã¿ã«ãã„コードã§ã™ã。もã£ã¨ã‚·ãƒ³ãƒ—ルã«ã—ãŸã„ã§ã™ã€‚æ¡ä»¶åˆ†å²ãŒå¤šã™ãŽã‚‹ã‚ˆã†ãªæ°—ãŒã—ã¾ã™ã€‚
ã“ã‚“ãªæ„Ÿã˜ã§ã§ãã¾ã—ãŸã€‚åŒæ§˜ã®æ©Ÿèƒ½ã‚’jQueryã§ã‚„ã£ãŸã‚‰ã©ã†ãªã‚‹ã®ã‹ã¯ã¡ã‚‡ã£ã¨æ°—ã«ãªã‚Šã¾ã™ã€‚ã‚ã¾ã‚Šã‚³ãƒ¼ãƒ‰é‡ã¯å¤‰ã‚らãªã„よã†ãªæ°—ã‚‚ã—ã¾ã™ã。ã§ã‚‚ã€å…¨ä½“ã‚’angularã§ä½œã‚‹ãªã‚‰ã“ã®æ–¹ãŒã„ã‚ã„ã‚æ‹¡å¼µã—ã‚„ã™ã„ã¨æ€ã„ã¾ã™ã€‚