# ZeenSpeechModal

Компонент ZeenSpeechModal

# Примеры:

Размеры:

ZeenSpeechModal

zeen-speech-modal-padding-top

zeen-speech-modal-padding-horizon

zeen-speech-modal-padding-bottom

zeen-speech-modal-margin-vertical

zeen-speech-modal-title-size

По умолчанию наследуется от main-large-size

zeen-speech-modal-title-weight

zeen-speech-modal-title-line-height

zeen-speech-modal-info-margin-top

zeen-speech-modal-time-size

По умолчанию наследуется от main-size

zeen-speech-modal-time-weight

zeen-speech-modal-time-line-height

zeen-speech-modal-dot-margin-horizon

zeen-speech-modal-dot-size

zeen-speech-modal-dot-radius

zeen-speech-modal-action-margin-top

zeen-speech-modal-speakers-margin-top

zeen-speech-modal-speakers-margin-bottom

zeen-speech-modal-speakers-item-padding

Цвета:

zeen-speech-modal-status-color-hold

По умолчанию наследуется от dark-1

zeen-speech-modal-status-color-done

По умолчанию наследуется от gray-4

zeen-speech-modal-status-color-online

По умолчанию наследуется от main-danger-color

zeen-speech-modal-speakers-color

По умолчанию наследуется от gray-4

zeen-speach-speaker-color

По умолчанию наследуется от gray-4

# props

Название Тип Обязательный По умолчанию Описание
name String + - Название модального окна
speech Object - null Объект со спичем
hall Object - null Объект с залом
userSpeechIds Array - [ ] Массив с id спичей добавленных пользователем в расписание
statusText Object - online: 'Сейчас в эфире', done: 'Завершено', hold: 'Не началось' Объект с текстом для статуса спича
speakersText Object - speaker: 'Спикер', speakers: 'Спикеры' Объект с текстом спикеров в ед. и мн. числе
buttonText Object - done: 'Смотреть запись', online: 'Смотреть', add: 'Добавить в расписание', delete: 'Удалить из расписания' Текст кнопки

# emits

Название Описание
watchSpeech Срабатывает при клике по "Смотреть" передает объект с hall и speech
addToPersonalSchedule Срабатывает при клике по "Добавить в расписание" передает объект с hall и speech
removeFromPersonalSchedule Срабатывает при клике по "Удалить из расписания" передает объект с hall и speech

# slots

Название Описание
top-content доп контент сверху
title title модалки
description description модалки
info info спича
actions кнопки модалки
speakers спикеры
content доп контент

# Source Code - исходный код компонента

<template lang="pug">
ZeenModal.speech__modal(:name='name')
  .speech__content(v-if='speech')
    slot(name='top-content' :speech='speech' :hall='hall')
    slot(name='title' :speech='speech' :hall='hall')
      .speech__title {{speech.title}}
    slot(name='description' :speech='speech' :hall='hall')
    .speech__info
      slot(name='info' :speech='speech' :hall='hall')
        .speech__time {{speech.time_begin}}-{{speech.time_end}}
        span.speech__dot
        span.speech__status(:class='"speech__status_" + speech.status')
          | {{statusText[speech.status]}}
    .speech__action
      slot(name='actions' :speech='speech' :hall='hall')
        ZeenButton.speech__btn.speech__btn_done(
          v-if='speech.status === "done"'
          :disabled='buttonDisabled.done'
          @click='watchSpeech'
        ) {{buttonText[speech.status]}}
        ZeenButton.speech__btn.speech__btn_online(
          v-else-if='speech.status === "online"'
          :disabled='buttonDisabled.online'
          @click='watchSpeech'
        ) {{buttonText[speech.status]}}
        ZeenButton.speech__btn.speech__btn_hold(
          v-else-if='speech.status === "hold" && !isInSchedule'
          :disabled='buttonDisabled.add'
          @click='addToPersonalSchedule'
        ) {{buttonText.add}}
        ZeenButton.speech__btn.speech__btn_hold(
          v-else-if='speech.status === "hold" && isInSchedule'
          :disabled='buttonDisabled.delete'
          @click='removeFromPersonalSchedule'
        ) {{buttonText.delete}}
    slot(name='speakers' :speech='speech' :hall='hall')
      .speech__speakers(v-if='speech.speakers && speech.speakers.length')
        .speech__speakers-title {{speakersWord}}
        .speech__speakers-list
          .speech__speakers-item(v-for='speaker in speech.speakers' :key='speaker.id')
            ZeenSpeakerItem(:speaker='speaker')
    slot(name='content' :speech='speech' :hall='hall')
</template>

<script>
import ZeenButton from '../ZeenButton/ZeenButton'
import ZeenSpeakerItem from '../ZeenSpeakerItem/ZeenSpeakerItem'
import ZeenModal from '../ZeenModal/ZeenModal'

