applications.vue cleanup

applications.vue cleanup

<template>

      {{ s__('ClusterIntegration|Applications') }}

      {{ s__(`ClusterIntegration|Choose which applications to install on your Kubernetes cluster.
        Helm Tiller is required to install any of the following applications.`) }}

        {{ __('More information') }}

      <application-row
        id="helm"
        :logo-url="helmLogo"
        :title="applications.helm.title"
        :status="applications.helm.status"
        :status-reason="applications.helm.statusReason"
        :request-status="applications.helm.requestStatus"
        :request-reason="applications.helm.requestReason"
        class="rounded-top"
        title-link="https://docs.helm.sh/"
      >

          {{ s__(`ClusterIntegration|Helm streamlines installing
            and managing Kubernetes applications.
            Tiller runs inside of your Kubernetes Cluster,
            and manages releases of your charts.`) }}

      </application-row>

        {{ s__(`ClusterIntegration|You must first install Helm Tiller before
          installing the applications below`) }}

      <application-row
        :id="ingressId"
        :logo-url="kubernetesLogo"
        :title="applications.ingress.title"
        :status="applications.ingress.status"
        :status-reason="applications.ingress.statusReason"
        :request-status="applications.ingress.requestStatus"
        :request-reason="applications.ingress.requestReason"
        :disabled="!helmInstalled"
        title-link="https://kubernetes.io/docs/concepts/services-networking/ingress/"
      >

            {{ s__(`ClusterIntegration|Ingress gives you a way to route
              requests to services based on the request host or path,
              centralizing a number of services into a single entrypoint.`) }}

          <template v-if="ingressInstalled">

                {{ s__('ClusterIntegration|Ingress IP Address') }}

                <input
                  id="ingress-ip-address"
                  :value="ingressExternalIp"
                  type="text"
                  class="form-control js-ip-address"
                  readonly
                />

                  <clipboard-button
                    :text="ingressExternalIp"
                    :title="s__('ClusterIntegration|Copy Ingress IP Address to clipboard')"
                    class="input-group-text js-clipboard-btn"
                  />

              <input
                v-else
                type="text"
                class="form-control js-ip-address"
                readonly
                value="?"
              />

              {{ s__(`ClusterIntegration|The IP address is in
              the process of being assigned. Please check your Kubernetes
              cluster or Quotas on Google Kubernetes Engine if it takes a long time.`) }}

                {{ __('More information') }}

              {{ s__(`ClusterIntegration|Point a wildcard DNS to this
              generated IP address in order to access
              your application after it has been deployed.`) }}

                {{ __('More information') }}

          </template>

      </application-row>
      <application-row
        id="cert_manager"
        :logo-url="certManagerLogo"
        :title="applications.cert_manager.title"
        :status="applications.cert_manager.status"
        :status-reason="applications.cert_manager.statusReason"
        :request-status="applications.cert_manager.requestStatus"
        :request-reason="applications.cert_manager.requestReason"
        :disabled="!helmInstalled"
        class="hide-bottom-border rounded-bottom"
        title-link="https://cert-manager.readthedocs.io/en/latest/#"
      >

            {{ s__(`ClusterIntegration|Cert-Manager is a native Kubernetes
              certificate management controller. It will ensure certificates
              are valid and up to date, and attempt to renew certificates at
              a configured time before expiry. We use Lets Encrypt as a Certificate
              Authority with Cert-Manager.`) }}

      </application-row>
      <application-row
        v-if="isProjectCluster"
        id="prometheus"
        :logo-url="prometheusLogo"
        :title="applications.prometheus.title"
        :manage-link="managePrometheusPath"
        :status="applications.prometheus.status"
        :status-reason="applications.prometheus.statusReason"
        :request-status="applications.prometheus.requestStatus"
        :request-reason="applications.prometheus.requestReason"
        :disabled="!helmInstalled"
        title-link="https://prometheus.io/docs/introduction/overview/"
      >

      </application-row>
      <application-row
        v-if="isProjectCluster"
        id="runner"
        :logo-url="gitlabLogo"
        :title="applications.runner.title"
        :status="applications.runner.status"
        :status-reason="applications.runner.statusReason"
        :request-status="applications.runner.requestStatus"
        :request-reason="applications.runner.requestReason"
        :disabled="!helmInstalled"
        title-link="https://docs.gitlab.com/runner/"
      >

          {{ s__(`ClusterIntegration|GitLab Runner connects to this
            project's repository and executes CI/CD jobs,
            pushing results back and deploying,
            applications to production.`) }}

      </application-row>
      <application-row
        v-if="isProjectCluster"
        id="jupyter"
        :logo-url="jupyterhubLogo"
        :title="applications.jupyter.title"
        :status="applications.jupyter.status"
        :status-reason="applications.jupyter.statusReason"
        :request-status="applications.jupyter.requestStatus"
        :request-reason="applications.jupyter.requestReason"
        :install-application-request-params="{ hostname: applications.jupyter.hostname }"
        :disabled="!helmInstalled"
        title-link="https://jupyterhub.readthedocs.io/en/stable/"
      >

            {{ s__(`ClusterIntegration|JupyterHub, a multi-user Hub, spawns,
              manages, and proxies multiple instances of the single-user
              Jupyter notebook server. JupyterHub can be used to serve
              notebooks to a class of students, a corporate data science group,
              or a scientific research group.`) }}

          <template v-if="ingressExternalIp">

                {{ s__('ClusterIntegration|Jupyter Hostname') }}

                <input
                  v-model="applications.jupyter.hostname"
                  :readonly="jupyterInstalled"
                  type="text"
                  class="form-control js-hostname"
                />

                  <clipboard-button
                    :text="jupyterHostname"
                    :title="s__('ClusterIntegration|Copy Jupyter Hostname to clipboard')"
                    class="js-clipboard-btn"
                  />

              {{ s__(`ClusterIntegration|Replace this with your own hostname if you want.
              If you do so, point hostname to Ingress IP Address from above.`) }}

                {{ __('More information') }}

          </template>

      </application-row>
      <application-row
        id="knative"
        :logo-url="knativeLogo"
        :title="applications.knative.title"
        :status="applications.knative.status"
        :status-reason="applications.knative.statusReason"
        :request-status="applications.knative.requestStatus"
        :request-reason="applications.knative.requestReason"
        :install-application-request-params="{ hostname: applications.knative.hostname}"
        :disabled="!helmInstalled"
        class="hide-bottom-border rounded-bottom"
        title-link="https://github.com/knative/docs"
      >

            {{ s__(`ClusterIntegration|A Knative build extends Kubernetes
              and utilizes existing Kubernetes primitives to provide you with
              the ability to run on-cluster container builds from source.
              For example, you can write a build that uses Kubernetes-native
              resources to obtain your source code from a repository,
              build it into container a image, and then run that image.`) }}

          <template v-if="knativeInstalled">

                {{ s__('ClusterIntegration|Knative Domain Name:') }}

              <input
                id="knative-domainname"
                v-model="applications.knative.hostname"
                type="text"
                class="form-control js-domainname"
                readonly
              />

          </template>
          <template v-else>

                {{ s__('ClusterIntegration|Knative Domain Name:') }}

              <input
                id="knative-domainname"
                v-model="applications.knative.hostname"
                type="text"
                class="form-control js-domainname"
              />

          </template>

      </application-row>

</template>

