add a link to the well detail page after a successful submission

<template>

          Well Activity Submission Preview

                Single page
                Multi page

            Back to Edit

Submit activity on a well. Try a search to see if the well exists in the system before submitting a report.

                Save
                <transition name="bounce" mode="out-in">

                </transition>

                Load
                <transition name="bounce">

                </transition>

          <activity-type
            v-if="currentStep === 'activityType' || (formIsFlat && displayFormSection.activityType)"
            :wellActivityType.sync="activityType"
          ></activity-type>

          <well-type class="my-3"
            v-if="currentStep === 'wellType' || (formIsFlat && displayFormSection.wellType)"
            :wellTagNumber.sync="form.well"
            :wellActivityType.sync="activityType"
            :wellClass.sync="form.well_class"
            :wellSubclass.sync="form.well_subclass"
            :intendedWaterUse.sync="form.intended_water_use"
            :units.sync="units"
            :idPlateNumber.sync="form.identification_plate_number"
            :wellPlateAttached.sync="form.well_plate_attached"
            :workStartDate.sync="form.work_start_date"
            :workEndDate.sync="form.work_end_date"
            :errors="errors"
            :fieldsLoaded="fieldsLoaded"
          />

          <person-responsible class="my-3"
            v-if="currentStep === 'personResponsible' || (formIsFlat && displayFormSection.personResponsible)"
            :drillerName.sync="form.driller_name"
            :consultantName.sync="form.consultant_name"
            :consultantCompany.sync="form.consultant_company"
            :personResponsible.sync="form.driller_responsible"
            :drillerSameAsPersonResponsible.sync="form.meta.drillerSameAsPersonResponsible"
            :errors="errors"
            :fieldsLoaded="fieldsLoaded"
          />

          <owner class="my-3"
            v-if="currentStep === 'wellOwner' || (formIsFlat && displayFormSection.wellOwner)"
            :ownerFullName.sync="form.owner_full_name"
            :ownerMailingAddress.sync="form.owner_mailing_address"
            :ownerProvinceState.sync="form.owner_province_state"
            :ownerCity.sync="form.owner_city"
            :ownerPostalCode.sync="form.owner_postal_code"
            :errors="errors"
            :fieldsLoaded="fieldsLoaded"
          />

          <location class="my-3"
            v-if="currentStep === 'wellLocation' || (formIsFlat && displayFormSection.wellLocation)"
            :ownerMailingAddress.sync="form.owner_mailing_address"
            :ownerProvinceState.sync="form.owner_province_state"
            :ownerCity.sync="form.owner_city"
            :ownerPostalCode.sync="form.owner_postal_code"
            :streetAddress.sync="form.street_address"
            :city.sync="form.city"
            :legalLot.sync="form.legal_lot"
            :legalPlan.sync="form.legal_plan"
            :legalDistrictLot.sync="form.legal_district_lot"
            :legalBlock.sync="form.legal_block"
            :legalSection.sync="form.legal_section"
            :legalTownship.sync="form.legal_township"
            :legalRange.sync="form.legal_range"
            :landDistrict.sync="form.land_district"
            :legalPID.sync="form.legal_pid"
            :wellLocationDescription.sync="form.well_location_description"
          />

          <coords class="my-3"
            v-if="currentStep === 'wellCoords' || (formIsFlat && displayFormSection.wellCoords)"
            :latitude.sync="form.latitude"
            :longitude.sync="form.longitude"
          />

          <method-of-drilling class="my-3"
            v-if="currentStep === 'method' || (formIsFlat && displayFormSection.method)"

            :groundElevation.sync="form.ground_elevation"
            :groundElevationMethod.sync="form.ground_elevation_method"
            :drillingMethod.sync="form.drilling_method"
            :otherDrillingMethod.sync="form.other_drilling_method"
            :wellOrientation.sync="form.well_orientation"
          />

          <closure-description class="my-3"
            v-if="currentStep === 'closureDescription' || (formIsFlat && displayFormSection.closureDescription)"
            :closureDescriptionSet.sync="form.decommission_description_set">

          </closure-description>

          <lithology class="my-3"
            v-if="currentStep === 'lithology' || (formIsFlat && displayFormSection.lithology)"
            :lithology.sync="form.lithologydescription_set"
          />

          <casings class="my-3"
            :key="`casingsComponent${componentUpdateTrigger}`"
            v-if="currentStep === 'casings' || (formIsFlat && displayFormSection.casings)"
            :casings.sync="form.casing_set"
            :errors="errors"
            :fieldsLoaded="fieldsLoaded"
          />

          <backfill class="my-3"
            v-if="currentStep === 'backfill' || (formIsFlat && displayFormSection.backfill)"
            :surfaceSealMaterial.sync="form.surface_seal_material"
            :surfaceSealDepth.sync="form.surface_seal_depth"
            :surfaceSealThickness.sync="form.surface_seal_thickness"
            :surfaceSealMethod.sync="form.surface_seal_method"
            :backfillAboveSurfaceSeal.sync="form.backfill_above_surface_seal"
            :backfillDepth.sync="form.backfill_above_surface_seal_depth"
          />

          <liner class="my-3"
            v-if="currentStep === 'liner' || (formIsFlat && displayFormSection.liner)"
            :linerMaterial.sync="form.liner_material"
            :linerDiameter.sync="form.liner_diameter"
            :linerThickness.sync="form.liner_thickness"
            :linerFrom.sync="form.liner_from"
            :linerTo.sync="form.liner_to"
            :linerPerforations.sync="form.linerperforation_set"
            :errors="errors"
            :fieldsLoaded="fieldsLoaded"
          />

          <screens class="my-3"
            v-if="currentStep === 'screens' || (formIsFlat && displayFormSection.screens)"
            :screenIntakeMethod.sync="form.screen_intake_method"
            :screenType.sync="form.screen_type"
            :screenMaterial.sync="form.screen_material"
            :otherScreenMaterial.sync="form.other_screen_material"
            :screenOpening.sync="form.screen_opening"
            :screenBottom.sync="form.screen_bottom"
            :screens.sync="form.screen_set"
            :errors="errors"
            :fieldsLoaded="fieldsLoaded"
          />

          <filterPack class="my-3"
            v-if="currentStep === 'filterPack' || (formIsFlat && displayFormSection.filterPack)"
            :filterPackFrom.sync="form.filter_pack_from"
            :filterPackTo.sync="form.filter_pack_to"
            :filterPackThickness.sync="form.filter_pack_thickness"
            :filterPackMaterial.sync="form.filter_pack_material"
            :filterPackMaterialSize.sync="form.filter_pack_material_size"
          />

          <development class="my-3"
            v-if="currentStep === 'wellDevelopment' || (formIsFlat && displayFormSection.wellDevelopment)"
            :developmentMethod.sync="form.development_method"
            :developmentHours.sync="form.development_hours"
            :developmentNotes.sync="form.development_notes"
          />

          <yield class="my-3"
            v-if="currentStep === 'wellYield' || (formIsFlat && displayFormSection.wellYield)"
            :productionData.sync="form.production_data_set"
          />

          <water-quality class="my-3"
            v-if="currentStep === 'waterQuality' || (formIsFlat && displayFormSection.waterQuality)"
            :waterQualityCharacteristics.sync="form.water_quality_characteristics"
            :waterQualityColour.sync="form.water_quality_colour"
            :waterQualityOdour.sync="form.water_quality_odour"
            :emsID.sync="form.ems_id"
          />

          <completion class="my-3"
            v-if="currentStep === 'wellCompletion' || (formIsFlat && displayFormSection.wellCompletion)"
            :totalDepthDrilled.sync="form.total_depth_drilled"
            :finishedWellDepth.sync="form.finished_well_depth"
            :finalCasingStickUp.sync="form.final_casing_stick_up"
            :bedrockDepth.sync="form.bedrock_depth"
            :staticWaterLevel.sync="form.static_water_level"
            :wellYield.sync="form.well_yield"
            :artesianFlow.sync="form.artesian_flow"
            :artesianPressure.sync="form.artesian_pressure"
            :wellCapType.sync="form.well_cap_type"
            :wellDisinfected.sync="form.well_disinfected"
          />

          <decommission-information class="my-3"
            v-if="currentStep === 'decommissionInformation' || (formIsFlat && displayFormSection.decommissionInformation)"
            :finishedWellDepth.sync="form.finished_well_depth"
            :decommissionReason.sync="form.decommission_reason"
            :decommissionMethod.sync="form.decommission_method"
            :sealantMaterial.sync="form.sealant_material"
            :backfillMaterial.sync="form.backfill_material"
            :decommissionDetails.sync="form.decommission_details"
          />

          <comments class="my-3"
            v-if="currentStep === 'comments' || (formIsFlat && displayFormSection.comments)"
            :comments.sync="form.comments"
            :alternativeSpecsSubmitted.sync="form.alternative_specs_submitted"
          />

          <submission-preview
            :form="form"
            :activity="activityType"
            :sections="displayFormSection"/>

               1 && !preview && !formIsFlat" @click="step > 1 ? step-- : null" variant="primary">Back
              Back to Edit

              <b-btn v-if="step < maxSteps && !formIsFlat && !preview" @click="step++" variant="primary">Next

                Preview & Submit
                Submit

      Report submitted!
        <a v-if="formSubmitSuccessWellTag" :href="`/gwells/well/${formSubmitSuccessWellTag}`">
          View well details for well {{formSubmitSuccessWellTag}}

          {{ errors.detail }}

          <div v-for="(field, i) in Object.keys(errors)" :key="`submissionError${i}`">
            {{field | readable}} : <span v-for="(e, j) in errors[field]" :key="`submissionError${i}-${j}`">{{ e }}

        Are you sure you want to submit this activity report?

            Save

            Cancel

        Are you sure you want to load the previously saved activity report? Your current report will be overwritten.

            Load

            Cancel

</template>

<template>

          Well Activity Submission Preview

                Single page
                Multi page

            Back to Edit

