docs(Toc): round #14, fight

docs(Toc): round #14, fight

<template>
  <div
    v-scroll="onScroll"
    class="mb-4"
    v-on="$listeners"
  >
    <slot name="top" />

    <ul class="app-table-of-contents">
      <li
        v-for="(item, i) in list"
        :key="i"
      >
        <a
          :href="item.id"
          :class="{
            'primary--text': activeIndex === i,
            'grey--text text--darken-1': activeIndex !== i
          }"
          :style="{
            borderColor: activeIndex === i ? 'inherit' : null
          }"
          class="mb-3 d-block"
          @click.stop.prevent="goTo(item.target)"
          v-text="item.text"
        />
      </li>
    </ul>

    <slot />
  </div>
</template>
<script>
  // Utilities
  import {
    mapState
  } from 'vuex'
  import { goTo } from '@/util/helpers'

  export default {
    data: () => ({
      activeIndex: 0,
      currentOffset: 0,
      list: [],
      timeout: null
    }),

    computed: {
      ...mapState('app', ['isLoading'])
    },

    watch: {
      isLoading: {
        immediate: true,
        handler (val) {
          !val && setTimeout(this.genList, 50)
        }
      }
    },

    methods: {
      goTo,
      async genList () {
        const list = []

        const items = document.querySelectorAll('#page [id]')

        for (const item of items) {
          if (
            // Not a top level heading
            !['H1', 'H2'].includes(item.tagName) ||
            // From previous list
            this.list.find(l => l.item === item)
          ) continue

          list.push({
            item,
            text: item.innerText,
            target: `#${item.id}`
          })
        }

        this.list = list
      },
      findActiveIndex () {
        if (this.currentOffset < 100) {
          this.activeIndex = 0
          return
        }

        const list = this.list.slice().reverse()
        const index = list.findIndex(item => {
          const { offsetParent } = item.item

          if (!offsetParent) return false

          return offsetParent.offsetTop - 100 < this.currentOffset
        })

        const lastIndex = list.length

        this.activeIndex = index > -1
          ? lastIndex - 1 - index
          : lastIndex
      },
      onScroll () {
        this.currentOffset = window.pageYOffset ||
          document.documentElement.offsetTop

        clearTimeout(this.timeout)

        this.timeout = setTimeout(this.findActiveIndex, 10)
      }
    }
  }
</script>

<style lang="stylus">
  .app-table-of-contents {
    list-style-type: none !important;
    margin: 0;
    padding: 32px 0 0;
    text-align: left;
    width: 100%;

    li a {
      border-left: 2px solid transparent;
      padding-left: 16px;
      text-decoration: none;
      transition: color .1s ease-in;
    }
  }
</style>

<template>
  <div
    v-scroll="onScroll"
    class="mb-4"
    v-on="$listeners"
  >
    <slot name="top" />

    <ul class="app-table-of-contents">
      <li
        v-for="(item, i) in list"
        :key="i"
      >
        <a
          :href="item.id"
          :class="{
            'primary--text': activeIndex === i,
            'grey--text text--darken-1': activeIndex !== i
          }"
          :style="{
            borderColor: activeIndex === i ? 'inherit' : null
          }"
          class="mb-3 d-block"
          @click.stop.prevent="goTo(item.target)"
          v-text="item.text"
        />
      </li>
    </ul>

    <slot />
  </div>
</template>
<script>
  // Utilities
  import {
    mapState
  } from 'vuex'
  import { goTo } from '@/util/helpers'

  export default {
    data: () => ({
      activeIndex: 0,
      currentOffset: 0,
      list: [],
      timeout: null
    }),

    computed: {
      ...mapState('app', ['isLoading'])
    },

    watch: {
      isLoading: {
        immediate: true,
        handler (val) {
          !val && requestAnimationFrame(this.genList)
        }
      }
    },

    methods: {
      goTo,
      async genList () {
        const list = []

        const items = document.querySelectorAll('#page [id]')

        for (const item of items) {
          if (
            // Not a top level heading
            !['H1', 'H2'].includes(item.tagName) ||
            // From previous list
            this.list.find(l => l.item === item)
          ) continue

          list.push({
            item,
            text: item.innerText,
            target: `#${item.id}`
          })
        }

        this.list = list
      },
      findActiveIndex () {
        if (this.currentOffset < 100) {
          this.activeIndex = 0
          return
        }

        const list = this.list.slice().reverse()
        const index = list.findIndex(item => {
          const { offsetParent } = item.item

          if (!offsetParent) return false

          return offsetParent.offsetTop - 100 < this.currentOffset
        })

        const lastIndex = list.length

        this.activeIndex = index > -1
          ? lastIndex - 1 - index
          : lastIndex
      },
      onScroll () {
        this.currentOffset = window.pageYOffset ||
          document.documentElement.offsetTop

        clearTimeout(this.timeout)

        this.timeout = setTimeout(this.findActiveIndex, 10)
      }
    }
  }
</script>

<style lang="stylus">
  .app-table-of-contents {
    list-style-type: none !important;
    margin: 0;
    padding: 32px 0 0;
    text-align: left;
    width: 100%;

    li a {
      border-left: 2px solid transparent;
      padding-left: 16px;
      text-decoration: none;
      transition: color .1s ease-in;
    }
  }
</style>


docs: fix toc styles

docs: fix toc styles

<template>
  <div
    v-scroll="onScroll"
    class="mb-4"
    v-on="$listeners"
  >
    <slot name="top" />

    <ul class="app-table-of-contents">
      <li
        v-for="(item, i) in list"
        :key="i"
      >
        <a
          :href="item.id"
          :class="{
            'primary--text': activeIndex === i,
            'grey--text text--darken-1': activeIndex !== i
          }"
          :style="{
            borderColor: activeIndex === i ? 'inherit' : null
          }"
          class="mb-3 d-block"
          @click.stop.prevent="goTo(item.target)"
          v-text="item.text"
        />
      </li>
    </ul>

    <slot />
  </div>
</template>
<script>
  // Utilities
  import { goTo } from '@/util/helpers'

  export default {
    data: () => ({
      activeIndex: 0,
      currentOffset: 0,
      list: [],
      timeout: null
    }),

    watch: {
      '$route.path': 'genList'
    },

    mounted () {
      this.genList()
    },

    methods: {
      goTo,
      async genList () {
        const list = []

        // Give page time to transition
        await new Promise(resolve => setTimeout(resolve, 500))

        const items = document.querySelectorAll('#page [id]')

        for (const item of items) {
          if (!['H1', 'H2'].includes(item.tagName)) continue

          list.push({
            text: item.innerText,
            target: `#${item.id}`,
            offsetTop: item.offsetTop
          })
        }

        this.list = list
      },
      findActiveIndex () {
        if (this.currentOffset < 100) {
          this.activeIndex = 0
          return
        }

        const list = this.list.slice().reverse()
        const index = list.findIndex(item => {
          return item.offsetTop - 100 < this.currentOffset
        })

        const lastIndex = list.length

        this.activeIndex = index > -1
          ? lastIndex - 1 - index
          : lastIndex
      },
      onScroll () {
        this.currentOffset = window.pageYOffset ||
          document.documentElement.offsetTop

        clearTimeout(this.timeout)

        this.timeout = setTimeout(this.findActiveIndex, 10)
      }
    }
  }
</script>

<style lang="stylus">
  .app-table-of-contents {
    list-style-type: none !important;
    margin: 0;
    padding: 32px 0 0;
    text-align: left;
    width: 100%;

    li a {
      border-left: 2px solid transparent;
      padding-left: 16px;
      text-decoration: none;
      transition: color .1s ease-in;
    }
  }
</style>

<template>
  <div
    v-scroll="onScroll"
    v-on="$listeners"
  >
    <slot name="top" />

    <ul class="app-table-of-contents">
      <li
        v-for="(item, i) in list"
        :key="i"
      >
        <a
          :href="item.id"
          :class="{
            'primary--text': activeIndex === i,
            'grey--text text--darken-1': !activeIndex === i
          }"
          :style="{
            borderColor: activeIndex === i ? 'inherit' : null
          }"
          class="body-2 mb-3 d-block"
          @click.stop.prevent="goTo(item.target)"
          v-text="item.text"
        />
      </li>
    </ul>

    <slot />
  </div>
</template>
<script>
  // Utilities
  import { goTo } from '@/util/helpers'

  export default {
    data: () => ({
      activeIndex: 0,
      currentOffset: 0,
      list: [],
      timeout: null
    }),

    watch: {
      '$route.path': 'genList'
    },

    mounted () {
      this.genList()
    },

    methods: {
      goTo,
      async genList () {
        const list = []

        // Give page time to transition
        await new Promise(resolve => setTimeout(resolve, 500))

        const items = document.querySelectorAll('#page [id]')

        for (const item of items) {
          if (!['H1', 'H2'].includes(item.tagName)) continue

          list.push({
            text: item.innerText,
            target: `#${item.id}`,
            offsetTop: item.offsetTop
          })
        }

        this.list = list
      },
      findActiveIndex () {
        if (this.currentOffset < 100) {
          this.activeIndex = 0
          return
        }

        const list = this.list.slice().reverse()
        const index = list.findIndex(item => {
          return item.offsetTop - 100 < this.currentOffset
        })

        const lastIndex = list.length

        this.activeIndex = index > -1
          ? lastIndex - 1 - index
          : lastIndex
      },
      onScroll () {
        this.currentOffset = window.pageYOffset ||
          document.documentElement.offsetTop

        clearTimeout(this.timeout)

        this.timeout = setTimeout(this.findActiveIndex, 10)
      }
    }
  }
</script>

<style lang="stylus">
  .app-table-of-contents {
    list-style-type: none !important;
    margin: 0;
    padding: 32px 0 0;
    text-align: left;
    width: 100%;

    li a.body-2 {
      border-left: 2px solid transparent;
      padding-left: 16px;
      text-decoration: none;
      transition: color .1s ease-in;
    }
  }
</style>


Computing actual width

Computing actual width

<template>

      {{ data[0].label }} new members towards goal of {{ data[1].label }}.

</template>


Allow to delete a calendar

Allow to delete a calendar

<template>
  <form class="wrapper-height100" @submit.prevent>

Stel de openingsuren in voor {{ $parent.$parent.routeService.label }}. Op welke dagen is deze dienst normaal open?

Uitzonderingen kan je later instellen.

        <event-editor v-for="(e, i) in cal.events" :parent="cal.events" :prop="i" @add-event="addEvent(i, e)" @rm="rmEvent(i)"></event-editor>

Stel de uitzondering in.

          Naam uitzondering
          <input type="text" class="form-control" v-model="calLabel" placeholder="Brugdagen, collectieve sluitingsdagen, ...">

Kies een specifieke naam die deze uitzondering beschrijft.