<template>

      {{ s__('ClusterIntegration|Applications') }}

      {{ s__(`ClusterIntegration|Choose which applications to install on your Kubernetes cluster.
        Helm Tiller is required to install any of the following applications.`) }}

        {{ __('More information') }}

      <application-row
        id="helm"
        :logo-url="helmLogo"
        :title="applications.helm.title"
        :status="applications.helm.status"
        :status-reason="applications.helm.statusReason"
        :request-status="applications.helm.requestStatus"
        :request-reason="applications.helm.requestReason"
        class="rounded-top"
        title-link="https://docs.helm.sh/"
      >

          {{ s__(`ClusterIntegration|Helm streamlines installing
            and managing Kubernetes applications.
            Tiller runs inside of your Kubernetes Cluster,
            and manages releases of your charts.`) }}

      </application-row>

        {{ s__(`ClusterIntegration|You must first install Helm Tiller before
          installing the applications below`) }}

      <application-row
        :id="ingressId"
        :logo-url="kubernetesLogo"
        :title="applications.ingress.title"
        :status="applications.ingress.status"
        :status-reason="applications.ingress.statusReason"
        :request-status="applications.ingress.requestStatus"
        :request-reason="applications.ingress.requestReason"
        :disabled="!helmInstalled"
        title-link="https://kubernetes.io/docs/concepts/services-networking/ingress/"
      >

            {{ s__(`ClusterIntegration|Ingress gives you a way to route
              requests to services based on the request host or path,
              centralizing a number of services into a single entrypoint.`) }}

          <template v-if="ingressInstalled">

                {{ s__('ClusterIntegration|Ingress IP Address') }}

                <input
                  id="ingress-ip-address"
                  :value="ingressExternalIp"
                  type="text"
                  class="form-control js-ip-address"
                  readonly
                />

                  <clipboard-button
                    :text="ingressExternalIp"
                    :title="s__('ClusterIntegration|Copy Ingress IP Address to clipboard')"
                    class="input-group-text js-clipboard-btn"
                  />

              <input
                v-else
                type="text"
                class="form-control js-ip-address"
                readonly
                value="?"
              />

              {{ s__(`ClusterIntegration|The IP address is in
              the process of being assigned. Please check your Kubernetes
              cluster or Quotas on Google Kubernetes Engine if it takes a long time.`) }}

                {{ __('More information') }}

              {{ s__(`ClusterIntegration|Point a wildcard DNS to this
              generated IP address in order to access
              your application after it has been deployed.`) }}

                {{ __('More information') }}

          </template>

      </application-row>
      <application-row
        id="cert_manager"
        :logo-url="certManagerLogo"
        :title="applications.cert_manager.title"
        :status="applications.cert_manager.status"
        :status-reason="applications.cert_manager.statusReason"
        :request-status="applications.cert_manager.requestStatus"
        :request-reason="applications.cert_manager.requestReason"
        :disabled="!helmInstalled"
        class="hide-bottom-border rounded-bottom"
        title-link="https://cert-manager.readthedocs.io/en/latest/#"
      >

            {{ s__(`ClusterIntegration|Cert-Manager is a native Kubernetes
              certificate management controller. It will ensure certificates
              are valid and up to date, and attempt to renew certificates at
              a configured time before expiry. We use Lets Encrypt as a Certificate
              Authority with Cert-Manager.`) }}

      </application-row>
      <application-row
        id="prometheus"
        v-if="isProjectCluster"
        :logo-url="prometheusLogo"
        :title="applications.prometheus.title"
        :manage-link="managePrometheusPath"
        :status="applications.prometheus.status"
        :status-reason="applications.prometheus.statusReason"
        :request-status="applications.prometheus.requestStatus"
        :request-reason="applications.prometheus.requestReason"
        :disabled="!helmInstalled"
        title-link="https://prometheus.io/docs/introduction/overview/"
      >

      </application-row>
      <application-row
        v-if="isProjectCluster"
        id="runner"
        :logo-url="gitlabLogo"
        :title="applications.runner.title"
        :status="applications.runner.status"
        :status-reason="applications.runner.statusReason"
        :request-status="applications.runner.requestStatus"
        :request-reason="applications.runner.requestReason"
        :disabled="!helmInstalled"
        title-link="https://docs.gitlab.com/runner/"
      >

          {{ s__(`ClusterIntegration|GitLab Runner connects to this
            project's repository and executes CI/CD jobs,
            pushing results back and deploying,
            applications to production.`) }}

      </application-row>
      <application-row
        v-if="isProjectCluster"
        id="jupyter"
        :logo-url="jupyterhubLogo"
        :title="applications.jupyter.title"
        :status="applications.jupyter.status"
        :status-reason="applications.jupyter.statusReason"
        :request-status="applications.jupyter.requestStatus"
        :request-reason="applications.jupyter.requestReason"
        :install-application-request-params="{ hostname: applications.jupyter.hostname }"
        :disabled="!helmInstalled"
        title-link="https://jupyterhub.readthedocs.io/en/stable/"
      >

            {{ s__(`ClusterIntegration|JupyterHub, a multi-user Hub, spawns,
              manages, and proxies multiple instances of the single-user
              Jupyter notebook server. JupyterHub can be used to serve
              notebooks to a class of students, a corporate data science group,
              or a scientific research group.`) }}

          <template v-if="ingressExternalIp">

                {{ s__('ClusterIntegration|Jupyter Hostname') }}

                <input
                  v-model="applications.jupyter.hostname"
                  :readonly="jupyterInstalled"
                  type="text"
                  class="form-control js-hostname"
                />

                  <clipboard-button
                    :text="jupyterHostname"
                    :title="s__('ClusterIntegration|Copy Jupyter Hostname to clipboard')"
                    class="js-clipboard-btn"
                  />

              {{ s__(`ClusterIntegration|Replace this with your own hostname if you want.
              If you do so, point hostname to Ingress IP Address from above.`) }}

                {{ __('More information') }}

          </template>

      </application-row>
      <application-row
        id="knative"
        :logo-url="knativeLogo"
        :title="applications.knative.title"
        :status="applications.knative.status"
        :status-reason="applications.knative.statusReason"
        :request-status="applications.knative.requestStatus"
        :request-reason="applications.knative.requestReason"
        :install-application-request-params="{ hostname: applications.knative.hostname}"
        :disabled="!helmInstalled"
        class="hide-bottom-border rounded-bottom"
        title-link="https://github.com/knative/docs"
      >

            {{ s__(`ClusterIntegration|A Knative build extends Kubernetes
              and utilizes existing Kubernetes primitives to provide you with
              the ability to run on-cluster container builds from source.
              For example, you can write a build that uses Kubernetes-native
              resources to obtain your source code from a repository,
              build it into container a image, and then run that image.`) }}

          <template v-if="knativeInstalled">

                {{ s__('ClusterIntegration|Knative Domain Name:') }}

              <input
                id="knative-domainname"
                v-model="applications.knative.hostname"
                type="text"
                class="form-control js-domainname"
                readonly
              />

          </template>
          <template v-else>

                {{ s__('ClusterIntegration|Knative Domain Name:') }}

              <input
                id="knative-domainname"
                v-model="applications.knative.hostname"
                type="text"
                class="form-control js-domainname"
              />

          </template>

      </application-row>

</template>


fixed dropdown not being scrollable

fixed dropdown not being scrollable

<template>

        <input
          type="search"
          class="dropdown-input-field"
          :placeholder="__('Search files')"
          autocomplete="off"
          v-model="searchText"
          ref="searchInput"
          @keydown="onKeydown($event)"
          @keyup="onKeyup($event)"
        />

        <virtual-list
          :size="listHeight"
          :remain="listShowCount"
          wtag="ul"
          ref="virtualScrollList"
        >
          <template v-if="filteredBlobsLength">

              <item
                class="disable-hover"
                :file="file"
                :search-text="searchText"
                :focused="index === focusedIndex"
                :index="index"
                @click="openFile"
                @mouseover="onMouseOver"
              />

          </template>

              <template v-if="loading">
                {{ __('Loading...') }}
              </template>
              <template v-else>
                {{ __('No files found.') }}
              </template>

        </virtual-list>

</template>


Adapt to smaller screens

Adapt to smaller screens

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