export default {
  name: 'ZeenSpeechModal',
  components: {
    ZeenSpeakerItem,
    ZeenButton,
    ZeenModal,
  },
  props: {
    name: {
      type: String,
      require: true,
    },
    speech: {
      type: Object,
      default: () => {},
    },
    hall: {
      type: Object,
      default: () => {},
    },
    userSpeechIds: {
      type: Array,
      default: () => [],
    },
    statusText: {
      type: Object,
      default() {
        return {
          online: 'Сейчас в эфире',
          done: 'Завершено',
          hold: 'Не началось',
        }
      },
    },
    speakersText: {
      type: Object,
      default() {
        return {
          speaker: 'Спикер',
          speakers: 'Спикеры',
        }
      },
    },
    buttonText: {
      type: Object,
      default() {
        return {
          done: 'Смотреть запись',
          online: 'Смотреть',
          add: 'Добавить в расписание',
          delete: 'Удалить из расписания',
        }
      },
    },
    buttonDisabled: {
      type: Object,
      default() {
        return {
          done: false,
          online: false,
          add: false,
          delete: false,
        }
      },
    },
  },
  methods: {
    watchSpeech() {
      this.$emit('watchSpeech', this.dataForEmit)
    },
    addToPersonalSchedule() {
      this.$emit('addToPersonalSchedule', this.dataForEmit)
    },
    removeFromPersonalSchedule() {
      this.$emit('removeFromPersonalSchedule', this.dataForEmit)
    },
  },
  computed: {
    dataForEmit() {
      return {
        speech: this.speech ?? '',
        hall: this.hall ?? '',
      }
    },
    isInSchedule() {
      return this.userSpeechIds.indexOf(this.speech.id) !== -1
    },
    speakersWord() {
      return this.speech.speakers?.length > 1 ? this.speakersText.speakers : this.speakersText.speaker
    },
  },
}
</script>

<style lang="scss">
@import '../../styles/mixins.scss';

:root {
  /* Размеры */
  --zeen-speech-modal-padding-top: 60px;
  --zeen-speech-modal-padding-horizon: 50px;
  --zeen-speech-modal-padding-bottom: 50px;
  --zeen-speech-modal-margin-vertical: 0;
  --zeen-speech-modal-title-size: var(--main-large-size);
  --zeen-speech-modal-title-weight: 700;
  --zeen-speech-modal-title-line-height: 1.33;
  --zeen-speech-modal-info-margin-top: 30px;
  --zeen-speech-modal-time-size: var(--main-size);
  --zeen-speech-modal-time-weight: 500;
  --zeen-speech-modal-time-line-height: 1.37;
  --zeen-speech-modal-dot-margin-horizon: 10px;
  --zeen-speech-modal-dot-size: 4px;
  --zeen-speech-modal-dot-radius: 50%;
  --zeen-speech-modal-action-margin-top: 20px;
  --zeen-speech-modal-speakers-margin-top: 30px;
  --zeen-speech-modal-speakers-margin-bottom: 10px;
  --zeen-speech-modal-speakers-item-padding: 10px;

  @include phones {
    --zeen-speech-modal-padding-top: 50px;
    --zeen-speech-modal-padding-horizon: 30px;
    --zeen-speech-modal-padding-bottom: 40px;
  }

  /* Цвета */
  --zeen-speech-modal-status-color-hold: var(--dark-1);
  --zeen-speech-modal-status-color-done: var(--gray-4);
  --zeen-speech-modal-status-color-online: var(--main-danger-color);
  --zeen-speech-modal-speakers-color: var(--gray-4);
  --zeen-speach-speaker-color: var(--gray-4);
}
</style>

<style lang="scss" scoped>
@import '../../styles/mixins.scss';

.speech {
  &__modal {
    --modal-padding-top: var(--zeen-speech-modal-padding-top);
    --modal-padding-horizon: var(--zeen-speech-modal-padding-horizon);
    --modal-padding-bottom: var(--zeen-speech-modal-padding-bottom);
    --modal-description-margin-vertical: var(--zeen-speech-modal-margin-vertical);
  }

  &__title {
    font-weight: var(--zeen-speech-modal-title-weight);
    font-size: var(--zeen-speech-modal-title-size);
    line-height: var(--zeen-speech-modal-title-line-height);
  }

  &__info {
    display: flex;
    align-items: center;
    margin-top: var(--zeen-speech-modal-info-margin-top);
  }

  &__time {
    font-weight: var(--zeen-speech-modal-time-weight);
    font-size: var(--zeen-speech-modal-time-size);
    line-height: var(--zeen-speech-modal-time-line-height);
  }

  &__dot {
    margin-left: var(--zeen-speech-modal-dot-margin-horizon);
    margin-right: var(--zeen-speech-modal-dot-margin-horizon);
    width: var(--zeen-speech-modal-dot-size);
    height: var(--zeen-speech-modal-dot-size);
    background: var(--zeen-speech-modal-status-color-hold);
    border-radius: var(--zeen-speech-modal-dot-radius);
  }

  &__status {
    font-weight: var(--zeen-speech-modal-time-weight);
    font-size: var(--zeen-speech-modal-time-size);
    line-height: var(--zeen-speech-modal-time-line-height);
    color: var(--zeen-speech-modal-status-color-done);

    &_online {
      color: var(--zeen-speech-modal-status-color-online);
    }
    &_done {
      color: var(--zeen-speech-modal-status-color-done);
    }
    &_hold {
      color: var(--zeen-speech-modal-status-color-hold);
    }
  }

  &__action {
    margin-top: var(--zeen-speech-modal-action-margin-top);
  }

  &__btn {
    width: 100%;
  }

  &__speakers {
    margin-top: var(--zeen-speech-modal-speakers-margin-top);
  }

  &__speakers-title {
    color: var(--zeen-speech-modal-speakers-color);
    margin-bottom: var(--zeen-speech-modal-speakers-margin-bottom);
    font-weight: var(--zeen-speech-modal-time-weight);
    font-size: var(--zeen-speech-modal-time-size);
    line-height: var(--zeen-speech-modal-time-line-height);
  }

  &__speakers-item {
    padding: var(--zeen-speech-modal-speakers-item-padding) 0;
    --speaker-item-post-color: var(--zeen-speach-speaker-color);
  }
}
</style>