{{ cal.label }}

          <input type="checkbox" :checked="cal.closinghours" @change="toggleClosing"> Sluitingsuren

        <event-editor v-for="(e, i) in cal.events" :parent="cal.events" :prop="i" @add-event="addEvent(i, e)" @rm="rmEvent(i)"></event-editor>

          <button @click="pushEvent" class="btn btn-link">+ Voeg nieuwe periode of dag toe</button>

        <button type="button" class="btn btn-default pull-left" @click="rmCalendar()">Verwijder</button>
        <button type="button" class="btn btn-default" @click="toVersion()">Annuleer</button>
        <button type="submit" class="btn btn-primary" @click="saveLabel" v-if="cal.label=='Uitzondering'">Volgende stap</button>
        <button type="submit" class="btn btn-primary" @click="save" v-else>Sla op</button>

  </form>
</template>

<template>
  <form class="wrapper-height100" @submit.prevent>

Stel de openingsuren in voor {{ $parent.$parent.routeService.label }}. Op welke dagen is deze dienst normaal open?

Uitzonderingen kan je later instellen.

        <event-editor v-for="(e, i) in cal.events" :parent="cal.events" :prop="i" @add-event="addEvent(i, e)" @rm="rmEvent(i)"></event-editor>

Stel de uitzondering in.

          Naam uitzondering
          <input type="text" class="form-control" v-model="calLabel" placeholder="Brugdagen, collectieve sluitingsdagen, ...">

Kies een specifieke naam die deze uitzondering beschrijft.

{{ cal.label }}

          <input type="checkbox" :checked="cal.closinghours" @change="toggleClosing"> Sluitingsuren

        <event-editor v-for="(e, i) in cal.events" :parent="cal.events" :prop="i" @add-event="addEvent(i, e)" @rm="rmEvent(i)"></event-editor>

          <button @click="pushEvent" class="btn btn-link">+ Voeg nieuwe periode of dag toe</button>

        <button type="button" class="btn btn-default pull-left" @click="toVersion()">Verwijder</button>
        <button type="button" class="btn btn-default" @click="toVersion()">Annuleer</button>
        <button type="submit" class="btn btn-primary" @click="saveLabel" v-if="cal.label=='Uitzondering'">Volgende stap</button>
        <button type="submit" class="btn btn-primary" @click="save" v-else>Sla op</button>

  </form>
</template>


Update CA scoreboard filter to work with new JSON format

<template>

{{ $lt('title') }}

        <CallForm page="california" />

{{ $lt('scoreboard_form.title') }}

        <form @submit.prevent="fetchRep()">

{{ errorMessage }}

            <input type="text"
                   v-model="street"
                   :placeholder="$lt('scoreboard_form.address_placeholder')"
                   class="flex-2"
                   required>
            <input type="tel"
                   v-model="zipCode"
                   :placeholder="$lt('scoreboard_form.zip_placeholder')"
                   required>
            <button class="btn btn-cta btn-large" :disabled="isLoading">
              {{ $lt('scoreboard_form.cta_button') }}
              {{ $lt('scoreboard_form.loading_button') }}
            </button>

            {{ $lt('scoreboard_form.disclaimer') }}

        </form>

{{ $lt('scoreboard.title') }}

        <ScoreboardLegend :neutral="false" />

        <select v-model="voteFilter" class="push-top-3">
          <option :value="null">{{ $lt('scoreboard.vote_filter') }}</option>
          <option :value="true">{{ $lt('scoreboard.voted_yes') }}</option>
          <option :value="false">{{ $lt('scoreboard.voted_no') }}</option>
        </select>

{{ $lt('scoreboard.assembly') }}

        <ScoreboardGroup :politicians="filteredAssemblyMembers" />

{{ $lt('scoreboard.senators') }}

        <ScoreboardGroup :politicians="filteredSenators" />

{{ $t('pages.index.sections.net-neutrality.title') }}

        <video-roll></video-roll>

</template>

<template>

{{ $lt('title') }}

        <CallForm page="california" />

{{ $lt('scoreboard_form.title') }}

        <form @submit.prevent="fetchRep()">

{{ errorMessage }}

            <input type="text"
                   v-model="street"
                   :placeholder="$lt('scoreboard_form.address_placeholder')"
                   class="flex-2"
                   required>
            <input type="tel"
                   v-model="zipCode"
                   :placeholder="$lt('scoreboard_form.zip_placeholder')"
                   required>
            <button class="btn btn-cta btn-large" :disabled="isLoading">
              {{ $lt('scoreboard_form.cta_button') }}
              {{ $lt('scoreboard_form.loading_button') }}
            </button>

            {{ $lt('scoreboard_form.disclaimer') }}

        </form>

{{ $lt('scoreboard.title') }}

        <ScoreboardLegend :neutral="false" />

        <select v-model="voteFilter" class="push-top-3">
          <option value>{{ $lt('scoreboard.vote_filter') }}</option>
          <option value="true">{{ $lt('scoreboard.voted_yes') }}</option>
          <option value="false">{{ $lt('scoreboard.voted_no') }}</option>
        </select>

{{ $lt('scoreboard.assembly') }}

        <ScoreboardGroup :politicians="filteredAssemblyMembers" />

{{ $lt('scoreboard.senators') }}

        <ScoreboardGroup :politicians="filteredSenators" />

{{ $t('pages.index.sections.net-neutrality.title') }}

        <video-roll></video-roll>

</template>


fix broken profile for some users

fix broken profile for some users

<template>

    <form novalidate @submit.stop.prevent="runSearch()" id="searchForm">
      <md-input-container>
        {{ $t("Search") }}
        <md-input v-model="searchString" ref="searchInput"></md-input>
        <md-button @click="runSearch()" :disabled="searchString.length<3">{{ $t("Search") }}</md-button>
      </md-input-container>
    </form>
    <md-layout id="searchLayout" :class="{floatSideBar: floatSideBar}">
      <md-layout id="searchResults">
        <ui-loading v-if="isSearching"></ui-loading>

 0">
          <template v-for="(result, index) in results.results">

                <router-link :to="'/' + result.slug">
                  <md-image :md-src="result.thumbnail" v-if="result.thumbnail"></md-image>
                  <placeholder-img :text="result.type" v-else></placeholder-img>
                </router-link>

                <router-link :to="'/' + result.slug">{{ result.name || result.type }}</router-link>
                - Private -
                - Hidden -
                - Encrypted -
                - Restricted -
                <md-subheader>
                  {{ result.type }}
                  {{ result.date.modified || result.date.created | moment('LLL') }}
                  <router-link v-if="result.user.searchable" :class="result.user.roleClass" :to="'/p/' + result.user.name">{{ result.user.name }}</router-link>
                  {{ result.user.name }}
                  {{ $t("[-count-] view", { count: result.viewCount }) }}
                  {{ $t("[-count-] star", { count: result.favoriteCount }) }}
                  {{ $t("[-count-] comment", { count: result.commentCount }) }}
                </md-subheader>
                <formatted-text :text="result.description" truncate="180" :plaintext="true"></Formatted-text>

                  <md-chip v-for="cat in result.categories" v-bind:key="cat.id" :class="cat.cls" disabled v-if="cat.text">{{ cat.text }}</md-chip>

            <advert :ad="'wago728x90-' + Math.ceil(index / 9)" :belowTheFold="index > 10" v-if="!isCollection && (index %9 === 2 || (results.total < 3 && index === results.total - 1))" />
          </template>

{{ $t("No results found") }}

      </md-layout>

      <md-layout id="searchSide" v-if="results && results.query">
        <md-layout id="searchMeta" v-if="results && results.query">
          <search-meta :meta="results.query.context" :tagMap="tagMap" :textSearch="results.query.textSearch" :sort="sortVal" @setSort="setSort" @setImportType="setImportType" :catRelevance="catRelevance" @setCategoryRelevance="setCategoryRelevance" :filterExpansion="filterExpansion" @setExpansion="setExpansion"></search-meta>
        </md-layout>
      </md-layout>
    </md-layout>

{{ $t("Loading more") }}

</template>


dashboard development

dashboard development

<template>

                    <form enctype="multipart/form-data" @submit.prevent="confirmSave(hotel.id)">

                                {{ hotel.name }}

                                    <b-input-group left="">

                                    <b-input-group left="">

                                    <b-input-group left="">

                                <b-form-select
                                        :plain="true"
                                        :options="timezones"
                                        v-model="timezone"
                                        left=" ">

                                Upload image

                                Logo successfully updated

                                    Save

                                    Cancel

                                     Delete

                    </form>

                Wrong way or hotel doesn't exist!
                <router-link :to="{name:'Hotels'}">Go back </router-link>

            You are going to delete {{ delHotel.name }}.  Press OK if you are sure

            Please contact your webmaster or support

{{ delHotel.name }}  successfully deleted

            OK

{{ hotel.name }}  successfully updated

</template>

<template>

                    <form enctype="multipart/form-data" @submit.prevent="confirmSave(hotel.id)">

                            {{ hotel.name }}

                                <b-input-group left="">

                                <b-input-group left="">

                                <b-input-group left="">

                            <b-form-select
                                    :plain="true"
                                    :options="timezones"
                                    v-model="timezone"
                                    left=" ">

                            Upload image

                                Save

                                Cancel

                                 Delete

                    </form>

                Wrong way or hotel doesn't exist!
                <router-link :to="{name:'Hotels'}">Go back </router-link>

            You are going to delete {{ delHotel.name }}.  Press OK if you are sure

{{ delHotel.name }}  successfully deleted

            OK

</template>


classes for unread and highlight

classes for unread and highlight

<template>
	<!-- TODO: move closed style to it's own class -->
	<div
		v-if="isChannelVisible"
		ref="element"
		:class="[
			'channel-list-item',
			{active: active},
			{'parted-channel': channel.type === 'channel' && channel.state === 0},
			{'has-draft': channel.pendingMessage},
			{'has-unread': channel.unread},
			{'has-highlight': channel.highlight},
			{
				'not-secure':
					channel.type === 'lobby' && network.status.connected && !network.status.secure,
			},
			{'not-connected': channel.type === 'lobby' && !network.status.connected},
		]"
		:aria-label="getAriaLabel()"
		:title="getAriaLabel()"
		:data-name="channel.name"
		:data-type="channel.type"
		:aria-controls="'#chan-' + channel.id"
		:aria-selected="active"
		:style="channel.closed ? {transition: 'none', opacity: 0.4} : null"
		role="tab"
		@click="click"
		@contextmenu.prevent="openContextMenu"
	>
		<slot :network="network" :channel="channel" :activeChannel="activeChannel" />
	</div>
</template>

<script>
import eventbus from "../js/eventbus";
import isChannelCollapsed from "../js/helpers/isChannelCollapsed";

export default {
	name: "ChannelWrapper",
	props: {
		network: Object,
		channel: Object,
		active: Boolean,
		isFiltering: Boolean,
	},
	computed: {
		activeChannel() {
			return this.$store.state.activeChannel;
		},
		isChannelVisible() {
			return this.isFiltering || !isChannelCollapsed(this.network, this.channel);
		},
	},
	methods: {
		getAriaLabel() {
			const extra = [];

			if (this.channel.unread > 0) {
				extra.push(`${this.channel.unread} unread`);
			}

			if (this.channel.highlight > 0) {
				extra.push(`${this.channel.highlight} mention`);
			}

			if (extra.length > 0) {
				return `${this.channel.name} (${extra.join(", ")})`;
			}

			return this.channel.name;
		},
		click() {
			if (this.isFiltering) {
				return;
			}

			this.$root.switchToChannel(this.channel);
		},
		openContextMenu(event) {
			eventbus.emit("contextmenu:channel", {
				event: event,
				channel: this.channel,
				network: this.network,
			});
		},
	},
};
</script>

