@ -6,55 +6,57 @@ import {POST} from '../modules/fetch.js';
const { appSubUrl } = window . config ;
export function initRepoTopicBar ( ) {
const $mgrBtn = $ ( '#manage_topic' ) ;
if ( ! $mgrBtn . length ) return ;
const $editDiv = $ ( '#topic_edit' ) ;
const $viewDiv = $ ( '#repo-topics' ) ;
const $saveBtn = $ ( '#save_topic' ) ;
const $topicDropdown = $ ( '#topic_edit .dropdown' ) ;
const $topicForm = $editDiv ; // the old logic, $editDiv is topicForm
const mgrBtn = document . getElementById ( 'manage_topic' ) ;
if ( ! mgrBtn ) return ;
const editDiv = document . getElementById ( 'topic_edit' ) ;
const viewDiv = document . getElementById ( 'repo-topics' ) ;
const saveBtn = document . getElementById ( 'save_topic' ) ;
const topicDropdown = editDiv . querySelector ( '.dropdown' ) ;
const $topicDropdown = $ ( topicDropdown ) ;
const $topicForm = $ ( editDiv ) ;
const $topicDropdownSearch = $topicDropdown . find ( 'input.search' ) ;
const topicPrompts = {
countPrompt : $ topicDropdown. attr ( 'data-text-count-prompt' ) ,
formatPrompt : $ topicDropdown. attr ( 'data-text-format-prompt' ) ,
countPrompt : topicDropdown . getAttribute ( 'data-text-count-prompt' ) ? ? undefined ,
formatPrompt : topicDropdown . getAttribute ( 'data-text-format-prompt' ) ? ? undefined ,
} ;
$ mgrBtn. on ( 'click' , ( ) => {
hideElem ( $ viewDiv) ;
showElem ( $ editDiv) ;
mgrBtn . addEventListener ( 'click' , ( ) => {
hideElem ( viewDiv ) ;
showElem ( editDiv ) ;
$topicDropdownSearch . trigger ( 'focus' ) ;
} ) ;
$ ( '#cancel_topic_edit' ) . on ( 'click' , ( ) => {
hideElem ( $ editDiv) ;
showElem ( $ viewDiv) ;
$ mgrBtn. trigger ( 'focus' ) ;
hideElem ( editDiv ) ;
showElem ( viewDiv ) ;
mgrBtn . focus ( ) ;
} ) ;
$ saveBtn. on ( 'click' , async ( ) => {
saveBtn . addEventListener ( 'click' , async ( ) => {
const topics = $ ( 'input[name=topics]' ) . val ( ) ;
const data = new FormData ( ) ;
data . append ( 'topics' , topics ) ;
const response = await POST ( $ saveBtn. attr ( 'data-link' ) , { data } ) ;
const response = await POST ( saveBtn . getAttribute ( 'data-link' ) , { data } ) ;
if ( response . ok ) {
const responseData = await response . json ( ) ;
if ( responseData . status === 'ok' ) {
$viewDiv . children ( '.topic' ) . remove ( ) ;
$ ( viewDiv ) . children ( '.topic' ) . remove ( ) ;
if ( topics . length ) {
const topicArray = topics . split ( ',' ) ;
topicArray . sort ( ) ;
for ( const topic of topicArray ) {
const $link = $ ( '<a class="ui repo-topic large label topic tw-m-0"></a>' ) ;
$link . attr ( 'href' , ` ${ appSubUrl } /explore/repos?q= ${ encodeURIComponent ( topic ) } &topic=1 ` ) ;
$link . text ( topic ) ;
$link . insertBefore ( $mgrBtn ) ; // insert all new topics before manage button
const link = document . createElement ( 'a' ) ;
link . classList . add ( 'ui' , 'repo-topic' , 'large' , 'label' , 'topic' , 'tw-m-0' ) ;
link . href = ` ${ appSubUrl } /explore/repos?q= ${ encodeURIComponent ( topic ) } &topic=1 ` ;
link . textContent = topic ;
mgrBtn . parentNode . insertBefore ( link , mgrBtn ) ; // insert all new topics before manage button
}
}
hideElem ( $ editDiv) ;
showElem ( $ viewDiv) ;
hideElem ( editDiv ) ;
showElem ( viewDiv ) ;
}
} else if ( response . status === 422 ) {
const responseData = await response . json ( ) ;
@ -144,14 +146,14 @@ export function initRepoTopicBar() {
} ,
onAdd ( addedValue , _addedText , $addedChoice ) {
addedValue = addedValue . toLowerCase ( ) . trim ( ) ;
$ ( $addedChoice ) . attr ( 'data-value' , addedValue ) ;
$ ( $addedChoice ) . attr ( 'data-text' , addedValue ) ;
$ ( $addedChoice ) [ 0 ] . setAttribute ( 'data-value' , addedValue ) ;
$ ( $addedChoice ) [ 0 ] . setAttribute ( 'data-text' , addedValue ) ;
} ,
} ) ;
$ . fn . form . settings . rules . validateTopic = function ( _values , regExp ) {
const $topics = $topicDropdown . children ( 'a.ui.label' ) ;
const status = $topics . length === 0 || $topics . last ( ) . attr ( 'data-value' ) . match ( regExp ) ;
const status = $topics . length === 0 || $topics . last ( ) [ 0 ] . getAttribute ( 'data-value' ) . match ( regExp ) ;
if ( ! status ) {
$topics . last ( ) . removeClass ( 'green' ) . addClass ( 'red' ) ;
}