fix(MdSelect): prevent select from getting a wrong highlight when mounted

<template>
  <md-menu
    class="md-select"
    :class="{ 'md-disabled': disabled }"
    :md-close-on-select="false"
    :md-active.sync="showSelect"
    :md-offset-x="offset.x"
    :md-offset-y="offset.y"
    @md-opened="onOpen"
    @md-closed="onClose">
    <input
      class="md-input md-select-value"
      v-model="MdSelect.label"
      readonly
      v-on="$listeners"
      @focus.prevent="onFocus"
      @click="openSelect"
      @keydown.down="openSelect"
      @keydown.enter="openSelect"
      @keydown.space="openSelect"  />
    <md-drop-down-icon ref="icon" @blur.native="removeHighlight" @click.native="openSelect" />

    <keep-alive>
      <md-menu-content ref="menu" class="md-select-menu" :md-list-class="mdDense && 'md-dense'" :style="menuStyles" :id="uniqueId">
        <slot />
      </md-menu-content>
    </keep-alive>

    <md-input class="md-input-fake" v-model="content" :disabled="disabled" readonly />
    <select readonly v-model="content" v-bind="attributes" :required="required"></select>
  </md-menu>
</template>

<script>
  import raf from 'raf'
  import MdUuid from 'core/utils/MdUuid'
  import MdComponent from 'core/MdComponent'
  import MdDropDownIcon from 'core/icons/MdDropDownIcon'
  import MdMenu from 'components/MdMenu/MdMenu'
  import MdMenuContent from 'components/MdMenu/MdMenuContent'
  import MdInput from '../MdInput/MdInput'
  import MdFieldMixin from '../MdFieldMixin'

  const defaultOffset = {
    x: -15,
    y: -48
  }

  export default {
    name: 'MdSelect',
    components: {
      MdInput,
      MdMenu,
      MdMenuContent,
      MdDropDownIcon
    },
    mixins: [MdFieldMixin],
    props: {
      mdDense: Boolean,
      multiple: Boolean,
      id: String,
      name: String
    },
    inject: ['MdField'],
    data: () => ({
      uniqueId: 'md-select-menu-' + MdUuid(),
      menuStyles: {},
      offset: {
        x: defaultOffset.x,
        y: 0
      },
      showSelect: true,
      didMount: false,
      MdSelect: {
        items: {},
        label: null,
        multiple: false,
        modelValue: null
      }
    }),
    provide () {
      const MdSelect = this.MdSelect

      MdSelect.setValue = this.setValue
      MdSelect.setContent = this.setContent
      MdSelect.setMultipleValue = this.setMultipleValue
      MdSelect.setMultipleContent = this.setMultipleContent
      MdSelect.modelValue = this.content

      return { MdSelect }
    },
    watch: {
      value: {
        immediate: true,
        handler () {
          this.setFieldContent()
        }
      },
      multiple: {
        immediate: true,
        handler (isMultiple) {
          this.MdSelect.multiple = isMultiple
        }
      }
    },
    methods: {
      elHasScroll (el) {
        return el.scrollHeight > el.offsetHeight
      },
      scrollToSelectedOption (el, menu) {
        const top = el.offsetTop
        const elHeight = el.offsetHeight
        const menuHeight = menu.offsetHeight

        menu.scrollTop = top - ((menuHeight - elHeight) / 2)
      },
      async setOffsets (target) {
        await this.$nextTick()

        const menu = document.getElementById(this.uniqueId)

        if (menu) {
          const selected = target || menu.querySelector('.md-selected')

          if (selected) {
            this.scrollToSelectedOption(selected, menu)
            this.offset.y = defaultOffset.y - selected.offsetTop + menu.scrollTop + 8
            this.menuStyles = {
              'transform-origin': `0 ${Math.abs(this.offset.y)}px`
            }
          } else {
            this.offset.y = defaultOffset.y + 1
            this.menuStyles = {}
          }
        }
      },
      onOpen () {
        if (this.didMount) {
          this.setOffsets()
          window.setTimeout(() => {
            this.MdField.focused = true
          }, 10)
        }
      },
      applyHighlight () {
        this.MdField.focused = false
        this.MdField.highlighted = true
        this.$refs.icon.$el.focus()
      },
      onClose () {
        if (this.didMount) {
          this.$refs.icon.$el.setAttribute('tabindex', 1)
          this.applyHighlight()
        }
      },
      onFocus () {
        if (this.didMount) {
          this.applyHighlight()
        }
      },
      removeHighlight () {
        this.MdField.highlighted = false
        this.$refs.icon.$el.removeAttribute('tabindex')
      },
      openSelect () {
        if (!this.disabled) {
          this.showSelect = true
        }
      },
      toggleArrayValue (array, value) {
        if (array.includes(value)) {
          const index = array.indexOf(value)

          array.splice(index, 1)
        } else {
          array.push(value)
        }
      },
      setValue (newValue) {
        this.content = newValue
        this.setFieldValue()
        this.showSelect = false
      },
      setContent (newLabel) {
        this.MdSelect.label = newLabel
      },
      setContentByValue () {
        const textContent = this.MdSelect.items[this.value]

        if (textContent) {
          this.setContent(textContent)
        } else {
          this.setContent('')
        }
      },
      setMultipleValue (value) {
        const newValue = value

        this.toggleArrayValue(this.content, newValue)
        this.setFieldValue()
      },
      setMultipleContentByValue () {
        let content = []

        this.value.forEach(item => {
          const textContent = this.MdSelect.items[item]

          if (textContent) {
            content.push(textContent)
          }
        })

        this.setContent(content.join(', '))
      },
      setFieldContent () {
        if (this.multiple) {
          this.setMultipleContentByValue()
        } else {
          this.setContentByValue()
        }
      }
    },
    async mounted () {
      this.showSelect = false
      this.setFieldContent()

      await this.$nextTick()
      this.didMount = true
    }
  }
</script>

<style lang="scss">
  @import "~components/MdAnimation/variables";

  .md-menu.md-select {
    display: flex;
    flex: 1;

    &:not(.md-disabled) {
      .md-input,
      .md-icon {
        cursor: pointer;
        outline: none;
      }
    }

    .md-input {
      flex: 1;
    }

    select,
    .md-input-fake {
      width: 1px;
      height: 1px;
      margin: -1px;
      padding: 0;
      overflow: hidden;
      position: absolute;
      clip: rect(0 0 0 0);
      border: 0;
    }
  }

  .md-menu-content.md-select-menu {
    width: 100%;

    &.md-menu-content-enter {
      transform: translate3d(0, -8px, 0) scaleY(.3);
    }

    .md-list {
      transition: opacity .3s $md-transition-drop-timing;
    }

    .md-dense .md-ripple.md-list-item-content {
      font-size: 14px;
    }
  }
</style>

<template>
  <md-menu
    class="md-select"
    :class="{ 'md-disabled': disabled }"
    :md-close-on-select="false"
    :md-active.sync="showSelect"
    :md-offset-x="offset.x"
    :md-offset-y="offset.y"
    @md-opened="onOpen"
    @md-closed="onClose">
    <input
      class="md-input md-select-value"
      v-model="MdSelect.label"
      readonly
      v-on="$listeners"
      @focus.prevent="onFocus"
      @click="openSelect"
      @keydown.down="openSelect"
      @keydown.enter="openSelect"
      @keydown.space="openSelect"  />
    <md-drop-down-icon ref="icon" @blur.native="removeHighlight" @click.native="openSelect" />

    <keep-alive>
      <md-menu-content ref="menu" class="md-select-menu" :md-list-class="mdDense && 'md-dense'" :style="menuStyles" :id="uniqueId">
        <slot />
      </md-menu-content>
    </keep-alive>

    <md-input class="md-input-fake" v-model="content" :disabled="disabled" readonly />
    <select readonly v-model="content" v-bind="attributes" :required="required"></select>
  </md-menu>
</template>