<template>
	<!-- TODO: move closed style to it's own class -->
	<div
		v-if="isChannelVisible"
		ref="element"
		:class="[
			'channel-list-item',
			{active: active},
			{'parted-channel': channel.type === 'channel' && channel.state === 0},
			{'has-draft': channel.pendingMessage},
			{
				'not-secure':
					channel.type === 'lobby' && network.status.connected && !network.status.secure,
			},
			{'not-connected': channel.type === 'lobby' && !network.status.connected},
		]"
		:aria-label="getAriaLabel()"
		:title="getAriaLabel()"
		:data-name="channel.name"
		:data-type="channel.type"
		:aria-controls="'#chan-' + channel.id"
		:aria-selected="active"
		:style="channel.closed ? {transition: 'none', opacity: 0.4} : null"
		role="tab"
		@click="click"
		@contextmenu.prevent="openContextMenu"
	>
		<slot :network="network" :channel="channel" :activeChannel="activeChannel" />
	</div>
</template>

<script>
import eventbus from "../js/eventbus";
import isChannelCollapsed from "../js/helpers/isChannelCollapsed";

export default {
	name: "ChannelWrapper",
	props: {
		network: Object,
		channel: Object,
		active: Boolean,
		isFiltering: Boolean,
	},
	computed: {
		activeChannel() {
			return this.$store.state.activeChannel;
		},
		isChannelVisible() {
			return this.isFiltering || !isChannelCollapsed(this.network, this.channel);
		},
	},
	methods: {
		getAriaLabel() {
			const extra = [];

			if (this.channel.unread > 0) {
				extra.push(`${this.channel.unread} unread`);
			}

			if (this.channel.highlight > 0) {
				extra.push(`${this.channel.highlight} mention`);
			}

			if (extra.length > 0) {
				return `${this.channel.name} (${extra.join(", ")})`;
			}

			return this.channel.name;
		},
		click() {
			if (this.isFiltering) {
				return;
			}

			this.$root.switchToChannel(this.channel);
		},
		openContextMenu(event) {
			eventbus.emit("contextmenu:channel", {
				event: event,
				channel: this.channel,
				network: this.network,
			});
		},
	},
};
</script>


welcome user party menu

welcome user party menu

<template>

    <navbar placement="top" type="default">

      <dropdown text="Dropdown">

Option

      </dropdown>

        Login

          Register

        <dropdown text="Welcome {{user.username}}" slot="right">

User Profile

Change Password

Logout

        </dropdown>

    </navbar>
    <Login v-bind:active.sync="activeModel"></Login>

</template>

<template>

    <navbar placement="top" type="default">

      <dropdown text="Dropdown">

Option

      </dropdown>

      Login

        Register

    </navbar>
    <Login v-bind:active.sync="activeModel"></Login>

</template>


STATIONAR 1.0

STATIONAR 1.0

<template>

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

            <a :href="`/forms/pdf?type=106.01&dir_pk=${direction}`" target="_blank" style="float: right">форма 003/у
            История/б №{{direction}}

            {{issTitle}}

          <patient-card :patient="patient" class="inner-card"/>

            <button class="btn btn-blue-nb sidebar-btn"
                    @click="load_directions(key)"
            >
              {{counts[key]}} шт. {{title}}
            </button>
            <button class="btn btn-blue-nb sidebar-btn"
                    v-if="menuNeedPlus[key]"
                    @click="plus(key)"
            >

            </button>

          {{menuItems[opened_list_key]}}

            {{d.pk}}

            {{d.date_create}}

              {{row.research.title}}
               [{{row.research.comment}}]

              <template v-if="row.confirmed">
                Печать
              </template>
              <template>

                <template v-if="!row.confirmed">
                  <button class="btn btn-blue-nb" @click="save(row)" v-if="!row.confirmed"
                          title="Сохранить без подтверждения" v-tippy>

                  </button>
                  <button class="btn btn-blue-nb" @click="clear_vals(row)" title="Очистить протокол" v-tippy>

                  </button>

                    <select-picker-m v-model="templates[row.pk]"
                                     :search="true"
                                     :options="row.templates.map(x => ({label: x.title, value: x.pk}))"/>

                  <button class="btn btn-blue-nb" @click="load_template(row, templates[row.pk])" v-if="fte">
                    Загрузить шаблон
                  </button>
                </template>
              </template>

          <DescriptiveForm
            :research="row.research"
            :confirmed="row.confirmed"
            :patient="patient_form"
            :change_mkb="change_mkb(row)"
          />

{{row.research.title}}:

            <iss-status :i="row"/>
            <button class="btn btn-blue-nb" @click="save(row)" v-if="!row.confirmed">Сохранить</button>
            <button class="btn btn-blue-nb" @click="save_and_confirm(row)" v-if="!row.confirmed"
                    :disabled="!r(row)">
              Сохранить и подтвердить
            </button>
            <button class="btn btn-blue-nb" @click="reset_confirm(row)"
                    v-if="row.confirmed && row.allow_reset_confirm">
              Сброс подтверждения
            </button>
            <button class="btn btn-blue-nb" @click="close_form">
              Закрыть
            </button>

Не заполнено:

{{rl}};

    <modal @close="closePlus" marginLeftRight="auto"
           margin-top="60px"
           max-width="1400px" ref="modalStationar" show-footer="true"
           v-if="openPlusMode === 'directions'"
           white-bg="true" width="100%">
      Создание направлений – история {{direction}} {{issTitle}}, {{patient.fio_age}}

            <researches-picker v-model="create_directions_data"
                               :types-only="pickerTypesOnly"
                               kk="stationar"
                               style="border-top: 1px solid #eaeaea;border-bottom: 1px solid #eaeaea;"/>

            <selected-researches
              kk="stationar"
              :base="bases_obj[patient.base]"
              :researches="create_directions_data"
              :main_diagnosis="'-'"
              :valid="true"
              :card_pk="patient.cardId"
              :initial_fin="finId"
              :parent_iss="iss"
              :clear_after_gen="true"
              style="border-top: 1px solid #eaeaea;border-bottom: 1px solid #eaeaea;"
            />

 0"
             style="margin-top: 5px;text-align: left">

            <colgroup>
              <col width="180">
              <col>
              <col width="110">
              <col width="110">
            </colgroup>

            <last-result :individual="patient.individualId" :key="p" v-for="p in create_directions_data"
                         :parent-iss="iss"
                         :noScroll="true"
                         :research="p"/>

            <button @click="closePlus" class="btn btn-primary-nb btn-blue-nb" type="button">
              Закрыть
            </button>

    </modal>
    <modal v-if="openPlusMode === 'stationar'" ref="modalStationar2" @close="closePlus"
           margin-top="50px"
           show-footer="true" white-bg="true" max-width="710px" width="100%" marginLeftRight="auto">
      {{menuItems[openPlusId]}} – история {{direction}} {{issTitle}}, {{patient.fio_age}}

            <research-pick :class="{ active: row.pk === direction_service }" :research="row"
                           @click.native="select_research(row.pk)"
                           class="research-select"
                           v-for="row in hosp_services"
                           :key="row.pk"/>

не настроено

            <button @click="confirm_service"
                    :disabled="direction_service === -1"
                    class="btn btn-primary-nb btn-blue-nb" type="button">
              Сохранить назначение и заполнить протокол
            </button>

            <button @click="closePlus" class="btn btn-primary-nb btn-blue-nb" type="button">
              Закрыть
            </button>

    </modal>
    <results-viewer :pk="show_results_pk" v-if="show_results_pk > -1"/>

</template>

<template>

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

            <a :href="`/forms/pdf?type=106.01&dir_pk=${direction}`" target="_blank" style="float: right">форма 003/у
            История/б №{{direction}}

            {{issTitle}}

          <patient-card :patient="patient" class="inner-card"/>

            <button class="btn btn-blue-nb sidebar-btn"
                    @click="load_directions(key)"
            >
              {{counts[key]}} шт. {{title}}
            </button>
            <button class="btn btn-blue-nb sidebar-btn"
                    v-if="menuNeedPlus[key]"
                    @click="plus(key)"
            >

            </button>

          {{menuItems[opened_list_key]}}

          {{d.pk}}

              {{row.research.title}}
               [{{row.research.comment}}]

              <template v-if="row.confirmed">
                Печать
              </template>
              <template>

                <template v-if="!row.confirmed">
                  <button class="btn btn-blue-nb" @click="save(row)" v-if="!row.confirmed"
                          title="Сохранить без подтверждения" v-tippy>

                  </button>
                  <button class="btn btn-blue-nb" @click="clear_vals(row)" title="Очистить протокол" v-tippy>

                  </button>

                    <select-picker-m v-model="templates[row.pk]"
                                     :search="true"
                                     :options="row.templates.map(x => ({label: x.title, value: x.pk}))"/>

                  <button class="btn btn-blue-nb" @click="load_template(row, templates[row.pk])" v-if="fte">
                    Загрузить шаблон
                  </button>
                </template>
              </template>

          <DescriptiveForm
            :research="row.research"
            :confirmed="row.confirmed"
            :patient="patient_form"
            :change_mkb="change_mkb(row)"
          />

{{row.research.title}}:

            <iss-status :i="row"/>
            <button class="btn btn-blue-nb" @click="save(row)" v-if="!row.confirmed">Сохранить</button>
            <button class="btn btn-blue-nb" @click="save_and_confirm(row)" v-if="!row.confirmed"
                    :disabled="!r(row)">
              Сохранить и подтвердить
            </button>
            <button class="btn btn-blue-nb" @click="reset_confirm(row)"
                    v-if="row.confirmed && row.allow_reset_confirm">
              Сброс подтверждения
            </button>
            <button class="btn btn-blue-nb" @click="close_form">
              Закрыть
            </button>

Не заполнено:

{{rl}};

    <modal @close="closePlus" marginLeftRight="auto"
           margin-top="60px"
           max-width="1400px" ref="modalStationar" show-footer="true"
           v-if="openPlusMode === 'directions'"
           white-bg="true" width="100%">
      Создание направлений – история {{direction}} {{issTitle}}, {{patient.fio_age}}

            <researches-picker v-model="create_directions_data"
                               :types-only="pickerTypesOnly"
                               kk="stationar"
                               style="border-top: 1px solid #eaeaea;border-bottom: 1px solid #eaeaea;"/>

            <selected-researches
              kk="stationar"
              :base="bases_obj[patient.base]"
              :researches="create_directions_data"
              :main_diagnosis="'-'"
              :valid="true"
              :card_pk="patient.cardId"
              :initial_fin="finId"
              :parent_iss="iss"
              :clear_after_gen="true"
              style="border-top: 1px solid #eaeaea;border-bottom: 1px solid #eaeaea;"
            />

 0"
             style="margin-top: 5px;text-align: left">

            <colgroup>
              <col width="180">
              <col>
              <col width="110">
              <col width="110">
            </colgroup>

            <last-result :individual="patient.individualId" :key="p" v-for="p in create_directions_data"
                         :parent-iss="iss"
                         :noScroll="true"
                         :research="p"/>

            <button @click="closePlus" class="btn btn-primary-nb btn-blue-nb" type="button">
              Закрыть
            </button>

    </modal>
    <modal v-if="openPlusMode === 'stationar'" ref="modalStationar2" @close="closePlus"
           margin-top="50px"
           show-footer="true" white-bg="true" max-width="710px" width="100%" marginLeftRight="auto">
      {{menuItems[openPlusId]}} – история {{direction}} {{issTitle}}, {{patient.fio_age}}

            <research-pick :class="{ active: row.pk === direction_service }" :research="row"
                           @click.native="select_research(row.pk)"
                           class="research-select"
                           v-for="row in hosp_services"
                           :key="row.pk"/>

