PRO-1391 PRO-1392 restore ability to move pages, with correct enforcment (#3088)

<template>
  <VueDraggable
    tag="ol"
    class="apos-tree__list"
    :list="myRows"
    v-bind="dragOptions"
    @start="startDrag"
    @end="endDrag"
  >

        <button
          v-if="row._children && row._children.length > 0"
          class="apos-tree__row__toggle" data-apos-tree-toggle
          aria-label="Toggle section" :aria-expanded="!options.startCollapsed"
          @click="toggleSection($event)"
        >
          <AposIndicator
            icon="chevron-down-icon"
            class="apos-tree__row__toggle-icon"
          />
        </button>
        <component
          v-for="(col, index) in headers"
          :key="`${col.property}-${index}`"
          :is="getEffectiveType(col, row)"
          :draft="row"
          :published="row._publishedDoc"
          :header="col"
          :href="(getEffectiveType(col, row) === 'a') ? row[col.property] : false"
          :target="col.type === 'link' ? '_blank' : false"
          :class="getCellClasses(col, row)"
          :disabled="getCellDisabled(col, row)"
          :data-col="col.property"
          :style="getCellStyles(col.property, index)"
          @click="((getEffectiveType(col, row) === 'button') && col.action) ? $emit(col.action, row._id) : null"
        >
          <AposIndicator
            v-if="options.draggable && index === 0 && !row.parked"
            icon="drag-icon"
            class="apos-tree__row__icon apos-tree__row__icon--handle"
          />
          <AposIndicator
            v-if="index === 0 && row.parked && row.type !== '@apostrophecms/archive-page'"
            icon="lock-icon"
            class="apos-tree__row__icon apos-tree__row__icon--parked"
            tooltip="This page is parked and cannot be moved"
          />
          <AposIndicator
            v-if="index === 0 && row.type === '@apostrophecms/archive-page'"
            icon="lock-icon"
            class="apos-tree__row__icon apos-tree__row__icon--parked"
            tooltip="You cannot move the Archive"
          />
          <AposCheckbox
            v-if="options.bulkSelect && index === 0"
            class="apos-tree__row__checkbox"
            tabindex="-1"
            :field="{
              name: row._id,
              hideLabel: true,
              label: `Toggle selection of ${row.title}`,
              disableFocus: true
            }"
            :choice="{ value: row._id }"
            v-model="checkedProxy"
          />

            <AposIndicator
              v-if="getEffectiveIcon(col, row)"
              :icon="getEffectiveIcon(col, row)"
              class="apos-tree__cell__icon"
              :icon-size="getEffectiveIconSize(col, row)"
            />

              {{ getEffectiveCellLabel(col, row) }}

        </component>

      <AposTreeRows
        data-apos-branch-height
        :data-list-row="row._id"
        ref="tree-branches"
        :rows="row._children"
        :headers="headers"
        :icons="icons"
        :col-widths="colWidths"
        :level="level + 1"
        :nested="nested"
        :list-id="row._id"
        :tree-id="treeId"
        :options="options"
        :class="{ 'is-collapsed': options.startCollapsed }"
        :style="{
          'max-height': options.startCollapsed ? '0' : null
        }"
        @update="$emit('update', $event)"
        v-model="checkedProxy"
      />

  </VueDraggable>
</template>

<template>
  <VueDraggable
    tag="ol"
    class="apos-tree__list"
    :list="myRows"
    v-bind="dragOptions"
    @start="startDrag"
    @end="endDrag"
  >

        <button
          v-if="row._children && row._children.length > 0"
          class="apos-tree__row__toggle" data-apos-tree-toggle
          aria-label="Toggle section" :aria-expanded="!options.startCollapsed"
          @click="toggleSection($event)"
        >
          <AposIndicator
            icon="chevron-down-icon"
            class="apos-tree__row__toggle-icon"
          />
        </button>
        <component
          v-for="(col, index) in headers"
          :key="`${col.property}-${index}`"
          :is="getEffectiveType(col, row)"
          :draft="row"
          :published="row._publishedDoc"
          :header="col"
          :href="(getEffectiveType(col, row) === 'a') ? row[col.property] : false"
          :target="col.type === 'link' ? '_blank' : false"
          :class="getCellClasses(col, row)"
          :disabled="getCellDisabled(col, row)"
          :data-col="col.property"
          :style="getCellStyles(col.property, index)"
          @click="((getEffectiveType(col, row) === 'button') && col.action) ? $emit(col.action, row._id) : null"
        >
          <AposIndicator
            v-if="options.draggable && index === 0 && !row.parked"
            icon="drag-icon"
            class="apos-tree__row__icon apos-tree__row__icon--handle"
          />
          <AposIndicator
            v-if="index === 0 && row.parked && row.type !== '@apostrophecms/archive-page'"
            icon="lock-icon"
            class="apos-tree__row__icon apos-tree__row__icon--parked"
            tooltip="This page is parked and cannot be moved"
          />
          <AposIndicator
            v-if="index === 0 && row.type === '@apostrophecms/archive-page'"
            icon="lock-icon"
            class="apos-tree__row__icon apos-tree__row__icon--parked"
            tooltip="You cannot move the Archive"
          />
          <AposCheckbox
            v-if="options.bulkSelect && index === 0"
            class="apos-tree__row__checkbox"
            tabindex="-1"
            :field="{
              name: row._id,
              hideLabel: true,
              label: `Toggle selection of ${row.title}`,
              disableFocus: true
            }"
            :choice="{ value: row._id }"
            v-model="checkedProxy"
          />

            <AposIndicator
              v-if="getEffectiveIcon(col, row)"
              :icon="getEffectiveIcon(col, row)"
              class="apos-tree__cell__icon"
              :icon-size="getEffectiveIconSize(col, row)"
            />

              {{ getEffectiveCellLabel(col, row) }}

        </component>

      <AposTreeRows
        data-apos-branch-height
        :data-list-row="row._id"
        ref="tree-branches"
        :rows="row._children"
        :headers="headers"
        :icons="icons"
        :col-widths="colWidths"
        :level="level + 1"
        :nested="nested"
        :list-id="row._id"
        :tree-id="treeId"
        :options="options"
        :class="{ 'is-collapsed': options.startCollapsed }"
        :style="{
          'max-height': options.startCollapsed ? '0' : null
        }"
        v-model="checkedProxy"
      />

  </VueDraggable>
</template>


Trim full name before validation

Trim full name before validation

so that values made of empty characters
won't be considered valid

<template>

  <KTextbox
    ref="textbox"
    :value="value"
    :disabled="$attrs.disabled"
    :label="coreString('fullNameLabel')"
    :autofocus="$attrs.autofocus"
    :maxlength="120"
    :invalid="Boolean(shownInvalidText)"
    :invalidText="shownInvalidText"
    :autocomplete="$attrs.autocomplete"
    @blur="blurred = true"
    @input="$emit('update:value', $event)"
  />

</template>

<script>

  import commonCoreStrings from 'kolibri.coreVue.mixins.commonCoreStrings';

  export default {
    name: 'FullNameTextbox',
    mixins: [commonCoreStrings],
    // NOTE: 'value' and 'isValid' must be .sync'd with parent
    // You can also pass 'disabled', 'autofocus', and 'autocomplete'
    props: {
      value: {
        type: String,
        default: '',
      },
      shouldValidate: {
        type: Boolean,
      },
    },
    data() {
      return {
        blurred: false,
      };
    },
    computed: {
      isFullNameValid() {
        return this.value && this.value.trim() !== '';
      },
      invalidText() {
        if (!this.isFullNameValid) {
          return this.coreString('requiredFieldError');
        }
        return '';
      },
      shownInvalidText() {
        if (this.blurred || this.shouldValidate) {
          return this.invalidText;
        }
        return '';
      },
    },
    watch: {
      isFullNameValid: {
        handler(value) {
          this.$emit('update:isValid', value);
        },
        immediate: true,
      },
    },
    methods: {
      // @public
      focus() {
        return this.$refs.textbox.focus();
      },
    },
  };

</script>

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

<template>

  <KTextbox
    ref="textbox"
    :value="value"
    :disabled="$attrs.disabled"
    :label="coreString('fullNameLabel')"
    :autofocus="$attrs.autofocus"
    :maxlength="120"
    :invalid="Boolean(shownInvalidText)"
    :invalidText="shownInvalidText"
    :autocomplete="$attrs.autocomplete"
    @blur="blurred = true"
    @input="$emit('update:value', $event)"
  />

</template>

<script>

  import commonCoreStrings from 'kolibri.coreVue.mixins.commonCoreStrings';

  export default {
    name: 'FullNameTextbox',
    mixins: [commonCoreStrings],
    // NOTE: 'value' and 'isValid' must be .sync'd with parent
    // You can also pass 'disabled', 'autofocus', and 'autocomplete'
    props: {
      value: {
        type: String,
        default: '',
      },
      shouldValidate: {
        type: Boolean,
      },
    },
    data() {
      return {
        blurred: false,
      };
    },
    computed: {
      invalidText() {
        if (this.value === '') {
          return this.coreString('requiredFieldError');
        }
        return '';
      },
      shownInvalidText() {
        if (this.blurred || this.shouldValidate) {
          return this.invalidText;
        }
        return '';
      },
      valid() {
        return this.invalidText === '';
      },
    },
    watch: {
      valid: {
        handler(value) {
          this.$emit('update:isValid', value);
        },
        immediate: true,
      },
    },
    methods: {
      // @public
      focus() {
        return this.$refs.textbox.focus();
      },
    },
  };

</script>

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


show in paraclinic

show in paraclinic

<template>

{{title}}

 0" class="excluded">
        Исключённые исследования:

          {{getAfterGroup(t)}}

 0" class="excluded">
        Исключённые направления:

          {{getAfterGroup(t)}}

{{row.title_research}}

 0" class="excluded">
          Исключённые фракции:

            {{getAfterGroup(t)}}

 0" class="excluded">
          Исключённые направления:

            {{getAfterGroup(t)}}

          <colgroup>
            <col width="64"/>
          </colgroup>

            Дата, напр.

              {{t}}

              {{dateDir}}

              {{v}}

          <colgroup>
            <col width="120"/>
          </colgroup>

            Дата, напр.

              {{dateDir}}

              {{t}}

              {{v[i]}}

</template>

<template>

{{title}}

 0 && !disabled" class="excluded">
        Исключённые исследования:

          {{getAfterGroup(t)}}

 0 && !disabled" class="excluded">
        Исключённые направления:

          {{getAfterGroup(t)}}