Escape special characters in secret names (closed #109)

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


友情链接cover宽度不100%

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


Add cursor pointer to the pagination

Add cursor pointer to the pagination

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


Adds try catch for unmounting item Renderer. Adds name to component to ease debugging.

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


Create WIP sign up component

Create WIP sign up component

<template>

      NEWT

dem notes yo

    <form class="ui form" @submit.prevent="toggleSignIn" :class="{ loading: isLoading }">

          <input type="email" name="email" placeholder="Email" v-model="login.email">

          <input type="password" name="password" placeholder="Password" v-model="login.password">

        <button class="ui grey large animated fade button" type="submit">

Sign in

        </button>

Sign in with...

          <button type="button" class="ui google plus large fluid button disabled">

            Google
          </button>

          <button type="button" class="ui facebook large fluid button disabled">

            Facebook
          </button>

          <button type="button" class="ui twitter large fluid button disabled">

            Twitter
          </button>

          <button type="button" class="ui black large fluid button disabled">

            Github
          </button>

          <button type="button" class="ui large basic button">

            Sign up with email and password
          </button>

    </form>

</template>

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


fix: general shadow

fix: general shadow

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


Edit.

Edit.

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


consider android devices mobile

consider android devices mobile

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


added BookmarkList.vue file (missing from previous commit)

<template>
  <widget>
    Bookmarks

      <button v-if="passage" @click="saveBookmark">save</button>

        remove
        <router-link :to="$parent.passageLink($parent.query, bookmark.resource)">{{ bookmark.title }}</router-link>

  </widget>
</template>

error: pathspec 'prototypes/vue-morphgnt-api/src/components/BookmarkList.vue' did not match any file(s) known to git


Do not display cookie bar if cookies have been accepted

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


ready to deploy

ready to deploy

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


Added Link for total shipments in dashboard

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


change font component

change font component

<template>

    字体大小：
    小
    中
    大

</template>

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


Use current user's creds for gravatar.

Use current user's creds for gravatar.


docs(Core): make prop value capitalized

docs(Core): make prop value capitalized

<template>

        {{ heading }}

          {{ name }}
          {{ type }}

</template>


Add BalanceAccount component

Add BalanceAccount component

<template>

      Είδος Πράξης
      <select class="selectpicker pickers" title="Είδος Πράξης" data-live-search="true" id="balance_account_type" name="balance_account_type" data-width="auto">
        <option v-for="accountType in accountTypes" :data-tokens="accountType.keywords" :value="accountType.text">{{accountType.text}}</option>
      </select>

      Χρονική Περίοδος
      <select class="selectpicker pickers" title="Χρονική Περίοδος" data-live-search="true" id="balance_account_time_period" name="balance_account_time_period" data-width="auto">
        <option v-for="accountTimePeriod in accountTimePeriods" :data-tokens="accountTimePeriod.keywords" :value="accountTimePeriod.text">{{accountTimePeriod.text}}</option>
      </select>

      <financial-year></financial-year>

        Έγκριση Ισολογισμού/Απολογισμού τρίτου Φορέα
        <input type="checkbox" name="is_balance_account_approval_for_org" id="is_balance_account_approval_for_org" v-model="checked">

        Φορέας που αφορά
        <input name="has_related_institution" class="form-control">

</template>

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


Removed duplicated code and fixed styles on smallest divices

<template>

    <newsletter class=" flex brdr-bottom brdr-c-alto" v-if="!isCheckout" />

Departments

                <router-link class="c-gray-secondary" to="/c/women-20" exact>Women fashion</router-link>

                <router-link class="c-gray-secondary" to="/c/men-11" exact>Men's fashion</router-link>

                <router-link class="c-gray-secondary" to="/" exact>Kidswear</router-link>

                <router-link class="c-gray-secondary" to="/" exact>Home</router-link>

Orders

                <router-link class="c-gray-secondary" to="/order-tracking" exact>Track my order</router-link>

                <router-link class="c-gray-secondary" to="/my-account" exact>My account</router-link>

                <router-link class="c-gray-secondary" to="/delivery" exact>Delivery</router-link>

                <router-link class="c-gray-secondary" to="/returns" exact>Return policy</router-link>

Help

                <router-link class="c-gray-secondary" to="/customer-service" exact>Customer service</router-link>

                <router-link class="c-gray-secondary" to="/size-guide" exact>Size guide</router-link>

                <router-link class="c-gray-secondary" to="/contact" exact>Contact us</router-link>

About us

                <router-link class="c-gray-secondary" to="/about-us" exact>About us</router-link>

                <router-link class="c-gray-secondary" to="/store-locator" exact>Store locator</router-link>

              <svg xmlns="http://www.w3.org/2000/svg" class="facebook icon" width="40" height="40" viewBox="0 0 40 40" fill="#BDBDBD">
                <path d="M20,0 C8.9541,0 0,8.95435 0,20 C0,31.0457 8.9541,40 20,40 C31.0459,40 40,31.0457 40,20 C40,8.95435 31.0459,0 20,0 Z M22.085,20.8785 L22.085,31.7595 L17.5825,31.7595 L17.5825,20.8789 L15.3335,20.8789 L15.3335,17.1293 L17.5825,17.1293 L17.5825,14.8779 C17.5825,11.819 18.8525,10 22.4609,10 L25.4653,10 L25.4653,13.7501 L23.5874,13.7501 C22.1826,13.7501 22.0898,14.2742 22.0898,15.2521 L22.085,17.1288 L25.4863,17.1288 L25.0884,20.8785 L22.085,20.8785 Z"/>
              </svg>

              <svg xmlns="http://www.w3.org/2000/svg" class="instagram icon" width="40" height="40" viewBox="0 0 40 40" fill="#BDBDBD">
                <path d="M20,0 C8.9541,0 0,8.95435 0,20 C0,31.0457 8.9541,40 20,40 C31.0459,40 40,31.0457 40,20 C40,8.95435 31.0459,0 20,0 Z M15.603,9.39783 C16.7407,9.34607 17.104,9.33337 20.001,9.33337 C22.8955,9.33337 23.2578,9.34607 24.3955,9.39783 C25.5312,9.44983 26.3066,9.62964 26.9868,9.89343 C27.689,10.1656 28.2822,10.53 28.8755,11.1234 C29.4692,11.7163 29.8335,12.3114 30.1069,13.0129 C30.3691,13.6912 30.5488,14.4663 30.6025,15.6019 C30.6533,16.7396 30.667,17.1033 30.667,20.0001 C30.667,22.8971 30.6533,23.2598 30.6025,24.3976 C30.5488,25.5327 30.3691,26.308 30.1069,26.9865 C29.8335,27.6877 29.4692,28.283 28.8755,28.8759 C28.2832,29.4691 27.689,29.8345 26.9873,30.1069 C26.3086,30.3707 25.5327,30.5505 24.397,30.6025 C23.2593,30.6543 22.897,30.6669 20,30.6669 C17.103,30.6669 16.7397,30.6543 15.6021,30.6025 C14.4668,30.5505 13.6914,30.3707 13.0127,30.1069 C12.3115,29.8345 11.7163,29.4691 11.1235,28.8759 C10.5308,28.283 10.166,27.6877 9.89355,26.9862 C9.62988,26.308 9.4502,25.5328 9.39795,24.3973 C9.34619,23.2595 9.3335,22.8971 9.3335,20.0001 C9.3335,17.1033 9.34668,16.7395 9.39795,15.6017 C9.44873,14.4666 9.62891,13.6912 9.89307,13.0127 C10.1665,12.3114 10.5312,11.7163 11.1245,11.1234 C11.7173,10.5303 12.3125,10.1658 13.0142,9.89343 C13.6924,9.62964 14.4673,9.44983 15.603,9.39783 Z"/>
                <path d="M7.7876,1.2868e-05 L8.74463,1.2868e-05 C11.5928,1.2868e-05 11.9302,0.0102668 13.0547,0.0612922 C14.0947,0.1089 14.6592,0.282606 15.0352,0.428724 C15.5332,0.621961 15.8882,0.853162 16.2612,1.22645 C16.6343,1.59974 16.8657,1.95534 17.0591,2.45314 C17.2051,2.82875 17.3794,3.3932 17.4268,4.43312 C17.4775,5.55763 17.4888,5.8954 17.4888,8.74208 C17.4888,11.5888 17.4775,11.9265 17.4268,13.051 C17.3789,14.0911 17.2051,14.6555 17.0591,15.031 C16.8657,15.5288 16.6343,15.8833 16.2612,16.2564 C15.8877,16.6298 15.5332,16.8609 15.0352,17.0542 C14.6597,17.2008 14.0947,17.3742 13.0547,17.4218 C11.9302,17.4728 11.5928,17.4839 8.74463,17.4839 C5.89648,17.4839 5.55859,17.4728 4.43408,17.4218 C3.39404,17.3738 2.82959,17.2 2.45361,17.054 C1.95557,16.8606 1.6001,16.6295 1.22705,16.2561 C0.853516,15.8828 0.622559,15.5282 0.428711,15.0302 C0.282715,14.6546 0.108887,14.0901 0.0615234,13.0502 C0.0102539,11.9257 0,11.5879 0,8.73939 C0,5.891 0.0102539,5.55494 0.0615234,4.43043 C0.108887,3.39052 0.282715,2.82606 0.428711,2.44996 C0.62207,1.95228 0.853516,1.59669 1.22705,1.22328 C1.6001,0.849988 1.95557,0.618909 2.45361,0.425062 C2.82959,0.278455 3.39404,0.105115 4.43408,0.0573859 C5.41846,0.0128303 5.7998,-0.000475413 7.7876,1.2868e-05 Z M14.438,1.77113 C13.7314,1.77113 13.1582,2.34376 13.1582,3.05067 C13.1582,3.75734 13.7314,4.3307 14.438,4.3307 C15.145,4.3307 15.7183,3.75734 15.7183,3.05067 C15.7183,2.34401 15.145,1.77064 14.438,1.77113 Z M3.2666,8.74452 C3.2666,5.71937 5.71924,3.26674 8.74463,3.26674 C11.7695,3.26674 14.2212,5.71937 14.2212,8.74452 C14.2212,11.7697 11.7695,14.2213 8.74463,14.2213 C5.71924,14.2213 3.2666,11.7697 3.2666,8.74452 Z" transform="translate(11.26 11.26)"/>
                <path stroke="#FFF" stroke-width="2" d="M4.55499342,0 C7.07049549,0 9.10999966,2.03920952 9.10999966,4.55499342 C9.10999966,7.07049549 7.07049549,9.10999966 4.55499342,9.10999966 C2.03920952,9.10999966 0,7.07049549 0,4.55499342 C0,2.03920952 2.03920952,2.02282451e-15 4.55499342,2.02282451e-15 L4.55499342,0 Z" transform="translate(15.45 15.44)"/>
              </svg>

              <svg xmlns="http://www.w3.org/2000/svg" class="pinterest icon" width="40" height="40" viewBox="0 0 40 40" fill="#BDBDBD">
                <path d="M0,19.9989 C0,31.0437 8.95264,40 20,40 C31.0454,40 40,31.0437 40,19.9989 C40,8.9541 31.0454,0 20,0 C8.95264,0 0,8.9541 0,19.9989 Z M13.3696,36.8771 C6.62793,34.2357 1.85059,27.6766 1.85059,19.9991 C1.85059,9.98682 9.96533,1.87463 19.9761,1.87463 C29.9868,1.87463 38.1016,9.98682 38.1016,19.9991 C38.1016,30.0094 29.9868,38.1238 19.9761,38.1238 C18.106,38.1238 16.3042,37.8409 14.6099,37.314 C15.3467,36.1101 16.4521,34.1372 16.8613,32.5627 C17.082,31.7145 17.9902,28.255 17.9902,28.255 C18.5815,29.3817 20.3081,30.3372 22.146,30.3372 C27.6108,30.3372 31.5508,25.3096 31.5508,19.0631 C31.5508,13.0758 26.6641,8.59448 20.3765,8.59448 C12.5552,8.59448 8.40137,13.847 8.40137,19.5643 C8.40137,22.2206 9.81543,25.5323 12.0776,26.5862 C12.4224,26.7448 12.6069,26.6741 12.686,26.342 L12.8516,25.6682 C12.9653,25.2057 13.1074,24.6292 13.1895,24.2877 C13.2324,24.1035 13.2109,23.9471 13.063,23.7672 C12.3135,22.8589 11.7158,21.1881 11.7158,19.6307 C11.7158,15.6335 14.7427,11.7649 19.8989,11.7649 C24.3525,11.7649 27.4697,14.7981 27.4697,19.1381 C27.4697,24.0414 24.9932,27.4388 21.7715,27.4388 C19.9932,27.4388 18.6606,25.9694 19.0869,24.1635 C19.272,23.3851 19.519,22.5848 19.7598,21.8065 C20.1851,20.4301 20.5889,19.1227 20.5889,18.1292 C20.5889,16.7367 19.8413,15.5757 18.2964,15.5757 C16.4756,15.5757 15.0166,17.4564 15.0166,19.9778 C15.0166,21.5823 15.5586,22.6683 15.5586,22.6683 C15.5586,22.6683 13.7612,30.2621 13.4336,31.6759 C13.0693,33.244 13.2109,35.444 13.3696,36.8771 Z"/>
              </svg>

              <svg xmlns="http://www.w3.org/2000/svg" class="youtube icon" width="40" height="40" viewBox="0 0 40 40" fill="#BDBDBD">
                <path d="M20,0 C8.9541,0 0,8.95435 0,20 C0,31.0457 8.9541,40 20,40 C31.0459,40 40,31.0457 40,20 C40,8.95435 31.0459,0 20,0 Z M28.335,13.1244 C29.2529,13.3763 29.9756,14.1185 30.2212,15.061 C30.667,16.7692 30.667,20.3333 30.667,20.3333 C30.667,20.3333 30.667,23.8973 30.2212,25.6056 C29.9756,26.5481 29.2529,27.2903 28.335,27.5424 C26.6714,28 20,28 20,28 C20,28 13.3291,28 11.6655,27.5424 C10.7476,27.2903 10.0244,26.5481 9.7793,25.6056 C9.3335,23.8973 9.3335,20.3333 9.3335,20.3333 C9.3335,20.3333 9.3335,16.7692 9.7793,15.061 C10.0244,14.1185 10.7476,13.3763 11.6655,13.1244 C13.3291,12.6666 20,12.6666 20,12.6666 C20,12.6666 26.6714,12.6666 28.335,13.1244 Z"/>
                <polygon points="0 6.667 0 0 5.333 3.333" transform="translate(18 17.33)"/>
              </svg>

          United States (US)

<router-link class="c-lightgray-secondary mr10 underline" to="/legal" exact>Legal notice</router-link>

<router-link class="c-lightgray-secondary underline" to="/privacy" exact>Privacy policy</router-link>

</template>

<template>

    <newsletter class=" flex brdr-bottom brdr-c-alto" v-if="!isCheckout" />

Departments

                <router-link class="c-gray-secondary" to="/c/women-20" exact>Women fashion</router-link>

                <router-link class="c-gray-secondary" to="/c/men-11" exact>Men's fashion</router-link>

                <router-link class="c-gray-secondary" to="/" exact>Kidswear</router-link>

                <router-link class="c-gray-secondary" to="/" exact>Home</router-link>

Orders

                <router-link class="c-gray-secondary" to="/order-tracking" exact>Track my order</router-link>

                <router-link class="c-gray-secondary" to="/my-account" exact>My account</router-link>

                <router-link class="c-gray-secondary" to="/delivery" exact>Delivery</router-link>

                <router-link class="c-gray-secondary" to="/returns" exact>Return policy</router-link>

Help

                <router-link class="c-gray-secondary" to="/customer-service" exact>Customer service</router-link>

                <router-link class="c-gray-secondary" to="/size-guide" exact>Size guide</router-link>

                <router-link class="c-gray-secondary" to="/contact" exact>Contact us</router-link>

About us

                <router-link class="c-gray-secondary" to="/about-us" exact>About us</router-link>

                <router-link class="c-gray-secondary" to="/store-locator" exact>Store locator</router-link>

              <svg xmlns="http://www.w3.org/2000/svg" class="facebook icon" width="40" height="40" viewBox="0 0 40 40" fill="#BDBDBD">
                <path d="M20,0 C8.9541,0 0,8.95435 0,20 C0,31.0457 8.9541,40 20,40 C31.0459,40 40,31.0457 40,20 C40,8.95435 31.0459,0 20,0 Z M22.085,20.8785 L22.085,31.7595 L17.5825,31.7595 L17.5825,20.8789 L15.3335,20.8789 L15.3335,17.1293 L17.5825,17.1293 L17.5825,14.8779 C17.5825,11.819 18.8525,10 22.4609,10 L25.4653,10 L25.4653,13.7501 L23.5874,13.7501 C22.1826,13.7501 22.0898,14.2742 22.0898,15.2521 L22.085,17.1288 L25.4863,17.1288 L25.0884,20.8785 L22.085,20.8785 Z"/>
              </svg>

              <svg xmlns="http://www.w3.org/2000/svg" class="instagram icon" width="40" height="40" viewBox="0 0 40 40" fill="#BDBDBD">
                <path d="M20,0 C8.9541,0 0,8.95435 0,20 C0,31.0457 8.9541,40 20,40 C31.0459,40 40,31.0457 40,20 C40,8.95435 31.0459,0 20,0 Z M15.603,9.39783 C16.7407,9.34607 17.104,9.33337 20.001,9.33337 C22.8955,9.33337 23.2578,9.34607 24.3955,9.39783 C25.5312,9.44983 26.3066,9.62964 26.9868,9.89343 C27.689,10.1656 28.2822,10.53 28.8755,11.1234 C29.4692,11.7163 29.8335,12.3114 30.1069,13.0129 C30.3691,13.6912 30.5488,14.4663 30.6025,15.6019 C30.6533,16.7396 30.667,17.1033 30.667,20.0001 C30.667,22.8971 30.6533,23.2598 30.6025,24.3976 C30.5488,25.5327 30.3691,26.308 30.1069,26.9865 C29.8335,27.6877 29.4692,28.283 28.8755,28.8759 C28.2832,29.4691 27.689,29.8345 26.9873,30.1069 C26.3086,30.3707 25.5327,30.5505 24.397,30.6025 C23.2593,30.6543 22.897,30.6669 20,30.6669 C17.103,30.6669 16.7397,30.6543 15.6021,30.6025 C14.4668,30.5505 13.6914,30.3707 13.0127,30.1069 C12.3115,29.8345 11.7163,29.4691 11.1235,28.8759 C10.5308,28.283 10.166,27.6877 9.89355,26.9862 C9.62988,26.308 9.4502,25.5328 9.39795,24.3973 C9.34619,23.2595 9.3335,22.8971 9.3335,20.0001 C9.3335,17.1033 9.34668,16.7395 9.39795,15.6017 C9.44873,14.4666 9.62891,13.6912 9.89307,13.0127 C10.1665,12.3114 10.5312,11.7163 11.1245,11.1234 C11.7173,10.5303 12.3125,10.1658 13.0142,9.89343 C13.6924,9.62964 14.4673,9.44983 15.603,9.39783 Z"/>
                <path d="M7.7876,1.2868e-05 L8.74463,1.2868e-05 C11.5928,1.2868e-05 11.9302,0.0102668 13.0547,0.0612922 C14.0947,0.1089 14.6592,0.282606 15.0352,0.428724 C15.5332,0.621961 15.8882,0.853162 16.2612,1.22645 C16.6343,1.59974 16.8657,1.95534 17.0591,2.45314 C17.2051,2.82875 17.3794,3.3932 17.4268,4.43312 C17.4775,5.55763 17.4888,5.8954 17.4888,8.74208 C17.4888,11.5888 17.4775,11.9265 17.4268,13.051 C17.3789,14.0911 17.2051,14.6555 17.0591,15.031 C16.8657,15.5288 16.6343,15.8833 16.2612,16.2564 C15.8877,16.6298 15.5332,16.8609 15.0352,17.0542 C14.6597,17.2008 14.0947,17.3742 13.0547,17.4218 C11.9302,17.4728 11.5928,17.4839 8.74463,17.4839 C5.89648,17.4839 5.55859,17.4728 4.43408,17.4218 C3.39404,17.3738 2.82959,17.2 2.45361,17.054 C1.95557,16.8606 1.6001,16.6295 1.22705,16.2561 C0.853516,15.8828 0.622559,15.5282 0.428711,15.0302 C0.282715,14.6546 0.108887,14.0901 0.0615234,13.0502 C0.0102539,11.9257 0,11.5879 0,8.73939 C0,5.891 0.0102539,5.55494 0.0615234,4.43043 C0.108887,3.39052 0.282715,2.82606 0.428711,2.44996 C0.62207,1.95228 0.853516,1.59669 1.22705,1.22328 C1.6001,0.849988 1.95557,0.618909 2.45361,0.425062 C2.82959,0.278455 3.39404,0.105115 4.43408,0.0573859 C5.41846,0.0128303 5.7998,-0.000475413 7.7876,1.2868e-05 Z M14.438,1.77113 C13.7314,1.77113 13.1582,2.34376 13.1582,3.05067 C13.1582,3.75734 13.7314,4.3307 14.438,4.3307 C15.145,4.3307 15.7183,3.75734 15.7183,3.05067 C15.7183,2.34401 15.145,1.77064 14.438,1.77113 Z M3.2666,8.74452 C3.2666,5.71937 5.71924,3.26674 8.74463,3.26674 C11.7695,3.26674 14.2212,5.71937 14.2212,8.74452 C14.2212,11.7697 11.7695,14.2213 8.74463,14.2213 C5.71924,14.2213 3.2666,11.7697 3.2666,8.74452 Z" transform="translate(11.26 11.26)"/>
                <path stroke="#FFF" stroke-width="2" d="M4.55499342,0 C7.07049549,0 9.10999966,2.03920952 9.10999966,4.55499342 C9.10999966,7.07049549 7.07049549,9.10999966 4.55499342,9.10999966 C2.03920952,9.10999966 0,7.07049549 0,4.55499342 C0,2.03920952 2.03920952,2.02282451e-15 4.55499342,2.02282451e-15 L4.55499342,0 Z" transform="translate(15.45 15.44)"/>
              </svg>

              <svg xmlns="http://www.w3.org/2000/svg" class="pinterest icon" width="40" height="40" viewBox="0 0 40 40" fill="#BDBDBD">
                <path d="M0,19.9989 C0,31.0437 8.95264,40 20,40 C31.0454,40 40,31.0437 40,19.9989 C40,8.9541 31.0454,0 20,0 C8.95264,0 0,8.9541 0,19.9989 Z M13.3696,36.8771 C6.62793,34.2357 1.85059,27.6766 1.85059,19.9991 C1.85059,9.98682 9.96533,1.87463 19.9761,1.87463 C29.9868,1.87463 38.1016,9.98682 38.1016,19.9991 C38.1016,30.0094 29.9868,38.1238 19.9761,38.1238 C18.106,38.1238 16.3042,37.8409 14.6099,37.314 C15.3467,36.1101 16.4521,34.1372 16.8613,32.5627 C17.082,31.7145 17.9902,28.255 17.9902,28.255 C18.5815,29.3817 20.3081,30.3372 22.146,30.3372 C27.6108,30.3372 31.5508,25.3096 31.5508,19.0631 C31.5508,13.0758 26.6641,8.59448 20.3765,8.59448 C12.5552,8.59448 8.40137,13.847 8.40137,19.5643 C8.40137,22.2206 9.81543,25.5323 12.0776,26.5862 C12.4224,26.7448 12.6069,26.6741 12.686,26.342 L12.8516,25.6682 C12.9653,25.2057 13.1074,24.6292 13.1895,24.2877 C13.2324,24.1035 13.2109,23.9471 13.063,23.7672 C12.3135,22.8589 11.7158,21.1881 11.7158,19.6307 C11.7158,15.6335 14.7427,11.7649 19.8989,11.7649 C24.3525,11.7649 27.4697,14.7981 27.4697,19.1381 C27.4697,24.0414 24.9932,27.4388 21.7715,27.4388 C19.9932,27.4388 18.6606,25.9694 19.0869,24.1635 C19.272,23.3851 19.519,22.5848 19.7598,21.8065 C20.1851,20.4301 20.5889,19.1227 20.5889,18.1292 C20.5889,16.7367 19.8413,15.5757 18.2964,15.5757 C16.4756,15.5757 15.0166,17.4564 15.0166,19.9778 C15.0166,21.5823 15.5586,22.6683 15.5586,22.6683 C15.5586,22.6683 13.7612,30.2621 13.4336,31.6759 C13.0693,33.244 13.2109,35.444 13.3696,36.8771 Z"/>
              </svg>

              <svg xmlns="http://www.w3.org/2000/svg" class="youtube icon" width="40" height="40" viewBox="0 0 40 40" fill="#BDBDBD">
                <path d="M20,0 C8.9541,0 0,8.95435 0,20 C0,31.0457 8.9541,40 20,40 C31.0459,40 40,31.0457 40,20 C40,8.95435 31.0459,0 20,0 Z M28.335,13.1244 C29.2529,13.3763 29.9756,14.1185 30.2212,15.061 C30.667,16.7692 30.667,20.3333 30.667,20.3333 C30.667,20.3333 30.667,23.8973 30.2212,25.6056 C29.9756,26.5481 29.2529,27.2903 28.335,27.5424 C26.6714,28 20,28 20,28 C20,28 13.3291,28 11.6655,27.5424 C10.7476,27.2903 10.0244,26.5481 9.7793,25.6056 C9.3335,23.8973 9.3335,20.3333 9.3335,20.3333 C9.3335,20.3333 9.3335,16.7692 9.7793,15.061 C10.0244,14.1185 10.7476,13.3763 11.6655,13.1244 C13.3291,12.6666 20,12.6666 20,12.6666 C20,12.6666 26.6714,12.6666 28.335,13.1244 Z"/>
                <polygon points="0 6.667 0 0 5.333 3.333" transform="translate(18 17.33)"/>
              </svg>

          United States (US)

<router-link class="c-lightgray-secondary mr15 underline" to="/legal" exact>Legal notice</router-link>

<router-link class="c-lightgray-secondary underline" to="/privacy" exact>Privacy policy</router-link>

          <router-link class="c-lightgray-secondary underline" to="/legal" exact>Legal notice</router-link>

          <router-link class="c-lightgray-secondary underline" to="/privacy" exact>Privacy policy</router-link>

</template>


Removal of sample data

Removal of sample data

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


Rebase complete.

Rebase complete.

<template>

  <core-base>

    <search-button slot="above" class='search-btn'></search-button>
    <select slot="above" v-model="currentChannel" v-on:change="switchChannel($event)">
      <option v-for="channel in channels" :value="channel.id">{{ channel.name }}</option>
    </select>
    <component slot="content" :is="currentPage"></component>

        <search-widget
          :show-topics="exploreMode">
        </search-widget>

    <router-view></router-view>

  </core-base>

</template>

<template>

  <core-base>

    <search-button slot="above" class='search-btn'></search-button>
    <component slot="content" :is="currentPage"></component>

        <search-widget
          :show-topics="exploreMode">
        </search-widget>

    <select v-model="currentChannel" v-on:change="switchChannel($event)">
        <option v-for="channel in channels" :value="channel.id">
          {{ channel.name }}
        </option>
      </select>

    <router-view></router-view>

  </core-base>

</template>


Add people class

Add people class

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


Add config to props

Add config to props

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


add new tag view

add new tag view

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


settelment

settelment

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


refactor($home-page): updated spacing/sizing of cards

<template lang="pug">
  div#home
    v-jumbotron(
      dark
      gradient="to bottom, #1867c0, #5CBBF6"
      height="auto"
    )
      v-container(fill-height).mt-3.mb-3
        v-layout(
          align-center
          justify-center
          wrap
        )
          img(
            src="/static/vuetify-logo-300.png"
            alt="Logo"
            style="logoStyles"
            height="256px"
            width="256px"
            :class="$vuetify.breakpoint.mdAndUp ? 'mr-5' : 'mb-3'"
          )
          v-flex(:shrink="$vuetify.breakpoint.mdAndUp").text-xs-center.text-md-left
            h1(
              class="mb-4"
              :class="[$vuetify.breakpoint.mdAndUp ? 'display-3' : 'display-1']"
              style="font-weight: 300;"
            )
              div(v-text="$t('Vuetify.Home.materialDesign')")
              div(v-text="$t('Vuetify.Home.componentFramework')")
            v-btn(
              :to="{ name: 'getting-started/QuickStart' }"
              class="primary--text"
              color="white"
              large
              style="min-width: 128px;"
            )
              | {{ $t("Vuetify.Home.getStarted") }}
            v-btn(
              color="white"
              href="https://github.com/vuetifyjs/vuetify"
              large
              outline
              rel="noopener"
              target="_blank"
            )
              v-icon(left) mdi-github-circle
              | Github

      v-container(
        grid-list-xl
        style="max-width: 1280px"
      ).mb-5
        v-layout(row wrap justify-center)
          v-flex(
            d-flex
            xs12 sm6 md4 lg4
            v-for="(feature, i) in features"
            :key="feature.title"
          )
            v-card(
              light
              style="max-width: 375px;"
            ).elevation-24.hide-overflow
              img(
                :src="feature.img"
                width="100%"
              ).mb-2
              v-card-text
                h3(
                  v-text="feature.title"
                  style="font-size: 18px; font-weight: 500;"
                ).mb-3.text-xs-center
                p(v-text="feature.text").text-xs-center.mb-2

    section#sponsors-and-backers.my-5
      v-container
        v-layout
          v-flex(xs12)
            h2(v-text="$t('Vuetify.Home.proudlySponsoredBy')").text-xs-center.headline.mb-3.grey--text
            v-layout(row wrap justify-center align-center)
              template(v-for="(supporter, i) in supporters")
                v-flex(
                  xs12
                  v-if="supporter.break"
                  :key="i"
                )
                a(
                  target="_blank"
                  rel="noopener"
                  class="ma-3"
                  :href="`${supporter.href}?ref=vuetifyjs.com`"
                  :title="supporter.title"
                  :key="i"
                  @click="$ga.event('home sponsor click', 'click', supporter.title)"
                  v-else
                )
                  img(
                    :src="`/static/doc-images/${supporter.src}`"
                    :height="supporter.size || 'auto'"
                    :style="{ maxHeight: `${supporter.size}px` }"
                  )
              v-flex(xs12).text-xs-center.mt-3
                v-btn(
                  :to="{ name: 'getting-started/SponsorsAndBackers' }"
                  color="primary"
                  large
                  outline
                ) {{ $t("Vuetify.Home.becomeSponsor") }}
                  v-icon(right color="primary") chevron_right

    section#checked-features.mb-5
      v-container
        h2.text-xs-center.headline.mb-5.grey--text
          span {{ $t("Vuetify.Home.checkFeaturesTitle") }}
          | {{ $t("Vuetify.Home.checkFeaturesTitleCtd") }}
        v-layout(row wrap justify-center)
          v-flex(
            mx-3
            shrink
          )
            v-layout(
              v-for="(feature, i) in checkFeatures"
              :key="i"
              align-center
            ).my-2
              v-icon(
                color="green"
                size="36px"
              ).mr-3 check
              span.subheading {{ feature }}
          v-flex(
            mx-3
            shrink
          )
            v-layout(
              v-for="(feature, i) in checkFeaturesCtd"
              :key="i"
              align-center
            ).my-2
              v-icon(
                color="green"
                size="36px"
              ).mr-3 check
              span.subheading {{ feature }}

    section#using-vuetify.mb-5
      v-container(grid-list-xl)
        h2.text-xs-center.headline.mb-5.grey--text
          span {{ $t("Vuetify.Home.madeWithVuetify") }}
        v-layout(wrap)
          v-flex(
            v-for="(feature, i) in computedFeatured"
            :key="i"
            xs12
            sm6
            md4
          )
            v-card(
              :href="`${feature.url}?ref=vuetifyjs.com`"
              :img="feature.image"
              height="300px"
              target="_blank"
              rel="noopener"
              @click="$ga.event('home mwvjs click', 'click', feature.title)"
            ).elevation-24
        v-layout(
          justify-center
          pt-3
        )
          a(
            href="https://madewithvuejs.com?ref=vuetifyjs.com"
            target="_blank"
            rel="noopener"
            @click="$ga.event('home mwvjs click', 'click', 'madewithvuejs')"
          )
            img(
              src="/static/doc-images/powered-by-madewithvue-1.svg"
              height="65px"
            )

    v-jumbotron(
      dark
      gradient="to top, #1867c0, #5CBBF6"
      height="auto"
    )
      v-container.mt-4.mb-3
        v-layout(row wrap)
          v-flex(xs12)
            h5.mb-3
              v-layout(align-center justify-center column)
                img(
                  src="/static/v-alt.svg"
                  height="64px"
                  width="64px"
                ).mb-2
                span(v-text="$t('Vuetify.Home.callout')").subheading

        v-layout(justify-center).mb-3
          a(
            v-for="(social, i) in socials"
            :href="social.href"
            :key="i"
            :title="social.title"
            target="_blank"
            rel="noopener"
          ).social.mx-3
            v-icon(v-text="social.icon")

        v-layout(column text-xs-center)
          div Released under the
            a(
              href="https://opensource.org/licenses/MIT"
              rel="noopener"
              style="text-decoration: none;"
              target="_blank"
              v-text="$t('Vuetify.Home.mit')"
            ).body-2.white--text
          div Copyright © 2016-{{ (new Date()).getFullYear() }} Vuetify, LLC
</template>

<script>
  import supporters from '@/assets/supporters'

  // Mixins
  import Message from '@/mixins/message'

  // Utilities
  import { mapMutations } from 'vuex'

  export default {
    name: 'HomePage',

    mixins: [Message],

    data: () => ({
      diamond: supporters.diamond,
      featured: [],
      palladium: supporters.palladium,
      socials: [
        {
          icon: 'mdi-reddit',
          href: 'https://www.reddit.com/r/vuetifyjs',
          title: 'Reddit'
        },
        {
          icon: 'mdi-medium',
          href: 'https://medium.com/vuetify',
          title: 'Medium'
        },
        {
          icon: 'mdi-github-circle',
          href: 'https://github.com/vuetifyjs/vuetify',
          title: 'Github'
        },
        {
          icon: 'mdi-twitter',
          href: 'https://twitter.com/vuetifyjs',
          title: 'Twitter'
        },
        {
          icon: 'mdi-facebook',
          href: 'https://www.facebook.com/vuetifyjs',
          title: 'Facebook'
        }
      ]
    }),

    computed: {
      checkFeatures () {
        return this.$t('Vuetify.Home.checkFeatures')
      },
      checkFeaturesCtd () {
        return this.$t('Vuetify.Home.checkFeaturesCtd')
      },
      computedFeatured () {
        return this.featured.slice(0, 6)
      },
      features () {
        return this.$t('Vuetify.Home.features').reverse()
      },
      letterFromAuthor () {
        return this.$t('Vuetify.Home.letterFromAuthor')
      },
      supporters () {
        const supporters = [...this.diamond, ...this.palladium]

        const end = { break: true }

        supporters.splice(2, 0, end)

        return supporters
      }
    },

    mounted () {
      this.snackbar({
        color: '',
        msg: 'Vuetify is now on Reddit!',
        href: 'https://www.reddit.com/r/vuetifyjs/',
        text: 'Check it out',
        timeout: 10
      })

      this.$http({
        method: 'GET',
        url: 'https://madewithvuejs.com/api/tag/vuetify',
        headers: {
          'Access-Control-Allow-Origin': '*',
          'Content-Type': 'application/json'
        }
      })
      .then(res => {
        this.featured = this.setFeatured(res.data)
      })
      .catch(err => console.log(err))
    },

    methods: {
      ...mapMutations('app', {
        snackbar: 'SNACKBAR'
      }),
      setFeatured (data) {
        if (!data) return []

        const featured = data.data.map(f => {
          f.hover = false

          return f
        })

        return this.shuffle(featured)
      },
      shuffle (array) {
        let currentIndex = array.length
        let temporaryValue
        let randomIndex

        // While there remain elements to shuffle...
        while (currentIndex !== 0) {
          // Pick a remaining element...
          randomIndex = Math.floor(Math.random() * currentIndex)
          currentIndex -= 1

          // And swap it with the current element.
          temporaryValue = array[currentIndex]
          array[currentIndex] = array[randomIndex]
          array[randomIndex] = temporaryValue
        }

        return array
      },
      snackHandler () {
        this.$router.push({ name: 'store/Index' })
      }
    }
  }
</script>

<style lang="stylus" scoped>
  .social
    text-decoration: none
</style>

<template lang="pug">
  div#home
    v-jumbotron(
      dark
      gradient="to bottom, #1867c0, #5CBBF6"
      height="auto"
    )
      v-container(fill-height).mt-5.mb-3
        v-layout(
          align-center
          justify-center
          wrap
        )
          img(
            src="/static/vuetify-logo-300.png"
            alt="Logo"
            style="logoStyles"
            height="256px"
            width="256px"
            :class="$vuetify.breakpoint.mdAndUp ? 'mr-5' : 'mb-3'"
          )
          v-flex(:xs12="$vuetify.breakpoint.smAndDown").text-xs-center.text-md-left
            h1(
              class="mb-4"
              :class="[$vuetify.breakpoint.mdAndUp ? 'display-3' : 'display-1']"
              style="font-weight: 300;"
            )
              div(v-text="$t('Vuetify.Home.materialDesign')")
              div(v-text="$t('Vuetify.Home.componentFramework')")
            v-btn(
              :to="{ name: 'getting-started/QuickStart' }"
              class="primary--text"
              color="white"
              large
              style="min-width: 128px;"
            )
              | {{ $t("Vuetify.Home.getStarted") }}
            v-btn(
              color="white"
              href="https://github.com/vuetifyjs/vuetify"
              large
              outline
              rel="noopener"
              target="_blank"
            )
              v-icon(left) mdi-github-circle
              | Github

      v-container(grid-list-xl).mb-5
        v-layout(row wrap justify-center)
          v-flex(
            xs12 sm6 md4 lg4
            v-for="(feature, i) in features"
            :key="feature.title"
          )
            v-card(light).elevation-24.hide-overflow
              img(
                :src="feature.img"
                width="100%"
              ).mb-3
              v-card-text
                h3(
                  v-text="feature.title"
                  style="font-size: 18px; font-weight: 500;"
                ).mb-3.text-xs-center
                p(v-text="feature.text").text-xs-center

    section#sponsors-and-backers.my-5
      v-container
        v-layout
          v-flex(xs12)
            h2(v-text="$t('Vuetify.Home.proudlySponsoredBy')").text-xs-center.headline.mb-3.grey--text
            v-layout(row wrap justify-center align-center)
              template(v-for="(supporter, i) in supporters")
                v-flex(
                  xs12
                  v-if="supporter.break"
                  :key="i"
                )
                a(
                  target="_blank"
                  rel="noopener"
                  class="ma-3"
                  :href="`${supporter.href}?ref=vuetifyjs.com`"
                  :title="supporter.title"
                  :key="i"
                  @click="$ga.event('home sponsor click', 'click', supporter.title)"
                  v-else
                )
                  img(
                    :src="`/static/doc-images/${supporter.src}`"
                    :height="supporter.size || 'auto'"
                    :style="{ maxHeight: `${supporter.size}px` }"
                  )
              v-flex(xs12).text-xs-center.mt-3
                v-btn(
                  :to="{ name: 'getting-started/SponsorsAndBackers' }"
                  color="primary"
                  large
                  outline
                ) {{ $t("Vuetify.Home.becomeSponsor") }}
                  v-icon(right color="primary") chevron_right

    section#checked-features.mb-5
      v-container
        h2.text-xs-center.headline.mb-5.grey--text
          span {{ $t("Vuetify.Home.checkFeaturesTitle") }}
          | {{ $t("Vuetify.Home.checkFeaturesTitleCtd") }}
        v-layout(row wrap justify-center)
          v-flex(
            mx-3
            shrink
          )
            v-layout(
              v-for="(feature, i) in checkFeatures"
              :key="i"
              align-center
            ).my-2
              v-icon(
                color="green"
                size="36px"
              ).mr-3 check
              span.subheading {{ feature }}
          v-flex(
            mx-3
            shrink
          )
            v-layout(
              v-for="(feature, i) in checkFeaturesCtd"
              :key="i"
              align-center
            ).my-2
              v-icon(
                color="green"
                size="36px"
              ).mr-3 check
              span.subheading {{ feature }}

    section#using-vuetify.mb-5
      v-container(grid-list-xl)
        h2.text-xs-center.headline.mb-5.grey--text
          span {{ $t("Vuetify.Home.madeWithVuetify") }}
        v-layout(wrap)
          v-flex(
            v-for="(feature, i) in computedFeatured"
            :key="i"
            xs12
            sm6
            md4
          )
            v-card(
              :href="`${feature.url}?ref=vuetifyjs.com`"
              :img="feature.image"
              height="300px"
              target="_blank"
              rel="noopener"
              @click="$ga.event('home mwvjs click', 'click', feature.title)"
            ).elevation-24
        v-layout(
          justify-center
          pt-3
        )
          a(
            href="https://madewithvuejs.com?ref=vuetifyjs.com"
            target="_blank"
            rel="noopener"
            @click="$ga.event('home mwvjs click', 'click', 'madewithvuejs')"
          )
            img(
              src="/static/doc-images/powered-by-madewithvue-1.svg"
              height="65px"
            )

    v-jumbotron(
      dark
      gradient="to top, #1867c0, #5CBBF6"
      height="auto"
    )
      v-container.mt-4.mb-3
        v-layout(row wrap)
          v-flex(xs12)
            h5.mb-3
              v-layout(align-center justify-center column)
                img(
                  src="/static/v-alt.svg"
                  height="64px"
                  width="64px"
                ).mb-2
                span(v-text="$t('Vuetify.Home.callout')").subheading

        v-layout(justify-center).mb-3
          a(
            v-for="(social, i) in socials"
            :href="social.href"
            :key="i"
            :title="social.title"
            target="_blank"
            rel="noopener"
          ).social.mx-3
            v-icon(v-text="social.icon")

        v-layout(column text-xs-center)
          div Released under the
            a(
              href="https://opensource.org/licenses/MIT"
              rel="noopener"
              style="text-decoration: none;"
              target="_blank"
              v-text="$t('Vuetify.Home.mit')"
            ).body-2.white--text
          div Copyright © 2016-{{ (new Date()).getFullYear() }} Vuetify, LLC
</template>

<script>
  import supporters from '@/assets/supporters'

  // Mixins
  import Message from '@/mixins/message'

  // Utilities
  import { mapMutations } from 'vuex'

  export default {
    name: 'HomePage',

    mixins: [Message],

    data: () => ({
      diamond: supporters.diamond,
      featured: [],
      palladium: supporters.palladium,
      socials: [
        {
          icon: 'mdi-reddit',
          href: 'https://www.reddit.com/r/vuetifyjs',
          title: 'Reddit'
        },
        {
          icon: 'mdi-medium',
          href: 'https://medium.com/vuetify',
          title: 'Medium'
        },
        {
          icon: 'mdi-github-circle',
          href: 'https://github.com/vuetifyjs/vuetify',
          title: 'Github'
        },
        {
          icon: 'mdi-twitter',
          href: 'https://twitter.com/vuetifyjs',
          title: 'Twitter'
        },
        {
          icon: 'mdi-facebook',
          href: 'https://www.facebook.com/vuetifyjs',
          title: 'Facebook'
        }
      ]
    }),

    computed: {
      checkFeatures () {
        return this.$t('Vuetify.Home.checkFeatures')
      },
      checkFeaturesCtd () {
        return this.$t('Vuetify.Home.checkFeaturesCtd')
      },
      computedFeatured () {
        return this.featured.slice(0, 6)
      },
      features () {
        return this.$t('Vuetify.Home.features').reverse()
      },
      letterFromAuthor () {
        return this.$t('Vuetify.Home.letterFromAuthor')
      },
      supporters () {
        const supporters = [...this.diamond, ...this.palladium]

        const end = { break: true }

        supporters.splice(2, 0, end)

        return supporters
      }
    },

    mounted () {
      this.snackbar({
        color: '',
        msg: 'Vuetify is now on Reddit!',
        href: 'https://www.reddit.com/r/vuetifyjs/',
        text: 'Check it out',
        timeout: 10
      })

      this.$http({
        method: 'GET',
        url: 'https://madewithvuejs.com/api/tag/vuetify',
        headers: {
          'Access-Control-Allow-Origin': '*',
          'Content-Type': 'application/json'
        }
      })
      .then(res => {
        this.featured = this.setFeatured(res.data)
      })
      .catch(err => console.log(err))
    },

    methods: {
      ...mapMutations('app', {
        snackbar: 'SNACKBAR'
      }),
      setFeatured (data) {
        if (!data) return []

        const featured = data.data.map(f => {
          f.hover = false

          return f
        })

        return this.shuffle(featured)
      },
      shuffle (array) {
        let currentIndex = array.length
        let temporaryValue
        let randomIndex

        // While there remain elements to shuffle...
        while (currentIndex !== 0) {
          // Pick a remaining element...
          randomIndex = Math.floor(Math.random() * currentIndex)
          currentIndex -= 1

          // And swap it with the current element.
          temporaryValue = array[currentIndex]
          array[currentIndex] = array[randomIndex]
          array[randomIndex] = temporaryValue
        }

        return array
      },
      snackHandler () {
        this.$router.push({ name: 'store/Index' })
      }
    }
  }
</script>

<style lang="stylus" scoped>
  .social
    text-decoration: none
</style>


Fix ide-tree-header button background

Fix ide-tree-header button background

<script>
import Icon from '~/vue_shared/components/icon.vue';

export default {
  components: {
    Icon,
  },
  props: {
    label: {
      type: String,
      required: false,
      default: null,
    },
    icon: {
      type: String,
      required: true,
    },
    iconClasses: {
      type: String,
      required: false,
      default: null,
    },
    showLabel: {
      type: Boolean,
      required: false,
      default: true,
    },
  },
  methods: {
    clicked() {
      this.$emit('click');
    },
  },
};
</script>

<template>
  <button
    :aria-label="label"
    type="button"
    class="btn-blank"
    @click.stop.prevent="clicked"
  >
    <icon
      :name="icon"
      :css-classes="iconClasses"
    />
    <template v-if="showLabel">
      {{ label }}
    </template>
  </button>
</template>

<script>
import Icon from '~/vue_shared/components/icon.vue';

export default {
  components: {
    Icon,
  },
  props: {
    label: {
      type: String,
      required: false,
      default: null,
    },
    icon: {
      type: String,
      required: true,
    },
    iconClasses: {
      type: String,
      required: false,
      default: null,
    },
    showLabel: {
      type: Boolean,
      required: false,
      default: true,
    },
  },
  methods: {
    clicked() {
      this.$emit('click');
    },
  },
};
</script>

<template>
  <button
    :aria-label="label"
    type="button"
    @click.stop.prevent="clicked"
  >
    <icon
      :name="icon"
      :css-classes="iconClasses"
    />
    <template v-if="showLabel">
      {{ label }}
    </template>
  </button>
</template>


add email and telephone validation

add email and telephone validation

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


add items fetch handle code

add items fetch handle code

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


Add missing file to delete user functionality

<template>
    <app-dialog
            ref="dialogBox"
            :title="`Delete ${subjectType}`">
        <template>
                Are you sure you want to permanently delete {{subjectType}} {{subjectName}}?
        </template>
        <template #actions>
            <button
                    type="button"
                    class="mdl-button"
                    @click="remove">
                OK
            </button>
            <button
                    type="button"
                    class="mdl-button"
                    @click="hide">
                Cancel
            </button>
        </template>
    </app-dialog>
</template>

<script>
import userService from '@/service/user'
import groupService from '@/service/user'

export default {
    name: "DialogDeleteSubject",
    data() {
        return {
            subject: null
        }
    },
    computed: {
        subjectType() {
            return !this.subject || this.subject.login ? 'user' : 'group'
        },
        subjectName() {
            return this.subject && (this.subject.login ? this.subject.login : this.subject.name)
        }
    },
    methods: {
        setSubject(value) {
            this.subject = value
        },
        show(subject) {
            if (subject) {
                this.setSubject(subject)
            }
            this.$refs.dialogBox.show()
        },
        hide() {
            this.$refs.dialogBox.hide()
        },
        remove() {
            let service = this.subject.login ? userService : groupService
            service.remove(this.subject.id)
            this.$emit('change')
            this.hide()
        }
    }
}
</script>

error: pathspec 'solutions.digamma.damas.ui/src/components/admin/dialog-delete-subject.vue' did not match any file(s) known to git


fix(MdSelect): add missing `this` for calling isLocalValueSet function

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

    <keep-alive>
      <md-menu-content
        ref="menu"
        class="md-select-menu"
        :md-content-class="mdClass"
        :style="menuStyles"
        @enter="onMenuEnter">
        <slot v-if="showSelect" />
      </md-menu-content>
    </keep-alive>

    <div v-if="!showSelect" v-show="false">
      <slot />
    </div>

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

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

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

  export default {
    name: 'MdSelect',
    components: {
      MdInput,
      MdMenu,
      MdMenuContent,
      MdDropDownIcon
    },
    mixins: [MdFieldMixin],
    props: {
      mdDense: Boolean,
      mdClass: String,
      multiple: Boolean,
      id: String,
      name: String
    },
    inject: ['MdField'],
    data () {
      return {
        menuStyles: {},
        offset: {
          x: defaultOffset.x,
          y: 0
        },
        showSelect: true,
        didMount: false,
        MdSelect: {
          items: {},
          label: null,
          multiple: false,
          modelValue: this.localValue,
          setValue: this.setValue,
          setContent: this.setContent,
          setMultipleValue: this.setMultipleValue,
          setMultipleContent: this.setMultipleContent
        }
      }
    },
    provide () {
      const MdSelect = this.MdSelect

      return { MdSelect }
    },
    computed: {
      attrs () {
        return {
          ...this.$attrs,
          name: this.name,
          id: this.id
        }
      },
      inputListeners () {
        return {
          ...this.$listeners,
          input: undefined
        }
      }
    },
    watch: {
      localValue: {
        immediate: true,
        handler (val) {
          this.setFieldContent()
          this.MdSelect.modelValue = this.localValue
          this.emitSelected(val)
        }
      },
      multiple: {
        immediate: true,
        handler (isMultiple) {
          this.MdSelect.multiple = isMultiple
          this.$nextTick(this.initialLocalValueByDefault)
        }
      }
    },
    methods: {
      elHasScroll (el) {
        return el.scrollHeight > el.offsetHeight
      },
      scrollToSelectedOption (el, menu) {
        const top = el.offsetTop
        const elHeight = el.offsetHeight
        const menuHeight = menu.offsetHeight

        menu.scrollTop = top - ((menuHeight - elHeight) / 2)
      },
      setOffsets (target) {
        if (!this.$isServer) {
          const menu = this.$refs.menu.$refs.container

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

            if (selected) {
              this.scrollToSelectedOption(selected, menu)
              this.offset.y = defaultOffset.y - selected.offsetTop + menu.scrollTop + 8
              this.menuStyles = {
                'transform-origin': `0 ${Math.abs(this.offset.y)}px`
              }
            } else {
              this.offset.y = defaultOffset.y + 1
              this.menuStyles = {}
            }
          }
        }
      },
      onMenuEnter () {
        if (!this.didMount) {
          return
        }

        this.setOffsets()
        this.MdField.focused = true
        this.$emit('md-opened')
      },
      applyHighlight () {
        this.MdField.focused = false
        this.MdField.highlighted = true
        this.$refs.input.$el.focus()
      },
      onClose () {
        this.$emit('md-closed')
        if (this.didMount) {
          this.applyHighlight()
        }
      },
      onFocus () {
        if (this.didMount) {
          this.applyHighlight()
        }
      },
      removeHighlight () {
        this.MdField.highlighted = false
      },
      openSelect () {
        if (!this.disabled) {
          this.showSelect = true
        }
      },
      arrayAccessorRemove (arr, index) {
        let before = arr.slice(0, index)
        let after = arr.slice(index + 1, arr.length)
        return before.concat(after)
      },
      toggleArrayValue (value) {
        let index = this.localValue.indexOf(value)
        let includes = index > -1
        if (!includes) {
          this.localValue = this.localValue.concat([value])
        } else {
          this.localValue = this.arrayAccessorRemove(this.localValue, index)
        }
      },
      setValue (newValue) {
        this.model = newValue
        this.setFieldValue()
        this.showSelect = false
      },
      setContent (newLabel) {
        this.MdSelect.label = newLabel
      },
      setContentByValue () {
        const textContent = this.MdSelect.items[this.localValue]

        if (textContent) {
          this.setContent(textContent)
        } else {
          this.setContent('')
        }
      },
      setMultipleValue (value) {
        const newValue = value
        this.toggleArrayValue(newValue)
        this.setFieldValue()
      },
      setMultipleContentByValue () {
        if (!this.localValue) {
          this.initialLocalValueByDefault()
        }

        let content = []

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

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

        this.setContent(content.join(', '))
      },
      setFieldContent () {
        if (this.multiple) {
          this.setMultipleContentByValue()
        } else {
          this.setContentByValue()
        }
      },
      isLocalValueSet () {
        return this.localValue !== undefined && this.localValue !== null
      },
      setLocalValueIfMultiple () {
        if (this.isLocalValueSet()) {
          this.localValue = [this.localValue]
        } else {
          this.localValue = []
        }
      },
      setLocalValueIfNotMultiple () {
        if (this.localValue.length > 0) {
          this.localValue = this.localValue[0]
        } else {
          this.localValue = null
        }
      },
      initialLocalValueByDefault () {
        let isArray = Array.isArray(this.localValue)

        if (this.multiple && !isArray) {
          this.localValue = this.setLocalValueIfMultiple()
        } else if (!this.multiple && isArray) {
          this.localValue = this.setLocalValueIfNotMultiple()
        }
      },
      emitSelected (value) {
        this.$emit('md-selected', value)
      }
    },
    mounted () {
      this.showSelect = false
      this.setFieldContent()

      this.$nextTick().then(() => {
        this.didMount = true
      })
    },
    updated () {
      this.setFieldContent()
    }
  }