<script>
  import raf from 'raf'
  import MdUuid from 'core/utils/MdUuid'
  import MdComponent from 'core/MdComponent'
  import MdDropDownIcon from 'core/icons/MdDropDownIcon'
  import MdMenu from 'components/MdMenu/MdMenu'
  import MdMenuContent from 'components/MdMenu/MdMenuContent'
  import MdInput from '../MdInput/MdInput'
  import MdFieldMixin from '../MdFieldMixin'

  const defaultOffset = {
    x: -15,
    y: -48
  }

  export default {
    name: 'MdSelect',
    components: {
      MdInput,
      MdMenu,
      MdMenuContent,
      MdDropDownIcon
    },
    mixins: [MdFieldMixin],
    props: {
      mdDense: Boolean,
      multiple: Boolean,
      id: String,
      name: String
    },
    inject: ['MdField'],
    data: () => ({
      uniqueId: 'md-select-menu-' + MdUuid(),
      menuStyles: {},
      offset: {
        x: defaultOffset.x,
        y: 0
      },
      showSelect: true,
      didMount: false,
      MdSelect: {
        items: {},
        label: null,
        multiple: false,
        modelValue: null
      }
    }),
    provide () {
      const MdSelect = this.MdSelect

      MdSelect.setValue = this.setValue
      MdSelect.setContent = this.setContent
      MdSelect.setMultipleValue = this.setMultipleValue
      MdSelect.setMultipleContent = this.setMultipleContent
      MdSelect.modelValue = this.content

      return { MdSelect }
    },
    watch: {
      value: {
        immediate: true,
        handler () {
          this.setFieldContent()
        }
      },
      multiple: {
        immediate: true,
        handler (isMultiple) {
          this.MdSelect.multiple = isMultiple
        }
      }
    },
    methods: {
      elHasScroll (el) {
        return el.scrollHeight > el.offsetHeight
      },
      scrollToSelectedOption (el, menu) {
        const top = el.offsetTop
        const elHeight = el.offsetHeight
        const menuHeight = menu.offsetHeight

        menu.scrollTop = top - ((menuHeight - elHeight) / 2)
      },
      async setOffsets (target) {
        await this.$nextTick()

        const menu = document.getElementById(this.uniqueId)

        if (menu) {
          const selected = target || menu.querySelector('.md-selected')

          if (selected) {
            this.scrollToSelectedOption(selected, menu)
            this.offset.y = defaultOffset.y - selected.offsetTop + menu.scrollTop + 8
            this.menuStyles = {
              'transform-origin': `0 ${Math.abs(this.offset.y)}px`
            }
          } else {
            this.offset.y = defaultOffset.y + 1
            this.menuStyles = {}
          }
        }
      },
      onOpen () {
        if (this.didMount) {
          this.setOffsets()
          window.setTimeout(() => {
            this.MdField.focused = true
          }, 10)
        }
      },
      applyHighlight () {
        this.MdField.focused = false
        this.MdField.highlighted = true
        this.$refs.icon.$el.focus()
      },
      onClose () {
        if (this.didMount) {
          this.$refs.icon.$el.setAttribute('tabindex', 1)
          this.applyHighlight()
        }
      },
      onFocus () {
        this.applyHighlight()
      },
      removeHighlight () {
        this.MdField.highlighted = false
        this.$refs.icon.$el.removeAttribute('tabindex')
      },
      openSelect () {
        if (!this.disabled) {
          this.showSelect = true
        }
      },
      toggleArrayValue (array, value) {
        if (array.includes(value)) {
          const index = array.indexOf(value)

          array.splice(index, 1)
        } else {
          array.push(value)
        }
      },
      setValue (newValue) {
        this.content = newValue
        this.setFieldValue()
        this.showSelect = false
      },
      setContent (newLabel) {
        this.MdSelect.label = newLabel
      },
      setContentByValue () {
        const textContent = this.MdSelect.items[this.value]

        if (textContent) {
          this.setContent(textContent)
        } else {
          this.setContent('')
        }
      },
      setMultipleValue (value) {
        const newValue = value

        this.toggleArrayValue(this.content, newValue)
        this.setFieldValue()
      },
      setMultipleContentByValue () {
        let content = []

        this.value.forEach(item => {
          const textContent = this.MdSelect.items[item]

          if (textContent) {
            content.push(textContent)
          }
        })

        this.setContent(content.join(', '))
      },
      setFieldContent () {
        if (this.multiple) {
          this.setMultipleContentByValue()
        } else {
          this.setContentByValue()
        }
      }
    },
    mounted () {
      this.showSelect = false
      this.didMount = true
      this.setFieldContent()
    }
  }
</script>

<style lang="scss">
  @import "~components/MdAnimation/variables";

  .md-menu.md-select {
    display: flex;
    flex: 1;

    &:not(.md-disabled) {
      .md-input,
      .md-icon {
        cursor: pointer;
        outline: none;
      }
    }

    .md-input {
      flex: 1;
    }

    select,
    .md-input-fake {
      width: 1px;
      height: 1px;
      margin: -1px;
      padding: 0;
      overflow: hidden;
      position: absolute;
      clip: rect(0 0 0 0);
      border: 0;
    }
  }

  .md-menu-content.md-select-menu {
    width: 100%;

    &.md-menu-content-enter {
      transform: translate3d(0, -8px, 0) scaleY(.3);
    }

    .md-list {
      transition: opacity .3s $md-transition-drop-timing;
    }

    .md-dense .md-ripple.md-list-item-content {
      font-size: 14px;
    }
  }
</style>


JS: Add a .vue file to vuex test

JS: Add a .vue file to vuex test

<script>
import { mapGetters } from 'vuex';

export default {
    computed: {
        ...mapGetters(['taintedGetter', 'untaintedGetter'])
    },
    methods: {
        sinks() {
            sink(this.taintedGetter); // NOT OK
            sink(this.untaintedGetter); // OK
        }
    }
};
</script>

error: pathspec 'javascript/ql/test/library-tests/frameworks/Vuex/vuex-test.vue' did not match any file(s) known to git


clean up nav

clean up nav

* remove unnecessary nesting in styles
* move `nav` element to top-level
* don’t use header tags

<template>

    <router-link :to="'/'" class="sidenav-heading">
      Kolibri Style Guide
    </router-link>

      <template v-for="section in navMenu">

{{ section.sectionName }}

            <router-link :to="sectionItem.itemRoute" class="link">
              {{ sectionItem.itemName }}
            </router-link>

      </template>

</template>

<template>

    <router-link :to="'/'" class="sidenav-heading">

Kolibri Style Guide

    </router-link>

      <template v-for="section in navMenu">

{{ section.sectionName }}

            <router-link :to="sectionItem.itemRoute">
              {{ sectionItem.itemName }}
            </router-link>

      </template>

</template>


Format css

Format css

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ICJIA/icjia-gata.git/'


Adds all classes

Adds all classes

<template>

    <router-link :to="classListPage">
{{ $tr('allClasses') }}
</router-link>
    >
    <ui-select
      :name="$tr('selectClass')"
      :label="$tr('selectClass')"
      :value="currentClass"
      :options="classOptions"
      @change="changeClass"
      class="class-selector"
    />

</template>

<template>

  <ui-select
    :name="$tr('selectClass')"
    :label="$tr('selectClass')"
    :value="currentClass"
    :options="classOptions"
    @change="changeClass"
    class="class-selector"
  />

</template>

<script>

  const orderBy = require('lodash/orderBy');

  module.exports = {
    $trNameSpace: 'classSelector',
    $trs: {
      selectClass: 'Class',
    },
    components: {
      'ui-select': require('keen-ui/src/UiSelect'),
    },
    props: {
      classes: {
        type: Array,
        required: true,
      },
      currentClassId: {
        type: String,
        required: true,
      },
    },
    computed: {
      sortedClasses() {
        return orderBy(
          this.classes,
          [classroom => classroom.name.toUpperCase()],
          ['asc']
        );
      },
      classOptions() {
        return this.sortedClasses.map(classroom => ({ label: classroom.name, id: classroom.id }));
      },
      currentClass() {
        return this.classOptions.find(classroom => classroom.id === this.currentClassId);
      },
    },
    methods: {
      changeClass(classSelected) {
        this.$router.push({
          params: { classId: classSelected.id },
        });
      },
    },
  };

</script>

<style lang="stylus">

  .class-selector
    .ui-select__display-value
      font-size: 1.5em
      font-weight: bold

</style>

<style lang="stylus" scoped>

  .class-selector
    display: inline-flex

</style>


Fix background of texture previewer

Fix background of texture previewer

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/g-plane/md-ui-for-bs.git/'


Change subheader tag to li inside lists

Change subheader tag to li inside lists

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/praneetloke/vue-material.git/'


release * 去除注释

release
* 去除注释

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Zjingwen/EVA-UI-PC.git/'


add sig tag for group list

add sig tag for group list

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Ryan-PEK/tbz-mock.git/'


Center loading-spinner relative to content-container

Fixes #1118.

<template>

  <div :class="`gutter-${windowSize.gutterWidth}`">
    <app-bar
      class="app-bar align-to-parent"
      :style="appBarStyle"
      @toggleSideNav="navShown=!navShown"
      :title="appBarTitle"
      :navShown="navShown"
      :height="headerHeight">
      <div slot="app-bar-actions" class="app-bar-actions">
        <slot name="app-bar-actions"/>
      </div>
    </app-bar>
    <nav-bar
      @toggleSideNav="navShown=!navShown"
      :topLevelPageName="topLevelPageName"
      :navShown="navShown"
      :headerHeight="headerHeight"
      :width="navWidth"/>
    <div :style="contentStyle" class="content-container">
      <loading-spinner v-if="loading" class="align-to-parent"/>
      <template v-else>
        <error-box v-if="error"/>
        <slot name="tabs"/>
        <slot name="content"/>
      </template>
    </div>
    <slot name="extra"/>
  </div>

</template>

<script>

  const TopLevelPageNames = require('kolibri.coreVue.vuex.constants').TopLevelPageNames;
  const values = require('lodash.values');
  const responsiveWindow = require('kolibri.coreVue.mixins.responsiveWindow');

  const PADDING = 16;

  module.exports = {
    mixins: [responsiveWindow],
    props: {
      // This prop breaks the separation between core and plugins.
      // It's being used as a work-around until plugins have a way
      // of registering components to be added to the nav bar.
      topLevelPageName: {
        type: String,
        validator(value) {
          if (!value) {
            return true; // Okay if it's undefined
          }
          return values(TopLevelPageNames).includes(value);
        },
      },
      appBarTitle: {
        type: String,
        required: false,
      },
    },
    components: {
      'app-bar': require('./app-bar'),
      'nav-bar': require('kolibri.coreVue.components.navBar'),
      'error-box': require('./error-box'),
      'loading-spinner': require('kolibri.coreVue.components.loadingSpinner'),
    },
    vuex: {
      getters: {
        loading: state => state.core.loading,
        error: state => state.core.error,
        title: state => state.core.title,
      },
    },
    watch: {
      title(newVal, oldVal) {
        document.title = `${newVal} - Kolibri`;
      },
      'windowSize.breakpoint': function updateNav(newVal, oldVal) {
        if (oldVal === 4 && newVal === 5) {
          // Pop out the nav if transitioning from 4 to 5
          this.navShown = true;
        } else if (oldVal === 2 && newVal === 1) {
          // Pop in the nav if transitioning from 2 to 1
          this.navShown = false;
        }
      },
    },
    data: () => ({
      navShown: true,
    }),
    computed: {
      mobile() {
        return this.windowSize.breakpoint < 2;
      },
      headerHeight() {
        return this.mobile ? 56 : 64;
      },
      navWidth() {
        return this.navShown ? this.headerHeight * 4 : 0;
      },
      appBarStyle() {
        return this.mobile ? {} : { paddingLeft: `${this.navWidth + PADDING}px` };
      },
      contentStyle() {
        const style = { top: `${this.headerHeight}px` };
        style.left = this.mobile ? 0 : `${this.navWidth}px`;
        return style;
      },
    },
    mounted() {
      if (this.mobile) {
        this.navShown = false;
      }
    },
  };