Submit activity on a well. Try a search to see if the well exists in the system before submitting a report.

                Save
                <transition name="bounce" mode="out-in">

                </transition>

                Load
                <transition name="bounce">

                </transition>

          <activity-type
            v-if="currentStep === 'activityType' || (formIsFlat && displayFormSection.activityType)"
            :wellActivityType.sync="activityType"
          ></activity-type>

          <well-type class="my-3"
            v-if="currentStep === 'wellType' || (formIsFlat && displayFormSection.wellType)"
            :wellTagNumber.sync="form.well"
            :wellActivityType.sync="activityType"
            :wellClass.sync="form.well_class"
            :wellSubclass.sync="form.well_subclass"
            :intendedWaterUse.sync="form.intended_water_use"
            :units.sync="units"
            :idPlateNumber.sync="form.identification_plate_number"
            :wellPlateAttached.sync="form.well_plate_attached"
            :workStartDate.sync="form.work_start_date"
            :workEndDate.sync="form.work_end_date"
            :errors="errors"
            :fieldsLoaded="fieldsLoaded"
          />

          <person-responsible class="my-3"
            v-if="currentStep === 'personResponsible' || (formIsFlat && displayFormSection.personResponsible)"
            :drillerName.sync="form.driller_name"
            :consultantName.sync="form.consultant_name"
            :consultantCompany.sync="form.consultant_company"
            :personResponsible.sync="form.driller_responsible"
            :drillerSameAsPersonResponsible.sync="form.meta.drillerSameAsPersonResponsible"
            :errors="errors"
            :fieldsLoaded="fieldsLoaded"
          />

          <owner class="my-3"
            v-if="currentStep === 'wellOwner' || (formIsFlat && displayFormSection.wellOwner)"
            :ownerFullName.sync="form.owner_full_name"
            :ownerMailingAddress.sync="form.owner_mailing_address"
            :ownerProvinceState.sync="form.owner_province_state"
            :ownerCity.sync="form.owner_city"
            :ownerPostalCode.sync="form.owner_postal_code"
            :errors="errors"
            :fieldsLoaded="fieldsLoaded"
          />

          <location class="my-3"
            v-if="currentStep === 'wellLocation' || (formIsFlat && displayFormSection.wellLocation)"
            :ownerMailingAddress.sync="form.owner_mailing_address"
            :ownerProvinceState.sync="form.owner_province_state"
            :ownerCity.sync="form.owner_city"
            :ownerPostalCode.sync="form.owner_postal_code"
            :streetAddress.sync="form.street_address"
            :city.sync="form.city"
            :legalLot.sync="form.legal_lot"
            :legalPlan.sync="form.legal_plan"
            :legalDistrictLot.sync="form.legal_district_lot"
            :legalBlock.sync="form.legal_block"
            :legalSection.sync="form.legal_section"
            :legalTownship.sync="form.legal_township"
            :legalRange.sync="form.legal_range"
            :landDistrict.sync="form.land_district"
            :legalPID.sync="form.legal_pid"
            :wellLocationDescription.sync="form.well_location_description"
          />

          <coords class="my-3"
            v-if="currentStep === 'wellCoords' || (formIsFlat && displayFormSection.wellCoords)"
            :latitude.sync="form.latitude"
            :longitude.sync="form.longitude"
          />

          <method-of-drilling class="my-3"
            v-if="currentStep === 'method' || (formIsFlat && displayFormSection.method)"

            :groundElevation.sync="form.ground_elevation"
            :groundElevationMethod.sync="form.ground_elevation_method"
            :drillingMethod.sync="form.drilling_method"
            :otherDrillingMethod.sync="form.other_drilling_method"
            :wellOrientation.sync="form.well_orientation"
          />

          <closure-description class="my-3"
            v-if="currentStep === 'closureDescription' || (formIsFlat && displayFormSection.closureDescription)"
            :closureDescriptionSet.sync="form.decommission_description_set">

          </closure-description>

          <lithology class="my-3"
            v-if="currentStep === 'lithology' || (formIsFlat && displayFormSection.lithology)"
            :lithology.sync="form.lithologydescription_set"
          />

          <casings class="my-3"
            :key="`casingsComponent${componentUpdateTrigger}`"
            v-if="currentStep === 'casings' || (formIsFlat && displayFormSection.casings)"
            :casings.sync="form.casing_set"
            :errors="errors"
            :fieldsLoaded="fieldsLoaded"
          />

          <backfill class="my-3"
            v-if="currentStep === 'backfill' || (formIsFlat && displayFormSection.backfill)"
            :surfaceSealMaterial.sync="form.surface_seal_material"
            :surfaceSealDepth.sync="form.surface_seal_depth"
            :surfaceSealThickness.sync="form.surface_seal_thickness"
            :surfaceSealMethod.sync="form.surface_seal_method"
            :backfillAboveSurfaceSeal.sync="form.backfill_above_surface_seal"
            :backfillDepth.sync="form.backfill_above_surface_seal_depth"
          />

          <liner class="my-3"
            v-if="currentStep === 'liner' || (formIsFlat && displayFormSection.liner)"
            :linerMaterial.sync="form.liner_material"
            :linerDiameter.sync="form.liner_diameter"
            :linerThickness.sync="form.liner_thickness"
            :linerFrom.sync="form.liner_from"
            :linerTo.sync="form.liner_to"
            :linerPerforations.sync="form.linerperforation_set"
            :errors="errors"
            :fieldsLoaded="fieldsLoaded"
          />

          <screens class="my-3"
            v-if="currentStep === 'screens' || (formIsFlat && displayFormSection.screens)"
            :screenIntakeMethod.sync="form.screen_intake_method"
            :screenType.sync="form.screen_type"
            :screenMaterial.sync="form.screen_material"
            :otherScreenMaterial.sync="form.other_screen_material"
            :screenOpening.sync="form.screen_opening"
            :screenBottom.sync="form.screen_bottom"
            :screens.sync="form.screen_set"
            :errors="errors"
            :fieldsLoaded="fieldsLoaded"
          />

          <filterPack class="my-3"
            v-if="currentStep === 'filterPack' || (formIsFlat && displayFormSection.filterPack)"
            :filterPackFrom.sync="form.filter_pack_from"
            :filterPackTo.sync="form.filter_pack_to"
            :filterPackThickness.sync="form.filter_pack_thickness"
            :filterPackMaterial.sync="form.filter_pack_material"
            :filterPackMaterialSize.sync="form.filter_pack_material_size"
          />

          <development class="my-3"
            v-if="currentStep === 'wellDevelopment' || (formIsFlat && displayFormSection.wellDevelopment)"
            :developmentMethod.sync="form.development_method"
            :developmentHours.sync="form.development_hours"
            :developmentNotes.sync="form.development_notes"
          />

          <yield class="my-3"
            v-if="currentStep === 'wellYield' || (formIsFlat && displayFormSection.wellYield)"
            :productionData.sync="form.production_data_set"
          />

          <water-quality class="my-3"
            v-if="currentStep === 'waterQuality' || (formIsFlat && displayFormSection.waterQuality)"
            :waterQualityCharacteristics.sync="form.water_quality_characteristics"
            :waterQualityColour.sync="form.water_quality_colour"
            :waterQualityOdour.sync="form.water_quality_odour"
            :emsID.sync="form.ems_id"
          />

          <completion class="my-3"
            v-if="currentStep === 'wellCompletion' || (formIsFlat && displayFormSection.wellCompletion)"
            :totalDepthDrilled.sync="form.total_depth_drilled"
            :finishedWellDepth.sync="form.finished_well_depth"
            :finalCasingStickUp.sync="form.final_casing_stick_up"
            :bedrockDepth.sync="form.bedrock_depth"
            :staticWaterLevel.sync="form.static_water_level"
            :wellYield.sync="form.well_yield"
            :artesianFlow.sync="form.artesian_flow"
            :artesianPressure.sync="form.artesian_pressure"
            :wellCapType.sync="form.well_cap_type"
            :wellDisinfected.sync="form.well_disinfected"
          />

          <decommission-information class="my-3"
            v-if="currentStep === 'decommissionInformation' || (formIsFlat && displayFormSection.decommissionInformation)"
            :finishedWellDepth.sync="form.finished_well_depth"
            :decommissionReason.sync="form.decommission_reason"
            :decommissionMethod.sync="form.decommission_method"
            :sealantMaterial.sync="form.sealant_material"
            :backfillMaterial.sync="form.backfill_material"
            :decommissionDetails.sync="form.decommission_details"
          />

          <comments class="my-3"
            v-if="currentStep === 'comments' || (formIsFlat && displayFormSection.comments)"
            :comments.sync="form.comments"
            :alternativeSpecsSubmitted.sync="form.alternative_specs_submitted"
          />

          <submission-preview
            :form="form"
            :activity="activityType"
            :sections="displayFormSection"/>

               1 && !preview && !formIsFlat" @click="step > 1 ? step-- : null" variant="primary">Back
              Back to Edit

              <b-btn v-if="step < maxSteps && !formIsFlat && !preview" @click="step++" variant="primary">Next

                Preview & Submit
                Submit

      Report submitted!

          {{ errors.detail }}

          <div v-for="(field, i) in Object.keys(errors)" :key="`submissionError${i}`">
            {{field | readable}} : <span v-for="(e, j) in errors[field]" :key="`submissionError${i}-${j}`">{{ e }}

        Are you sure you want to submit this activity report?

            Save

            Cancel

        Are you sure you want to load the previously saved activity report? Your current report will be overwritten.

            Load

            Cancel

</template>


[fix] remove useless variables

[fix] remove useless variables

<template>

          <template v-if="noRefresh">

{{noDataText}}

          </template>
          <template v-else>

{{refreshText}}

              <scroller-loader :text="loadingText"></scroller-loader>

          </template>

          <slot></slot>

          <template v-if="noLoad">

{{noDataText}}

          </template>
          <template v-else>

{{bottomText}}

              <scroller-loader :text="loadingText"></scroller-loader>

          </template>

</template>


ColorPicker: active-change only triggers on user interaction  (#10903)

* ColorPicker: only emit active-change event source from dropdown, fixed #10901

* Update main.vue

<template>
  <div
    :class="[
      'el-color-picker',
      colorDisabled ? 'is-disabled' : '',
      colorSize ? `el-color-picker--${ colorSize }` : ''
    ]"
    v-clickoutside="hide">

    <picker-dropdown
       ref="dropdown"
       :class="['el-color-picker__panel', popperClass || '']"
       v-model="showPicker"
       @pick="confirmValue"
       @clear="clearValue"
       :color="color"
       :show-alpha="showAlpha"
       :predefine="predefine">
    </picker-dropdown>

