diff --git a/module/block/control.php b/module/block/control.php index 04298fd39c..30d6d87727 100644 --- a/module/block/control.php +++ b/module/block/control.php @@ -337,7 +337,7 @@ class block extends control } elseif($block->block == 'assigntome') { - $html = $this->fetch('block', 'printAssignToMeBlock'); + $html = $this->fetch('block', 'printAssignToMeBlock', 'longBlock=' . $this->block->isLongBlock($block)); } elseif($block->block == 'welcome') { @@ -701,7 +701,7 @@ class block extends control * @access public * @return void */ - public function printAssignToMeBlock() + public function printAssignToMeBlock($longBlock = true) { if(common::hasPriv('todo', 'view')) $hasViewPriv['todo'] = true; if(common::hasPriv('story', 'view')) $hasViewPriv['story'] = true; @@ -771,6 +771,7 @@ class block extends control } $this->view->hasViewPriv = $hasViewPriv; + $this->view->longBlock = $longBlock; $this->display(); } diff --git a/module/block/view/bugblock.html.php b/module/block/view/bugblock.html.php index f26d5859bc..9c96a60894 100644 --- a/module/block/view/bugblock.html.php +++ b/module/block/view/bugblock.html.php @@ -11,16 +11,16 @@ */ ?>
| idAB?> | -idAB?> | +priAB?> | -priAB?> | -bug->title;?> | -bug->severityAB?> | -'>bug->statusAB;?> | +bug->severityAB?> | +bug->title;?> | +bug->statusAB;?> | ||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| id;?> | -id;?> | +bug->priList, $bug->pri, $bug->pri)?> | -bug->priList, $bug->pri, $bug->pri)?> | -title?> | -bug->severityList, $bug->severity, $bug->severity)?> | -- + | + | title?> | ++ - bug->statusList, $bug->status);?> + bug->statusList, $bug->status);?> | ||||
| idAB?> | -build->product;?> | -build->name;?> | -build->date;?> | -
|---|---|---|---|
| idAB?> | +build->product;?> | +build->name;?> | +build->date;?> | +
| id;?> | -productName?> | -name?> | -date?> | -
| id;?> | +productName?> | +name?> | +date?> | +
| product->name;?> | - -story->statusList['changed'];?> | - +||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| product->name;?> | +product->plans;?> | +product->releases;?> | -product->plans;?> | +product->currentProject;?> | -product->releases;?> | - -product->currentProject;?> | -story->statusList['active'];?> | - - -product->bugs;?> | - -bug->unResolved;?> | +story->statusList['active'];?> | +bug->unResolved;?> | ||
| name?> | - -stories['changed']?> | - +name?> | +plans?> | +releases?> | -plans?> | +id, '');?> | -releases?> | - -id, '');?> | -stories['active']?> | - - -bugs?> | - -unResolved?> | +stories['active']?> | +unResolved?> |
| idAB?> | -priAB?> | -story->title;?> | - -story->estimateAB;?> | - -statusAB;?> | - -story->stageAB;?> | - -||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| idAB?> | +priAB?> | +story->title;?> | + +story->estimateAB;?> | + +statusAB;?> | + +story->stageAB;?> | + +||||||
| id;?> | - story->priList, $story->pri, $story->pri);?> + story->priList, $story->pri, $story->pri);?>title?> | -estimate?> | +estimate?> | -- story->statusList, $story->status);?> + | + + story->statusList, $story->status);?> + | -story->stageList, $story->stage, $story->stage);?> | ++ + story->stageList, $story->stage, $story->stage);?> + + | ||||
| idAB?> | +priAB?> | +task->name;?> | -idAB?> | +task->estimateAB;?> | +task->deadline;?> | -priAB?> | -task->name;?> | -task->estimateAB;?> | - -task->deadline;?> | - -statusAB;?> | +statusAB;?> |
|---|---|---|---|---|---|---|---|---|---|---|---|
| id;?> | +task->priList, $task->pri, $task->pri)?> | +name?> | -id;?> | +estimate?> | +deadline, 0, 4) > 0) echo $task->deadline;?> | -task->priList, $task->pri, $task->pri)?> | -name?> | -estimate?> | - -'>deadline, 0, 4) > 0) echo $task->deadline;?> | - -- + | + - task->statusList, $task->status);?> + task->statusList, $task->status);?> | bug->severityList, $bug->severity, $bug->severity)?>'>bug->severityList, $bug->severity, $bug->severity);?> | bug->priList, $bug->pri, $bug->pri)?>'>bug->priList, $bug->pri, $bug->pri)?> | -bug->typeList[$bug->type]?> | +bug->typeList, $bug->type, '');?> | createLink('bug', 'view', "bugID=$bug->id"), $bug->title, null, "style='color: $bug->color'");?> | openedBy];?> | assignedTo];?> | diff --git a/www/js/zui/min.js b/www/js/zui/min.js index ece6c25b85..9ab1587467 100644 --- a/www/js/zui/min.js +++ b/www/js/zui/min.js @@ -1,5 +1,5 @@ /*! - * ZUI: Zentao template - v1.8.1 - 2018-01-22 + * ZUI: Zentao template - v1.8.1 - 2018-01-30 * http://zui.sexy * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2018 cnezsoft.com; Licensed MIT @@ -9013,6 +9013,1717 @@ /// ----- ZUI change end ----- +/* ======================================================================== + * Datetimepicker: bootstrap-datetimepicker.js + * http://www.malot.fr/bootstrap-datetimepicker + * + * ZUI: The file has been changed in ZUI. It will not keep update with the + * official version in the future. + * http://zui.sexy + * ======================================================================== + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Improvements by Sébastien Malot + * Improvements by Yun Lai + * Improvement by CuGBabyBeaR @ 2013-09-12 + * Project URL : http://www.malot.fr/bootstrap-datetimepicker + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== + * Improvement in ZUI: + * 1. Determine client language and apply setting automatically. + * 2. New option for 'pickerPosition': + * - 'auto-left'; + * - 'auto-right'. + * ======================================================================== */ + + +/*! + * Datetimepicker for Bootstrap + * Copyright 2012 Stefan Petre + * Licensed under the Apache License v2.0 + */ + +! function($) { + + function UTCDate() { + return new Date(Date.UTC.apply(Date, arguments)); + } + + function UTCToday() { + var today = new Date(); + return UTCDate(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate(), today.getUTCHours(), today.getUTCMinutes(), today.getUTCSeconds(), 0); + } + + // Picker object + + var Datetimepicker = function(element, options) { + var that = this; + + this.element = $(element); + + this.language = (options.language || this.element.data('date-language') || ($.zui && $.zui.clientLang ? $.zui.clientLang().replace('_', '-') : "zh-cn")).toLowerCase(); + this.language = this.language in dates ? this.language : "en"; + this.isRTL = dates[this.language].rtl || false; + this.formatType = options.formatType || this.element.data('format-type') || 'standard'; + this.format = DPGlobal.parseFormat(options.format || this.element.data('date-format') || dates[this.language].format || DPGlobal.getDefaultFormat(this.formatType, 'input'), this.formatType); + this.isInline = false; + this.isVisible = false; + this.isInput = this.element.is('input'); + + this.component = this.element.is('.date') ? this.element.find('.input-group-addon .icon-th, .input-group-addon .icon-time, .input-group-addon .icon-calendar').parent() : false; + this.componentReset = this.element.is('.date') ? this.element.find('.input-group-addon .icon-remove').parent() : false; + this.hasInput = this.component && this.element.find('input').length; + if(this.component && this.component.length === 0) { + this.component = false; + } + this.linkField = options.linkField || this.element.data('link-field') || false; + this.linkFormat = DPGlobal.parseFormat(options.linkFormat || this.element.data('link-format') || DPGlobal.getDefaultFormat(this.formatType, 'link'), this.formatType); + this.minuteStep = options.minuteStep || this.element.data('minute-step') || 5; + this.pickerPosition = options.pickerPosition || this.element.data('picker-position') || 'bottom-right'; + this.showMeridian = options.showMeridian || this.element.data('show-meridian') || false; + this.initialDate = options.initialDate || new Date(); + this.pickerClass = options.eleClass; + this.pickerId = options.eleId; + + this._attachEvents(); + + this.formatViewType = "datetime"; + if('formatViewType' in options) { + this.formatViewType = options.formatViewType; + } else if('formatViewType' in this.element.data()) { + this.formatViewType = this.element.data('formatViewType'); + } + + this.minView = 0; + if('minView' in options) { + this.minView = options.minView; + } else if('minView' in this.element.data()) { + this.minView = this.element.data('min-view'); + } + this.minView = DPGlobal.convertViewMode(this.minView); + + this.maxView = DPGlobal.modes.length - 1; + if('maxView' in options) { + this.maxView = options.maxView; + } else if('maxView' in this.element.data()) { + this.maxView = this.element.data('max-view'); + } + this.maxView = DPGlobal.convertViewMode(this.maxView); + + this.wheelViewModeNavigation = false; + if('wheelViewModeNavigation' in options) { + this.wheelViewModeNavigation = options.wheelViewModeNavigation; + } else if('wheelViewModeNavigation' in this.element.data()) { + this.wheelViewModeNavigation = this.element.data('view-mode-wheel-navigation'); + } + + this.wheelViewModeNavigationInverseDirection = false; + + if('wheelViewModeNavigationInverseDirection' in options) { + this.wheelViewModeNavigationInverseDirection = options.wheelViewModeNavigationInverseDirection; + } else if('wheelViewModeNavigationInverseDirection' in this.element.data()) { + this.wheelViewModeNavigationInverseDirection = this.element.data('view-mode-wheel-navigation-inverse-dir'); + } + + this.wheelViewModeNavigationDelay = 100; + if('wheelViewModeNavigationDelay' in options) { + this.wheelViewModeNavigationDelay = options.wheelViewModeNavigationDelay; + } else if('wheelViewModeNavigationDelay' in this.element.data()) { + this.wheelViewModeNavigationDelay = this.element.data('view-mode-wheel-navigation-delay'); + } + + this.startViewMode = 2; + if('startView' in options) { + this.startViewMode = options.startView; + } else if('startView' in this.element.data()) { + this.startViewMode = this.element.data('start-view'); + } + this.startViewMode = DPGlobal.convertViewMode(this.startViewMode); + this.viewMode = this.startViewMode; + + this.viewSelect = this.minView; + if('viewSelect' in options) { + this.viewSelect = options.viewSelect; + } else if('viewSelect' in this.element.data()) { + this.viewSelect = this.element.data('view-select'); + } + this.viewSelect = DPGlobal.convertViewMode(this.viewSelect); + + this.forceParse = true; + if('forceParse' in options) { + this.forceParse = options.forceParse; + } else if('dateForceParse' in this.element.data()) { + this.forceParse = this.element.data('date-force-parse'); + } + + this.picker = $(DPGlobal.template) + .appendTo(this.isInline ? this.element : 'body') + .on({ + click: $.proxy(this.click, this), + mousedown: $.proxy(this.mousedown, this) + }); + + if(this.wheelViewModeNavigation) { + if($.fn.mousewheel) { + this.picker.on({ + mousewheel: $.proxy(this.mousewheel, this) + }); + } else { + console.log("Mouse Wheel event is not supported. Please include the jQuery Mouse Wheel plugin before enabling this option"); + } + } + + if(this.isInline) { + this.picker.addClass('datetimepicker-inline'); + } else { + this.picker.addClass('datetimepicker-dropdown-' + this.pickerPosition + ' dropdown-menu'); + } + if(this.isRTL) { + this.picker.addClass('datetimepicker-rtl'); + this.picker.find('.prev span, .next span') + .toggleClass('icon-arrow-left icon-arrow-right');; + + } + $(document).on('mousedown', function(e) { + // Clicked outside the datetimepicker, hide it + if($(e.target).closest('.datetimepicker').length === 0) { + that.hide(); + } + }); + + this.autoclose = false; + if('autoclose' in options) { + this.autoclose = options.autoclose; + } else if('dateAutoclose' in this.element.data()) { + this.autoclose = this.element.data('date-autoclose'); + } + + this.keyboardNavigation = true; + if('keyboardNavigation' in options) { + this.keyboardNavigation = options.keyboardNavigation; + } else if('dateKeyboardNavigation' in this.element.data()) { + this.keyboardNavigation = this.element.data('date-keyboard-navigation'); + } + + this.todayBtn = (options.todayBtn || this.element.data('date-today-btn') || false); + this.todayHighlight = (options.todayHighlight || this.element.data('date-today-highlight') || false); + + this.weekStart = ((options.weekStart || this.element.data('date-weekstart') || dates[this.language].weekStart || 0) % 7); + this.weekEnd = ((this.weekStart + 6) % 7); + this.startDate = -Infinity; + this.endDate = Infinity; + this.daysOfWeekDisabled = []; + this.setStartDate(options.startDate || this.element.data('date-startdate')); + this.setEndDate(options.endDate || this.element.data('date-enddate')); + this.setDaysOfWeekDisabled(options.daysOfWeekDisabled || this.element.data('date-days-of-week-disabled')); + this.fillDow(); + this.fillMonths(); + this.update(); + this.showMode(); + + if(this.isInline) { + this.show(); + } + }; + + Datetimepicker.prototype = { + constructor: Datetimepicker, + + _events: [], + _attachEvents: function() { + this._detachEvents(); + if(this.isInput) { // single input + this._events = [ + [this.element, { + focus: $.proxy(this.show, this), + keyup: $.proxy(this.update, this), + keydown: $.proxy(this.keydown, this) + }] + ]; + } else if(this.component && this.hasInput) { // component: input + button + this._events = [ + // For components that are not readonly, allow keyboard nav + [this.element.find('input'), { + focus: $.proxy(this.show, this), + keyup: $.proxy(this.update, this), + keydown: $.proxy(this.keydown, this) + }], + [this.component, { + click: $.proxy(this.show, this) + }] + ]; + if(this.componentReset) { + this._events.push([ + this.componentReset, { + click: $.proxy(this.reset, this) + } + ]); + } + } else if(this.element.is('div')) { // inline datetimepicker + this.isInline = true; + } else { + this._events = [ + [this.element, { + click: $.proxy(this.show, this) + }] + ]; + } + for(var i = 0, el, ev; i < this._events.length; i++) { + el = this._events[i][0]; + ev = this._events[i][1]; + el.on(ev); + } + }, + + _detachEvents: function() { + for(var i = 0, el, ev; i < this._events.length; i++) { + el = this._events[i][0]; + ev = this._events[i][1]; + el.off(ev); + } + this._events = []; + }, + + show: function(e) { + this.picker.show(); + this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); + if(this.forceParse) { + this.update(); + } + this.place(); + $(window).on('resize', $.proxy(this.place, this)); + if(e) { + e.stopPropagation(); + e.preventDefault(); + } + this.isVisible = true; + this.element.trigger({ + type: 'show', + date: this.date + }); + }, + + hide: function(e) { + if(!this.isVisible) return; + if(this.isInline) return; + this.picker.hide(); + $(window).off('resize', this.place); + this.viewMode = this.startViewMode; + this.showMode(); + if(!this.isInput) { + $(document).off('mousedown', this.hide); + } + + if( + this.forceParse && + ( + this.isInput && this.element.val() || + this.hasInput && this.element.find('input').val() + ) + ) + this.setValue(); + this.isVisible = false; + this.element.trigger({ + type: 'hide', + date: this.date + }); + }, + + remove: function() { + this._detachEvents(); + this.picker.remove(); + delete this.picker; + delete this.element.data().datetimepicker; + }, + + getDate: function() { + var d = this.getUTCDate(); + return new Date(d.getTime() + (d.getTimezoneOffset() * 60000)); + }, + + getUTCDate: function() { + return this.date; + }, + + setDate: function(d) { + this.setUTCDate(new Date(d.getTime() - (d.getTimezoneOffset() * 60000))); + }, + + setUTCDate: function(d) { + if(d >= this.startDate && d <= this.endDate) { + this.date = d; + this.setValue(); + this.viewDate = this.date; + this.fill(); + } else { + this.element.trigger({ + type: 'outOfRange', + date: d, + startDate: this.startDate, + endDate: this.endDate + }); + } + }, + + setFormat: function(format) { + this.format = DPGlobal.parseFormat(format, this.formatType); + var element; + if(this.isInput) { + element = this.element; + } else if(this.component) { + element = this.element.find('input'); + } + if(element && element.val()) { + this.setValue(); + } + }, + + setValue: function() { + var formatted = this.getFormattedDate(); + if(!this.isInput) { + if(this.component) { + this.element.find('input').val(formatted); + } + this.element.data('date', formatted); + } else { + this.element.val(formatted); + } + if(this.linkField) { + $('#' + this.linkField).val(this.getFormattedDate(this.linkFormat)); + } + }, + + getFormattedDate: function(format) { + if(format == undefined) format = this.format; + return DPGlobal.formatDate(this.date, format, this.language, this.formatType); + }, + + setStartDate: function(startDate) { + this.startDate = startDate || -Infinity; + if(this.startDate !== -Infinity) { + this.startDate = DPGlobal.parseDate(this.startDate, this.format, this.language, this.formatType); + } + this.update(); + this.updateNavArrows(); + }, + + setEndDate: function(endDate) { + this.endDate = endDate || Infinity; + if(this.endDate !== Infinity) { + this.endDate = DPGlobal.parseDate(this.endDate, this.format, this.language, this.formatType); + } + this.update(); + this.updateNavArrows(); + }, + + setDaysOfWeekDisabled: function(daysOfWeekDisabled) { + this.daysOfWeekDisabled = daysOfWeekDisabled || []; + if(!$.isArray(this.daysOfWeekDisabled)) { + this.daysOfWeekDisabled = this.daysOfWeekDisabled.split(/,\s*/); + } + this.daysOfWeekDisabled = $.map(this.daysOfWeekDisabled, function(d) { + return parseInt(d, 10); + }); + this.update(); + this.updateNavArrows(); + }, + + place: function() { + if(this.isInline) return; + + var index_highest = 0; + $('div').each(function() { + var index_current = parseInt($(this).css("zIndex"), 10); + if(index_current > index_highest) { + index_highest = index_current; + } + }); + var zIndex = index_highest + 10; + + var offset, top, left; + if(this.component) { + offset = this.component.offset(); + left = offset.left; + if(this.pickerPosition === 'bottom-left' || this.pickerPosition === 'top-left' || this.pickerPosition === 'auto-left') { + left += this.component.outerWidth() - this.picker.outerWidth(); + } + } else { + offset = this.element.offset(); + left = offset.left; + } + + var isAutoPosition = this.pickerPosition.indexOf('auto-') === 0; + var realPickerPosition = isAutoPosition ? (((offset.top + this.picker.outerHeight() > $(window).height() + $(window).scrollTop()) ? 'top' : 'bottom') + (this.pickerPosition.lastIndexOf('-left') === 0 ? '-left' : '-right')) : this.pickerPosition; + + if(realPickerPosition === 'top-left' || realPickerPosition === 'top-right') { + top = offset.top - this.picker.outerHeight(); + } else { + top = offset.top + this.height; + } + this.picker.css({ + top: top, + left: left, + zIndex: zIndex + }).attr('class', 'datetimepicker dropdown-menu datetimepicker-dropdown-' + realPickerPosition); + if(this.pickerClass) this.picker.addClass(this.pickerClass); + if(this.pickerId) this.picker.attr('id', this.pickerId); + }, + + update: function() { + var date, fromArgs = false; + if(arguments && arguments.length && (typeof arguments[0] === 'string' || arguments[0] instanceof Date)) { + date = arguments[0]; + fromArgs = true; + } else { + date = this.element.data('date') || (this.isInput ? this.element.val() : this.element.find('input').val()) || this.initialDate; + if(typeof date == 'string' || date instanceof String) { + date = date.replace(/^\s+|\s+$/g, ''); + } + } + + if(!date) { + date = new Date(); + fromArgs = false; + } + + this.date = DPGlobal.parseDate(date, this.format, this.language, this.formatType); + + if(fromArgs) this.setValue(); + + if(this.date < this.startDate) { + this.viewDate = new Date(this.startDate); + } else if(this.date > this.endDate) { + this.viewDate = new Date(this.endDate); + } else { + this.viewDate = new Date(this.date); + } + this.fill(); + }, + + fillDow: function() { + var dowCnt = this.weekStart, + html = '
| ' + dates[this.language].daysMin[(dowCnt++) % 7] + ' | '; + } + html += '|||||||||||
| ' + prevMonth.getUTCDate() + ' | '); + if(prevMonth.getUTCDay() == this.weekEnd) { + html.push('|||||||||||
| ' + + ' | ' + + ' | ' + + ' | |||||||||