не настроено

            <button @click="confirm_service"
                    :disabled="direction_service === -1"
                    class="btn btn-primary-nb btn-blue-nb" type="button">
              Сохранить назначение и заполнить протокол
            </button>

            <button @click="closePlus" class="btn btn-primary-nb btn-blue-nb" type="button">
              Закрыть
            </button>

    </modal>
    <results-viewer :pk="show_results_pk" v-if="show_results_pk > -1"/>

</template>


Permissions error fixes

Permissions error fixes

<template>

      <input type="checkbox" class="modal-checkbox" id="modal1">

        ×

{{titleCase(selectedFlowName)}}

                    <template>

                        <template v-for="(moduleName, index) in Object.keys(tableData)">

                                <template v-for="(field, fieldNumber) in fields[moduleName]">

                                        {{ getTitle(field) }}

                                </template>

                            <template v-for="(item, itemNumber) in (tableData)[moduleName]">

                                    <template v-for="(field,fieldNumber) in fields[moduleName]">

                                            {{selectedFlowObject.processList[titleCase(item.service)].name}}

                                                        <template v-for="n in item.actions">

                                                                {{ titleCase(key) }}

                                                                <input class="field.dataClass" style="width: 15px;height: 15px;cursor: pointer;" type="checkbox" @click="setAccessPermision(field, item, key,$event,moduleName)" :checked="getCheckboxValue(field, item, key,moduleName)" />

                                                        </template>

                                    </template>

                            </template>

                        </template>
                    </template>

{{waitingText}}

    <Modal
        v-model="modal1"
        title="Invite"
        @on-ok="ok"
        @on-cancel="cancel" width='1000'>

                <el-input placeholder="Please enter email id" v-model="input"></el-input>

                <el-select v-model="value1" placeholder="Select Role">
                <el-option
                v-for="item in options"
                :key="item.value1"
                :label="item.label1"
                :value="item.value1">
                </el-option>
            </el-select>

                <el-select v-model="value2" placeholder="Select subscription">
                    <el-option
                    v-for="item in options2"
                    :key="item.value2"
                    :label="item.label2"
                    :value="item.value2">
                    </el-option>
                </el-select>

            <el-button type="primary" :loading="loading" @click="inviteNow()">Invite Now</el-button>

            <Tabs  style="margin-top: 20px">
                <TabPane label="Own Subscription">

                </TabPane>
                <TabPane label="Assigned Subscription">

                </TabPane>
                <TabPane label="Assigned History">

                </TabPane>
            </Tabs>

    </Modal>

    <Row type="flex" justify="end">
      <Button type="primary" size="small" style="margin-bottom: 2px;" @click="addNewFlow" icon="plus"> Add</Button>
    </Row>
    <Row>

    </Row>
    <Row style="margin-top: 4px; float: right">
      <Page :total="total" :current="cpage" :page-size="limit" show-sizer @on-change="handlePage" @on-page-size-change="handlePagesize"></Page>
    </Row>

</template>

<template>

      <input type="checkbox" class="modal-checkbox" id="modal1">

        ×

{{titleCase(selectedFlowName)}}

                    <template>

                        <template v-for="(moduleName, index) in Object.keys(tableData)">

                                <template v-for="(field, fieldNumber) in fields[moduleName]">

                                        {{ getTitle(field) }}

                                </template>

                            <template v-for="(item, itemNumber) in (tableData)[moduleName]">

                                    <template v-for="(field,fieldNumber) in fields[moduleName]">

                                            {{ item.serviceName }}

                                                        <template v-for="n in item.actions">

                                                                {{ titleCase(key) }}

                                                                <input class="field.dataClass" style="width: 15px;height: 15px;cursor: pointer;" type="checkbox" @click="setAccessPermision(field, item, key,$event,moduleName)" :checked="getCheckboxValue(field, item, key,moduleName)" />

                                                        </template>

                                    </template>

                            </template>

                        </template>
                    </template>

{{waitingText}}

    <Modal
        v-model="modal1"
        title="Invite"
        @on-ok="ok"
        @on-cancel="cancel" width='1000'>

                <el-input placeholder="Please enter email id" v-model="input"></el-input>

                <el-select v-model="value1" placeholder="Select Role">
                <el-option
                v-for="item in options"
                :key="item.value1"
                :label="item.label1"
                :value="item.value1">
                </el-option>
            </el-select>

                <el-select v-model="value2" placeholder="Select subscription">
                    <el-option
                    v-for="item in options2"
                    :key="item.value2"
                    :label="item.label2"
                    :value="item.value2">
                    </el-option>
                </el-select>

            <el-button type="primary" :loading="loading" @click="inviteNow()">Invite Now</el-button>

            <Tabs  style="margin-top: 20px">
                <TabPane label="Own Subscription">

                </TabPane>
                <TabPane label="Assigned Subscription">

                </TabPane>
                <TabPane label="Assigned History">

                </TabPane>
            </Tabs>

    </Modal>

    <Row type="flex" justify="end">
      <Button type="primary" size="small" style="margin-bottom: 2px;" @click="addNewFlow" icon="plus"> Add</Button>
    </Row>
    <Row>

    </Row>
    <Row style="margin-top: 4px; float: right">
      <Page :total="total" :current="cpage" :page-size="limit" show-sizer @on-change="handlePage" @on-page-size-change="handlePagesize"></Page>
    </Row>

</template>


[crashmanager] Fix quality and optimization sorting in signatures list

<template>

 Signatures

          <button
            type="button"
            class="btn btn-default"
            v-on:click="updateShowAll"
          >
            {{ showAll ? "View Unassigned" : "View All" }}
          </button>
          View Watched

        Search Query
        <HelpJSONQueryPopover
          :parameters="[
            { name: 'id', type: 'Integer (ID)' },
            { name: 'signature', type: 'String' },
            { name: 'optimizedSignature', type: 'String' },
            { name: 'shortDescription', type: 'String' },
            { name: 'frequent', type: 'Boolean' },
            { name: 'permanent', type: 'Boolean' },
            { name: 'bug', type: 'Integer (ID)' },
            { name: 'bug__externalId', type: 'String' },
            { name: 'bug__closed', type: 'Date' },
            { name: 'bug__externalType', type: 'Integer (ID)' },
            { name: 'bug__externalType__classname', type: 'String' },
            { name: 'bug__externalType__hostname', type: 'String' },
          ]"
        />
        <textarea
          id="id_query"
          class="form-control"
          name="query"
          spellcheck="false"
          :rows="(queryStr.match(/\n/g) || '').length + 1"
          v-model="queryStr"
        ></textarea>

          {{ queryError }}

        Ignore Tool Filter:
        <input
          id="id_no_toolfilter"
          type="checkbox"
          name="alltools"
          v-model="ignoreToolFilter"
        />

        <button
          v-on:click="fetch"
          :disabled="!modified || loading"
          :title="queryButtonTitle"
        >
          Query
        </button>

        Displaying {{ totalEntries }} of all signature entries in the database.

        Displaying {{ totalEntries }} unreported signature entries from the
        database.

              ID

              Description

            Activity

              Size

              Best Quality

              External Bug

              Pending Optimization

              <ClipLoader class="m-strong" :color="'black'" :size="'50px'" />

          <Row
            v-for="signature in orderedSignatures"
            :activity-range="activityRange"
            :key="signature.id"
            :providers="providers"
            :signature="signature"
            v-else
          />

</template>


Change g-link to NuxtLink.

Change g-link to NuxtLink.

<template>
  <component
    :is="tag"
    :type="isObjectEmpty(route) ? type : null"
    :to="!isObjectEmpty(route) ? route : null"
    :class="[$options.className, { 'is-loading': loading }]"
  >
    <template v-if="loading">
      Please wait... <LoadingRequest :class="`${$options.className}__loader`" />
    </template>
    <template v-else>
      {{ label }}
    </template>
  </component>
</template>

<script>
import { isObjectEmpty } from '@/utils/helpers.js'
import LoadingRequest from '@/components/app/LoadingRequest.vue'

export default {
  name: 'ButtonInput',
  components: {
    LoadingRequest,
  },
  className: 'ButtonInput',
  props: {
    label: {
      type: String,
      required: true,
    },
    route: {
      type: Object,
      default: () => ({}),
    },
    type: {
      type: String,
      default: 'button',
      validator(value) {
        return ['button', 'submit'].includes(value)
      },
    },
    loading: {
      type: Boolean,
      default: false,
    },
  },
  computed: {
    tag() {
      return this.isObjectEmpty(this.route) ? 'button' : 'NuxtLink'
    },
  },
  methods: {
    isObjectEmpty,
  },
}
</script>

<style lang="scss" scoped>
@import '@/assets/scss/base.scss';

.ButtonInput {
  @include type-style('5');

  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 50px;
  font-weight: 500;
  padding: 0 30px;
  margin: 0;
  border: none;
  background-color: transparent;
  background-image: none;
  border-color: var(--color-theme);
  border-radius: 30px;
  border-style: solid;
  border-width: 2px;
  color: var(--color-theme);
  outline: none;
  text-decoration: none;
  transition: opacity $trans-speed $trans-ease, color $trans-speed $trans-ease,
    border-color $trans-speed $trans-ease,
    background-color $trans-speed $trans-ease;
  user-select: none;
  white-space: nowrap;

  @include media('sm') {
    @include type-style('4');

    height: 60px;
  }

  &:hover,
  &:active,
  &:focus {
    background-color: var(--color-theme);
    color: color('dark');
  }

  &.is-loading {
    background-color: var(--color-theme);
    border-color: transparent;
    color: #fff;
    pointer-events: none;

    &:hover,
    &:active,
    &:focus {
      background-color: var(--color-theme);
    }
  }

  &[disabled] {
    opacity: 0.2;
    pointer-events: none;
  }

  &__loader {
    margin: 0 0 0 10px;
  }
}
</style>

<template>
  <component
    :is="tag"
    :type="isObjectEmpty(route) ? type : null"
    :to="!isObjectEmpty(route) ? route : null"
    :class="[$options.className, { 'is-loading': loading }]"
  >
    <template v-if="loading">
      Please wait... <LoadingRequest :class="`${$options.className}__loader`" />
    </template>
    <template v-else>
      {{ label }}
    </template>
  </component>
