カレンダーアップグレードプラグイン

プラグインの概要

「kintone標準カレンダーじゃ物足りない…」「もっと直感的に操作したい!」そんな悩みを持っている方にピッタリなのがこれ!
カレンダーのドラッグ&ドロップ操作や色分け設定で、よりスマートに予定を管理できるようになります。週の開始曜日や休日の設定も自在だから、仕事のスケジュール管理もお手の物!日々の予定管理を格上げしてみては?

予定複製プラグインと併せて使うと便利です
予定複製プラグインと併せて使うと便利です
Read More
カレンダー表示に加えて定例予定などを一括で作成できる機能を追加できます。

このプラグインでできること

表示切り替えは 「月」「週」「日」

日本の祝日は 自動更新

ドラッグ&ドロップで 予定変更

休日設定は 曜日単位で

これらすべての機能がプラグイン設定で制御可能です。祝日の関係ない業種であれば祝日は非表示、週単位での管理が多ければデフォルトビューを週表示に。カレンダー上でのドラッグドロップも不要であれば禁止にできます。

カレンダー上から 予定登録

登録も編集も 画面遷移なし

カレンダー上から 予定削除

カレンダー上で 一部項目変更可

このプラグイン一番の便利機能は「画面遷移なしでレコード登録、レコード修正」ができること。ポップアップで開いた詳細画面でそのままレコード編集や登録が出来ちゃいます。だから、レコード詳細開いて一覧に戻ってて、、そんなマラソン、もはや不要です!

設定方法

【事前確認】

まず最初に、利用予定のアプリに下記フィールドが存在しているか確認してください。


・日時フィールド2個

・文字列フィールド1個(計算やルックアップを除く純粋なもの)


カレンダーのプラグインなので、開始日時、終了日時、タイトルの指定が必須になるためです。

【事前設定】

アプリの一覧設定より、カスタマイズビューを一つ作成してください。一覧名はなんでも良いです。

カスタマイズビューのHTML欄に下記を貼り付けて保存します。

 

<div id=”calendar”></div>

 

このとき、絞り込み条件を設定しても構いません。

例えば人事部用のカレンダーだったらユーザーフィールドを事前に人事部に絞り込んで用意しておくなど、あらかじめカレンダーをいくつか準備しておくと便利です。

■必須設定

カレンダーの初期表示ビュー
カレンダービューを開いた時にどの表示スタイルにするかの設定です。

ドラッグ&ドロップ
カレンダー上でドラッグ&ドロップによる予定移動や変更を許可するかの設定です。

 

■任意設定

休日設定
ここでチェックした曜日の背景が赤になります。「祝日を休日にするにチェックを入れると、祝日を自動で取得し、祝日名を表示して背景を赤にします。

週の開始曜日
月および週表示での週の始まりを設定します

表示開始時刻
週および日表示での一番早い時間の表示設定です。これより前の予定は表示されません。

■必須マッピング

それぞれのフィールドを指定してください。指定したフィールドに基づいて、予定が表示されます。カレンダー上から予定を簡易登録する際も、これらのフィールドへ登録します。「カレンダー表示タイトル」については文字列計算フィールドをおすすめします。[“予定カテゴリ”+”予定名”]のように連結しておくとカレンダーが見やすくなります。

■カラー設定

初めて設定する時は「ユーザーを読み込む」ボタンを押してユーザーを取得してください。ここで設定した色がカレンダーに反映されます。「デフォルトカラーを割り振る」ボタンでは表示中のユーザーに一括で割り振ることが出来ますが、12個まで。それ以上ユーザーがいる場合は個別に設定してください。なお、設定するとなっているユーザーのみ、設定が保存されカレンダーに反映されます。

2024.11.6アップデート
カラー設定をユーザー選択以外でも設定できるようになりました。ドロップダウン、ラジオボタンが対象です。

ここで指定したフィールドはカレンダー上の右クリックで変更可能です。

おまけ

カレンダーをポータルページにも表示させたいという声もありましたので、おまけ的に方法を記しておきます。

やることはシンプルですが、ポータル画面のカスタマイズ、つまりkintone全体に影響を与えることになるので、慎重にご活用ください。

すでに他のカスタマイズをポータルに施している場合は競合する可能性があります。その場合は、、、諦めてください。笑

通常はお知らせエリアがある位置にカレンダーが挿入されます。

下記コードのここにカスタマイズビューのURLの部分を表示させたいカレンダーの一覧URLに変更し、jsファイルで保存してください。

ファイルができたら下記にアップロードして保存してください。

kintoneシステム管理→JavaScript / CSSでカスタマイズ→PC用のJavaScriptファイル