</script>

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

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

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

    .md-input {
      flex: 1;
      min-width: 0;
    }

    select,
    .md-input-fake {
      width: 1px;
      height: 1px;
      margin: -1px;
      padding: 0;
      overflow: hidden;
      position: absolute;
      clip: rect(0 0 0 0);
      border: 0;
    }
  }
  .md-menu-content.md-select-menu {
    z-index: 111;
    width: 100%;

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

    .md-list {
      transition: opacity .3s $md-transition-drop-timing;
    }
  }
</style>

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

    <keep-alive>
      <md-menu-content
        ref="menu"
        class="md-select-menu"
        :md-content-class="mdClass"
        :style="menuStyles"
        @enter="onMenuEnter">
        <slot v-if="showSelect" />
      </md-menu-content>
    </keep-alive>

    <div v-if="!showSelect" v-show="false">
      <slot />
    </div>

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

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

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

  export default {
    name: 'MdSelect',
    components: {
      MdInput,
      MdMenu,
      MdMenuContent,
      MdDropDownIcon
    },
    mixins: [MdFieldMixin],
    props: {
      mdDense: Boolean,
      mdClass: String,
      multiple: Boolean,
      id: String,
      name: String
    },
    inject: ['MdField'],
    data () {
      return {
        menuStyles: {},
        offset: {
          x: defaultOffset.x,
          y: 0
        },
        showSelect: true,
        didMount: false,
        MdSelect: {
          items: {},
          label: null,
          multiple: false,
          modelValue: this.localValue,
          setValue: this.setValue,
          setContent: this.setContent,
          setMultipleValue: this.setMultipleValue,
          setMultipleContent: this.setMultipleContent
        }
      }
    },
    provide () {
      const MdSelect = this.MdSelect

      return { MdSelect }
    },
    computed: {
      attrs () {
        return {
          ...this.$attrs,
          name: this.name,
          id: this.id
        }
      },
      inputListeners () {
        return {
          ...this.$listeners,
          input: undefined
        }
      }
    },
    watch: {
      localValue: {
        immediate: true,
        handler (val) {
          this.setFieldContent()
          this.MdSelect.modelValue = this.localValue
          this.emitSelected(val)
        }
      },
      multiple: {
        immediate: true,
        handler (isMultiple) {
          this.MdSelect.multiple = isMultiple
          this.$nextTick(this.initialLocalValueByDefault)
        }
      }
    },
    methods: {
      elHasScroll (el) {
        return el.scrollHeight > el.offsetHeight
      },
      scrollToSelectedOption (el, menu) {
        const top = el.offsetTop
        const elHeight = el.offsetHeight
        const menuHeight = menu.offsetHeight

        menu.scrollTop = top - ((menuHeight - elHeight) / 2)
      },
      setOffsets (target) {
        if (!this.$isServer) {
          const menu = this.$refs.menu.$refs.container

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

            if (selected) {
              this.scrollToSelectedOption(selected, menu)
              this.offset.y = defaultOffset.y - selected.offsetTop + menu.scrollTop + 8
              this.menuStyles = {
                'transform-origin': `0 ${Math.abs(this.offset.y)}px`
              }
            } else {
              this.offset.y = defaultOffset.y + 1
              this.menuStyles = {}
            }
          }
        }
      },
      onMenuEnter () {
        if (!this.didMount) {
          return
        }

        this.setOffsets()
        this.MdField.focused = true
        this.$emit('md-opened')
      },
      applyHighlight () {
        this.MdField.focused = false
        this.MdField.highlighted = true
        this.$refs.input.$el.focus()
      },
      onClose () {
        this.$emit('md-closed')
        if (this.didMount) {
          this.applyHighlight()
        }
      },
      onFocus () {
        if (this.didMount) {
          this.applyHighlight()
        }
      },
      removeHighlight () {
        this.MdField.highlighted = false
      },
      openSelect () {
        if (!this.disabled) {
          this.showSelect = true
        }
      },
      arrayAccessorRemove (arr, index) {
        let before = arr.slice(0, index)
        let after = arr.slice(index + 1, arr.length)
        return before.concat(after)
      },
      toggleArrayValue (value) {
        let index = this.localValue.indexOf(value)
        let includes = index > -1
        if (!includes) {
          this.localValue = this.localValue.concat([value])
        } else {
          this.localValue = this.arrayAccessorRemove(this.localValue, index)
        }
      },
      setValue (newValue) {
        this.model = newValue
        this.setFieldValue()
        this.showSelect = false
      },
      setContent (newLabel) {
        this.MdSelect.label = newLabel
      },
      setContentByValue () {
        const textContent = this.MdSelect.items[this.localValue]

        if (textContent) {
          this.setContent(textContent)
        } else {
          this.setContent('')
        }
      },
      setMultipleValue (value) {
        const newValue = value
        this.toggleArrayValue(newValue)
        this.setFieldValue()
      },
      setMultipleContentByValue () {
        if (!this.localValue) {
          this.initialLocalValueByDefault()
        }

        let content = []

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

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

        this.setContent(content.join(', '))
      },
      setFieldContent () {
        if (this.multiple) {
          this.setMultipleContentByValue()
        } else {
          this.setContentByValue()
        }
      },
      isLocalValueSet () {
        return this.localValue !== undefined && this.localValue !== null
      },
      setLocalValueIfMultiple () {
        if (isLocalValueSet()) {
          this.localValue = [this.localValue]
        } else {
          this.localValue = []
        }
      },
      setLocalValueIfNotMultiple () {
        if (this.localValue.length > 0) {
          this.localValue = this.localValue[0]
        } else {
          this.localValue = null
        }
      },
      initialLocalValueByDefault () {
        let isArray = Array.isArray(this.localValue)

        if (this.multiple && !isArray) {
          this.localValue = this.setLocalValueIfMultiple()
        } else if (!this.multiple && isArray) {
          this.localValue = this.setLocalValueIfNotMultiple()
        }
      },
      emitSelected (value) {
        this.$emit('md-selected', value)
      }
    },
    mounted () {
      this.showSelect = false
      this.setFieldContent()

      this.$nextTick().then(() => {
        this.didMount = true
      })
    },
    updated () {
      this.setFieldContent()
    }
  }
