[Redmine 5.1] EasyGantt 2.0 で祝日表示に対応する方法 – 2024年版

スポンサーリンク
スポンサーリンク

概要

EasyGantt 2.0 からは、それまで隠し機能として存在していた祝日表示が削除されてしまいました。

これにより、View Customize プラグインだけでは祝日に対応できなくなったため、コード修正して無理やり対応させてみました。(動作確認だけして、実際には使用していません。)

スポンサーリンク

確認した環境

スポンサーリンク

使用するプラグイン

スポンサーリンク

EasyGanttプラグインのコード修正

以下のコードブロック内でハイライトした行を追加する

plugins/easy_gantt/app/views/easy_gantt/_js_prepare.html.erb

<%= content_for :header_tags do %>
  <script type="text/javascript">
    window.ysy = window.ysy || {};
    ysy.settings = ysy.settings || {};
    $.extend(true, ysy.settings, <%= {
      platform: EasyGantt.platform,
      easyRedmine: EasyGantt.easy_extensions?,
      isGantt: (params[:controller] == 'easy_gantt'),
      language: I18n.locale.to_s,
      project: ({ id: @project.id, name: @project.name } if @project),
      dateFormat: (Setting.date_format.presence || I18n.t('date.formats.default')),
      nonWorkingWeekDays: EasyGantt.non_working_week_days,
      holidays: [],
      milestonePush: ((EasyGantt.easy_extensions? && !EasySetting.value('milestone_effective_date_from_issue_due_date')) ? true : false),
      workDayDelays: EasySetting.value(:easy_gantt_relation_delay_in_workdays),
      fixedRelations: false && EasySetting.value(:easy_gantt_fixed_delay),
      defaultZoom: EasySetting.value(:easy_gantt_default_zoom),
      paths: {
        rootPath: home_path
      },
      labels: {
        buttons: {
          button_delete: l(:button_delete),
          button_submit: l(:button_submit),
          button_yes: l(:general_text_Yes),
....

plugins/easy_gantt/assets/javascripts/easy_gantt/dhtml_rewrite.js

/* dhtml_rewrite.js */
/* global ysy */
/**
 * @external Moment
 */
// noinspection JSCommentMatchesSignature
/**
 * @function moment
 * @param {*} [arg1]
 * @return {Moment}
 */
window.ysy = window.ysy || {};
ysy.view = ysy.view || {};
ysy.view.applyGanttRewritePatch = function () {
  ysy.view.initNonworkingDays = function () {
    var work_helper = gantt._working_time_helper;
    work_helper.defHours = ysy.settings.hoursPerDay;
    var i;
    // Now we specify working days
    var nonWorking = ysy.settings.nonWorkingWeekDays;
    for (i in nonWorking) {
      work_helper.set_time({day: nonWorking[i] % 7, hours: false});
    }

    var holidays = ysy.settings.holidays;
    if (holidays) {
      for (i = 0; i < holidays.length; i++) {
        work_helper.set_time({date: moment(holidays[i]), hours: false});
      }
    }

    work_helper._cache = {};
  };
....

plugins/easy_gantt/app/views/settings/_easy_gantt.html.erb

<%
  default_zoom_options = [
    [l('easy_gantt.button.day_zoom'), 'day'],
    [l('easy_gantt.button.week_zoom'), 'week'],
    [l('easy_gantt.button.month_zoom'), 'month'],
    [l('easy_gantt.button.quarter_zoom'), 'quarter'],
    [l('easy_gantt.button.year_zoom'), 'year']
  ]
%>

<%= title l(:title_easy_gantt_settings) %>

<div class="box tabular">
  <p>
    <%= label_tag 'settings_show_holidays', l(:field_easy_gantt_show_holidays) %>
    <%= check_box_tag 'settings[show_holidays]', '1', @settings['show_holidays'] == '1' %>
    <em class="info small">
      <%= l(:text_easy_gantt_show_holidays) %>
    </em>
  </p>
  
  <p>
    <%= label_tag 'settings_relation_delay_in_workdays', l(:field_easy_gantt_relation_delay_in_workdays) %>
    <%= check_box_tag 'settings[relation_delay_in_workdays]', '1', @settings['relation_delay_in_workdays'] == '1' %>
    <em class="info small">
      <%= l(:text_easy_gantt_relation_delay_in_workdays) %>
    </em>
  </p>
....

plugins/easy_gantt/app/views/easy_gantt/projects.api.rsb

api.easy_gantt_data do
  api.start_date @start_date
  api.end_date @end_date

  api_render_columns(api, @query)
  api_render_projects(api, @projects, with_columns: true)

  if EasySetting.value(:easy_gantt_show_holidays)
    api_render_holidays(api, @start_date - 1.month, @end_date + 1.month)
  end
end

plugins/easy_gantt/app/views/easy_gantt/issues.api.rsb

api.easy_gantt_data do
  api.start_date @start_date
  api.end_date @end_date

  api_render_columns(api, @query)
  api_render_projects(api, @projects)
  api_render_issues(api, @issues, with_columns: true)

  api_render_relations(api, @relations)

  api_render_versions(api, @versions)

  if EasySetting.value(:easy_gantt_show_holidays) && params[:subproject_loading].blank?
    api_render_holidays(api, @start_date - 1.month, @end_date + 1.month)
  end
end

plugins/easy_gantt/app/helpers/easy_gantt_helper.rb

  def api_render_columns(api, query)
    api.array :columns do
      query.columns.each do |c|
        api.column do
          api.name c.name
          api.title c.caption
        end
      end
    end
  end

  def api_render_holidays(api, startdt, enddt)
    wc = User.current.try(:current_working_time_calendar)
    return if wc.nil?

    api.array :holidays do
      startdt.upto(enddt) do |date|
        api.date date if wc.holiday?(date)
      end
    end

  end

  def api_render_issues(api, issues, with_columns: false)
    api.array :issues do
      issues.each do |issue|
        api.issue do
          api.id issue.id
          api.name issue.subject
          api.start_date issue.start_date
          api.due_date issue.due_date
          api.estimated_hours issue.estimated_hours
          api.done_ratio issue.done_ratio
          api.closed issue.closed?
          api.fixed_version_id issue.fixed_version_id

plugins/easy_gantt/assets/javascripts/easy_gantt/loader.js

  _handleMainGantt: function (data) {
    if (!data.easy_gantt_data) return;
    var json = data.easy_gantt_data;
    ysy.log.debug("_handleGantt()", "load");
    //  -- LIMITS --
    //ysy.data.limits.set({ // TODO
    //  start_date: moment(json.start_date, "YYYY-MM-DD"),
    //  end_date: moment(json.end_date, "YYYY-MM-DD")
    //});
    //  -- COLUMNS --
    ysy.data.columns = json.columns;
    // ARRAY INITIALIZATION
    //  -- RELATIONS --
    ysy.data.relations.clear();
    //  -- ISSUES --
    ysy.data.issues.clear();
    //  -- MILESTONES --
    ysy.data.milestones.clear();
    //  -- PROJECTS --
    ysy.data.projects.clear();
    // ARRAY FILLING
    //  -- PROJECTS --
    this._loadProjects(json.projects);
    //  -- ISSUES --
    this._loadIssues(json.issues, "root");
    //  -- MILESTONES --
    this._loadMilestones(json.versions); // after issue loading because of shared milestones
    //  -- RELATIONS --
    this._loadRelations(json.relations);
    //  -- HOLIDAYS --
    this._loadHolidays(json.holidays);

    ysy.log.debug("data loaded", "load");
    ysy.log.message("JSON loaded");
    this._fireChanges();
    ysy.history.clear();
    this.loaded = true;
  },
....
スポンサーリンク

View Customize プラグインでグローバル変数に祝日を設定する

View Customize プラグイン: https://github.com/onozaty/redmine-view-customize

パスのパターン/projects/.*/easy_gantt|/easy_gantt
挿入位置全ページのヘッダ
種別JavaScript
$(document).ready(function(){
  // 祝日対応
  window.ysy.settings.holidays.push(
    '2024-01-08',  // 成人の日
    '2024-02-11',  // 建国記念の日
    '2024-02-12',  // 休日
    '2024-02-23',  // 天皇誕生日
    '2024-03-20',  // 春分の日
    '2024-04-29',  // 昭和の日
    '2024-05-03',  // 憲法記念日
    '2024-05-04',  // みどりの日
    '2024-05-05',  // こどもの日
    '2024-05-06',  // 休日
    '2024-07-15',  // 海の日
    '2024-08-11',  // 山の日
    '2024-08-12',  // 休日
    '2024-09-16',  // 敬老の日
    '2024-09-22',  // 秋分の日
    '2024-09-23',  // 休日
    '2024-10-14',  // スポーツの日
    '2024-11-03',  // 文化の日
    '2024-11-04',  // 休日
    '2024-11-23',  // 勤労感謝の日
  );
});

以上です!

コメント

タイトルとURLをコピーしました