Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quantum-kittens
GitHub Repository: quantum-kittens/platypus
Path: blob/main/frontend/vue/components/Syllabus/SyllabusFormModule.vue
3376 views
<template>
  <section class="syllabus-form-course">
    <bx-btn
      v-if="showCloseButton"
      class="syllabus-form-course__delete"
      kind="ghost"
      @click="removeFormModule(courseId)"
    >
      <Close16 class="syllabus-form-course__delete__icon" />
    </bx-btn>
    <div class="syllabus-form-course__row">
      <bx-input
        :value="course.title"
        class="syllabus-form-course__input-field"
        name="courseTitle"
        placeholder="Enter the section title"
        label-text="Content - Use this section to write in content. You can then add Qiskit chapters that correlate, and add more text below."
        color-scheme="light"
        :required="true"
        @input="updateFormTitle"
      />
    </div>
    <div class="syllabus-form-course__row">
      <ckeditor
        v-model="editorData"
        :editor="editor"
        :config="editorConfig"
        @input="updateFormDescription"
        @ready="onEditorReady(course.description)"
      />
    </div>
    <div class="syllabus-form-course__row">
      <label class="syllabus-form-course__label">
        Chapters - Click to add qiskit chapters you want show in this section.
      </label>
    </div>
    <div class="syllabus-form-course__row syllabus-form-course__units__container">
      <div v-for="course in courseList" :key="course.id">
        <h4 class="syllabus-form-course__units__header">
          {{ course.title }}
        </h4>
        <ColumnFlowGrid class="syllabus-form-course__units__list" :elements="course.sections">
          <template #default="slotProps">
            <bx-checkbox
              :checked="containsUnitID(slotProps.element.uuid)"
              :label-text="slotProps.element.title"
              @bx-checkbox-changed="ev => updateFormModuleUnit(slotProps.element.uuid, ev)"
            />
          </template>
        </ColumnFlowGrid>
      </div>
    </div>
  </section>
</template>

<script lang="ts">
import { defineComponent } from 'vue-demi'
import Close16 from '@carbon/icons-vue/es/close/16'
import BXTextarea from 'carbon-web-components/es/components/textarea/textarea.js'
import BXCheckbox from 'carbon-web-components/es/components/checkbox/checkbox.js'
import ClassicEditor from '@ckeditor/ckeditor5-build-classic'
import CKEditor from '@ckeditor/ckeditor5-vue'
import { getCourseList, Course } from '../../../ts/courses'
import ColumnFlowGrid from '../common/ColumnFlowGrid.vue'
import 'carbon-web-components/es/components/button/button.js'
import 'carbon-web-components/es/components/input/input.js'
import { SyllabusCourse } from '../../../ts/syllabus'

export default defineComponent({
  name: 'SyllabusFormModule',
  components: {
    ColumnFlowGrid,
    Close16,
    ckeditor: CKEditor.component
  },
  props: {
    course: {
      type: Object,
      default: () => ({} as SyllabusCourse),
      required: true
    },
    showCloseButton: {
      type: Boolean,
      default: false,
      required: true
    }
  },
  data () {
    return {
      courseList: [] as Course[],
      editor: ClassicEditor,
      editorData: '<p>this is the editor data</p>',
      editorConfig: {
        toolbar: ['bold', 'italic', 'link', 'undo', 'redo', 'numberedList', 'bulletedList'],
        placeholder: 'Enter content',
        style: {
          height: '400px'
        }
      }
    }
  },
  mounted () {
    getCourseList().then((courses) => {
      this.courseList = courses.filter(course => course.type !== 'docs')
    })
  },
  methods: {
    containsUnitID (uuid: string) {
      return this.course.unitList.includes(uuid)
    },
    updateFormTitle (event: InputEvent) {
      const newData = {
        ...this.course,
        ...{ title: (event.target as BXTextarea).value }
      }

      this.$emit('change', newData)
    },
    updateFormDescription (event: InputEvent) {
      const newData = {
        ...this.course,
        ...{ description: this.editorData }
      }

      this.$emit('change', newData)
    },
    onEditorReady (event: any) {
      this.editorData = event
    },
    updateFormModuleUnit (uuid: string, event: Event) {
      if ((event.target as BXCheckbox).checked) {
        this.course.unitList.push(uuid)
      } else {
        const idx = this.course.unitList.indexOf(uuid)
        if (idx >= 0) {
          this.course.unitList.splice(idx, 1)
        }
      }

      this.$emit('change', this.course)
    },
    removeFormModule () {
      this.$emit('removeModuleAction')
    }
  }
})
</script>

<style lang="scss" scoped>
@import 'carbon-components/scss/globals/scss/typography';
@import '~/../scss/variables/mq.scss';
@import '~/../scss/mixins/mixins.scss';
@import '~/../scss/variables/colors.scss';

$min-editor-height: 10rem;

.syllabus-form-course {
  position: relative;
  margin-top: $spacing-06;
  padding: $spacing-07 $spacing-05;
  margin-bottom: $spacing-05;
  background-color: $background-color-lighter;

  &__delete {
    position: absolute;
    top: 0;
    right: 0;

    &__icon {
      fill: $text-color-dark;
    }
  }

  &__row {
    display: flex;
    padding-right: $spacing-05;
    @include mq($until: medium) {
      flex-direction: column;
    }
  }

  &__input-field {
    margin-bottom: 0;
  }

  &__textarea {
    width: 100%;
    padding-bottom: $spacing-05;
  }

  &__editor {
    width: 100%;
  }

  &__label {
    @include type-style('label-01');
    margin: $spacing-05 0;
  }

  &__units {
    &__container {
      background-color: $white-0;
      padding: $spacing-05;
      margin-bottom: $spacing-05;
      margin-right: $spacing-05;
      flex-direction: column;
      max-height: 16rem;
      overflow-y: scroll;
    }

    &__list {
      margin-bottom: $spacing-05;
      padding: $spacing-05 0;
      gap: $spacing-05 $spacing-10;
    }

    &__header {
      @include type-style('productive-heading-01');
    }
  }

  // CKEditor overrides
  :deep(.ck.ck-editor) {
    width: 100%;

    p, a, ol, ul {
      @include type-style('body-long-01');
    }

    i {
      font-style: italic;
    }

    ol {
      list-style: decimal;
      margin-left: $spacing-05;
    }

    ul {
      list-style: disc;
      margin-left: $spacing-05;
    }
  }

  :deep(.ck-editor__editable) {
    min-height: $min-editor-height;
  }
}
</style>