</script>

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

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

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

    .md-input {
      flex: 1;
      min-width: 0;
    }

    select,
    .md-input-fake {
      width: 1px;
      height: 1px;
      margin: -1px;
      padding: 0;
      overflow: hidden;
      position: absolute;
      clip: rect(0 0 0 0);
      border: 0;
    }
  }
  .md-menu-content.md-select-menu {
    z-index: 111;
    width: 100%;

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

    .md-list {
      transition: opacity .3s $md-transition-drop-timing;
    }
  }
</style>


Fixed form not sending correct data

Fixed form not sending correct data

[ci skip]

<script>
/* global Flash */
import Visibility from 'visibilityjs';
import Poll from '../../lib/utils/poll';
import eventHub from '../event_hub';
import Service from '../services/index';
import Store from '../stores';
import titleComponent from './title.vue';
import descriptionComponent from './description.vue';
import editActions from './edit_actions.vue';

export default {
  props: {
    endpoint: {
      required: true,
      type: String,
    },
    canUpdate: {
      required: true,
      type: Boolean,
    },
    canDestroy: {
      required: true,
      type: Boolean,
    },
    issuableRef: {
      type: String,
      required: true,
    },
    initialTitle: {
      type: String,
      required: true,
    },
    initialDescriptionHtml: {
      type: String,
      required: false,
      default: '',
    },
    initialDescriptionText: {
      type: String,
      required: false,
      default: '',
    },
  },
  data() {
    const store = new Store({
      titleHtml: this.initialTitle,
      descriptionHtml: this.initialDescriptionHtml,
      descriptionText: this.initialDescriptionText,
    });

    return {
      store,
      state: store.state,
      showForm: false,
    };
  },
  computed: {
    elementType() {
      return this.showForm ? 'form' : 'div';
    },
  },
  components: {
    descriptionComponent,
    titleComponent,
    editActions,
  },
  methods: {
    openForm() {
      this.showForm = true;
      this.store.formState = {
        title: this.state.titleText,
      };
    },
    closeForm() {
      this.showForm = false;
    },
    updateIssuable() {
      this.service.updateIssuable(this.store.formState)
        .then(() => {
          eventHub.$emit('close.form');
        })
        .catch(() => {
          eventHub.$emit('close.form');
          return new Flash('Error updating issue');
        });
    },
    deleteIssuable() {
      this.service.deleteIssuable()
        .then(res => res.json())
        .then((data) => {
          // Stop the poll so we don't get 404's with the issue not existing
          this.poll.stop();

          gl.utils.visitUrl(data.path);
        })
        .catch(() => {
          eventHub.$emit('close.form');
          return new Flash('Error deleting issue');
        });
    },
  },
  created() {
    this.service = new Service(this.endpoint);
    this.poll = new Poll({
      resource: this.service,
      method: 'getData',
      successCallback: (res) => {
        this.store.updateState(res.json());
      },
      errorCallback(err) {
        throw new Error(err);
      },
    });

    if (!Visibility.hidden()) {
      this.poll.makeRequest();
    }

    Visibility.change(() => {
      if (!Visibility.hidden()) {
        this.poll.restart();
      } else {
        this.poll.stop();
      }
    });

    eventHub.$on('delete.issuable', this.deleteIssuable);
    eventHub.$on('update.issuable', this.updateIssuable);
    eventHub.$on('close.form', this.closeForm);
    eventHub.$on('open.form', this.openForm);
  },
  beforeDestroy() {
    eventHub.$off('delete.issuable', this.deleteIssuable);
    eventHub.$off('update.issuable', this.updateIssuable);
    eventHub.$off('close.form', this.closeForm);
  },
};
</script>