</script>

<style lang="stylus" scoped>

  @require '~kolibri.styles.definitions'

  .align-to-parent
    position: absolute
    top: 0
    left: 0

  .app-bar
    height: 64px
    width: 100%

  .app-bar-actions
    display: inline-block

  .content-container
    position: absolute
    overflow-y: scroll
    overflow-x: hidden
    right: 0
    bottom: 0
    padding-bottom: 40px
    padding: 32px

</style>

<template>

  <div :class="`gutter-${windowSize.gutterWidth}`">
    <app-bar
      class="app-bar"
      :style="appBarStyle"
      @toggleSideNav="navShown=!navShown"
      :title="appBarTitle"
      :navShown="navShown"
      :height="headerHeight">

        <slot name="app-bar-actions"/>

    </app-bar>

    <loading-spinner v-if="loading" class="loading-spinner-fixed"/>

      <error-box v-if="error"/>
      <slot name="tabs"/>
      <slot name="content"/>

    <slot name="extra"/>

</template>


Add Content

Add Content

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/SmartCentre/cloudapp.git/'


Force using white color for bottom bar

Force using white color for bottom bar


Implement ignore case for task_text (close #8)

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tum-rt/web-quiz.git/'


View by switch styling.

View by switch styling.

<template>

      {{ $tr('viewbylabel') }}

{{ $tr('contents') }}

{{ $tr('learners') }}

</template>

<template>

      {{ $tr('viewbylabel') }}

        {{ $tr('contents') }}
        |
        {{ $tr('learners') }}

</template>


resize post editor height

resize post editor height

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Luncher/BlogAdmin.git/'


fix(post): fix update post type BUG

fix(post): fix update post type BUG


Update closing line

Update closing line

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/stefanjudis/stefan-judis-website.git/'


Add comments for the 'route' data

Add comments for the
'route' data

<template>

        {{ anchor.label }}

</template>


Wrapping strings in Manage > create modal

<template>

  <core-modal
    :title="$tr('addNewAccountTitle')"
    :has-error="errorMessage ? true : false"
    @enter="createNewUser"
    @cancel="close"
  >

          {{$tr('name')}}
          <input @focus="clearStatus" type="text" class="add-form" id="name" autocomplete="name"  autofocus="true" required v-model="full_name">

          {{$tr('username')}}
          <input @focus="clearStatus" type="text" class="add-form" autocomplete="username" id="username" required v-model="username">

          {{$tr('password')}}
          <input @focus="clearStatus" type="password" class="add-form" id="password" required v-model="password">

          {{$tr('confirmPassword')}}
          <input @focus="clearStatus" type="password" class="add-form" id="confirm-password" required v-model="passwordConfirm">

          {{$tr('userKind')}}
          <select @focus="clearStatus" v-model="kind" id="user-kind">
            <option :value="LEARNER"> {{$tr('learner')}} </option>
            <option :value="COACH"> {{$tr('coach')}} </option>
            <option :value="ADMIN"> {{$tr('admin')}} </option>
          </select>

{{statusMessage}}

        <icon-button
          class="create-btn"
          :text="$tr('createAccount')"
          @click="createNewUser"
        />

  </core-modal>

</template>

<template>

  <core-modal
    title="Add New Account"
    :has-error="errorMessage ? true : false"
    @enter="createNewUser"
    @cancel="close"
  >

          Name
          <input @focus="clearStatus" type="text" class="add-form" id="name" autocomplete="name"  autofocus="true" required v-model="full_name">

          Username
          <input @focus="clearStatus" type="text" class="add-form" autocomplete="username" id="username" required v-model="username">

          Password
          <input @focus="clearStatus" type="password" class="add-form" id="password" required v-model="password">

          Confirm Password
          <input @focus="clearStatus" type="password" class="add-form" id="confirm-password" required v-model="passwordConfirm">

          User Kind
          <select @focus="clearStatus" v-model="kind" id="user-kind">
            <option :value="LEARNER"> Learner </option>
            <option :value="COACH"> Coach </option>
            <option :value="ADMIN"> Admin </option>
          </select>

{{statusMessage}}

        <icon-button
          class="create-btn"
          text="Create Account"
          @click="createNewUser"
        />

  </core-modal>

</template>


create whiteframe documentation with the new template


Selecting run works. Endpoint too

Selecting run works. Endpoint too

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/joshStillerman/NDM.git/'


Fixes UI not being updated on state change

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/NathanielDavid/Sumie.git/'


Replace GA tracking with GTM fix action vals

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/mplusmuseum/mplusmuseum-stories.git/'


Independent editor added

Independent editor added

<style scoped>

</style>

<template>

    <div>

        <div
            :id="uniqId"
            :name="name"
            v-model="dataValue">
        </div>

    </div>

</template>

<script>

    export default {

        data(){
            return{
                dataValue: this.value ? this.value : '',
                tinyMCE_options: {},
                editor: null,
                uniqId: Math.random().toString(36).substring(7) + '_',
            };
        },

        props: {
            // "value" is required to use v-model on the component
            value: {
                default: null
            },
            name: {
                type: String,
                default: ''
            },
            css: {
                type: String,
                default: '',
                required: false
            },
            assetsUrl: {
                type: String,
                default: '',
                required: false
            },
            editorOptions: {
                type: Object,
                required: false,
                default(){
                    return {};
                }
            }
        },

        watch: {
            value: function(val){
                this.dataValue = val ? val : '';
            },
        },

        mounted() {
            this.init();
        },

        methods: {

            init(){
                var self = this;

                let elt = $("div#" + this.uniqId);

                //console.log("textarea#" + this.uniqId, elt.length);

                this.tinyMCE_options = {
                    selector: "div#" + this.uniqId,
                    height: '600px',
                    resize: "vertical",
                    language : 'fr_FR',
                    theme: "modern",
                    body_class: "tinymce-body",
                    content_css : this.css,
                    document_base_url: '/',
                    relative_urls: true,
                    convert_urls: false,
                    remove_script_host: true,
                    schema: "html5",
                    inline: false,
                    statusbar: false,
                    forced_root_block: false, // 'p'
                    //media_filter_html: true,
                    //extended_valid_elements:"iframe[src|title|width|height|allowfullscreen|frameborder|class|id],object[classid|width|height|codebase|*],param[name|value|_value|*],embed[type|width|height|src|*]",
                    //extended_valid_elements : "iframe[src|width|height|name|align|allowfullscreen|frameborder]",
                    //fontsize_formats: "8px 9px 10px 11px 12px 13px 14px 15px 16px 18px 20px 22px 24px 26px 28px 30px 36px 42px",
                    //image_list: tinyMceImages,
                    //link_list: tinyMceLinks,
                    plugins: [
                        "textcolor advlist autolink lists link image charmap print preview anchor emoticons", // media
                        "searchreplace visualblocks code fullscreen charmap",
                        "insertdatetime table contextmenu paste" //moxiemanager
                    ],
                    //menubar: "tools table format view insert edit",
                    menubar: false,
                    //toolbar: "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image",
                    toolbar: "undo redo | bold italic | fontsizeselect | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link | blockquote | code",
                    textcolor_map: {},
                    //toolbar2: "fontsizeselect | forecolor backcolor | charmap | emoticons | media",
                    /*style_formats: [
                     {title: 'Bold text', inline: 'b'},
                     {title: 'Red text', inline: 'span', styles: {color: '#ff0000'}},
                     {title: 'Red header', block: 'h1', styles: {color: '#ff0000'}},
                     {title: 'Example 1', inline: 'span', classes: 'example1'},
                     {title: 'Example 2', inline: 'span', classes: 'example2'},
                     {title: 'Table styles'},
                     {title: 'Table row 1', selector: 'tr', classes: 'tablerow1'}
                     ],*/

                    setup: function(editor) {

                        editor.on('Init', function(e) {
                            console.log('Editor initialized', self.uniqId);
                            self.editor = editor;
                            editor.setContent(self.dataValue ? self.dataValue : '');
                        });

                        editor.on('Dirty', function() {
                            self.$emit('edit', editor.getContent());
                        });

                        editor.on('KeyPress', function() {
                            self.$emit('edit', editor.getContent());
                        });

                        editor.on('Change', function() {
                            this.dataValue = editor.getContent();
                            self.$emit('input', this.dataValue);
                        });
                    }
                };

                this.tinyMCE_options = Object.assign({}, this.tinyMCE_options, this.editorOptions);

                if(this.assetsUrl){

                    console.log('Loading editor assets', this.assetsUrl);

                    axios.get(this.assetsUrl).then(response => {

                        var medias = [];

                        _.forEach(response.data, function(media){
                            medias.push({
                                title: media.title + ' (' + media.mime + ')',
                                value: media.filepath
                            });
                        });

                        var opts = {
                            image_list: medias,
                            link_list: medias
                        };

                        this.tinyMCE_options = Object.assign({}, this.tinyMCE_options, opts);

                        this.launchInit();

                    });

                }else{

                    this.launchInit();
                }
            },

            launchInit(){

                tinymce.init(this.tinyMCE_options).then(r => {
                    console.log('Editor init success', this.uniqId, r);
                }).catch(r => {
                    console.log('Editor init ERROR', this.uniqId, r);
                });

                console.log('Editor init pending...', this.uniqId);
            },

            insert(text){

                this.editor.insertContent(text);
            }
        }
    }
</script>

error: pathspec 'src/widgets/Editor.vue' did not match any file(s) known to git


Add BaseCard.vue

Add BaseCard.vue

<template>
  <v-card>
    <v-card-title class="primary">
      <slot name="title"/>
    </v-card-title>
    <v-card-text>
      <slot/>
    </v-card-text>

    <v-divider/>
    <v-card-actions>
      <slot name="actions"/>
    </v-card-actions>
  </v-card>
</template>
<script>
export default {
  name: "BaseCard"
}
</script>

error: pathspec 'components/molecules/BaseCard.vue' did not match any file(s) known to git


Fixed minor bug with editing wrapping key/value pairs

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/04n0/goldfish.git/'


Fix external sites

Fix external sites

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JosefFriedrich-nodejs/baldr.git/'


Edit/Delete button

Edit/Delete button

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/km4/vuetodo.git/'


Improve lazy loading background

Improve lazy loading background


Sidebar menu adjustments (WIP)

Sidebar menu adjustments (WIP)

<template>

        <button
          type="button"
          :aria-label="$t('Close')"
          class="w-100 inline-flex end-xs bg-cl-transparent brdr-none p0"
          @click="closeMenu"
        >
          close
        </button>

            <router-link
              class="block px25 py20 cl-accent no-underline"
              to="/"
              exact
            >
              {{ $t('Home') }}
            </router-link>

 0 || category.children_data.length > 0"
          >
             0"
            />
            <router-link
              v-else
              class="px25 py20 cl-accent no-underline col-xs"
              :to="{ name: 'category', params: { id: category.id, slug: category.slug }}"
            >
              {{ category.name }}
            </router-link>

            <router-link
              class="block px25 py20 brdr-bottom brdr-cl-secondary cl-accent no-underline fs-medium-small"
              to="/magazine"
              exact
            >
              {{ $t('Magazine') }}
            </router-link>

            <router-link
              class="block px25 py20 brdr-bottom brdr-cl-secondary cl-accent no-underline fs-medium-small"
              to="/sale"
              exact
            >
              {{ $t('Sale') }}
            </router-link>

            <router-link
              class="block px25 py20 brdr-bottom brdr-cl-secondary cl-accent no-underline fs-medium-small"
              to="/order-tracking"
              exact
            >
              {{ $t('Track my order') }}
            </router-link>

              {{ $t('My account') }}

</template>

<template>

        <search-icon class="p15 icon hidden-md" />
        <wishlist-icon class="p15 icon hidden-md" />
        <account-icon class="p15 icon hidden-md" />

        <button
          type="button"
          :aria-label="$t('Close')"
          class="w-100 inline-flex end-xs bg-cl-transparent brdr-none brdr-bottom brdr-cl-bg-secondary"
          @click="closeMenu"
        >
          close
        </button>

            <router-link
              class="block px25 py20 cl-accent no-underline"
              to="/"
              exact
            >
              {{ $t('Home') }}
            </router-link>

 0 || category.children_data.length > 0"
          >
             0"
            />
            <router-link
              v-else
              class="px25 py20 cl-accent no-underline col-xs"
              :to="{ name: 'category', params: { id: category.id, slug: category.slug }}"
            >
              {{ category.name }}
            </router-link>

            <router-link
              class="block px25 py20 brdr-bottom brdr-cl-secondary cl-accent no-underline"
              to="/magazine"
              exact
            >
              {{ $t('Magazine') }}
            </router-link>

            <router-link
              class="block px25 py20 brdr-bottom brdr-cl-secondary cl-accent no-underline"
              to="/sale"
              exact
            >
              {{ $t('Sale') }}
            </router-link>

            <router-link
              class="block px25 py20 brdr-bottom brdr-cl-secondary cl-accent no-underline"
              to="/order-tracking"
              exact
            >
              {{ $t('Track my order') }}
            </router-link>

              {{ $t('My account') }}

</template>


Fixed User filters resolution issue.

Fixed User filters resolution issue.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/evercam/evercam-admin.git/'


Fix h-card component for indie web

Fix h-card component for indie web


Fix typo

Fix typo

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ludo237/claudioludovico.git/'


[UNFINISHED] translation: components/transfer

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/iview/iview-doc.git/'


Change color

Change color

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/LokeCarlsson/lokecarlsson.git/'


Create the FreightNumberCalc components

Create the FreightNumberCalc components

<template>

</template>

<script>
  export default {
    name: "FreightNumberCalc"
  }
</script>

<style scoped>

</style>

error: pathspec 'src/js/components/FreightNumberCalc.vue' did not match any file(s) known to git


Fix form-name

Fix form-name


commit 可视化界面

commit 可视化界面


Allow enter to commit filter

Allow enter to commit filter

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/PayBreak/basket.git/'


modify style

modify style

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/notadd/administration.git/'


fix something

fix something


权限演示模块

权限演示模块

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/wuazhu/chinapost.git/'


fix:删除无用的菜单

fix:删除无用的菜单

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ZHCS-CLUB/Hammer.git/'


Added 'change' events to ColorPicker

Added 'change' events to ColorPicker

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/iamnewsea/element-pzx.git/'


'fix3'

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/wfzong/limpid-water.git/'


修正合并请求错误提示翻译

修正合并请求错误提示翻译

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/dreampet/gitlab.git/'


docs(kitchen): add VHover pan

docs(kitchen): add VHover pan

<template>
  <v-container>
    <v-layout column>

Simple hover

      <v-flex>
        <v-hover>
          <v-sheet slot-scope="{ hover }">
            {{ hover }}
          </v-sheet>
        </v-hover>
      </v-flex>

Disabled

      <v-flex>
        <v-hover disabled>
          <v-sheet slot-scope="{ hover }">
            {{ hover }}
          </v-sheet>
        </v-hover>
      </v-flex>

With delay

      <v-flex>
        <v-hover
          open-delay="100"
          close-delay="100">
          <v-sheet slot-scope="{ hover }">
            {{ hover }}
          </v-sheet>
        </v-hover>
      </v-flex>
    </v-layout>
  </v-container>
</template>

error: pathspec 'packages/kitchen/src/pan/Hover.vue' did not match any file(s) known to git


Added some edge cases for search button display


praise it

praise it

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/paulstraw/paulstraw.com.git/'


Fix typo in aria attribute

Fix typo in aria attribute

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/stefanjudis/stefan-judis-website.git/'


返回距离的时候实时更新距离；计算属性添加

返回距离的时候实时更新距离；计算属性添加

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/HydeSong/MOYA.git/'


create about page with the new template

create about page with the new template

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/praneetloke/vue-material.git/'


Add UndertakingExpense component

Add UndertakingExpense component

<template>

Ποσό και ΚΑΕ

        ΑΦΜ / ΕΠΩΝΥΜΙΑ
        ΑΡΙΘΜΟΣ ΚΑΕ
        ΠΟΣΟ ΜΕ ΦΠΑ
        ΥΠΟΛΟΙΠΟ ΔΙΑΘΕΣΙΜΗΣ ΠΙΣΤΩΣΗΣ
        ΥΠΟΛΟΙΠΟ ΚΑΕ
        ΠΡΟΣΘΗΚΗ

              <input type="text" :name="getAFM(expense)" class="form-control" placeholder="ΑΦΜ">

              <input type="text" readonly="readonly" :name="getSponsored(expense)" value="ΕΠΩΝΥΜΙΑ Χ" class="form-control text-center">

            <kae :number="expense"></kae>

              Ποσό
              <input type="text" :name="getExpense(expense)" class="form-control">

              <currencies :number="expense"></currencies>

            <input type="number" class="form-control" :name="getKaeBudgetRemainder(expense)">

            <input type="number" class="form-control" :name="getKaeCreditRemainder(expense)">

        <input type="hidden" :value="expense" :name="getExpenseIndex(expense)">

        <input type="hidden" value="Εθνικό" :name="getAfmTypeName(expense)">
        <button type="button" class="btn btn-default" v-on:click="incrementExpenses">Προσθήκη {{nextExpense}}ου Ποσού</button>

      ΑΔΑ Σχετικής Ανάληψης Υποχρέωσης
      <input name="has_related_undertaking" class="form-control">

</template>

error: pathspec 'n3-composer/components/specific-decision-fields/common-properties/UndertakingExpense.vue' did not match any file(s) known to git


VUE diagram for R code tasks.

VUE diagram for R code tasks.

<?xml version="1.0" encoding="US-ASCII"?>
<LW-MAP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="none" ID="0"
    label="Tasks_for_R_Code.vue" created="1444151180555" x="0.0" y="0.0"
    width="1.4E-45" height="1.4E-45" strokeWidth="0.0" autoSized="false">
    <resource referenceCreated="1444154964358" size="16439"
        spec="C:\Users\Jon and Soph\Desktop\SS Doc\UIUC\UCSB\Tasks_for_R_Code.vue"
        type="1" xsi:type="URLResource">
        <title>Tasks_for_R_Code.vue</title>
        <property key="File" value="C:\Users\Jon and Soph\Desktop\SS Doc\UIUC\UCSB\Tasks_for_R_Code.vue"/>
    </resource>
    <fillColor>#FFFFFF</fillColor>
    <strokeColor>#404040</strokeColor>
    <textColor>#000000</textColor>
    SansSerif-plain-14
    <URIString>http://vue.tufts.edu/rdf/resource/3e34470ec0a8010201bfefb946e153cb</URIString>
    <child ID="6" label="Query" layerID="1" created="1444151250855"
        x="451.0" y="114.0" width="104.20001" height="43.0"
        strokeWidth="1.0" autoSized="false" xsi:type="node">
        <notes>Task is accomplished through a R code.</notes>
        <fillColor>#F1A83E</fillColor>
        <strokeColor>#000000</strokeColor>
        <textColor>#000000</textColor>
        Arial-plain-12
        <URIString>http://vue.tufts.edu/rdf/resource/3e34470fc0a8010201bfefb9c2344b50</URIString>
        <shape arcwidth="20.0" archeight="20.0" xsi:type="roundRect"/>
    </child>
    <child ID="7" label="Filter/Merge" layerID="1"
        created="1444151264258" x="452.5" y="251.5" width="125.70001"
        height="52.5" strokeWidth="1.0" autoSized="false" xsi:type="node">
        <notes>Task is accomplished through a R code.</notes>
        <fillColor>#F1A83E</fillColor>
        <strokeColor>#000000</strokeColor>
        <textColor>#000000</textColor>
        Arial-plain-12
        <URIString>http://vue.tufts.edu/rdf/resource/3e34470fc0a8010201bfefb92d957a63</URIString>
        <shape arcwidth="20.0" archeight="20.0" xsi:type="roundRect"/>
    </child>
    <child ID="8" label="Calculate
(Precision/Recall)" layerID="1"
        created="1444151266888" x="451.5" y="449.0" width="145.70001"
        height="63.5" strokeWidth="1.0" autoSized="false" xsi:type="node">
        <notes>Task is accomplished through a R code.</notes>
        <fillColor>#F1A83E</fillColor>
        <strokeColor>#000000</strokeColor>
        <textColor>#000000</textColor>
        Arial-plain-12
        <URIString>http://vue.tufts.edu/rdf/resource/3e344710c0a8010201bfefb973cfd529</URIString>
        <shape arcwidth="20.0" archeight="20.0" xsi:type="roundRect"/>
    </child>
    <child ID="10" label="CN-Sandbox" layerID="1"
        created="1444151426789" x="628.0" y="-51.0" width="105.0"
        height="59.0" strokeWidth="1.0" autoSized="false" xsi:type="node">
        <fillColor>#83CEFF</fillColor>
        <strokeColor>#000000</strokeColor>
        <textColor>#000000</textColor>
        Arial-plain-12
        <URIString>http://vue.tufts.edu/rdf/resource/3e344710c0a8010201bfefb96d2d2715</URIString>
        <shape xsi:type="ellipse"/>
    </child>
    <child ID="11" label="uc52_queries_all.csv" layerID="1"
        created="1444151477045" x="204.0" y="1.0" width="168.0"
        height="58.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
        <fillColor>#DAA9FF</fillColor>
        <strokeColor>#000000</strokeColor>
        <textColor>#000000</textColor>
        Arial-plain-12
        <URIString>http://vue.tufts.edu/rdf/resource/3e344711c0a8010201bfefb9aaea9e9c</URIString>
        <shape xsi:type="rhombus"/>
    </child>
    <child ID="12" label="Resultset_Summary_RunID.csv" layerID="1"
        created="1444151586275" x="712.0" y="76.0" width="281.2"
        height="85.200005" strokeWidth="1.0" autoSized="true" xsi:type="node">
        <notes>"RunID" part of the file name is customizable.%nl;%nl;The following are the information included in the "Resultset_Summary_RunID.csv" file (the information in the parenthesis is the potential source for the data; PK = Primary Key): %sp;%nl;%nl; %sp; %sp; %sp; %sp;R_Time (R)%nl; %sp; %sp; %sp; %sp;D1_node (config file)%nl;PK %sp; Query_ID (input file)%nl; %sp; %sp; %sp; %sp;SOLR_Index_Type (input file)%nl;PK %sp; Dataset_ID (SOLR query results)%nl;PK %sp; Run_ID (Config file)%nl; %sp; %sp; %sp; %sp;Ontology_Set_ID (Config file)%nl; %nl;Note: Run_ID = DateTime + SOLR_Index_Type</notes>
        <fillColor>#DAA9FF</fillColor>
        <strokeColor>#000000</strokeColor>
        <textColor>#000000</textColor>
        Arial-plain-12
        <URIString>http://vue.tufts.edu/rdf/resource/3e344712c0a8010201bfefb9e7ec3918</URIString>
        <shape xsi:type="rhombus"/>
    </child>
    <child ID="13" label="operates on" layerID="1"
        created="1444151720018" x="526.89355" y="2.8504028"
        width="126.02704" height="111.6496" strokeWidth="1.0"
        autoSized="false" controlCount="0" arrowState="2" xsi:type="link">
        <strokeColor>#404040</strokeColor>
        <textColor>#404040</textColor>
        Arial-plain-11
        <URIString>http://vue.tufts.edu/rdf/resource/3e344712c0a8010201bfefb9b27968f0</URIString>
        <point1 x="527.3936" y="114.0"/>
        <point2 x="652.42065" y="3.3504028"/>
        <ID1 xsi:type="node">6</ID1>
        <ID2 xsi:type="node">10</ID2>
    </child>
    <child ID="15" label="is input for" layerID="1"
        created="1444151832592" x="339.831" y="55.166748"
        width="120.439514" height="59.58145" strokeWidth="1.0"
        autoSized="false" controlCount="0" arrowState="2" xsi:type="link">
        <strokeColor>#404040</strokeColor>
        <textColor>#404040</textColor>
        Arial-plain-11
        <URIString>http://vue.tufts.edu/rdf/resource/3e344713c0a8010201bfefb94ac3d96e</URIString>
        <point1 x="340.331" y="55.666748"/>
        <point2 x="459.7705" y="114.2482"/>
        <ID1 xsi:type="node">11</ID1>
        <ID2 xsi:type="node">6</ID2>
    </child>
    <child ID="16" label="produces" layerID="1" created="1444151895616"
        x="554.69995" y="121.59949" width="182.21136" height="14.0"
        strokeWidth="1.0" autoSized="false" controlCount="0"
        arrowState="2" xsi:type="link">
        <strokeColor>#404040</strokeColor>
        <textColor>#404040</textColor>
        Arial-plain-11
        <URIString>http://vue.tufts.edu/rdf/resource/3e344714c0a8010201bfefb96ab69d20</URIString>
        <point1 x="555.2" y="132.98071"/>
        <point2 x="736.4114" y="124.21828"/>
        <ID1 xsi:type="node">6</ID1>
        <ID2 xsi:type="node">12</ID2>
    </child>
    <child ID="17" label="is input for" layerID="1"
        created="1444152082567" x="569.64404" y="160.70001"
        width="193.18365" height="91.69241" strokeWidth="1.0"
        autoSized="false" controlCount="0" arrowState="2" xsi:type="link">
        <strokeColor>#404040</strokeColor>
        <textColor>#404040</textColor>
        Arial-plain-11
        <URIString>http://vue.tufts.edu/rdf/resource/3e344714c0a8010201bfefb98e854342</URIString>
        <point1 x="762.32764" y="161.20001"/>
        <point2 x="570.144" y="251.89243"/>
        <ID1 xsi:type="node">12</ID1>
        <ID2 xsi:type="node">7</ID2>
    </child>
    <child ID="18" label="ground_truth.csv" layerID="1"
        created="1444152135712" x="193.20001" y="214.0" width="134.6"
        height="50.600002" strokeWidth="1.0" autoSized="true" xsi:type="node">
        <fillColor>#DAA9FF</fillColor>
        <strokeColor>#000000</strokeColor>
        <textColor>#000000</textColor>
        Arial-plain-12
        <URIString>http://vue.tufts.edu/rdf/resource/3e344715c0a8010201bfefb9e5daff1d</URIString>
        <shape xsi:type="rhombus"/>
    </child>
    <child ID="19" label="is input for" layerID="1"
        created="1444152152623" x="309.8396" y="246.31946"
        width="143.16043" height="22.448181" strokeWidth="1.0"
        autoSized="false" controlCount="0" arrowState="2" xsi:type="link">
        <strokeColor>#404040</strokeColor>
        <textColor>#404040</textColor>
        Arial-plain-11
        <URIString>http://vue.tufts.edu/rdf/resource/3e344716c0a8010201bfefb94830e126</URIString>
        <point1 x="310.33957" y="246.81946"/>
        <point2 x="452.5" y="268.26764"/>
        <ID1 xsi:type="node">18</ID1>
        <ID2 xsi:type="node">7</ID2>
    </child>
    <child ID="20" label="filter_merge object" layerID="1"
        created="1444152187634" x="729.60004" y="284.4" width="186.6"
        height="64.600006" strokeWidth="1.0" autoSized="true" xsi:type="node">
        <notes>filter_merge object might be constructed as a R data frame and might not need to be output as a csv file.%nl;%nl;The following are the information included in the "filter_merge" object (the information in the parenthesis is the suggested data type; PK = Primary Key)%nl;%nl;PK %sp; Test_Corpus_ID%nl; %sp; %sp; %sp; %sp;D1_node %nl;PK %sp; Query_ID%nl; %sp; %sp; %sp; %sp;SOLR_Index_Type %nl;PK %sp; Dataset_ID %nl;PK %sp; Run_ID %nl; %sp; %sp; %sp; %sp;Ontology_Set_ID %nl; %sp; %sp; %sp; %sp;Was_Rel (boolean)%nl; %sp; %sp; %sp; %sp;Was_Hit (boolean)</notes>
        <fillColor>#DAA9FF</fillColor>
        <strokeColor>#000000</strokeColor>
        <textColor>#000000</textColor>
        Arial-plain-12
        <URIString>http://vue.tufts.edu/rdf/resource/3e344716c0a8010201bfefb9328865b0</URIString>
        <shape xsi:type="rhombus"/>
    </child>
    <child ID="21" label="produces" layerID="1" created="1444152371772"
        x="577.7001" y="285.20972" width="176.14874" height="23.181885"
        strokeWidth="1.0" autoSized="false" controlCount="0"
        arrowState="2" xsi:type="link">
        <strokeColor>#404040</strokeColor>
        <textColor>#404040</textColor>
        Arial-plain-11
        <URIString>http://vue.tufts.edu/rdf/resource/3e344717c0a8010201bfefb96a3d1424</URIString>
        <point1 x="578.2" y="285.70972"/>
        <point2 x="753.34875" y="307.8916"/>
        <ID1 xsi:type="node">7</ID1>
        <ID2 xsi:type="node">20</ID2>
    </child>
    <child ID="22" label="is input for" layerID="1"
        created="1444152416293" x="581.6309" y="348.5" width="182.9873"
        height="101.0" strokeWidth="1.0" autoSized="false"
        controlCount="0" arrowState="2" xsi:type="link">
        <strokeColor>#404040</strokeColor>
        <textColor>#404040</textColor>
        Arial-plain-11
        <URIString>http://vue.tufts.edu/rdf/resource/3e34471bc0a8010201bfefb9976fe194</URIString>
        <point1 x="764.1182" y="349.0"/>
        <point2 x="582.1309" y="449.0"/>
        <ID1 xsi:type="node">20</ID1>
        <ID2 xsi:type="node">8</ID2>
    </child>
    <child ID="23" label="Prec_Recall_Results.csv" layerID="1"
        created="1444152441095" x="693.9" y="507.69995" width="233.0"
        height="75.0" strokeWidth="1.0" autoSized="true" xsi:type="node">
        <notes>The following are the information included in the "Prec_Recall_Results.csv" file (the information in the parenthesis is the suggested data type; PK = Primary Key)%nl;%nl;PK %sp; Test_Corpus_ID (string)%nl;PK %sp; Query_ID (string)%nl; %sp; %sp; %sp; %sp;SOLR_Index_Type (string)%nl;PK %sp; Run_ID (string)%nl; %sp; %sp; %sp; %sp;Ontology_Set_ID (string)%nl; %sp; %sp; %sp; %sp;Precision (float)%nl; %sp; %sp; %sp; %sp;Recall (float)%nl;</notes>
        <fillColor>#DAA9FF</fillColor>
        <strokeColor>#000000</strokeColor>
        <textColor>#000000</textColor>
        Arial-plain-12
        <URIString>http://vue.tufts.edu/rdf/resource/3e34471bc0a8010201bfefb9b7302720</URIString>
        <shape xsi:type="rhombus"/>
    </child>
    <child ID="24" label="produces" layerID="1" created="1444152513443"
        x="596.7" y="496.66382" width="132.44507" height="30.615936"
        strokeWidth="1.0" autoSized="false" controlCount="0"
        arrowState="2" xsi:type="link">
        <strokeColor>#404040</strokeColor>
        <textColor>#404040</textColor>
        Arial-plain-11
        <URIString>http://vue.tufts.edu/rdf/resource/3e34471cc0a8010201bfefb9cfcb13f8</URIString>
        <point1 x="597.2" y="497.16385"/>
        <point2 x="728.6451" y="526.7798"/>
        <ID1 xsi:type="node">8</ID1>
        <ID2 xsi:type="node">23</ID2>
    </child>
    <layer ID="1" label="Layer 1" created="1444151180559" x="0.0"
        y="0.0" width="1.4E-45" height="1.4E-45" strokeWidth="0.0" autoSized="false">
        <URIString>http://vue.tufts.edu/rdf/resource/3e34471cc0a8010201bfefb9573c30ae</URIString>
    </layer>
    <userZoom>1.0</userZoom>
    <userOrigin x="111.2" y="-168.0"/>
    <presentationBackground>#202020</presentationBackground>
    <PathwayList currentPathway="0" revealerIndex="-1">
        <pathway ID="0" label="Untitled Pathway" created="1444151180555"
            x="0.0" y="0.0" width="1.4E-45" height="1.4E-45"
            strokeWidth="0.0" autoSized="false" currentIndex="-1" open="true">
            <strokeColor>#B3993333</strokeColor>
            <textColor>#000000</textColor>
            SansSerif-plain-14
            <URIString>http://vue.tufts.edu/rdf/resource/3e34471dc0a8010201bfefb9406c70fd</URIString>
            <masterSlide ID="2" created="1444151180618" x="0.0" y="0.0"
                width="800.0" height="600.0" locked="true"
                strokeWidth="0.0" autoSized="false">
                <fillColor>#000000</fillColor>
                <strokeColor>#404040</strokeColor>
                <textColor>#000000</textColor>
                SansSerif-plain-14
                <URIString>http://vue.tufts.edu/rdf/resource/3e34471dc0a8010201bfefb9bc8dc24f</URIString>
                <titleStyle ID="3" label="Header"
                    created="1444151182793" x="335.5" y="172.5"
                    width="129.0" height="55.0" strokeWidth="0.0"
                    autoSized="true" isStyle="true" xsi:type="node">
                    <strokeColor>#404040</strokeColor>
                    <textColor>#FFFFFF</textColor>
                    Gill Sans-plain-36
                    <URIString>http://vue.tufts.edu/rdf/resource/3e34471dc0a8010201bfefb9ba9edb60</URIString>
                    <shape xsi:type="rectangle"/>
                </titleStyle>
                <textStyle ID="4" label="Slide Text"
                    created="1444151182794" x="346.5" y="281.5"
                    width="107.0" height="37.0" strokeWidth="0.0"
                    autoSized="true" isStyle="true" xsi:type="node">
                    <strokeColor>#404040</strokeColor>
                    <textColor>#FFFFFF</textColor>
                    Gill Sans-plain-22
                    <URIString>http://vue.tufts.edu/rdf/resource/3e34471dc0a8010201bfefb9c4354f11</URIString>
                    <shape xsi:type="rectangle"/>
                </textStyle>
                <linkStyle ID="5" label="Links" created="1444151182795"
                    x="373.5" y="384.0" width="53.0" height="32.0"
                    strokeWidth="0.0" autoSized="true" isStyle="true" xsi:type="node">
                    <strokeColor>#404040</strokeColor>
                    <textColor>#B3BFE3</textColor>
                    Gill Sans-plain-18
                    <URIString>http://vue.tufts.edu/rdf/resource/3e34471ec0a8010201bfefb9cc681df7</URIString>
                    <shape xsi:type="rectangle"/>
                </linkStyle>
            </masterSlide>
        </pathway>
    </PathwayList>
    <date>2015-10-06</date>
    <modelVersion>6</modelVersion>
    <saveLocation>C:\Users\Jon and Soph\Desktop\SS Doc\UIUC\UCSB</saveLocation>
    <saveFile>C:\Users\Jon and Soph\Desktop\SS Doc\UIUC\UCSB\Tasks_for_R_Code.vue</saveFile>
</LW-MAP>

error: pathspec 'docs/Tasks_for_R_Code.vue' did not match any file(s) known to git


竞品数据对比核心页面布局

竞品数据对比核心页面布局

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/PaulChen2016/ATMP_StatsUI.git/'


fixed paneldynamic for vuejs

fixed paneldynamic for vuejs

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/dmitrykurmanov/surveyjs.git/'


Reset selected questions when level/topic changes

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JimmehCai/VTIC.git/'


Add tiny box-shadow to logo

Add tiny box-shadow to logo


grid layout

grid layout

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JosefFriedrich-nodejs/baldr.git/'


#485: category - move filters above top bar on mobile

<template>

            <breadcrumbs :routes="breadcrumbs.routes" :active-route="category.name" />

 {{ category.name }}

            <button class="col-xs-5 mt25 p15 mobile-filters-button bg-black brdr-none c-white h5" @click="openFilters">Filters</button>

                <sidebar :filters="filters"/>

                    close

                <sidebar class="mobile-filters-body" :filters="filters"/>

                    No products found!

                <product-listing columns="3" :products="products" />

</template>


Remove duplicated styles

Remove duplicated styles

<template>

          4

Review order

Please check if all data are correct

                <cart-summary />

                  <input type="checkbox" v-model="orderReview.terms" id="acceptTermsCheckbox">

                    I agree to terms and conditions

                Field is required

            <button-full text="Place the order" @click.native="placeOrder" :class="{ 'ripple': true, 'button-disabled' : $v.orderReview.$invalid}"/>

    <modal name="modal-terms" static="terms">

Terms and conditions

    </modal>

</template>


:recycle: Add simple control button component

<template>
  <div class="input-control-buttons" ref="container">
    <el-button
      :disabled="isRecording"
      :size="buttonSize"
      :type="startButtonType"
      @click="handleStartRecording"
    >
      Start Recording
    </el-button>

  </div>
</template>

<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { ElementUIComponentSize } from 'element-ui/types/component';
import { ButtonType } from 'element-ui/types/button';

@Component({
  name: 'input-control-buttons-simple',
})
export default class InputControlButtonsSimple extends Vue {
  @Prop({ required: false, type: String, default: 'small' })
  buttonSize!: ElementUIComponentSize;

  @Prop({ required: false, type: String, default: 'primary' })
  startButtonType!: ButtonType;

  get isRecording(): boolean {
    return this.$assistant.data.isRecording;
  }

  get hasAnyAudioOutput(): boolean {
    return this.isPlayingAudio || this.isSpeakingText;
  }

  get isSpeakingText(): boolean {
    return this.$assistant.data.isSpeakingText;
  }

  get isPlayingAudio(): boolean {
    return this.$assistant.data.isPlayingAudio;
  }

  handleStartRecording() {
    if (!this.isRecording) {
      this.$assistant.startRecording();
      this.$emit('startRecording')
    }
  }

  handleStopRecording() {
    this.$assistant.stopRecording();
  }

  handleAbortRecording() {
    this.$assistant.abortRecording();
  }

  handleStopAudioOutput() {
    this.$assistant.stopAudioOutput();
  }
}
</script>

<style scoped></style>

error: pathspec 'examples/typescript/core-platform-clients/vue/debugger/src/components/input/InputControlButtonsSimple.vue' did not match any file(s) known to git


Minimal fix for locked up lesson creation + edit.

<template>

  <core-modal
    :title="modalTexts.title"
    @cancel="closeModal()"
    width="400px"
  >
    <form @submit.prevent="submitLessonData">
      <ui-alert
        v-if="showError"
        type="error"
        :dismissible="false"
      >
        {{ $tr('submitLessonError') }}
      </ui-alert>
      <k-textbox
        @blur="titleIsVisited = true"
        :label="$tr('title')"
        :maxlength="50"
        :autofocus="true"
        :invalid="titleIsInvalid"
        :invalidText="titleIsInvalidText"
        v-model="title"
        :disabled="formIsSubmitted"
      />
      <k-textbox
        :label="$tr('description')"
        :maxlength="200"
        :textArea="true"
        v-model="description"
        :disabled="formIsSubmitted"
      />

      <fieldset>
        <legend>{{ $tr('visibleTo') }}</legend>
        <recipient-selector
          v-model="selectedCollectionIds"
          :groups="groups"
          :classId="classId"
          :disabled="formIsSubmitted"
        />
      </fieldset>
      <div class="core-modal-buttons">
        <k-button
          :text="$tr('cancel')"
          appearance="flat-button"
          @click="closeModal()"
        />
        <k-button
          :text="modalTexts.submitButton"
          type="submit"
          :primary="true"
        />
      </div>
    </form>
  </core-modal>

</template>

<script>

  import xor from 'lodash/xor';
  import coreModal from 'kolibri.coreVue.components.coreModal';
  import kButton from 'kolibri.coreVue.components.kButton';
  import kTextbox from 'kolibri.coreVue.components.kTextbox';
  import RecipientSelector from './RecipientSelector';
  import UiAlert from 'keen-ui/src/UiAlert';
  import { LessonResource } from 'kolibri.resources';
  import { createSnackbar } from 'kolibri.coreVue.vuex.actions';
  import { lessonSummaryLink } from '../lessonsRouterUtils';
  import { LessonsPageNames } from '../../../lessonsConstants';
  import { refreshLessonReport } from '../../../state/actions/lessonReportsActions';

  export default {
    name: 'lessonDetailsModal',
    components: {
      coreModal,
      kButton,
      kTextbox,
      RecipientSelector,
      UiAlert,
    },
    data() {
      return {
        description: '',
        descriptionIsVisited: false,
        formIsSubmitted: false,
        selectedCollectionIds: [],
        title: '',
        titleIsVisited: false,
        showError: false,
      };
    },
    computed: {
      formData() {
        return {
          title: this.title,
          description: this.description,
          lesson_assignments: this.selectedCollectionIds.map(groupId => ({ collection: groupId })),
        };
      },
      modalTexts() {
        if (this.isInEditMode) {
          // For existing Lesson
          return {
            title: this.$tr('editingLessonDetails'),
            submitButton: this.$tr('save'),
            snackbarText: this.$tr('changesToLessonSaved'),
          };
        }
        // For new Lesson
        return {
          title: this.$tr('newLesson'),
          submitButton: this.$tr('continue'),
          snackbarText: this.$tr('newLessonCreated'),
        };
      },
      titleIsInvalidText() {
        if (this.titleIsVisited || this.formIsSubmitted) {
          if (this.title === '') {
            return this.$tr('required');
          }
        }
        return '';
      },
      titleIsInvalid() {
        return Boolean(this.titleIsInvalidText);
      },
      formIsValid() {
        return !this.titleIsInvalid;
      },
      groupsHaveChanged() {
        const unsharedIds = xor(
          this.selectedCollectionIds,
          this.currentLessonAssignedCollectionIds
        );
        return unsharedIds.length > 0;
      },
      lessonDetailsHaveChanged() {
        return (
          this.currentLesson.title !== this.title ||
          this.currentLesson.description !== this.description ||
          this.groupsHaveChanged
        );
      },
    },
    created() {
      if (this.isInEditMode) {
        this.title = this.currentLesson.title;
        this.description = this.currentLesson.description;
        this.selectedCollectionIds = [...this.currentLessonAssignedCollectionIds];
      } else {
        this.selectedCollectionIds = [this.classId];
      }
    },
    methods: {
      showSuccessSnackbar() {
        this.createSnackbar({
          text: this.modalTexts.snackbarText,
          autoDismiss: true,
        });
      },
      handleSubmitSuccess() {
        this.closeModal();
        this.showSuccessSnackbar();
      },
      handleSubmitFailure() {
        this.formIsSubmitted = false;
        this.showError = true;
      },
      submitLessonData() {
        this.showError = false;
        // Return immediately if "submit" has already been clicked
        if (this.formIsSubmitted) {
          return;
        }
        if (this.isInEditMode && !this.lessonDetailsHaveChanged) {
          return this.closeModal();
        }
        this.formIsSubmitted = true;
        if (this.formIsValid) {
          if (this.isInEditMode) {
            return this.updateLesson()
              .then(updatedLesson => {
                this.handleSubmitSuccess();
                return this.updateCurrentLesson(updatedLesson);
              })
              .catch(() => {
                this.handleSubmitFailure();
              });
          } else {
            return this.createLesson()
              .then(newLesson => {
                this.handleSubmitSuccess();
                return this.$router.push(
                  lessonSummaryLink({ classId: this.classId, lessonId: newLesson.id })
                );
              })
              .catch(() => {
                this.handleSubmitFailure();
              });
          }
        } else {
          // shouldn't ever be true, but being safe
          this.formIsSubmitted = false;
        }
      },
      createLesson() {
        return LessonResource.createModel({
          ...this.formData,
          resources: [],
          collection: this.classId,
        }).save();
      },
      updateLesson() {
        return LessonResource.getModel(this.currentLesson.id).save({ ...this.formData });
      },
      closeModal() {
        this.$emit('cancel');
      },
    },
    vuex: {
      getters: {
        classId: state => state.classId,
        currentLesson: state => state.pageState.currentLesson || null,
        groups: state => state.pageState.learnerGroups,
        // If the page name is (Lesson) SUMMARY, then should be in edit mode
        isInEditMode: state => state.pageName === LessonsPageNames.SUMMARY,
        currentLessonAssignedCollectionIds: state =>
          state.pageState.currentLesson.lesson_assignments.map(a => a.collection),
      },
      actions: {
        createSnackbar,
        updateCurrentLesson(store, lesson) {
          store.dispatch('SET_CURRENT_LESSON', lesson);
          return refreshLessonReport(store, lesson.id);
        },
      },
    },
    $trs: {
      cancel: 'Cancel',
      changesToLessonSaved: 'Changes to lesson saved',
      continue: 'Continue',
      description: 'Description',
      editingLessonDetails: 'Edit lesson details',
      newLesson: 'New lesson',
      newLessonCreated: 'New lesson created',
      required: 'This is required',
      save: 'Save',
      submitLessonError: 'There was a problem saving this lesson',
      title: 'Title',
      visibleTo: 'Visible to',
    },
  };

</script>

<style lang="stylus" scoped>

  fieldset
    border: none
    margin: 0
    padding: 0

  legend
    padding-top: 16px
    padding-bottom: 8px

</style>

<template>

  <core-modal
    :title="modalTexts.title"
    @cancel="closeModal()"
    width="400px"
  >
    <form @submit.prevent="submitLessonData">
      <ui-alert
        v-if="showError"
        type="error"
        :dismissible="false"
      >
        {{ $tr('submitLessonError') }}
      </ui-alert>
      <k-textbox
        :label="$tr('title')"
        :maxlength="50"
        :autofocus="true"
        :invalid="titleIsInvalid"
        :invalidText="titleIsInvalidText"
        v-model="title"
        :disabled="formIsSubmitted"
      />
      <k-textbox
        :label="$tr('description')"
        :maxlength="200"
        :textArea="true"
        v-model="description"
        :disabled="formIsSubmitted"
      />

      <fieldset>
        <legend>{{ $tr('visibleTo') }}</legend>
        <recipient-selector
          v-model="selectedCollectionIds"
          :groups="groups"
          :classId="classId"
          :disabled="formIsSubmitted"
        />
      </fieldset>
      <div class="core-modal-buttons">
        <k-button
          :text="$tr('cancel')"
          appearance="flat-button"
          @click="closeModal()"
        />
        <k-button
          :text="modalTexts.submitButton"
          type="submit"
          :primary="true"
        />
      </div>
    </form>
  </core-modal>

</template>

<script>

  import xor from 'lodash/xor';
  import coreModal from 'kolibri.coreVue.components.coreModal';
  import kButton from 'kolibri.coreVue.components.kButton';
  import kTextbox from 'kolibri.coreVue.components.kTextbox';
  import RecipientSelector from './RecipientSelector';
  import UiAlert from 'keen-ui/src/UiAlert';
  import { LessonResource } from 'kolibri.resources';
  import { createSnackbar } from 'kolibri.coreVue.vuex.actions';
  import { lessonSummaryLink } from '../lessonsRouterUtils';
  import { LessonsPageNames } from '../../../lessonsConstants';
  import { refreshLessonReport } from '../../../state/actions/lessonReportsActions';

  export default {
    name: 'lessonDetailsModal',
    components: {
      coreModal,
      kButton,
      kTextbox,
      RecipientSelector,
      UiAlert,
    },
    data() {
      return {
        description: '',
        descriptionIsVisited: false,
        formIsSubmitted: false,
        selectedCollectionIds: [],
        title: '',
        titleIsVisited: false,
        showError: false,
      };
    },
    computed: {
      formData() {
        return {
          title: this.title,
          description: this.description,
          lesson_assignments: this.selectedCollectionIds.map(groupId => ({ collection: groupId })),
        };
      },
      modalTexts() {
        if (this.isInEditMode) {
          // For existing Lesson
          return {
            title: this.$tr('editingLessonDetails'),
            submitButton: this.$tr('save'),
            snackbarText: this.$tr('changesToLessonSaved'),
          };
        }
        // For new Lesson
        return {
          title: this.$tr('newLesson'),
          submitButton: this.$tr('continue'),
          snackbarText: this.$tr('newLessonCreated'),
        };
      },
      titleIsInvalidText() {
        if (this.titleIsVisited || this.formIsSubmitted) {
          if (this.title === '') {
            return this.$tr('required');
          }
        }
        return '';
      },
      titleIsInvalid() {
        return Boolean(this.titleIsInvalidText);
      },
      formIsValid() {
        return !this.titleIsInvalid;
      },
      groupsHaveChanged() {
        const unsharedIds = xor(
          this.selectedCollectionIds,
          this.currentLessonAssignedCollectionIds
        );
        return unsharedIds.length > 0;
      },
      lessonDetailsHaveChanged() {
        return (
          this.currentLesson.title !== this.title ||
          this.currentLesson.description !== this.description ||
          this.groupsHaveChanged
        );
      },
    },
    created() {
      if (this.isInEditMode) {
        this.title = this.currentLesson.title;
        this.description = this.currentLesson.description;
        this.selectedCollectionIds = [...this.currentLessonAssignedCollectionIds];
      } else {
        this.selectedCollectionIds = [this.classId];
      }
    },
    methods: {
      showSuccessSnackbar() {
        this.createSnackbar({
          text: this.modalTexts.snackbarText,
          autoDismiss: true,
        });
      },
      handleSubmitSuccess() {
        this.closeModal();
        this.showSuccessSnackbar();
      },
      handleSubmitFailure() {
        this.formIsSubmitted = false;
        this.showError = true;
      },
      submitLessonData() {
        this.showError = false;
        // Return immediately if "submit" has already been clicked
        if (this.formIsSubmitted) {
          return;
        }
        if (this.isInEditMode && !this.lessonDetailsHaveChanged) {
          return this.closeModal();
        }
        this.formIsSubmitted = true;
        if (this.formIsValid) {
          if (this.isInEditMode) {
            return this.updateLesson()
              .then(updatedLesson => {
                this.handleSubmitSuccess();
                return this.updateCurrentLesson(updatedLesson);
              })
              .catch(() => {
                this.handleSubmitFailure();
              });
          } else {
            return this.createLesson()
              .then(newLesson => {
                this.handleSubmitSuccess();
                return this.$router.push(
                  lessonSummaryLink({ classId: this.classId, lessonId: newLesson.id })
                );
              })
              .catch(() => {
                this.handleSubmitFailure();
              });
          }
        }
      },
      createLesson() {
        return LessonResource.createModel({
          ...this.formData,
          resources: [],
          collection: this.classId,
        }).save();
      },
      updateLesson() {
        return LessonResource.getModel(this.currentLesson.id).save({ ...this.formData });
      },
      closeModal() {
        this.$emit('cancel');
      },
    },
    vuex: {
      getters: {
        classId: state => state.classId,
        currentLesson: state => state.pageState.currentLesson || null,
        groups: state => state.pageState.learnerGroups,
        // If the page name is (Lesson) SUMMARY, then should be in edit mode
        isInEditMode: state => state.pageName === LessonsPageNames.SUMMARY,
        currentLessonAssignedCollectionIds: state =>
          state.pageState.currentLesson.lesson_assignments.map(a => a.collection),
      },
      actions: {
        createSnackbar,
        updateCurrentLesson(store, lesson) {
          store.dispatch('SET_CURRENT_LESSON', lesson);
          return refreshLessonReport(store, lesson.id);
        },
      },
    },
    $trs: {
      cancel: 'Cancel',
      changesToLessonSaved: 'Changes to lesson saved',
      continue: 'Continue',
      description: 'Description',
      editingLessonDetails: 'Edit lesson details',
      newLesson: 'New lesson',
      newLessonCreated: 'New lesson created',
      required: 'This is required',
      save: 'Save',
      submitLessonError: 'There was a problem saving this lesson',
      title: 'Title',
      visibleTo: 'Visible to',
    },
  };

</script>

<style lang="stylus" scoped>

  fieldset
    border: none
    margin: 0
    padding: 0

  legend
    padding-top: 16px
    padding-bottom: 8px

</style>


Fix gap between navbar and content on mobile

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tum-rt/web-quiz.git/'


Close #4

Close #4

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/NathanielDavid/Sumie.git/'


docs(Core): remove keep-alive

docs(Core): remove keep-alive

<template>

      <router-view v-if="!loading" />

</template>

<template>

      <keep-alive>
        <router-view v-if="!loading" />
      </keep-alive>

</template>


fixed tools side bar

fixed tools side bar

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/codeweavers/Consign.git/'


Fix tiny layout bug in nav

Fix tiny layout bug in nav


refactored layout into components and fixed signup

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/alidcastano/alidcastano.github.io.git/'


update

update

update

<template lang="html">

test

</template>

error: pathspec 'generators/vue/templates/src/js/app.vue' did not match any file(s) known to git


select city

select city

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lijianqiang/open-plan-vue.git/'


hotfix mandatory member join date

hotfix mandatory member join date

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/chypriote/france-v2.git/'


update

update

update

error: pathspec 'lib/views/app.vue' did not match any file(s) known to git


Add comment

Add comment

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/zhaoyingjie/newBlog_Frontend.git/'


Add current to data (so it's reactive).

Add current to data (so it's reactive).

<template>

		<component :is="layout" />

				<Icon name="delete" width="20" height="20" />

 1">
				<Icon name="move" width="20" height="20" />

				<icon name="plus" width="15" height="15" viewBox="0 0 15 15" />

				<icon name="plus" width="15" height="15" viewBox="0 0 15 15" />

		<Icon name="move" width="20" height="20" />

	<resize-shim :onResize="onResize" />

</template>


Remove avatar from Person view.

Remove avatar from Person view.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ux4c/ux4c-admin.git/'


Add social profiles link for google

Add social profiles link for google

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/barprive/barprive.com.git/'


Fix for #931 - [Bug] Title is rendered twice when titleLocation is set to left


Get var from vue.resource

Get var from vue.resource

Signed-off-by: ZhiFeng Hu <abb672b28ca55a560b8a96028ef4fd2c71d0292b@gmail.com>

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lolipos/lolipos.git/'


create navbar component

create navbar component

<template>

					<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
						Toggle navigation

					</button>
					Amazon eBook

Book (current)

Reviews

Author

Contact

        </template>

error: pathspec 'projects/day6/book/src/components/navbar.vue' did not match any file(s) known to git


add information on pack page

add information on pack page

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/xuanyan0x7c7/geometry-pad.git/'


feat(component): 完成图表的数据更新方法

feat(component): 完成图表的数据更新方法

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ttaanngg/traffic-report.git/'


Added the ability to name snippets so they are useable, renaming is still incoming.


Invert QR code for WeChat compatibility

Invert QR code for WeChat compatibility

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/mplusmuseum/mplusmuseum-stories.git/'


Handle talk categories data

Handle talk categories data


Run the crawler through front end

Run the crawler through front end

<template lang="pug">
  v-layout(row wrap)
    v-flex(xs8).my-3
      h6 Run the traffic crawler
      p
        | congrats! You probably have haved register some routes or cities to crawl, now it's
        | time to run the crawler! There are two ways to run the crawler...

</template>

<script>
// import custom components

export default {
  name: 'RunCrawler',
  methods: {
    runCrawler() {
      this.$store.state.ws.send(JSON.stringify(['runCrawler']))
      this.$store.state.ws.onmessage = function (event) { }
    }
  }
}
</script>

error: pathspec 'web/src/components/QuickStart/RunCrawler.vue' did not match any file(s) known to git


Make clipboard component readonly to prevent input on mobile


Fixes no-scroll bug

Fixes no-scroll bug


Improve home link

Improve home link

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/praneetloke/vue-material.git/'


Add new comments component

Add new comments component

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/stefanjudis/stefan-judis-website.git/'


Fix the problem of multi menus' coexisting

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/m31271n/darkness.git/'


portal组件样式添加scoped

portal组件样式添加scoped

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/wuazhu/chinapost.git/'


handle content component seo settings

handle content component seo settings

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/notadd/administration.git/'


Sort shipments after updatedAt

Sort shipments after updatedAt

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/modum-io/web.git/'


change name to alid lorenzo

change name to alid lorenzo

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/alidcastano/alidcastano.github.io.git/'


Add activity component

Add activity component

<template>
  <div class="activityGraph" v-if="state.graph.data">
    <Plotly
      :config="state.graph.config"
      :data="state.graph.data"
      :layout="state.graph.layout"
      :style="state.graph.style"
      :useResizeHandler="true"
    />
  </div>
</template>

<script>
import Vue from 'vue';
import { reactive, watch } from '@vue/composition-api';
import { Plotly } from 'vue-plotly';

export default Vue.extend({
  name: 'ActivityGraph',
  components: {
    Plotly,
  },
  props: {
    graph: Object,
  },
  setup(props) {
    const state = reactive({
      graph: props.graph.activityChartGraph,
    });
    watch(
      () => props.graph,
      graph => {
        state.graph = graph.activityChartGraph;
      }
    );
    return { state };
  },
});
</script>

error: pathspec 'src/components/activity/ActivityGraph.vue' did not match any file(s) known to git


Remove log, fix offset

Remove log, fix offset

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JonathanTroyer/OC-Summer-2017-Table-Web.git/'


Finalize arrangement page

Finalize arrangement page


buttons hard to see

buttons hard to see

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/chrisamow/url-ingstad.git/'


Updated

Updated

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/CranePHP/core-ui.git/'


remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/sharkspeed/dororis.git/'


แก้บั๊ก grandstand toolsbox

แก้บั๊ก grandstand toolsbox

ตัวเลขไม่เปลี่ยนตรงแนวบันได

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bhurivaj/erp.git/'


Fix a11yclub link hover

Fix a11yclub link hover


DOCS: Added missing argument in code example (#702)

Tried one of the code examples and noticed that Vue gave the following warning:

[Vue warn]: Missing required prop: "value"
(found in <MdDialogPrompt>)

Added missing argument in code example.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/jaceks-iRonin/vue-material-test.git/'