/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (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.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is the Bugzilla Testopia System. * * The Initial Developer of the Original Code is Greg Hendricks. * Portions created by Greg Hendricks are Copyright (C) 2006 * Novell. All Rights Reserved. * * Contributor(s): Greg Hendricks * Ryan Hamilton * Daniel Parker */ Testopia.TestPlan.Store = function(params, auto){ params.ctype = 'json'; Testopia.TestPlan.Store.superclass.constructor.call(this, { url: 'tr_list_plans.cgi', listeners: { 'exception': Testopia.Util.loadError }, baseParams: params, totalProperty: 'totalResultsAvailable', root: 'Result', autoLoad: auto, id: 'plan_id', fields: [{ name: "plan_id", mapping: "plan_id" }, { name: "name", mapping: "name" }, { name: "author", mapping: "author_name" }, { name: "creation_date", mapping: "creation_date" }, { name: "product", mapping: "product_name" }, { name: "product_id", mapping: "product_id" }, { name: "prod_version", mapping: "default_product_version" }, { name: "type", mapping: "plan_type" }, { name: "case_count", mapping: "case_count" }, { name: "run_count", mapping: "run_count" }], remoteSort: true }); this.paramNames.sort = "order"; }; Ext.extend(Testopia.TestPlan.Store, Ext.data.JsonStore); Testopia.TestPlan.TypesStore = function(auto){ Testopia.TestPlan.TypesStore.superclass.constructor.call(this, { url: 'tr_quicksearch.cgi', root: 'types', listeners: { 'exception': Testopia.Util.loadError }, baseParams: { action: 'getplantypes' }, autoLoad: auto, id: 'id', fields: [{ name: 'id', mapping: 'id' }, { name: 'name', mapping: 'name' }] }); }; Ext.extend(Testopia.TestPlan.TypesStore, Ext.data.JsonStore); /* * Testopia.TestPlan.TypesCombo */ Testopia.TestPlan.TypesCombo = function(cfg){ Testopia.TestPlan.TypesCombo.superclass.constructor.call(this, { id: cfg.id || 'plan_type_combo', store: cfg.transform ? false : new Testopia.TestPlan.TypesStore(cfg.mode == 'local' ? true : false), loadingText: 'Looking up types...', displayField: 'name', valueField: 'id', typeAhead: true, triggerAction: 'all', minListWidth: 300, forceSelection: true, transform: cfg.transform, emptyText: 'Please select...' }); Ext.apply(this, cfg); this.store.on('load', function(){ if (cfg.value) { this.setValue(cfg.value); } }, this); }; Ext.extend(Testopia.TestPlan.TypesCombo, Ext.form.ComboBox); Testopia.TestPlan.Import = function(params){ var win = new Ext.Window({ id: 'plan_import_win', closable: true, width: 450, height: 150, plain: true, shadow: false, layout: 'fit', items: [{ xtype: 'form', height: 250, url: 'tr_importer.cgi', id: 'importform', baseParams: { action: 'upload', ctype: 'json', plan_id: params.plan_id, product_id: params.product_id }, fileUpload: true, items: [{ height: 50, style: "padding: 5px", border: false, html: params.product_id ? PRODUCT_PLAN_IMPORT : PLAN_CASES_IMPORT }, { xtype: 'field', fieldLabel: 'Upload File', labelStyle: "padding: 5px", inputType: 'file', name: 'data', width: 300 }], buttons: [{ text: 'Submit', handler: function(){ Ext.getCmp('importform').getForm().submit({ success: function(){ if (params.product_id) { Ext.getCmp('object_panel').activate('product_plan_grid'); Ext.getCmp('product_plan_grid').store.load(); } else { Ext.getCmp('object_panel').activate('plan_case_grid'); Ext.getCmp('plan_case_grid').store.load(); } Ext.getCmp('plan_import_win').close(); }, failure: Testopia.Util.error }); } }] }] }); win.show(this); } Testopia.TestPlan.Grid = function(params, cfg){ params.limit = Ext.state.Manager.get('TESTOPIA_DEFAULT_PAGE_SIZE', 25); params.current_tab = 'plan'; this.params = params; var versionbox = new Testopia.Product.VersionCombo({ id: 'plan_grid_version_chooser', hiddenName: 'prod_version', mode: 'remote', params: { product_id: params.product_id }, listeners: { 'startedit': function(){ var pid = Ext.getCmp(cfg.id || 'plan_grid').getSelectionModel().getSelected().get('product_id'); if (versionbox.store.baseParams.product_id != pid) { versionbox.store.baseParams.product_id = pid; versionbox.store.load(); } } } }); this.store = new Testopia.TestPlan.Store(params); var ds = this.store; this.columns = [{ header: "ID", width: 30, dataIndex: 'plan_id', sortable: true, renderer: Testopia.Util.makeLink.createDelegate(this,['plan'],true), hideable: false }, { header: "Name", width: 220, dataIndex: 'name', id: "plan_name", sortable: true, editor: { xtype: 'textfield', allowBlank: false } }, { header: "Author", width: 150, sortable: true, dataIndex: 'author' }, { header: "Created", width: 110, sortable: true, dataIndex: 'creation_date', hidden: true }, { header: "Product", width: 180, sortable: true, dataIndex: 'product', hidden: true }, { header: "Product Version", width: 60, sortable: true, dataIndex: 'prod_version', editor: versionbox, renderer: Testopia.Util.ComboRenderer.createDelegate(this) }, { header: "Type", width: 60, sortable: true, dataIndex: 'type', editor: new Testopia.TestPlan.TypesCombo({ id: 'plan_grid_ types_chooser', hiddenName: 'type', mode: 'remote' }), renderer: Testopia.Util.ComboRenderer.createDelegate(this) }, { header: "Cases", width: 20, sortable: false, dataIndex: 'case_count' }, { header: "Runs", width: 20, sortable: false, dataIndex: 'run_count' }]; this.form = new Ext.form.BasicForm('testopia_helper_frm', {}); this.bbar = new Testopia.Util.PagingBar('plan', this.store); Testopia.TestPlan.Grid.superclass.constructor.call(this, { title: 'Test Plans', id: cfg.id || 'plan_grid', layout: 'fit', region: 'center', stripeRows: true, loadMask: { msg: 'Loading Test Plans...' }, autoExpandColumn: "plan_name", autoScroll: true, plugins: [new Ext.ux.grid.RowEditor({ id:'plan_row_editor', saveText: 'Update' })], sm: new Ext.grid.RowSelectionModel({ singleSelect: cfg.single || false, listeners: { 'rowselect': function(sm, i, r){ if (Ext.getCmp('plan_add_run_mnu')) { Ext.getCmp('plan_add_run_mnu').enable(); } if (Ext.getCmp('plan_add_case_mnu')) { Ext.getCmp('plan_add_case_mnu').enable(); } if (Ext.getCmp('plan_grid_edit_mnu')) { Ext.getCmp('plan_grid_edit_mnu').enable(); } Ext.getCmp('new_run_button').enable(); Ext.getCmp('new_case_button').enable(); Ext.getCmp('edit_plan_list_btn').enable(); if (sm.getCount() > 1) { if (Ext.getCmp('plan_add_run_mnu')) { Ext.getCmp('plan_add_run_mnu').disable(); } Ext.getCmp('new_run_button').disable(); } }, 'rowdeselect': function(sm, i, r){ if (sm.getCount() < 1) { Ext.getCmp('new_run_button').disable(); Ext.getCmp('new_case_button').disable(); Ext.getCmp('edit_plan_list_btn').disable(); } } } }), enableColumnHide: true, tbar: [{ xtype: 'button', text: 'New Run', id: 'new_run_button', disabled: true, handler: this.newRun.createDelegate(this) }, { xtype: 'button', text: 'New Case', id: 'new_case_button', disabled: true, handler: this.newCase.createDelegate(this) }, new Ext.Toolbar.Fill(), { xtype: 'button', id: 'save_plan_list_btn', icon: 'extensions/testopia/img/save.png', iconCls: 'img_button_16x', tooltip: 'Save this search', handler: function(b, e){ Testopia.Search.save('plan', Ext.getCmp(cfg.id || 'plan_grid').store.baseParams); } }, { xtype: 'button', id: 'link_plan_list_btn', icon: 'extensions/testopia/img/link.png', iconCls: 'img_button_16x', tooltip: 'Create a link to this list', handler: function(b, e){ Testopia.Search.LinkPopup(Ext.getCmp(cfg.id || 'plan_grid').store.baseParams); } }, { xtype: 'button', id: 'edit_plan_list_btn', icon: 'extensions/testopia/img/edit.png', iconCls: 'img_button_16x', disabled: true, tooltip: 'Edit Selected Test Plan', handler: function(){ Testopia.Util.editFirstSelection(Ext.getCmp(cfg.id || 'plan_grid')); } }, { xtype: 'button', id: 'new_plan_list_btn', icon: 'extensions/testopia/img/new.png', iconCls: 'img_button_16x', tooltip: 'Create a New Test Plan', handler: function(){ Testopia.TestPlan.NewPlanPopup(params.product_id); } }], viewConfig: { forceFit: true } }); Ext.apply(this, cfg); this.on('rowcontextmenu', this.onContextClick, this); this.on('activate', this.onActivate, this); Ext.getCmp('plan_row_editor').on('afteredit', this.onGridEdit, this); }; Ext.extend(Testopia.TestPlan.Grid, Ext.grid.GridPanel, { onContextClick: function(grid, index, e){ grid.selindex = index; if (!this.menu) { // create context menu on first right click this.menu = new Ext.menu.Menu({ id: 'plan-ctx-menu', enableScrolling: false, items: [{ text: 'Create a New Test Plan', id: 'plan_menu_new_plan', icon: 'extensions/testopia/img/new.png', iconCls: 'img_button_16x', handler: this.newPlan.createDelegate(this) }, { text: 'Add a New Test Run to Selected Plan', id: 'plan_add_run_mnu', handler: this.newRun.createDelegate(this) }, { text: 'Add a New Test Case to Selected Plans', id: 'plan_add_case_mnu', handler: this.newCase.createDelegate(this) }, { text: 'Edit', id: 'plan_grid_edit_mnu', menu: { enableScrolling: false, items: [{ text: 'Type', handler: function(){ var win = new Ext.Window({ title: 'Change Plan Type', id: 'plan_type_win', layout: 'fit', split: true, plain: true, shadow: false, listeners: {'afterlayout':function(){Ext.getCmp('plan_type_win_types_combo').focus('',10)}}, width: 350, height: 150, items: [new Ext.FormPanel({ labelWidth: '40', bodyStyle: 'padding: 5px', items: [new Testopia.TestPlan.TypesCombo({ id: 'plan_type_win_types_combo', fieldLabel: 'Plan Type' })] })], buttons: [{ text: 'Update Type', handler: function(){ var params = { plan_type: Ext.getCmp('plan_type_combo').getValue(), ids: Testopia.Util.getSelectedObjects(grid, 'plan_id') }; Testopia.Util.updateFromList('plan', params, grid); win.close(); } }, { text: 'Cancel', handler: function(){ win.close(); } }] }); win.show(); } }, { text: 'Tags', handler: function(){ Testopia.Tags.update('plan', grid); } }] } }, { text: "Reports", menu: { enableScrolling: false, items: [{ text: 'New Status Report', handler: function(){ Ext.getCmp('object_panel').setActiveTab('dashboardpanel'); var newPortlet = new Ext.ux.Portlet({ title: 'Status Report', closable: true, autoScroll: true, tools: PortalTools }); newPortlet.url = 'tr_run_reports.cgi?type=status&plan_ids=' + Testopia.Util.getSelectedObjects(grid, 'plan_id'); Testopia.Search.dashboard_urls.push(newPortlet.url); Ext.getCmp('dashboard_leftcol').add(newPortlet); Ext.getCmp('dashboard_leftcol').doLayout(); newPortlet.load({ url: newPortlet.url }); } }, { text: 'New Completion Report', handler: function(){ Ext.getCmp('object_panel').setActiveTab('dashboardpanel'); var newPortlet = new Ext.ux.Portlet({ title: 'Completion Report', closable: true, autoScroll: true, tools: PortalTools }); newPortlet.url = 'tr_run_reports.cgi?type=completion&plan_ids=' + Testopia.Util.getSelectedObjects(grid, 'plan_id'); Testopia.Search.dashboard_urls.push(newPortlet.url); Ext.getCmp('dashboard_leftcol').add(newPortlet); Ext.getCmp('dashboard_leftcol').doLayout(); newPortlet.load({ url: newPortlet.url }); } }, { text: 'New Run Execution Report', handler: function(){ var win = new Ext.Window({ title: 'Select a date range', id: 'plan_execution_win', layout: 'fit', split: true, plain: true, shadow: false, width: 350, height: 150, items: [new Ext.FormPanel({ labelWidth: '40', bodyStyle: 'padding: 5px', items: [{ xtype: 'datefield', id: 'execution_start_date', fieldLabel: 'Start Date', name: 'chfieldfrom' }, { xtype: 'datefield', fieldLabel: 'Stop Date', id: 'execution_stop_date', emptyText: 'Now', name: 'chfieldto' }] })], buttons: [{ text: 'Submit', handler: function(){ Ext.getCmp('object_panel').setActiveTab('dashboardpanel'); var newPortlet = new Ext.ux.Portlet({ title: 'Execution Report', closable: true, autoScroll: true, tools: PortalTools }); newPortlet.url = 'tr_run_reports.cgi?type=execution&plan_ids=' + Testopia.Util.getSelectedObjects(grid, 'plan_id') + '&chfieldfrom=' + Ext.getCmp('execution_start_date').getValue() + '&chfieldto=' + Ext.getCmp('execution_stop_date').getValue(); Testopia.Search.dashboard_urls.push(newPortlet.url); Ext.getCmp('dashboard_leftcol').add(newPortlet); Ext.getCmp('dashboard_leftcol').doLayout(); newPortlet.load({ url: newPortlet.url }); win.close(); } }, { text: 'Cancel', handler: function(){ win.close(); } }] }); win.show(); } }, { text: 'New Priority Breakdown Report', handler: function(){ Ext.getCmp('object_panel').setActiveTab('dashboardpanel'); var newPortlet = new Ext.ux.Portlet({ title: 'Status Report', closable: true, autoScroll: true, tools: PortalTools }); newPortlet.url = 'tr_run_reports.cgi?type=priority&plan_ids=' + Testopia.Util.getSelectedObjects(grid, 'plan_id'); Testopia.Search.dashboard_urls.push(newPortlet.url); Ext.getCmp('dashboard_leftcol').add(newPortlet); Ext.getCmp('dashboard_leftcol').doLayout(); newPortlet.load({ url: newPortlet.url }); } }, { text: 'New Bug Report', handler: function(){ Ext.getCmp('object_panel').setActiveTab('dashboardpanel'); var newPortlet = new Ext.ux.Portlet({ title: 'Bug Report', closable: true, autoScroll: true, tools: PortalTools }); newPortlet.url = 'tr_run_reports.cgi?type=bug_grid&plan_ids=' + Testopia.Util.getSelectedObjects(grid, 'plan_id') + '&noheader=1'; Testopia.Search.dashboard_urls.push(newPortlet.url); Ext.getCmp('dashboard_leftcol').add(newPortlet); Ext.getCmp('dashboard_leftcol').doLayout(); newPortlet.load({ scripts: true, url: newPortlet.url }); } }, { text: 'Worst Offender Report', handler: function(){ Ext.getCmp('object_panel').setActiveTab('dashboardpanel'); var newPortlet = new Ext.ux.Portlet({ title: 'Worst Offender Report', closable: true, autoScroll: true, tools: PortalTools }); newPortlet.url = 'tr_run_reports.cgi?type=worst&plan_ids=' + Testopia.Util.getSelectedObjects(grid, 'plan_id') + '&noheader=1'; Testopia.Search.dashboard_urls.push(newPortlet.url); Ext.getCmp('dashboard_leftcol').add(newPortlet); Ext.getCmp('dashboard_leftcol').doLayout(); newPortlet.load({ scripts: true, url: newPortlet.url }); } }, { text: 'Missing Cases Report', handler: function(){ window.open('tr_list_cases.cgi?report_type=missing&plan_ids=' + Testopia.Util.getSelectedObjects(grid, 'plan_id')); } }, { text: 'Case Roll-up Report', handler: function(){ window.open('tr_list_caseruns.cgi?report_type=rollup&plan_ids=' + Testopia.Util.getSelectedObjects(grid, 'plan_id')); } }] } }, { text: 'Refresh List', icon: 'extensions/testopia/img/refresh.png', iconCls: 'img_button_16x', handler: function(){ grid.store.reload(); } }, { text: 'View Test Plan(s) in a New Tab', handler: function(){ var plan_ids = Testopia.Util.getSelectedObjects(grid, 'plan_id').split(','); var i; for (i = 0; i < plan_ids.length; i += 1) { window.open('tr_show_plan.cgi?plan_id=' + plan_ids[i]); } } },{ text: 'Export', menu: [{ text: 'Test Results as CSV', handler: function(){ window.location = 'tr_list_caseruns.cgi?ctype=csv&viewall=1&plan_id=' + Testopia.Util.getSelectedObjects(grid, 'plan_id'); } },{ text: 'Cases as CSV', handler: function(){ window.location='tr_list_cases.cgi?ctype=csv&viewall=1&plan_id=' + Testopia.Util.getSelectedObjects(grid, 'plan_id'); } },{ text: 'Plans as XML', handler: function(){ window.location='tr_list_plans.cgi?ctype=xml&viewall=1&plan_id=' + Testopia.Util.getSelectedObjects(grid, 'plan_id'); } }] }] }); } e.stopEvent(); if (grid.getSelectionModel().getCount() < 1) { grid.getSelectionModel().selectRow(index); } this.menu.showAt(e.getXY()); }, newPlan: function(){ Testopia.TestPlan.NewPlanPopup(this.params.product_id); }, newRun: function(){ Testopia.TestRun.NewRunPopup(this.getSelectionModel().getSelected()); }, newCase: function(){ Testopia.TestCase.NewCasePopup(Testopia.Util.getSelectedObjects(this, 'plan_id'), this.getSelectionModel().getSelected().get('product_id')); }, onGridEdit: function(e){ var ds = this.store; var myparams = e.record.data; myparams.action = 'edit'; this.form.submit({ url: "tr_process_plan.cgi", params: myparams, success: function(f, a){ ds.commitChanges(); }, failure: function(f, a){ Testopia.Util.error(f, a); ds.rejectChanges(); } }); }, onActivate: function(event){ if (!this.store.getCount()) { this.store.load(); } } }); Testopia.TestPlan.NewPlanForm = function(product_id){ var versionsBox = new Testopia.Product.VersionCombo({ id: 'new_plan_form_version_chooser', hiddenName: 'prod_version', fieldLabel: "Product Version", mode: 'local', params: { product_id: product_id } }); var productsBox = new Testopia.Product.Combo({ id: 'new_plan_form_product_chooser', hiddenName: 'product_id', fieldLabel: "Product", mode: 'local', value: product_id }); productsBox.on('select', function(c, r, i){ versionsBox.reset(); versionsBox.store.baseParams.product_id = r.get('id'); versionsBox.store.load(); versionsBox.enable(); }); Testopia.TestPlan.NewPlanForm.superclass.constructor.call(this, { url: 'tr_new_plan.cgi', id: 'new_plan_form', baseParams: { action: 'add' }, fileUpload: true, labelAlign: 'top', frame: true, title: 'New Plan', bodyStyle: 'padding:5px 5px 0', width: 800, height: 500, items: [{ layout: 'column', items: [{ columnWidth: 0.5, layout: 'form', items: [{ xtype: 'textfield', fieldLabel: 'Plan Name', id: 'new_plan_name', name: 'plan_name', anchor: '95%', allowBlank: false }, new Testopia.TestPlan.TypesCombo({ id: 'new_plan_form_types_chooser', mode: 'local', hiddenName: 'type', fieldLabel: 'Plan Type' })] }, { columnWidth: 0.5, layout: 'form', items: [productsBox, versionsBox] }] }, { xtype: 'tabpanel', height: 280, activeItem: 0, items: [{ layout: 'fit', title: 'Plan Document', items: [{ id: 'plan_doc', xtype: 'htmleditor', name: 'plandoc' }] }, new Testopia.Attachment.Form()] }], buttons: [{ text: 'Submit', handler: function(){ if (!Ext.getCmp('new_plan_form').getForm().isValid()) { return; } Ext.getCmp('new_plan_form').getForm().submit({ success: function(form, data){ if (data.result.err) { alert('One or more attachments were either too large or were empty. These have been ignored.'); } Ext.Msg.show({ title: 'Plan Created', msg: 'Plan ' + data.result.plan + ' Created. Would you like to go there now?', buttons: Ext.Msg.YESNO, icon: Ext.MessageBox.QUESTION, fn: function(btn){ if (btn == 'yes') { window.location = 'tr_show_plan.cgi?plan_id=' + data.result.plan; } } }); try { Ext.getCmp('newplan-win').close(); } catch (err) { } }, failure: Testopia.Util.error }); } }, { text: 'Cancel', handler: function(){ if (Ext.getCmp('newplan-win')) { Ext.getCmp('newplan-win').close(); } else { window.location = 'tr_show_product.cgi'; } } }] }); }; Ext.extend(Testopia.TestPlan.NewPlanForm, Ext.form.FormPanel); Testopia.TestPlan.NewPlanPopup = function(product_id){ var win = new Ext.Window({ id: 'newplan-win', closable: true, width: 800, height: 550, plain: true, shadow: false, layout: 'fit', items: [new Testopia.TestPlan.NewPlanForm(product_id)] }); win.show(this); }; Testopia.TestPlan.ClonePanel = function(plan){ var pbox = new Testopia.Product.Combo({ id: 'plan_clone_product_chooser', hiddenName: 'product_id', fieldLabel: 'Copy To Product', mode: 'local', width: 550, value: plan.product_id }); var vbox = new Testopia.Product.VersionCombo({ id: 'plan_clone_version_chooser', hiddenName: 'prod_version', fieldLabel: 'Product Version', params: { product_id: plan.product_id }, allowBlank: false }); var bbox = new Testopia.Build.Combo({ fieldLabel: 'Select a Build', id: 'plan_clone_build_chooser', mode: 'local', hiddenName: 'new_run_build', params: { product_id: plan.product_id, activeonly: 1 } }); var ebox = new Testopia.Environment.Combo({ fieldLabel: 'Select an Environment', id: 'plan_clone_environment_chooser', mode: 'local', hiddenName: 'new_run_env', params: { product_id: plan.product_id, isactive: 1 } }); pbox.on('select', function(c, r, i){ vbox.reset(); vbox.store.baseParams.product_id = r.id; Ext.getCmp('plan_clone_build_chooser').store.baseParams.product_id = r.id; Ext.getCmp('plan_clone_environment_chooser').store.baseParams.product_id = r.id; Ext.getCmp('plan_clone_build_chooser').store.load(); Ext.getCmp('plan_clone_environment_chooser').store.load(); if (r.id == plan.product_id) { Ext.getCmp('copy_categories').disable(); } else { Ext.getCmp('copy_categories').enable(); } vbox.store.load(); vbox.enable(); }); function doSubmit(){ var form = this.getForm(); var p = form.getValues(); if (form.isValid()) { form.submit({ success: function(f, a){ Ext.Msg.show({ title: 'Plan Copied', msg: 'Plan ' + a.result.plan_id + ' Created. Would you like to go there now?', buttons: Ext.Msg.YESNO, icon: Ext.MessageBox.QUESTION, fn: function(btn){ if (btn == 'yes') { window.location = 'tr_show_plan.cgi?plan_id=' + a.result.plan_id; } } }); }, failure: Testopia.Util.error }) } } Testopia.TestPlan.ClonePanel.superclass.constructor.call(this, { id: 'plan_clone_panel', url: 'tr_process_plan.cgi', baseParams: { action: 'clone' }, bodyStyle: 'padding: 10px', border: false, autoScroll: true, width: 600, items: [{ layout: 'table', border: false, layoutConfig: { columns: 2, width: '100%' }, items: [{ colspan: 2, layout: 'form', border: false, items: [{ id: 'plan_clone_name', xtype: 'textfield', fieldLabel: 'New Plan Name', name: 'plan_name', allowBlank: false, width: 550 }, pbox, vbox] }, { layout: 'form', border: false, items: [{ xtype: 'checkbox', name: 'copy_attachments', checked: false, boxLabel: 'Copy Plan Attachments', hideLabel: true }, { xtype: 'checkbox', name: 'copy_doc', checked: true, boxLabel: 'Copy Plan Document', hideLabel: true }, { xtype: 'hidden', name: 'plan_id', value: plan.plan_id }] }, { layout: 'form', border: false, items: [{ xtype: 'checkbox', name: 'copy_tags', checked: true, boxLabel: 'Copy Plan Tags', hideLabel: true }, { xtype: 'checkbox', name: 'copy_perms', checked: true, boxLabel: 'Copy Plan Permissions', hideLabel: true }] }, { layout: 'form', border: false, colspan: 2, items: [{ xtype: 'checkbox', name: 'keep_plan_author', checked: false, boxLabel: 'Maintain original author (unchecking will make me the author of the new plan)', hideLabel: true }, { xtype: 'fieldset', autoHeight: true, checkboxToggle: true, checkboxName: 'copy_cases', id: 'copy_cases', title: 'Copy Test Cases', collapsed: true, items: [{ xtype: 'checkbox', id: 'case_copy_plan_ids', name: 'make_copy', boxLabel: 'Create a copy (Unchecking will create a link to selected plans)', hideLabel: true, listeners: { 'check': function(box, checked){ if (checked === true) { Ext.getCmp('copy_cases_keep_author').enable(); Ext.getCmp('copy_cases_keep_tester').enable(); } else { Ext.getCmp('copy_cases_keep_author').disable(); Ext.getCmp('copy_cases_keep_tester').disable(); } } } }, { xtype: 'checkbox', name: 'keep_case_authors', id: 'copy_cases_keep_author', checked: false, disabled: true, boxLabel: 'Maintain original authors (unchecking will make me the author of the copied cases)', hideLabel: true }, { xtype: 'checkbox', id: 'copy_cases_keep_tester', boxLabel: 'Keep Default Tester (unchecking will make you the default tester of copied cases)', hideLabel: true, name: 'keep_tester', checked: true }, { xtype: 'checkbox', name: 'copy_categories', id: 'copy_categories', checked: false, disabled: true, boxLabel: 'Copy Categories to new product (unchecking will place copied cases in the default category for the selected product)', hideLabel: true }] }, { xtype: 'fieldset', autoHeight: true, checkboxToggle: true, checkboxName: 'copy_runs', id: 'copy_runs', title: 'Copy Test Runs', collapsed: true, items: [{ xtype: 'checkbox', name: 'keep_run_managers', checked: false, boxLabel: 'Maintain managers (unchecking will make me the manager of the new runs)', hideLabel: true }, { xtype: 'checkbox', name: 'copy_run_tags', checked: true, boxLabel: 'Copy tags from the old run to the new run', hideLabel: true }, { xtype: 'checkbox', name: 'copy_run_cases', id: 'copy_run_cases_cbox', checked: true, boxLabel: 'Include test cases (unchecking will produce an empty test run)', hideLabel: true }, bbox, ebox] }] }] }], buttons: [{ text: 'Submit', handler: doSubmit.createDelegate(this) }, { text: 'Cancel', handler: function(){ Ext.getCmp('plan-clone-win').close(); } }] }); }; Ext.extend(Testopia.TestPlan.ClonePanel, Ext.form.FormPanel); Testopia.TestPlan.ClonePopup = function(plan){ var win = new Ext.Window({ id: 'plan-clone-win', closable: true, width: 750, title: 'Create a Copy of Plan ' + plan.plan_id, height: 500, plain: true, shadow: false, closable: true, layout: 'fit', items: [new Testopia.TestPlan.ClonePanel(plan)] }); win.show(); };