@@ -490,40 +643,25 @@
class="close"
data-dismiss="alert"
aria-label="Close"
- @click="publishTestCaseError = null"
- >
- ×
-
- An error occurred while attaching the testcase to the created external
- bug: {{ publishTestCaseError }}
-
-
-
-
- An error occurred while assigning the created external bug to the
- current crash bucket: {{ assignError }}
-
-
-
- Please define an API Token for
- {{ provider.hostname }} in your settings to submit a
- new bug.
+ {{ bugZillaTemplateError }}
@@ -557,6 +695,7 @@ import * as bugzillaApi from "../../bugzilla_api";
import * as HandlebarsHelpers from "../../handlebars_helpers";
import { errorParser } from "../../helpers";
import CrashDataSection from "./CrashDataSection.vue";
+import FullPPCSelect from "./FullPPCSelect.vue";
import HelpPopover from "./HelpPopover.vue";
import ProductComponentSelect from "./ProductComponentSelect.vue";
import SummaryInput from "./SummaryInput.vue";
@@ -577,6 +716,7 @@ export default defineComponent({
CrashDataSection,
TestCaseSection,
HelpPopover,
+ ppcselect: FullPPCSelect,
},
props: {
providerId: {
@@ -585,7 +725,8 @@ export default defineComponent({
},
templateId: {
type: Number,
- required: true,
+ required: false,
+ default: null,
},
entryId: {
type: Number,
@@ -593,7 +734,13 @@ export default defineComponent({
},
bucketId: {
type: Number,
- required: true,
+ required: false,
+ default: null,
+ },
+ isBugTemplateCreation: {
+ type: Boolean,
+ required: false,
+ default: false,
},
},
setup(props) {
@@ -602,7 +749,31 @@ export default defineComponent({
const provider = ref(null);
const templates = ref([]);
const selectedTemplate = ref(null);
- const template = ref(null);
+ const template = ref(
+ !props.isBugTemplateCreation
+ ? null
+ : {
+ name: "",
+ summary: "",
+ current_product: "",
+ current_component: "",
+ cc: "",
+ assigned_to: "",
+ priority: "",
+ severity: "",
+ alias: "",
+ qa_contact: "",
+ version: "",
+ target_milestone: "",
+ blocks: "",
+ dependson: "",
+ attrs: "",
+ description: "",
+ security: false,
+ security_group: "",
+ testcase_filename: "",
+ },
+ );
const entry = ref(null);
const summary = ref("");
const product = ref("");
@@ -619,6 +790,9 @@ export default defineComponent({
const testCaseContent = ref("");
const notAttachData = ref(false);
const crashData = ref("");
+ const bugzillaTemplateFieldErrors = ref({});
+ const bugZillaTemplateError = ref(null);
+ const formElement = ref(null);
const bugLink = computed(() => {
return `https://${provider.value.hostname}/${createdBugId.value}`;
@@ -778,6 +952,13 @@ export default defineComponent({
platform.value = entry.value.platform
.replaceAll("-", "_")
.replaceAll("arm", "ARM");
+
+ if (props.isBugTemplateCreation && props.templateId) {
+ template.value.current_component = template.value.component;
+ template.value.current_product = template.value.product;
+ product.value = template.value.product;
+ component.value = template.value.component;
+ }
};
const createExternalBug = async () => {
@@ -847,6 +1028,59 @@ export default defineComponent({
}
};
+ const createOrUpdateBugzillabugTemplate = async () => {
+ bugzillaTemplateFieldErrors.value = {};
+ bugZillaTemplateError.value = null;
+
+ if (!template.value.name) {
+ bugzillaTemplateFieldErrors.value.name = true;
+ }
+
+ if (!product.value) {
+ bugzillaTemplateFieldErrors.value.product = true;
+ }
+
+ if (!component.value) {
+ bugzillaTemplateFieldErrors.value.component = true;
+ }
+
+ if (!template.value.version) {
+ bugzillaTemplateFieldErrors.value.version = true;
+ }
+
+ if (Object.keys(bugzillaTemplateFieldErrors.value).length) {
+ formElement.value.scrollIntoView({ behavior: "smooth" });
+ } else {
+ const payload = {
+ ...template.value,
+ product: product.value,
+ component: component.value,
+ op_sys: opSys.value,
+ platform: platform.value,
+ mode: "bug",
+ };
+
+ // let responseStatus;
+ try {
+ // form data payload
+ const formData = new FormData();
+ Object.keys(payload).forEach((key) => {
+ formData.append(key, payload[key]);
+ });
+
+ if (props.templateId) {
+ await api.updateBugzillaBugTemplate(props.templateId, formData);
+ } else {
+ await api.createBugzillaBugTemplate(formData);
+ }
+
+ window.location.href = "/crashmanager/bugzilla/templates";
+ } catch (error) {
+ bugZillaTemplateError.value = errorParser(error?.message);
+ }
+ }
+ };
+
const publishAttachments = async () => {
let payload = {};
// Publish Crash data
@@ -947,12 +1181,22 @@ export default defineComponent({
);
provider.value = providers.value.find((p) => p.id === props.providerId);
selectedProvider.value = provider.value.id;
- data = await api.listTemplates();
- templates.value = data.results.filter((t) => t.mode === "bug");
- template.value = templates.value.find((t) => t.id === props.templateId);
- if (template.value) {
- selectedTemplate.value = template.value.id;
- updateFields();
+
+ // Prevent updating the template value when on the "Bug Template Creation" page
+ if (props.templateId !== null) {
+ data = await api.listTemplates(props.templateId);
+
+ if (!data.results) {
+ data.results = [data];
+ }
+
+ templates.value = data.results.filter((t) => t.mode === "bug");
+ template.value = templates.value.find((t) => t.id === props.templateId);
+
+ if (template.value) {
+ selectedTemplate.value = template.value.id;
+ updateFields();
+ }
}
};
@@ -988,8 +1232,12 @@ export default defineComponent({
renderedWhiteboard,
renderedKeywords,
renderedAttrs,
+ bugZillaTemplateError,
+ bugzillaTemplateFieldErrors,
+ formElement,
goBack,
createExternalBug,
+ createOrUpdateBugzillabugTemplate,
};
},
});
diff --git a/server/frontend/src/router.js b/server/frontend/src/router.js
index fefd2f2c..cc14a284 100644
--- a/server/frontend/src/router.js
+++ b/server/frontend/src/router.js
@@ -8,6 +8,7 @@ import CovManagerSummary from "./components/Covmanager/Summary.vue";
import CrashesList from "./components/Crashes/List.vue";
import PoolView from "./components/Pools/View.vue";
import SignaturesList from "./components/Signatures/List.vue";
+import BugPublicationForm from "./components/Bugs/PublicationForm.vue";
const routes = [
{
@@ -22,6 +23,12 @@ const routes = [
name: "crashes-watch",
component: CrashesList,
},
+ {
+ // Be careful to keep this route up-to-date with the one in server/crashmanager/urls.py
+ path: "/crashmanager/crashes/:id/createbug/",
+ name: "crashes-createbug",
+ component: BugPublicationForm,
+ },
{
// Be careful to keep this route up-to-date with the one in server/crashmanager/urls.py
path: "/crashmanager/signatures/",