</template>

<script>
import { isObjectEmpty } from '@/utils/helpers.js'
import LoadingRequest from '@/components/app/LoadingRequest.vue'

export default {
  name: 'ButtonInput',
  components: {
    LoadingRequest,
  },
  className: 'ButtonInput',
  props: {
    label: {
      type: String,
      required: true,
    },
    route: {
      type: Object,
      default: () => ({}),
    },
    type: {
      type: String,
      default: 'button',
      validator(value) {
        return ['button', 'submit'].includes(value)
      },
    },
    loading: {
      type: Boolean,
      default: false,
    },
  },
  computed: {
    tag() {
      return this.isObjectEmpty(this.route) ? 'button' : 'g-link'
    },
  },
  methods: {
    isObjectEmpty,
  },
}
</script>

<style lang="scss" scoped>
@import '@/assets/scss/base.scss';

.ButtonInput {
  @include type-style('5');

  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 50px;
  font-weight: 500;
  padding: 0 30px;
  margin: 0;
  border: none;
  background-color: transparent;
  background-image: none;
  border-color: var(--color-theme);
  border-radius: 30px;
  border-style: solid;
  border-width: 2px;
  color: var(--color-theme);
  outline: none;
  text-decoration: none;
  transition: opacity $trans-speed $trans-ease, color $trans-speed $trans-ease,
    border-color $trans-speed $trans-ease,
    background-color $trans-speed $trans-ease;
  user-select: none;
  white-space: nowrap;

  @include media('sm') {
    @include type-style('4');

    height: 60px;
  }

  &:hover,
  &:active,
  &:focus {
    background-color: var(--color-theme);
    color: color('dark');
  }

  &.is-loading {
    background-color: var(--color-theme);
    border-color: transparent;
    color: #fff;
    pointer-events: none;

    &:hover,
    &:active,
    &:focus {
      background-color: var(--color-theme);
    }
  }

  &[disabled] {
    opacity: 0.2;
    pointer-events: none;
  }

  &__loader {
    margin: 0 0 0 10px;
  }
}
</style>


Bugfix: Topics shown when no website is available.

<template>

{{$t("pages:detailCommitment.generalInfo.title")}}

            <v-icon class="info-icon">vpn_key</v-icon>

                    {{topic}}<span v-if="index < commitment.topics.length - 1">,

            <v-icon class="info-icon">language</v-icon>
            {{website}}

            <v-icon class="info-icon">location_on</v-icon>
            Region

</template>


only mark as read when visible=true

only mark as read when visible=true

<script lang="coffee">
import StrandList from '@/components/strand/list.vue'
import NewComment from '@/components/strand/item/new_comment.vue'
import NewDiscussion from '@/components/strand/item/new_discussion.vue'
import PollCreated from '@/components/strand/item/poll_created.vue'
import StanceCreated from '@/components/strand/item/stance_created.vue'
import OutcomeCreated from '@/components/strand/item/outcome_created.vue'
import StrandLoadMore from '@/components/strand/load_more.vue'
import OtherKind from '@/components/strand/item/other_kind.vue'
import RangeSet from '@/shared/services/range_set'
import { camelCase, first, last, some } from 'lodash'

export default
  name: 'strand-list'
  props:
    loader: Object
    collection:
      type: Array
      required: true

  components:
    StrandList: StrandList
    NewDiscussion: NewDiscussion
    NewComment: NewComment
    PollCreated: PollCreated
    StanceCreated: StanceCreated
    OutcomeCreated: OutcomeCreated
    OtherKind: OtherKind
    StrandLoadMore: StrandLoadMore

  computed:
    parentExists: ->
      @collection[0] && @collection[0].event && @collection[0].event.parent()

    lastPosition: ->
      (@parentExists && @collection[0].event.parent().childCount) || 0

    positions: ->
      @collection.map (e) -> e.event.position

    ranges: ->
      RangeSet.arrayToRanges(@positions)

    # firstPosition: ->
    #   return 0 unless @collection.length
    #   @collection[0].event.position
    #
    # lastPosition: ->
    #   return 0 unless @collection.length
    #   last(@collection).event.position
    #
    # parentEvent: ->
    #   @collection[0].event.parent()
    siblingCount: ->
      (@collection &&
      @collection.length &&
      @collection[0].event.parent() &&
      @collection[0].event.parent().childCount) || 1

  methods:
    isUnread: (event) ->
      if event.kind == "new_discussion"
        @loader.discussion.updatedAt > @loader.discussion.lastReadAt
      else
        @loader.unreadIds.includes(event.sequenceId)

    positionKeyPrefix: (event) ->
      if event.depth < 1
        event.positionKey.split('-').slice(0, event.depth - 1)
      else
        null

    isFirstInRange: (pos) ->
      some(@ranges, (range) -> range[0] == pos)

    countEarlierMissing: (pos) ->
      lastPos = 1
      val = 0
      @ranges.forEach (range) ->
        if range[0] == pos
          val = (pos - lastPos)
        else
          lastPos = range[1]
      val

    countLaterMissing: ->
      @lastPosition - last(@ranges)[1]

    isLastInLastRange: (pos) ->
      last(@ranges)[1] == pos

    componentForKind: (kind) ->
      camelCase if ['stance_created', 'new_comment', 'outcome_created', 'poll_created', 'new_discussion'].includes(kind)
        kind
      else
        'other_kind'

    visibilityChanged: (visible, entry, event) ->
      return unless visible
      event.markAsRead()

</script>

<template lang="pug">
.strand-list
  .strand-item(v-for="obj, index in collection" :event='obj.event' :key="obj.event.id" :class="{'strand-item--deep': obj.event.depth > 1}")
    .strand-item__row(v-if="parentExists && obj.event.position != 1 && isFirstInRange(obj.event.position)")
      //- .strand-item__gutter
      //-   .strand-item__circle(@click="loadBefore(obj.event)")
      //-     v-icon mdi-unfold-more-horizontal
      strand-load-more(:label="{path: 'common.action.count_more', args: {count: countEarlierMissing(obj.event.position)}}" @click="loader.loadBefore(obj.event)")

    .strand-item__row
      .strand-item__gutter(v-if="obj.event.depth > 0" @click.stop="loader.collapse(obj.event.id)")
        .strand-item__circle(v-if="loader.collapsed[obj.event.id]" @click.stop="loader.expand(obj.event.id)")
          v-icon mdi-unfold-more-horizontal
        template(v-else)
          user-avatar(:user="obj.event.actor()" :size="(obj.event.depth > 1) ? 28 : 36" no-link)
          v-badge(offset-x="48" offset-y="-24" icon="mdi-pin" v-if="obj.event.pinned" color="accent")
            //- i.mdi.mdi-pin.context-panel__heading-pin()
          .strand-item__stem(:class="{'strand-item__stem--unread': isUnread(obj.event), 'strand-item__stem--last': obj.event.position == siblingCount}")
      .strand-item__main
        //- | {{obj.event.sequenceId}} {{obj.event.positionKey}} {{obj.event.childCount}} {{obj.event.descendantCount}}
        component(:is="componentForKind(obj.event.kind)" :event='obj.event' :collapsed="loader.collapsed[obj.event.id]" v-observe-visibility="{callback: (isVisible, entry) => visibilityChanged(isVisible, entry, obj.event), once: true}")

        .strand-list__children.pt-2(v-if="obj.event.childCount")
          //- .strand-item__gutter(v-if="index+1 != siblingCount" @click="loader.collapse(obj.event.id)")
          //-   .strand-item__branch-container
          //-     .strand-item__branch
          //-   .strand-item__stem(v-if="(index+1 != collection.length) || obj.children")

          //- | obj.children {{obj.children.length}}
          strand-list.flex-grow-1(v-if="obj.children.length && !loader.collapsed[obj.event.id]" :loader="loader" :collection="obj.children")
          .strand-item__load-more(v-else)
            //- v-btn.action-button(text block @click="loadChildren(obj.event)" v-t="{path: 'common.action.count_responses', args: {count: obj.event.descendantCount}}")
            strand-load-more(:label="{path: 'common.action.count_responses', args: {count: obj.event.descendantCount}}" @click="loader.loadChildren(obj.event)")

    .strand-item__row(v-if="lastPosition != 0 && isLastInLastRange(obj.event.position) && obj.event.position != lastPosition")
      //- .strand-item__gutter
      //-   .strand-item__circle(@click="loadAfter(obj.event)")
      //-     v-icon mdi-unfold-more-horizontal
      //- .strand-item__load-more
        //- | {{obj.event.parent().parentOrSelf().childCount}}
        //- | {{obj.event.positionKey}}
      strand-load-more(:label="{path: 'common.action.count_more', args:{count: countLaterMissing()}}" @click="loader.loadAfter(obj.event)")
        //- | {{lastPosition}} {{ranges}}
</template>

<style lang="sass">

.strand-list
  margin-bottom: 16px

.strand-item--deep
  .strand-item__gutter
    width: 28px
    // margin-right: 4px

  .strand-item__stem
    margin-left: 12px
    margin-right: 12px

  .strand-item__circle
    // margin: 4px 0
    // padding: 4px 0
    width: 28px
    height: 28px

  .strand-item__load-more
    min-height: 28px

  // not working
  .strand-item__branch-container
    .strand-item__branch
      top: -17px!important
      right: -2px
      // height: 36px
      // width: 36px

.strand-item__row
  display: flex

.strand-item__gutter
  display: flex
  flex-direction: column
  width: 36px
  margin-right: 8px

.strand-item__gutter:hover
  .strand-item__stem
    background-color: #999

.strand-item__main
  flex-grow: 1
  padding-bottom: 8px

.strand-item__stem
  width: 0
  height: 100%
  padding: 0 1px
  background-color: #dadada
  margin: 6px 18px

.strand-item__stem--unread
  background-color: var(--v-primary-base)!important

.strand-item__stem--last
  height: calc(100% - 44px)

// .strand-item__stem-stop
//   position: relative
//   left: -16px
//   width: 24px
//   height: 2px
//   background-color: #ddd
//   margin: 0 24px

.strand-item__circle
  display: flex
  align-items: center
  justify-content: center
  width: 36px
  height: 36px
  border: 1px solid #dadada
  border-radius: 100%
  margin: 4px 0

.strand-item__circle:hover
  background-color: #dadada

.strand-item__load-more
  display: flex
  align-items: center
  min-height: 36px
  width: 100%
  justify-content: center
  margin: 8px 0
  // background: linear-gradient(180deg, rgba(0,0,0,0) calc(50% - 1px), rgba(192,192,192,1) calc(50%), rgba(0,0,0,0) calc(50% + 1px) )

.strand-item__stem:hover
  background-color: #dadada

.strand-item__branch-container
  position: absolute
  overflow: hidden
  margin-right: 4px

.strand-item__branch
  position: relative
  float: left
  top: -13px
  border: 2px solid #dadada
  right: -2px
  height: 28px
  border-radius: 64px
  width: 35px
  margin-left: calc(50% - 1px)
  border-style: solid

</style>

