BookingCalendarList: switch events for props

<template>

    <full-calendar
      ref="fullCalendar"

      :plugins="calendarPlugins"
      locale="en-gb"
      timeZone="Europe/London"
      :firstDay=1
      :eventSources="eventSources"

      @loading="loading"
      @unselect="unselect"
      @eventClick="eventClick"
      :datesDestroy="removeConfirmation"
      :viewSkeletonRender="viewSkeletonRender"

      :selectable=true
      :selectOverlap=false
      :selectMirror=true
      unselectCancel=".popover"
      :eventOverlap=false
      defaultView="bookingList"
      themeSystem="bootstrap"
      noEventsMessage="No bookings to display"
      :header="false"
      :footer="false"
      :visibleRange="visibleRange"
      :views="{
        bookingList: {
          type: 'list',
          duration: { days: 7 },
          eventTimeFormat: {
            hour12: false,
            hour: '2-digit',
            minute: '2-digit',
          },
        },
      }"
      />

</template>

<template>

    <full-calendar
      ref="fullCalendar"

      :plugins="calendarPlugins"
      locale="en-gb"
      timeZone="Europe/London"
      :firstDay=1
      :eventSources="eventSources"

      @loading="loading"
      @unselect="unselect"
      @eventClick="eventClick"
      @datesDestroy="removeConfirmation"
      @viewSkeletonRender="viewSkeletonRender"

      :selectable=true
      :selectOverlap=false
      :selectMirror=true
      unselectCancel=".popover"
      :eventOverlap=false
      defaultView="bookingList"
      themeSystem="bootstrap"
      noEventsMessage="No bookings to display"
      :header="false"
      :footer="false"
      :visibleRange="visibleRange"
      :views="{
        bookingList: {
          type: 'list',
          duration: { days: 7 },
          eventTimeFormat: {
            hour12: false,
            hour: '2-digit',
            minute: '2-digit',
          },
        },
      }"
      />

</template>


update: node results should appear on job edit page load

<template>

          {{$t('count.nodes.matched',[total,$tc('Node.count.vue',total)])}}

            {{ $t('loading.matched.nodes') }}

        maxShown">

                  {{$t('count.nodes.shown',[total,$tc('Node.count.vue',total)])}}

        <btn type="info btn-sm refresh_nodes pull-right"
             data-loading-text="${g.message(code: 'loading')}"
             @click="update"
             :disabled="loading"
             :title="$t('click.to.refresh')">
          {{ $t('refresh') }}

        </btn>

        <node-list-embed :nodes="nodeSet.nodes"
                         :tagsummary="nodeSet.tagsummary"
                         :show-exclude-filter-links="true"
                         @filter="handleFilter">

        </node-list-embed>

</template>


eslint update

eslint update

<template>
  <!-- TODO: Add loading and error handling here -->
  <div v-if="isReady">
    <uw-term-selector
      :current-quarter="quarter"
      :current-year="year"
      :all-tabs="instSchedule.related_terms"
      :selected-term="term"
    >
      <template #default="slotData">
        <uw-course-cards :term="slotData.tab.label" />
      </template>
    </uw-term-selector>
  </div>
</template>

<script>
import {mapGetters, mapState, mapActions} from 'vuex';
import CourseCards from './cards.vue';
import TermSelector from '../../_common/term-selector.vue';

export default {
  components: {
    'uw-course-cards': CourseCards,
    'uw-term-selector': TermSelector,
  },
  computed: {
    ...mapState({
      year: (state) => parseInt(state.termData.year),
      quarter: (state) => state.termData.quarter,
      term: (state) => {
        let term = window.location.pathname.replace("/teaching/", "");

        if (term !== "") {
          return term;
        }
        return `${state.termData.year},${state.termData.quarter}`;
      },
    }),
    ...mapState('inst_schedule', {
      instSchedule(state) {
        return state.value[this.term];
      },
    }),
    ...mapGetters('inst_schedule', {
      isReadyTagged: 'isReadyTagged',
      isErroredTagged: 'isErroredTagged',
    }),
    isReady() {
      return this.isReadyTagged(this.term);
    },
    isErrored() {
      return this.isErroredTagged(this.term);
    },
  },
  created() {
    this.fetch(this.term);
  },
  methods: {
    ...mapActions('inst_schedule', {
      fetch: 'fetch',
    }),
  },
};
</script>

<template>
  <!-- TODO: Add loading and error handling here -->
  <div v-if="isReady">
    <uw-term-selector
      :current-quarter="quarter"
      :current-year="year"
      :all-tabs="instSchedule.related_terms"
      :selectedTerm="term"
    >
      <template #default="slotData">
        <uw-course-cards :term="slotData.tab.label" />
      </template>
    </uw-term-selector>
  </div>
</template>

<script>
import {mapGetters, mapState, mapActions} from 'vuex';
import CourseCards from './cards.vue';
import TermSelector from '../../_common/term-selector.vue';

export default {
  components: {
    'uw-course-cards': CourseCards,
    'uw-term-selector': TermSelector,
  },
  computed: {
    ...mapState({
      year: (state) => parseInt(state.termData.year),
      quarter: (state) => state.termData.quarter,
      term: (state) => {
        let term = window.location.pathname.replace("/teaching/", "");

        if (term !== "") {
          return term;
        }
        return `${state.termData.year},${state.termData.quarter}`;
      },
    }),
    ...mapState('inst_schedule', {
      instSchedule(state) {
        return state.value[this.term];
      },
    }),
    ...mapGetters('inst_schedule', {
      isReadyTagged: 'isReadyTagged',
      isErroredTagged: 'isErroredTagged',
    }),
    isReady() {
      return this.isReadyTagged(this.term);
    },
    isErrored() {
      return this.isErroredTagged(this.term);
    },
  },
  created() {
    this.fetch(this.term);
  },
  methods: {
    ...mapActions('inst_schedule', {
      fetch: 'fetch',
    }),
  },
};
</script>


