2021-10-20 19:28:51 +00:00
|
|
|
<template>
|
|
|
|
<div class="layout__col-2-scroll layout__col-2-scroll--white-background">
|
|
|
|
<div class="license-detail">
|
2022-01-11 12:13:53 +00:00
|
|
|
<h1>
|
2022-11-21 16:23:47 +00:00
|
|
|
{{ $t('license.title', { name: licenseType.getName() }) }}
|
2022-01-11 12:13:53 +00:00
|
|
|
</h1>
|
2021-10-20 19:28:51 +00:00
|
|
|
<div class="license-detail__users">
|
2022-01-11 12:13:53 +00:00
|
|
|
<h2>{{ $t('license.users') }}</h2>
|
2022-10-31 15:00:41 +00:00
|
|
|
<ManualLicenseSeatsForm
|
|
|
|
v-if="licenseType.getSeatsManuallyAssigned()"
|
|
|
|
:license="license"
|
|
|
|
></ManualLicenseSeatsForm>
|
|
|
|
<AutomaticLicenseSeats
|
|
|
|
v-else
|
|
|
|
:license="license"
|
|
|
|
></AutomaticLicenseSeats>
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
<div class="license-detail__body">
|
|
|
|
<div class="license-detail__body-left">
|
|
|
|
<div class="license-detail__item">
|
|
|
|
<div class="license-detail__item-label">
|
2022-01-11 12:13:53 +00:00
|
|
|
<div class="license-detail__item-name">
|
|
|
|
{{ $t('license.licenseId') }}
|
|
|
|
</div>
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
<div class="license-detail__item-value">
|
|
|
|
{{ license.license_id }}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="license-detail__item">
|
|
|
|
<div class="license-detail__item-label">
|
2022-01-11 12:13:53 +00:00
|
|
|
<div class="license-detail__item-name">
|
|
|
|
{{ $t('license.plan') }}
|
|
|
|
</div>
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
<div class="license-detail__item-value">
|
2023-11-14 15:51:49 +04:00
|
|
|
<Badge :color="licenseType.getLicenseBadgeColor()" bold>
|
2025-02-25 14:01:21 +00:00
|
|
|
{{ licenseType.getName() }}
|
2025-03-18 21:58:54 +01:00
|
|
|
</Badge>
|
|
|
|
<Badge v-if="!license.is_active" color="red"
|
|
|
|
>{{ $t('licenses.expired') }}
|
2025-02-25 14:01:21 +00:00
|
|
|
</Badge>
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="license-detail__item">
|
|
|
|
<div class="license-detail__item-label">
|
2022-01-11 12:13:53 +00:00
|
|
|
<div class="license-detail__item-name">
|
|
|
|
{{ $t('license.validFrom') }}
|
|
|
|
</div>
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
<div class="license-detail__item-value">
|
|
|
|
{{ localDateTime(license.valid_from) }}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="license-detail__item">
|
|
|
|
<div class="license-detail__item-label">
|
2022-01-11 12:13:53 +00:00
|
|
|
<div class="license-detail__item-name">
|
|
|
|
{{ $t('license.validThrough') }}
|
|
|
|
</div>
|
2021-10-20 19:28:51 +00:00
|
|
|
<div class="license-detail__item-description">
|
2022-01-11 12:13:53 +00:00
|
|
|
{{ $t('license.validThroughDescription') }}
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="license-detail__item-value">
|
|
|
|
{{ localDateTime(license.valid_through) }}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="license-detail__item">
|
|
|
|
<div class="license-detail__item-label">
|
2022-01-11 12:13:53 +00:00
|
|
|
<div class="license-detail__item-name">
|
|
|
|
{{ $t('license.lastCheck') }}
|
|
|
|
</div>
|
2021-10-20 19:28:51 +00:00
|
|
|
<div class="license-detail__item-description">
|
2022-01-11 12:13:53 +00:00
|
|
|
{{ $t('license.lastCheckDescription') }}
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="license-detail__item-value">
|
|
|
|
<div v-if="checkLoading" class="loading"></div>
|
|
|
|
<template v-else>
|
|
|
|
{{ localDateTime(license.last_check) }}
|
2022-01-11 12:13:53 +00:00
|
|
|
<a @click="check()">{{ $t('license.checkNow') }}</a>
|
2021-10-20 19:28:51 +00:00
|
|
|
</template>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="license-detail__item">
|
|
|
|
<div class="license-detail__item-label">
|
|
|
|
<div class="license-detail__item-name">
|
2022-01-11 12:13:53 +00:00
|
|
|
{{ $t('license.seats') }}
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="license-detail__item-value">
|
|
|
|
{{ license.seats_taken }} / {{ license.seats }}
|
|
|
|
</div>
|
|
|
|
</div>
|
2025-02-25 14:01:21 +00:00
|
|
|
|
|
|
|
<div v-if="license.application_users" class="license-detail__item">
|
|
|
|
<div class="license-detail__item-label">
|
|
|
|
<div class="license-detail__item-name">
|
|
|
|
{{ $t('license.applicationUsers') }}
|
|
|
|
</div>
|
|
|
|
<div class="license-detail__item-description">
|
|
|
|
{{ $t('license.applicationUsersDescription') }}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="license-detail__item-value">
|
2025-03-18 21:58:54 +01:00
|
|
|
{{ license.application_users_taken }} /
|
|
|
|
{{ license.application_users }}
|
2025-02-25 14:01:21 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
2021-10-20 19:28:51 +00:00
|
|
|
<div class="license-detail__item">
|
|
|
|
<div class="license-detail__item-label">
|
2022-01-11 12:13:53 +00:00
|
|
|
<div class="license-detail__item-name">
|
|
|
|
{{ $t('license.licensedTo') }}
|
|
|
|
</div>
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
<div class="license-detail__item-value">
|
|
|
|
{{ license.issued_to_name }} ({{ license.issued_to_email }})
|
|
|
|
</div>
|
|
|
|
</div>
|
2022-11-21 16:23:47 +00:00
|
|
|
<div
|
|
|
|
v-for="(feature, index) in licenseFeatureDescription"
|
|
|
|
:key="index"
|
|
|
|
class="license-detail__item"
|
|
|
|
>
|
2021-10-20 19:28:51 +00:00
|
|
|
<div class="license-detail__item-label">
|
2022-01-11 12:13:53 +00:00
|
|
|
<div class="license-detail__item-name">
|
2022-11-21 16:23:47 +00:00
|
|
|
{{ feature.name }}
|
2022-01-11 12:13:53 +00:00
|
|
|
</div>
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
<div class="license-detail__item-value">
|
2022-11-21 16:23:47 +00:00
|
|
|
<i
|
2023-09-28 13:39:41 +00:00
|
|
|
class="iconoir-check"
|
2022-11-21 16:23:47 +00:00
|
|
|
:class="{
|
2023-09-28 13:39:41 +00:00
|
|
|
'iconoir-check license-yes': feature.enabled,
|
|
|
|
'iconoir-cancel license-no': !feature.enabled,
|
2022-11-21 16:23:47 +00:00
|
|
|
}"
|
|
|
|
></i>
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="license-detail__item">
|
|
|
|
<div class="license-detail__item-label">
|
|
|
|
<div class="license-detail__item-name">
|
2022-01-11 12:13:53 +00:00
|
|
|
{{ $t('license.applications') }}
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
2022-01-11 12:13:53 +00:00
|
|
|
<div class="license-detail__item-value">
|
|
|
|
{{ $t('license.unlimited') }}
|
|
|
|
</div>
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
<div class="license-detail__item">
|
|
|
|
<div class="license-detail__item-label">
|
2022-01-11 12:13:53 +00:00
|
|
|
<div class="license-detail__item-name">
|
|
|
|
{{ $t('license.rowUsage') }}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="license-detail__item-value">
|
|
|
|
{{ $t('license.unlimited') }}
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="license-detail__item">
|
|
|
|
<div class="license-detail__item-label">
|
2022-01-11 12:13:53 +00:00
|
|
|
<div class="license-detail__item-name">
|
|
|
|
{{ $t('license.storeUsage') }}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="license-detail__item-value">
|
|
|
|
{{ $t('license.unlimited') }}
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2022-10-31 15:00:41 +00:00
|
|
|
<div class="license-detail__body-right">
|
2021-10-20 19:28:51 +00:00
|
|
|
<div class="delete-section">
|
|
|
|
<div class="delete-section__label">
|
|
|
|
<div class="delete-section__label-icon">
|
2023-09-28 13:39:41 +00:00
|
|
|
<i class="iconoir-warning-triangle"></i>
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
2022-01-11 12:13:53 +00:00
|
|
|
{{ $t('license.disconnectLicense') }}
|
2021-10-20 19:28:51 +00:00
|
|
|
</div>
|
2022-01-11 12:13:53 +00:00
|
|
|
<i18n path="license.disconnectDescription" tag="p">
|
|
|
|
<template #contact>
|
|
|
|
<a href="https://baserow.io/contact" target="_blank"
|
2025-03-18 21:58:54 +01:00
|
|
|
>baserow.io/contact</a
|
2022-01-11 12:13:53 +00:00
|
|
|
>
|
|
|
|
</template>
|
|
|
|
</i18n>
|
2024-04-15 11:29:17 +00:00
|
|
|
|
|
|
|
<Button type="danger" @click="$refs.disconnectModal.show()">
|
2025-02-25 14:01:21 +00:00
|
|
|
{{ $t('license.disconnectLicense') }}
|
2025-03-18 21:58:54 +01:00
|
|
|
</Button>
|
2021-10-20 19:28:51 +00:00
|
|
|
<DisconnectLicenseModal
|
|
|
|
ref="disconnectModal"
|
|
|
|
:license="license"
|
|
|
|
></DisconnectLicenseModal>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
import moment from '@baserow/modules/core/moment'
|
|
|
|
import { notifyIf } from '@baserow/modules/core/utils/error'
|
|
|
|
import LicenseService from '@baserow_premium/services/license'
|
2025-03-18 21:58:54 +01:00
|
|
|
import DisconnectLicenseModal from '@baserow_premium/components/license/DisconnectLicenseModal'
|
|
|
|
import ManualLicenseSeatsForm from '@baserow_premium/components/license/ManualLicenseSeatForm'
|
|
|
|
import AutomaticLicenseSeats from '@baserow_premium/components/license/AutomaticLicenseSeats'
|
2021-10-20 19:28:51 +00:00
|
|
|
|
|
|
|
export default {
|
2022-10-31 15:00:41 +00:00
|
|
|
components: {
|
|
|
|
DisconnectLicenseModal,
|
|
|
|
ManualLicenseSeatsForm,
|
2025-03-18 21:58:54 +01:00
|
|
|
AutomaticLicenseSeats,
|
2022-10-31 15:00:41 +00:00
|
|
|
},
|
2021-10-20 19:28:51 +00:00
|
|
|
layout: 'app',
|
|
|
|
middleware: 'staff',
|
|
|
|
async asyncData({ params, app, error }) {
|
|
|
|
try {
|
|
|
|
const { data } = await LicenseService(app.$client).fetch(params.id)
|
|
|
|
return { license: data }
|
|
|
|
} catch {
|
|
|
|
return error({
|
|
|
|
statusCode: 404,
|
2025-03-18 21:58:54 +01:00
|
|
|
message: 'The license was not found.',
|
2021-10-20 19:28:51 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
},
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
user: null,
|
2025-03-18 21:58:54 +01:00
|
|
|
checkLoading: false,
|
2021-10-20 19:28:51 +00:00
|
|
|
}
|
|
|
|
},
|
2022-01-11 12:13:53 +00:00
|
|
|
computed: {
|
2022-10-13 10:24:55 +00:00
|
|
|
licenseType() {
|
|
|
|
return this.$registry.get('license', this.license.product_code)
|
|
|
|
},
|
2022-10-13 21:18:34 +02:00
|
|
|
licenseFeatureDescription() {
|
|
|
|
return this.licenseType.getFeaturesDescription()
|
2022-10-27 07:39:33 +00:00
|
|
|
},
|
2022-01-11 12:13:53 +00:00
|
|
|
},
|
2021-10-20 19:28:51 +00:00
|
|
|
methods: {
|
|
|
|
localDateTime(timestamp) {
|
|
|
|
if (timestamp === null) {
|
|
|
|
return ''
|
|
|
|
}
|
|
|
|
|
|
|
|
return moment.utc(timestamp).local().format('ll LT')
|
|
|
|
},
|
|
|
|
async check() {
|
|
|
|
this.checkLoading = true
|
|
|
|
|
|
|
|
try {
|
|
|
|
const { data, status } = await LicenseService(this.$client).check(
|
|
|
|
this.license.id
|
|
|
|
)
|
|
|
|
if (status === 204) {
|
|
|
|
this.$router.push({ name: 'admin-licenses' })
|
|
|
|
} else {
|
|
|
|
this.license = data
|
|
|
|
}
|
|
|
|
} catch (error) {
|
|
|
|
notifyIf(error)
|
|
|
|
}
|
|
|
|
|
|
|
|
this.checkLoading = false
|
2025-03-18 21:58:54 +01:00
|
|
|
},
|
|
|
|
},
|
2021-10-20 19:28:51 +00:00
|
|
|
}
|
|
|
|
</script>
|