<script lang="coffee">
import StrandList from '@/components/strand/list.vue'
import NewComment from '@/components/strand/item/new_comment.vue'
import NewDiscussion from '@/components/strand/item/new_discussion.vue'
import PollCreated from '@/components/strand/item/poll_created.vue'
import StanceCreated from '@/components/strand/item/stance_created.vue'
import OutcomeCreated from '@/components/strand/item/outcome_created.vue'
import StrandLoadMore from '@/components/strand/load_more.vue'
import OtherKind from '@/components/strand/item/other_kind.vue'
import RangeSet from '@/shared/services/range_set'
import { camelCase, first, last, some } from 'lodash'

export default
  name: 'strand-list'
  props:
    loader: Object
    collection:
      type: Array
      required: true

  components:
    StrandList: StrandList
    NewDiscussion: NewDiscussion
    NewComment: NewComment
    PollCreated: PollCreated
    StanceCreated: StanceCreated
    OutcomeCreated: OutcomeCreated
    OtherKind: OtherKind
    StrandLoadMore: StrandLoadMore

  computed:
    parentExists: ->
      @collection[0] && @collection[0].event && @collection[0].event.parent()

    lastPosition: ->
      (@parentExists && @collection[0].event.parent().childCount) || 0

    positions: ->
      @collection.map (e) -> e.event.position

    ranges: ->
      RangeSet.arrayToRanges(@positions)

    # firstPosition: ->
    #   return 0 unless @collection.length
    #   @collection[0].event.position
    #
    # lastPosition: ->
    #   return 0 unless @collection.length
    #   last(@collection).event.position
    #
    # parentEvent: ->
    #   @collection[0].event.parent()
    siblingCount: ->
      (@collection &&
      @collection.length &&
      @collection[0].event.parent() &&
      @collection[0].event.parent().childCount) || 1

  methods:
    isUnread: (event) ->
      if event.kind == "new_discussion"
        @loader.discussion.updatedAt > @loader.discussion.lastReadAt
      else
        @loader.unreadIds.includes(event.sequenceId)

    positionKeyPrefix: (event) ->
      if event.depth < 1
        event.positionKey.split('-').slice(0, event.depth - 1)
      else
        null

    isFirstInRange: (pos) ->
      some(@ranges, (range) -> range[0] == pos)

    countEarlierMissing: (pos) ->
      lastPos = 1
      val = 0
      @ranges.forEach (range) ->
        if range[0] == pos
          val = (pos - lastPos)
        else
          lastPos = range[1]
      val

    countLaterMissing: ->
      @lastPosition - last(@ranges)[1]

    isLastInLastRange: (pos) ->
      last(@ranges)[1] == pos

    componentForKind: (kind) ->
      camelCase if ['stance_created', 'new_comment', 'outcome_created', 'poll_created', 'new_discussion'].includes(kind)
        kind
      else
        'other_kind'

    visibilityChanged: (visible, entry, event) ->
      console.log "visibilityChanged", visible, event.sequenceId
      event.markAsRead()

</script>

<template lang="pug">
.strand-list
  .strand-item(v-for="obj, index in collection" :event='obj.event' :key="obj.event.id" :class="{'strand-item--deep': obj.event.depth > 1}")
    .strand-item__row(v-if="parentExists && obj.event.position != 1 && isFirstInRange(obj.event.position)")
      //- .strand-item__gutter
      //-   .strand-item__circle(@click="loadBefore(obj.event)")
      //-     v-icon mdi-unfold-more-horizontal
      strand-load-more(:label="{path: 'common.action.count_more', args: {count: countEarlierMissing(obj.event.position)}}" @click="loader.loadBefore(obj.event)")

    .strand-item__row
      .strand-item__gutter(v-if="obj.event.depth > 0" @click.stop="loader.collapse(obj.event.id)")
        .strand-item__circle(v-if="loader.collapsed[obj.event.id]" @click.stop="loader.expand(obj.event.id)")
          v-icon mdi-unfold-more-horizontal
        template(v-else)
          user-avatar(:user="obj.event.actor()" :size="(obj.event.depth > 1) ? 28 : 36" no-link)
          v-badge(offset-x="48" offset-y="-24" icon="mdi-pin" v-if="obj.event.pinned" color="accent")
            //- i.mdi.mdi-pin.context-panel__heading-pin()
          .strand-item__stem(:class="{'strand-item__stem--unread': isUnread(obj.event), 'strand-item__stem--last': obj.event.position == siblingCount}")
      .strand-item__main
        //- | {{obj.event.sequenceId}} {{obj.event.positionKey}} {{obj.event.childCount}} {{obj.event.descendantCount}}
        component(:is="componentForKind(obj.event.kind)" :event='obj.event' :collapsed="loader.collapsed[obj.event.id]" v-observe-visibility="{callback: (isVisible, entry) => visibilityChanged(isVisible, entry, obj.event), once: true}")

        .strand-list__children.pt-2(v-if="obj.event.childCount")
          //- .strand-item__gutter(v-if="index+1 != siblingCount" @click="loader.collapse(obj.event.id)")
          //-   .strand-item__branch-container
          //-     .strand-item__branch
          //-   .strand-item__stem(v-if="(index+1 != collection.length) || obj.children")

          //- | obj.children {{obj.children.length}}
          strand-list.flex-grow-1(v-if="obj.children.length && !loader.collapsed[obj.event.id]" :loader="loader" :collection="obj.children")
          .strand-item__load-more(v-else)
            //- v-btn.action-button(text block @click="loadChildren(obj.event)" v-t="{path: 'common.action.count_responses', args: {count: obj.event.descendantCount}}")
            strand-load-more(:label="{path: 'common.action.count_responses', args: {count: obj.event.descendantCount}}" @click="loader.loadChildren(obj.event)")

    .strand-item__row(v-if="lastPosition != 0 && isLastInLastRange(obj.event.position) && obj.event.position != lastPosition")
      //- .strand-item__gutter
      //-   .strand-item__circle(@click="loadAfter(obj.event)")
      //-     v-icon mdi-unfold-more-horizontal
      //- .strand-item__load-more
        //- | {{obj.event.parent().parentOrSelf().childCount}}
        //- | {{obj.event.positionKey}}
      strand-load-more(:label="{path: 'common.action.count_more', args:{count: countLaterMissing()}}" @click="loader.loadAfter(obj.event)")
        //- | {{lastPosition}} {{ranges}}
</template>

<style lang="sass">

.strand-list
  margin-bottom: 16px

.strand-item--deep
  .strand-item__gutter
    width: 28px
    // margin-right: 4px

  .strand-item__stem
    margin-left: 12px
    margin-right: 12px

  .strand-item__circle
    // margin: 4px 0
    // padding: 4px 0
    width: 28px
    height: 28px

  .strand-item__load-more
    min-height: 28px

  // not working
  .strand-item__branch-container
    .strand-item__branch
      top: -17px!important
      right: -2px
      // height: 36px
      // width: 36px

.strand-item__row
  display: flex

.strand-item__gutter
  display: flex
  flex-direction: column
  width: 36px
  margin-right: 8px

.strand-item__gutter:hover
  .strand-item__stem
    background-color: #999

.strand-item__main
  flex-grow: 1
  padding-bottom: 8px

.strand-item__stem
  width: 0
  height: 100%
  padding: 0 1px
  background-color: #dadada
  margin: 6px 18px

.strand-item__stem--unread
  background-color: var(--v-primary-base)!important

.strand-item__stem--last
  height: calc(100% - 44px)

// .strand-item__stem-stop
//   position: relative
//   left: -16px
//   width: 24px
//   height: 2px
//   background-color: #ddd
//   margin: 0 24px

.strand-item__circle
  display: flex
  align-items: center
  justify-content: center
  width: 36px
  height: 36px
  border: 1px solid #dadada
  border-radius: 100%
  margin: 4px 0

.strand-item__circle:hover
  background-color: #dadada

.strand-item__load-more
  display: flex
  align-items: center
  min-height: 36px
  width: 100%
  justify-content: center
  margin: 8px 0
  // background: linear-gradient(180deg, rgba(0,0,0,0) calc(50% - 1px), rgba(192,192,192,1) calc(50%), rgba(0,0,0,0) calc(50% + 1px) )

.strand-item__stem:hover
  background-color: #dadada

.strand-item__branch-container
  position: absolute
  overflow: hidden
  margin-right: 4px

.strand-item__branch
  position: relative
  float: left
  top: -13px
  border: 2px solid #dadada
  right: -2px
  height: 28px
  border-radius: 64px
  width: 35px
  margin-left: calc(50% - 1px)
  border-style: solid

</style>


Update front page design -  Mobile Menu

Update front page design -
 Mobile Menu

<template>

        {{ loadLogo ? null : 'Website Logo' }}

          {{link.name}}
          <router-link v-else @click.native="toggleNav" :to="link.path">{{link.name}} </router-link>

              {{subLink.name}}
              <router-link v-else :to="subLink.path">{{subLink.name}}</router-link>

      <div class="background-image" :style="{'background-image': `url(${require('../assets/img/hero.jpg')})`}">

          {{settings.title}}

{{settings.description}}

            Download it Here

Some of our work

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id felis et ipsum bibendum ultrices. Morbi vitae pulvinar velit. Sed aliquam dictum sapien, id sagittis augue malesuada eu.

          <li class="small" :style="{'background-image': `url(${require('../assets/img/coast.jpg')})`}">

          <li class="large" :style="{'background-image': `url(${require('../assets/img/island.jpg')})`}">

          <li class="large" :style="{'background-image': `url(${require('../assets/img/balloon.jpg')})`}">

          <li class="small" :style="{'background-image': `url(${require('../assets/img/mountain.jpg')})`}">

Features and services

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id felis et ipsum bibendum ultrices. Morbi vitae pulvinar velit. Sed aliquam dictum sapien, id sagittis augue malesuada eu.

Photography

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id felis et ipsum bibendum ultrices vitae pulvinar velit.

Web Development

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id felis et ipsum bibendum ultrices vitae pulvinar velit.

Content Editing

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id felis et ipsum bibendum ultrices vitae pulvinar velit.

What Others Say

Mauris sit amet mauris a arcu eleifend ultricies eget ut dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

Patrick Farrell

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id felis et ipsum bibendum ultrices. Morbi vitae pulvinar velit. Sed aliquam dictum sapien, id sagittis augue malesuada eu.

George Smith

Donec commodo dolor augue, vitae faucibus tortor tincidunt in. Aliquam vitae leo quis mi pulvinar ornare. Integer eu iaculis metus.

Kevin Blake

Join our newsletter

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id felis et ipsum bibendum ultrices. Morbi vitae pulvinar velit. Sed aliquam dictum sapien, id sagittis augue malesuada eu.

          <form>

              <input class="form-control is-large" type="email" placeholder="Your e-mail">

              <button>

              </button>

          </form>

Made by
            tutorialzine. images courtesy to
            unsplash.

No attribution required. you can remove this footer.

</template>