</template>


fix wrong reaction img  (#2666)

 fix wrong reaction img  (#2666)

* use svg and cdn to download reactions

* fix wrong reaction img

<template>

	<template v-if="reaction == 'pudding'">

	</template>

</template>


Improve usability

Improve usability

<template>

	<component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notifications" class="transition notifications">
		<template v-for="(notification, i) in _notifications">
			<mk-notification :notification="notification" :key="notification.id"/>

				%fa:angle-up%{{ notification._datetext }}
				%fa:angle-down%{{ _notifications[i + 1]._datetext }}

		</template>
	</component>

	<button class="more" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
		<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>
		{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
	</button>

%i18n:@empty%

%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/>

</template>


Write a baseic readme for the tab group component

<template>

      <a
        v-for="(slot, name) in $slots"
        :key="name"
        @click="active = name"
        :href="`#${encodeURIComponent(name)}`"
        class="btn-tab ttu bold"
        :class="{ 'active': active === name }"
        role="tab"
      >
        {{ name }}

      <slot :name="name"/>

</template>


Update custom calendar example.

Update custom calendar example.

<template>

Custom Calendars

Roll your own calendars using scoped slots

    <v-calendar class="custom-calendar" :masks="masks" :attributes="attributes">

        {{ day.day }}

{{ attr.customData.title }}

    </v-calendar>

</template>


datepicker:修复修改时间无效bug

datepicker:修复修改时间无效bug

<template>

            <input :value="label" :placeholder="placeholder" readonly :disabled="disabled" :class="['ant-calendar-range-picker','ant-input',{['ant-input-'+size]:size}]" @click="click" @mousedown="$event.preventDefault()">

        <transition :name="bottomSpace <0 ? 'slide-up' : 'slide-down'">

                        <template v-for="(item,index) in ranges">

                        </template>

                        <template v-for="no in count">

                                        {{$data['now'+no].getFullYear()+t('datePicker.year')}}
                                        {{months[$data['now'+no].getMonth()]}}

                                        <template v-if="$data['date'+no]">

18

                                        </template>

                                <transition name="fade">

                                        <time-picker-panel prefix="ant-calendar-time-picker" v-model="timeVal[no-1]" :selected="timeSelected" :disabled-h="disabledTime[no-1].disabledHours" :disabled-m="disabledTime[no-1].disabledMinutes" local-format="HH:mm" @close="optionClose"></time-picker-panel>

                                </transition>
                                <transition name="fade">

                                        <span class="ant-calendar-year-panel-cell" v-for="(item,index) in $data[`years${no}`]" :class="item.status" @click="selectYear(index,no)" style="width:33.33%; display:inline-block;padding:9px 0">
                                            {{item.year+t('datePicker.year')}}

                                </transition>
                                <transition name="fade">

                                                        <td class="ant-calendar-month-panel-cell" v-for="m in 3" :class="$data[`months${no}`][3*(n-1)+m-1].status">
                                                            {{months[$data[`months${no}`][3*(n-1)+m-1].month-1].substr(0,3)}}

                                </transition>

                        </template>

                        <component :is="range?'div':'span'" class="ant-calendar-footer-btn">
                            {{timeSelected?t('datePicker.selectDate'):t('datePicker.selectTime')}}
                            {{t('datePicker.confirm')}}
                        </component>

        </transition>

</template>


fix add poll options

fix add poll options

<script lang="coffee">
import Records  from '@/shared/services/records'
import AppConfig  from '@/shared/services/app_config'
import EventBus from '@/shared/services/event_bus'
import Flash  from '@/shared/services/flash'
import {uniq, without, isEqual} from 'lodash'
import { onError } from '@/shared/helpers/form'

export default
  props:
    poll: Object
    close: Function

  data: ->
    originalLength: @poll.pollOptionNames.length
    isDisabled: false

  methods:
    submit: ->
      # there's a race condition here because of the way we are adding poll form options
      # hence the setTimeout
      setTimeout =>
        @poll.addOptions()
        .then =>
          @poll.removeOrphanOptions()
          Flash.success "poll_common_add_option.form.options_added"
          @close()
        .catch onError(@poll)

</script>

<template lang="pug">
v-card.poll-common-add-option-modal
  submit-overlay(:value='poll.processing')
  v-card-title
    h1.headline(tabindex="-1" v-t="'poll_common_add_option.modal.title'")
    v-spacer
    dismiss-modal-button(:close="close")
  v-card-text
    poll-common-form-options-field(:poll="poll" v-if="poll.pollType != 'meeting'" add-options-only)
    poll-meeting-form-options-field(:poll="poll" v-if="poll.pollType == 'meeting'" add-options-only)
  v-card-actions
    v-spacer
    v-btn.poll-add-option__submit(color="primary" :disabled="poll.pollOptionNames.length == originalLength" @click='submit()' :loading="poll.processing")
      span(v-t="'poll_common_add_option.form.add_options'")
</template>

<script lang="coffee">
import Records  from '@/shared/services/records'
import AppConfig  from '@/shared/services/app_config'
import EventBus from '@/shared/services/event_bus'
import Flash  from '@/shared/services/flash'
import {uniq, without, isEqual} from 'lodash'
import { onError } from '@/shared/helpers/form'

export default
  props:
    poll: Object
    close: Function

  data: ->
    isDisabled: false

  methods:
    submit: ->
      # there's a race condition here because of the way we are adding poll form options
      # hence the setTimeout
      setTimeout =>
        @poll.addOptions()
        .then =>
          @poll.removeOrphanOptions()
          Flash.success "poll_common_add_option.form.options_added"
          @close()
        .catch onError(@poll)

</script>

<template lang="pug">
v-card.poll-common-add-option-modal
  submit-overlay(:value='poll.processing')
  v-card-title
    h1.headline(tabindex="-1" v-t="'poll_common_add_option.modal.title'")
    v-spacer
    dismiss-modal-button(:close="close")
  v-card-text
    poll-common-form-options-field(:poll="poll" v-if="poll.pollType != 'meeting'" add-options-only)
    poll-meeting-form-options-field(:poll="poll" v-if="poll.pollType == 'meeting'" add-options-only)
  v-card-actions
    v-spacer
    v-btn.poll-add-option__submit(color="primary" :disabled="!poll.isModified()" @click='submit()' :loading="poll.processing")
      span(v-t="'poll_common_add_option.form.add_options'")
</template>


#27 Emit on-complete on nextTab method upon last step

<template>

      <slot name="title">

{{title}}

{{subtitle}}

      </slot>

        <slot name="step" v-for="(tab, index) in tabs"
              :tab="tab"
              :index="index"
              :navigate-to-tab="navigateToTab"
              :transition="transition">
          <wizard-step :tab="tab"
                       @click.native="navigateToTab(index)"
                       :transition="transition"
                       :index="index">
          </wizard-step>
        </slot>

        <slot>
        </slot>

      <slot name="footer"
            :next-tab="nextTab"
            :prev-tab="prevTab"
            :active-tab-index="activeTabIndex"
            :is-last-step="isLastStep"
            :fill-button-style="fillButtonStyle">

        <template>

          <slot name="prev">
            <wizard-button :style="fillButtonStyle"
                    :disabled="loading">
              {{backButtonText}}
            </wizard-button>
          </slot>

        </template>

        <template>

           <slot name="nextTab">
             <wizard-button :style="fillButtonStyle">
              {{finishButtonText}}
            </wizard-button>
          </slot>

        </template>

        <template>

         <slot name="next">
           <wizard-button :style="fillButtonStyle"
                   :disabled="loading">
            {{nextButtonText}}
           </wizard-button>
         </slot>

        </template>
      </slot>

</template>

<template>

      <slot name="title">

{{title}}

{{subtitle}}

      </slot>

        <slot name="step" v-for="(tab, index) in tabs"
              :tab="tab"
              :index="index"
              :navigate-to-tab="navigateToTab"
              :transition="transition">
          <wizard-step :tab="tab"
                       @click.native="navigateToTab(index)"
                       :transition="transition"
                       :index="index">
          </wizard-step>
        </slot>

        <slot>
        </slot>

      <slot name="footer"
            :next-tab="nextTab"
            :prev-tab="prevTab"
            :active-tab-index="activeTabIndex"
            :is-last-step="isLastStep"
            :fill-button-style="fillButtonStyle">

        <template>

          <slot name="prev">
            <wizard-button :style="fillButtonStyle"
                    :disabled="loading">
              {{backButtonText}}
            </wizard-button>
          </slot>

        </template>

        <template>

           <slot name="finish">
             <wizard-button :style="fillButtonStyle">
              {{finishButtonText}}
            </wizard-button>
          </slot>

        </template>

        <template>

         <slot name="next">
           <wizard-button :style="fillButtonStyle"
                   :disabled="loading">
            {{nextButtonText}}
           </wizard-button>
         </slot>

        </template>
      </slot>

</template>


Fixed button type

Fixed button type

<template>

{{pageName}}

      <name-and-description
        form-title='Step 1: Give your project a name'
        :description='description'
        :name='projectName'
        :focus='true' @updated='saveNameAndDescription'>

          <ui-button type='secondary' color='primary' @click.prevent='goBack' buttonType='button'>
            Go Back
          </ui-button>
          <ui-button type='secondary' color='primary' buttonType='submit'>
            Next
          </ui-button>

      </name-and-description>

      <project-structure form-title='Step 2: Project structure' @updated='saveFields' :fields='fields'>
        <template scope='props'>

          <ui-button type='secondary' color='primary' @click.prevent='step = 1' buttonType='button'>
            Go Back
          </ui-button>
          <ui-button type='secondary' color='primary' buttonType='submit' :disabled='props.hasError'>
            Create Project
          </ui-button>

        </template>
      </project-structure>

        <ui-icon-button icon='refresh' :loading='true' type='secondary'></ui-icon-button>
          Creating new project...

Something is wrong...

          I couldn't create a new project. Please try again. If error persists, please reach out to me at anvaka@gmail.com.

Technical details

{{error}}

</template>

<template>

{{pageName}}

      <name-and-description
        form-title='Step 1: Give your project a name'
        :description='description'
        :name='projectName'
        :focus='true' @updated='saveNameAndDescription'>

          <ui-button type='secondary' color='primary' @click.prevent='goBack'>
            Go Back
          </ui-button>
          <ui-button type='secondary' color='primary' buttonType='submit'>
            Next
          </ui-button>

      </name-and-description>

      <project-structure form-title='Step 2: Project structure' @updated='saveFields' :fields='fields'>
        <template scope='props'>

          <ui-button type='secondary' color='primary' @click.prevent='step = 1'>
            Go Back
          </ui-button>
          <ui-button type='secondary' color='primary' buttonType='submit' :disabled='props.hasError'>
            Create Project
          </ui-button>

        </template>
      </project-structure>

        <ui-icon-button icon='refresh' :loading='true' type='secondary'></ui-icon-button>
          Creating new project...

Something is wrong...

          I couldn't create a new project. Please try again. If error persists, please reach out to me at anvaka@gmail.com.

Technical details

{{error}}

</template>


update c-calendar

update c-calendar

<template>

      <button v-show="this.view === 'd'" @click="_prev('M')"><</button>
      <button @click="_switch('M')">{{monthName}}</button>
      <button @click="_switch('y')">{{year}}</button>
      <button v-show="this.view === 'd'" @click="_next('M')">></button>

        {{year.value}}

        {{month.label}}

        {{weekName}}

        {{day.value}}

</template>


新增管理员调整

新增管理员调整

<template>

      <Form-item label="姓名" prop="username">

      </Form-item>
      <Form-item label="备注信息">

      </Form-item>
      <Form-item label="邮件地址" prop="email">

      </Form-item>
      <Form-item label="所在小组" prop="groupIndex">

          {{item.name}}

      </Form-item>
      <Form-item label="排序值" v-if="isAdmin">

      </Form-item>
      <Form-item label="重置密码" v-if="isSelf">
        重置密码
      </Form-item>
      <Form-item label="管理员" v-if="isAdmin">
        <Checkbox label="admin" v-model="curruser.isAdmin" :disabled="isSelf" @changeAdmin="changeAdmin">
            <Icon type="settings"></Icon>
            设为管理员
        </Checkbox>
      </Form-item>
      <Form-item>
        保存
        取消
      </Form-item>

</template>

<template>
  <div class="user-editor" :user="user" :userId="userId" :isAdmin="isAdmin" :groups="groups">
    <i-form ref="form" :model="curruser" :rules="rules" label-position="right" :label-width="80">
      <Form-item label="姓名" prop="username">
        <i-input v-model="curruser.username" icon="person"></i-input>
      </Form-item>
      <Form-item label="备注信息">
        <i-input v-model="curruser.extInfo" icon="ios-information" :disabled="!curruser.isAdmin"></i-input>
      </Form-item>
      <Form-item label="邮件地址" prop="email">
        <i-input v-model="curruser.email" icon="email"></i-input>
      </Form-item>
      <Form-item label="所在小组" prop="groupIndex">
        <i-select v-model="curruser.groupIndex">
          <i-option v-for="item in groups" :key="item.index" :value="item.index">{{item.name}}</i-option>
        </i-select>
      </Form-item>
      <Form-item label="排序值" v-if="curruser.isAdmin">
        <i-input v-model="curruser.memberIndex" number="true" icon="sort" title="数值越小越靠前"></i-input>
      </Form-item>
      <Form-item label="重置密码" v-if="!curruser.isAdmin">
        <i-button @click="resetPwd">重置密码</i-button>
      </Form-item>
      <Form-item>
        <i-button type="primary" @click="save">保存</i-button>
        <i-button @click="cancel">取消</i-button>
      </Form-item>
    </i-form>
  </div>
</template>

<script>
import Form from 'iview/src/components/form/form';
import FormItem from 'iview/src/components/form/form-item';
import Input from 'iview/src/components/input/input';
import Button from 'iview/src/components/button/button';
import { Select, Option } from 'iview/src/components/select';
import Message from 'iview/src/components/message';
import Icon from 'iview/src/components/icon';
import AV from 'leancloud-storage';

export default {
  name: 'userEditor',
  components: {
    'i-form': Form,
    FormItem,
    Icon,
    'i-button': Button,
    'i-input': Input,
    'i-select': Select,
    'i-option': Option
  },
  props: {
    user: Object,
    userId: String,
    isAdmin: {
      default: false,
      type: Boolean
    },
    groups: Array
  },
  data() {
    return {
      // 克隆一份作为编辑使用
      curruser: JSON.parse(JSON.stringify(this.user)),
      rules: {
        username: [
          {
            required: true,
            message: '请填姓名',
            trigger: 'blur'
          }
        ],
        email: [
          {
            required: true,
            message: '请填写邮箱',
            trigger: 'blur'
          },
          {
            type: 'email',
            message: '邮箱格式不正确',
            trigger: 'blur'
          }
        ],
        groupIndex: [
          {
            required: true,
            message: '必须选择所在小组'
          }
        ]
      }
    };
  },
  methods: {
    resetPwd() {
      if (this.user.email) {
        AV.User.requestPasswordReset(this.user.email).then(d => {
          Message.info({
            content: '重置密码邮件已经发送至 ' + this.user.email,
            closable: true,
            duration: 3
          });
        });
      }
    },
    save() {
      this.$refs.form.validate(isValidated => {
        if (!isValidated) return;
        let o = this.user;
        let c = this.curruser;
        let data = {};

        if (o.username !== c.username) data.username = c.username;
        if (o.email !== c.email) data.email = c.email;
        if (o.groupIndex !== c.groupIndex) data.groupIndex = c.groupIndex;

        if (this.isAdmin) {
          if (o.extInfo !== c.extInfo) data.extInfo = c.extInfo;
          if (o.memberIndex !== c.memberIndex) data.memberIndex = c.memberIndex;
        }

        this.$emit('save', data, this.userId);
      });
    },
    cancel() {
      this.$emit('cancel');
    }
  }
};
</script>

<style>

</style>


fixed bug

fixed bug

<template>

                  <input class="check" v-if='multiple' type="checkbox" @change="changeCheckStatus(item, $event)" v-model="item.checked"/>

              <Render :node="item" :tpl ='tpl'/>

          <transition name="bounce">
            <tree v-if="!isLeaf(item)" :searchable='searchable' :async="async" :searchexpression='searchexpression' v-show="item.expanded" :tpl ="tpl" :data="item.children" :halfcheck='halfcheck' :level="`${level}-${index}`"  :scoped='scoped' :parent ='item' :multiple="multiple"></tree>
          </transition>

</template>

<template>

                  <input class="check" v-if='multiple' type="checkbox" @change="changeCheckStatus(item, $event)" v-model="item.checked"/>

 {{item.selected}}
              <Render :node="item" :tpl ='tpl'/>

          <transition name="bounce">
            <tree v-if="!isLeaf(item)"  :searchexpression='searchexpression' v-show="item.expanded" :tpl ="tpl" :data="item.children" :halfcheck='halfcheck' :level="`${level}-${index}`"  :scoped='scoped' :parent ='item' :multiple="multiple"></tree>
          </transition>

</template>


Update DialogMessage.vue

Update DialogMessage.vue

<template>

{{ title }}

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

                        <slot name="body"></slot>

                        <button type="button" class="btn btn-secondary" data-dismiss="modal" @click="closed">
                            {{ closeText }}
                        </button>

</template>


Display count of contacts after Tags #226

<template>

            Runde:

            <router-link
                :to="{name: 'WalkDetail', params: { walkId: walk.id}}"
            >
                {{ walk.name }}
            </router-link>

                {{ field.name }}:

                <location-link
                    v-if="field.name === 'Ort'"
                    :value="field.value"
                />
                <nl2br
                    v-else-if="field.name === 'Beobachtung'"
                    tag="div"
                    :text="field.value.trim()"
                    class-name="text-left"
                />

                    {{ field.value === null ? 'nicht erfasst' : field.value}}

                <nl2br
                    v-else-if="field.name === 'Einzelgespräch'"
                    tag="div"
                    :text="field.value.trim()"
                    class-name="text-left"
                />

                    <template
                        v-if="0 === field.value.length"
                    >
                        keine Tags vergeben
                    </template>
                    <template
                        v-for="tag in field.value"
                    >
                        {{ tag.name }}
                        <color-badge
                            :color="tag.color"
                            class="mr-2"
                        />
                    </template>

                <template
                    v-else-if="field.name === 'Bild'"
                >
                    <silent-box
                        v-if="field.value"
                        :gallery="gallery"
                    />

                    <template v-else>
                        kein Bild hochgeladen
                    </template>
                </template>
                <template v-else>
                    {{ field.value }}
                </template>

</template>


Fix spelling error in Tooltip documentation (#220)

<template>

Tooltip

Display a brief helper text to your user

                    <button class="button is-dark">Right</button>

                    <button class="button is-dark">Top (default)</button>

                    <button class="button is-dark">Bottom</button>

                    <button class="button is-dark">Left</button>

{{ template1 | pre }}

Styles

                    Simple text

                    <button class="button">Animated</button>

                    <button class="button">Dark</button>

                    <button class="button">Light</button>

                    <button class="button">Always</button>

                    <button class="button">Square</button>

{{ template2 | pre }}

Multilined

Well, it's not always that brief

                    <button class="button is-dark">Multiline (default)</button>

                    <button class="button is-dark">Multiline (small)</button>

                    <button class="button is-dark">Multiline (large)</button>

{{ template3 | pre }}

API

                    <template scope="props">

                            {{ props.row.type }}

                    </template>

</template>


finish demos setting

finish demos setting

<script lang="coffee">
import AppConfig      from '@/shared/services/app_config'
import Session        from '@/shared/services/session'
import Records        from '@/shared/services/records'
import EventBus       from '@/shared/services/event_bus'
import AbilityService from '@/shared/services/ability_service'
import LmoUrlService  from '@/shared/services/lmo_url_service'
import InboxService   from '@/shared/services/inbox_service'

import { isUndefined, sortBy, filter, find, head, each, uniq, map, sum, compact,
         concat, intersection, difference, orderBy } from 'lodash'

export default
  data: ->
    organization: null
    open: false
    group: null
    version: AppConfig.version
    tree: []
    myGroups: []
    otherGroups: []
    organizations: []
    unreadCounts: {}
    expandedGroupIds: []
    openGroups: []
    unreadDirectThreadsCount: 0

  created: ->
    EventBus.$on 'toggleSidebar', => @open = !@open

    EventBus.$on 'currentComponent', (data) =>
      @group = data.group
      if @group
        @organization = data.group.parentOrSelf()
        @expandedGroupIds = [@organization.id]
      else
        @organization = null

    @watchRecords
      collections: ['groups', 'memberships', 'discussions']
      query: (store) =>
        @unreadDirectThreadsCount =
          Records.discussions.collection.chain().
                  find({groupId: null}).
                  where((thread) -> thread.isUnread()).data().length
        @updateGroups()

    EventBus.$on 'signedIn', (user) =>
      @fetchData()
      @openIfPinned()

    @fetchData() if Session.isSignedIn()

  mounted: ->
    @openIfPinned()

  watch:
    organization: 'updateGroups'

    open: (val) ->
      EventBus.$emit("sidebarOpen", val)

  methods:
    memberGroups: (group) ->
      group.subgroups().filter (g) -> !g.archivedAt && g.membershipFor(Session.user())

    openIfPinned: ->
      @open = !!Session.isSignedIn() && !!Session.user().experiences['sidebar'] && @$vuetify.breakpoint.lgAndUp

    fetchData: ->
      Records.users.fetchGroups().then =>
        if @$router.history.current.path == "/dashboard" && Session.user().groups().length == 1
          @$router.replace("/g/#{Session.user().groups()[0].key}")
        if @$router.history.current.path == "/dashboard" && Session.user().groups().length == 0
          if AppConfig.features.app.subscriptions
            @$router.replace("/try")
          else
            @$router.replace("/g/new")

      InboxService.load()

    goToGroup: (group) ->
      @$router.push @urlFor(group)

    updateGroups: ->
      @organizations = compact(Session.user().parentGroups().concat(Session.user().orphanParents())) || []
      @openCounts = {}
      @closedCounts = {}
      @openGroups = []
      Session.user().groups().forEach (group) =>
        @openCounts[group.id] = filter(group.discussions(), (discussion) -> discussion.isUnread()).length
      Session.user().parentGroups().forEach (group) =>
        if @organization && @organization.id == group.parentOrSelf().id
          @openGroups[group.id] = true
        @closedCounts[group.id] = @openCounts[group.id] + sum(map(@memberGroups(group), (subgroup) => @openCounts[subgroup.id]))

    unreadThreadCount: ->
      InboxService.unreadCount()

    canViewPublicGroups: -> AbilityService.canViewPublicGroups()
    setProfilePicture: -> EventBus.$emit 'openModal', {component: 'ChangePictureForm'}

  computed:
    isSignedIn: -> Session.isSignedIn()
    user: -> Session.user()
    activeGroup: -> if @group then [@group.id] else []
    logoUrl: -> AppConfig.theme.app_logo_src
    canStartGroups: -> AbilityService.canStartGroups()
    canStartDemo: -> AppConfig.features.app.demos
    needProfilePicture: ->
      Session.isSignedIn() && @user && !@user.avatarUrl && !@user.hasExperienced('changePicture')

</script>

<template lang="pug">
v-navigation-drawer.sidenav-left.lmo-no-print(app v-model="open")
  template(v-slot:prepend)
  template(v-slot:append)
    v-layout.mx-10.my-2(column align-center style="max-height: 64px")
      v-img(:src="logoUrl")

  v-list-group.sidebar__user-dropdown
    template(v-slot:activator)
      v-list-item-icon.mr-2
        user-avatar(:user="user")
      v-list-item-content
        v-list-item-title {{user.name}}
        v-list-item-subtitle {{user.email}}
    user-dropdown
  template(v-if="needProfilePicture")
    v-divider
    v-list-item.sidebar__list-item-button--recent(@click="setProfilePicture" color="warning")
      v-list-item-icon
        v-icon mdi-emoticon-outline
      v-list-item-content
        v-list-item-title(v-t="'profile_page.incomplete_profile'")
        v-list-item-subtitle(v-t="'profile_page.set_your_profile_picture'")
  v-divider

  v-list-item.sidebar__list-item-button--recent(dense to="/dashboard")
    v-list-item-title(v-t="'dashboard_page.aria_label'")
  v-list-item(dense to="/inbox")
    v-list-item-title(v-t="{ path: 'sidebar.unread_threads', args: { count: unreadThreadCount() } }")
  v-list-item.sidebar__list-item-button--private(dense to="/threads/direct")
    v-list-item-title
      span(v-t="'sidebar.invite_only_threads'")
      span(v-if="unreadDirectThreadsCount > 0")
        space
        span ({{unreadDirectThreadsCount}})
  v-list-item.sidebar__list-item-button--start-thread(dense to="/d/new")
    v-list-item-title(v-t="'sidebar.start_thread'")
    v-list-item-avatar(:size="28")
      v-icon(tile) mdi-plus
  v-list-item(dense to="/tasks")
    v-list-item-title(v-t="'tasks.tasks'")
  v-divider

  v-list.sidebar__groups(dense)
    template(v-for="parentGroup in organizations")
      template(v-if="memberGroups(parentGroup).length")
        v-list-group(v-model="openGroups[parentGroup.id]"  @click="goToGroup(parentGroup)")
          template(v-slot:activator)
            v-list-item-avatar(aria-hidden="true")
              group-avatar(:group="parentGroup")
            v-list-item-content
              v-list-item-title
                span {{parentGroup.name}}
                template(v-if="closedCounts[parentGroup.id]")
                  |
                  span ({{closedCounts[parentGroup.id]}})
          v-list-item(:to="urlFor(parentGroup)+'?subgroups=none'")
            v-list-item-content
              v-list-item-title
                span {{parentGroup.name}}
                template(v-if='openCounts[parentGroup.id]')
                  |
                  span ({{openCounts[parentGroup.id]}})
          v-list-item(v-for="group in memberGroups(parentGroup)" :key="group.id" :to="urlFor(group)")
            v-list-item-content
              v-list-item-title
                span {{group.name}}
                template(v-if='openCounts[group.id]')
                  |
                  span ({{openCounts[group.id]}})
      template(v-else)
        v-list-item(:to="urlFor(parentGroup)")
          v-list-item-avatar
            group-avatar(:group="parentGroup")
          v-list-item-content
            v-list-item-title
              span {{parentGroup.name}}
              template(v-if='openCounts[parentGroup.id]')
                |
                span ({{openCounts[parentGroup.id]}})

  v-divider

  v-list-item.sidebar__list-item-button--start-group(v-if="canStartGroups" to="/g/new" dense)
    v-list-item-title(v-t="'group_form.new_group'")
    v-list-item-avatar(:size="28")
      v-icon(tile) mdi-plus
  v-divider
  v-list-item.sidebar__list-item-button--start-group(v-if="canStartDemo" to="/try" dense)
    v-list-item-title(v-t="'templates.start_a_demo'")
    v-list-item-avatar(:size="28")
      v-icon(tile) mdi-car-convertible
  v-list-item(dense to="/explore" v-if="!canStartDemo")
    v-list-item-title(v-t="'sidebar.explore_groups'")
</template>
<style lang="sass">
.sidenav-left
  .v-avatar.v-list-item__avatar
    margin-right: 8px
  .v-list-group .v-list-group__header .v-list-item__icon.v-list-group__header__append-icon
    min-width: 0
  .v-list-item__icon.v-list-group__header__append-icon
    min-width: 32px
  .v-list-item__icon.v-list-group__header__append-icon
    margin-left: 0 !important
</style>

<script lang="coffee">
import AppConfig      from '@/shared/services/app_config'
import Session        from '@/shared/services/session'
import Records        from '@/shared/services/records'
import EventBus       from '@/shared/services/event_bus'
import AbilityService from '@/shared/services/ability_service'
import LmoUrlService  from '@/shared/services/lmo_url_service'
import InboxService   from '@/shared/services/inbox_service'

import { isUndefined, sortBy, filter, find, head, each, uniq, map, sum, compact,
         concat, intersection, difference, orderBy } from 'lodash'

export default
  data: ->
    organization: null
    open: false
    group: null
    version: AppConfig.version
    tree: []
    myGroups: []
    otherGroups: []
    organizations: []
    unreadCounts: {}
    expandedGroupIds: []
    openGroups: []
    unreadDirectThreadsCount: 0

  created: ->
    EventBus.$on 'toggleSidebar', => @open = !@open

    EventBus.$on 'currentComponent', (data) =>
      @group = data.group
      if @group
        @organization = data.group.parentOrSelf()
        @expandedGroupIds = [@organization.id]
      else
        @organization = null

    @watchRecords
      collections: ['groups', 'memberships', 'discussions']
      query: (store) =>
        @unreadDirectThreadsCount =
          Records.discussions.collection.chain().
                  find({groupId: null}).
                  where((thread) -> thread.isUnread()).data().length
        @updateGroups()

    EventBus.$on 'signedIn', (user) =>
      @fetchData()
      @openIfPinned()

    @fetchData() if Session.isSignedIn()

  mounted: ->
    @openIfPinned()

  watch:
    organization: 'updateGroups'

    open: (val) ->
      EventBus.$emit("sidebarOpen", val)

  methods:
    memberGroups: (group) ->
      group.subgroups().filter (g) -> !g.archivedAt && g.membershipFor(Session.user())

    openIfPinned: ->
      @open = !!Session.isSignedIn() && !!Session.user().experiences['sidebar'] && @$vuetify.breakpoint.lgAndUp

    fetchData: ->
      Records.users.fetchGroups().then =>
        if @$router.history.current.path == "/dashboard" && Session.user().groups().length == 1
          @$router.replace("/g/#{Session.user().groups()[0].key}")
        if @$router.history.current.path == "/dashboard" && Session.user().groups().length == 0
          if AppConfig.features.app.subscriptions
            @$router.replace("/try")
          else
            @$router.replace("/g/new")

      InboxService.load()

    goToGroup: (group) ->
      @$router.push @urlFor(group)

    updateGroups: ->
      @organizations = compact(Session.user().parentGroups().concat(Session.user().orphanParents())) || []
      @openCounts = {}
      @closedCounts = {}
      @openGroups = []
      Session.user().groups().forEach (group) =>
        @openCounts[group.id] = filter(group.discussions(), (discussion) -> discussion.isUnread()).length
      Session.user().parentGroups().forEach (group) =>
        if @organization && @organization.id == group.parentOrSelf().id
          @openGroups[group.id] = true
        @closedCounts[group.id] = @openCounts[group.id] + sum(map(@memberGroups(group), (subgroup) => @openCounts[subgroup.id]))

    unreadThreadCount: ->
      InboxService.unreadCount()

    canViewPublicGroups: -> AbilityService.canViewPublicGroups()
    setProfilePicture: -> EventBus.$emit 'openModal', {component: 'ChangePictureForm'}

  computed:
    isSignedIn: -> Session.isSignedIn()
    user: -> Session.user()
    activeGroup: -> if @group then [@group.id] else []
    logoUrl: -> AppConfig.theme.app_logo_src
    canStartGroups: -> AbilityService.canStartGroups()
    canStartDemo: -> AppConfig.features.app.subscriptions
    needProfilePicture: ->
      Session.isSignedIn() && @user && !@user.avatarUrl && !@user.hasExperienced('changePicture')

</script>

<template lang="pug">
v-navigation-drawer.sidenav-left.lmo-no-print(app v-model="open")
  template(v-slot:prepend)
  template(v-slot:append)
    v-layout.mx-10.my-2(column align-center style="max-height: 64px")
      v-img(:src="logoUrl")

  v-list-group.sidebar__user-dropdown
    template(v-slot:activator)
      v-list-item-icon.mr-2
        user-avatar(:user="user")
      v-list-item-content
        v-list-item-title {{user.name}}
        v-list-item-subtitle {{user.email}}
    user-dropdown
  template(v-if="needProfilePicture")
    v-divider
    v-list-item.sidebar__list-item-button--recent(@click="setProfilePicture" color="warning")
      v-list-item-icon
        v-icon mdi-emoticon-outline
      v-list-item-content
        v-list-item-title(v-t="'profile_page.incomplete_profile'")
        v-list-item-subtitle(v-t="'profile_page.set_your_profile_picture'")
  v-divider

  v-list-item.sidebar__list-item-button--recent(dense to="/dashboard")
    v-list-item-title(v-t="'dashboard_page.aria_label'")
  v-list-item(dense to="/inbox")
    v-list-item-title(v-t="{ path: 'sidebar.unread_threads', args: { count: unreadThreadCount() } }")
  v-list-item.sidebar__list-item-button--private(dense to="/threads/direct")
    v-list-item-title
      span(v-t="'sidebar.invite_only_threads'")
      span(v-if="unreadDirectThreadsCount > 0")
        space
        span ({{unreadDirectThreadsCount}})
  v-list-item.sidebar__list-item-button--start-thread(dense to="/d/new")
    v-list-item-title(v-t="'sidebar.start_thread'")
    v-list-item-avatar(:size="28")
      v-icon(tile) mdi-plus
  v-list-item(dense to="/tasks")
    v-list-item-title(v-t="'tasks.tasks'")
  v-divider

  v-list.sidebar__groups(dense)
    template(v-for="parentGroup in organizations")
      template(v-if="memberGroups(parentGroup).length")
        v-list-group(v-model="openGroups[parentGroup.id]"  @click="goToGroup(parentGroup)")
          template(v-slot:activator)
            v-list-item-avatar(aria-hidden="true")
              group-avatar(:group="parentGroup")
            v-list-item-content
              v-list-item-title
                span {{parentGroup.name}}
                template(v-if="closedCounts[parentGroup.id]")
                  |
                  span ({{closedCounts[parentGroup.id]}})
          v-list-item(:to="urlFor(parentGroup)+'?subgroups=none'")
            v-list-item-content
              v-list-item-title
                span {{parentGroup.name}}
                template(v-if='openCounts[parentGroup.id]')
                  |
                  span ({{openCounts[parentGroup.id]}})
          v-list-item(v-for="group in memberGroups(parentGroup)" :key="group.id" :to="urlFor(group)")
            v-list-item-content
              v-list-item-title
                span {{group.name}}
                template(v-if='openCounts[group.id]')
                  |
                  span ({{openCounts[group.id]}})
      template(v-else)
        v-list-item(:to="urlFor(parentGroup)")
          v-list-item-avatar
            group-avatar(:group="parentGroup")
          v-list-item-content
            v-list-item-title
              span {{parentGroup.name}}
              template(v-if='openCounts[parentGroup.id]')
                |
                span ({{openCounts[parentGroup.id]}})

  v-divider

  v-list-item.sidebar__list-item-button--start-group(v-if="canStartGroups" to="/g/new" dense)
    v-list-item-title(v-t="'group_form.new_group'")
    v-list-item-avatar(:size="28")
      v-icon(tile) mdi-plus
  v-divider
  v-list-item.sidebar__list-item-button--start-group(v-if="canStartDemo" to="/try" dense)
    v-list-item-title(v-t="'templates.start_a_demo'")
    v-list-item-avatar(:size="28")
      v-icon(tile) mdi-car-convertible
  v-list-item(dense to="/explore" v-if="!canStartDemo")
    v-list-item-title(v-t="'sidebar.explore_groups'")
</template>
<style lang="sass">
.sidenav-left
  .v-avatar.v-list-item__avatar
    margin-right: 8px
  .v-list-group .v-list-group__header .v-list-item__icon.v-list-group__header__append-icon
    min-width: 0
  .v-list-item__icon.v-list-group__header__append-icon
    min-width: 32px
  .v-list-item__icon.v-list-group__header__append-icon
    margin-left: 0 !important
</style>


HUE-9485 [ui] Search input text is getting clipped

<template>

      <form autocomplete="off">
        <input
          :value="value"
          class="hue-search-input-el"
          autocorrect="off"
          autocomplete="do-not-autocomplete"
          autocapitalize="off"
          spellcheck="false"
          type="text"
          :placeholder="(!hasFocus && placeholder) || ''"
          :class="{ 'magnify-icon-input': showMagnify }"
          @input="$emit('input', $event.target.value)"
          @focusin="hasFocus = true"
          @focusout="hasFocus = false"
          @keyup.enter="$emit('search', value)"
        />
        <input
          v-model="autocomplete"
          class="hue-search-input-overlay"
          disabled
          type="text"
          autocomplete="do-not-autocomplete"
          :class="{ 'magnify-icon-input': showMagnify }"
        />
      </form>

</template>


fix: 🐛 calcTxFee null given value

fix: 🐛 calcTxFee null given value

<template>

      This fee is charged by the Ethereum network and fluctuates depending on
      network traffic. MEW does not profit from this fee.

      <div
        v-for="(b, key) in buttons"
        :id="$data[`${b.title}Disabled`] ? 'disabled' : ''"
        :key="key"
        class="mb-2 d-flex align-center justify-space-between group-button"
        :class="[gasPriceType === b.title ? 'active' : '']"
        @click.stop="
          () => {
            setSelected(b.title);
          }
        "
      >

            <v-icon v-if="b.title === gasPriceTypes.ECONOMY" color="textBlack">
              mdi-check
            </v-icon>

              {{ b.priority }}

                {{ economyInEth }} {{ currencyName }}

                {{ regularInEth }} {{ currencyName }}

                {{ fastInEth }} {{ currencyName }}

                ${{ economyInUsd }}

                ${{ regularInUsd }}

                ${{ fastInUsd }}

          <v-icon class="mr-1" color="primary" small>mdi-clock-outline</v-icon>

{{ b.time }}

        Can't increase priority?
         Buy more ETH

</template>


change login panel to modal

change login panel to modal

<template>

      <Tag type="dot" color="green">{{credentials.username}}</Tag>
      <Button @click="logout" icon="logout" size="small">Logout</Button>

      <Button class="login-button" icon="person" size="small" @click="loginModal=true">Login</Button>

    <Modal class="login-modal" v-model="loginModal" title="Login to Docker Hub" @on-ok="login">
      <Form :model="credentials" inline>
        <Form-item prop="username">
          <Input type="text" v-model="credentials.username" placeholder="Username">
            <Icon type="ios-person-outline" slot="prepend"></Icon>
          </Input>
        </Form-item>
        <Form-item prop="password">
          <Input type="password" v-model="credentials.password" placeholder="Password">
            <Icon type="ios-locked-outline" slot="prepend"></Icon>
          </Input>
        </Form-item>
      </Form>
    </Modal>

</template>

<template>

    <Poptip trigger="hover" placement="bottom">
      <Tag type="dot" color="green">{{credentials.username}}</Tag>

        <Button @click="logout" icon="logout">Logout</Button>

    </Poptip>

    <Poptip placement="bottom-end">
      <Button class="login-button" icon="person">Login</Button>

        <Form :model="credentials">
          <Form-item prop="username">
            <Input type="text" v-model="credentials.username" placeholder="Username">
              <Icon type="ios-person-outline" slot="prepend"></Icon>
            </Input>
          </Form-item>
          <Form-item prop="password">
            <Input type="password" v-model="credentials.password" placeholder="Password">
              <Icon type="ios-locked-outline" slot="prepend"></Icon>
            </Input>
          </Form-item>
          <Form-item>
            <Button class="go-button" type="primary" @click="login">Go</Button>
          </Form-item>
        </Form>

    </Poptip>

</template>


Fix showing notes on request from public body

<template>

    <slot name="request-legend-title"></slot>

 1" class="publicbody-summary-container">

          {{ i18n._('toMultiPublicBodies', {count: publicBodies.length}) }}

              {{ i18n.change }}

            {{ i18n._('toPublicBody', {name: publicBody.name}) }}

                {{ i18n.change }}

    <input v-for="pb in publicBodies" type="hidden" name="publicbody" :value="pb.id" :key="pb.id">
    <input type="hidden" name="law_type" :value="lawType">

 0" class="alert alert-danger">

{{ error }}

            {{ i18n.subject }}

            <input type="hidden" name="subject" :value="subject"/>
            {{ subject }}
            <button @click.prevent="editingDisabled = false" class="btn btn-sm btn-white pull-right">
              {{ i18n.reviewEdit }}

                {{ i18n.reviewEdit }}

            </button>

          <input v-else v-model="subject" type="text" name="subject" class="form-control" id="id_subject" :class="{ 'is-invalid': errors.subject }" :placeholder="formFields.subject.placeholder" @keydown.enter.prevent/>

            {{ i18n.warnFullText }}

            <transition name="saved-full-text">

                  {{ i18n.savedFullTextChanges }}

                <textarea class="saved-body" v-model="savedFullTextBody" readonly></textarea>

            </transition>
            <slot name="request-hints"></slot>
            <button v-if="fullTextDisabled" class="btn btn-light btn-sm" @click.prevent="resetFullText" >
              {{ i18n.resetFullText }}
            </button>

{{ letterStart }}

{{ body }}

            <textarea v-show="!editingDisabled" v-model="body" name="body" id="id_body" class="form-control body-textarea" :class="{ 'is-invalid': errors.body, 'attention': !hasBody }" :rows="bodyRows" @keyup="bodyChanged" :placeholder="formFields.body.placeholder"></textarea>

              <input type="checkbox" id="full_text_checkbox" name="full_text_checkbox" v-model="fullText" :disabled="fullTextDisabled">

              {{ formFields.full_text.label }}

            <input type="hidden" name="full_text" v-model="fullText">

<template v-if="!fullLetter">[…]
{{ letterEndShort }}</template><template v-else>
{{ letterEnd }}</template>

{{ letterSignature }}

{{ letterSignatureName }}

                  {{ i18n.yourFirstName }}

                <input v-model="first_name" type="text" name="first_name" class="form-control" :class="{ 'is-invalid': usererrors.first_name }" id="id_first_name" :placeholder="userformFields.first_name.placeholder" required/>

{{ e.message }}

                  {{ i18n.yourLastName }}

                <input v-model="last_name" type="text" name="last_name" class="form-control" :class="{ 'is-invalid': usererrors.last_name }" id="id_last_name" :placeholder="userformFields.last_name.placeholder" required/>

{{ e.message }}

</template>


Fix hound

Fix hound

<template>

        <SectionTitle class="grid-cell">
          <template slot="icon">

          </template>
          <template slot="title">
              {{ $t('CatalogPage.header') }}
          </template>
        </SectionTitle>

        <CatalogDropdown ref="dropdownCategories"
          :title="$t('CatalogDropdown.category.title')"
          :placeholder="$t('CatalogDropdown.category.placeholder')"
          :options="categories"
          :disabled="true"
          @selected="getCountries"
          @reset="resetCategory">
          <template slot="extra">

          </template>
        </CatalogDropdown>

        <CatalogDropdown ref="dropdownCountries"
          :title="$t('CatalogDropdown.country.title')"
          :placeholder="$t('CatalogDropdown.country.placeholder')"
          :options="countries"
          :disabled="true"
          :limitHeight="true"
          @open="false"
          @selected="getDatasets"
          @reset="resetCountry">
          <template slot="extra">

          </template>
        </CatalogDropdown>

 0">

        <CatalogListHeader :order="appliedOrder" :orderDirection="appliedOrderDirection" @changeOrder="applyOrder"></CatalogListHeader>

            <CatalogCard :dataset="dataset"></CatalogCard>

            <CatalogFakeCard />

    <Pagination v-if="shouldShowPagination" :page=currentPage :numPages=numPages @pageChange="goToPage"></Pagination>

</template>


Added geocoder outside of the map and made it closer to comp. Will need to refine once dimensions are known

<template lang='html'>

      <md-layout style="position: absolute; bottom: 0; left: 0; right: 0; padding-bottom: 1rem;">
        <md-button @click="showRuleList" :style="{background: buttonColor, color: 'white'}" class="md-raised" style="width: 75%; margin-left: auto; margin-right: auto;">Restrictions</md-button>
      </md-layout>

</template>


Fix double fire of submit event

Fix double fire of submit event

<template>

Invite Member

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

                    <form id="inviteMemberForm" v-on:submit.prevent="submit">

                                Enter a first name to search...

                                <user-lookup v-model="user"></user-lookup>

                                <button type="button" class="btn btn-primary" @click="submit">Submit</button>

                                 {{feedback}}

                    </form>

                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>

</template>

<template>

Invite Member

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

                    <form id="inviteMemberForm" v-on:submit.prevent="submit">

                                Enter a first name to search...

                                <user-lookup v-model="user"></user-lookup>

                                <button type="submit" class="btn btn-primary" @click="submit">Submit</button>

                                 {{feedback}}

                    </form>

                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>

</template>


static

static

<template>

    <common-header></common-header>

      <navigator module="registration"></navigator>

          您的当前位置 :报名管理 >  培训报名管理 > 添加报名

          <el-form ref="form" :inline="true" :model="form" class="demo-form-inline mt20 hidden" label-width="80px">
            <el-col :span="8">
              <el-form-item label="课程名称">
                <el-input v-model="form.name" placeholder="课程名称"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="讲师">
                <el-input v-model="form.department" placeholder="讲师"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="人数限制">
                <el-input v-model="form.department" placeholder="人数限制"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="开始时间">
                <el-date-picker prop="date" type="date" placeholder="选择日期" v-model="form.date"
                                style="width: 100%;"></el-date-picker>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="结束时间">
                <el-date-picker prop="date1" type="date" placeholder="选择日期" v-model="form.date1"
                                style="width: 100%;"></el-date-picker>
              </el-form-item>
            </el-col>

          </el-form>

                课程图标

                使用默认
                上传

                课程主图

                使用默认
                上传

培训内容

            <template class="hidden">
              <el-form :inline="true" :model="formInline" class="demo-form-inline mt20">

                <el-col :span="12">
                  <el-form-item label="序号">
                    <el-input v-model="formInline.mum" placeholder="序号"></el-input>
                  </el-form-item>
                </el-col>
                <el-col :span="12">
                  <el-form-item label="起止时间">
                    <el-date-picker v-model="value3" type="datetimerange" placeholder="选择时间范围"></el-date-picker>
                  </el-form-item>
                </el-col>
                <el-col :span="24">
                  <el-form-item label="主题">
                    <el-input v-model="formInline.topic" placeholder="主题" style="width:400px;"></el-input>
                    <el-button :plain="true" type="success" class="ml20" size="primary">添加主题</el-button>
                  </el-form-item>
                </el-col>
              </el-form>
            </template>
            <template>
              <el-table :data="tableData" border style="width: 100%">
                <el-table-column prop="number" label="序号" width="100"></el-table-column>
                <el-table-column prop="topic" label="主题" width=""></el-table-column>
                <el-table-column prop="timeAll" label="起止时间"></el-table-column>
                <el-table-column prop="" label="操作" width="">
                  <template scope="scope">
                    <el-button @click="open2" type="text" size="small">删除</el-button>
                  </template>
                </el-table-column>
              </el-table>
            </template>

            <button type="button" class="inf_btn  " @click="submitForm('ruleForm')" v-on:click="routeByName('')">保  存
            </button>

</template>

<template>

    <common-header></common-header>

      <navigator module="registration"></navigator>

          您的当前位置 :报名管理 >  培训报名管理 > 添加报名

          <el-form ref="form" :inline="true" :model="form" class="demo-form-inline mt20 hidden" label-width="80px">
            <el-col :span="8">
              <el-form-item label="课程名称">
                <el-input v-model="form.name" placeholder="课程名称"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="讲师">
                <el-input v-model="form.department" placeholder="讲师"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="人数限制">
                <el-input v-model="form.department" placeholder="人数限制"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="开始时间">
                <el-date-picker prop="date" type="date" placeholder="选择日期" v-model="form.date"
                                style="width: 100%;"></el-date-picker>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="结束时间">
                <el-date-picker prop="date1" type="date" placeholder="选择日期" v-model="form.date1"
                                style="width: 100%;"></el-date-picker>
              </el-form-item>
            </el-col>

          </el-form>

                课程图标

                使用默认
                上传

                课程主图

                使用默认
                上传

培训内容

            <template class="hidden">
              <el-form :inline="true" :model="formInline" class="demo-form-inline mt20">

                <el-col :span="12">
                  <el-form-item label="序号">
                    <el-input v-model="formInline.mum" placeholder="序号"></el-input>
                  </el-form-item>
                </el-col>
                <el-col :span="12">
                  <el-form-item label="起止时间">
                    <el-date-picker v-model="value3" type="datetimerange" placeholder="选择时间范围"></el-date-picker>
                  </el-form-item>
                </el-col>
                <el-col :span="24">
                  <el-form-item label="主题">
                    <el-input v-model="formInline.topic" placeholder="主题" style="width:400px;"></el-input>
                    <el-button :plain="true" type="success" class="ml20" size="primary">添加主题</el-button>
                  </el-form-item>
                </el-col>
              </el-form>
            </template>

                1.
                2000-11-10 10:10:00 - 2000-11-11 10:10:00
                成功的哲学在于如何去战胜它

            <button type="button" class="inf_btn  " @click="submitForm('ruleForm')" v-on:click="routeByName('')">保  存
            </button>

</template>


Scale PDF down when viewport is not big enough

<template>

{{ message }}

{{ errors }}

            {{ i18n.loadingPdf }}

            {{ i18n.redacting }}

            {{ i18n.sending }}

          <button class="btn btn-light" @click="undo" :disabled="!canUndo" :title="i18n.undo">

          </button>
          <button class="btn btn-light" @click="redo" :disabled="!canRedo"
            data-toggle="tooltip" data-placement="top" :title="i18n.redo">

          </button>

          <button class="btn" :class="{'btn-outline-info': !textOnly, 'btn-info': textOnly}" @click.stop="toggleText" :title="i18n.toggleText">

          </button>
          <button class="btn" :class="{'btn-outline-info': !textDisabled, 'btn-info': textDisabled}" @click.stop="toggleDrawing" :title="i18n.disableText">

          </button>

          <button class="pdf-prev btn btn-light" @click="goPrevious" :disabled="!hasPrevious">
            «
            {{ i18n.previousPage}}
          </button>

            {{ pageOfTotal }}

          <button class="pdf-next btn btn-light" @click="goNext" :disabled="!hasNext">
            {{ i18n.nextPage }}
            »
          </button>

          <button class="btn btn-dark" @click="redact">

            {{ i18n.redactAndPublish }}
          </button>

          <form v-if="canPublish" method="post" :action="config.config.publishUrl">
            <input type="hidden" name="csrfmiddlewaretoken" :value="csrfToken"/>
            <button class="btn btn-success" type="submit">

              {{ i18n.publishWithoutRedaction }}
            </button>
          </form>

            {{ i18n.cancel }}

          <canvas v-show="!textOnly" :id="canvasId" class="redactLayer"></canvas>
          <canvas v-show="!textOnly" :id="redactCanvasId" class="redactLayer"
            @mousedown="mouseDown"
            @mousemove="mouseMove"
            @mouseup="mouseUp"
            @touchstart="touchStart"
            @touchend="touchEnd"
            @touchmove="touchMove"
            @touchcancel="touchCancel"
          ></canvas>

          <button class="pdf-prev btn btn-light" @click="goPrevious" :disabled="!hasPrevious">
            «
            {{ i18n.previousPage}}
          </button>

            {{ pageOfTotal }}

          <button class="pdf-next btn btn-light" @click="goNext" :disabled="!hasNext">
            {{ i18n.nextPage }}
            »
          </button>

</template>


Don't include empty topics in previous topic lists

<template>

        <form class="u-form kiwi-channelinfo-basicmodes" @submit.prevent="">

                {{ $t('channel_topic') }}
                <textarea v-model.lazy="topic" rows="2"/>

 1" class="kiwi-channelinfo-previoustopics">

                    Previous topics

                        {{ topic }}

                {{ $t('channel_moderated') }}
                <input v-model="modeM" type="checkbox" >

                {{ $t('channel_invite') }}
                <input v-model="modeI" type="checkbox" >

                {{ $t('channel_moderated_topic') }}
                <input v-model="modeT" type="checkbox" >

                {{ $t('channel_external') }}
                <input v-model="modeN" type="checkbox" >

                {{ $t('password') }}
                <input v-model.lazy="modeK" type="text" class="u-input" >

        </form>

</template>


登录成功弹窗

登录成功弹窗

<template>

    <el-form :model="ruleForm2" :rules="rules2" ref="ruleForm2" label-position="left"
             class="demo-ruleForm login-container demo-form-inline">

款易系统登录

      <el-form-item prop="account" label="账号:" label-width="60px">
        <el-input type="text" v-model="ruleForm2.account" auto-complete="off" placeholder="账号"></el-input>
      </el-form-item>

      <el-form-item prop="checkPass" label="密码:" label-width="60px">
        <el-input type="password" v-model="ruleForm2.checkPass" auto-complete="off" placeholder="密码"></el-input>
      </el-form-item>

      <el-checkbox v-model="checked" class="remember">记住密码</el-checkbox>

      <el-form-item style="width:100%;">
        <el-button type="primary" style="width:100%;" @click.native.prevent="handleSubmit2">登录
        </el-button>

      </el-form-item>
    </el-form>

</template>


added persistent prop for #143

added persistent prop for #143

<template lang="pug">
  div(class="modal__container")

    div(
      class="modal__activator"
      v-on:click="isActive = !isActive"
      ref="activator"
      v-show="$slots.activator"
    )
      slot(name="activator")

    v-overlay(
      v-bind:active="isActive"
      v-bind:class="overlayClasses"
    )
      component(
        v-bind:is="computedTransition"
        v-bind:origin="computedOrigin"
      )
        div(
          class="modal"
          v-bind:class="classes"
          v-bind:id="id"
          v-show="isActive"
          v-click-outside="closeConditional"
          ref="modal"
        )
          slot
</template>

<script>
  import Toggleable from '../../mixins/toggleable'

  export default {
    name: 'modal',

    mixins: [Toggleable],

    props: {
      bottom: Boolean,
      origin: {
        type: String,
        default: 'center center'
      },
      persistent: Boolean,
      transition: {
        type: String,
        default: 'v-modal-transition'
      }
    },

    computed: {
      classes () {
        return {
          'modal--active': this.isActive,
          'modal--bottom': this.bottom
        }
      },

      computedOrigin () {
        if (this.origin !== 'center center') {
          return this.origin
        }

        return this.bottom ? 'bottom' : this.origin
      },

      computedTransition () {
        if (this.transition !== 'v-modal-transition') {
          return this.transition
        }

        return this.bottom ? 'v-slide-y-transition' : this.transition
      },

      overlayClasses () {
        return {
          'overlay--modal-bottom': this.bottom
        }
      }
    },

    methods: {
      closeConditional (e) {
        if (this.persistent) {
          return false
        }

        return this.$refs.modal !== e.target &&
          !this.$refs.modal.contains(e.target) &&
          this.$refs.activator !== e.target &&
          !this.$refs.activator.contains(e.target)
      }
    }
  }
</script>

<template lang="pug">
  div(class="modal__container")

    div(
      class="modal__activator"
      v-on:click="isActive = !isActive"
      ref="activator"
      v-show="$slots.activator"
    )
      slot(name="activator")

    v-overlay(
      v-bind:active="isActive"
      v-bind:class="overlayClasses"
    )
      component(
        v-bind:is="computedTransition"
        v-bind:origin="computedOrigin"
      )
        div(
          class="modal"
          v-bind:class="classes"
          v-bind:id="id"
          v-show="isActive"
          v-click-outside="closeConditional"
          ref="modal"
        )
          slot
</template>

<script>
  import Toggleable from '../../mixins/toggleable'

  export default {
    name: 'modal',

    mixins: [Toggleable],

    props: {
      bottom: Boolean,

      origin: {
        type: String,
        default: 'center center'
      },

      transition: {
        type: String,
        default: 'v-modal-transition'
      }
    },

    computed: {
      classes () {
        return {
          'modal--active': this.isActive,
          'modal--bottom': this.bottom
        }
      },

      computedOrigin () {
        if (this.origin !== 'center center') {
          return this.origin
        }

        return this.bottom ? 'bottom' : this.origin
      },

      computedTransition () {
        if (this.transition !== 'v-modal-transition') {
          return this.transition
        }

        return this.bottom ? 'v-slide-y-transition' : this.transition
      },

      overlayClasses () {
        return {
          'overlay--modal-bottom': this.bottom
        }
      }
    },

    methods: {
      closeConditional (e) {
        return this.$refs.modal !== e.target &&
          !this.$refs.modal.contains(e.target) &&
          this.$refs.activator !== e.target &&
          !this.$refs.activator.contains(e.target)
      }
    }
  }
</script>


fix treeview arrow

fix treeview arrow

<template>

      {{ model.name }}
      {{ model.val }}

      <tree class="item" v-for="child in model.children"
        :ref="id(child)" :key="child.name" :model="child">
      </tree>

</template>


chore: 👷 add moonpay popup

chore: 👷 add moonpay popup

<template>

        {{ $t('ens.register.domain-name') }}:
        {{ name }}

        {{ $t('ens.register.term') }}:
        {{
          duration === 1
            ? $tc('ens.commit.year', 1)
            : $tc('ens.commit.year', 2, { duration: duration })
        }}

        Estimated Fee:

          {{ commitFeeInEth }} ETH (${{ commitFeeUsd }})

        Commitment Cost:

          {{ commitFeeInEth }} ETH (${{ commitFeeUsd }})

        Commitment Cost:

          {{ commitFeeInEth }} ETH (${{ commitFeeUsd }})

          Generating registration cost, please wait...

        Registration Cost:

          {{ totalCost }} ETH (${{ totalCostUsd }})

        Registration Cost:

          Not enough funds to complete registration

      <mew-icon
        class="canRegister ? 'disabled' : ''"
        icon-name="clock"
        :img-height="80"
      />
      {{ ticker }}

        {{ $t('ens.hang-on') }}
        {{
          $t('ens.hang-on-committing')
        }}

        {{ $t('ens.register.complete-reg') }}
        {{
          $t('ens.register.complete-reg-desc')
        }}

        Not enough balance:

          Buy More Eth

      <mew-button
        :disabled="
          loadingCommit ||
          ticker !== '00:00' ||
          notEnoughFunds ||
          noFundsForRegFees
        "
        :title="
          canRegister
            ? $t('ens.register.name')
            : $t('ens.register.create-commitment')
        "
        btn-size="xlarge"
        @click.native="!canRegister ? commit() : register(duration)"
      />

</template>


Fix 2FA on login

Fix 2FA on login

<template>

        <form class="login-box" method="post"
              v-on:submit.prevent="submitForm"
        >

                    <input class="input open-label" id="grid-username" type="text" name="user" aria-labelledby="grid-username-label" required
                           ref="email"
                           :class="{ 'has-content' : user.email.length > 0 }"
                           :readonly="showSpinner"
                           :value="user.email"
                           v-on:input="updateEmail($event)"
                    />
                    {{ $t('strings.user_identifier') }}

                    <input class="input open-label" id="grid-password" type="password" name="password" aria-labelledby="grid-password-label" required
                           ref="password"
                           :class="{ 'has-content' : user.password && user.password.length > 0 }"
                           :readonly="showSpinner"
                           v-model="user.password"
                    />
                    {{ $t('strings.password') }}

                <button id="grid-login-button" class="btn btn-blue btn-jumbo" type="submit" aria-label="Log in"
                        v-bind:disabled="showSpinner">

                        {{ $t('auth.sign_in') }}

                </button>

                <router-link class="text-xs text-grey tracking-wide no-underline uppercase hover:text-grey-dark" aria-label="Forgot password"
                             :to="{ name: 'forgot-password' }">
                    {{ $t('auth.forgot_password.label') }}
                </router-link>

        </form>

</template>


Disable socket connection on kiosk

Disable socket connection on kiosk

<template>

            <template v-for="team in teams">

                        {{ team.name }}

            </template>

                <object id="nfc-logo" data="/img/nfc-logo.svg" type="image/svg+xml" style="max-width: 20px"></object>

</template>


Fix incorrect path to asset

Fix incorrect path to asset

<template>

  Concept To Clinic

        Open image

        Detect and Select

        Annotate and Segment

        Report and Export

</template>