Skip to content
Snippets Groups Projects
environments_folder_view.vue 4.91 KiB
Newer Older
  • Learn to ignore specific revisions
  • Filipa Lacerda's avatar
    Filipa Lacerda committed
    /* global Flash */
    
    import EnvironmentsService from '../services/environments_service';
    
    import environmentTable from '../components/environments_table.vue';
    
    import EnvironmentsStore from '../stores/environments_store';
    
    import loadingIcon from '../../vue_shared/components/loading_icon.vue';
    
    import tablePagination from '../../vue_shared/components/table_pagination.vue';
    
    import '../../lib/utils/common_utils';
    import '../../vue_shared/vue_resource_interceptor';
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
    
    
    export default {
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
      components: {
    
        environmentTable,
        tablePagination,
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
      },
    
      data() {
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
        const environmentsData = document.querySelector('#environments-folder-list-view').dataset;
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
        const store = new EnvironmentsStore();
        const pathname = window.location.pathname;
        const endpoint = `${pathname}.json`;
        const folderName = pathname.substr(pathname.lastIndexOf('/') + 1);
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
    
        return {
          store,
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
          endpoint,
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
          state: store.state,
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
          visibility: 'available',
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
          isLoading: false,
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
          cssContainerClass: environmentsData.cssClass,
          canCreateDeployment: environmentsData.canCreateDeployment,
          canReadEnvironment: environmentsData.canReadEnvironment,
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
          // Pagination Properties,
          paginationInformation: {},
          pageNumber: 1,
        };
      },
    
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
      computed: {
        scope() {
    
          return gl.utils.getParameterByName('scope');
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
        },
    
        canReadEnvironmentParsed() {
    
          return gl.utils.convertPermissionToBoolean(this.canReadEnvironment);
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
        },
    
        canCreateDeploymentParsed() {
    
          return gl.utils.convertPermissionToBoolean(this.canCreateDeployment);
    
        /**
         * URL to link in the stopped tab.
         *
         * @return {String}
         */
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
        stoppedPath() {
          return `${window.location.pathname}?scope=stopped`;
        },
    
    
        /**
         * URL to link in the available tab.
         *
         * @return {String}
         */
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
        availablePath() {
          return window.location.pathname;
        },
      },
    
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
      /**
       * Fetches all the environments and stores them.
       * Toggles loading property.
       */
      created() {
    
        const scope = gl.utils.getParameterByName('scope') || this.visibility;
        const pageNumber = gl.utils.getParameterByName('page') || this.pageNumber;
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
    
        const endpoint = `${this.endpoint}?scope=${scope}&page=${pageNumber}`;
    
    
        this.service = new EnvironmentsService(endpoint);
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
    
        this.isLoading = true;
    
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
          .then(resp => ({
            headers: resp.headers,
            body: resp.json(),
          }))
          .then((response) => {
    
            this.store.storeAvailableCount(response.body.available_count);
            this.store.storeStoppedCount(response.body.stopped_count);
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
            this.store.storeEnvironments(response.body.environments);
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
            this.store.setPagination(response.headers);
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
          })
          .then(() => {
            this.isLoading = false;
          })
          .catch(() => {
            this.isLoading = false;
    
            // eslint-disable-next-line no-new
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
            new Flash('An error occurred while fetching the environments.', 'alert');
          });
      },
    
      methods: {
        /**
         * Will change the page number and update the URL.
         *
         * @param  {Number} pageNumber desired page to go to.
         */
        changePage(pageNumber) {
    
          const param = gl.utils.setParamInURL('page', pageNumber);
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
    
          gl.utils.visitUrl(param);
          return param;
        },
      },
    
    };
    </script>
    <template>
      <div :class="cssContainerClass">
        <div
          class="top-area"
          v-if="!isLoading">
    
          <h4 class="js-folder-name environments-folder-name">
            Environments / <b>{{folderName}}</b>
          </h4>
    
          <ul class="nav-links">
            <li :class="{ active: scope === null || scope === 'available' }">
              <a
                :href="availablePath"
                class="js-available-environments-folder-tab">
                Available
                <span class="badge js-available-environments-count">
                  {{state.availableCounter}}
                </span>
              </a>
            </li>
            <li :class="{ active : scope === 'stopped' }">
              <a
                :href="stoppedPath"
                class="js-stopped-environments-folder-tab">
                Stopped
                <span class="badge js-stopped-environments-count">
                  {{state.stoppedCounter}}
                </span>
              </a>
            </li>
          </ul>
        </div>
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
    
    
        <div class="environments-container">
    
    
          <loading-icon
            label="Loading environments"
            v-if="isLoading"
            size="3"
            />
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
    
    
          <div
            class="table-holder"
            v-if="!isLoading && state.environments.length > 0">
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
    
    
            <environment-table
              :environments="state.environments"
              :can-create-deployment="canCreateDeploymentParsed"
              :can-read-environment="canReadEnvironmentParsed"
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
    
    
            <table-pagination
              v-if="state.paginationInformation && state.paginationInformation.totalPages > 1"
              :change="changePage"
              :pageInfo="state.paginationInformation"/>
    
    Filipa Lacerda's avatar
    Filipa Lacerda committed
          </div>
        </div>
    
      </div>
    </template>