</span><?php break; case TBGCustomDatatype::EDITIONS_CHOICE: case TBGCustomDatatype::COMPONENTS_CHOICE: case TBGCustomDatatype::RELEASES_CHOICE: $edition = null; $value = null; try { switch ($info['type']) { case TBGCustomDatatype::EDITIONS_CHOICE: $edition = new TBGEdition($info['name']); $value = $edition->getName(); break; case TBGCustomDatatype::COMPONENTS_CHOICE: $edition = new TBGComponent($info['name']); $value = $edition->getName(); break; case TBGCustomDatatype::RELEASES_CHOICE: $edition = new TBGBuild($info['name']); $value = $edition->getName(); break; } } catch (Exception $e) { } ?> <span id="<?php echo $field; ?> _name"<?php if (!$info['name_visible']) { ?>
/** * Set status for affected component * * @see setAffectedItemStatus() * @see setAffectedBuildStatus() * @see setAffectedEditionStatus() * * @param TBGComponent $item The component to set status for * @param TBGDatatype $status The status to set * * @return boolean */ public function setAffectedComponentStatus($item, $status) { if (B2DB::getTable('TBGIssueAffectsComponentTable')->setStatusByIssueIDandComponentID($this->getID(), $item->getID(), $status->getID())) { $this->addLogEntry(TBGLogTable::LOG_AFF_DELETE, TBGContext::getI18n()->__("'%item_name%' -> '%status_name%", array('%item_name%' => $item->getName(), '%status_name%' => $status->getName()))); $this->addSystemComment(TBGContext::getI18n()->__('Affected component updated'), TBGContext::getI18n()->__('Component \'\'\'%component%\'\'\' is now %status%', array('%component%' => $item->getName(), '%status%' => $status->getName())), TBGContext::getUser()->getID()); return true; } return false; }
/** * Set status for affected component * * @see setAffectedItemStatus() * @see setAffectedBuildStatus() * @see setAffectedEditionStatus() * * @param TBGComponent $item The component to set status for * @param TBGDatatype $status The status to set * * @return boolean */ public function setAffectedComponentStatus($item, $status) { if (TBGIssueAffectsComponentTable::getTable()->setStatusByIssueIDandComponentID($this->getID(), $item->getID(), $status->getID())) { $this->addLogEntry(TBGLogTable::LOG_AFF_DELETE, TBGContext::getI18n()->__("'%item_name' -> '%status_name", array('%item_name' => $item->getName(), '%status_name' => $status->getName()))); return true; } return false; }
/** * Sets an issue field to a specified value * * @param TBGRequest $request */ public function runIssueSetField(TBGRequest $request) { if ($issue_id = $request->getParameter('issue_id')) { try { $issue = TBGContext::factory()->TBGIssue($issue_id); } catch (Exception $e) { $this->getResponse()->setHttpStatus(400); return $this->renderText('fail'); } } else { $this->getResponse()->setHttpStatus(400); return $this->renderText('no issue'); } TBGContext::loadLibrary('common'); if (!$issue instanceof TBGIssue) { return false; } switch ($request->getParameter('field')) { case 'description': if (!$issue->canEditDescription()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } $issue->setDescription($request->getRawParameter('value')); return $this->renderJSON(array('changed' => $issue->isDescriptionChanged(), 'field' => array('id' => (int) ($issue->getDescription() != ''), 'name' => tbg_parse_text($issue->getDescription(), false, null, array('issue' => $issue))), 'description' => tbg_parse_text($issue->getDescription(), false, null, array('issue' => $issue)))); break; case 'reproduction_steps': if (!$issue->canEditReproductionSteps()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } $issue->setReproductionSteps($request->getRawParameter('value')); return $this->renderJSON(array('changed' => $issue->isReproductionStepsChanged(), 'field' => array('id' => (int) ($issue->getReproductionSteps() != ''), 'name' => tbg_parse_text($issue->getReproductionSteps(), false, null, array('issue' => $issue))), 'reproduction_steps' => tbg_parse_text($issue->getReproductionSteps(), false, null, array('issue' => $issue)))); break; case 'title': if (!$issue->canEditTitle()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } if ($request->getParameter('value') == '') { return $this->renderJSON(array('changed' => false, 'failed' => true, 'error' => TBGContext::getI18n()->__('You have to provide a title'))); } else { $issue->setTitle($request->getRawParameter('value')); return $this->renderJSON(array('changed' => $issue->isTitleChanged(), 'field' => array('id' => 1, 'name' => strip_tags($issue->getTitle())), 'title' => strip_tags($issue->getTitle()))); } break; case 'percent': if (!$issue->canEditPercentage()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } $issue->setPercentCompleted($request->getParameter('percent')); return $this->renderJSON(array('changed' => $issue->isPercentCompletedChanged(), 'percent' => $issue->getPercentCompleted())); break; case 'estimated_time': if (!$issue->canEditEstimatedTime()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } if ($request->getParameter('estimated_time') != TBGContext::getI18n()->__('Enter your estimate here') && $request->getParameter('estimated_time')) { $issue->setEstimatedTime($request->getParameter('estimated_time')); } elseif ($request->hasParameter('value')) { $issue->setEstimatedTime($request->getParameter('value')); } else { $issue->setEstimatedMonths($request->getParameter('estimated_time_months')); $issue->setEstimatedWeeks($request->getParameter('estimated_time_weeks')); $issue->setEstimatedDays($request->getParameter('estimated_time_days')); $issue->setEstimatedHours($request->getParameter('estimated_time_hours')); $issue->setEstimatedPoints($request->getParameter('estimated_time_points')); } return $this->renderJSON(array('changed' => $issue->isEstimatedTimeChanged(), 'field' => $issue->hasEstimatedTime() ? array('id' => 1, 'name' => $issue->getFormattedTime($issue->getEstimatedTime())) : array('id' => 0), 'values' => $issue->getEstimatedTime())); break; case 'owned_by': case 'posted_by': case 'assigned_to': if ($request->getParameter('field') == 'owned_by' && !$issue->canEditOwnedBy()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request->getParameter('field') == 'posted_by' && !$issue->canEditPostedBy()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request->getParameter('field') == 'assigned_to' && !$issue->canEditAssignedTo()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } if ($request->hasParameter('value')) { if ($request->hasParameter('identifiable_type')) { if (in_array($request->getParameter('identifiable_type'), array(TBGIdentifiableClass::TYPE_USER, TBGIdentifiableClass::TYPE_TEAM))) { switch ($request->getParameter('identifiable_type')) { case TBGIdentifiableClass::TYPE_USER: $identified = TBGContext::factory()->TBGUser($request->getParameter('value')); break; case TBGIdentifiableClass::TYPE_TEAM: $identified = TBGContext::factory()->TBGTeam($request->getParameter('value')); break; } if ($identified instanceof TBGIdentifiableClass) { if ((bool) $request->getParameter('teamup', false)) { $team = new TBGTeam(); $team->setName($identified->getBuddyname() . ' & ' . TBGContext::getUser()->getBuddyname()); $team->setOndemand(true); $team->save(); $team->addMember($identified); $team->addMember(TBGContext::getUser()); $identified = $team; } if ($request->getParameter('field') == 'owned_by') { $issue->setOwner($identified); } elseif ($request->getParameter('field') == 'assigned_to') { $issue->setAssignee($identified); } } } else { if ($request->getParameter('field') == 'owned_by') { $issue->unsetOwner(); } elseif ($request->getParameter('field') == 'assigned_to') { $issue->unsetAssignee(); } } } elseif ($request->getParameter('field') == 'posted_by') { $identified = TBGContext::factory()->TBGUser($request->getParameter('value')); if ($identified instanceof TBGIdentifiableClass) { $issue->setPostedBy($identified); } } if ($request->getParameter('field') == 'owned_by') { return $this->renderJSON(array('changed' => $issue->isOwnedByChanged(), 'field' => $issue->isOwned() ? array('id' => $issue->getOwnerID(), 'name' => $issue->getOwnerType() == TBGIdentifiableClass::TYPE_USER ? $this->getComponentHTML('main/userdropdown', array('user' => $issue->getOwner())) : $this->getComponentHTML('main/teamdropdown', array('team' => $issue->getOwner()))) : array('id' => 0))); } if ($request->getParameter('field') == 'posted_by') { return $this->renderJSON(array('changed' => $issue->isPostedByChanged(), 'field' => array('id' => $issue->getPostedByID(), 'name' => $this->getComponentHTML('main/userdropdown', array('user' => $issue->getPostedBy()))))); } if ($request->getParameter('field') == 'assigned_to') { return $this->renderJSON(array('changed' => $issue->isAssignedToChanged(), 'field' => $issue->isAssigned() ? array('id' => $issue->getAssigneeID(), 'name' => $issue->getAssigneeType() == TBGIdentifiableClass::TYPE_USER ? $this->getComponentHTML('main/userdropdown', array('user' => $issue->getAssignee())) : $this->getComponentHTML('main/teamdropdown', array('team' => $issue->getAssignee()))) : array('id' => 0))); } } break; case 'spent_time': if (!$issue->canEditSpentTime()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } if ($request->getParameter('spent_time') != TBGContext::getI18n()->__('Enter time spent here') && $request->getParameter('spent_time')) { $function = $request->hasParameter('spent_time_added_text') ? 'addSpentTime' : 'setSpentTime'; $issue->{$function}($request->getParameter('spent_time')); } elseif ($request->hasParameter('value')) { $issue->setSpentTime($request->getParameter('value')); } else { if ($request->hasParameter('spent_time_added_input')) { $issue->addSpentMonths($request->getParameter('spent_time_months')); $issue->addSpentWeeks($request->getParameter('spent_time_weeks')); $issue->addSpentDays($request->getParameter('spent_time_days')); $issue->addSpentHours($request->getParameter('spent_time_hours')); $issue->addSpentPoints($request->getParameter('spent_time_points')); } else { $issue->setSpentMonths($request->getParameter('spent_time_months')); $issue->setSpentWeeks($request->getParameter('spent_time_weeks')); $issue->setSpentDays($request->getParameter('spent_time_days')); $issue->setSpentHours($request->getParameter('spent_time_hours')); $issue->setSpentPoints($request->getParameter('spent_time_points')); } } return $this->renderJSON(array('changed' => $issue->isSpentTimeChanged(), 'field' => $issue->hasSpentTime() ? array('id' => 1, 'name' => $issue->getFormattedTime($issue->getSpentTime())) : array('id' => 0), 'values' => $issue->getSpentTime())); break; case 'category': case 'resolution': case 'severity': case 'reproducability': case 'priority': case 'milestone': case 'issuetype': case 'status': case 'pain_bug_type': case 'pain_likelihood': case 'pain_effect': if ($request->getParameter('field') == 'category' && !$issue->canEditCategory()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request->getParameter('field') == 'resolution' && !$issue->canEditResolution()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request->getParameter('field') == 'severity' && !$issue->canEditSeverity()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request->getParameter('field') == 'reproducability' && !$issue->canEditReproducability()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request->getParameter('field') == 'priority' && !$issue->canEditPriority()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request->getParameter('field') == 'milestone' && !$issue->canEditMilestone()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request->getParameter('field') == 'issuetype' && !$issue->canEditIssuetype()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif ($request->getParameter('field') == 'status' && !$issue->canEditStatus()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } elseif (in_array($request->getParameter('field'), array('pain_bug_type', 'pain_likelihood', 'pain_effect')) && !$issue->canEditUserPain()) { return $this->renderJSON(array('changed' => false, 'error' => TBGContext::getI18n()->__('You do not have permission to perform this action'))); } try { $classname = null; $parameter_name = strtolower($request->getParameter('field')); $parameter_id_name = "{$parameter_name}_id"; $is_pain = in_array($parameter_name, array('pain_bug_type', 'pain_likelihood', 'pain_effect')); if ($is_pain) { switch ($parameter_name) { case 'pain_bug_type': $set_function_name = 'setPainBugType'; $is_changed_function_name = 'isPainBugTypeChanged'; $get_pain_type_label_function = 'getPainBugTypeLabel'; break; case 'pain_likelihood': $set_function_name = 'setPainLikelihood'; $is_changed_function_name = 'isPainLikelihoodChanged'; $get_pain_type_label_function = 'getPainLikelihoodLabel'; break; case 'pain_effect': $set_function_name = 'setPainEffect'; $is_changed_function_name = 'isPainEffectChanged'; $get_pain_type_label_function = 'getPainEffectLabel'; break; } } else { $classname = 'TBG' . ucfirst($parameter_name); $lab_function_name = $classname; $set_function_name = 'set' . ucfirst($parameter_name); $is_changed_function_name = 'is' . ucfirst($parameter_name) . 'Changed'; } if ($request->hasParameter($parameter_id_name)) { $parameter_id = $request->getParameter($parameter_id_name); if ($parameter_id !== 0) { $is_valid = $is_pain ? in_array($parameter_id, array_keys(TBGIssue::getPainTypesOrLabel($parameter_name))) : $parameter_id == 0 || ($parameter = TBGContext::factory()->{$lab_function_name}($parameter_id)) instanceof TBGIdentifiableClass; } if ($parameter_id == 0 || $parameter_id !== 0 && $is_valid) { if ($classname == 'TBGIssuetype') { $visible_fields = $issue->getIssuetype() instanceof TBGIssuetype ? $issue->getProject()->getVisibleFieldsArray($issue->getIssuetype()->getID()) : array(); } else { $visible_fields = null; } $issue->{$set_function_name}($parameter_id); if ($is_pain) { if (!$issue->{$is_changed_function_name}()) { return $this->renderJSON(array('changed' => false, 'field' => array('id' => 0), 'user_pain' => $issue->getUserPain(), 'user_pain_diff_text' => $issue->getUserPainDiffText())); } return $parameter_id == 0 ? $this->renderJSON(array('changed' => true, 'field' => array('id' => 0), 'user_pain' => $issue->getUserPain(), 'user_pain_diff_text' => $issue->getUserPainDiffText())) : $this->renderJSON(array('changed' => true, 'field' => array('id' => $parameter_id, 'name' => $issue->{$get_pain_type_label_function}()), 'user_pain' => $issue->getUserPain(), 'user_pain_diff_text' => $issue->getUserPainDiffText())); } else { if (!$issue->{$is_changed_function_name}()) { return $this->renderJSON(array('changed' => false)); } if (isset($parameter)) { $name = $parameter->getName(); } else { $name = null; } $field = array('id' => $parameter_id, 'name' => $name); if ($classname == 'TBGIssuetype') { TBGContext::loadLibrary('ui'); $field['src'] = htmlspecialchars(TBGContext::getTBGPath() . 'themes/' . TBGSettings::getThemeName() . '/' . $issue->getIssuetype()->getIcon() . '_small.png'); } return $parameter_id == 0 ? $this->renderJSON(array('changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('changed' => true, 'visible_fields' => $visible_fields, 'field' => $field)); } } } } catch (Exception $e) { $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('error' => $e->getMessage())); } $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('error' => TBGContext::getI18n()->__('No valid field value specified'))); break; default: if ($customdatatype = TBGCustomDatatype::getByKey($request->getParameter('field'))) { $key = $customdatatype->getKey(); $customdatatypeoption_value = $request->getParameter("{$key}_value"); if (!$customdatatype->hasCustomOptions()) { switch ($customdatatype->getType()) { case TBGCustomDatatype::EDITIONS_CHOICE: case TBGCustomDatatype::COMPONENTS_CHOICE: case TBGCustomDatatype::RELEASES_CHOICE: case TBGCustomDatatype::STATUS_CHOICE: if ($customdatatypeoption_value == '') { $issue->setCustomField($key, ""); } else { switch ($customdatatype->getType()) { case TBGCustomDatatype::EDITIONS_CHOICE: $temp = new TBGEdition($request->getRawParameter("{$key}_value")); $finalvalue = $temp->getName(); break; case TBGCustomDatatype::COMPONENTS_CHOICE: $temp = new TBGComponent($request->getRawParameter("{$key}_value")); $finalvalue = $temp->getName(); break; case TBGCustomDatatype::RELEASES_CHOICE: $temp = new TBGBuild($request->getRawParameter("{$key}_value")); $finalvalue = $temp->getName(); break; case TBGCustomDatatype::STATUS_CHOICE: $temp = new TBGStatus($request->getRawParameter("{$key}_value")); $finalvalue = $temp->getName(); break; } $issue->setCustomField($key, $request->getRawParameter("{$key}_value")); } if (isset($temp) && $customdatatype->getType() == TBGCustomDatatype::STATUS_CHOICE && is_object($temp)) { $finalvalue = '<div style="border: 1px solid #AAA; background-color: ' . $temp->getColor() . '; font-size: 1px; width: 20px; height: 15px; margin-right: 5px; float: left;" id="status_color"> </div>' . $finalvalue; } $changed_methodname = "isCustomfield{$key}Changed"; if (!$issue->{$changed_methodname}()) { return $this->renderJSON(array('changed' => false)); } return $customdatatypeoption_value == '' ? $this->renderJSON(array('changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('changed' => true, 'field' => array('value' => $key, 'name' => $finalvalue))); break; case TBGCustomDatatype::INPUT_TEXTAREA_MAIN: case TBGCustomDatatype::INPUT_TEXTAREA_SMALL: if ($customdatatypeoption_value == '') { $issue->setCustomField($key, ""); } else { $issue->setCustomField($key, $request->getRawParameter("{$key}_value")); } $changed_methodname = "isCustomfield{$key}Changed"; if (!$issue->{$changed_methodname}()) { return $this->renderJSON(array('changed' => false)); } return $customdatatypeoption_value == '' ? $this->renderJSON(array('changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('changed' => true, 'field' => array('value' => $key, 'name' => tbg_parse_text($request->getRawParameter("{$key}_value"), false, null, array('issue' => $issue))))); break; default: if ($customdatatypeoption_value == '') { $issue->setCustomField($key, ""); } else { $issue->setCustomField($key, $request->getParameter("{$key}_value")); } $changed_methodname = "isCustomfield{$key}Changed"; if (!$issue->{$changed_methodname}()) { return $this->renderJSON(array('changed' => false)); } return $customdatatypeoption_value == '' ? $this->renderJSON(array('changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('changed' => true, 'field' => array('value' => $key, 'name' => $customdatatypeoption_value))); break; } } if ($customdatatypeoption_value == '' || $customdatatypeoption_value && ($customdatatypeoption = TBGCustomDatatypeOption::getByValueAndKey($customdatatypeoption_value, $key)) instanceof TBGCustomDatatypeOption) { if ($customdatatypeoption_value == '') { $issue->setCustomField($key, ""); } else { $issue->setCustomField($key, $customdatatypeoption->getValue()); } $changed_methodname = "isCustomfield{$key}Changed"; if (!$issue->{$changed_methodname}()) { return $this->renderJSON(array('changed' => false)); } return $customdatatypeoption_value == '' ? $this->renderJSON(array('changed' => true, 'field' => array('id' => 0))) : $this->renderJSON(array('changed' => true, 'field' => array('value' => $customdatatypeoption_value, 'name' => $customdatatypeoption->getName()))); } } break; } $this->getResponse()->setHttpStatus(400); return $this->renderJSON(array('error' => TBGContext::getI18n()->__('No valid field specified (%field%)', array('%field%' => $request->getParameter('field'))))); }