|
1 | 1 | import $ from 'jquery';
|
2 | 2 | import {stripTags} from '../utils.js';
|
3 | 3 | import {hideElem, showElem} from '../utils/dom.js';
|
| 4 | +import {POST} from '../modules/fetch.js'; |
4 | 5 |
|
5 |
| -const {appSubUrl, csrfToken} = window.config; |
| 6 | +const {appSubUrl} = window.config; |
6 | 7 |
|
7 | 8 | export function initRepoTopicBar() {
|
8 | 9 | const mgrBtn = $('#manage_topic');
|
@@ -30,50 +31,50 @@ export function initRepoTopicBar() {
|
30 | 31 | mgrBtn.focus();
|
31 | 32 | });
|
32 | 33 |
|
33 |
| - saveBtn.on('click', () => { |
| 34 | + saveBtn.on('click', async () => { |
34 | 35 | const topics = $('input[name=topics]').val();
|
35 | 36 |
|
36 |
| - $.post(saveBtn.attr('data-link'), { |
37 |
| - _csrf: csrfToken, |
38 |
| - topics |
39 |
| - }, (_data, _textStatus, xhr) => { |
40 |
| - if (xhr.responseJSON.status === 'ok') { |
| 37 | + const data = new FormData(); |
| 38 | + data.append('topics', topics); |
| 39 | + |
| 40 | + const response = await POST(saveBtn.attr('data-link'), {data}); |
| 41 | + |
| 42 | + if (response.ok) { |
| 43 | + const responseData = await response.json(); |
| 44 | + if (responseData.status === 'ok') { |
41 | 45 | viewDiv.children('.topic').remove();
|
42 | 46 | if (topics.length) {
|
43 | 47 | const topicArray = topics.split(',');
|
44 | 48 | topicArray.sort();
|
45 |
| - for (let i = 0; i < topicArray.length; i++) { |
| 49 | + for (const topic of topicArray) { |
46 | 50 | const link = $('<a class="ui repo-topic large label topic gt-m-0"></a>');
|
47 |
| - link.attr('href', `${appSubUrl}/explore/repos?q=${encodeURIComponent(topicArray[i])}&topic=1`); |
48 |
| - link.text(topicArray[i]); |
| 51 | + link.attr('href', `${appSubUrl}/explore/repos?q=${encodeURIComponent(topic)}&topic=1`); |
| 52 | + link.text(topic); |
49 | 53 | link.insertBefore(mgrBtn); // insert all new topics before manage button
|
50 | 54 | }
|
51 | 55 | }
|
52 | 56 | hideElem(editDiv);
|
53 | 57 | showElem(viewDiv);
|
54 | 58 | }
|
55 |
| - }).fail((xhr) => { |
56 |
| - if (xhr.status === 422) { |
57 |
| - if (xhr.responseJSON.invalidTopics.length > 0) { |
58 |
| - topicPrompts.formatPrompt = xhr.responseJSON.message; |
59 |
| - |
60 |
| - const {invalidTopics} = xhr.responseJSON; |
61 |
| - const topicLabels = topicDropdown.children('a.ui.label'); |
62 |
| - |
63 |
| - for (const [index, value] of topics.split(',').entries()) { |
64 |
| - for (let i = 0; i < invalidTopics.length; i++) { |
65 |
| - if (invalidTopics[i] === value) { |
66 |
| - topicLabels.eq(index).removeClass('green').addClass('red'); |
67 |
| - } |
68 |
| - } |
| 59 | + } else if (response.status === 422) { |
| 60 | + const responseData = await response.json(); |
| 61 | + if (responseData.invalidTopics.length > 0) { |
| 62 | + topicPrompts.formatPrompt = responseData.message; |
| 63 | + |
| 64 | + const {invalidTopics} = responseData; |
| 65 | + const topicLabels = topicDropdown.children('a.ui.label'); |
| 66 | + for (const [index, value] of topics.split(',').entries()) { |
| 67 | + if (invalidTopics.includes(value)) { |
| 68 | + topicLabels.eq(index).removeClass('green').addClass('red'); |
69 | 69 | }
|
70 |
| - } else { |
71 |
| - topicPrompts.countPrompt = xhr.responseJSON.message; |
72 | 70 | }
|
| 71 | + } else { |
| 72 | + topicPrompts.countPrompt = responseData.message; |
73 | 73 | }
|
74 |
| - }).always(() => { |
75 |
| - topicForm.form('validate form'); |
76 |
| - }); |
| 74 | + } |
| 75 | + |
| 76 | + // Always validate the form |
| 77 | + topicForm.form('validate form'); |
77 | 78 | });
|
78 | 79 |
|
79 | 80 | topicDropdown.dropdown({
|
|
0 commit comments