<template>

        {{ loadLogo ? null : 'Website Logo' }}

          {{link.name}}
          <router-link v-else :to="link.path">{{link.name}}</router-link>

              {{subLink.name}}
              <router-link v-else :to="subLink.path">{{subLink.name}}</router-link>

      <div class="background-image" :style="{'background-image': `url(${require('../assets/img/hero.jpg')})`}">

          {{settings.title}}

{{settings.description}}

            Download it Here

Some of our work

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id felis et ipsum bibendum ultrices. Morbi vitae pulvinar velit. Sed aliquam dictum sapien, id sagittis augue malesuada eu.

          <li class="small" :style="{'background-image': `url(${require('../assets/img/coast.jpg')})`}">

          <li class="large" :style="{'background-image': `url(${require('../assets/img/island.jpg')})`}">

          <li class="large" :style="{'background-image': `url(${require('../assets/img/balloon.jpg')})`}">

          <li class="small" :style="{'background-image': `url(${require('../assets/img/mountain.jpg')})`}">

Features and services

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id felis et ipsum bibendum ultrices. Morbi vitae pulvinar velit. Sed aliquam dictum sapien, id sagittis augue malesuada eu.

Photography

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id felis et ipsum bibendum ultrices vitae pulvinar velit.

Web Development

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id felis et ipsum bibendum ultrices vitae pulvinar velit.

Content Editing

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id felis et ipsum bibendum ultrices vitae pulvinar velit.

What Others Say

Mauris sit amet mauris a arcu eleifend ultricies eget ut dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

Patrick Farrell

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id felis et ipsum bibendum ultrices. Morbi vitae pulvinar velit. Sed aliquam dictum sapien, id sagittis augue malesuada eu.

George Smith

Donec commodo dolor augue, vitae faucibus tortor tincidunt in. Aliquam vitae leo quis mi pulvinar ornare. Integer eu iaculis metus.

Kevin Blake

Join our newsletter

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam id felis et ipsum bibendum ultrices. Morbi vitae pulvinar velit. Sed aliquam dictum sapien, id sagittis augue malesuada eu.

          <form>

              <input class="form-control is-large" type="email" placeholder="Your e-mail">

              <button>

              </button>

          </form>

Made by
            tutorialzine. images courtesy to
            unsplash.

No attribution required. you can remove this footer.

</template>


perseus to only show hints when allowHints or interactive is true

<template>

          <KLinearLoader
            v-show="loading"
            :delay="false"
            type="indeterminate"
          />

        <KGrid>

          <KGridItem :layout12="{ span: allowHints && interactive ? 6 : 12 }">

          </KGridItem>

          <KGridItem v-show="interactive && allowHints" :layout12="{ span: 6 }">

              {{ $tr("hintLabel") }}

          </KGridItem>
        </KGrid>

      <transition name="expand">

          {{ message }}

      </transition>

      <KButton
        v-if="scratchpad"
        id="scratchpad-show"
        :primary="false"
        :raised="false"
        :text="$tr('showScratch')"
      />
      <KButton
        v-else
        id="scratchpad-not-available"
        :primary="false"
        :raised="false"
        disabled
        :text="$tr('notAvailable')"
      />

</template>

<template>

          <KLinearLoader
            v-show="loading"
            :delay="false"
            type="indeterminate"
          />

        <KGrid>

          <KGridItem :layout12="{ span: interactive ? 6 : 12 }">

          </KGridItem>

          <KGridItem v-show="interactive" :layout12="{ span: 6 }">

              {{ $tr("hintLabel") }}

          </KGridItem>
        </KGrid>

      <transition name="expand">

          {{ message }}

      </transition>

      <KButton
        v-if="scratchpad"
        id="scratchpad-show"
        :primary="false"
        :raised="false"
        :text="$tr('showScratch')"
      />
      <KButton
        v-else
        id="scratchpad-not-available"
        :primary="false"
        :raised="false"
        disabled
        :text="$tr('notAvailable')"
      />

</template>


add locked, broadcastBefore, nonce, channelTransaction to account details view

<template>

			{{ $t('adminAccountsDetail.title') }}
			{{ publicKeyClient }}

							{{ $t('adminAccountsDetail.fields.timeCreated') }}
							{{ accountDetail.account.timeCreated | moment(dateFormat) }}

							{{ $t('adminAccountsDetail.fields.publicKeyClient') }}

								{{ accountDetail.account.publicKeyClient }}

							{{ $t('adminAccountsDetail.fields.privateKeyServer') }}

								{{ accountDetail.account.privateKeyServer }}

							{{ $t('adminAccountsDetail.fields.publicKeyServer') }}

								{{ accountDetail.account.publicKeyServer }}

							{{ $t('adminAccountsDetail.fields.locked') }}

									{{ $t('adminAccountsDetail.locked') }}

									{{ $t('adminAccountsDetail.notLocked') }}

							{{ $t('adminAccountsDetail.fields.broadcastBefore') }}

									{{ accountDetail.account.broadcastBefore | moment(dateFormat) }}

							{{ $t('adminAccountsDetail.fields.nonce') }}

									{{ accountDetail.account.nonce | moment(dateFormat) }}

							{{ $t('adminAccountsDetail.fields.channelTransaction') }}

									{{ accountDetail.account.channelTransaction | moment(dateFormat) }}

							{{ $t('adminAccountsDetail.fields.virtualBalance') }}
							{{ accountDetail.account.virtualBalance }}

							{{ $t('adminAccountsDetail.fields.satoshiBalance') }}
							{{ accountDetail.account.satoshiBalance }}

							{{ $t('adminAccountsDetail.fields.totalBalance') }}
							{{ accountDetail.account.totalBalance }}

{{ $t('adminAccountsDetail.timeLockedAddresses') }}:

 0">

						<template slot="createdAt" scope="item">
							{{ item.value | moment(dateFormat) }}
						</template>
						<template slot="bitcoinAddress" scope="item">
							{{ item.value }}
						</template>
						<template slot="adddressUrl" scope="item">

								Link

						</template>
						<template slot="locked" scope="item">

								{{ $t('adminAccountsDetail.locked') }}

								{{ $t('adminAccountsDetail.notLocked') }}

						</template>
						<template slot="lockedUntil" scope="item">
							{{ item.value | moment(dateFormat) }}
						</template>
						<template slot="balance" scope="item">
							{{ item.value }}
						</template>

					{{ $t('adminAccountsDetail.noTimeLockedAddressFoundTitle') }}
					{{ $t('adminAccountsDetail.noTimeLockedAddressFound') }}

				{{ $t('adminAccountsDetail.noAccountFoundTitle') }}
				{{ $t('adminAccountsDetail.noAccountFound') }}

</template>

<template>

			{{ $t('adminAccountsDetail.title') }}
			{{ publicKeyClient }}

							{{ $t('adminAccountsDetail.fields.timeCreated') }}
							{{ accountDetail.account.timeCreated | moment(dateFormat) }}

							{{ $t('adminAccountsDetail.fields.publicKeyClient') }}

								{{ accountDetail.account.publicKeyClient }}

							{{ $t('adminAccountsDetail.fields.privateKeyServer') }}

								{{ accountDetail.account.privateKeyServer }}

							{{ $t('adminAccountsDetail.fields.publicKeyServer') }}

								{{ accountDetail.account.publicKeyServer }}

							{{ $t('adminAccountsDetail.fields.virtualBalance') }}
							{{ accountDetail.account.virtualBalance }}

							{{ $t('adminAccountsDetail.fields.satoshiBalance') }}
							{{ accountDetail.account.satoshiBalance }}

							{{ $t('adminAccountsDetail.fields.totalBalance') }}
							{{ accountDetail.account.totalBalance }}

{{ $t('adminAccountsDetail.timeLockedAddresses') }}:

 0">

						<template slot="createdAt" scope="item">
							{{ item.value | moment(dateFormat) }}
						</template>
						<template slot="bitcoinAddress" scope="item">
							{{ item.value }}
						</template>
						<template slot="adddressUrl" scope="item">

								Link

						</template>
						<template slot="locked" scope="item">

								Yes

								No

						</template>
						<template slot="lockedUntil" scope="item">
							{{ item.value | moment(dateFormat) }}
						</template>
						<template slot="balance" scope="item">
							{{ item.value }}
						</template>

					{{ $t('adminAccountsDetail.noTimeLockedAddressFoundTitle') }}
					{{ $t('adminAccountsDetail.noTimeLockedAddressFound') }}

				{{ $t('adminAccountsDetail.noAccountFoundTitle') }}
				{{ $t('adminAccountsDetail.noAccountFound') }}

</template>


2.9.1     fix доступ в справочник по группе     + лог действий в конструкторе описательных исследований     + лог действий с результатами описательных исследований

<template>

        <select-picker-b style="height: 34px;" :options="departments_of_type" v-model="department"/>

      <input class="form-control" v-model="title_filter" style="padding-top: 7px;padding-bottom: 7px"
             placeholder="Фильтр по названию"/>

Не найдено

{{row.title}}

      <button class="btn btn-blue-nb sidebar-footer" @click="open_editor(-1)">
        Добавить
      </button>

      <paraclinic-research-editor style="position: absolute;top: 0;right: 0;bottom: 0;left: 0;" v-if="opened_id > -2"
                                  :pk="opened_id" :department="department_int"/>

</template>


Fix endless VPS status update after closing VPS page

<template>
  <v-container>

      {{ vps.name}} -
      {{ $t('service') }} {{ $t('vps') }} #{{ id }}

    <v-layout row wrap>
      <v-flex xs12 lg6>

{{ $t('payments') }}

        <v-layout row>
          <v-flex xs12 sm11>

            <v-card color="green" class="white--text" v-if="vps.active">
              <v-container fluid grid-list-lg>
                <v-layout row>
                  <v-flex xs9 sm10>

                        {{ $t('active') }}

{{ $t('payedTo') }} {{ vps.payed_to | prettyDateTime }}

                  </v-flex>
                  <v-flex xs3 sm2>

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

            <v-card color="red darken-3" class="white--text" v-else>
              <v-container fluid grid-list-lg>
                <v-layout row>
                  <v-flex xs9 sm10>

                        {{ $t('notActive') }}

{{ $t('payedTo') }} {{ vps.payed_to | prettyDateTime }}

                  </v-flex>
                  <v-flex xs3 sm2>

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

      <v-flex xs12 lg6>

{{ $t('state') }}

        <v-layout row>
          <v-flex xs12 sm11>

            <v-card color="green" class="white--text" v-if="vps.status === 'running'">
              <v-container fluid grid-list-lg>
                <v-layout row>
                  <v-flex xs9 sm10>

                        {{ $t('turnedOn') }}

                        {{ $t('since')}} {{ vps.uptime_s | secondsToStartDate }} ({{ vps.uptime_s | secondsToDays }}d)

                  </v-flex>
                  <v-flex xs3 sm2>

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

            <v-card color="red darken-3" class="white--text" v-else>
              <v-container fluid grid-list-lg>
                <v-layout row>
                  <v-flex xs9 sm10>

                        {{ $t('turnedOff') }}

                  </v-flex>
                  <v-flex xs3 sm2>

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

          </v-flex>
        </v-layout>
      </v-flex>

    </v-layout>

    <v-layout row wrap>

      <v-flex xs12 lg6>