{{row.title_research}}

 0 && !disabled" class="excluded">
          Исключённые фракции:

            {{getAfterGroup(t)}}

 0 && !disabled" class="excluded">
          Исключённые направления:

            {{getAfterGroup(t)}}

          <colgroup>
            <col width="64"/>
          </colgroup>

            Дата, напр.

              {{t}}

              {{dateDir}}

              {{v}}

          <colgroup>
            <col width="120"/>
          </colgroup>

            Дата, напр.

              {{dateDir}}

              {{t}}

              {{v[i]}}

</template>


Update order

Update order

<template>
  <nuxt-error v-if="nuxt.err" :error="nuxt.err"></nuxt-error>
  <nuxt-child v-else></nuxt-child>
</template>

<script>
import Vue from 'vue'
import NuxtChild from './nuxt-child'
import NuxtError from '<%= components.ErrorPage %>'

export default {
  name: 'nuxt',
  beforeCreate () {
    Vue.util.defineReactive(this, 'nuxt', this.$root.$options._nuxt)
  },
  created () {
    // Add this.$nuxt in child instances
    Vue.prototype.$nuxt = this
    // Add this.$root.$nuxt
    this.$root.$nuxt = this
    // Bind $nuxt.setLayout(layout) to $root.setLayout
    this.setLayout = this.$root.setLayout.bind(this.$root)
    // add to window so we can listen when ready
    if (typeof window !== 'undefined') {
      window.$nuxt = this
    }
    // Add $nuxt.error()
    this.error = this.$root.error
  },
  <% if (loading) { %>
  mounted () {
    if (this.$root.$loading && this.$root.$loading.start) {
      this.$loading = this.$root.$loading
    }
  },
  watch: {
    'nuxt.err': 'errorChanged'
  },
  methods: {
    errorChanged () {
      if (this.nuxt.err && this.$loading) {
        if (this.$loading.fail) this.$loading.fail()
        if (this.$loading.finish) this.$loading.finish()
      }
    }
  },
  <% } %>
  components: {
    NuxtChild,
    NuxtError
  }
}
</script>

<template>
  <nuxt-child v-if="!nuxt.err"></nuxt-child>
  <nuxt-error v-else :error="nuxt.err"></nuxt-error>
</template>

<script>
import Vue from 'vue'
import NuxtChild from './nuxt-child'
import NuxtError from '<%= components.ErrorPage %>'

export default {
  name: 'nuxt',
  beforeCreate () {
    Vue.util.defineReactive(this, 'nuxt', this.$root.$options._nuxt)
  },
  created () {
    // Add this.$nuxt in child instances
    Vue.prototype.$nuxt = this
    // Add this.$root.$nuxt
    this.$root.$nuxt = this
    // Bind $nuxt.setLayout(layout) to $root.setLayout
    this.setLayout = this.$root.setLayout.bind(this.$root)
    // add to window so we can listen when ready
    if (typeof window !== 'undefined') {
      window.$nuxt = this
    }
    // Add $nuxt.error()
    this.error = this.$root.error
  },
  <% if (loading) { %>
  mounted () {
    if (this.$root.$loading && this.$root.$loading.start) {
      this.$loading = this.$root.$loading
    }
  },
  watch: {
    'nuxt.err': 'errorChanged'
  },
  methods: {
    errorChanged () {
      if (this.nuxt.err && this.$loading) {
        if (this.$loading.fail) this.$loading.fail()
        if (this.$loading.finish) this.$loading.finish()
      }
    }
  },
  <% } %>
  components: {
    NuxtChild,
    NuxtError
  }
}
</script>


Add required rule to script name validation

<template>

            <fieldset>
                <legend></legend>
            </fieldset>

                        <control-group labelMessageKey="perfTest.config.agent" ref="agentCountControlGroup">
                            <input-append name="agentCount" ref="agentCount"
                                          v-model="test.agentCount"
                                          @validationResult="$refs.agentCountControlGroup.handleError($event)"
                                          :validationRules="{ required: true, agentCountValidation: true }"
                                          errStyle="position: absolute; margin: 0;"
                                          appendPrefix="perfTest.config.max"
                                          :append="maxAgentCount"
                                          message="perfTest.config.agent">
                            </input-append>
                        </control-group>

                        <control-group labelMessageKey="perfTest.config.region">
                            <select id="region" name="region" class="pull-right required" style="width: 110px">
                                <option value=""></option>
                                <option v-for="region in regions" :value="region" :selected="region === test.region" v-text="region"></option>
                            </select>
                        </control-group>

                <control-group labelMessageKey="perfTest.config.vuserPerAgent" ref="vuserPerAgentControlGroup" dataStep="5" :dataIntro="i18n('intro.config.basic.vuser')">
                    <input-append name="vuserPerAgent" ref="vuserPerAgent"
                                  v-model="test.vuserPerAgent"
                                  @validationResult="$refs.vuserPerAgentControlGroup.handleError($event)"
                                  :validationRules="{ required: true, max_value: testConfig.maxVuserPerAgent, min_value: 1 }"
                                  @change="changeVuserPerAgent"
                                  errStyle="margin: 0; width: 140px;"
                                  appendPrefix="perfTest.config.max"
                                  :append="testConfig.maxVuserPerAgent"
                                  message="perfTest.config.vuserPerAgent">
                    </input-append>

                    <transition name="fade">

                            <input-prepend name="processes" v-model="test.processes"
                                           @change="changeProcessThreadCount"
                                           message="perfTest.config.process" extraCss="control-group">
                            </input-prepend>
                            <input-prepend name="threads" v-model="test.threads"
                                           @change="changeProcessThreadCount"
                                           message="perfTest.config.thread" extraCss="control-group">
                            </input-prepend>

                    </transition>
                </control-group>

                <control-group labelMessageKey="perfTest.config.script" ref="scriptNameControlGroup">
                    <select2 v-model="test.scriptName" name="scriptName" ref="scriptName" customStyle="width: 275px;" :option="{placeholder: i18n('perfTest.config.scriptInput')}"
                             :validationRules="{ required: true, scriptValidation: true }" @validationResult="$refs.scriptNameControlGroup.handleError($event)" errStyle="position: absolute;">
                        <option value=""></option>
                        <option v-for="script in scripts" :data-validate="script.validated" v-text="script.pathInShort" :value="script.path"></option>
                    </select2>
                    <input type="hidden" name="scriptRevision" :value="test.scriptRevision">
                    <button class="btn btn-mini btn-info pull-right btn-script-revision" type="button">
                        R

                    </button>
                </control-group>

                <control-group labelMessageKey="perfTest.config.scriptResources">

                </control-group>

                <control-group labelMessageKey="perfTest.config.targetHost">

                    <input type="hidden" name="targetHosts" :value="targetHosts.join(',')">
                </control-group>

                <control-group :radio="{radioValue: 'D', checked: test.threshold === 'D'}" v-model="test.threshold" labelMessageKey="perfTest.config.duration" name="threshold" id="duration">
                    <select class="select-item" id="select_hour" v-model="duration.hour" @change="changeDuration">
                        <option v-for="(v, h) in 8" :value="h" v-text="h"></option>
                    </select> :
                    <select class="select-item" id="select_min" v-model="duration.min" @change="changeDuration">
                        <option v-for="(v, m) in 60" :value="m" v-text="m < 10 ? `0${m}` : m"></option>
                    </select> :
                    <select class="select-item" id="select_sec" v-model="duration.sec" @change="changeDuration">
                        <option v-for="(v, s) in 60" :value="s" v-text="s < 10 ? `0${s}` : s"></option>
                    </select>
                    HH:MM:SS
                    <input type="hidden" id="duration" name="duration" :value="durationSeconds * 1000"/>
                    <input type="hidden" id="duration_hour" name="durationHour" value="0"/>
                    <vue-slider @callback="changeDurationSlider" v-model="durationSeconds" width="278" :max="28799" tooltip="none"></vue-slider>
                </control-group>

                <control-group :radio="{radioValue: 'R', checked: test.threshold === 'R'}" v-model="test.threshold" labelMessageKey="perfTest.config.runCount" ref="runCountControlGroup" name="threshold" id="runCount">
                    <input-append name="runCount" ref="runCount"
                                  appendPrefix="perfTest.config.max"
                                  :append="testConfig.maxRunCount"
                                  @validationResult="$refs.runCountControlGroup.handleError($event)"
                                  :validationRules="{ required: true, max_value: testConfig.maxRunCount, min_value: 0 }"
                                  v-model="test.runCount"
                                  @focus="test.threshold = TEST_THRESHOLD_RUNCOUNT"
                                  message="perfTest.config.runCount">
                    </input-append>
                </control-group>

                <transition name="fade">

                                <control-group name="samplingInterval" labelMessageKey="perfTest.config.samplingInterval">
                                    <select class="select-item" id="sampling_interval"
                                            name="samplingInterval" v-model="test.samplingInterval">
                                        <option v-for="interval in samplingIntervals" :value="interval" v-text="interval"></option>
                                    </select>
                                </control-group>

                                <control-group name="ignoreSampleCount" ref="ignoreSampleCountControlGroup" labelStyle="width: 150px;" labelMessageKey="perfTest.config.ignoreSampleCount">
                                    <input-popover v-model="test.ignoreSampleCount"
                                                   ref="ignoreSampleCount"
                                                   @validationResult="$refs.ignoreSampleCountControlGroup.handleError($event)"
                                                   :validationRules="{ numeric: true }"
                                                   dataPlacement="top"
                                                   errStyle="margin-left: -120px;"
                                                   name="ignoreSampleCount"
                                                   message="perfTest.config.ignoreSampleCount" extraCss="input-mini">
                                    </input-popover>
                                </control-group>

                                <control-group name="safeDistribution" labelMessageKey="perfTest.config.safeDistribution" labelHelpMessageKey="perfTest.config.safeDistribution">
                                    <input type="checkbox" name="safeDistribution" :checked="test.safeDistribution">
                                </control-group>

                                <control-group name="param" labelMessageKey="perfTest.config.param" controlsStyle="margin-left: 85px;"
                                               labelStyle="width: 70px;" ref="paramControlGroup">
                                    <input-popover name="param"
                                                   ref="param"
                                                   @validationResult="$refs.paramControlGroup.handleError($event)"
                                                   :validationRules="{ regex: /^[a-zA-Z0-9_\.,\|=]{0,50}$/ }"
                                                   dataPlacement="top"
                                                   v-model="test.param"
                                                   message="perfTest.config.param"
                                                   customStyle="width: 125px">
                                    </input-popover>
                                </control-group>

                </transition>

        <ramp-up ref="rampUp" :test="test" :rampUpTypes="rampUpTypes"></ramp-up>
        <host-modal :id="'add-host-modal'" @add-host="addHost"></host-modal>

</template>