clean up text

clean up text

<template>

    <class-rename-modal
      v-if="showEditNameModal"
      :classname="currClass.name"
      :classid="currClass.id"
    />

{{currClass.name}}

      <mat-svg id="edit-icon" class="name-edit" category="image" name="edit" aria-hidden="true"/>

        {{$tr('tableTitle')}}

        <mat-svg class="icon" category="action" name="search" aria-hidden="true"/>
        <input
          id="search-field"
          :aria-label="$tr('searchText')"
          type="search"
          v-model="searchFilter"
          :placeholder="$tr('searchText')">

        <router-link :to="classEnrollLink" class="table-name">
          <icon-button
          class="enroll-user-button"
          :text="$tr('enrollUsers')"
          :primary="true"/>
        </router-link>

    <user-remove-modal
      v-if="showRemoveUserModal"
      :classname="currClass.name"
      :classid="currClass.id"
      :username="currentUserRemove.username"
      :userid="currentUserRemove.id"
    />

{{$tr('users')}}

           {{$tr('fullName')}}
           {{$tr('username')}}
           {{$tr('role')}}

              {{user.full_name}}

            {{user.username}}

              {{ user.kind === LEARNER ? $tr('learner') : $tr('coach') }}

              {{$tr('remove')}}

{{ $tr('noUsersExist') }}

{{ $tr('allUsersFilteredOut') }}

</template>


Added break after case

Added break after case

<template>
  <div v-if="fieldComponent">
    <component :is="fieldComponent" v-bind="{ field, value }" @value-change="v => $emit('value-change', v)" />
  </div>
</template>

<script>
  import IntegerField from './integer'
  import DecimalField from './decimal'
  import BooleanField from './boolean'
  import StringField from './string'
  import PasswordField from './password'
  import FileField from './file'
  import ValuesField from './values'

  export default {
    name: 'index',
    props: ['field', 'value'],
    components: {
      IntegerField
    },
    data () {
      let fieldComponent = null

      switch (this.field.type) {
        case 'integer':
          fieldComponent = IntegerField
          break
        case 'boolean':
          fieldComponent = BooleanField
          break
        case 'decimal':
          fieldComponent = DecimalField
          break
        case 'string':
          fieldComponent = StringField
          break
        case 'password':
          fieldComponent = PasswordField
          break
        case 'file':
          fieldComponent = FileField
          break
        case 'values':
          fieldComponent = ValuesField
          break
      }

      return {
        fieldComponent
      }
    }
  }
</script>

<style scoped>

</style>

<template>
  <div v-if="fieldComponent">
    <component :is="fieldComponent" v-bind="{ field, value }" @value-change="v => $emit('value-change', v)" />
  </div>
</template>

<script>
  import IntegerField from './integer'
  import DecimalField from './decimal'
  import BooleanField from './boolean'
  import StringField from './string'
  import PasswordField from './password'
  import FileField from './file'
  import ValuesField from './values'

  export default {
    name: 'index',
    props: ['field', 'value'],
    components: {
      IntegerField
    },
    data () {
      let fieldComponent = null

      switch (this.field.type) {
        case 'integer':
          fieldComponent = IntegerField
          break
        case 'boolean':
          fieldComponent = BooleanField
          break
        case 'decimal':
          fieldComponent = DecimalField
          break
        case 'string':
          fieldComponent = StringField
          break
        case 'password':
          fieldComponent = PasswordField
        case 'file':
          fieldComponent = FileField
          break
        case 'values':
          fieldComponent = ValuesField
          break
      }

      return {
        fieldComponent
      }
    }
  }
</script>

<style scoped>

</style>


