|
|
|
|
@ -119,7 +119,8 @@ |
|
|
|
|
placeholder="Выберите возраст"/> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<label v-if="me && !live && me.role === ROLE_ADMIN" class="info__switch switch switch_lg"> |
|
|
|
|
<label v-if="me && !live && me.role === ROLE_ADMIN" class="info__switch switch switch_lg" |
|
|
|
|
style="margin: 25px 0"> |
|
|
|
|
<input type="checkbox" class="switch__input" v-model="course.is_featured"> |
|
|
|
|
<span class="switch__content" name="course-is-featured">Выделить</span> |
|
|
|
|
</label> |
|
|
|
|
@ -127,13 +128,24 @@ |
|
|
|
|
<div v-if="!live" class="info__field field"> |
|
|
|
|
<div class="field__label field__label_gray">Теги</div> |
|
|
|
|
<div class="field__wrap"> |
|
|
|
|
<!--<vue-tags :active="courseTags" :all="allTags"></vue-tags>--> |
|
|
|
|
<select> |
|
|
|
|
<options v-for="tag in tags" @click="selectTag(tag)">{{ tag.tag }}</options> |
|
|
|
|
</select> |
|
|
|
|
<input type="text" v-model="tagSearchQuery" v-class="{loading: tagsLoading}" /> |
|
|
|
|
<div> |
|
|
|
|
<a v-for="tag in course.tags" class="tag">#{{ tag.tag }}</a> |
|
|
|
|
<div class="autocomplete"> |
|
|
|
|
<input class="autocomplete__query" type="text" v-model="tagSearchQuery" placeholder="добавить тег" |
|
|
|
|
:class="{loading: tagsLoading}" @keyup.enter="addTag" @keyup.down="selectFirstTag" /> |
|
|
|
|
<select ref="tags_options" class="autocomplete__options" multiple="multiple" |
|
|
|
|
v-show="tags.length && tagSearchQuery" style="display: none;"> |
|
|
|
|
<option v-for="tag in tags" :key="tag.id" @click="selectTag(tag)" |
|
|
|
|
@keyup.enter.stop.prevent="selectTag(tag)">{{ tag.tag }}</option> |
|
|
|
|
</select> |
|
|
|
|
</div> |
|
|
|
|
<div style="margin: 0 -5px"> |
|
|
|
|
<a href="#" v-for="tag in course.tags" :key="tag.id" class="tag"> |
|
|
|
|
#{{ tag.tag }} |
|
|
|
|
<span class="tag__remove" @click.prevent="removeTag(tag)"> |
|
|
|
|
<svg class="icon icon-close"> |
|
|
|
|
<use xlink:href="/static/img/sprite.svg#icon-close"></use> |
|
|
|
|
</svg> |
|
|
|
|
</span> |
|
|
|
|
</a> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
@ -280,7 +292,7 @@ |
|
|
|
|
tagsLoading: false, |
|
|
|
|
tagSearchXhr: null, |
|
|
|
|
tagSearchQuery: '', |
|
|
|
|
courseTags: [{id: 1, name: 'tag'}, {id: 2, name: 'tag2'}], |
|
|
|
|
tags: [], |
|
|
|
|
disabledDates: { |
|
|
|
|
to: new Date(new Date().setDate(new Date().getDate() - 1)), |
|
|
|
|
}, |
|
|
|
|
@ -475,17 +487,34 @@ |
|
|
|
|
methods: { |
|
|
|
|
searchTags(){ |
|
|
|
|
this.tagsLoading = true; |
|
|
|
|
this.tagSearchXhr = api.get('tags', {tag: this.tagSearchQuery}).then(response => { |
|
|
|
|
thistagsLoading = false; |
|
|
|
|
this.tags = response.data; |
|
|
|
|
}); |
|
|
|
|
if(this.tagSearchTimeout){ |
|
|
|
|
clearTimeout(this.tagSearchTimeout); |
|
|
|
|
} |
|
|
|
|
this.tagSearchTimeout = setTimeout(() => { |
|
|
|
|
api.getTags({search: this.tagSearchQuery}).then(response => { |
|
|
|
|
this.tagsLoading = false; |
|
|
|
|
const tags = this.course.tags.map(t => t.id); |
|
|
|
|
this.tags = response.data.filter(t => tags.indexOf(t.id) == -1); |
|
|
|
|
}); |
|
|
|
|
}, 500); |
|
|
|
|
}, |
|
|
|
|
selectFirstTag(){ |
|
|
|
|
const $opts = $(this.$refs.tags_options); |
|
|
|
|
$opts.find("option:selected").prop("selected", false); |
|
|
|
|
$opts.find("option:first").prop("selected", "selected"); |
|
|
|
|
$opts.focus(); |
|
|
|
|
}, |
|
|
|
|
selectTag(tag){ |
|
|
|
|
if(this.course.tags.findIndex(t => t.id == tag.id) > -1){ |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
this.course.tags.push(tag); |
|
|
|
|
this.tags = []; |
|
|
|
|
this.tagSearchQuery = ''; |
|
|
|
|
}, |
|
|
|
|
addTag(){ |
|
|
|
|
this.tagsLoading = true; |
|
|
|
|
this.api.post('tags', {tag: this.tagSearchQuery}).then(response => { |
|
|
|
|
api.addTag({tag: this.tagSearchQuery}).then(response => { |
|
|
|
|
this.tagsLoading = false; |
|
|
|
|
this.tagSearchQuery = ''; |
|
|
|
|
this.selectTag(response.data); |
|
|
|
|
@ -1019,6 +1048,13 @@ |
|
|
|
|
this.updateViewSection(window.location, 'load err '+this.courseId) |
|
|
|
|
}) |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
$(window).click(e => { |
|
|
|
|
const cssClass = $(e.target).attr('class'); |
|
|
|
|
if(!cssClass || cssClass.indexOf('autocomplete') == -1){ |
|
|
|
|
this.tags = []; |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
}, |
|
|
|
|
computed: { |
|
|
|
|
displayPrice: { |
|
|
|
|
|