<template>

            <fieldset>
                <legend></legend>
            </fieldset>

                        <control-group labelMessageKey="perfTest.config.agent" ref="agentCountControlGroup">
                            <input-append name="agentCount" ref="agentCount"
                                          v-model="test.agentCount"
                                          @validationResult="$refs.agentCountControlGroup.handleError($event)"
                                          :validationRules="{ required: true, agentCountValidation: true }"
                                          errStyle="position: absolute; margin: 0;"
                                          appendPrefix="perfTest.config.max"
                                          :append="maxAgentCount"
                                          message="perfTest.config.agent">
                            </input-append>
                        </control-group>

                        <control-group labelMessageKey="perfTest.config.region">
                            <select id="region" name="region" class="pull-right required" style="width: 110px">
                                <option value=""></option>
                                <option v-for="region in regions" :value="region" :selected="region === test.region" v-text="region"></option>
                            </select>
                        </control-group>

                <control-group labelMessageKey="perfTest.config.vuserPerAgent" ref="vuserPerAgentControlGroup" dataStep="5" :dataIntro="i18n('intro.config.basic.vuser')">
                    <input-append name="vuserPerAgent" ref="vuserPerAgent"
                                  v-model="test.vuserPerAgent"
                                  @validationResult="$refs.vuserPerAgentControlGroup.handleError($event)"
                                  :validationRules="{ required: true, max_value: testConfig.maxVuserPerAgent, min_value: 1 }"
                                  @change="changeVuserPerAgent"
                                  errStyle="margin: 0; width: 140px;"
                                  appendPrefix="perfTest.config.max"
                                  :append="testConfig.maxVuserPerAgent"
                                  message="perfTest.config.vuserPerAgent">
                    </input-append>

                    <transition name="fade">

                            <input-prepend name="processes" v-model="test.processes"
                                           @change="changeProcessThreadCount"
                                           message="perfTest.config.process" extraCss="control-group">
                            </input-prepend>
                            <input-prepend name="threads" v-model="test.threads"
                                           @change="changeProcessThreadCount"
                                           message="perfTest.config.thread" extraCss="control-group">
                            </input-prepend>

                    </transition>
                </control-group>

                <control-group labelMessageKey="perfTest.config.script" ref="scriptNameControlGroup">
                    <select2 v-model="test.scriptName" name="scriptName" ref="scriptName" customStyle="width: 275px;" :option="{placeholder: i18n('perfTest.config.scriptInput')}"
                             :validationRules="{ scriptValidation: true }" @validationResult="$refs.scriptNameControlGroup.handleError($event)" errStyle="position: absolute;">
                        <option value=""></option>
                        <option v-for="script in scripts" :data-validate="script.validated" v-text="script.pathInShort" :value="script.path"></option>
                    </select2>
                    <input type="hidden" name="scriptRevision" :value="test.scriptRevision">
                    <button class="btn btn-mini btn-info pull-right btn-script-revision" type="button">
                        R

                    </button>
                </control-group>

                <control-group labelMessageKey="perfTest.config.scriptResources">

                </control-group>

                <control-group labelMessageKey="perfTest.config.targetHost">

                    <input type="hidden" name="targetHosts" :value="targetHosts.join(',')">
                </control-group>

                <control-group :radio="{radioValue: 'D', checked: test.threshold === 'D'}" v-model="test.threshold" labelMessageKey="perfTest.config.duration" name="threshold" id="duration">
                    <select class="select-item" id="select_hour" v-model="duration.hour" @change="changeDuration">
                        <option v-for="(v, h) in 8" :value="h" v-text="h"></option>
                    </select> :
                    <select class="select-item" id="select_min" v-model="duration.min" @change="changeDuration">
                        <option v-for="(v, m) in 60" :value="m" v-text="m < 10 ? `0${m}` : m"></option>
                    </select> :
                    <select class="select-item" id="select_sec" v-model="duration.sec" @change="changeDuration">
                        <option v-for="(v, s) in 60" :value="s" v-text="s < 10 ? `0${s}` : s"></option>
                    </select>
                    HH:MM:SS
                    <input type="hidden" id="duration" name="duration" :value="durationSeconds * 1000"/>
                    <input type="hidden" id="duration_hour" name="durationHour" value="0"/>
                    <vue-slider @callback="changeDurationSlider" v-model="durationSeconds" width="278" :max="28799" tooltip="none"></vue-slider>
                </control-group>

                <control-group :radio="{radioValue: 'R', checked: test.threshold === 'R'}" v-model="test.threshold" labelMessageKey="perfTest.config.runCount" ref="runCountControlGroup" name="threshold" id="runCount">
                    <input-append name="runCount" ref="runCount"
                                  appendPrefix="perfTest.config.max"
                                  :append="testConfig.maxRunCount"
                                  @validationResult="$refs.runCountControlGroup.handleError($event)"
                                  :validationRules="{ required: true, max_value: testConfig.maxRunCount, min_value: 0 }"
                                  v-model="test.runCount"
                                  @focus="test.threshold = TEST_THRESHOLD_RUNCOUNT"
                                  message="perfTest.config.runCount">
                    </input-append>
                </control-group>

                <transition name="fade">

                                <control-group name="samplingInterval" labelMessageKey="perfTest.config.samplingInterval">
                                    <select class="select-item" id="sampling_interval"
                                            name="samplingInterval" v-model="test.samplingInterval">
                                        <option v-for="interval in samplingIntervals" :value="interval" v-text="interval"></option>
                                    </select>
                                </control-group>

                                <control-group name="ignoreSampleCount" ref="ignoreSampleCountControlGroup" labelStyle="width: 150px;" labelMessageKey="perfTest.config.ignoreSampleCount">
                                    <input-popover v-model="test.ignoreSampleCount"
                                                   ref="ignoreSampleCount"
                                                   @validationResult="$refs.ignoreSampleCountControlGroup.handleError($event)"
                                                   :validationRules="{ numeric: true }"
                                                   dataPlacement="top"
                                                   errStyle="margin-left: -120px;"
                                                   name="ignoreSampleCount"
                                                   message="perfTest.config.ignoreSampleCount" extraCss="input-mini">
                                    </input-popover>
                                </control-group>

                                <control-group name="safeDistribution" labelMessageKey="perfTest.config.safeDistribution" labelHelpMessageKey="perfTest.config.safeDistribution">
                                    <input type="checkbox" name="safeDistribution" :checked="test.safeDistribution">
                                </control-group>

                                <control-group name="param" labelMessageKey="perfTest.config.param" controlsStyle="margin-left: 85px;"
                                               labelStyle="width: 70px;" ref="paramControlGroup">
                                    <input-popover name="param"
                                                   ref="param"
                                                   @validationResult="$refs.paramControlGroup.handleError($event)"
                                                   :validationRules="{ regex: /^[a-zA-Z0-9_\.,\|=]{0,50}$/ }"
                                                   dataPlacement="top"
                                                   v-model="test.param"
                                                   message="perfTest.config.param"
                                                   customStyle="width: 125px">
                                    </input-popover>
                                </control-group>

                </transition>

        <ramp-up ref="rampUp" :test="test" :rampUpTypes="rampUpTypes"></ramp-up>
        <host-modal :id="'add-host-modal'" @add-host="addHost"></host-modal>

</template>


fix preset option lists in filters

fix preset option lists in filters

<template>
  <div class="filter-panel">
    <el-select placeholder="Add filter"
               v-model="selectedFilterToAdd"
               @change="addFilter"
               style="width: 200px; margin-bottom: 10px;">
      <el-option v-for="f in availableFilters"
                 :value="f.key" :label="f.description">
      </el-option>
    </el-select>

    <component v-for="f in activeFilters"
               :is="f.type"
               :name="f.name"
               :options="getFilterOptions(f)"
               :labels="f.labels"
               :clearable="f.clearable"
               :removable="f.removable"
               :filterable="f.filterable"
               :optionFormatter="f.optionFormatter"
               :value="f.value"
               :valueFormatter="f.valueFormatter"
               :width="f.width"
               @change="f.onChange"
               @destroy="f.onChange(undefined)">
    </component>
  </div>
</template>

<script>
 import InputFilter from './InputFilter.vue';
 import SingleSelectFilter from './SingleSelectFilter.vue';
 import MultiSelectFilter from './MultiSelectFilter.vue';
 import DatasetNameFilter from './DatasetNameFilter.vue';
 import MzFilter from './MzFilter.vue';
 import FILTER_SPECIFICATIONS from '../filterSpecs.js';
 import {fetchOptionListsQuery} from '../api/metadata.js';

 const filterKeys = [
   'database',
   'fdrLevel',
   'institution',
   'datasetIds',
   'compoundName',
   'mz',
   'polarity',
   'adduct',
   'organism',
   'organismPart',
   'condition',
   'analyzerType',
   'ionisationSource',
   'maldiMatrix',
   'minMSM'
 ];

 export default {
   name: 'filter-panel',
   props: ["level"],
   components: {
     InputFilter,
     SingleSelectFilter,
     MultiSelectFilter,
     DatasetNameFilter,
     MzFilter
   },
   apollo: {
     optionLists: {
       query: fetchOptionListsQuery,
       update: data => data
     }
   },
   computed: {
     filter() {
       return this.$store.getters.filter;
     },

     activeKeys() {
       return this.$store.state.orderedActiveFilters;
     },

     activeFilters() {
       return this.activeKeys.map(this.makeFilter);
     },

     availableFilters() {
       let available = [];
       for (let key of filterKeys) {
         if (FILTER_SPECIFICATIONS[key].levels.indexOf(this.level) == -1)
           continue;
         if (this.activeKeys.indexOf(key) == -1)
           available.push({key,
                           description: FILTER_SPECIFICATIONS[key].description})
       }
       return available;
     }
   },

   data () {
     return {
       selectedFilterToAdd: null,
     }
   },

   methods: {
     makeFilter(filterKey) {
       const filterSpec = FILTER_SPECIFICATIONS[filterKey];
       let self = this;
       const behaviour = {
         value: self.filter[filterKey],
         // passing the value of undefined destroys the tag element
         onChange(val) {
           self.$store.commit('updateFilter',
                              Object.assign(self.filter, {[filterKey]: val}));
         }
       };
       let result = Object.assign({}, filterSpec, behaviour);
       return result;
     },

     addFilter(key) {
       if (key) {
         this.selectedFilterToAdd = null;
         this.$store.commit('addFilter', key);
       }
     },

     getFilterOptions(filter) {
       // dynamically generated options are supported:
       // either specify a function of optionLists or one of its field names
       if (typeof filter.options === 'object')
         return filter.options;
       if (!this.optionLists)
         return [];
       if (typeof filter.options === 'string')
         return this.optionLists[filter.options];
       else if (typeof filter.options === 'function') {
         return filter.options(this.optionLists);
       }
       return [];
     }
   }
 }
</script>

