Project

General

Profile

Patch #38740 » enhanced_functionality_for_gantt_chart.patch

Yasu Saku, 2023-06-18 16:46

View differences:

public/javascripts/gantt.js
233 233
ganttEntryClick = function(e){
234 234
  var icon_expander = e.target;
235 235
  var subject = $(icon_expander.parentElement);
236
  var subject_left = parseInt(subject.css('left')) + parseInt(icon_expander.offsetWidth);
236
  const expander_width = parseInt(icon_expander.offsetWidth);
237
  var subject_left = parseInt(subject.css('left')) + expander_width;
237 238
  var target_shown = null;
238 239
  var target_top = 0;
239 240
  var total_height = 0;
240 241
  var out_of_hierarchy = false;
241 242
  var iconChange = null;
243
  let collapsed_parent_left = null;
244
  let parent_is_collapsed = null;
245
  const force_collapse_expand = e.ctrlKey;
246
  function is_expander(el) {
247
    return $(el).find('.expander').length > 0;
248
  }
242 249
  if(subject.hasClass('open'))
243 250
    iconChange = function(element){
244 251
      $(element).find('.expander').switchClass('icon-expanded', 'icon-collapsed');
245 252
      $(element).removeClass('open');
253
      if (is_expander(element) && (element === subject || force_collapse_expand)) element.addClass('collapsed');
246 254
    };
247 255
  else
248 256
    iconChange = function(element){
249 257
      $(element).find('.expander').switchClass('icon-collapsed', 'icon-expanded');
250 258
      $(element).addClass('open');
259
      if (is_expander(element) && (element === subject || force_collapse_expand)) element.removeClass('collapsed');
251 260
    };
252 261
  iconChange(subject);
262
  parent_is_collapsed = subject.hasClass('collapsed');
253 263
  subject.nextAll('div').each(function(_, element){
254 264
    var el = $(element);
255 265
    var json = el.data('collapse-expand');
......
268 278
      return true;
269 279
    }
270 280

  
271
    var is_shown = el.is(':visible');
272
    if(target_shown == null){
273
      target_shown = is_shown;
274
      target_top = parseInt(el.css('top'));
275
      total_height = 0;
276
    }
277
    if(is_shown == target_shown){
278
      $(el_task_bars).each(function(_, task) {
279
        var el_task = $(task);
281
    const is_target_to_update = (() => {
282
      const target_left = parseInt(el.css('left'));
283
      if (!subject.hasClass('open') || force_collapse_expand) {
284
        return true;
285
      } else {
286
        if (is_expander(el)) {
287
          if (collapsed_parent_left == null || collapsed_parent_left >= target_left + expander_width) {
288
            // First element or the same level or higher as the most recent collapsed parent element
289
            parent_is_collapsed = el.hasClass('collapsed');
290
            if (parent_is_collapsed) collapsed_parent_left = target_left + expander_width;
291
            else collapsed_parent_left = null;
292
            return true;
293
          }
294
        } else if (parent_is_collapsed && collapsed_parent_left >= target_left) {
295
          // Elements at the same level or higher as the most recent collapsed parent element
296
          parent_is_collapsed = false;
297
          return true;
298
        } else if (!parent_is_collapsed) {
299
          return true;
300
        }
301
      }
302
      return false;
303
    })();
304

  
305
    if (is_target_to_update) {
306
      var is_shown = el.is(':visible');
307
      if(target_shown == null){
308
        target_shown = is_shown;
309
        target_top = 
310
          parseInt(subject.css('top')) + 
311
          parseInt(subject.data('collapse-expand').top_increment);
312
        total_height = 0;
313
      }
314
      if(is_shown == target_shown){
315
        $(el_task_bars).each(function(_, task) {
316
          var el_task = $(task);
317
          if(!is_shown)
318
            el_task.css('top', target_top + total_height);
319
          if(!el_task.hasClass('tooltip'))
320
            el_task.toggle(!is_shown);
321
        });
322
        $(el_selected_columns).each(function (_, attr) {
323
          var el_attr = $(attr);
324
          if (!is_shown)
325
            el_attr.css('top', target_top + total_height);
326
            el_attr.toggle(!is_shown);
327
        });
280 328
        if(!is_shown)
281
          el_task.css('top', target_top + total_height);
282
        if(!el_task.hasClass('tooltip'))
283
          el_task.toggle(!is_shown);
284
      });
285
      $(el_selected_columns).each(function (_, attr) {
286
        var el_attr = $(attr);
287
        if (!is_shown)
288
          el_attr.css('top', target_top + total_height);
289
          el_attr.toggle(!is_shown);
290
      });
291
      if(!is_shown)
292
        el.css('top', target_top + total_height);
293
      iconChange(el);
294
      el.toggle(!is_shown);
295
      total_height += parseInt(json.top_increment);
329
          el.css('top', target_top + total_height);
330
        if(!el.hasClass('collapsed') || force_collapse_expand) iconChange(el);
331
        el.toggle(!is_shown);
332
        total_height += parseInt(json.top_increment);
333
      }
296 334
    }
297 335
  });
298 336
  drawGanttHandler();
(1-1/4)