<template>
  <div :is="elementType">
    <title-component
      :store="store"
      :show-form="showForm"
      :issuable-ref="issuableRef"
      :title-html="state.titleHtml"
      :title-text="state.titleText" />
    <description-component
      v-if="state.descriptionHtml"
      :can-update="canUpdate"
      :description-html="state.descriptionHtml"
      :description-text="state.descriptionText"
      :updated-at="state.updatedAt"
      :task-status="state.taskStatus" />
    <edit-actions
      v-if="canUpdate && showForm"
      :can-destroy="canDestroy" />
  </div>
</template>

<script>
/* global Flash */
import Visibility from 'visibilityjs';
import Poll from '../../lib/utils/poll';
import eventHub from '../event_hub';
import Service from '../services/index';
import Store from '../stores';
import titleComponent from './title.vue';
import descriptionComponent from './description.vue';
import editActions from './edit_actions.vue';

export default {
  props: {
    endpoint: {
      required: true,
      type: String,
    },
    canUpdate: {
      required: true,
      type: Boolean,
    },
    canDestroy: {
      required: true,
      type: Boolean,
    },
    issuableRef: {
      type: String,
      required: true,
    },
    initialTitle: {
      type: String,
      required: true,
    },
    initialDescriptionHtml: {
      type: String,
      required: false,
      default: '',
    },
    initialDescriptionText: {
      type: String,
      required: false,
      default: '',
    },
  },
  data() {
    const store = new Store({
      titleHtml: this.initialTitle,
      descriptionHtml: this.initialDescriptionHtml,
      descriptionText: this.initialDescriptionText,
    });

    return {
      store,
      state: store.state,
      formState: store.formState,
      showForm: false,
    };
  },
  computed: {
    elementType() {
      return this.showForm ? 'form' : 'div';
    },
  },
  components: {
    descriptionComponent,
    titleComponent,
    editActions,
  },
  methods: {
    openForm() {
      this.showForm = true;
      this.store.formState = {
        title: this.state.titleText,
      };
    },
    updateIssuable() {
      this.service.updateIssuable(this.formState)
        .then(() => {
          eventHub.$emit('close.form');
        })
        .catch(() => {
          eventHub.$emit('close.form');
          return new Flash('Error updating issue');
        });
    },
    deleteIssuable() {
      this.service.deleteIssuable()
        .then(res => res.json())
        .then((data) => {
          // Stop the poll so we don't get 404's with the issue not existing
          this.poll.stop();

          gl.utils.visitUrl(data.path);
        })
        .catch(() => {
          eventHub.$emit('close.form');
          return new Flash('Error deleting issue');
        });
    },
  },
  created() {
    this.service = new Service(this.endpoint);
    this.poll = new Poll({
      resource: this.service,
      method: 'getData',
      successCallback: (res) => {
        this.store.updateState(res.json());
      },
      errorCallback(err) {
        throw new Error(err);
      },
    });

    if (!Visibility.hidden()) {
      this.poll.makeRequest();
    }

    Visibility.change(() => {
      if (!Visibility.hidden()) {
        this.poll.restart();
      } else {
        this.poll.stop();
      }
    });

    eventHub.$on('delete.issuable', this.deleteIssuable);
    eventHub.$on('update.issuable', this.updateIssuable);
    eventHub.$on('open.form', this.openForm);
  },
  beforeDestroy() {
    eventHub.$off('delete.issuable', this.deleteIssuable);
    eventHub.$off('update.issuable', this.updateIssuable);
    eventHub.$off('open.form', this.openForm);
  },
};
</script>