<style>
 .filter-panel {
   display: inline-flex;
   align-items: flex-start;
   flex-wrap: wrap;
   padding: 0px 4px;
 }

 .el-select-dropdown__wrap {
   /* so that no scrolling is necessary */
   max-height: 480px;
 }

 .el-select-dropdown__wrap {
    max-height: 500px;
 }
</style>

<template>
  <div class="filter-panel">
    <el-select placeholder="Add filter"
               v-model="selectedFilterToAdd"
               @change="addFilter"
               style="width: 200px; margin-bottom: 10px;">
      <el-option v-for="f in availableFilters"
                 :value="f.key" :label="f.description">
      </el-option>
    </el-select>

    <component v-for="f in activeFilters"
               :is="f.type"
               :name="f.name"
               :options="getFilterOptions(f)"
               :labels="f.labels"
               :clearable="f.clearable"
               :removable="f.removable"
               :filterable="f.filterable"
               :optionFormatter="f.optionFormatter"
               :value="f.value"
               :valueFormatter="f.valueFormatter"
               :width="f.width"
               @change="f.onChange"
               @destroy="f.onChange(undefined)">
    </component>
  </div>
</template>

<script>
 import InputFilter from './InputFilter.vue';
 import SingleSelectFilter from './SingleSelectFilter.vue';
 import MultiSelectFilter from './MultiSelectFilter.vue';
 import DatasetNameFilter from './DatasetNameFilter.vue';
 import MzFilter from './MzFilter.vue';
 import FILTER_SPECIFICATIONS from '../filterSpecs.js';
 import {fetchOptionListsQuery} from '../api/metadata.js';

 const filterKeys = [
   'database',
   'fdrLevel',
   'institution',
   'datasetIds',
   'compoundName',
   'mz',
   'polarity',
   'adduct',
   'organism',
   'organismPart',
   'condition',
   'analyzerType',
   'ionisationSource',
   'maldiMatrix',
   'minMSM'
 ];

 export default {
   name: 'filter-panel',
   props: ["level"],
   components: {
     InputFilter,
     SingleSelectFilter,
     MultiSelectFilter,
     DatasetNameFilter,
     MzFilter
   },
   apollo: {
     optionLists: {
       query: fetchOptionListsQuery,
       update: data => data
     }
   },
   computed: {
     filter() {
       return this.$store.getters.filter;
     },

     activeKeys() {
       return this.$store.state.orderedActiveFilters;
     },

     activeFilters() {
       return this.activeKeys.map(this.makeFilter);
     },

     availableFilters() {
       let available = [];
       for (let key of filterKeys) {
         if (FILTER_SPECIFICATIONS[key].levels.indexOf(this.level) == -1)
           continue;
         if (this.activeKeys.indexOf(key) == -1)
           available.push({key,
                           description: FILTER_SPECIFICATIONS[key].description})
       }
       return available;
     }
   },

   data () {
     return {
       selectedFilterToAdd: null,
     }
   },

   methods: {
     makeFilter(filterKey) {
       const filterSpec = FILTER_SPECIFICATIONS[filterKey];
       let self = this;
       const behaviour = {
         value: self.filter[filterKey],
         // passing the value of undefined destroys the tag element
         onChange(val) {
           self.$store.commit('updateFilter',
                              Object.assign(self.filter, {[filterKey]: val}));
         }
       };
       let result = Object.assign({}, filterSpec, behaviour);
       return result;
     },

     addFilter(key) {
       if (key) {
         this.selectedFilterToAdd = null;
         this.$store.commit('addFilter', key);
       }
     },

     getFilterOptions(filter) {
       // dynamically generated options are supported:
       // either specify a function of optionLists or one of its field names
       if (typeof filter.options === 'array')
         return filter.options;
       if (!this.optionLists)
         return [];
       if (typeof filter.options === 'string')
         return this.optionLists[result.options];
       else if (typeof filter.options === 'function') {
         return filter.options(this.optionLists);
       }
     }
   }
 }
</script>

<style>
 .filter-panel {
   display: inline-flex;
   align-items: flex-start;
   flex-wrap: wrap;
   padding: 0px 4px;
 }

 .el-select-dropdown__wrap {
   /* so that no scrolling is necessary */
   max-height: 480px;
 }

 .el-select-dropdown__wrap {
    max-height: 500px;
 }
</style>


remove extraneous check for disabled from

<template>

    <slot name="beforeCalendarHeader"></slot>

      <
      {{ pageYearName }}
      >

    {{ month.month }}

</template>


docs(Typography): update md font weights in example

resolves #11630

<template>
  <v-item-group mandatory>
    <v-sheet
      class="overflow-y-auto"
      max-height="600"
      tile
    >
      <v-item
        v-for="[
          c,
          text,
          size,
          weight,
          spacing,
          margin
        ] in classes"
        :key="c"
      >
        <template v-slot="{ active, toggle }">
          <v-sheet
            :color="active ? 'grey lighten-4' : undefined"
            class="px-4 pt-4 pb-3"
            tile
            style="cursor: pointer;"
            @click="toggle"
          >
            <div
              :class="[`text-${c}`, active && `mb-${margin}`]"
              class="transition-swing"
              v-text="text"
            >

            <v-expand-transition>
              <v-responsive
                v-if="active"
                max-width="350"
              >

                      Font

Roboto

                      Weight

                      Size

                      Letter spacing

              </v-responsive>
            </v-expand-transition>
          </v-sheet>
        </template>
      </v-item>
    </v-sheet>
  </v-item-group>
</template>


updated name of array for breadcrumbs to items

<template>

                    {{ crumb.text }}

                <slot></slot>

</template>


Update MOTD

Update MOTD

<template>
  <Drawer
    placement="right"
    :closeable="true"
    :visible="message && showMessage"
    width="50%"
    height="auto"
    @close="dismissMessage">

Message of The Day

  </Drawer>
</template>

<template>
  <Drawer
    placement="right"
    :closeable="true"
    :visible="message && showMessage"
    width="500px"
    @close="dismissMessage">

Message of The Day

  </Drawer>
</template>


handle the case where date is undefined

handle the case where date is undefined

<template>
  <uw-card
    v-if="isStudent"
    :loaded="isReadyNotices && isReadyTuition"
    :errored="isErroredNotices || isErroredTuition"
    :errored-show="showError"
  >
    <template #card-heading>

Tuition & Fees

    </template>
    <template #card-body>

         0"
          show
          variant="danger"
          class="text-danger"
        >
           Tuition and fees are due
          today.

        <b-alert
          v-if="tuitionDate.diff < 0 && tuition.tuition_accbalance > 0"
          show
          variant="danger"
          class="text-danger"
        >

          You have a balance that may be past due. See your statement for details.

= 0">
          <uw-card-status>
            <template #status-label>Amount Due</template>
            <template v-if="tuition.tuition_accbalance > 0" #status-value>
              ${{ tuition.tuition_accbalance.toFixed(2) }}
            </template>
            <template v-else #status-value>$ 0</template>
            <template #status-content>

Student Fiscal Services

                  Tuition Statement

                <uw-link-button
                  href="http://f2.washington.edu/fm/sfs/tuition/payment"
                  target="_blank"
                >
                  Make payment
                </uw-link-button>

            </template>
          </uw-card-status>

        <li v-else-if="tuition.tuition_accbalance < 0">

                Account Credit

                Student Fiscal Services

              +${{ Math.abs(tuition.tuition_accbalance).toFixed(2) }} CR
              No payment needed

              Tuition Statement

 0">
          <uw-card-status>
            <template #status-label>Amount Due</template>
            <template #status-value>
              ${{ tuition.pce_accbalance.toFixed(2) }}
            </template>
            <template #status-content>

PCE-Continuum College

                <uw-link-button href="http://portal.continuum.uw.edu" target="_blank">
                  Make payment
                </uw-link-button>

            </template>
          </uw-card-status>

          <uw-card-status>
            <template #status-label>Amount Due</template>
            <template #status-value>$ 0</template>
            <template #status-content>
              PCE-Continuum College
              Account Statement
            </template>
          </uw-card-status>

= 0">
          <uw-card-status>
            <template #status-label>Payment Due</template>
            <template #status-value>{{ tuitionDate.formatted }}</template>
            <template #status-content>

                Today
                Tomorrow
                in {{ tuitionDate.diff }} days

            </template>
          </uw-card-status>

          Give access to your tuition account and financial aid information

          to parents or other third parties.

          {{ msg.notice_content }}

      <uw-fin-aid :fin-aid-notices="finAidNotices">
        <template #status>

              Financial Aid Status

        </template>
      </uw-fin-aid>

      <uw-tuition-resources />
    </template>
    <template #card-error>
      An error occurred and MyUW cannot load your information right now. In the meantime, try the
      Tuition Statement page
      PCE Tuition portal.
    </template>
    <template #card-error-extra>
      <uw-tuition-resources />
    </template>
  </uw-card>
</template>


Made h4 byline closer to the heading, wrapping long lines

<template>
  <uw-card v-if="isStudent"
           :loaded="isReadyNotices && isReadyTuition"
           :errored="isErroredNotices || isErroredTuition"
           :errored-show="showError"
  >
    <template #card-heading>

        Tuition & Fees

    </template>
    <template #card-body>

         0"
          show variant="danger"
          class="text-danger"
        >
           Tuition and fees are due today.

        <b-alert
          v-if="tuitionDate.diff < 0 && tuition.tuition_accbalance > 0"
          show variant="danger"
          class="text-danger"
        >

          You have a balance that may be past due. See your statement for details.

= 0">

Amount Due

              Student Fiscal Services

 0">
              ${{ tuition.tuition_accbalance.toFixed(2) }}
              Tuition Statement
              Make payment

              $ 0
              Tuition Statement

        <li v-else-if="tuition.tuition_accbalance < 0">

Account Credit

              Student Fiscal Services

              +${{ Math.abs(tuition.tuition_accbalance).toFixed(2) }} CR
              No payment needed

              Tuition Statement

 0">

Amount due

              PCE-Continuum College

              ${{ tuition.pce_accbalance.toFixed(2) }}
              Make payment

Amount Due

              PCE-Continuum College

              $ 0
              Account Statement

              Payment Due

              {{ tuitionDate.formatted }}
              Today
              Tomorrow
              in {{ tuitionDate.diff }} days

          Give access to your tuition account and financial aid information

          to parents or other third parties.

          {{ msg.notice_content }}

      <uw-fin-aid
        :fin-aid-notices="finAidNotices"
      >
        <template #status>
          Financial Aid Status
        </template>
      </uw-fin-aid>

      <uw-tuition-resources />
    </template>
    <template #card-error>
      An error occurred and MyUW cannot load your information right now. In the meantime, try the
      Tuition Statement page
      PCE Tuition portal.
      <uw-tuition-resources />
    </template>
  </uw-card>
