mirror of
https://github.com/VueFileManager/vuefilemanager.git
synced 2026-04-05 18:23:48 +00:00
set/update/delete billing alert
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
"/chunks/admin~chunks/files~chunks/my-shared-items~chunks/platform~chunks/recent-uploads~chunks/settin~97130d1f.js": "/chunks/admin~chunks/files~chunks/my-shared-items~chunks/platform~chunks/recent-uploads~chunks/settin~97130d1f.js?id=e2d818009a4e2c1fffdf",
|
||||
"/chunks/admin~chunks/files~chunks/my-shared-items~chunks/platform~chunks/recent-uploads~chunks/shared~1bec6fe4.js": "/chunks/admin~chunks/files~chunks/my-shared-items~chunks/platform~chunks/recent-uploads~chunks/shared~1bec6fe4.js?id=510e6c1b1017a73a40a6",
|
||||
"/chunks/admin~chunks/platform.js": "/chunks/admin~chunks/platform.js?id=917aab9de16d3eb7039a",
|
||||
"/chunks/admin~chunks/platform~chunks/settings.js": "/chunks/admin~chunks/platform~chunks/settings.js?id=5655107fc94a22804c92",
|
||||
"/chunks/admin~chunks/platform~chunks/settings.js": "/chunks/admin~chunks/platform~chunks/settings.js?id=817867c331fb3943f0ff",
|
||||
"/chunks/admin~chunks/platform~chunks/settings~chunks/shared.js": "/chunks/admin~chunks/platform~chunks/settings~chunks/shared.js?id=8e89d2271b17b2d78177",
|
||||
"/chunks/admin~chunks/platform~chunks/shared.js": "/chunks/admin~chunks/platform~chunks/shared.js?id=0d6c4be667e46ea1303e",
|
||||
"/chunks/app-appearance.js": "/chunks/app-appearance.js?id=6035ca411b2c4239d964",
|
||||
@@ -74,7 +74,7 @@
|
||||
"/chunks/settings-payment-methods.js": "/chunks/settings-payment-methods.js?id=093cc2fd918ee6a340d3",
|
||||
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=75172fe522988795ec59",
|
||||
"/chunks/settings-storage~chunks/settings-subscription~chunks/user-storage~chunks/user-subscription.js": "/chunks/settings-storage~chunks/settings-subscription~chunks/user-storage~chunks/user-subscription.js?id=147afaac8c8bacfe6433",
|
||||
"/chunks/settings-subscription.js": "/chunks/settings-subscription.js?id=241cee35aba1f607aa40",
|
||||
"/chunks/settings-subscription.js": "/chunks/settings-subscription.js?id=fd11a9ee3772ed65553a",
|
||||
"/chunks/settings~chunks/settings-password.js": "/chunks/settings~chunks/settings-password.js?id=c33cd2341b9b04a732e5",
|
||||
"/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=651d5accf401908724c5",
|
||||
"/chunks/shared.js": "/chunks/shared.js?id=6230d050545cd1bd9b87",
|
||||
@@ -1271,5 +1271,90 @@
|
||||
"/chunks/settings-subscription.12fa902b3a9391e8d538.hot-update.js": "/chunks/settings-subscription.12fa902b3a9391e8d538.hot-update.js",
|
||||
"/chunks/settings-subscription.453191d7a9558d27b6be.hot-update.js": "/chunks/settings-subscription.453191d7a9558d27b6be.hot-update.js",
|
||||
"/chunks/settings-subscription.e6a599a3de8030a1289e.hot-update.js": "/chunks/settings-subscription.e6a599a3de8030a1289e.hot-update.js",
|
||||
"/chunks/settings-subscription.68f33a64d80e06da6b44.hot-update.js": "/chunks/settings-subscription.68f33a64d80e06da6b44.hot-update.js"
|
||||
"/chunks/settings-subscription.68f33a64d80e06da6b44.hot-update.js": "/chunks/settings-subscription.68f33a64d80e06da6b44.hot-update.js",
|
||||
"/chunks/settings-subscription.75d1e47080c718f5c11f.hot-update.js": "/chunks/settings-subscription.75d1e47080c718f5c11f.hot-update.js",
|
||||
"/chunks/settings-subscription.b8d308a387c5d684b379.hot-update.js": "/chunks/settings-subscription.b8d308a387c5d684b379.hot-update.js",
|
||||
"/chunks/settings-subscription.5330149512bc437f25f1.hot-update.js": "/chunks/settings-subscription.5330149512bc437f25f1.hot-update.js",
|
||||
"/chunks/settings-subscription.00b21e7f04a33eb1c503.hot-update.js": "/chunks/settings-subscription.00b21e7f04a33eb1c503.hot-update.js",
|
||||
"/chunks/settings-subscription.0b264871513fb1d73206.hot-update.js": "/chunks/settings-subscription.0b264871513fb1d73206.hot-update.js",
|
||||
"/chunks/settings-subscription.bcf4533771c62d9fd16a.hot-update.js": "/chunks/settings-subscription.bcf4533771c62d9fd16a.hot-update.js",
|
||||
"/chunks/settings-subscription.36037d1a7d0c90cd341a.hot-update.js": "/chunks/settings-subscription.36037d1a7d0c90cd341a.hot-update.js",
|
||||
"/chunks/settings-subscription.31689e82aa4699d1c0dc.hot-update.js": "/chunks/settings-subscription.31689e82aa4699d1c0dc.hot-update.js",
|
||||
"/chunks/settings-subscription.1bcfed1e451c646fe1fb.hot-update.js": "/chunks/settings-subscription.1bcfed1e451c646fe1fb.hot-update.js",
|
||||
"/chunks/settings-subscription.f04bb668d8b2c3ef9264.hot-update.js": "/chunks/settings-subscription.f04bb668d8b2c3ef9264.hot-update.js",
|
||||
"/chunks/settings-subscription.9ca1ce700ca5e7a1dbe9.hot-update.js": "/chunks/settings-subscription.9ca1ce700ca5e7a1dbe9.hot-update.js",
|
||||
"/chunks/settings-subscription.526de4a1ce27fb4a2cce.hot-update.js": "/chunks/settings-subscription.526de4a1ce27fb4a2cce.hot-update.js",
|
||||
"/chunks/settings-subscription.bc25afc8968f81320095.hot-update.js": "/chunks/settings-subscription.bc25afc8968f81320095.hot-update.js",
|
||||
"/chunks/settings-subscription.e23fa4c520ab101f24d5.hot-update.js": "/chunks/settings-subscription.e23fa4c520ab101f24d5.hot-update.js",
|
||||
"/chunks/settings-subscription.8a0f4255c7fa63385c62.hot-update.js": "/chunks/settings-subscription.8a0f4255c7fa63385c62.hot-update.js",
|
||||
"/chunks/settings-subscription.bc70448b8297a4b4116b.hot-update.js": "/chunks/settings-subscription.bc70448b8297a4b4116b.hot-update.js",
|
||||
"/chunks/settings-subscription.a16bc54fb1805267f9b7.hot-update.js": "/chunks/settings-subscription.a16bc54fb1805267f9b7.hot-update.js",
|
||||
"/chunks/settings-subscription.e0e102c34647846495e4.hot-update.js": "/chunks/settings-subscription.e0e102c34647846495e4.hot-update.js",
|
||||
"/chunks/settings-subscription.937aec696f674f7f7922.hot-update.js": "/chunks/settings-subscription.937aec696f674f7f7922.hot-update.js",
|
||||
"/chunks/settings-subscription.0588d28ca27ede122376.hot-update.js": "/chunks/settings-subscription.0588d28ca27ede122376.hot-update.js",
|
||||
"/chunks/settings-subscription.e609fececfe97e329ce3.hot-update.js": "/chunks/settings-subscription.e609fececfe97e329ce3.hot-update.js",
|
||||
"/chunks/settings-subscription.b3738f9237cfc23e50ca.hot-update.js": "/chunks/settings-subscription.b3738f9237cfc23e50ca.hot-update.js",
|
||||
"/chunks/settings-subscription.bfdf95e39b2f70f5f2df.hot-update.js": "/chunks/settings-subscription.bfdf95e39b2f70f5f2df.hot-update.js",
|
||||
"/chunks/settings-subscription.0eb72c8eac9037e2be9d.hot-update.js": "/chunks/settings-subscription.0eb72c8eac9037e2be9d.hot-update.js",
|
||||
"/chunks/settings-subscription.f2c87a95f59825b525a7.hot-update.js": "/chunks/settings-subscription.f2c87a95f59825b525a7.hot-update.js",
|
||||
"/chunks/settings-subscription.9308d274ec11a27280ad.hot-update.js": "/chunks/settings-subscription.9308d274ec11a27280ad.hot-update.js",
|
||||
"/chunks/settings-subscription.08977856a4f422f6a4dd.hot-update.js": "/chunks/settings-subscription.08977856a4f422f6a4dd.hot-update.js",
|
||||
"/chunks/settings-subscription.26f5bebc944065de1631.hot-update.js": "/chunks/settings-subscription.26f5bebc944065de1631.hot-update.js",
|
||||
"/chunks/settings-subscription.57c84cbf855b9dd5ed8d.hot-update.js": "/chunks/settings-subscription.57c84cbf855b9dd5ed8d.hot-update.js",
|
||||
"/chunks/settings-subscription.65a2a21e5afd1be11e14.hot-update.js": "/chunks/settings-subscription.65a2a21e5afd1be11e14.hot-update.js",
|
||||
"/chunks/settings-subscription.b7ea0663f32eeaa1e1da.hot-update.js": "/chunks/settings-subscription.b7ea0663f32eeaa1e1da.hot-update.js",
|
||||
"/chunks/settings-subscription.04fe701e2ab3ba497d13.hot-update.js": "/chunks/settings-subscription.04fe701e2ab3ba497d13.hot-update.js",
|
||||
"/chunks/settings-subscription.be7fea7ce548b624cf6e.hot-update.js": "/chunks/settings-subscription.be7fea7ce548b624cf6e.hot-update.js",
|
||||
"/chunks/settings-subscription.d86a7827277949b83fb3.hot-update.js": "/chunks/settings-subscription.d86a7827277949b83fb3.hot-update.js",
|
||||
"/chunks/settings-subscription.bdd71e8a4ee52be9583e.hot-update.js": "/chunks/settings-subscription.bdd71e8a4ee52be9583e.hot-update.js",
|
||||
"/chunks/settings-subscription.91ee9cb9581de7f5f6bc.hot-update.js": "/chunks/settings-subscription.91ee9cb9581de7f5f6bc.hot-update.js",
|
||||
"/chunks/settings-subscription.ce2d6cc25fe318378926.hot-update.js": "/chunks/settings-subscription.ce2d6cc25fe318378926.hot-update.js",
|
||||
"/chunks/settings-subscription.56b35b4f2d6e1904b552.hot-update.js": "/chunks/settings-subscription.56b35b4f2d6e1904b552.hot-update.js",
|
||||
"/chunks/settings-subscription.e666778354e6b7f10221.hot-update.js": "/chunks/settings-subscription.e666778354e6b7f10221.hot-update.js",
|
||||
"/chunks/settings-subscription.92de11067ad098c7c53c.hot-update.js": "/chunks/settings-subscription.92de11067ad098c7c53c.hot-update.js",
|
||||
"/chunks/settings-subscription.19ad060aaedfb6b52541.hot-update.js": "/chunks/settings-subscription.19ad060aaedfb6b52541.hot-update.js",
|
||||
"/chunks/settings-subscription.85794170d03ac7cb857f.hot-update.js": "/chunks/settings-subscription.85794170d03ac7cb857f.hot-update.js",
|
||||
"/chunks/settings-subscription.b33147b38d8e32864744.hot-update.js": "/chunks/settings-subscription.b33147b38d8e32864744.hot-update.js",
|
||||
"/chunks/settings-subscription.2c9d8bef7ee36040e67b.hot-update.js": "/chunks/settings-subscription.2c9d8bef7ee36040e67b.hot-update.js",
|
||||
"/chunks/settings-subscription.d8faf143343d44c62a9d.hot-update.js": "/chunks/settings-subscription.d8faf143343d44c62a9d.hot-update.js",
|
||||
"/chunks/settings-subscription.c80e7c16565259ea32a2.hot-update.js": "/chunks/settings-subscription.c80e7c16565259ea32a2.hot-update.js",
|
||||
"/chunks/settings-subscription.3c7ca1c5f81fed688424.hot-update.js": "/chunks/settings-subscription.3c7ca1c5f81fed688424.hot-update.js",
|
||||
"/chunks/settings-subscription.6b71fb3a94dcf7f46deb.hot-update.js": "/chunks/settings-subscription.6b71fb3a94dcf7f46deb.hot-update.js",
|
||||
"/chunks/settings-subscription.5630a0e0a74b7096cb09.hot-update.js": "/chunks/settings-subscription.5630a0e0a74b7096cb09.hot-update.js",
|
||||
"/chunks/settings-subscription.75498149c5a4da2160a8.hot-update.js": "/chunks/settings-subscription.75498149c5a4da2160a8.hot-update.js",
|
||||
"/chunks/settings-subscription.2f1f2d64be045ee587cd.hot-update.js": "/chunks/settings-subscription.2f1f2d64be045ee587cd.hot-update.js",
|
||||
"/chunks/settings-subscription.681f4115cdac57b120f5.hot-update.js": "/chunks/settings-subscription.681f4115cdac57b120f5.hot-update.js",
|
||||
"/chunks/settings-subscription.130506b845c195d4d520.hot-update.js": "/chunks/settings-subscription.130506b845c195d4d520.hot-update.js",
|
||||
"/chunks/settings-subscription.782d0ccc8cebc7809afc.hot-update.js": "/chunks/settings-subscription.782d0ccc8cebc7809afc.hot-update.js",
|
||||
"/chunks/settings-subscription.3d669e711f263ccfc7a4.hot-update.js": "/chunks/settings-subscription.3d669e711f263ccfc7a4.hot-update.js",
|
||||
"/chunks/settings-subscription.b3c7741f44f4f74a6e41.hot-update.js": "/chunks/settings-subscription.b3c7741f44f4f74a6e41.hot-update.js",
|
||||
"/chunks/settings-subscription.a0fc95fa1528fbc97791.hot-update.js": "/chunks/settings-subscription.a0fc95fa1528fbc97791.hot-update.js",
|
||||
"/chunks/settings-subscription.585be0b4204dcb6fe705.hot-update.js": "/chunks/settings-subscription.585be0b4204dcb6fe705.hot-update.js",
|
||||
"/chunks/settings-subscription.cb315c7e87ecb9e5a920.hot-update.js": "/chunks/settings-subscription.cb315c7e87ecb9e5a920.hot-update.js",
|
||||
"/chunks/settings-subscription.13f3cc5f7f9a0e590d56.hot-update.js": "/chunks/settings-subscription.13f3cc5f7f9a0e590d56.hot-update.js",
|
||||
"/chunks/settings-subscription.8251dc02b0e5ad28e2e4.hot-update.js": "/chunks/settings-subscription.8251dc02b0e5ad28e2e4.hot-update.js",
|
||||
"/chunks/settings-subscription.e47b7a46419f395e6014.hot-update.js": "/chunks/settings-subscription.e47b7a46419f395e6014.hot-update.js",
|
||||
"/chunks/settings-subscription.faef193bea5b50d4dcd3.hot-update.js": "/chunks/settings-subscription.faef193bea5b50d4dcd3.hot-update.js",
|
||||
"/chunks/settings-subscription.263eccd01d040c7c8704.hot-update.js": "/chunks/settings-subscription.263eccd01d040c7c8704.hot-update.js",
|
||||
"/chunks/settings-subscription.c99ccf05e2d85b113ea4.hot-update.js": "/chunks/settings-subscription.c99ccf05e2d85b113ea4.hot-update.js",
|
||||
"/chunks/settings-subscription.a0ad7b85f68c380418d5.hot-update.js": "/chunks/settings-subscription.a0ad7b85f68c380418d5.hot-update.js",
|
||||
"/chunks/settings-subscription.9997dafb8e0e3c90350a.hot-update.js": "/chunks/settings-subscription.9997dafb8e0e3c90350a.hot-update.js",
|
||||
"/chunks/settings-subscription.7783bbede12858b51772.hot-update.js": "/chunks/settings-subscription.7783bbede12858b51772.hot-update.js",
|
||||
"/chunks/settings-subscription.5adf26b765bf47a4e579.hot-update.js": "/chunks/settings-subscription.5adf26b765bf47a4e579.hot-update.js",
|
||||
"/chunks/settings-subscription.91bec091789022def4b1.hot-update.js": "/chunks/settings-subscription.91bec091789022def4b1.hot-update.js",
|
||||
"/chunks/admin~chunks/platform~chunks/settings.ca45f59c6f47080ae697.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.ca45f59c6f47080ae697.hot-update.js",
|
||||
"/chunks/admin~chunks/platform~chunks/settings.2d5bc7fc7a22038d7a0f.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.2d5bc7fc7a22038d7a0f.hot-update.js",
|
||||
"/chunks/admin~chunks/platform~chunks/settings.6ee7303a603cf90585be.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.6ee7303a603cf90585be.hot-update.js",
|
||||
"/chunks/admin~chunks/platform~chunks/settings.e88b217c56eb6e9fa8e9.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.e88b217c56eb6e9fa8e9.hot-update.js",
|
||||
"/chunks/admin~chunks/platform~chunks/settings.d1010f5c66ffa6a89ebd.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.d1010f5c66ffa6a89ebd.hot-update.js",
|
||||
"/chunks/admin~chunks/platform~chunks/settings.90d4dd664ca94c330354.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.90d4dd664ca94c330354.hot-update.js",
|
||||
"/chunks/admin~chunks/platform~chunks/settings.86ae1335131a857b88de.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.86ae1335131a857b88de.hot-update.js",
|
||||
"/chunks/admin~chunks/platform~chunks/settings.ef238483ee79c489fc11.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.ef238483ee79c489fc11.hot-update.js",
|
||||
"/chunks/admin~chunks/platform~chunks/settings.9cd1c24a1a398d94f39c.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.9cd1c24a1a398d94f39c.hot-update.js",
|
||||
"/chunks/admin~chunks/platform~chunks/settings.623b40c905073bdaff8d.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.623b40c905073bdaff8d.hot-update.js",
|
||||
"/chunks/settings-subscription.e5d448cdc7aa0a879e7a.hot-update.js": "/chunks/settings-subscription.e5d448cdc7aa0a879e7a.hot-update.js",
|
||||
"/chunks/settings-subscription.e93de9577924975edf28.hot-update.js": "/chunks/settings-subscription.e93de9577924975edf28.hot-update.js",
|
||||
"/chunks/settings-subscription.c70268db92d00d51c9f9.hot-update.js": "/chunks/settings-subscription.c70268db92d00d51c9f9.hot-update.js",
|
||||
"/chunks/settings-subscription.0b734f00ac49be587eb8.hot-update.js": "/chunks/settings-subscription.0b734f00ac49be587eb8.hot-update.js",
|
||||
"/chunks/admin~chunks/platform~chunks/settings.5ad45c25769df1bf44e6.hot-update.js": "/chunks/admin~chunks/platform~chunks/settings.5ad45c25769df1bf44e6.hot-update.js"
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
</div>
|
||||
|
||||
<PopupContent class="content">
|
||||
<h1 v-if="title" class="title">{{ title }}</h1>
|
||||
<h1 v-if="title" class="text-2xl font-bold max-w-sm mx-auto">{{ title }}</h1>
|
||||
<p v-if="message" class="message">{{ message }}</p>
|
||||
</PopupContent>
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
this.message = args.message
|
||||
this.emoji = '🤔'
|
||||
this.confirmationData = args.action
|
||||
this.buttonColor = 'danger-solid'
|
||||
this.buttonColor = 'danger'
|
||||
|
||||
if (args.buttonColor) {
|
||||
this.buttonColor = args.buttonColor
|
||||
@@ -103,13 +103,6 @@
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
|
||||
.title {
|
||||
@include font-size(22);
|
||||
text-transform: uppercase;
|
||||
font-weight: 800;
|
||||
color: $text;
|
||||
}
|
||||
|
||||
.message {
|
||||
@include font-size(16);
|
||||
color: #333;
|
||||
|
||||
@@ -76,19 +76,51 @@
|
||||
{{ $t('Billing Alert') }}
|
||||
</FormLabel>
|
||||
|
||||
<ValidationObserver ref="changeStorageCapacity" @submit.prevent="makePayment" v-slot="{ invalid }" tag="form" class="mt-6">
|
||||
<ValidationProvider tag="div" v-slot="{ errors }" mode="passive" name="Capacity" rules="required">
|
||||
<div v-if="user.data.relationships.alert">
|
||||
<b class="text-3xl font-extrabold -mt-3 block mb-0.5 flex items-center">
|
||||
{{ user.data.relationships.alert.data.attributes.formatted }}
|
||||
<edit2-icon v-if="! showUpdateBillingAlertForm" @click="showUpdateBillingAlertForm = ! showUpdateBillingAlertForm" size="12" class="vue-feather cursor-pointer ml-2 transform -translate-y-0.5" />
|
||||
<trash2-icon v-if="showUpdateBillingAlertForm" @click="deleteBillingAlert" size="12" class="vue-feather cursor-pointer ml-2 transform -translate-y-0.5" />
|
||||
</b>
|
||||
|
||||
<b class="block text-sm text-gray-400">
|
||||
{{ $t('Alert will be triggered after you reach the value above.') }}
|
||||
</b>
|
||||
</div>
|
||||
|
||||
<ValidationObserver v-if="showUpdateBillingAlertForm" ref="updatebillingAlertForm" @submit.prevent="updateBillingAlert" v-slot="{ invalid }" tag="form" class="mt-6">
|
||||
<ValidationProvider tag="div" v-slot="{ errors }" mode="passive" name="Billing Alert" rules="required">
|
||||
<AppInputText :description="$t('You will receive an email whenever your monthly balance reaches the specified amount above.')" :error="errors[0]" :is-last="true">
|
||||
<div class="flex space-x-4">
|
||||
<input v-model="paymentAmount"
|
||||
<input v-model="billingAlertAmount"
|
||||
:placeholder="$t('Alert Amount...')"
|
||||
type="number"
|
||||
min="1"
|
||||
max="999999999"
|
||||
class="focus-border-theme input-dark"
|
||||
:class="{'is-error': errors[0]}"
|
||||
:class="{'border-red-700': errors[0]}"
|
||||
/>
|
||||
<ButtonBase type="submit" button-style="theme" class="submit-button">
|
||||
<ButtonBase :loadint="isSendingBillingAlert" :disabled="isSendingBillingAlert" type="submit" button-style="theme" class="submit-button">
|
||||
{{ $t('Update Alert') }}
|
||||
</ButtonBase>
|
||||
</div>
|
||||
</AppInputText>
|
||||
</ValidationProvider>
|
||||
</ValidationObserver>
|
||||
|
||||
<ValidationObserver v-if="! user.data.relationships.alert" ref="billingAlertForm" @submit.prevent="setBillingAlert" v-slot="{ invalid }" tag="form" class="mt-6">
|
||||
<ValidationProvider tag="div" v-slot="{ errors }" mode="passive" name="Billing Alert" rules="required">
|
||||
<AppInputText :description="$t('You will receive an email whenever your monthly balance reaches the specified amount above.')" :error="errors[0]" :is-last="true">
|
||||
<div class="flex space-x-4">
|
||||
<input v-model="billingAlertAmount"
|
||||
:placeholder="$t('Alert Amount...')"
|
||||
type="number"
|
||||
min="1"
|
||||
max="999999999"
|
||||
class="focus-border-theme input-dark"
|
||||
:class="{'border-red-700': errors[0]}"
|
||||
/>
|
||||
<ButtonBase :loadint="isSendingBillingAlert" :disabled="isSendingBillingAlert" type="submit" button-style="theme" class="submit-button">
|
||||
{{ $t('Set Alert') }}
|
||||
</ButtonBase>
|
||||
</div>
|
||||
@@ -149,10 +181,15 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
XIcon,
|
||||
Trash2Icon,
|
||||
Edit2Icon,
|
||||
} from "vue-feather-icons";
|
||||
import ColorLabel from "../../components/Others/ColorLabel";
|
||||
import DatatableWrapper from "../../components/Others/Tables/DatatableWrapper";
|
||||
import AppInputText from "../../components/Admin/AppInputText";
|
||||
import {ValidationProvider, ValidationObserver} from 'vee-validate/dist/vee-validate.full'
|
||||
import {ValidationProvider, ValidationObserver} from 'vee-validate/dist/vee-validate.full'
|
||||
import ButtonBase from '/resources/js/components/FilesView/ButtonBase'
|
||||
import PageTab from '/resources/js/components/Others/Layout/PageTab'
|
||||
import InfoBox from '/resources/js/components/Others/Forms/InfoBox'
|
||||
@@ -161,6 +198,7 @@
|
||||
import ProgressLine from "../../components/Admin/ProgressLine"
|
||||
import {mapGetters} from 'vuex'
|
||||
import axios from 'axios'
|
||||
import {events} from "../../bus";
|
||||
|
||||
export default {
|
||||
name: 'MeteredSubscription',
|
||||
@@ -173,6 +211,9 @@
|
||||
ProgressLine,
|
||||
ButtonBase,
|
||||
ColorLabel,
|
||||
Trash2Icon,
|
||||
Edit2Icon,
|
||||
XIcon,
|
||||
FormLabel,
|
||||
InfoBox,
|
||||
PageTab,
|
||||
@@ -185,6 +226,11 @@
|
||||
data() {
|
||||
return {
|
||||
isLoading: false,
|
||||
|
||||
isSendingBillingAlert: false,
|
||||
billingAlertAmount: undefined,
|
||||
showUpdateBillingAlertForm: false,
|
||||
|
||||
paymentAmount: undefined,
|
||||
columns: [
|
||||
{
|
||||
@@ -216,12 +262,102 @@
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async updateBillingAlert() {
|
||||
|
||||
// Validate fields
|
||||
const isValid = await this.$refs.updatebillingAlertForm.validate();
|
||||
|
||||
if (!isValid) return;
|
||||
|
||||
this.isSendingBillingAlert = true
|
||||
|
||||
axios
|
||||
.patch(`/api/subscriptions/billing-alerts/${this.user.data.relationships.alert.data.id}`, {
|
||||
amount: this.billingAlertAmount
|
||||
})
|
||||
.then(() => {
|
||||
this.$store.dispatch('getAppData')
|
||||
|
||||
this.showUpdateBillingAlertForm = false
|
||||
|
||||
events.$emit('toaster', {
|
||||
type: 'success',
|
||||
message: this.$t('Your billing alert was updated successfully'),
|
||||
})
|
||||
})
|
||||
.catch(() => {
|
||||
events.$emit('toaster', {
|
||||
type: 'success',
|
||||
message: this.$t('popup_error.title'),
|
||||
})
|
||||
})
|
||||
.finally(() => {
|
||||
this.isSendingBillingAlert = false
|
||||
})
|
||||
},
|
||||
async setBillingAlert() {
|
||||
|
||||
// Validate fields
|
||||
const isValid = await this.$refs.billingAlertForm.validate();
|
||||
|
||||
if (!isValid) return;
|
||||
|
||||
this.isSendingBillingAlert = true
|
||||
|
||||
axios
|
||||
.post('/api/subscriptions/billing-alerts', {
|
||||
amount: this.billingAlertAmount
|
||||
})
|
||||
.then(() => {
|
||||
this.$store.dispatch('getAppData')
|
||||
|
||||
events.$emit('toaster', {
|
||||
type: 'success',
|
||||
message: this.$t('Your billing alert was set successfully'),
|
||||
})
|
||||
})
|
||||
.catch(() => {
|
||||
events.$emit('toaster', {
|
||||
type: 'success',
|
||||
message: this.$t('popup_error.title'),
|
||||
})
|
||||
})
|
||||
.finally(() => {
|
||||
this.isSendingBillingAlert = false
|
||||
})
|
||||
},
|
||||
deleteBillingAlert() {
|
||||
events.$emit('confirm:open', {
|
||||
title: this.$t('Are you sure you want to delete your alert?'),
|
||||
message: this.$t('You will no longer receive any notifications that your billing limit has been exceeded.'),
|
||||
action: {
|
||||
id: this.user.data.relationships.alert.data.id,
|
||||
operation: 'delete-billing-alert',
|
||||
}
|
||||
})
|
||||
},
|
||||
makePayment() {
|
||||
// TODO: make a payment
|
||||
}
|
||||
},
|
||||
},
|
||||
created() {
|
||||
events.$on('action:confirmed', data => {
|
||||
|
||||
if (data.operation === 'delete-billing-alert')
|
||||
axios.delete(`/api/subscriptions/billing-alerts/${this.user.data.relationships.alert.data.id}`)
|
||||
.then(() => {
|
||||
this.$store.dispatch('getAppData')
|
||||
|
||||
this.showUpdateBillingAlertForm = false
|
||||
this.billingAlertAmount = undefined
|
||||
|
||||
events.$emit('toaster', {
|
||||
type: 'success',
|
||||
message: this.$t('Your billing alert was deleted.'),
|
||||
})
|
||||
})
|
||||
.catch(() => this.$isSomethingWrong())
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -1093,14 +1093,14 @@ class SetupDevEnvironment extends Command
|
||||
$user
|
||||
->each(
|
||||
fn ($user) => DB::table('traffic')
|
||||
->insert([
|
||||
'id' => Str::uuid(),
|
||||
'user_id' => $user->id,
|
||||
'upload' => random_int(1111111, 9999999),
|
||||
'download' => random_int(11111111, 99999999),
|
||||
'created_at' => now()->subDays($day),
|
||||
'updated_at' => now()->subDays($day),
|
||||
])
|
||||
->insert([
|
||||
'id' => Str::uuid(),
|
||||
'user_id' => $user->id,
|
||||
'upload' => random_int(1111111, 9999999),
|
||||
'download' => random_int(11111111, 99999999),
|
||||
'created_at' => now()->subDays($day),
|
||||
'updated_at' => now()->subDays($day),
|
||||
])
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,11 +4,11 @@ namespace App\Console;
|
||||
use Illuminate\Console\Scheduling\Schedule;
|
||||
use App\Console\Commands\SetupDevEnvironment;
|
||||
use App\Console\Commands\SetupProdEnvironment;
|
||||
use Support\Scheduler\Actions\ReportUsageAction;
|
||||
use Support\Scheduler\Actions\DeleteFailedFilesAction;
|
||||
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
|
||||
use Support\Scheduler\Actions\DeleteUnverifiedUsersAction;
|
||||
use Support\Scheduler\Actions\DeleteExpiredShareLinksAction;
|
||||
use Support\Scheduler\Actions\ReportUsageAction;
|
||||
|
||||
class Kernel extends ConsoleKernel
|
||||
{
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
namespace App\Users\Actions;
|
||||
|
||||
use ByteUnits\Metric;
|
||||
@@ -10,11 +9,10 @@ class FormatUsageEstimatesAction
|
||||
public function __invoke(string $currency, Collection $usage)
|
||||
{
|
||||
return $usage->map(function ($estimate) use ($currency) {
|
||||
|
||||
// Format usage
|
||||
$usage = match ($estimate['feature']) {
|
||||
'bandwidth' => Metric::megabytes($estimate['usage'])->format(),
|
||||
'storage' => Metric::megabytes($estimate['usage'])->format(),
|
||||
'storage' => Metric::megabytes($estimate['usage'])->format(),
|
||||
};
|
||||
|
||||
// Normalize units
|
||||
@@ -28,4 +26,4 @@ class FormatUsageEstimatesAction
|
||||
];
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace App\Users\Resources;
|
||||
|
||||
use App\Users\Actions\FormatUsageEstimatesAction;
|
||||
use Domain\Folders\Resources\FolderCollection;
|
||||
use VueFileManager\Subscription\Domain\Usage\Actions\SumUsageForCurrentPeriodAction;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
use App\Users\Actions\FormatUsageEstimatesAction;
|
||||
use VueFileManager\Subscription\Domain\Credits\Resources\BalanceResource;
|
||||
use VueFileManager\Subscription\Domain\BillingAlerts\Resources\BillingAlertResource;
|
||||
use VueFileManager\Subscription\Domain\Subscriptions\Resources\SubscriptionResource;
|
||||
use VueFileManager\Subscription\Domain\Usage\Actions\SumUsageForCurrentPeriodAction;
|
||||
|
||||
class UserResource extends JsonResource
|
||||
{
|
||||
@@ -41,18 +41,21 @@ class UserResource extends JsonResource
|
||||
'relationships' => [
|
||||
'settings' => new SettingsResource($this->settings),
|
||||
'favourites' => new FolderCollection($this->favouriteFolders),
|
||||
$this->mergeWhen($this->hasSubscription(), fn() => [
|
||||
$this->mergeWhen($this->hasSubscription(), fn () => [
|
||||
'subscription' => new SubscriptionResource($this->subscription),
|
||||
]),
|
||||
$this->mergeWhen($isMeteredSubscription, fn() => [
|
||||
$this->mergeWhen($isMeteredSubscription, fn () => [
|
||||
'balance' => new BalanceResource($this->balance),
|
||||
]),
|
||||
$this->mergeWhen($isMeteredSubscription, fn () => [
|
||||
'alert' => new BillingAlertResource($this->billingAlert),
|
||||
]),
|
||||
],
|
||||
'meta' => [
|
||||
$this->mergeWhen($isFixedSubscription, fn() => [
|
||||
$this->mergeWhen($isFixedSubscription, fn () => [
|
||||
'limitations' => $this->limitations->summary(),
|
||||
]),
|
||||
$this->mergeWhen($isMeteredSubscription, fn() => [
|
||||
$this->mergeWhen($isMeteredSubscription, fn () => [
|
||||
'usages' => $this->getUsageEstimates(),
|
||||
]),
|
||||
],
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?php
|
||||
namespace Domain\Traffic\Models;
|
||||
|
||||
use Database\Factories\TrafficFactory;
|
||||
use Illuminate\Support\Str;
|
||||
use Database\Factories\TrafficFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
namespace Support\Scheduler\Actions;
|
||||
|
||||
use DB;
|
||||
@@ -12,7 +11,7 @@ class ReportUsageAction
|
||||
Subscription::whereIn('type', ['pre-paid', 'auto-renew'])
|
||||
->where('status', 'active')
|
||||
->cursor()
|
||||
->each(function($subscription) {
|
||||
->each(function ($subscription) {
|
||||
$this->recordBandwidth($subscription);
|
||||
$this->recordStorageCapacity($subscription);
|
||||
});
|
||||
@@ -46,4 +45,4 @@ class ReportUsageAction
|
||||
// Record storage capacity usage
|
||||
$subscription->recordUsage('bandwidth', $amount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\App\Users;
|
||||
|
||||
use App\Users\Actions\FormatUsageEstimatesAction;
|
||||
use Tests\TestCase;
|
||||
use App\Users\Models\User;
|
||||
use App\Users\Actions\FormatUsageEstimatesAction;
|
||||
use VueFileManager\Subscription\Domain\Plans\Models\Plan;
|
||||
use VueFileManager\Subscription\Domain\Plans\Models\PlanFixedFeature;
|
||||
use VueFileManager\Subscription\Support\Events\SubscriptionWasCreated;
|
||||
@@ -20,17 +19,17 @@ class UserSubscriptionTest extends TestCase
|
||||
{
|
||||
$plan = Plan::factory()
|
||||
->has(PlanFixedFeature::factory()
|
||||
->count(2)
|
||||
->sequence(
|
||||
[
|
||||
'key' => 'max_storage_amount',
|
||||
'value' => 200,
|
||||
],
|
||||
[
|
||||
'key' => 'max_team_members',
|
||||
'value' => 20,
|
||||
],
|
||||
), 'fixedFeatures')
|
||||
->count(2)
|
||||
->sequence(
|
||||
[
|
||||
'key' => 'max_storage_amount',
|
||||
'value' => 200,
|
||||
],
|
||||
[
|
||||
'key' => 'max_team_members',
|
||||
'value' => 20,
|
||||
],
|
||||
), 'fixedFeatures')
|
||||
->create();
|
||||
|
||||
$user = User::factory()
|
||||
@@ -54,17 +53,17 @@ class UserSubscriptionTest extends TestCase
|
||||
{
|
||||
$plan = Plan::factory()
|
||||
->has(PlanFixedFeature::factory()
|
||||
->count(2)
|
||||
->sequence(
|
||||
[
|
||||
'key' => 'max_storage_amount',
|
||||
'value' => 200,
|
||||
],
|
||||
[
|
||||
'key' => 'max_team_members',
|
||||
'value' => 20,
|
||||
],
|
||||
), 'fixedFeatures')
|
||||
->count(2)
|
||||
->sequence(
|
||||
[
|
||||
'key' => 'max_storage_amount',
|
||||
'value' => 200,
|
||||
],
|
||||
[
|
||||
'key' => 'max_team_members',
|
||||
'value' => 20,
|
||||
],
|
||||
), 'fixedFeatures')
|
||||
->create();
|
||||
|
||||
$user = User::factory()
|
||||
@@ -111,13 +110,13 @@ class UserSubscriptionTest extends TestCase
|
||||
$usages = collect([
|
||||
[
|
||||
'feature' => 'bandwidth',
|
||||
"amount" => 7546.96,
|
||||
"usage" => 26024,
|
||||
'amount' => 7546.96,
|
||||
'usage' => 26024,
|
||||
], [
|
||||
"feature" => "storage",
|
||||
"amount" => 476.28,
|
||||
"usage" => 3969,
|
||||
]
|
||||
'feature' => 'storage',
|
||||
'amount' => 476.28,
|
||||
'usage' => 3969,
|
||||
],
|
||||
]);
|
||||
|
||||
// Format usage estimates
|
||||
@@ -126,16 +125,16 @@ class UserSubscriptionTest extends TestCase
|
||||
|
||||
$expected = [
|
||||
[
|
||||
"feature" => "bandwidth",
|
||||
"amount" => 7.54696,
|
||||
"cost" => "$7.55",
|
||||
"usage" => "26.02GB",
|
||||
'feature' => 'bandwidth',
|
||||
'amount' => 7.54696,
|
||||
'cost' => '$7.55',
|
||||
'usage' => '26.02GB',
|
||||
], [
|
||||
"feature" => "storage",
|
||||
"amount" => 0.47628,
|
||||
"cost" => "$0.48",
|
||||
"usage" => "3.97GB",
|
||||
]
|
||||
'feature' => 'storage',
|
||||
'amount' => 0.47628,
|
||||
'cost' => '$0.48',
|
||||
'usage' => '3.97GB',
|
||||
],
|
||||
];
|
||||
|
||||
$this->assertEquals($expected, $estimates);
|
||||
|
||||
@@ -30,10 +30,10 @@ class TeamLimitsTest extends TestCase
|
||||
|
||||
$members->each(
|
||||
fn ($member) => TeamFolderMember::factory()
|
||||
->create([
|
||||
'parent_id' => $user->folders[0]->id,
|
||||
'user_id' => $member->id,
|
||||
])
|
||||
->create([
|
||||
'parent_id' => $user->folders[0]->id,
|
||||
'user_id' => $member->id,
|
||||
])
|
||||
);
|
||||
|
||||
// Try invite new member
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Domain\Traffic;
|
||||
|
||||
use Domain\Traffic\Models\Traffic;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Storage;
|
||||
use Tests\TestCase;
|
||||
use App\Users\Models\User;
|
||||
@@ -12,6 +9,8 @@ use Domain\Files\Models\File;
|
||||
use Domain\Sharing\Models\Share;
|
||||
use Domain\Folders\Models\Folder;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use Domain\Traffic\Models\Traffic;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class TrafficTest extends TestCase
|
||||
{
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Support\Scheduler;
|
||||
|
||||
use Domain\Files\Models\File;
|
||||
use Domain\Traffic\Models\Traffic;
|
||||
use Storage;
|
||||
use Support\Scheduler\Actions\ReportUsageAction;
|
||||
use Tests\TestCase;
|
||||
use App\Users\Models\User;
|
||||
use Domain\Files\Models\File;
|
||||
use Domain\Sharing\Models\Share;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use Domain\Traffic\Models\Traffic;
|
||||
use Support\Scheduler\Actions\ReportUsageAction;
|
||||
use Support\Scheduler\Actions\DeleteFailedFilesAction;
|
||||
use VueFileManager\Subscription\Domain\Plans\Models\Plan;
|
||||
use Support\Scheduler\Actions\DeleteUnverifiedUsersAction;
|
||||
use Support\Scheduler\Actions\DeleteExpiredShareLinksAction;
|
||||
use VueFileManager\Subscription\Domain\Plans\Models\Plan;
|
||||
use VueFileManager\Subscription\Domain\Plans\Models\PlanMeteredFeature;
|
||||
use VueFileManager\Subscription\Domain\Subscriptions\Models\Subscription;
|
||||
|
||||
@@ -58,8 +57,8 @@ class SchedulerTest extends TestCase
|
||||
|
||||
Traffic::factory()
|
||||
->create([
|
||||
'user_id' => $user->id,
|
||||
'download' => 155000000,
|
||||
'user_id' => $user->id,
|
||||
'download' => 155000000,
|
||||
'created_at' => now()->subDay(),
|
||||
]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user