VisualforceでAngularUIのFullCalendarを動かしてみました

ちょっと気になってたAngularUIの使い方を勉強してみました。カレンダー機能を簡単に実装できるFullCalendarというのがあるとのことなのでSalesforceのVisualforceページで動かしてみました。

##必要なファイルのダウンロード
Angular UIのサイトは次のURLからアクセスできます。
http://angular-ui.github.io/

必要なファイルはGitHubに公開されているのでそちらからダウンロードできます。
https://github.com/angular-ui/ui-calendar

##表示できるカレンダーの例
このFullCalendarを使うと次のような画面を実装できます。
![スクリーンショット 2014-04-19 23.26.16.png](https://qiita-image-store.s3.amazonaws.com/0/8407/3c6b88b1-96b8-2ffc-067a-9b08e27e0dbc.png)

月カレンダー以外にも週表示や日表示も可能です。
![スクリーンショット 2014-04-19 23.27.19.png](https://qiita-image-store.s3.amazonaws.com/0/8407/155cd0fe-b372-ba98-d171-977ca044e2f0.png)

テーマを変更して見た目を整えることもできるみたいです。
![スクリーンショット 2014-04-19 23.27.50.png](https://qiita-image-store.s3.amazonaws.com/0/8407/d6d181e0-e6a1-774d-0490-53db9071852f.png)


##サンプルコード
必要なファイルを静的リソースにアップロードすれば公開されているサンプルコードがほぼそのままで動かすことができます。ただしサンプルでbodyタグに対してCSSを指定していますが、そのままだとSalesforceの標準スタイルに影響がでてしまうので少し変更してあげる必要があります。

こんな感じのコードで動作を確認できました。

```html
<apex:page showHeader="true" sidebar="false" title="FullCalendar" id="page">
    <head>
        <apex:stylesheet value="{!URLFOR($Resource.FullCalendar, 'fullcalendar/fullcalendar.css')}" />
        <apex:includeScript value="{!URLFOR($Resource.FullCalendar, 'lib/jquery.min.js')}" />
        <apex:includeScript value="{!URLFOR($Resource.FullCalendar, 'lib/jquery-ui.custom.min.js')}" />
        <apex:includeScript value="{!URLFOR($Resource.FullCalendar, 'fullcalendar/fullcalendar.min.js')}" />
        <script>
            $(document).ready(function() {
                var date = new Date();
                var d = date.getDate();
                var m = date.getMonth();
                var y = date.getFullYear();
            
                $('#calendar').fullCalendar({
                    editable: true,
                    events: [
                        {
                            title: 'All Day Event',
                            start: new Date(y, m, 1)
                        },
                        {
                            title: 'Long Event',
                            start: new Date(y, m, d-5),
                            end: new Date(y, m, d-2)
                        },
                        {
                            id: 999,
                            title: 'Repeating Event',
                            start: new Date(y, m, d-3, 16, 0),
                            allDay: false
                        },
                        {
                            id: 999,
                            title: 'Repeating Event',
                            start: new Date(y, m, d+4, 16, 0),
                            allDay: false
                        },
                        {
                            title: 'Meeting',
                            start: new Date(y, m, d, 10, 30),
                            allDay: false
                        },
                        {
                            title: 'Lunch',
                            start: new Date(y, m, d, 12, 0),
                            end: new Date(y, m, d, 14, 0),
                            allDay: false
                        },
                        {
                            title: 'Birthday Party',
                            start: new Date(y, m, d+1, 19, 0),
                            end: new Date(y, m, d+1, 22, 30),
                            allDay: false
                        },
                        {
                            title: 'Click for Google',
                            start: new Date(y, m, 28),
                            end: new Date(y, m, 29),
                            url: 'http://google.com/'
                        }
                    ]
                });
            });
        </script>
        <style>
            #vf-page {
                margin-top: 20px;
                text-align: center;
                font-size: 14px;
                font-family: "Lucida Grande",Helvetica,Arial,Verdana,sans-serif;
            }
        
            #calendar {
                width: 900px;
                margin: 0 auto;
            }
        </style>
    </head>
    <body>
        <div id="vf-page">
            <div id="calendar"></div>
        </div>
    </body>
</apex:page>
```