</template>

<template>
  <uw-card v-if="isStudent"
           :loaded="isReadyNotices && isReadyTuition"
           :errored="isErroredNotices || isErroredTuition"
           :erroredShow="showError"
  >
    <template #card-heading>

        Tuition & Fees

    </template>
    <template #card-body>

         0"
          show variant="danger"
          class="text-danger"
        >
           Tuition and fees are due today.

        <b-alert
          v-if="tuitionDate.diff < 0 && tuition.tuition_accbalance > 0"
          show variant="danger"
          class="text-danger"
        >

          You have a balance that may be past due.
          See your statement for details.

= 0">

              Amount Due

            Student Fiscal Services

 0">
              ${{ tuition.tuition_accbalance.toFixed(2) }}
              Tuition Statement
              Make payment

              $ 0
              Tuition Statement

        <li v-else-if="tuition.tuition_accbalance < 0">

              Account Credit

            Student Fiscal Services

              +${{ Math.abs(tuition.tuition_accbalance).toFixed(2) }} CR
              No payment needed

              Tuition Statement

 0">

              Amount due

            PCE-Continuum College

              ${{ tuition.pce_accbalance.toFixed(2) }}
              Make payment

              Amount Due

            PCE-Continuum College

              $ 0
              Account Statement

              Payment Due

              {{ tuitionDate.formatted }}
              Today
              Tomorrow
              in {{ tuitionDate.diff }} days

          Give access to your tuition account and financial aid information to parents or other third parties.

          {{ msg.notice_content }}

      <uw-fin-aid
        :fin-aid-notices="finAidNotices"
      >
        <template #status>
          Financial Aid Status
        </template>
      </uw-fin-aid>

      <uw-tuition-resources />
    </template>
    <template #card-error>
      An error occurred and MyUW cannot load your
      information right now. In the meantime, try the
      Tuition Statement page
      PCE Tuition portal.
      <uw-tuition-resources />
    </template>
  </uw-card>
</template>


spelling

spelling