docs(v-badge): remove unused show (#14453)

<template>
  <v-container>
    <v-row justify="space-around">
      <div>
        <v-btn
          class="mx-1"
          color="primary"
          @click="messages++"
        >
          Send Message
        </v-btn>

        <v-btn
          class="mx-1"
          color="error"
          @click="messages = 0"
        >
          Clear Notifications
        </v-btn>
      </div>

      <v-badge
        :content="messages"
        :value="messages"
        color="green"
        overlap
      >
        <v-icon large>
          mdi-vuetify
        </v-icon>
      </v-badge>
    </v-row>
  </v-container>
</template>

<script>
  export default {
    data () {
      return {
        messages: 0,
      }
    },
  }
</script>

<template>
  <v-container>
    <v-row justify="space-around">
      <div>
        <v-btn
          class="mx-1"
          color="primary"
          @click="messages++"
        >
          Send Message
        </v-btn>

        <v-btn
          class="mx-1"
          color="error"
          @click="messages = 0"
        >
          Clear Notifications
        </v-btn>
      </div>

      <v-badge
        :content="messages"
        :value="messages"
        color="green"
        overlap
      >
        <v-icon large>
          mdi-vuetify
        </v-icon>
      </v-badge>
    </v-row>
  </v-container>
</template>

<script>
  export default {
    data () {
      return {
        messages: 0,
        show: false,
      }
    },
  }
</script>


fix-up translations

fix-up translations

<template>

    <svg src="./progress-icons/notstarted.svg"></svg>

      {{ $tr('not_started') }}
      {{ $tr('not_watched') }}
      {{ $tr('not_listened') }}
      {{ $tr('not_viewed') }}

    <svg src="./progress-icons/inprogress.svg"></svg>

      {{ $tr('inProgress') }}

    <svg src="./progress-icons/complete.svg"></svg>

      {{ $tr('mastered') }}
      {{ $tr('watched') }}
      {{ $tr('listened') }}
      {{ $tr('viewed') }}

</template>

<template>

    <svg src="./progress-icons/notstarted.svg"></svg>

      {{ $tr('not') }} {{ $tr('started') }}
      {{ $tr('not') }} {{ $tr('watched') }}
      {{ $tr('not') }} {{ $tr('listened') }}
      {{ $tr('not') }} {{ $tr('viewed') }}

    <svg src="./progress-icons/inprogress.svg"></svg>

      {{ $tr('inProgress') }}

    <svg src="./progress-icons/complete.svg"></svg>

      {{ $tr('mastered') }}
      {{ $tr('Watched') }}
      {{ $tr('listened') }}
      {{ $tr('viewed') }}

</template>


Correct category items mobile actions menu displaying

<template>

      <v-toolbar
        color="#dedede"
        class="elevation-2"
      >
        <v-toolbar-title class="text-h2">

            <a
              :href="`#item-${itemUid}`"
              class="category-item-anchor"
            >#

              {{ itemName }}
              {{ itemName }}

                <a
                  v-if="this.itemHackage"
                  class="hackage-link"
                  target="_blank"
                  data-testid="CategoryItemToolbar-HackageLink"
                  :href="`https://hackage.haskell.org/package/${this.itemHackage}`"
                >
                  <v-icon
                    color="#fff"
                    size="0.6rem"
                  >$vuetify.icons.link</v-icon>hackage

        </v-toolbar-title>

        <v-spacer></v-spacer>

        <v-toolbar-items ref="categoryItemActions">

            <category-item-btn
              titleTooltip
              size="40px"
              iconSize="18"
              title="Move item up"
              data-testid="CategoryItemToolbar-MoveUpBtn"
              icon="arrow-up"
              @click="moveItem('up')"
            />
            <category-item-btn
              titleTooltip
              size="40px"
              iconSize="18"
              title="Move item down"
              data-testid="CategoryItemToolbar-MoveDownBtn"
              icon="arrow-down"
              @click="moveItem('down')"
            />
            <category-item-btn
              titleTooltip
              size="40px"
              iconSize="18"
              title="Edit item info"
              data-testid="CategoryItemToolbar-EditInfoBtn"
              icon="cog"
              @click="toggleEditItemInfoMenu"
            >
              <v-icon
                v-if="isItemInfoEdited"
                class="unsaved-changes-icon"
                color="#6495ed"
                size="8"
              >$vuetify.icons.circle</v-icon>
            </category-item-btn>

            <category-item-btn
              titleTooltip
              size="40px"
              iconSize="18"
              title="Delete item"
              icon="trash-alt"
              data-testid="CategoryItemToolbar-DeleteBtn"
              @click="deleteItem"
            />

          <v-menu
            bottom
            left
            offset-y
            :attach="$refs.categoryItemActions && $refs.categoryItemActions.$el"
          >
            <template v-slot:activator="{ on }">
              <v-btn
                icon
                small
                :ripple="false"
                aria-label="Actions"
                v-tooltip="'Actions'"
                class="category-toolbar-mobile-menu-btn"
                data-testid="CategoryItemToolbar-MobileMenuBtn"
                v-on="on"
              >
                <v-icon
                  size="18"
                  color="grey darken-2"
                >$vuetify.icons.bars</v-icon>
              </v-btn>
            </template>

            <v-list class="category-item-toolbar__mobile-menu-list">
              <v-list-item>
                <category-item-btn
                  block
                  text
                  showTitle
                  iconSize="18"
                  title="Move item up"
                  icon="arrow-up"
                  data-testid="CategoryItemToolbar-MoveUpBtn"
                  @click="moveItem('up')"
                />
              </v-list-item>
              <v-list-item>
                <category-item-btn
                  block
                  text
                  showTitle
                  iconSize="18"
                  title="Move item down"
                  icon="arrow-down"
                  data-testid="CategoryItemToolbar-MoveDownBtn"
                  @click="moveItem('down')"
                />
              </v-list-item>
              <v-list-item>
                <category-item-btn
                  block
                  text
                  showTitle
                  iconSize="18"
                  title="Edit item info"
                  icon="cog"
                  data-testid="CategoryItemToolbar-EditInfoBtn"
                  @click="toggleEditItemInfoMenu"
                >
                  <v-icon
                    v-if="isItemInfoEdited"
                    class="unsaved-changes-icon"
                    color="#6495ed"
                    size="8"
                  >$vuetify.icons.circle</v-icon>
                </category-item-btn>
              </v-list-item>
              <v-list-item>
                <category-item-btn
                  block
                  text
                  showTitle
                  iconSize="18"
                  title="Delete item"
                  icon="trash-alt"
                  data-testid="CategoryItemToolbar-DeleteBtn"
                  @click="deleteItem"
                />
              </v-list-item>
            </v-list>
          </v-menu>
        </v-toolbar-items>
      </v-toolbar>

      <v-layout column class="pa-3">
        <v-flex>
          <v-form
            @keydown.native.enter.ctrl="updateItemInfo"
            @keydown.native.enter.meta="updateItemInfo"
          >
            <v-text-field
              v-model="itemNameEdit"
              data-testid="CategoryItemToolbar-InfoEdit-NameInput"
              label="Name"
            />
            <v-text-field
              v-model="itemHackageEdit"
              data-testid="CategoryItemToolbar-InfoEdit-HackageInput"
              label="Name on Hackage (optional)"
            />
            <v-text-field
              v-model="itemLinkEdit"
              data-testid="CategoryItemToolbar-InfoEdit-LinkInput"
              label="Site (optional)"
            />
          </v-form>
        </v-flex>
        <v-flex align-self-end>
          <v-btn
            class="mr-1"
            aria-label="Cancel"
            @click="resetAndToggleEditItemInfoMenu"
          >
            Cancel
          </v-btn>
          <v-btn
            color="info"
            aria-label="Save"
            :disabled="!isInfoSaveEnabled"
            data-testid="CategoryItemToolbar-InfoEdit-SaveBtn"
            @click="updateItemInfo"
          >
            Save
          </v-btn>
        </v-flex>
      </v-layout>

</template>

<template>

      <v-toolbar
        color="#dedede"
        class="elevation-2"
      >
        <v-toolbar-title class="text-h2">

            <a
              :href="`#item-${itemUid}`"
              class="category-item-anchor"
            >#

              {{ itemName }}
              {{ itemName }}

                <a
                  v-if="this.itemHackage"
                  class="hackage-link"
                  target="_blank"
                  data-testid="CategoryItemToolbar-HackageLink"
                  :href="`https://hackage.haskell.org/package/${this.itemHackage}`"
                >
                  <v-icon
                    color="#fff"
                    size="0.6rem"
                  >$vuetify.icons.link</v-icon>hackage

        </v-toolbar-title>

        <v-spacer></v-spacer>

        <v-toolbar-items class="category-item__actions">

            <category-item-btn
              titleTooltip
              size="40px"
              iconSize="18"
              title="Move item up"
              data-testid="CategoryItemToolbar-MoveUpBtn"
              icon="arrow-up"
              @click="moveItem('up')"
            />
            <category-item-btn
              titleTooltip
              size="40px"
              iconSize="18"
              title="Move item down"
              data-testid="CategoryItemToolbar-MoveDownBtn"
              icon="arrow-down"
              @click="moveItem('down')"
            />
            <category-item-btn
              titleTooltip
              size="40px"
              iconSize="18"
              title="Edit item info"
              data-testid="CategoryItemToolbar-EditInfoBtn"
              icon="cog"
              @click="toggleEditItemInfoMenu"
            >
              <v-icon
                v-if="isItemInfoEdited"
                class="unsaved-changes-icon"
                color="#6495ed"
                size="8"
              >$vuetify.icons.circle</v-icon>
            </category-item-btn>

            <category-item-btn
              titleTooltip
              size="40px"
              iconSize="18"
              title="Delete item"
              icon="trash-alt"
              data-testid="CategoryItemToolbar-DeleteBtn"
              @click="deleteItem"
            />

          <v-menu
            bottom
            left
            offset-y
            attach=".category-item__actions"
          >
            <template v-slot:activator="{ on }">
              <v-btn
                icon
                small
                :ripple="false"
                aria-label="Actions"
                v-tooltip="'Actions'"
                class="category-toolbar-mobile-menu-btn"
                data-testid="CategoryItemToolbar-MobileMenuBtn"
                v-on="on"
              >
                <v-icon
                  size="18"
                  color="grey darken-2"
                >$vuetify.icons.bars</v-icon>
              </v-btn>
            </template>

            <v-list class="category-item-toolbar__mobile-menu-list">
              <v-list-item>
                <category-item-btn
                  block
                  text
                  showTitle
                  iconSize="18"
                  title="Move item up"
                  icon="arrow-up"
                  data-testid="CategoryItemToolbar-MoveUpBtn"
                  @click="moveItem('up')"
                />
              </v-list-item>
              <v-list-item>
                <category-item-btn
                  block
                  text
                  showTitle
                  iconSize="18"
                  title="Move item down"
                  icon="arrow-down"
                  data-testid="CategoryItemToolbar-MoveDownBtn"
                  @click="moveItem('down')"
                />
              </v-list-item>
              <v-list-item>
                <category-item-btn
                  block
                  text
                  showTitle
                  iconSize="18"
                  title="Edit item info"
                  icon="cog"
                  data-testid="CategoryItemToolbar-EditInfoBtn"
                  @click="toggleEditItemInfoMenu"
                >
                  <v-icon
                    v-if="isItemInfoEdited"
                    class="unsaved-changes-icon"
                    color="#6495ed"
                    size="8"
                  >$vuetify.icons.circle</v-icon>
                </category-item-btn>
              </v-list-item>
              <v-list-item>
                <category-item-btn
                  block
                  text
                  showTitle
                  iconSize="18"
                  title="Delete item"
                  icon="trash-alt"
                  data-testid="CategoryItemToolbar-DeleteBtn"
                  @click="deleteItem"
                />
              </v-list-item>
            </v-list>
          </v-menu>
        </v-toolbar-items>
      </v-toolbar>

      <v-layout column class="pa-3">
        <v-flex>
          <v-form
            @keydown.native.enter.ctrl="updateItemInfo"
            @keydown.native.enter.meta="updateItemInfo"
          >
            <v-text-field
              v-model="itemNameEdit"
              data-testid="CategoryItemToolbar-InfoEdit-NameInput"
              label="Name"
            />
            <v-text-field
              v-model="itemHackageEdit"
              data-testid="CategoryItemToolbar-InfoEdit-HackageInput"
              label="Name on Hackage (optional)"
            />
            <v-text-field
              v-model="itemLinkEdit"
              data-testid="CategoryItemToolbar-InfoEdit-LinkInput"
              label="Site (optional)"
            />
          </v-form>
        </v-flex>
        <v-flex align-self-end>
          <v-btn
            class="mr-1"
            aria-label="Cancel"
            @click="resetAndToggleEditItemInfoMenu"
          >
            Cancel
          </v-btn>
          <v-btn
            color="info"
            aria-label="Save"
            :disabled="!isInfoSaveEnabled"
            data-testid="CategoryItemToolbar-InfoEdit-SaveBtn"
            @click="updateItemInfo"
          >
            Save
          </v-btn>
        </v-flex>
      </v-layout>

</template>


Disable protocol register button if lockNetwork is enabled

Fixes #3569

<template>

			<SidebarToggle />

		<form ref="settingsForm" class="container" @change="onChange" @submit.prevent>

Settings

						<input
							:checked="$store.state.settings.advanced"
							type="checkbox"
							name="advanced"
						/>
						Advanced settings

Native app

					<button
						v-if="hasInstallPromptEvent"
						type="button"
						class="btn"
						@click.prevent="nativeInstallPrompt"
					>
						Add The Lounge to Home screen
					</button>
					<button
						v-if="canRegisterProtocol"
						type="button"
						class="btn"
						@click.prevent="registerProtocol"
					>
						Open irc:// URLs with The Lounge
					</button>

						Settings synchronisation

							<button
								class="extra-experimental"
								aria-label="Note: This is an experimental feature and may change in future releases."
							/>

						<input
							:checked="$store.state.settings.syncSettings"
							type="checkbox"
							name="syncSettings"
						/>
						Synchronize settings with other clients

					<template v-if="!$store.state.settings.syncSettings">

								Warning: Checking this box will override the
								settings of this client with those stored on the server.

								Use the button below to enable synchronization, and override any
								settings already synced to the server.

							<button type="button" class="btn btn-small" @click="onForceSyncClick">
								Sync settings and enable
							</button>

								Warning: No settings have been synced before.
								Enabling this will sync all settings of this client as the base for
								other clients.

					</template>

Messages

						<input :checked="$store.state.settings.motd" type="checkbox" name="motd" />
						Show MOTD

						<input
							:checked="$store.state.settings.showSeconds"
							type="checkbox"
							name="showSeconds"
						/>
						Show seconds in timestamp

Automatic away message

						Automatic away message
						<input
							id="awayMessage"
							:value="$store.state.settings.awayMessage"
							type="text"
							name="awayMessage"
							class="input"
							placeholder="Away message if The Lounge is not open"
						/>

						Status messages

							<button
								class="extra-help"
								aria-label="Joins, parts, kicks, nick changes, away changes, and mode changes"
							/>

						<input
							:checked="$store.state.settings.statusMessages === 'shown'"
							type="radio"
							name="statusMessages"
							value="shown"
						/>
						Show all status messages individually

						<input
							:checked="$store.state.settings.statusMessages === 'condensed'"
							type="radio"
							name="statusMessages"
							value="condensed"
						/>
						Condense status messages together

						<input
							:checked="$store.state.settings.statusMessages === 'hidden'"
							type="radio"
							name="statusMessages"
							value="hidden"
						/>
						Hide all status messages

Visual Aids

						<input
							:checked="$store.state.settings.coloredNicks"
							type="checkbox"
							name="coloredNicks"
						/>
						Enable colored nicknames

						<input
							:checked="$store.state.settings.autocomplete"
							type="checkbox"
							name="autocomplete"
						/>
						Enable autocomplete

							Nick autocomplete postfix (e.g. , )

						<input
							id="nickPostfix"
							:value="$store.state.settings.nickPostfix"
							type="text"
							name="nickPostfix"
							class="input"
							placeholder="Nick autocomplete postfix (e.g. ', ')"
						/>

Theme

					Theme
					<select
						id="theme-select"
						:value="$store.state.settings.theme"
						name="theme"
						class="input"
					>
						<option
							v-for="theme in $store.state.serverConfiguration.themes"
							:key="theme.name"
							:value="theme.name"
						>
							{{ theme.displayName }}
						</option>
					</select>

				<template v-if="$store.state.settings.prefetch">

Link previews

							<input
								:checked="$store.state.settings.media"
								type="checkbox"
								name="media"
							/>
							Auto-expand media

							<input
								:checked="$store.state.settings.links"
								type="checkbox"
								name="links"
							/>
							Auto-expand websites

				</template>

				<template v-if="!$store.state.serverConfiguration.public">

Push Notifications

						<button
							id="pushNotifications"
							type="button"
							class="btn"
							:disabled="
								$store.state.pushNotificationState !== 'supported' &&
									$store.state.pushNotificationState !== 'subscribed'
							"
							@click="onPushButtonClick"
						>
							<template v-if="$store.state.pushNotificationState === 'subscribed'">
								Unsubscribe from push notifications
							</template>
							<template v-else-if="$store.state.pushNotificationState === 'loading'">
								Loading…
							</template>
							<template v-else>
								Subscribe to push notifications
							</template>
						</button>

							Warning: Push notifications are only supported over
							HTTPS connections.

							Warning:
							Push notifications are not supported by your browser.

				</template>

Browser Notifications

						<input
							id="desktopNotifications"
							:checked="$store.state.settings.desktopNotifications"
							type="checkbox"
							name="desktopNotifications"
						/>
						Enable browser notifications

							Warning: Notifications are not supported by your
							browser.

							Warning: Notifications are blocked by your browser.

						<input
							:checked="$store.state.settings.notification"
							type="checkbox"
							name="notification"
						/>
						Enable notification sound

						<button id="play" @click.prevent="playNotification">Play sound</button>

						<input
							:checked="$store.state.settings.notifyAllMessages"
							type="checkbox"
							name="notifyAllMessages"
						/>
						Enable notification for all messages

							Custom highlights (comma-separated keywords)

						<input
							id="highlights"
							:value="$store.state.settings.highlights"
							type="text"
							name="highlights"
							class="input"
							placeholder="Custom highlights (comma-separated keywords)"
						/>

Change password

							Enter current password

						<RevealPassword v-slot:default="slotProps">
							<input
								id="old_password_input"
								:type="slotProps.isVisible ? 'text' : 'password'"
								name="old_password"
								class="input"
								placeholder="Enter current password"
							/>
						</RevealPassword>

							Enter desired new password

						<RevealPassword v-slot:default="slotProps">
							<input
								id="new_password_input"
								:type="slotProps.isVisible ? 'text' : 'password'"
								name="new_password"
								class="input"
								placeholder="Enter desired new password"
							/>
						</RevealPassword>

							Repeat new password

						<RevealPassword v-slot:default="slotProps">
							<input
								id="verify_password_input"
								:type="slotProps.isVisible ? 'text' : 'password'"
								name="verify_password"
								class="input"
								placeholder="Repeat new password"
							/>
						</RevealPassword>

						Successfully updated your password

						{{ passwordErrors[passwordChangeStatus.error] }}

						<button type="submit" class="btn" @click.prevent="changePassword">
							Change password
						</button>

Custom Stylesheet

						Custom stylesheet. You can override any style with CSS here.

					<textarea
						id="user-specified-css-input"
						:value="$store.state.settings.userStyles"
						class="input"
						name="userStyles"
						placeholder="/* You can override any style with CSS here */"
					/>

Sessions

Current session

					<Session :session="$store.getters.currentSession" />

Other sessions

Loading…

						You are not currently logged in to any other device.

					<template v-else>
						<Session
							v-for="session in $store.getters.otherSessions"
							:key="session.token"
							:session="session"
						/>
					</template>

		</form>

</template>


applicationList: add missing components

applicationList: add missing components

<template>
  <div class="bg-white">
    <q-list no-border>
      <ApplicationItem
        v-for="a in pending"
        :key="a.id"
        :application="a"
        @accept="$emit('accept', arguments[0])"
        @decline="$emit('decline', arguments[0])"
        @openChat="$emit('openChat', arguments[0])"
      />
      <q-item-separator />
      <q-collapsible
        v-if="otherApplications.length > 0"
        icon="fas fa-archive"
        :label="$t('APPLICATION.PAST')"
        :sublabel="othersSublabel"
        @show="showOthers = true"
        @hide="showOthers = false"
      >
        <template v-if="showOthers">
          <ApplicationItem
            v-for="a in otherApplications"
            :key="a.id"
            :application="a"
            @openChat="$emit('openChat', arguments[0])"
          />
        </template>
      </q-collapsible>
    </q-list>
  </div>
</template>

<script>
import ApplicationItem from './ApplicationItem'
import {
  QCollapsible,
  QItemSeparator,
  QList,
} from 'quasar'

export default {
  components: {
    ApplicationItem,
    QCollapsible,
    QItemSeparator,
    QList,
  },
  props: {
    pending: {
      type: Array,
      default: null,
    },
    otherApplications: {
      type: Array,
      default: null,
    },
  },
  data () {
    return {
      showOthers: false,
    }
  },
  computed: {
    othersSublabel () {
      return this.$tc('ENTRY', this.otherApplications.length, { count: this.otherApplications.length })
    },
  },
}
</script>

<style scoped lang="stylus">
</style>

<template>
  <div class="bg-white">
    <q-list no-border>
      <ApplicationItem
        v-for="a in pending"
        :key="a.id"
        :application="a"
        @accept="$emit('accept', arguments[0])"
        @decline="$emit('decline', arguments[0])"
        @openChat="$emit('openChat', arguments[0])"
      />
      <q-item-separator />
      <q-collapsible
        v-if="otherApplications.length > 0"
        icon="fas fa-archive"
        :label="$t('APPLICATION.PAST')"
        :sublabel="othersSublabel"
        @show="showOthers = true"
        @hide="showOthers = false"
      >
        <template v-if="showOthers">
          <ApplicationItem
            v-for="a in otherApplications"
            :key="a.id"
            :application="a"
            @openChat="$emit('openChat', arguments[0])"
          />
        </template>
      </q-collapsible>
    </q-list>
  </div>
</template>

<script>
import ApplicationItem from './ApplicationItem'
import { QCard, QCollapsible } from 'quasar'

export default {
  components: {
    ApplicationItem, QCard, QCollapsible,
  },
  props: {
    pending: {
      type: Array,
      default: null,
    },
    otherApplications: {
      type: Array,
      default: null,
    },
  },
  data () {
    return {
      showOthers: false,
    }
  },
  computed: {
    othersSublabel () {
      return this.$tc('ENTRY', this.otherApplications.length, { count: this.otherApplications.length })
    },
  },
}
</script>

<style scoped lang="stylus">
</style>


typo fixed

typo fixed

<template>

    <ih1 :model="{value: 'Calendar'}"></ih1>

    <ih2 :model="{value: '引用'}"></ih2>

          http://pic.lvmama.com/min/index.php?f=/styles/lv/buttons.css

          http://pic.lvmama.com/min/index.php?f=/styles/lv/calendar.css

          http://pic.lvmama.com/min/index.php?f=/js/lv/calendar.js

    <ih2 :model="{value: '实例'}"></ih2>

    <ih3 :model="{value: '前台日历控件浮层－出生日期'}"></ih3>

      <input type="text" id="birthdayInput" readonly="readonly">

      调用文档

    <ih3 :model="{value: 'VST后台区间日历控件'}"></ih3>

      <input type="text" class="vstInput" readonly="readonly">

      <input type="text" class="vstInput" readonly="readonly">

      调用文档

    <ih3 :model="{value: 'VST后台区间日历时间控件'}"></ih3>

      <input type="text" class="vstHasTimeInput" readonly="readonly">

      <input type="text" class="vstHasTimeInput" readonly="readonly">

      调用文档

</template>

<template>

    <ih1 :model="{value: 'Calendar'}"></ih1>

    <ih2 :model="{value: '引用'}"></ih2>

          http://pic.lvmama.com/min/index.php?f=/styles/lv/button.css

          http://pic.lvmama.com/min/index.php?f=/styles/lv/calendar.css

          http://pic.lvmama.com/min/index.php?f=/js/lv/calendar.js

    <ih2 :model="{value: '实例'}"></ih2>

    <ih3 :model="{value: '前台日历控件浮层－出生日期'}"></ih3>

      <input type="text" id="birthdayInput" readonly="readonly">

      调用文档

    <ih3 :model="{value: 'VST后台区间日历控件'}"></ih3>

      <input type="text" class="vstInput" readonly="readonly">

      <input type="text" class="vstInput" readonly="readonly">

      调用文档

    <ih3 :model="{value: 'VST后台区间日历时间控件'}"></ih3>

      <input type="text" class="vstHasTimeInput" readonly="readonly">

      <input type="text" class="vstHasTimeInput" readonly="readonly">

      调用文档

</template>


[Client] Show more images

[Client] Show more images

<template>

<fa icon="spinner" pulse fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/>

 0">
		<a v-for="image in images"
			class="img"
			:style="`background-image: url(${image.media.thumbnailUrl})`"
			:href="image.note | notePage"
		>

{{ $t('no-photos') }}

</template>


length undefined bug fixed

length undefined bug fixed

<template>

        Projects

          <ProjectSelectionRow
                        v-bind:id="metamodel.id"
                        v-bind:name="metamodel.name"
                        v-bind:is-selected="gdslProject && metamodel.id === gdslProject.id" />

        There are no projects.

        <form>

            <input v-model="inputProjectName" v-on:keyup.enter="createProject" type="text" class="form-control"
                   id="inputProjectName" placeholder="New project name" autocomplete="off">

                <button v-on:click="createProject" type=button id="btnCreateMetaModel" class="btn btn-default"
                        data-toggle="#tooltip" title="Create project">

                </button>

                <button type="button" class="btn btn-default" data-toggle="modal" data-target="#importModal"
                        title="Import project">

                </button>

                    Import project
                    <button id="close-import-modal" type="button" class="close" data-dismiss="modal"
                            aria-label="Close">
                      ×
                    </button>

                      <input v-on:change="onFileChange" ref="file" type="file" accept=".zeta" name="file" id="file">

                        {{ uploadText }}

                    <input v-model="importProjectName" type="text" class="form-control" id="importProjectName"
                           placeholder="New Project Name" autocomplete="off">

                    <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
                    <button v-on:click="importProject" id="start-import-btn" type="button" class="btn btn-info"
                            data-dismiss="modal" :disabled="!(isValidZetaProjectFile() && isValidProjectName())">
                      Import
                    </button>

        </form>

</template>


feat(textfield): implement mdc v0.27.0

feat(textfield): implement mdc v0.27.0

https://github.com/material-components/material-components-web/issues/1684

<template>

      <textarea ref="input" :class="inputClasses"
        :value="value" @input="updateValue($event.target.value)"
        :rows="rows"
        :minlength="minlength" :maxlength="maxlength"
        :aria-controls="'help-'+_uid"
        :placeholder="label"
        :aria-label="label" >
        ></textarea>

      <textarea ref="input" :class="inputClasses" :id="_uid"
        :value="value" @input="updateValue($event.target.value)"
        :rows="rows" :cols="cols"
        :minlength="minlength" :maxlength="maxlength"
        :aria-controls="'help-'+_uid"
        ></textarea>

        {{ label }}

      <input ref="input" :class="inputClasses" :type="type"
        :value="value" @input="updateValue($event.target.value)"
        :required="required"
        :minlength="minlength" :maxlength="maxlength"
        :aria-controls="'help-'+_uid"
        :placeholder="label"
        :aria-label="label" >

      <input ref="input" :class="inputClasses" :type="type" :id="_uid"
        :value="value" @input="updateValue($event.target.value)"
        :required="required" :size="size"
        :minlength="minlength" :maxlength="maxlength"
        :aria-controls="'help-'+_uid">

        {{ label }}

      {{ helptext  }}

</template>


Resolve MUWM-5006

Resolve MUWM-5006

<template>

          YOU ARE CURRENTLY OVERRIDING AS ANOTHER USER. Overriding is read-only and
          no actions will be saved.
           Back to MyUW Support tool

        <uw-search />

              {{ netid }}

              Email error
              Email
              Search
              Sign Out

        <div
          class="container-xl px-3 myuw-brand-logo"
          :style="`background-image: url(${staticUrl}images/w-logo-white.png);`"
        >
          <button
            v-b-toggle.nav-collapse
            type="button"
            class="btn btn-link btn-sm d-lg-none p-0 border-0 text-white"
            title="Toggle Navigation Menu"
          >

          </button>

            <template v-if="$mq != 'desktop'">
              <template v-if="page.title == 'Home'"> MyUW </template>
              <template v-else>
                MyUW

                  <template v-if="page.title.includes('Preview')"> Preview Quarter </template>
                  <template v-else-if="page.title.includes('Textbooks')"> Textbooks </template>
                  <template v-else>
                    {{ page.title }}
                  </template>

              </template>
            </template>
            <template v-else>
              MyUW
            </template>

    <uw-messages v-if="$mq === 'desktop'" />

                  Home

                  Academics

                    Husky Experience

                    Teaching

                    Accounts

                    Notices

                    Profile

                     Navigation separator

                    Calendar

                    UW Resources

            <uw-welcome v-if="$mq === 'desktop'" />

              <uw-messages />

              {{ page.title }}

              <slot v-if="$mq === 'mobile'" name="mobile" />
              <slot v-else name="desktop" />

              Contact

              MyUW Help

             Sign Out

              Terms

              Privacy

          © {{ new Date().getFullYear() }} University of Washington

        Watch a video tour of
        MyUW for Instructors,
        for staff, or
        for students.
Visit the MyUW help guide for more information.

      <template #modal-footer="{ hide }">
        <button slot-scope="" type="button" class="btn btn-primary btn-sm" @click="hide()">
          Close
        </button>
      </template>

</template>


Возможность выбрать столбец по клику по нему

<template>

  <transition appear name="fade" mode="out-in">

{{ $t('PICKER_TEXT') }}

          <template v-for="(cells, i) in elements">
            <template v-for="(cell, j) in cells">

{{ cell[syllabaryIndex] ? cell[syllabaryIndex] : ' ' }}

{{ cell[answerIndex] ? cell[answerIndex] : ' ' }}

            </template>
          </template>
          <template v-for="i in elements[0].length">

                <input
                  :id="`column_${i - 1}`"
                  class="cursor-pointer"
                  type="checkbox"
                  :value="i - 1"
                  v-model="checkedColumns"
                  @change="pickElements">

          </template>

          <button class="btn btn-primary mb-2 mr-2" :disabled="this.picked.length < 2" @click="practice">{{ $t('PRACTICE') }}</button>
          <button class="btn btn-default mb-2 mr-2" @click="checkAll">{{ $t('CHECK_ALL') }}</button>
          <button class="btn btn-default mb-2 mr-2" @click="uncheckAll">{{ $t('UNCHECK_ALL') }}</button>
          <transition name="fade-fast" mode="out-in">
            <button class="btn btn-default mb-2" @click="switchSyllabary" :key="syllabaryLabel">{{ syllabaryLabel }}</button>
          </transition>

{{ $t('PRACTICE_TEXT') }}

{{ question }}

{{ answer }}

            <input
              class="form-control text-center"
              autocapitalize="none"
              placeholder="kana"
              :autofocus="focus"
              :value="input"
              @input="checkInput($event.target.value)"
              @keydown.space.prevent="revealAnswer">

<button class="btn btn-default" @click="pick">{{ $t('BACK_TO_PICKER') }}</button>

 0">{{ $t('ANSWERED', { answered }) }}

  </transition>

</template>

<template>

  <transition appear name="fade" mode="out-in">

{{ $t('PICKER_TEXT') }}

          <template v-for="(cells, i) in elements">
            <template v-for="cell in cells">

{{ cell[syllabaryIndex] ? cell[syllabaryIndex] : ' ' }}

{{ cell[answerIndex] ? cell[answerIndex] : ' ' }}

            </template>
          </template>
          <template v-for="i in elements[0].length">

                <input
                  class="cursor-pointer"
                  type="checkbox"
                  :value="i - 1"
                  v-model="checkedColumns"
                  @change="pickElements">

          </template>

          <button class="btn btn-primary mb-2 mr-2" :disabled="this.picked.length < 2" @click="practice">{{ $t('PRACTICE') }}</button>
          <button class="btn btn-default mb-2 mr-2" @click="checkAll">{{ $t('CHECK_ALL') }}</button>
          <button class="btn btn-default mb-2 mr-2" @click="uncheckAll">{{ $t('UNCHECK_ALL') }}</button>
          <transition name="fade-fast" mode="out-in">
            <button class="btn btn-default mb-2" @click="switchSyllabary" :key="syllabaryLabel">{{ syllabaryLabel }}</button>
          </transition>

{{ $t('PRACTICE_TEXT') }}

{{ question }}

{{ answer }}

            <input
              class="form-control text-center"
              autocapitalize="none"
              placeholder="kana"
              :autofocus="focus"
              :value="input"
              @input="checkInput($event.target.value)"
              @keydown.space.prevent="revealAnswer">

<button class="btn btn-default" @click="pick">{{ $t('BACK_TO_PICKER') }}</button>

 0">{{ $t('ANSWERED', { answered }) }}

  </transition>

</template>


img lazy load

img lazy load


added album and artist navigation via song list context menu

<template>

            Play
            Pause

            Go to Album

            Go to Artist

Add To

Bottom of Queue

Top of Queue

Favorites

{{ playlist.name }}

Edit

</template>

<template>

            Play
            Pause

Add To

Bottom of Queue

Top of Queue

Favorites

{{ playlist.name }}

Edit

</template>