forked from rebillar/site-accueil-insa
169 lines
4 KiB
Vue
169 lines
4 KiB
Vue
<!--
|
|
Matomo - free/libre analytics platform
|
|
@link https://matomo.org
|
|
@license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
|
|
-->
|
|
|
|
<template>
|
|
<div class="sitesButtonBar clearfix">
|
|
|
|
<a v-show="hasSuperUserAccess && availableTypes"
|
|
class="btn addSite"
|
|
:class="{ disabled: siteIsBeingEdited }"
|
|
@click="addNewEntity()"
|
|
tabindex="1"
|
|
>
|
|
{{ availableTypes.length > 1
|
|
? translate('SitesManager_AddMeasurable')
|
|
: translate('SitesManager_AddSite') }}
|
|
</a>
|
|
|
|
<div class="search" v-show="hasPrev || hasNext || isSearching">
|
|
<input
|
|
:value="searchTerm"
|
|
@keydown="onKeydown($event)"
|
|
:placeholder="translate('Actions_SubmenuSitesearch')"
|
|
type="text"
|
|
:disabled="siteIsBeingEdited"
|
|
/>
|
|
<img
|
|
@click="searchSite()"
|
|
:title="translate('General_ClickToSearch')"
|
|
class="search_ico"
|
|
src="plugins/Morpheus/images/search_ico.png"
|
|
/>
|
|
</div>
|
|
|
|
<div class="paging" v-show="hasPrev || hasNext">
|
|
<a
|
|
class="btn prev"
|
|
:disabled="(hasPrev && !isLoading) && !siteIsBeingEdited ? undefined : true"
|
|
@click="previousPage()"
|
|
>
|
|
<span style="cursor:pointer;">« {{ translate('General_Previous') }}</span>
|
|
</a>
|
|
<span class="counter" v-show="hasPrev || hasNext">
|
|
<span>
|
|
{{ paginationText }}
|
|
</span>
|
|
</span>
|
|
<a
|
|
class="btn next"
|
|
:disabled="(hasNext && !isLoading) && !siteIsBeingEdited ? undefined : true"
|
|
@click="nextPage()"
|
|
>
|
|
<span style="cursor:pointer;" class="pointer">{{ translate('General_Next') }} »</span>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import { defineComponent } from 'vue';
|
|
import { Matomo, translate, debounce } from 'CoreHome';
|
|
import SiteTypesStore from '../SiteTypesStore/SiteTypesStore';
|
|
|
|
export default defineComponent({
|
|
props: {
|
|
siteIsBeingEdited: {
|
|
type: Boolean,
|
|
required: true,
|
|
},
|
|
hasPrev: {
|
|
type: Boolean,
|
|
required: true,
|
|
},
|
|
hasNext: {
|
|
type: Boolean,
|
|
required: true,
|
|
},
|
|
offsetStart: {
|
|
type: Number,
|
|
required: true,
|
|
},
|
|
offsetEnd: {
|
|
type: Number,
|
|
required: true,
|
|
},
|
|
totalNumberOfSites: {
|
|
type: Number,
|
|
},
|
|
isLoading: {
|
|
type: Boolean,
|
|
required: true,
|
|
},
|
|
searchTerm: {
|
|
type: String,
|
|
required: true,
|
|
},
|
|
isSearching: {
|
|
type: Boolean,
|
|
required: true,
|
|
},
|
|
},
|
|
emits: ['add', 'search', 'prev', 'next', 'update:searchTerm'],
|
|
created() {
|
|
SiteTypesStore.init();
|
|
|
|
this.onKeydown = debounce(this.onKeydown, 50);
|
|
},
|
|
computed: {
|
|
hasSuperUserAccess() {
|
|
return Matomo.hasSuperUserAccess;
|
|
},
|
|
availableTypes() {
|
|
return SiteTypesStore.types.value;
|
|
},
|
|
paginationText() {
|
|
let text: string;
|
|
if (this.isSearching) {
|
|
text = translate(
|
|
'General_PaginationWithoutTotal',
|
|
`${this.offsetStart}`,
|
|
`${this.offsetEnd}`,
|
|
);
|
|
} else {
|
|
text = translate(
|
|
'General_Pagination',
|
|
`${this.offsetStart}`,
|
|
`${this.offsetEnd}`,
|
|
this.totalNumberOfSites === null ? '?' : `${this.totalNumberOfSites}`,
|
|
);
|
|
}
|
|
return ` ${text} `;
|
|
},
|
|
},
|
|
methods: {
|
|
addNewEntity() {
|
|
this.$emit('add');
|
|
},
|
|
searchSite() {
|
|
if (this.siteIsBeingEdited) {
|
|
return;
|
|
}
|
|
|
|
this.$emit('search');
|
|
},
|
|
previousPage() {
|
|
this.$emit('prev');
|
|
},
|
|
nextPage() {
|
|
this.$emit('next');
|
|
},
|
|
onKeydown(event: KeyboardEvent) {
|
|
setTimeout(() => {
|
|
if (event.key === 'Enter') {
|
|
this.searchSiteOnEnter(event);
|
|
return;
|
|
}
|
|
|
|
this.$emit('update:searchTerm', (event.target as HTMLInputElement).value);
|
|
});
|
|
},
|
|
searchSiteOnEnter(event: KeyboardEvent) {
|
|
event.preventDefault();
|
|
this.searchSite();
|
|
},
|
|
},
|
|
});
|
|
</script>
|