/*
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

<template>

    <api-error v-if="error" :error="error"/>
    File Upload In Progress...

      There was an error uploading the files

      Successfully uploaded all files

      Shapefile uploaded.

      There was an error uploading the shapefile: {{ shapefile_upload_message }}.

      Record successfully updated.

Loading...

Aquifer {{record.aquifer_id}} Summary - Edit

      <aquifer-form
        v-on:save="save"
        v-on:cancel="navigateToView"
        :fieldErrors="fieldErrors"
        :record="record"
        showId
        v-if="editMode"
        />
      <change-history v-if="userRoles.aquifers.edit && editMode" class="mt-5" :id="id" resource="aquifers" ref="aquiferHistory"/>

Aquifer {{ id }} Summary

                   Edit

Aquifer number

{{record.aquifer_id}}

Year of mapping

{{record.mapping_year}}

Aquifer name

{{record.name}}

Litho stratigraphic unit

{{record.lsu}}

Descriptive location

{{record.location_description}}

Vulnerability

{{record.vulnerability}}

Material type

{{record.material}}

Subtype

{{record.subtype}}

Quality concerns

{{record.quality_concern}}

Productivity

{{record.productivity}}

Size (km²)

{{record.area}}

Demand

{{record.demand}}

          <single-aquifer-map v-bind:geom="record.geom" :key="mapKey"/>

Well Information

Number of wells associated to the aquifer

{{ licence_details.num_wells }}

Well info last updated {{ licence_details.wells_updated.update_date__max|formatDate }}

Documentation

          <aquifer-documents :files="aquiferFiles"
            :editMode="editMode"
            :id="this.id"
            v-on:fetchFiles="fetchFiles">
          </aquifer-documents>

Licensing Information

Number of groundwater licences

{{ licence_details.licence_count }}

Water withdrawal volume (annual)

{{ waterWithdrawlVolume | unitWaterVolume}}

No information available.

           0">

Licenced use volume by purpose

              <PieChart :chartData="licence_details.usage" class="mt-3"></PieChart>

Licenced quantity by use

              <PieChart :chartData="licence_details.lic_qty" class="mt-3"></PieChart>

Licence info last updated {{ licence_details.licences_updated.update_date__max|formatDate }}

Knowledge Indicators

Artesian conditions

{{ licence_details.num_artesian_wells }} artesian wells in aquifer

Observation wells

 0">

                      Observation Well {{ owell.observation_well_number }}

Water Level Analysis:
                       o.wellNumber === owell.observation_well_number)" href="http://www.env.gov.bc.ca/soe/indicators/water/groundwater-levels.html">
                      {{ (waterLevels.find(o => o.wellNumber === owell.observation_well_number).levels )}}

                      No information available.

                  No information available.

{{ section.name }}

{{ resource.name }}

No information available.

Water quality information

{{ licence_details['num_wells_with_ems'] }} wells with an EMS ID

Hydraulically connected *

{{ licence_details['hydraulically_connected'] ? "Yes" : "No"}}

</template>

/*
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

<template>

    <api-error v-if="error" :error="error"/>
    File Upload In Progress...

      There was an error uploading the files

      Successfully uploaded all files

      Shapefile uploaded.

      There was an error uploading the shapefile: {{ shapefile_upload_message }}.

      Record successfully updated.

Loading...

Aquifer {{record.aquifer_id}} Summary - Edit

      <aquifer-form
        v-on:save="save"
        v-on:cancel="navigateToView"
        :fieldErrors="fieldErrors"
        :record="record"
        showId
        v-if="editMode"
        />
      <change-history v-if="userRoles.aquifers.edit && editMode" class="mt-5" :id="id" resource="aquifers" ref="aquiferHistory"/>

Aquifer {{ id }} Summary

                   Edit

Aquifer number

{{record.aquifer_id}}

Year of mapping

{{record.mapping_year}}

Aquifer name

{{record.name}}

Litho stratigraphic unit

{{record.lsu}}

Descriptive location

{{record.location_description}}

Vulnerability

{{record.vulnerability}}

Material type

{{record.material}}

Subtype

{{record.subtype}}

Quality concerns

{{record.quality_concern}}

Productivity

{{record.productivity}}

Size (km²)

{{record.area}}

Demand

{{record.demand}}

          <single-aquifer-map v-bind:geom="record.geom" :key="mapKey"/>

Well Information

Number of wells associated to the aquifer

{{ licence_details.num_wells }}

Well info last updated {{ licence_details.wells_updated.update_date__max|formatDate }}

Documentation

          <aquifer-documents :files="aquiferFiles"
            :editMode="editMode"
            :id="this.id"
            v-on:fetchFiles="fetchFiles">
          </aquifer-documents>

Licensing Information

Number of groundwater licences

{{ licence_details.licence_count }}

Water withdrawal volume (annual)

{{ waterWithdrawlVolume | unitWaterVolume}}

No information available.

           0">

Licenced use volume by purpose

              <PieChart :chartData="licence_details.usage" class="mt-3"></PieChart>

Licenced quanity by use

              <PieChart :chartData="licence_details.lic_qty" class="mt-3"></PieChart>

Licence info last updated {{ licence_details.licences_updated.update_date__max|formatDate }}

Knowledge Indicators

Artesian conditions

{{ licence_details.num_artesian_wells }} artesian wells in aquifer

Observation wells

 0">

                      Observation Well {{ owell.observation_well_number }}

Water Level Analysis:
                       o.wellNumber === owell.observation_well_number)" href="http://www.env.gov.bc.ca/soe/indicators/water/groundwater-levels.html">
                      {{ (waterLevels.find(o => o.wellNumber === owell.observation_well_number).levels )}}

                      No information available.

                  No information available.

{{ section.name }}

{{ resource.name }}

No information available.

Water quality information

{{ licence_details['num_wells_with_ems'] }} wells with an EMS ID

Hydraulically connected *

{{ licence_details['hydraulically_connected'] ? "Yes" : "No"}}

</template>


link wells

link wells

/*
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

<template>

    <api-error v-if="error" :error="error"/>
    File Upload In Progress...

      There was an error uploading the files

      Successfully uploaded all files

      Record successfully updated.

Loading...

Aquifer {{record.aquifer_id}} Summary - Edit

      <aquifer-form
        v-on:save="save"
        v-on:cancel="navigateToView"
        :fieldErrors="fieldErrors"
        :record="record"
        showId
        v-if="editMode"
        />

Aquifer {{ id }} Summary

                   Edit

Aquifer number

{{record.aquifer_id}}

Year of mapping

{{record.mapping_year}}

Aquifer name

{{record.aquifer_name}}

Litho stratigraphic unit

{{record.litho_stratographic_unit}}

Descriptive location

{{record.location_description}}

Vulnerability

{{record.vulnerability_description}}

Material type

{{record.material_description}}

Subtype

{{record.subtype_description}}

Quality concerns

{{record.quality_concern_description}}

Productivity

{{record.productivity_description}}

Size (km²)

{{record.area}}

Demand

{{record.demand_description}}

          <single-aquifer-map v-bind:geom="record.geom"/>

Well Information

Number of wells associated to the aquifer

{{ licence_details.num_wells }}

Documentation

          <aquifer-documents :files="aquiferFiles"
            :editMode="editMode"
            :id="this.id"
            v-on:fetchFiles="fetchFiles">
          </aquifer-documents>

Licensing Information

Number of groundwater licenses

{{ licence_details.licence_count }}

Knowledge Indicators

{{ section.name }}

{{ resource.name }}

No information available.

          <change-history v-if="userRoles.aquifers.edit" class="mt-5" :id="id" resource="aquifers" ref="aquiferHistory"/>

</template>


Moves "Other information" in "Knowledge Indicators" section to the bottom of the list. Hard codes section ordering in front-end removing need for /aquifers/{id}/sections fetch

/*
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

<template>

    <api-error v-if="error" :error="error"/>
    File Upload In Progress...

      There was an error uploading the files

      Successfully uploaded all files

      Shapefile uploaded.

      There was an error uploading the shapefile: {{ shapefile_upload_message }}.

      Record successfully updated.

Loading...

Aquifer {{record.aquifer_id}} Summary - Edit

      <aquifer-form
        v-on:load="loadForm"
        v-on:save="save"
        v-on:cancel="navigateToView"
        :fieldErrors="fieldErrors"
        :record="form"
        showId
        v-if="editMode"
        />
      <change-history v-if="userRoles.aquifers.edit && editMode" class="mt-5" :id="id" resource="aquifers" ref="aquiferHistory"/>

Aquifer {{ id }} Summary

                   Edit

                Aquifer number
                {{record.aquifer_id}}
                Year of mapping
                {{record.mapping_year}}

                Aquifer name
                {{record.aquifer_name}}
                Litho stratigraphic unit
                {{record.litho_stratographic_unit}}

                Descriptive location
                {{record.location_description}}
                Vulnerability
                {{record.vulnerability}}

                Material type
                {{record.material}}
                Subtype
                {{record.subtype}}

                Quality concerns
                {{record.quality_concern}}
                Productivity
                {{record.productivity}}

                Size (km²)
                {{record.area}}
                Demand
                {{record.demand}}

          <single-aquifer-map v-bind:geom="record.geom" :key="mapKey"/>

Well Information

Number of wells associated to the aquifer

                <router-link :to="{ name: 'wells-home', query: {'match_any':false, 'aquifer': this.record.aquifer_id, 'search':'', 'well':''}}">
                  {{ licence_details.num_wells }}
                </router-link>

Artesian wells

                <router-link :to="{ name: 'wells-home', query: {'match_any':false, 'aquifer':this.id, 'artesian_flow_has_value':true}, hash: '#advanced'}">
                  {{ licence_details.num_artesian_wells }} artesian wells in aquifer
                </router-link>

Well info last updated {{ licence_details.wells_updated.update_date__max|formatDate }}

Documentation

          <aquifer-documents :files="aquiferFiles"
            :editMode="editMode"
            :id="this.id"
            v-on:fetchFiles="fetchFiles">
          </aquifer-documents>

Licensing Information

              The licensing summaries should be considered estimates. Due to complexities in the structure of the licensing data, reported values should be confirmed through the e-licensing portal.

Number of groundwater licences

{{ licence_details.licence_count }}

Water withdrawal volume (annual)

{{ waterWithdrawlVolume | unitWaterVolume}}

No information available.

 0">

Licensed volume by purpose

                <PieChart :chartData="licence_details.usage" class="mt-3"></PieChart>

Number of licences by purpose

                <PieChart :chartData="licence_details.lic_qty" class="mt-3"></PieChart>

Licence info last updated {{ licence_details.licences_updated.update_date__max|formatDate }}

            Licensing information is obtained from the Water Rights Licence - Public data layer.

            Unique licenses are counted once for each aquifer that they are associated with.

            The total licensed volume is counted once for each licence (the total volume may be shared between wells if there are multiple wells in a licence). In cases where specific volumes are licensed for multiple purposes, individual volumes are summed.

Knowledge Indicators

Observation wells

 0">

                      Observation Well {{ owell.observation_well_number }}

Water Level Analysis:
                       o.wellNumber === owell.observation_well_number)" href="http://www.env.gov.bc.ca/soe/indicators/water/groundwater-levels.html" target="_blank">
                        {{ (waterLevels.find(o => o.wellNumber === owell.observation_well_number).levels )}}

                      No information available.

                  No information available.

Water quality information

{{ licence_details['num_wells_with_ems'] }} wells with an EMS ID

Hydraulically connected (screening level)

{{ licence_details['hydraulically_connected'] ? "More likely" : "Less likely"}}

{{ section.name }}

{{ resource.name }}

No information available.

</template>

/*
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

<template>

    <api-error v-if="error" :error="error"/>
    File Upload In Progress...

      There was an error uploading the files

      Successfully uploaded all files

      Shapefile uploaded.

      There was an error uploading the shapefile: {{ shapefile_upload_message }}.

      Record successfully updated.

Loading...

Aquifer {{record.aquifer_id}} Summary - Edit

      <aquifer-form
        v-on:load="loadForm"
        v-on:save="save"
        v-on:cancel="navigateToView"
        :fieldErrors="fieldErrors"
        :record="form"
        showId
        v-if="editMode"
        />
      <change-history v-if="userRoles.aquifers.edit && editMode" class="mt-5" :id="id" resource="aquifers" ref="aquiferHistory"/>

Aquifer {{ id }} Summary

                   Edit

                Aquifer number
                {{record.aquifer_id}}
                Year of mapping
                {{record.mapping_year}}

                Aquifer name
                {{record.aquifer_name}}
                Litho stratigraphic unit
                {{record.litho_stratographic_unit}}

                Descriptive location
                {{record.location_description}}
                Vulnerability
                {{record.vulnerability}}

                Material type
                {{record.material}}
                Subtype
                {{record.subtype}}

                Quality concerns
                {{record.quality_concern}}
                Productivity
                {{record.productivity}}

                Size (km²)
                {{record.area}}
                Demand
                {{record.demand}}

          <single-aquifer-map v-bind:geom="record.geom" :key="mapKey"/>

Well Information

Number of wells associated to the aquifer

                <router-link :to="{ name: 'wells-home', query: {'match_any':false, 'aquifer': this.record.aquifer_id, 'search':'', 'well':''}}">
                  {{ licence_details.num_wells }}
                </router-link>

Artesian wells

                <router-link :to="{ name: 'wells-home', query: {'match_any':false, 'aquifer':this.id, 'artesian_flow_has_value':true}, hash: '#advanced'}">
                  {{ licence_details.num_artesian_wells }} artesian wells in aquifer
                </router-link>

Well info last updated {{ licence_details.wells_updated.update_date__max|formatDate }}

Documentation

          <aquifer-documents :files="aquiferFiles"
            :editMode="editMode"
            :id="this.id"
            v-on:fetchFiles="fetchFiles">
          </aquifer-documents>

Licensing Information

              The licensing summaries should be considered estimates. Due to complexities in the structure of the licensing data, reported values should be confirmed through the e-licensing portal.

Number of groundwater licences

{{ licence_details.licence_count }}

Water withdrawal volume (annual)

{{ waterWithdrawlVolume | unitWaterVolume}}

No information available.

 0">

Licensed volume by purpose

                <PieChart :chartData="licence_details.usage" class="mt-3"></PieChart>

Number of licences by purpose

                <PieChart :chartData="licence_details.lic_qty" class="mt-3"></PieChart>

Licence info last updated {{ licence_details.licences_updated.update_date__max|formatDate }}

            Licensing information is obtained from the Water Rights Licence - Public data layer.

            Unique licenses are counted once for each aquifer that they are associated with.

            The total licensed volume is counted once for each licence (the total volume may be shared between wells if there are multiple wells in a licence). In cases where specific volumes are licensed for multiple purposes, individual volumes are summed.

Knowledge Indicators

Observation wells

 0">

                      Observation Well {{ owell.observation_well_number }}

Water Level Analysis:
                       o.wellNumber === owell.observation_well_number)" href="http://www.env.gov.bc.ca/soe/indicators/water/groundwater-levels.html" target="_blank">
                        {{ (waterLevels.find(o => o.wellNumber === owell.observation_well_number).levels )}}

                      No information available.

                  No information available.

{{ section.name }}

{{ resource.name }}

No information available.

Water quality information

{{ licence_details['num_wells_with_ems'] }} wells with an EMS ID

Hydraulically connected (screening level)

{{ licence_details['hydraulically_connected'] ? "More likely" : "Less likely"}}

</template>


docs(Link): fix same page scrolling behavior

<template>
  <component
    :is="component"
    class="app-link text-decoration-none primary--text font-weight-medium d-inline-block"
    v-bind="attrs"
  >
    <div
      class="d-inline-flex align-center"
      @click="onClick"
    >
      <slot v-if="!isSamePage" />

      <v-icon
        v-if="icon"
        :class="`m${isSamePage ? 'r' : 'l'}-1`"
        color="primary"
        size=".875rem"
        v-text="icon"
      />

      <slot v-if="isSamePage" />
    </div>
  </component>
</template>

<script>
  export default {
    name: 'AppLink',

    inheritAttrs: false,

    props: {
      href: {
        type: String,
        default: '',
      },
    },

    computed: {
      attrs () {
        return this.isExternal
          ? { href: this.href, target: '_blank', rel: 'noopener' }
          : { to: this.href }
      },
      component () {
        return !this.isExternal ? 'router-link' : 'a'
      },
      icon () {
        if (this.isSamePage) return '$mdiPound'
        if (this.isExternal) return '$mdiOpenInNew'
        if (this.href) return '$mdiPageNext'

        return null
      },
      isExternal () {
        return (
          this.href.startsWith('http') ||
          this.href.startsWith('mailto')
        )
      },
      isSamePage () {
        return (
          !this.isExternal &&
          this.href.startsWith('#')
        )
      },
    },

    methods: {
      // vue-router scroll-behavior is skipped
      // on same page hash changes. Manually
      // run $vuetify goTo scroll function
      onClick (e) {
        if (!this.isSamePage) return

        e.preventDefault()

        this.$vuetify.goTo(this.href)
      },
    },
  }
</script>

<style lang="sass">
  .app-link
    p
      margin-bottom: 0
</style>

<template>
  <component
    :is="component"
    class="app-link text-decoration-none primary--text font-weight-medium d-inline-flex align-center"
    v-bind="attrs"
  >
    <slot />

    <v-icon
      v-if="icon"
      class="ml-1"
      color="primary"
      size=".875rem"
      v-text="icon"
    />
  </component>
</template>

<script>
  export default {
    name: 'AppLink',

    inheritAttrs: false,

    props: {
      href: {
        type: String,
        default: '',
      },
    },

    computed: {
      attrs () {
        return this.isExternal
          ? { href: this.href, target: '_blank', rel: 'noopener' }
          : { to: this.href }
      },
      component () {
        return !this.isExternal ? 'router-link' : 'a'
      },
      icon () {
        if (this.isSamePage) return '$mdiPound'
        if (this.isExternal) return '$mdiOpenInNew'
        if (this.href) return '$mdiPageNext'

        return null
      },
      isExternal () {
        return (
          this.href.startsWith('http') ||
          this.href.startsWith('mailto')
        )
      },
      isSamePage () {
        return (
          !this.isExternal &&
          this.href.startsWith('#')
        )
      },
    },
  }
</script>

<style lang="sass">
  .app-link
    p
      margin-bottom: 0
</style>


:art:

:art:

<template>

	<button @click="dark">
		<template v-if="$store.state.device.darkmode">%fa:moon%</template>
		<template v-else>%fa:R moon%</template>
	</button>

%i18n:common.about-title%

			%i18n:@gotit%

%i18n:common.misskey% - %i18n:@about%

			<button class="signup" @click="signup">%i18n:@signup-button%</button>
			<button class="signin" @click="signin">%i18n:@signin-button%</button>

			%fa:comments R% %i18n:@timeline%

			<mk-welcome-timeline/>

	<mk-forkit/>

			<mk-nav :class="$style.nav"/>

{{ copyright }}

	<modal name="signup" width="500px" height="auto" scrollable>
		%i18n:@signup%
		<mk-signup :class="$style.signupForm"/>
	</modal>
	<modal name="signin" width="500px" height="auto" scrollable>
		%i18n:@signin%
		<mk-signin :class="$style.signinForm"/>
	</modal>

</template>


Datepicker: update case

Datepicker: update case

<template>

Basics

            <datepicker :value.sync="value"></datepicker>

            <datepicker placeholder="European Format ('d-m-Y')" :config="{ dateFormat: 'd-m-Y', static: true }"></datepicker>

            <datepicker placeholder="American Format ('m/d/Y')" :config="{ dateFormat: 'm/d/Y' }"></datepicker>

            <datepicker placeholder="Fancy Textual Format ('l, F j, Y')" :config="{ dateFormat: 'l, F j, Y' }"></datepicker>

            <datepicker placeholder="minDate: today" :config="{ minDate: today, defaultDate: today }"></datepicker>

            <datepicker placeholder="minDate: '2016-09-20'" :config="{ minDate: '2016-09-20' }"></datepicker>

            <datepicker placeholder="minDate: new Date('September 2, 2015')" :config="{ minDate: new Date('September 2, 2015') }"></datepicker>

            <datepicker :placeholder="placeholder" :config="{ minDate: 'today', maxDate: maxDate }"></datepicker>

Form addons

          <datepicker :config="{ wrap: true }" readonly>

          </datepicker>

Inline or embedded calendar

            <datepicker placeholder="Pick date and time" :config="{ inline: true }"></datepicker>

Display week numbers

            <datepicker placeholder="Enabled week numbers" :config="{ weekNumbers: true }"></datepicker>

DateTime or Time Picker

            <datepicker placeholder="Pick date and time" :config="{ enableTime: true }"></datepicker>

            <datepicker placeholder="24 hour time" :config="{ enableTime: true, time_24hr: true, timeFormat: 'H:i' }"></datepicker>

            <datepicker placeholder="Pick date and time" :config="{ enableTime: true, enableSeconds: true, timeFormat: 'h:i:s' }"></datepicker>

            <datepicker placeholder="Pick date and time" :config="{ enableTime: true, noCalendar: true }" value="09:00"></datepicker>

Preload date and time

            <datepicker placeholder="The real input is hidden :^)" :config="{ altInput: true, altFormat: 'F j, Y' }"></datepicker>

            <datepicker :config="{ defaultDate: '2016-03-01 03:30:00 -0300', enableTime: true }"></datepicker>

            <datepicker :config="{ defaultDate: '2016-12-27T16:16:22.585Z', enableTime: true }"></datepicker>

UTC mode

            <datepicker :config="{ utc: true, defaultDate: '2016-03-01 03:30:00 -0300', enableTime: true }"></datepicker>

            <datepicker :config="{ utc: true, defaultDate: '2016-12-27T16:16:22.585Z', enableTime: true }"></datepicker>

Disable specific dates or date intervals

            <datepicker placeholder="disabled from July 6-9" :config="{ disable: [ { from: '2016-07-06', to: '2016-07-09' }, '2016-07-24' ], minDate: 'today' }"></datepicker>

            <datepicker placeholder="disabled September 6-9 & August 25-31 2016" :config="{ disable: [ { from : '2016-09-06', to : '2016-09-09' }, { from : 'August 25, 2016', to : 'August 31, 2016' } ], minDate: 'today', dateFormat: 'Y-m-d' }"></datepicker>

Setting options on the fly

            <datepicker v-ref:check-in placeholder="Check-In Date" :config="{ minDate: new Date() }"></datepicker>

            <datepicker v-ref:check-out placeholder="Check Out Date" :config="{ minDate: new Date() }"></datepicker>

Setting custom defaults

            <datepicker :config="{ prevArrow: '', nextArrow: '' }"></datepicker>

Localization

            <datepicker :l10n="l10n"></datepicker>

</template>

<template>

Basics

            <datepicker :value.sync="value"></datepicker>

            <datepicker placeholder="European Format ('d-m-Y')" :config="{ dateFormat: 'd-m-Y' }"></datepicker>

            <datepicker placeholder="American Format ('m/d/Y')" :config="{ dateFormat: 'm/d/Y' }"></datepicker>

            <datepicker placeholder="Fancy Textual Format ('l, F j, Y')" :config="{ dateFormat: 'l, F j, Y' }"></datepicker>

            <datepicker placeholder="minDate: today" :config="{ minDate: today, defaultDate: today }"></datepicker>

            <datepicker placeholder="minDate: '2016-09-20'" :config="{ minDate: '2016-09-20' }"></datepicker>

            <datepicker placeholder="minDate: new Date('September 2, 2015')" :config="{ minDate: new Date('September 2, 2015') }"></datepicker>

            <datepicker :placeholder="placeholder" :config="{ minDate: 'today', maxDate: maxDate }"></datepicker>

Form addons

          <datepicker :config="{ wrap: true }" readonly>

          </datepicker>

Inline or embedded calendar

            <datepicker placeholder="Pick date and time" :config="{ inline: true }"></datepicker>

Display week numbers

            <datepicker placeholder="Enabled week numbers" :config="{ weekNumbers: true }"></datepicker>

DateTime or Time Picker

            <datepicker placeholder="Pick date and time" :config="{ enableTime: true }"></datepicker>

            <datepicker placeholder="24 hour time" :config="{ enableTime: true, time_24hr: true, timeFormat: 'H:i' }"></datepicker>

            <datepicker placeholder="Pick date and time" :config="{ enableTime: true, enableSeconds: true, timeFormat: 'h:i:s' }"></datepicker>

            <datepicker placeholder="Pick date and time" :config="{ enableTime: true, noCalendar: true }" value="09:00"></datepicker>

Preload date and time

            <datepicker placeholder="The real input is hidden :^)" :config="{ altInput: true, altFormat: 'F j, Y' }"></datepicker>

            <datepicker :config="{ defaultDate: '2016-03-01 03:30:00 -0300', enableTime: true }"></datepicker>

            <datepicker :config="{ defaultDate: '2016-12-27T16:16:22.585Z', enableTime: true }"></datepicker>

UTC mode

            <datepicker :config="{ utc: true, defaultDate: '2016-03-01 03:30:00 -0300', enableTime: true }"></datepicker>

            <datepicker :config="{ utc: true, defaultDate: '2016-12-27T16:16:22.585Z', enableTime: true }"></datepicker>

Disable specific dates or date intervals

            <datepicker placeholder="disabled from July 6-9" :config="{ disable: [ { from: '2016-07-06', to: '2016-07-09' }, '2016-07-24' ], minDate: 'today' }"></datepicker>

            <datepicker placeholder="disabled September 6-9 & August 25-31 2016" :config="{ disable: [ { from : '2016-09-06', to : '2016-09-09' }, { from : 'August 25, 2016', to : 'August 31, 2016' } ], minDate: 'today', dateFormat: 'Y-m-d' }"></datepicker>

Setting options on the fly

            <datepicker v-ref:check-in placeholder="Check-In Date" :config="{ minDate: new Date() }"></datepicker>

            <datepicker v-ref:check-out placeholder="Check Out Date" :config="{ minDate: new Date() }"></datepicker>

Setting custom defaults

            <datepicker :config="{ prevArrow: '', nextArrow: '' }"></datepicker>

Localization

            <datepicker :l10n="l10n"></datepicker>

</template>


chore(join): fixed up join button

chore(join): fixed up join button

<template>

    <v-btn :class="{'btn-block': block}" v-t="'join_group_button.join_group'" @click="joinGroup()" class="md-raised md-primary join-group-button__join-group"></v-btn>

    <v-btn md-button :class="{'btn-block': block}" :disabled="hasRequestedMembership" v-t="'join_group_button.join_group'" @click="requestToJoinGroup()" class="md-raised md-primary join-group-button__ask-to-join-group"></v-btn>

</template>

<template>

    <button md-button :class="{'btn-block': block}" v-t="'join_group_button.join_group'" @click="joinGroup()" class="md-raised md-primary join-group-button__join-group"></button>

    <button md-button :class="{'btn-block': block}" :disabled="hasRequestedMembership" v-t="'join_group_button.join_group'" @click="requestToJoinGroup()" class="md-raised md-primary join-group-button__ask-to-join-group"></button>

</template>


完成加载转换比例

完成加载转换比例

<template>

基础设置 - 转换比例

        加载中...

转换比例为「真实货币」如人民币，美元等与钱包系统「用户余额」比例的设置。

          以「CNY」为例，比例设置为 200% 则充值 1CNY 则得到 2 余额。

          转换比例

              <input type="number" name="ratio" class="form-control" id="wallet-ratio" placeholder="输入转换比例" aria-describedby="wallet-ratio-help" min="1" max="1000" step="1" v-model="ratio">
              %

            输入转换比例，不理只能是正整数，范围在 1 - 1000 之间。

{{ load.message }}

        <button type="button" class="btn btn-primary" @click="requestRatio">刷新</button>

</template>

<template>

基础设置 - 转换比例

转换比例为「真实货币」如人民币，美元等与钱包系统「用户余额」比例的设置。

          以「CNY」为例，比例设置为 200% 则充值 1CNY 则得到 2 余额。

          转换比例

              <input type="number" name="ratio" class="form-control" id="wallet-ratio" placeholder="输入转换比例" aria-describedby="wallet-ratio-help" min="1" max="1000" step="1" v-model="ratio">
              %

            输入转换比例，不理只能是正整数，范围在 1 - 1000 之间。

</template>


remove commented code

remove commented code

<template>
    <transition name="el-fade-in-linear">

                <router-link :to="'/c/' + list.name">

                </router-link>

                        <router-link :to="'/c/' + list.name">
                            #{{ list.name }}
                        </router-link>

                        ({{ list.subscribers }} subscribers)

                        <el-tooltip :content="bookmarked ? 'Unbookmark' : 'Bookmark'" placement="top"
                            transition="false"
                            :open-delay="500"
                        >

                        </el-tooltip>

                        <el-tooltip :content="subscribed ? 'Unsubscribe' : 'Subscribe'" placement="top"
                            transition="false"
                            :open-delay="500"
                        >

                        </el-tooltip>

                    {{ list.description }}

    </transition>
</template>


Cleanup

Cleanup

<template>

    <v-breadcrumbs :items="breadcrumbs">
      <v-icon slot="divider">chevron_right</v-icon>
    </v-breadcrumbs>

    <v-progress-linear :indeterminate="true" v-if="!loaded"></v-progress-linear>

    <v-card v-if="loaded">
      <v-container fluid grid-list-lg>
        <v-layout row wrap>
          <v-flex xs12>
            <v-card dark>
              <v-layout>
                <v-flex xs5>
                  <v-img :src="character.icon" height="128px" contain></v-img>
                </v-flex>
                <v-flex xs7>
                  <v-card-title primary-title>

{{ character.name }}

                        <template v-if="character.corporation">
                          <router-link :to="{ name: 'universe_corporation', params: { id: character.corporation.id }}">{{ character.corporation.name }}</router-link> /
                        </template>
                        <template v-if="character.alliance">
                          <router-link :to="{ name: 'universe_alliance', params: { id: character.alliance.id }}" v-if="character.alliance">{{ character.alliance.name }}</router-link>
                        </template>

{{ character.description }}

Birthday: {{ character.birthday }}

Gender: {{ character.gender }}

Security status: {{ character.security_status }}

                      <v-divider light></v-divider>

Race: {{ character.race.name }}

Bloodline: {{ character.bloodline.name }}

Ancestry: {{ character.ancestry.name }}

Faction: {{ character.faction.name }}

                      <v-divider light></v-divider>

Perception: {{ character.perception }}

Memory: {{ character.memory }}

Willpower: {{ character.willpower }}

Intelligence: {{ character.intelligence }}

Charisma: {{ character.charisma }}

                      <v-divider light></v-divider>

Wallet: {{ character.wallet }}

                      <v-divider light></v-divider>

Bonus Remaps: {{ character.bonus_remaps }}

Last Remap Date: {{ character.last_remap_date }}

Accured Remap Cooldown Date: {{ character.accrued_remap_cooldown_date }}

                  </v-card-title>
                </v-flex>
              </v-layout>
            </v-card>
          </v-flex>

        </v-layout>
      </v-container>
    </v-card>

</template>

<template>

    <v-breadcrumbs :items="breadcrumbs">
      <v-icon slot="divider">chevron_right</v-icon>
    </v-breadcrumbs>

    <v-progress-linear :indeterminate="true" v-if="!loaded"></v-progress-linear>

    <v-card v-if="loaded">
      <v-container fluid grid-list-lg>
        <v-layout row wrap>
          <v-flex xs12>
            <v-card dark>
              <v-layout>
                <v-flex xs5>
                  <v-img :src="character.icon" height="128px" contain></v-img>
                </v-flex>
                <v-flex xs7>
                  <v-card-title primary-title>

{{ character.name }}

                        <router-link :to="{ name: 'universe_corporation', params: { id: character.corporation.id }}" v-if="character.corporation">{{ character.corporation.name }}</router-link> /
                        <router-link :to="{ name: 'universe_alliance', params: { id: character.alliance.id }}" v-if="character.alliance">{{ character.alliance.name }}</router-link>

{{ character.description }}

Birthday: {{ character.birthday }}

Gender: {{ character.gender }}

Security status: {{ character.security_status }}

                      <v-divider light></v-divider>

Race: {{ character.race.name }}

Bloodline: {{ character.bloodline.name }}

Ancestry: {{ character.ancestry.name }}

Faction: {{ character.faction.name }}

                      <v-divider light></v-divider>

Perception: {{ character.perception }}

Memory: {{ character.memory }}

Willpower: {{ character.willpower }}

Intelligence: {{ character.intelligence }}

Charisma: {{ character.charisma }}

                      <v-divider light></v-divider>

Wallet: {{ character.wallet }}

                      <v-divider light></v-divider>

Bonus Remaps: {{ character.bonus_remaps }}

Last Remap Date: {{ character.last_remap_date }}

Accured Remap Cooldown Date: {{ character.accrued_remap_cooldown_date }}

                  </v-card-title>
                </v-flex>
              </v-layout>
            </v-card>
          </v-flex>

        </v-layout>
      </v-container>
    </v-card>

</template>


2.16     + Статистика

2.16
    + Статистика

<template>

        <input type="text" class="form-control" v-model="pk" @keyup.enter="load" autofocus
               placeholder="Номер направления"/>
        <button class="btn btn-blue-nb" @click="load">Загрузить</button>

Результаты за
        <date-field style="width: 94px;display: inline-block;height: 34px" :val.sync="date" :def="date"/>

            Направление №{{direction.pk}} от
            {{direction.date}}

            {{direction.patient}}

            Карта: {{direction.card}}

                {{i.title}}

                не сохр.
                сохр.
                подтв.

Просмотр

              Печать
                результатов

          Нет данных

Направление №{{data.direction.pk}}
              от
              {{data.direction.date}}

{{data.patient.fio_age}}

Диагноз: {{data.direction.diagnos}}

Источник финансирования: {{data.direction.fin_source}}

Карта: {{data.patient.card}}

Лечащий врач: {{data.patient.doc}}

            <button type="button" class="close" @click="clear()">
              ×
            </button>

{{row.research.title}}

{{group.title}}

                  {{field.title}}

                <longpress v-if="!row.confirmed" class="btn btn-default btn-field" :on-confirm="clear_val" :confirm-time="0" :duration="400" :value="field" pressing-text="×" action-text="×">×</longpress>

 0 && !row.confirmed" class="field-inputs">

                          {{val}}

                  <textarea v-model="field.value" :rows="field.lines" class="form-control"
                            v-if="field.lines > 1" :readonly="row.confirmed"></textarea>
                  <input v-model="field.value" class="form-control" :readonly="row.confirmed" v-else/>

{{row.research.title}}:

Не сохранено

Сохранено

Подтверждено

            <button class="btn btn-blue-nb" @click="save(row)" v-if="!row.confirmed">Сохранить</button>
            <button class="btn btn-blue-nb" @click="confirm(row)" v-if="row.saved && !row.confirmed" :disabled="changed">Подтвердить
            </button>
            <button class="btn btn-blue-nb" @click="save_and_confirm(row)" v-if="!row.confirmed">Сохранить и
              подтвердить
            </button>
            <button class="btn btn-blue-nb" @click="reset_confirm(row)" v-if="row.confirmed && row.allow_reset_confirm">
              Сброс подтверждения
            </button>

</template>


OPEN-208: Auto-update endDate when startDate is set.

<template>

                Geldig vanaf
                <pikaday class="form-control inp-startDate" v-model="eventStartDate" :options="pikadayStart"/>

                tot en met
                <pikaday class="form-control inp-until" v-model="eventUntil" :options="pikadayUntil"/>

×

                    Regelmaat
                    <select v-model="optionFreq" class="form-control" aria-label="Regelmaat">
                        <option :value="RRule.YEARLY">Jaarlijks</option>
                        <option :value="RRule.MONTHLY">Maandelijks</option>
                        <option :value="RRule.WEEKLY">Wekelijks</option>
                        <option :value="RRule.DAILY">Dagelijks</option>
                    </select>

                    Frequentie
                    <select v-model="optionInterval" class="form-control" aria-label="Frequentie">
                        <option :value="null">elke maand</option>
                        <option :value="2">tweemaandelijks</option>
                        <option :value="3">elk kwartaal</option>
                        <option :value="4">viermaandelijks</option>
                    </select>

                    Frequentie
                    <select v-model="optionInterval" class="form-control" aria-label="Frequentie">
                        <option :value="null">elke week</option>
                        <option :value="2">tweewekelijks</option>
                        <option :value="3">driewekelijks</option>
                        <option :value="4">vierwekelijks</option>
                    </select>

                    Frequentie
                    <select v-model="optionInterval" class="form-control" aria-label="Frequentie">
                        <option :value="null">elke dag</option>
                        <option :value="2">om de dag</option>
                        <option :value="3">om de drie dagen</option>
                        <option :value="4">om de vier dagen</option>
                        <option :value="5">om de vijf dagen</option>
                        <option :value="6">om de zes dagen</option>
                    </select>

                    Op

                        <input type="radio" :name="event.start_date" v-model="weekOrMonth" value="monthday">
                         {{ eventStartDayMonth }}

                            <input type="radio" :name="event.start_date" v-model="weekOrMonth" value="weekday">
                             de

                        <select v-model="optionBysetpos" class="form-control">
                            <option value="-" disabled></option>
                            <option value="1">eerste</option>
                            <option value="2">tweede</option>
                            <option value="3">derde</option>
                            <option value="4">vierde</option>
                            <option value="-2">voorlaatste</option>
                            <option value="-1">laatste</option>
                        </select>

                        <select v-model="optionByweekday" class="form-control">
                            <option value="0">maandag</option>
                            <option value="1">dinsdag</option>
                            <option value="2">woensdag</option>
                            <option value="3">donderdag</option>
                            <option value="4">vrijdag</option>
                            <option value="5">zaterdag</option>
                            <option value="6">zondag</option>
                            <option value="0,1,2,3,4,5,6">dag</option>
                            <option value="0,1,2,3,4">weekdag</option>
                            <option value="5,6">weekenddag</option>
                        </select>

                        <select v-model="options.bymonth" class="form-control">
                            <option v-for="(month, index) in fullMonths" :value="index + 1">{{ month }}</option>
                        </select>

                    Op

                        <input type="radio" :name="event.start_date" v-model="weekOrMonth" value="monthday">
                         dag {{ eventStartDayMonth.slice(0, 2) }}

                            <input type="radio" :name="event.start_date" v-model="weekOrMonth" value="weekday">
                             de

                        <select v-model="optionBysetpos" class="form-control">
                            <option value="-" disabled></option>
                            <option value="1">eerste</option>
                            <option value="2">tweede</option>
                            <option value="3">derde</option>
                            <option value="4">vierde</option>
                            <option value="-2">voorlaatste</option>
                            <option value="-1">laatste</option>
                        </select>

                        <select v-model="optionByweekday" class="form-control">
                            <option value="0">maandag</option>
                            <option value="1">dinsdag</option>
                            <option value="2">woensdag</option>
                            <option value="3">donderdag</option>
                            <option value="4">vrijdag</option>
                            <option value="5">zaterdag</option>
                            <option value="6">zondag</option>
                            <option value="0,1,2,3,4,5,6">dag</option>
                            <option value="0,1,2,3,4">weekdag</option>
                            <option value="5,6">weekend</option>
                        </select>

                    Op

×

                    <multi-day-select :options="fullDays" v-model="optionByweekday"></multi-day-select>

                    Van
                    <input type="text" class="form-control control-time inp-startTime"
                           aria-label="Van"
                           v-model.lazy="eventStartTime"
                           placeholder="_ _ : _ _">

                    <label :aria-describedby="`next_day_${this._uid}`">tot
                    <input type="text" class="form-control control-time inp-endTime"
                           aria-label="tot"
                           v-model.lazy="eventEndTime"
                           placeholder="_ _ : _ _">

                <span class="col-xs-9  col-sm-offset-3 text-danger" :id="`next_day_${this._uid}`" v-if="eventStartTime > eventEndTime">volgende dag

            <button type="button" class="btn btn-link" @click="$emit('add-event', prop, event)"
                    :disabled="$root.isRecreatex">+ Voeg meer dagen toe
            </button>

</template>