mirror of
https://github.com/AzuraCast/AzuraCast.git
synced 2024-06-13 12:46:41 +00:00
Mroe Composition switches.
This commit is contained in:
parent
962c0badde
commit
1ef68f64fc
|
@ -8,7 +8,7 @@
|
||||||
<b-form @submit.prevent="doRename">
|
<b-form @submit.prevent="doRename">
|
||||||
<b-wrapped-form-group
|
<b-wrapped-form-group
|
||||||
id="new_directory_name"
|
id="new_directory_name"
|
||||||
:field="v$.form.newPath"
|
:field="v$.newPath"
|
||||||
autofocus
|
autofocus
|
||||||
>
|
>
|
||||||
<template #label>
|
<template #label>
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
{{ $gettext('Close') }}
|
{{ $gettext('Close') }}
|
||||||
</b-button>
|
</b-button>
|
||||||
<b-button
|
<b-button
|
||||||
:variant="(v$.form.$invalid) ? 'danger' : 'primary'"
|
:variant="(v$.$invalid) ? 'danger' : 'primary'"
|
||||||
@click="doRename"
|
@click="doRename"
|
||||||
>
|
>
|
||||||
{{ $gettext('Rename') }}
|
{{ $gettext('Rename') }}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
id="clone_modal"
|
id="clone_modal"
|
||||||
ref="$modal"
|
ref="$modal"
|
||||||
:title="$gettext('Duplicate Playlist')"
|
:title="$gettext('Duplicate Playlist')"
|
||||||
:disable-save-button="v$.form.$invalid"
|
:disable-save-button="v$.$invalid"
|
||||||
@submit="doSubmit"
|
@submit="doSubmit"
|
||||||
@hidden="clearContents"
|
@hidden="clearContents"
|
||||||
>
|
>
|
||||||
|
@ -11,7 +11,7 @@
|
||||||
<b-wrapped-form-group
|
<b-wrapped-form-group
|
||||||
id="form_edit_name"
|
id="form_edit_name"
|
||||||
class="col-md-12"
|
class="col-md-12"
|
||||||
:field="v$.form.name"
|
:field="v$.name"
|
||||||
>
|
>
|
||||||
<template #label>
|
<template #label>
|
||||||
{{ $gettext('New Playlist Name') }}
|
{{ $gettext('New Playlist Name') }}
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
<b-wrapped-form-group
|
<b-wrapped-form-group
|
||||||
id="form_edit_clone"
|
id="form_edit_clone"
|
||||||
class="col-md-12"
|
class="col-md-12"
|
||||||
:field="v$.form.clone"
|
:field="v$.clone"
|
||||||
>
|
>
|
||||||
<template #label>
|
<template #label>
|
||||||
{{ $gettext('Customize Copy') }}
|
{{ $gettext('Customize Copy') }}
|
||||||
|
|
|
@ -86,9 +86,6 @@
|
||||||
:responsive="false"
|
:responsive="false"
|
||||||
:items="listeners"
|
:items="listeners"
|
||||||
>
|
>
|
||||||
<template #cell(ip)="row">
|
|
||||||
{{ row.item.ip }}
|
|
||||||
</template>
|
|
||||||
<template #cell(time)="row">
|
<template #cell(time)="row">
|
||||||
{{ formatTime(row.item.connected_time) }}
|
{{ formatTime(row.item.connected_time) }}
|
||||||
</template>
|
</template>
|
||||||
|
@ -148,117 +145,109 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script setup>
|
||||||
import StationReportsListenersMap from "./Listeners/Map";
|
import StationReportsListenersMap from "./Listeners/Map";
|
||||||
import Icon from "~/components/Common/Icon";
|
import Icon from "~/components/Common/Icon";
|
||||||
import formatTime from "~/functions/formatTime";
|
import formatTime from "~/functions/formatTime";
|
||||||
import DataTable from "~/components/Common/DataTable";
|
import DataTable from "~/components/Common/DataTable";
|
||||||
import DateRangeDropdown from "~/components/Common/DateRangeDropdown";
|
import DateRangeDropdown from "~/components/Common/DateRangeDropdown";
|
||||||
import {DateTime} from 'luxon';
|
import {DateTime} from 'luxon';
|
||||||
|
import {computed, onMounted, ref, shallowRef} from "vue";
|
||||||
|
import {useTranslate} from "~/vendor/gettext";
|
||||||
|
import {useNotify} from "~/vendor/bootstrapVue";
|
||||||
|
import {useAxios} from "~/vendor/axios";
|
||||||
|
|
||||||
/* TODO Options API */
|
const props = defineProps({
|
||||||
|
apiUrl: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
attribution: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
stationTimeZone: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
export default {
|
const isLive = ref(true);
|
||||||
name: 'StationReportsListeners',
|
const listeners = shallowRef([]);
|
||||||
components: {DateRangeDropdown, DataTable, StationReportsListenersMap, Icon},
|
|
||||||
props: {
|
|
||||||
apiUrl: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
attribution: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
stationTimeZone: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
const nowTz = DateTime.now().setZone(this.stationTimeZone);
|
|
||||||
|
|
||||||
return {
|
const nowTz = DateTime.now().setZone(props.stationTimeZone);
|
||||||
isLive: true,
|
|
||||||
listeners: [],
|
|
||||||
dateRange: {
|
|
||||||
startDate: nowTz.minus({days: 1}).toJSDate(),
|
|
||||||
endDate: nowTz.toJSDate()
|
|
||||||
},
|
|
||||||
fields: [
|
|
||||||
{key: 'ip', label: this.$gettext('IP'), sortable: false},
|
|
||||||
{key: 'time', label: this.$gettext('Time'), sortable: false},
|
|
||||||
{key: 'time_sec', label: this.$gettext('Time (sec)'), sortable: false},
|
|
||||||
{key: 'user_agent', isRowHeader: true, label: this.$gettext('User Agent'), sortable: false},
|
|
||||||
{key: 'stream', label: this.$gettext('Stream'), sortable: false},
|
|
||||||
{key: 'location', label: this.$gettext('Location'), sortable: false}
|
|
||||||
]
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
nowTz() {
|
|
||||||
return DateTime.now().setZone(this.stationTimeZone);
|
|
||||||
},
|
|
||||||
minDate() {
|
|
||||||
return this.nowTz.minus({years: 5}).toJSDate();
|
|
||||||
},
|
|
||||||
maxDate() {
|
|
||||||
return this.nowTz.plus({days: 5}).toJSDate();
|
|
||||||
},
|
|
||||||
exportUrl() {
|
|
||||||
let exportUrl = new URL(this.apiUrl, document.location);
|
|
||||||
let exportUrlParams = exportUrl.searchParams;
|
|
||||||
exportUrlParams.set('format', 'csv');
|
|
||||||
|
|
||||||
if (!this.isLive) {
|
const minDate = nowTz.minus({years: 5}).toJSDate();
|
||||||
exportUrlParams.set('start', DateTime.fromJSDate(this.dateRange.startDate).toISO());
|
const maxDate = nowTz.plus({days: 5}).toJSDate();
|
||||||
exportUrlParams.set('end', DateTime.fromJSDate(this.dateRange.endDate).toISO());
|
|
||||||
}
|
|
||||||
|
|
||||||
return exportUrl.toString();
|
const dateRange = ref({
|
||||||
},
|
startDate: nowTz.minus({days: 1}).toJSDate(),
|
||||||
totalListenerHours() {
|
endDate: nowTz.toJSDate()
|
||||||
let tlh_seconds = 0;
|
});
|
||||||
this.listeners.forEach(function (listener) {
|
|
||||||
tlh_seconds += listener.connected_time;
|
|
||||||
});
|
|
||||||
|
|
||||||
let tlh_hours = tlh_seconds / 3600;
|
const {$gettext} = useTranslate();
|
||||||
return Math.round((tlh_hours + 0.00001) * 100) / 100;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.updateListeners();
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
setIsLive(newValue) {
|
|
||||||
this.isLive = newValue;
|
|
||||||
this.updateListeners();
|
|
||||||
},
|
|
||||||
formatTime(time) {
|
|
||||||
return formatTime(time);
|
|
||||||
},
|
|
||||||
updateListeners() {
|
|
||||||
let params = {};
|
|
||||||
if (!this.isLive) {
|
|
||||||
params.start = DateTime.fromJSDate(this.dateRange.startDate).toISO();
|
|
||||||
params.end = DateTime.fromJSDate(this.dateRange.endDate).toISO();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.$wrapWithLoading(
|
const fields = [
|
||||||
this.axios.get(this.apiUrl, {params: params})
|
{key: 'ip', label: $gettext('IP'), sortable: false},
|
||||||
).then((resp) => {
|
{key: 'time', label: $gettext('Time'), sortable: false},
|
||||||
this.listeners = resp.data;
|
{key: 'time_sec', label: $gettext('Time (sec)'), sortable: false},
|
||||||
|
{key: 'user_agent', isRowHeader: true, label: $gettext('User Agent'), sortable: false},
|
||||||
|
{key: 'stream', label: $gettext('Stream'), sortable: false},
|
||||||
|
{key: 'location', label: $gettext('Location'), sortable: false}
|
||||||
|
];
|
||||||
|
|
||||||
if (this.isLive) {
|
const exportUrl = computed(() => {
|
||||||
setTimeout(this.updateListeners, (!document.hidden) ? 15000 : 30000);
|
let exportUrl = new URL(props.apiUrl, document.location);
|
||||||
}
|
let exportUrlParams = exportUrl.searchParams;
|
||||||
}).catch((error) => {
|
exportUrlParams.set('format', 'csv');
|
||||||
if (this.isLive && (!error.response || error.response.data.code !== 403)) {
|
|
||||||
setTimeout(this.updateListeners, (!document.hidden) ? 30000 : 120000);
|
if (!isLive.value) {
|
||||||
}
|
exportUrlParams.set('start', DateTime.fromJSDate(dateRange.value.startDate).toISO());
|
||||||
});
|
exportUrlParams.set('end', DateTime.fromJSDate(dateRange.value.endDate).toISO());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return exportUrl.toString();
|
||||||
|
});
|
||||||
|
|
||||||
|
const totalListenerHours = computed(() => {
|
||||||
|
let tlh_seconds = 0;
|
||||||
|
listeners.value.forEach(function (listener) {
|
||||||
|
tlh_seconds += listener.connected_time;
|
||||||
|
});
|
||||||
|
|
||||||
|
let tlh_hours = tlh_seconds / 3600;
|
||||||
|
return Math.round((tlh_hours + 0.00001) * 100) / 100;
|
||||||
|
});
|
||||||
|
|
||||||
|
const {wrapWithLoading} = useNotify();
|
||||||
|
const {axios} = useAxios();
|
||||||
|
|
||||||
|
const updateListeners = () => {
|
||||||
|
let params = {};
|
||||||
|
if (!isLive.value) {
|
||||||
|
params.start = DateTime.fromJSDate(dateRange.value.startDate).toISO();
|
||||||
|
params.end = DateTime.fromJSDate(dateRange.value.endDate).toISO();
|
||||||
|
}
|
||||||
|
|
||||||
|
wrapWithLoading(
|
||||||
|
axios.get(props.apiUrl, {params: params})
|
||||||
|
).then((resp) => {
|
||||||
|
listeners.value = resp.data;
|
||||||
|
|
||||||
|
if (isLive.value) {
|
||||||
|
setTimeout(updateListeners, (!document.hidden) ? 15000 : 30000);
|
||||||
}
|
}
|
||||||
}
|
}).catch((error) => {
|
||||||
|
if (isLive.value && (!error.response || error.response.data.code !== 403)) {
|
||||||
|
setTimeout(updateListeners, (!document.hidden) ? 30000 : 120000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
onMounted(updateListeners);
|
||||||
|
|
||||||
|
const setIsLive = (newValue) => {
|
||||||
|
isLive.value = newValue;
|
||||||
|
updateListeners();
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -104,7 +104,7 @@
|
||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script setup>
|
||||||
import {DateTime} from "luxon";
|
import {DateTime} from "luxon";
|
||||||
import DateRangeDropdown from "~/components/Common/DateRangeDropdown";
|
import DateRangeDropdown from "~/components/Common/DateRangeDropdown";
|
||||||
import ListenersByTimePeriodTab from "./Overview/ListenersByTimePeriodTab";
|
import ListenersByTimePeriodTab from "./Overview/ListenersByTimePeriodTab";
|
||||||
|
@ -114,67 +114,51 @@ import CountriesTab from "./Overview/CountriesTab";
|
||||||
import StreamsTab from "./Overview/StreamsTab";
|
import StreamsTab from "./Overview/StreamsTab";
|
||||||
import ClientsTab from "./Overview/ClientsTab";
|
import ClientsTab from "./Overview/ClientsTab";
|
||||||
import ListeningTimeTab from "~/components/Stations/Reports/Overview/ListeningTimeTab";
|
import ListeningTimeTab from "~/components/Stations/Reports/Overview/ListeningTimeTab";
|
||||||
|
import {ref} from "vue";
|
||||||
|
|
||||||
/* TODO Options API */
|
const props = defineProps({
|
||||||
|
stationTimeZone: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
showFullAnalytics: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
listenersByTimePeriodUrl: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
bestAndWorstUrl: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
byStreamUrl: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
byClientUrl: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
byBrowserUrl: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
byCountryUrl: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
listeningTimeUrl: {
|
||||||
|
type: String,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
export default {
|
let nowTz = DateTime.now().setZone(props.stationTimeZone);
|
||||||
components: {
|
|
||||||
ListeningTimeTab,
|
|
||||||
ClientsTab,
|
|
||||||
StreamsTab,
|
|
||||||
CountriesTab,
|
|
||||||
BrowsersTab,
|
|
||||||
BestAndWorstTab,
|
|
||||||
ListenersByTimePeriodTab,
|
|
||||||
DateRangeDropdown
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
stationTimeZone: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
showFullAnalytics: {
|
|
||||||
type: Boolean,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
listenersByTimePeriodUrl: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
bestAndWorstUrl: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
byStreamUrl: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
byClientUrl: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
byBrowserUrl: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
byCountryUrl: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
listeningTimeUrl: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
let nowTz = DateTime.now().setZone(this.stationTimeZone);
|
|
||||||
|
|
||||||
return {
|
const dateRange = ref({
|
||||||
dateRange: {
|
startDate: nowTz.minus({days: 13}).toJSDate(),
|
||||||
startDate: nowTz.minus({days: 13}).toJSDate(),
|
endDate: nowTz.toJSDate(),
|
||||||
endDate: nowTz.toJSDate(),
|
});
|
||||||
},
|
|
||||||
};
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -77,104 +77,108 @@
|
||||||
</b-card>
|
</b-card>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script setup>
|
||||||
import DataTable from '~/components/Common/DataTable';
|
import DataTable from '~/components/Common/DataTable';
|
||||||
import Icon from "~/components/Common/Icon";
|
import Icon from "~/components/Common/Icon";
|
||||||
import {DateTime} from 'luxon';
|
import {DateTime} from 'luxon';
|
||||||
import {useAzuraCast} from "~/vendor/azuracast";
|
import {useAzuraCast} from "~/vendor/azuracast";
|
||||||
|
import {computed, ref} from "vue";
|
||||||
|
import {useTranslate} from "~/vendor/gettext";
|
||||||
|
import {useSweetAlert} from "~/vendor/sweetalert";
|
||||||
|
import {useNotify} from "~/vendor/bootstrapVue";
|
||||||
|
|
||||||
/* TODO Options API */
|
const props = defineProps({
|
||||||
|
listUrl: {
|
||||||
export default {
|
type: String,
|
||||||
name: 'StationRequests',
|
required: true
|
||||||
components: {DataTable, Icon},
|
|
||||||
props: {
|
|
||||||
listUrl: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
clearUrl: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
stationTimeZone: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
data() {
|
clearUrl: {
|
||||||
return {
|
type: String,
|
||||||
activeType: 'pending',
|
required: true
|
||||||
fields: [
|
|
||||||
{key: 'timestamp', label: this.$gettext('Date Requested'), sortable: false},
|
|
||||||
{key: 'played_at', label: this.$gettext('Date Played'), sortable: false},
|
|
||||||
{key: 'song_title', isRowHeader: true, label: this.$gettext('Song Title'), sortable: false},
|
|
||||||
{key: 'ip', label: this.$gettext('Requester IP'), sortable: false},
|
|
||||||
{key: 'actions', label: this.$gettext('Actions'), sortable: false}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
computed: {
|
stationTimeZone: {
|
||||||
tabs() {
|
type: String,
|
||||||
return [
|
required: true
|
||||||
{
|
|
||||||
type: 'pending',
|
|
||||||
title: this.$gettext('Pending Requests')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: 'history',
|
|
||||||
title: this.$gettext('Request History')
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
listUrlForType() {
|
|
||||||
return this.listUrl + '?type=' + this.activeType;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
setType(type) {
|
|
||||||
this.activeType = type;
|
|
||||||
this.relist();
|
|
||||||
},
|
|
||||||
relist() {
|
|
||||||
this.$refs.datatable.refresh();
|
|
||||||
},
|
|
||||||
formatTime(time) {
|
|
||||||
const {timeConfig} = useAzuraCast();
|
|
||||||
|
|
||||||
return DateTime.fromSeconds(time).setZone(this.stationTimeZone).toLocaleString(
|
|
||||||
{...DateTime.DATETIME_MED, ...timeConfig}
|
|
||||||
);
|
|
||||||
},
|
|
||||||
doDelete(url) {
|
|
||||||
this.$confirmDelete({
|
|
||||||
title: this.$gettext('Delete Request?'),
|
|
||||||
}).then((result) => {
|
|
||||||
if (result.value) {
|
|
||||||
this.$wrapWithLoading(
|
|
||||||
this.axios.delete(url)
|
|
||||||
).then((resp) => {
|
|
||||||
this.$notifySuccess(resp.data.message);
|
|
||||||
this.relist();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
doClear() {
|
|
||||||
this.$confirmDelete({
|
|
||||||
title: this.$gettext('Clear All Pending Requests?'),
|
|
||||||
confirmButtonText: this.$gettext('Clear'),
|
|
||||||
}).then((result) => {
|
|
||||||
if (result.value) {
|
|
||||||
this.$wrapWithLoading(
|
|
||||||
this.axios.post(this.clearUrl)
|
|
||||||
).then((resp) => {
|
|
||||||
this.$notifySuccess(resp.data.message);
|
|
||||||
this.relist();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const activeType = ref('pending');
|
||||||
|
|
||||||
|
const {$gettext} = useTranslate();
|
||||||
|
|
||||||
|
const fields = [
|
||||||
|
{key: 'timestamp', label: $gettext('Date Requested'), sortable: false},
|
||||||
|
{key: 'played_at', label: $gettext('Date Played'), sortable: false},
|
||||||
|
{key: 'song_title', isRowHeader: true, label: $gettext('Song Title'), sortable: false},
|
||||||
|
{key: 'ip', label: $gettext('Requester IP'), sortable: false},
|
||||||
|
{key: 'actions', label: $gettext('Actions'), sortable: false}
|
||||||
|
];
|
||||||
|
|
||||||
|
const tabs = [
|
||||||
|
{
|
||||||
|
type: 'pending',
|
||||||
|
title: $gettext('Pending Requests')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'history',
|
||||||
|
title: $gettext('Request History')
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
const listUrlForType = computed(() => {
|
||||||
|
return props.listUrl + '?type=' + activeType.value;
|
||||||
|
});
|
||||||
|
|
||||||
|
const $datatable = ref(); // Template Ref
|
||||||
|
|
||||||
|
const relist = () => {
|
||||||
|
$datatable.value.refresh();
|
||||||
|
};
|
||||||
|
|
||||||
|
const setType = (type) => {
|
||||||
|
activeType.value = type;
|
||||||
|
relist();
|
||||||
|
};
|
||||||
|
|
||||||
|
const formatTime = (time) => {
|
||||||
|
const {timeConfig} = useAzuraCast();
|
||||||
|
|
||||||
|
return DateTime.fromSeconds(time).setZone(props.stationTimeZone).toLocaleString(
|
||||||
|
{...DateTime.DATETIME_MED, ...timeConfig}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const {confirmDelete} = useSweetAlert();
|
||||||
|
const {wrapWithLoading, notifySuccess} = useNotify();
|
||||||
|
|
||||||
|
const doDelete = (url) => {
|
||||||
|
confirmDelete({
|
||||||
|
title: $gettext('Delete Request?'),
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.value) {
|
||||||
|
wrapWithLoading(
|
||||||
|
axios.delete(url)
|
||||||
|
).then((resp) => {
|
||||||
|
notifySuccess(resp.data.message);
|
||||||
|
relist();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const doClear = () => {
|
||||||
|
confirmDelete({
|
||||||
|
title: $gettext('Clear All Pending Requests?'),
|
||||||
|
confirmButtonText: $gettext('Clear'),
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.value) {
|
||||||
|
wrapWithLoading(
|
||||||
|
axios.post(props.clearUrl)
|
||||||
|
).then((resp) => {
|
||||||
|
notifySuccess(resp.data.message);
|
||||||
|
relist();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -17,71 +17,62 @@
|
||||||
</b-wrapped-form-group>
|
</b-wrapped-form-group>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script setup>
|
||||||
import BWrappedFormGroup from "~/components/Form/BWrappedFormGroup";
|
import BWrappedFormGroup from "~/components/Form/BWrappedFormGroup";
|
||||||
|
import {useTranslate} from "~/vendor/gettext";
|
||||||
|
|
||||||
/* TODO Options API */
|
const props = defineProps({
|
||||||
|
form: {
|
||||||
export default {
|
type: Object,
|
||||||
name: 'CommonRateLimitFields',
|
required: true
|
||||||
components: {BWrappedFormGroup},
|
|
||||||
props: {
|
|
||||||
form: {
|
|
||||||
type: Object,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
langSeconds() {
|
|
||||||
return this.$gettext('%{ seconds } seconds');
|
|
||||||
},
|
|
||||||
langMinutes() {
|
|
||||||
return this.$gettext('%{ minutes } minutes');
|
|
||||||
},
|
|
||||||
rateLimitOptions() {
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
text: this.$gettext('No Limit'),
|
|
||||||
value: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: this.$gettextInterpolate(this.langSeconds, {seconds: 15}),
|
|
||||||
value: 15,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: this.$gettextInterpolate(this.langSeconds, {seconds: 30}),
|
|
||||||
value: 30,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: this.$gettextInterpolate(this.langSeconds, {seconds: 60}),
|
|
||||||
value: 60,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: this.$gettextInterpolate(this.langMinutes, {minutes: 2}),
|
|
||||||
value: 120,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: this.$gettextInterpolate(this.langMinutes, {minutes: 5}),
|
|
||||||
value: 300,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: this.$gettextInterpolate(this.langMinutes, {minutes: 10}),
|
|
||||||
value: 600,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: this.$gettextInterpolate(this.langMinutes, {minutes: 15}),
|
|
||||||
value: 900,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: this.$gettextInterpolate(this.langMinutes, {minutes: 30}),
|
|
||||||
value: 1800,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: this.$gettextInterpolate(this.langMinutes, {minutes: 60}),
|
|
||||||
value: 3600,
|
|
||||||
}
|
|
||||||
];
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
|
const {$gettext, $gettextInterpolate} = useTranslate();
|
||||||
|
|
||||||
|
const langSeconds = $gettext('%{ seconds } seconds');
|
||||||
|
const langMinutes = $gettext('%{ minutes } minutes');
|
||||||
|
|
||||||
|
const rateLimitOptions = [
|
||||||
|
{
|
||||||
|
text: $gettext('No Limit'),
|
||||||
|
value: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: $gettextInterpolate(langSeconds, {seconds: 15}),
|
||||||
|
value: 15,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: $gettextInterpolate(langSeconds, {seconds: 30}),
|
||||||
|
value: 30,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: this.$gettextInterpolate(this.langSeconds, {seconds: 60}),
|
||||||
|
value: 60,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: $gettextInterpolate(langMinutes, {minutes: 2}),
|
||||||
|
value: 120,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: $gettextInterpolate(langMinutes, {minutes: 5}),
|
||||||
|
value: 300,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: $gettextInterpolate(langMinutes, {minutes: 10}),
|
||||||
|
value: 600,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: $gettextInterpolate(langMinutes, {minutes: 15}),
|
||||||
|
value: 900,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: $gettextInterpolate(langMinutes, {minutes: 30}),
|
||||||
|
value: 1800,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: $gettextInterpolate(langMinutes, {minutes: 60}),
|
||||||
|
value: 3600,
|
||||||
|
}
|
||||||
|
];
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -81,30 +81,23 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script setup>
|
||||||
import BWrappedFormGroup from "~/components/Form/BWrappedFormGroup";
|
import BWrappedFormGroup from "~/components/Form/BWrappedFormGroup";
|
||||||
import CommonFormattingInfo from "./FormattingInfo";
|
import CommonFormattingInfo from "./FormattingInfo";
|
||||||
import {includes} from 'lodash';
|
import {includes} from 'lodash';
|
||||||
|
|
||||||
/* TODO Options API */
|
const props = defineProps({
|
||||||
|
form: {
|
||||||
export default {
|
type: Object,
|
||||||
name: 'CommonSocialPostFields',
|
required: true
|
||||||
components: {CommonFormattingInfo, BWrappedFormGroup},
|
|
||||||
props: {
|
|
||||||
form: {
|
|
||||||
type: Object,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
nowPlayingUrl: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
methods: {
|
nowPlayingUrl: {
|
||||||
hasTrigger(trigger) {
|
type: String,
|
||||||
return includes(this.form.triggers.$model, trigger);
|
required: true
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
|
const hasTrigger = (trigger) => {
|
||||||
|
return includes(props.form.triggers.$model, trigger);
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user