|
|
|
|
@ -6,12 +6,13 @@ |
|
|
|
|
<div class="info__section"> |
|
|
|
|
<div class="courses__item"> |
|
|
|
|
<div class="courses__preview"> |
|
|
|
|
<img class="courses__pic" :src="course.coverImage || defaultCover" width="300px" /> |
|
|
|
|
<img class="courses__pic" name="course-cover" :src="course.coverImage || defaultCover" width="300px" /> |
|
|
|
|
<div class="upload" v-if="! course.coverImage"> |
|
|
|
|
<div class="upload__title">Загрузить превью</div> |
|
|
|
|
<input type="file" class="upload__file" @change="onCoverImageSelected"> |
|
|
|
|
<input type="file" class="upload__file" name="course-cover-upload" @change="onCoverImageSelected"> |
|
|
|
|
</div> |
|
|
|
|
<a href="#" title="Удалить превью" class="course-delete-cover" v-if="course.coverImage" @click="removeCover"> |
|
|
|
|
<a href="#" title="Удалить превью" class="course-delete-cover" v-if="course.coverImage" @click="removeCover" |
|
|
|
|
name="course-cover-delete"> |
|
|
|
|
<svg class="icon icon-delete"> |
|
|
|
|
<use xlink:href="/static/img/sprite.svg#icon-delete"></use> |
|
|
|
|
</svg> |
|
|
|
|
@ -20,13 +21,13 @@ |
|
|
|
|
<div class="courses__details"> |
|
|
|
|
<div class="field-category courses__theme theme field info__field--light" v-if="!live" v-bind:class="{ error: (!$v.live && $v.course.category.$dirty || showErrors) && $v.course.category.$invalid }"> |
|
|
|
|
<lil-select :value.sync="course.category" :options="categoryOptions" |
|
|
|
|
placeholder="Выберите категорию"/> |
|
|
|
|
placeholder="Выберите категорию" name="course-category"/> |
|
|
|
|
</div> |
|
|
|
|
<div class="courses__old-price" v-if="course.is_paid && course.old_price"><s>{{ course.old_price }}₽</s></div> |
|
|
|
|
<div class="courses__price" v-if="course.is_paid && course.price">{{ course.price }}₽</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="courses__title field field" v-bind:class="{ error: ($v.course.title.$dirty || showErrors) && $v.course.title.$invalid }"> |
|
|
|
|
<textarea class="field__textarea" |
|
|
|
|
<textarea class="field__textarea" name="course-title" |
|
|
|
|
rows="1" |
|
|
|
|
:title="titles.courseTitle" |
|
|
|
|
v-autosize="course.title" |
|
|
|
|
@ -34,7 +35,7 @@ |
|
|
|
|
v-model="course.title" |
|
|
|
|
placeholder="Добавить заголовок"></textarea> |
|
|
|
|
</div> |
|
|
|
|
<div class="courses__content field" style="width: 300px;" |
|
|
|
|
<div class="courses__content field" style="width: 300px;" name="course-short-description" |
|
|
|
|
v-bind:class="{ error: ($v.course.short_description.$dirty || showErrors) && $v.course.short_description.$invalid }"> |
|
|
|
|
<vue-redactor :value.sync="course.short_description" placeholder="Добавить краткое описание"/> |
|
|
|
|
</div> |
|
|
|
|
@ -46,7 +47,7 @@ |
|
|
|
|
<div v-if="!live" class="info__field field"> |
|
|
|
|
<div class="field__label field__label_gray">ССЫЛКА</div> |
|
|
|
|
<div class="field__wrap"> |
|
|
|
|
<input type="text" class="field__input" v-model="course.slug" @input="slugChanged = true"> |
|
|
|
|
<input type="text" class="field__input" name="course-slug" v-model="course.slug" @input="slugChanged = true"> |
|
|
|
|
</div> |
|
|
|
|
<div class="field__wrap field__wrap--additional">{{ courseFullUrl }}</div> |
|
|
|
|
</div> |
|
|
|
|
@ -55,7 +56,7 @@ |
|
|
|
|
v-bind:class="{ error: ($v.course.stream.$dirty || showErrors) && $v.course.stream.$invalid }"> |
|
|
|
|
<div class="field__label field__label_gray">ССЫЛКА НА VIMEO</div> |
|
|
|
|
<div class="field__wrap"> |
|
|
|
|
<input type="text" class="field__input" v-model="course.stream"> |
|
|
|
|
<input type="text" name="course-stream" class="field__input" v-model="course.stream"> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
@ -71,8 +72,8 @@ |
|
|
|
|
v-bind:class="{ error: ($v.course.duration.$dirty || showErrors) && $v.course.duration.$invalid }"> |
|
|
|
|
<div class="field__label field__label_gray">ПРОДОЛЖИТЕЛЬНОСТЬ</div> |
|
|
|
|
<div class="field__wrap field__wrap__appended"> |
|
|
|
|
<input type="text" class="field__input field__input__appended" v-model.number="course.duration" |
|
|
|
|
@input="$v.course.duration.$touch()"> |
|
|
|
|
<input type="text" class="field__input field__input__appended" name="course-duration" |
|
|
|
|
v-model.number="course.duration" @input="$v.course.duration.$touch()"> |
|
|
|
|
<button disabled class="field__append">{{pluralize(course.duration, ['день', 'дня', 'дней'])}}</button> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
@ -81,12 +82,14 @@ |
|
|
|
|
<div class="field__label field__label_gray">ДОСТУП</div> |
|
|
|
|
<div class="field__wrap"> |
|
|
|
|
<label class="field__switch switch switch_lg switch_circle"> |
|
|
|
|
<input type="radio" :value="false" class="switch__input" v-model="course.is_paid"> |
|
|
|
|
<span class="switch__content">Бесплатный</span> |
|
|
|
|
<input type="radio" :value="false" class="switch__input" v-model="course.is_paid" |
|
|
|
|
name="course-is-paid-input"> |
|
|
|
|
<span class="switch__content" name="course-is-paid-no">Бесплатный</span> |
|
|
|
|
</label> |
|
|
|
|
<label class="field__switch switch switch_lg switch_circle"> |
|
|
|
|
<input type="radio" :value="true" class="switch__input" v-model="course.is_paid"> |
|
|
|
|
<span class="switch__content">Платный</span> |
|
|
|
|
<input type="radio" :value="true" class="switch__input" v-model="course.is_paid" |
|
|
|
|
name="course-is-paid-input"> |
|
|
|
|
<span class="switch__content" name="course-is-paid-yes">Платный</span> |
|
|
|
|
</label> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
@ -94,27 +97,29 @@ |
|
|
|
|
<div v-if="course.is_paid" class="info__field field"> |
|
|
|
|
<div class="field__label field__label_gray">СТОИМОСТЬ</div> |
|
|
|
|
<div class="field__wrap field__wrap__appended field__wrap__100px"> |
|
|
|
|
<input type="text" class="field__input field__input__appended" v-model.number.lazy="displayPrice"> |
|
|
|
|
<input type="text" class="field__input field__input__appended" v-model.number.lazy="displayPrice" |
|
|
|
|
name="course-price"> |
|
|
|
|
<button disabled class="field__append">руб.</button> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div v-if="course.is_paid" class="info__field field"> |
|
|
|
|
<div class="field__label field__label_gray">СТОИМОСТЬ БЕЗ СКИДКИ</div> |
|
|
|
|
<div class="field__wrap field__wrap__appended field__wrap__100px"> |
|
|
|
|
<input type="text" class="field__input field__input__appended" v-model.number.lazy="displayOldPrice"> |
|
|
|
|
<input type="text" class="field__input field__input__appended" v-model.number.lazy="displayOldPrice" |
|
|
|
|
name="course-old-price"> |
|
|
|
|
<button disabled class="field__append">руб.</button> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div v-if="!live" class="info__field field"> |
|
|
|
|
<div class="field__label field__label_gray">ВОЗРАСТ</div> |
|
|
|
|
<div class="field__wrap"> |
|
|
|
|
<lil-select :value.sync="course.age" :options="ages" value-key="value" |
|
|
|
|
<lil-select :value.sync="course.age" :options="ages" value-key="value" name="course-age" |
|
|
|
|
placeholder="Выберите возраст"/> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<label v-if="me && !live && me.role === ROLE_ADMIN" class="info__switch switch switch_lg"> |
|
|
|
|
<input type="checkbox" class="switch__input" v-model="course.is_featured"> |
|
|
|
|
<span class="switch__content">Выделить</span> |
|
|
|
|
<span class="switch__content" name="course-is-featured">Выделить</span> |
|
|
|
|
</label> |
|
|
|
|
</div> |
|
|
|
|
<div v-if="!live" class="info__fieldset"> |
|
|
|
|
@ -122,12 +127,14 @@ |
|
|
|
|
<div class="field__label field__label_gray">ЗАПУСК</div> |
|
|
|
|
<div class="field__wrap"> |
|
|
|
|
<label class="field__switch switch switch_lg switch_circle"> |
|
|
|
|
<input type="radio" :value="false" class="switch__input" v-model="course.is_deferred"> |
|
|
|
|
<span class="switch__content">Мгновенный</span> |
|
|
|
|
<input type="radio" :value="false" class="switch__input" v-model="course.is_deferred" |
|
|
|
|
name="course-is-deferred-input"> |
|
|
|
|
<span class="switch__content" name="course-is-deferred-no">Мгновенный</span> |
|
|
|
|
</label> |
|
|
|
|
<label class="field__switch switch switch_lg switch_circle"> |
|
|
|
|
<input type="radio" :value="true" class="switch__input" v-model="course.is_deferred"> |
|
|
|
|
<span class="switch__content">Отложенный</span> |
|
|
|
|
<input type="radio" :value="true" class="switch__input" v-model="course.is_deferred" |
|
|
|
|
name="course-is-deferred-input"> |
|
|
|
|
<span class="switch__content" name="course-is-deferred-yes">Отложенный</span> |
|
|
|
|
</label> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
@ -135,13 +142,15 @@ |
|
|
|
|
<div class="info__field field"> |
|
|
|
|
<div class="field__label">ДАТА</div> |
|
|
|
|
<div class="field__wrap"> |
|
|
|
|
<vue-datepicker :disabled="disabledDates" input-class="field__input" v-model="course.date" language="ru" format="dd/MM/yyyy"/> |
|
|
|
|
<vue-datepicker :disabled="disabledDates" input-class="field__input" name="course-date" |
|
|
|
|
v-model="course.date" language="ru" format="dd/MM/yyyy"/> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="field-time info__field field"> |
|
|
|
|
<div class="field__label">ВРЕМЯ</div> |
|
|
|
|
<div class="field__wrap"> |
|
|
|
|
<lil-select :value.sync="course.time" value-key="value" :options="timeOptions" placeholder="Выберите время"/> |
|
|
|
|
<lil-select :value.sync="course.time" value-key="value" :options="timeOptions" name="course-time" |
|
|
|
|
placeholder="Выберите время"/> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
@ -153,12 +162,12 @@ |
|
|
|
|
<div class="section__center center"> |
|
|
|
|
<div class="kit" style="margin: 0 auto;"> |
|
|
|
|
<div v-if="!live" id="course-redactor__nav" class="kit__nav"> |
|
|
|
|
<button class="kit__btn btn btn_lg" |
|
|
|
|
<button class="kit__btn btn btn_lg" name="course-content-btn" |
|
|
|
|
v-bind:class="{ 'btn_stroke': viewSection === 'course', 'btn_gray': viewSection !== 'course' }" |
|
|
|
|
type="button" @click="showCourse">Описание |
|
|
|
|
курса |
|
|
|
|
</button> |
|
|
|
|
<button class="kit__btn btn btn_lg" |
|
|
|
|
<button class="kit__btn btn btn_lg" name="course-lessons-btn" |
|
|
|
|
v-bind:class="{ 'btn_stroke': viewSection === 'lessons', 'btn_gray': viewSection !== 'lessons' }" |
|
|
|
|
type="button" |
|
|
|
|
@click="showLessons" |
|
|
|
|
@ -167,7 +176,7 @@ |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
<div v-if="viewSection === 'course'" class="kit__body"> |
|
|
|
|
<block-content :content.sync="course.content"></block-content> |
|
|
|
|
<block-content :content.sync="course.content" name="course-content"></block-content> |
|
|
|
|
|
|
|
|
|
<!--<div class="kit__foot"> |
|
|
|
|
<button type="submit" class="kit__submit btn btn_md" v-bind:class="{ loading: courseSaving }"> |
|
|
|
|
@ -178,7 +187,8 @@ |
|
|
|
|
<div v-if="viewSection === 'lessons'" class="kit__body"> |
|
|
|
|
<div class="lessons__title title">Содержание курса</div> |
|
|
|
|
<div v-if="!lessonsLoading" class="lessons__list"> |
|
|
|
|
<vue-draggable v-model="lessons" @start="drag=true" @end="onLessonsChanged" :options="{ handle: '.sortable__handle' }"> |
|
|
|
|
<vue-draggable v-model="lessons" @start="drag=true" @end="onLessonsChanged" name="course-lessons" |
|
|
|
|
:options="{ handle: '.sortable__handle' }"> |
|
|
|
|
<div class="lessons__item" v-for="(lesson, index) in lessons" :key="lesson.id"> |
|
|
|
|
<div class="lessons__actions"> |
|
|
|
|
<button class="sortable__handle" type="button"> |
|
|
|
|
@ -206,7 +216,8 @@ |
|
|
|
|
</div> |
|
|
|
|
<div v-if="lessonsLoading">Загрузка...</div> |
|
|
|
|
<div class="lessons__foot"> |
|
|
|
|
<button type="button" class="lessons__btn btn btn_md" @click="addLesson">СОЗДАТЬ УРОК</button> |
|
|
|
|
<button type="button" class="lessons__btn btn btn_md" @click="addLesson" |
|
|
|
|
name="course-add-lesson">СОЗДАТЬ УРОК</button> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
@ -215,7 +226,7 @@ |
|
|
|
|
</form> |
|
|
|
|
<form v-if="viewSection === 'lessons-edit'" @submit.prevent="onLessonSubmit"> |
|
|
|
|
<lesson-redactor :$v="$v" :lesson.sync="currentLesson" :saving.sync="lessonSaving" :access-token="accessToken" |
|
|
|
|
v-on:back="goToLessons" /> |
|
|
|
|
v-on:back="goToLessons" name="course-lesson-edit" /> |
|
|
|
|
</form> |
|
|
|
|
</div> |
|
|
|
|
<div v-else> |
|
|
|
|
|