From 570f549cf44d2553fbd02750fa5c2eabeba56f23 Mon Sep 17 00:00:00 2001 From: Alex Corey Date: Mon, 27 Jan 2020 09:27:27 -0500 Subject: [PATCH 1/2] Allows user to generate a label on the JTForm --- .../MultiSelect/useSyncedSelectValue.js | 6 +++++- .../src/screens/Template/shared/LabelSelect.jsx | 15 ++++++++++++++- .../screens/Template/shared/LabelSelect.test.jsx | 16 ++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/awx/ui_next/src/components/MultiSelect/useSyncedSelectValue.js b/awx/ui_next/src/components/MultiSelect/useSyncedSelectValue.js index 2512ebe265..54c4915ccf 100644 --- a/awx/ui_next/src/components/MultiSelect/useSyncedSelectValue.js +++ b/awx/ui_next/src/components/MultiSelect/useSyncedSelectValue.js @@ -1,4 +1,7 @@ -import { useState, useEffect } from 'react'; +import { + useState, + useEffect +} from 'react'; /* Hook for using PatternFly's { + if (typeof item === 'string') { + item = { id: item, name: item }; + } + onSelect(e, item); + }} onClear={() => onChange([])} onFilter={event => { const str = event.target.value.toLowerCase(); const matches = options.filter(o => o.name.toLowerCase().includes(str)); return renderOptions(matches); }} + isCreatable + onCreateOption={label => { + label = label.trim(); + if (!options.includes(label)) { + setOptions(options.concat({ name: label, id: label })); + } + return label; + }} selections={selections} isExpanded={isExpanded} ariaLabelledBy="label-select" diff --git a/awx/ui_next/src/screens/Template/shared/LabelSelect.test.jsx b/awx/ui_next/src/screens/Template/shared/LabelSelect.test.jsx index 88a76ae570..dda07d8e99 100644 --- a/awx/ui_next/src/screens/Template/shared/LabelSelect.test.jsx +++ b/awx/ui_next/src/screens/Template/shared/LabelSelect.test.jsx @@ -56,4 +56,20 @@ describe('', () => { const selectOptions = wrapper.find('SelectOption'); expect(selectOptions).toHaveLength(4); }); + test('Generate a label ', async () => { + let wrapper; + const onChange = jest.fn(); + LabelsAPI.read.mockReturnValueOnce({ + data: { + options, + }, + }); + await act(async () => { + wrapper = mount( + {}} onChange={onChange} /> + ); + }); + await wrapper.find('Select').invoke('onSelect')({}, 'foo'); + expect(onChange).toBeCalledWith([{ id: 'foo', name: 'foo' }]); + }); }); From d69174b1a6c2958c681bb1b6972903f0d1c6fddb Mon Sep 17 00:00:00 2001 From: Alex Corey Date: Mon, 27 Jan 2020 09:50:49 -0500 Subject: [PATCH 2/2] Removes unnecessary and dead code. Generate Label was not being called so I removed it in favor of associate label. Plus: less code in JT Add and JT Edit and can remove a promise. Minus: Now when we generate/associate a label we always send a long the orgId. OrgId is not necessary when associating a label. --- awx/ui_next/src/api/models/JobTemplates.js | 23 +++++++++---------- .../MultiSelect/useSyncedSelectValue.js | 6 +---- .../JobTemplateAdd/JobTemplateAdd.jsx | 14 ++++------- .../JobTemplateEdit/JobTemplateEdit.jsx | 12 +++------- .../JobTemplateEdit/JobTemplateEdit.test.jsx | 7 +++--- 5 files changed, 22 insertions(+), 40 deletions(-) diff --git a/awx/ui_next/src/api/models/JobTemplates.js b/awx/ui_next/src/api/models/JobTemplates.js index cec450ce0d..58060371df 100644 --- a/awx/ui_next/src/api/models/JobTemplates.js +++ b/awx/ui_next/src/api/models/JobTemplates.js @@ -13,7 +13,6 @@ class JobTemplates extends InstanceGroupsMixin(NotificationsMixin(Base)) { this.disassociateLabel = this.disassociateLabel.bind(this); this.readCredentials = this.readCredentials.bind(this); this.readAccessList = this.readAccessList.bind(this); - this.generateLabel = this.generateLabel.bind(this); } launch(id, data) { @@ -24,8 +23,11 @@ class JobTemplates extends InstanceGroupsMixin(NotificationsMixin(Base)) { return this.http.get(`${this.baseUrl}${id}/launch/`); } - associateLabel(id, label) { - return this.http.post(`${this.baseUrl}${id}/labels/`, label); + associateLabel(id, label, orgId) { + return this.http.post(`${this.baseUrl}${id}/labels/`, { + name: label.name, + organization: orgId, + }); } disassociateLabel(id, label) { @@ -35,15 +37,10 @@ class JobTemplates extends InstanceGroupsMixin(NotificationsMixin(Base)) { }); } - generateLabel(id, label, orgId) { - return this.http.post(`${this.baseUrl}${id}/labels/`, { - name: label.name, - organization: orgId, - }); - } - readCredentials(id, params) { - return this.http.get(`${this.baseUrl}${id}/credentials/`, { params }); + return this.http.get(`${this.baseUrl}${id}/credentials/`, { + params, + }); } associateCredentials(id, credentialId) { @@ -60,7 +57,9 @@ class JobTemplates extends InstanceGroupsMixin(NotificationsMixin(Base)) { } readAccessList(id, params) { - return this.http.get(`${this.baseUrl}${id}/access_list/`, { params }); + return this.http.get(`${this.baseUrl}${id}/access_list/`, { + params, + }); } } diff --git a/awx/ui_next/src/components/MultiSelect/useSyncedSelectValue.js b/awx/ui_next/src/components/MultiSelect/useSyncedSelectValue.js index 54c4915ccf..2512ebe265 100644 --- a/awx/ui_next/src/components/MultiSelect/useSyncedSelectValue.js +++ b/awx/ui_next/src/components/MultiSelect/useSyncedSelectValue.js @@ -1,7 +1,4 @@ -import { - useState, - useEffect -} from 'react'; +import { useState, useEffect } from 'react'; /* Hook for using PatternFly's