{{ $t('security') }}

        <v-layout row>
          <v-flex xs12 sm11>
            <v-card>
              <v-list>

                  <v-list-tile avatar @click="">
                    <v-list-tile-action>
                      <v-icon v-if="ip" color="yellow">star</v-icon>
                    </v-list-tile-action>
                    <v-list-tile-content>
                      <v-list-tile-title v-text="ip">
                      </v-list-tile-title>
                    </v-list-tile-content>
                    <v-list-tile-avatar class="hidden-xs-only">
                      <v-btn @click="$router.push('/service/vps/'+id+'/ip/'+ip+'/filter')">
                        {{ $t('udpFiltering') }}
                      </v-btn>
                      <v-btn @click="$router.push('/service/vps/'+id+'/ip/'+ip+'/attacks')">
                        {{ $t('ddosAttacks') }}
                      </v-btn>
                    </v-list-tile-avatar>
                  </v-list-tile>

                  <v-list-tile avatar @click="" class="hidden-sm-and-up">
                    <v-list-tile-avatar>
                      <v-btn @click="$router.push('/service/vps/'+id+'/ip/'+ip+'/filter')">
                        {{ $t('udpFiltering') }}
                      </v-btn>
                      <v-btn @click="$router.push('/service/vps/'+id+'/ip/'+ip+'/attacks')">
                        {{ $t('ddosAttacks') }}
                      </v-btn>
                    </v-list-tile-avatar>
                  </v-list-tile>

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

      <v-flex xs12 lg6>

{{ $t('management') }}

        <v-layout row>
          <v-flex xs12 sm11>
            <v-card>

              <v-list>
                <v-list-tile avatar>
                  <v-btn color="green" dark large v-if="vps.status !== 'running'" @click="turnOnVps()">

                    {{ $t('turnOn')}}
                  </v-btn>
                  <v-btn color="red" dark large v-if="vps.status === 'running'" @click="turnOffVps()">

                    {{ $t('turnOff')}}
                  </v-btn>

                    {{ $t('turnOffDesc')}}

                    {{ $t('turnOnDesc')}}

                  <v-list-tile-content>
                    <v-list-tile-title>

                    </v-list-tile-title>
                  </v-list-tile-content>
                  <v-list-tile-avatar>

                  </v-list-tile-avatar>
                </v-list-tile>
              </v-list>

              <v-snackbar
                bottom
                :timeout="2000"
                v-model="vpsTurnedOnSnack"
              >
                {{ $t('vpsJustTurnedOn') }}
              </v-snackbar>

              <v-snackbar
                bottom
                :timeout="2000"
                v-model="vpsTurnedOffSnack"
              >
                {{ $t('vpsJustTurnedOff') }}
              </v-snackbar>

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

    </v-layout>

    <v-layout row wrap>
      <v-flex xs12 lg6 v-if="vps.status === 'running'">

{{ $t('performance') }}

        <v-layout row>
          <v-flex xs12 sm11>

            <v-card>
              <v-container>
                <v-layout row>
                  <v-flex xs12>
                    <v-layout row wrap>

                      <v-flex xs6 md3>
                        <v-progress-circular
                          v-bind:size="120"
                          v-bind:width="15"
                          v-bind:rotate="-90"
                          v-bind:value="vps.cpu"
                          color="primary"
                        >
                          {{ vps.cpu }}% CPU
                        </v-progress-circular>

                          CPU

                      </v-flex>

                      <v-flex xs6 md3>
                        <v-progress-circular
                          v-bind:size="120"
                          v-bind:width="15"
                          v-bind:rotate="-90"
                          v-bind:value="vps.cpu"
                          color="primary"
                        >
                          {{ memPercent }}%
                        </v-progress-circular>

                          RAM

                      </v-flex>

                      <v-flex xs6 md3>
                        <v-progress-circular
                          v-bind:size="120"
                          v-bind:width="15"
                          v-bind:rotate="-90"
                          v-bind:value="netInBSpeedPercent"
                          color="green"
                        >
                          = 1024">
                           {{ Math.round((netInBSpeed / 1024)) }}MB/s

                            {{ netInBSpeed }}kB/s

                        </v-progress-circular>

                          Download

                      </v-flex>

                      <v-flex xs6 md3>
                        <v-progress-circular
                          v-bind:size="120"
                          v-bind:width="15"
                          v-bind:rotate="-90"
                          v-bind:value="netOutBSpeedPercent"
                          color="red"
                        >
                          = 1024">
                           {{ Math.round((netOutBSpeed / 1024)) }}MB/s

                            {{ netOutBSpeed }}kB/s

                        </v-progress-circular>

                          Upload

                      </v-flex>

                    </v-layout>

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

          </v-flex>
        </v-layout>
      </v-flex>

    </v-layout>

  </v-container>
</template>

<template>
  <v-container>

      {{ vps.name}} -
      {{ $t('service') }} {{ $t('vps') }} #{{ id }}

    <v-layout row wrap>
      <v-flex xs12 lg6>

{{ $t('payments') }}

        <v-layout row>
          <v-flex xs12 sm11>

            <v-card color="green" class="white--text" v-if="vps.active">
              <v-container fluid grid-list-lg>
                <v-layout row>
                  <v-flex xs9 sm10>

                        {{ $t('active') }}

{{ $t('payedTo') }} {{ vps.payed_to | prettyDateTime }}

                  </v-flex>
                  <v-flex xs3 sm2>

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

            <v-card color="red darken-3" class="white--text" v-else>
              <v-container fluid grid-list-lg>
                <v-layout row>
                  <v-flex xs9 sm10>

                        {{ $t('notActive') }}

{{ $t('payedTo') }} {{ vps.payed_to | prettyDateTime }}

                  </v-flex>
                  <v-flex xs3 sm2>

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

      <v-flex xs12 lg6>

{{ $t('state') }}

        <v-layout row>
          <v-flex xs12 sm11>

            <v-card color="green" class="white--text" v-if="vps.status === 'running'">
              <v-container fluid grid-list-lg>
                <v-layout row>
                  <v-flex xs9 sm10>

                        {{ $t('turnedOn') }}

                        {{ $t('since')}} {{ vps.uptime_s | secondsToStartDate }} ({{ vps.uptime_s | secondsToDays }}d)

                  </v-flex>
                  <v-flex xs3 sm2>

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

            <v-card color="red darken-3" class="white--text" v-else>
              <v-container fluid grid-list-lg>
                <v-layout row>
                  <v-flex xs9 sm10>

                        {{ $t('turnedOff') }}

                  </v-flex>
                  <v-flex xs3 sm2>

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

          </v-flex>
        </v-layout>
      </v-flex>

    </v-layout>

    <v-layout row wrap>

      <v-flex xs12 lg6>

{{ $t('security') }}

        <v-layout row>
          <v-flex xs12 sm11>
            <v-card>
              <v-list>

                  <v-list-tile avatar @click="">
                    <v-list-tile-action>
                      <v-icon v-if="ip" color="yellow">star</v-icon>
                    </v-list-tile-action>
                    <v-list-tile-content>
                      <v-list-tile-title v-text="ip">
                      </v-list-tile-title>
                    </v-list-tile-content>
                    <v-list-tile-avatar class="hidden-xs-only">
                      <v-btn>{{ $t('udpFiltering') }}</v-btn>
                      <v-btn @click="$router.push('/service/vps/'+id+'/ip/'+ip+'/attacks')">
                        {{ $t('ddosAttacks') }}
                      </v-btn>
                    </v-list-tile-avatar>
                  </v-list-tile>

                  <v-list-tile avatar @click="" class="hidden-sm-and-up">
                    <v-list-tile-avatar>
                      <v-btn>{{ $t('udpFiltering') }}</v-btn>
                      <v-btn>{{ $t('ddosAttacks') }}</v-btn>
                    </v-list-tile-avatar>
                  </v-list-tile>

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

      <v-flex xs12 lg6>

{{ $t('management') }}

        <v-layout row>
          <v-flex xs12 sm11>
            <v-card>

              <v-list>
                <v-list-tile avatar>
                  <v-btn color="green" dark large v-if="vps.status !== 'running'" @click="turnOnVps()">

                    {{ $t('turnOn')}}
                  </v-btn>
                  <v-btn color="red" dark large v-if="vps.status === 'running'" @click="turnOffVps()">

                    {{ $t('turnOff')}}
                  </v-btn>

                    {{ $t('turnOffDesc')}}

                    {{ $t('turnOnDesc')}}

                  <v-list-tile-content>
                    <v-list-tile-title>

                    </v-list-tile-title>
                  </v-list-tile-content>
                  <v-list-tile-avatar>

                  </v-list-tile-avatar>
                </v-list-tile>
              </v-list>

              <v-snackbar
                bottom
                :timeout="2000"
                v-model="vpsTurnedOnSnack"
              >
                {{ $t('vpsJustTurnedOn') }}
              </v-snackbar>

              <v-snackbar
                bottom
                :timeout="2000"
                v-model="vpsTurnedOffSnack"
              >
                {{ $t('vpsJustTurnedOff') }}
              </v-snackbar>

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

    </v-layout>

    <v-layout row wrap>
      <v-flex xs12 lg6 v-if="vps.status === 'running'">

{{ $t('performance') }}

        <v-layout row>
          <v-flex xs12 sm11>

            <v-card>
              <v-container>
                <v-layout row>
                  <v-flex xs12>
                    <v-layout row wrap>

                      <v-flex xs6 md3>
                        <v-progress-circular
                          v-bind:size="120"
                          v-bind:width="15"
                          v-bind:rotate="-90"
                          v-bind:value="vps.cpu"
                          color="primary"
                        >
                          {{ vps.cpu }}% CPU
                        </v-progress-circular>

                          CPU

                      </v-flex>

                      <v-flex xs6 md3>
                        <v-progress-circular
                          v-bind:size="120"
                          v-bind:width="15"
                          v-bind:rotate="-90"
                          v-bind:value="vps.cpu"
                          color="primary"
                        >
                          {{ memPercent }}%
                        </v-progress-circular>

                          RAM

                      </v-flex>

                      <v-flex xs6 md3>
                        <v-progress-circular
                          v-bind:size="120"
                          v-bind:width="15"
                          v-bind:rotate="-90"
                          v-bind:value="netInBSpeedPercent"
                          color="green"
                        >
                          = 1024">
                           {{ Math.round((netInBSpeed / 1024)) }}MB/s

                            {{ netInBSpeed }}kB/s

                        </v-progress-circular>

                          Download

                      </v-flex>

                      <v-flex xs6 md3>
                        <v-progress-circular
                          v-bind:size="120"
                          v-bind:width="15"
                          v-bind:rotate="-90"
                          v-bind:value="netOutBSpeedPercent"
                          color="red"
                        >
                          = 1024">
                           {{ Math.round((netOutBSpeed / 1024)) }}MB/s

                            {{ netOutBSpeed }}kB/s

                        </v-progress-circular>

                          Upload

                      </v-flex>

                    </v-layout>

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

          </v-flex>
        </v-layout>
      </v-flex>

    </v-layout>

  </v-container>
</template>