初期値が閉じた状態のコード

				
					(function() {
    'use strict';

    // ポータルが表示されたときに実行するイベント
    kintone.events.on('portal.show', function() {

        // ブロックのコンテナ要素を作成
        const customBlock = document.createElement('div');
        customBlock.id = 'custom-block';  
        customBlock.style.marginBottom = '20px';  
        customBlock.style.padding = '10px';
        customBlock.style.border = '1px solid #ccc';
        customBlock.style.backgroundColor = '#f9f9f9';

        // タイトル部分(開閉用のボタンを含む)を作成
        const titleBar = document.createElement('div');
        titleBar.style.display = 'flex';
        titleBar.style.justifyContent = 'space-between';
        titleBar.style.alignItems = 'center';
        titleBar.style.cursor = 'pointer';
        
        const titleText = document.createElement('span');
        titleText.innerText = 'カレンダービュー';  // 任意のタイトルを設定
        titleBar.appendChild(titleText);

        const toggleButton = document.createElement('button');
        toggleButton.innerText = 'カレンダーを開く';  // 初期は「開く」
        toggleButton.style.padding = '5px 10px';
        toggleButton.style.border = 'none';
        toggleButton.style.borderRadius = '4px';
        toggleButton.style.backgroundColor = '#007bff';
        toggleButton.style.color = '#ffffff';
        toggleButton.style.fontSize = '14px';
        toggleButton.style.cursor = 'pointer';
        toggleButton.style.transition = 'background-color 0.3s';
        
        // ボタンのホバー時のスタイル
        toggleButton.addEventListener('mouseover', function() {
            toggleButton.style.backgroundColor = '#0056b3';
        });
        toggleButton.addEventListener('mouseout', function() {
            toggleButton.style.backgroundColor = '#007bff';
        });
        
        titleBar.appendChild(toggleButton);

        // iframeのコンテナを作成
        const iframeContainer = document.createElement('div');
        iframeContainer.style.marginTop = '10px';
        iframeContainer.style.display = 'none';  // 初期状態で非表示にする

        // iframeの設定
        const iframe = document.createElement('iframe');
        iframe.src = 'ここにカスタマイズビューのURL';  // 指定されたURLを設定
        iframe.width = '100%';  
        iframe.height = '900px';  
        iframe.style.border = 'none'; 

        // iframeをiframeコンテナに追加
        iframeContainer.appendChild(iframe);

        // タイトル部分とiframeコンテナをブロックに追加
        customBlock.appendChild(titleBar);
        customBlock.appendChild(iframeContainer);

        // タイトルバーのクリックイベントを設定(開閉切り替え)
        titleBar.addEventListener('click', function() {
            if (iframeContainer.style.display === 'none') {
                iframeContainer.style.display = 'block';
                toggleButton.innerText = 'カレンダーを閉じる';
            } else {
                iframeContainer.style.display = 'none';
                toggleButton.innerText = 'カレンダーを開く';
            }
        });

        // ポータルの左カラムのメインコンテナを取得
        const portalBodyLeft = document.querySelector('.ocean-portal-body-left');

        // 左カラムが存在する場合、そこにブロックを追加
        if (portalBodyLeft) {
            portalBodyLeft.insertBefore(customBlock, portalBodyLeft.firstChild);
        } else {
            console.warn("ポータルの左カラムが見つかりませんでした。");
        }
    });
})();

				
			

初期値が開いた状態のコード

				
					(function() {
    'use strict';

    // ポータルが表示されたときに実行するイベント
    kintone.events.on('portal.show', function() {

        // ブロックのコンテナ要素を作成
        const customBlock = document.createElement('div');
        customBlock.id = 'custom-block';  
        customBlock.style.marginBottom = '20px';  
        customBlock.style.padding = '10px';
        customBlock.style.border = '1px solid #ccc';
        customBlock.style.backgroundColor = '#f9f9f9';

        // タイトル部分(開閉用のボタンを含む)を作成
        const titleBar = document.createElement('div');
        titleBar.style.display = 'flex';
        titleBar.style.justifyContent = 'space-between';
        titleBar.style.alignItems = 'center';
        titleBar.style.cursor = 'pointer';

        const titleText = document.createElement('span');
        titleText.innerText = 'カレンダービュー';  // 任意のタイトルを設定
        titleBar.appendChild(titleText);

        const toggleButton = document.createElement('button');
        toggleButton.innerText = 'カレンダーを閉じる';  // 初期は「閉じる」
        toggleButton.style.padding = '5px 10px';
        toggleButton.style.border = 'none';
        toggleButton.style.borderRadius = '4px';
        toggleButton.style.backgroundColor = '#007bff';
        toggleButton.style.color = '#ffffff';
        toggleButton.style.fontSize = '14px';
        toggleButton.style.cursor = 'pointer';
        toggleButton.style.transition = 'background-color 0.3s';

        // ボタンのホバー時のスタイル
        toggleButton.addEventListener('mouseover', function() {
            toggleButton.style.backgroundColor = '#0056b3';
        });
        toggleButton.addEventListener('mouseout', function() {
            toggleButton.style.backgroundColor = '#007bff';
        });

        titleBar.appendChild(toggleButton);

        // iframeのコンテナを作成
        const iframeContainer = document.createElement('div');
        iframeContainer.style.marginTop = '10px';
        iframeContainer.style.display = 'block';  // 初期状態で表示する

        // iframeの設定
        const iframe = document.createElement('iframe');
        iframe.src = 'ここにカスタマイズビューのURL';  // 指定されたURLを設定
        iframe.width = '100%';  
        iframe.height = '900px'; 
        iframe.style.border = 'none';  

        // iframeをiframeコンテナに追加
        iframeContainer.appendChild(iframe);

        // タイトル部分とiframeコンテナをブロックに追加
        customBlock.appendChild(titleBar);
        customBlock.appendChild(iframeContainer);

        // タイトルバーのクリックイベントを設定(開閉切り替え)
        titleBar.addEventListener('click', function() {
            if (iframeContainer.style.display === 'none') {
                iframeContainer.style.display = 'block';
                toggleButton.innerText = 'カレンダーを閉じる';
            } else {
                iframeContainer.style.display = 'none';
                toggleButton.innerText = 'カレンダーを開く';
            }
        });

        // ポータルの左カラムのメインコンテナを取得
        const portalBodyLeft = document.querySelector('.ocean-portal-body-left');

        // 左カラムが存在する場合、そこにブロックを追加
        if (portalBodyLeft) {
            portalBodyLeft.insertBefore(customBlock, portalBodyLeft.firstChild);
        } else {
            console.warn("ポータルの左カラムが見つかりませんでした。");
        }
    });
})();