<template>
  <div :is="elementType">
    <title-component
      :store="store"
      :show-form="showForm"
      :issuable-ref="issuableRef"
      :title-html="state.titleHtml"
      :title-text="state.titleText" />
    <description-component
      v-if="state.descriptionHtml"
      :can-update="canUpdate"
      :description-html="state.descriptionHtml"
      :description-text="state.descriptionText"
      :updated-at="state.updatedAt"
      :task-status="state.taskStatus" />
    <edit-actions
      v-if="canUpdate && showForm"
      :can-destroy="canDestroy" />
  </div>
</template>


alt attribute cleanup

alt attribute cleanup

<template>

        <v-modal v-ref="modal" closed="{{ close }}">
            <form class="uk-form uk-form-stacked" v-on="submit: update">

{{ 'Add Image' | trans }}

                    <input-image source="{{@ image.src }}"></input-image>

                    {{ 'URL' | trans }}

                        <input id="form-src" class="uk-width-1-1" type="text" v-model="image.src">

                    {{ 'Alt' | trans }}

                        <input id="form-alt" class="uk-width-1-1" type="text" v-model="image.alt">

                    <button class="uk-button uk-button-link uk-modal-close" type="button">{{ 'Cancel' | trans }}</button>
                    <button class="uk-button uk-button-link" type="submit">{{ 'Update' | trans }}</button>

            </form>
        </v-modal>

</template>


create

create

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


增加进度按钮组件

增加进度按钮组件

<template>
  <button v-bind="$props" @click="handleClick" :disabled="processing">
    <slot :processing="processing" :stopProcessing="stopProcessing"></slot>
  </button>
</template>

<script>
export default {
  name: 'ui-process-button',
  data: () => ({
    processing: false,
  }),
  methods: {
    handleClick(event) {
      if (this.processing === true) {
        return;
      }

      event.stopProcessing = () => {
        this.stopProcessing();
      };

      this.processing = true;
      this.$emit('click', event);
    },

    stopProcessing() {
      this.processing = false;
    }
  }
}
</script>

error: pathspec 'resources/assets/admin/components/commons/ProcessClickButton.vue' did not match any file(s) known to git


[NOSTORY] Allow script command

[NOSTORY] Allow script command

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


добавляет клирабл к полю с длинной ссылкой

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


Update text.vue

Update text.vue

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