ESLint prop, variable and other fixes.

This commit is contained in:
Buster Neece 2022-12-30 08:38:34 -06:00
parent e3b877cc9c
commit 64fbbe6fd8
No known key found for this signature in database
GPG Key ID: F1D2E64A0005E80E
190 changed files with 1906 additions and 715 deletions

View File

@ -4,7 +4,11 @@ module.exports = {
'plugin:vue/vue3-recommended'
],
rules: {
"vue/no-v-html": "off",
"vue/multi-word-component-names": "off",
"no-unused-vars": ["error", {
"varsIgnorePattern": "^_|props",
}],
"vue/html-indent": ["error", 4, {
"attribute": 1,
"baseIndent": 1,

View File

@ -52,6 +52,7 @@
"imports-loader": "^4",
"jquery": "^3.6.0",
"leaflet": "^1.7.1",
"leaflet-defaulticon-compatibility": "^0.1.1",
"leaflet.fullscreen": "^2",
"lodash": "^4.17.21",
"luxon": "^2",
@ -7271,6 +7272,11 @@
"resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.3.tgz",
"integrity": "sha512-iB2cR9vAkDOu5l3HAay2obcUHZ7xwUBBjph8+PGtmW/2lYhbLizWtG7nTeYht36WfOslixQF9D/uSIzhZgGMfQ=="
},
"node_modules/leaflet-defaulticon-compatibility": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/leaflet-defaulticon-compatibility/-/leaflet-defaulticon-compatibility-0.1.1.tgz",
"integrity": "sha512-vDBFdlUAwjSEGep9ih8kfJilf6yN8V9zTbF5NC/1ZwLeGko3RUQepspPnGCRMFV51dY3Lb3hziboicrFz+rxQA=="
},
"node_modules/leaflet.fullscreen": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/leaflet.fullscreen/-/leaflet.fullscreen-2.4.0.tgz",
@ -17324,6 +17330,11 @@
"resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.3.tgz",
"integrity": "sha512-iB2cR9vAkDOu5l3HAay2obcUHZ7xwUBBjph8+PGtmW/2lYhbLizWtG7nTeYht36WfOslixQF9D/uSIzhZgGMfQ=="
},
"leaflet-defaulticon-compatibility": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/leaflet-defaulticon-compatibility/-/leaflet-defaulticon-compatibility-0.1.1.tgz",
"integrity": "sha512-vDBFdlUAwjSEGep9ih8kfJilf6yN8V9zTbF5NC/1ZwLeGko3RUQepspPnGCRMFV51dY3Lb3hziboicrFz+rxQA=="
},
"leaflet.fullscreen": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/leaflet.fullscreen/-/leaflet.fullscreen-2.4.0.tgz",

View File

@ -53,6 +53,7 @@
"imports-loader": "^4",
"jquery": "^3.6.0",
"leaflet": "^1.7.1",
"leaflet-defaulticon-compatibility": "^0.1.1",
"leaflet.fullscreen": "^2",
"lodash": "^4.17.21",
"luxon": "^2",

View File

@ -237,11 +237,28 @@ import {useAxios} from "~/vendor/axios";
import {useSweetAlert} from "~/vendor/sweetalert";
const props = defineProps({
userUrl: String,
changePasswordUrl: String,
twoFactorUrl: String,
apiKeysApiUrl: String,
supportedLocales: Object
userUrl: {
type: String,
required: true,
},
changePasswordUrl: {
type: String,
required: true
},
twoFactorUrl: {
type: String,
required: true
},
apiKeysApiUrl: {
type: String,
required: true
},
supportedLocales: {
type: Object,
default: () => {
return {};
}
}
});
const userLoading = ref(true);

View File

@ -8,7 +8,7 @@
no-enforce-focus
@hidden="clearContents"
>
<template #default="slotProps">
<template #default>
<b-alert
variant="danger"
:show="error != null"
@ -78,7 +78,10 @@ import {useNotify} from "~/vendor/bootstrapVue";
import {useAxios} from "~/vendor/axios";
const props = defineProps({
createUrl: String
createUrl: {
type: String,
required: true
}
});
const emit = defineEmits(['relist']);

View File

@ -32,7 +32,10 @@
<script setup>
import CopyToClipboardButton from "~/components/Common/CopyToClipboardButton.vue";
const props = defineProps({
newKey: String
defineProps({
newKey: {
type: String,
required: true
}
});
</script>

View File

@ -60,7 +60,10 @@ import {useAxios} from "~/vendor/axios";
import {useTranslate} from "~/vendor/gettext";
const props = defineProps({
changePasswordUrl: String
changePasswordUrl: {
type: String,
required: true
}
});
const emit = defineEmits(['relist']);
@ -101,10 +104,6 @@ const open = () => {
$modal.value.show();
};
const close = () => {
$modal.value.hide();
}
const {wrapWithLoading} = useNotify();
const {axios} = useAxios();

View File

@ -37,10 +37,10 @@
<template #label>
{{ $gettext('Language') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="localeOptions"
/>
@ -55,10 +55,10 @@
<template #label>
{{ $gettext('Site Theme') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="themeOptions"
/>
@ -72,10 +72,10 @@
<template #label>
{{ $gettext('Time Display') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="show24hourOptions"
/>
@ -94,8 +94,14 @@ import {computed} from "vue";
import {useTranslate} from "~/vendor/gettext";
const props = defineProps({
form: Object,
supportedLocales: Object
form: {
type: Object,
required: true
},
supportedLocales: {
type: Object,
required: true
}
});
const {$gettext} = useTranslate();

View File

@ -26,8 +26,14 @@ import {useNotify} from "~/vendor/bootstrapVue";
import {useAxios} from "~/vendor/axios";
const props = defineProps({
userUrl: String,
supportedLocales: Object
userUrl: {
type: String,
required: true
},
supportedLocales: {
type: Object,
required: true
}
});
const emit = defineEmits(['reload']);

View File

@ -86,7 +86,10 @@ import {useNotify} from "~/vendor/bootstrapVue";
import {useAxios} from "~/vendor/axios";
const props = defineProps({
twoFactorUrl: String
twoFactorUrl: {
type: String,
required: true
}
});
const emit = defineEmits(['relist']);

View File

@ -41,8 +41,11 @@ import {useNotify} from "~/vendor/bootstrapVue";
import {useAxios} from "~/vendor/axios";
import {useTranslate} from "~/vendor/gettext";
const props = defineProps({
apiUrl: String
defineProps({
apiUrl: {
type: String,
required: true
}
});
const {$gettext} = useTranslate();

View File

@ -123,7 +123,10 @@ import DateRangeDropdown from "~/components/Common/DateRangeDropdown.vue";
import Icon from "~/components/Common/Icon.vue";
const props = defineProps({
baseApiUrl: String,
baseApiUrl: {
type: String,
required: true,
}
});
const dateRange = ref({

View File

@ -178,11 +178,26 @@ import {useAxios} from "~/vendor/axios";
import {useSweetAlert} from "~/vendor/sweetalert";
const props = defineProps({
listUrl: String,
settingsUrl: String,
runBackupUrl: String,
storageLocations: Object,
isDocker: Boolean,
listUrl: {
type: String,
required: true
},
settingsUrl: {
type: String,
required: true
},
runBackupUrl: {
type: String,
required: true
},
storageLocations: {
type: Object,
required: true
},
isDocker: {
type: Boolean,
default: true
},
});
const settingsLoading = ref(false);

View File

@ -41,11 +41,11 @@
<template #description>
{{ $gettext('If the end time is before the start time, the playlist will play overnight.') }}
</template>
<template #default="props">
<template #default="slotProps">
<time-code
:id="props.id"
v-model="props.field.$model"
:state="props.state"
:id="slotProps.id"
v-model="slotProps.field.$model"
:state="slotProps.state"
/>
</template>
</b-wrapped-form-group>
@ -90,10 +90,10 @@
<template #label>
{{ $gettext('Storage Location') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-select
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
:options="storageLocationOptions"
/>
</template>
@ -107,10 +107,10 @@
<template #label>
{{ $gettext('Backup Format') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="formatOptions"
/>
@ -135,14 +135,19 @@ import {useNotify} from "~/vendor/bootstrapVue";
import {useVuelidateOnForm} from "~/functions/useVuelidateOnForm";
const props = defineProps({
settingsUrl: String,
storageLocations: Object
settingsUrl: {
type: String,
required: true
},
storageLocations: {
type: Object,
required: true
}
});
const emit = defineEmits(['relist']);
const loading = ref(true);
const error = ref(null);
const $modal = ref(); // ModalForm

View File

@ -17,7 +17,10 @@
import {ref} from "vue";
const props = defineProps({
lastOutput: String,
lastOutput: {
type: String,
required: true
},
});
const $modal = ref(); // Template ref

View File

@ -7,7 +7,7 @@
:title="$gettext('Run Manual Backup')"
@hidden="clearContents"
>
<template #default="slotProps">
<template #default>
<b-alert
variant="danger"
:show="error != null"
@ -30,10 +30,10 @@
<template #label>
{{ $gettext('Storage Location') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-select
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
:options="storageLocationOptions"
/>
</template>
@ -132,8 +132,14 @@ import {useVuelidateOnForm} from "~/functions/useVuelidateOnForm";
import {BModal} from "bootstrap-vue";
const props = defineProps({
runBackupUrl: String,
storageLocations: Object
runBackupUrl: {
type: String,
required: true
},
storageLocations: {
type: Object,
required: true
}
});
const emit = defineEmits(['relist']);

View File

@ -44,11 +44,23 @@
import CustomAssetForm from "./Branding/CustomAssetForm.vue";
import BrandingForm from "./Branding/BrandingForm.vue";
const props = defineProps({
settingsApiUrl: String,
browserIconApiUrl: String,
backgroundApiUrl: String,
albumArtApiUrl: String
defineProps({
settingsApiUrl: {
type: String,
required: true,
},
browserIconApiUrl: {
type: String,
required: true
},
backgroundApiUrl: {
type: String,
required: true
},
albumArtApiUrl: {
type: String,
required: true
}
});
</script>

View File

@ -40,10 +40,10 @@
$gettext('Select a theme to use as a base for station public pages and the login page.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="publicThemeOptions"
/>
@ -124,10 +124,10 @@
$gettext('This CSS will be applied to the station public pages and login page.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<codemirror-textarea
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
mode="css"
/>
</template>
@ -146,10 +146,10 @@
$gettext('This javascript code will be applied to the station public pages and login page.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<codemirror-textarea
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
mode="javascript"
/>
</template>
@ -168,10 +168,10 @@
$gettext('This CSS will be applied to the main management pages, like this one.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<codemirror-textarea
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
mode="css"
/>
</template>
@ -205,7 +205,10 @@ import {useTranslate} from "~/vendor/gettext";
import {useVuelidateOnForm} from "~/functions/useVuelidateOnForm";
const props = defineProps({
apiUrl: String,
apiUrl: {
type: String,
required: true
},
});
const loading = ref(true);

View File

@ -43,9 +43,18 @@
export default {
name: 'CustomAssetForm',
props: {
id: String,
apiUrl: String,
caption: String
id: {
type: String,
required: true
},
apiUrl: {
type: String,
required: true
},
caption: {
type: String,
required: true
}
},
data() {
return {

View File

@ -79,8 +79,14 @@ import {useNotify} from "~/vendor/bootstrapVue";
import {useAxios} from "~/vendor/axios";
const props = defineProps({
listUrl: String,
autoAssignTypes: Object
listUrl: {
type: String,
required: true
},
autoAssignTypes: {
type: Object,
required: true
}
});
const {$gettext} = useTranslate();

View File

@ -27,7 +27,10 @@ export default defineComponent({
components: {AdminCustomFieldsForm},
mixins: [BaseEditModal],
props: {
autoAssignTypes: Object
autoAssignTypes: {
type: Object,
required: true
}
},
setup() {
const {form, resetForm, v$} = useVuelidateOnForm(

View File

@ -44,10 +44,10 @@
$gettext('Optionally select an ID3v2 metadata field that, if present, will be used to set this field\'s value.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-select
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
:options="autoAssignOptions"
/>
</template>
@ -63,8 +63,14 @@ import {useTranslate} from "~/vendor/gettext";
import {forEach} from "lodash";
const props = defineProps({
form: Object,
autoAssignTypes: Object
form: {
type: Object,
required: true
},
autoAssignTypes: {
type: Object,
required: true
}
});
const {$gettext} = useTranslate();

View File

@ -119,13 +119,16 @@ import {useTranslate} from "~/vendor/gettext";
import {useNotify} from "~/vendor/bootstrapVue";
const props = defineProps({
apiUrl: String
apiUrl: {
type: String,
required: true
}
});
const loading = ref(true);
const version = ref(null);
const {form, resetForm, v$} = useVuelidateOnForm(
const {form, v$} = useVuelidateOnForm(
{
key: {}
},

View File

@ -472,18 +472,26 @@
<script>
import Icon from '~/components/Common/Icon';
import InfoCard from '~/components/Common/InfoCard';
import CpuStatsHelpModal from "./Index/CpuStatsHelpModal";
import MemoryStatsHelpModal from "./Index/MemoryStatsHelpModal";
import _ from 'lodash';
export default {
name: 'AdminIndex',
components: {InfoCard, CpuStatsHelpModal, MemoryStatsHelpModal, Icon},
components: {CpuStatsHelpModal, MemoryStatsHelpModal, Icon},
props: {
adminPanels: Object,
statsUrl: String,
servicesUrl: String
adminPanels: {
type: Object,
required: true
},
statsUrl: {
type: String,
required: true
},
servicesUrl: {
type: String,
required: true
}
},
data() {
return {

View File

@ -49,9 +49,17 @@ import LogList from "~/components/Common/LogList";
import StreamingLogModal from "~/components/Common/StreamingLogModal";
import {ref} from "vue";
const props = defineProps({
systemLogsUrl: String,
stationLogs: Array
defineProps({
systemLogsUrl: {
type: String,
required: true,
},
stationLogs: {
type: Array,
default: () => {
return [];
}
}
});
const $modal = ref(); // StreamingLogModal

View File

@ -91,10 +91,22 @@ export default {
name: 'AdminPermissions',
components: {InfoCard, Icon, EditModal, DataTable},
props: {
listUrl: String,
stations: Array,
globalPermissions: Array,
stationPermissions: Array
listUrl: {
type: String,
required: true
},
stations: {
type: Array,
required: true
},
globalPermissions: {
type: Array,
required: true
},
stationPermissions: {
type: Array,
required: true
}
},
data() {
return {

View File

@ -39,9 +39,18 @@ export default {
components: {AdminPermissionsStationForm, AdminPermissionsGlobalForm},
mixins: [BaseEditModal],
props: {
stations: Object,
globalPermissions: Object,
stationPermissions: Object
stations: {
type: Object,
required: true
},
globalPermissions: {
type: Object,
required: true
},
stationPermissions: {
type: Object,
required: true
}
},
setup() {
const {form, resetForm, v$} = useVuelidateOnForm(

View File

@ -28,10 +28,10 @@
$gettext('Users with this role will have these permissions across the entire installation.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-checkbox-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
:options="globalPermissionOptions"
stacked
/>
@ -48,16 +48,22 @@ import {map} from 'lodash';
import {computed} from "vue";
const props = defineProps({
form: Object,
globalPermissions: Object
form: {
type: Object,
required: true
},
globalPermissions: {
type: Object,
required: true
}
});
const globalPermissionOptions = computed(() => {
return map(props.globalPermissions, (permissionName, permissionKey) => {
return {
text: permissionName,
value: permissionKey
};
});
return map(props.globalPermissions, (permissionName, permissionKey) => {
return {
text: permissionName,
value: permissionKey
};
});
});
</script>

View File

@ -37,9 +37,18 @@ import PermissionsFormStationRow from "~/components/Admin/Permissions/Form/Stati
import {computed} from "vue";
const props = defineProps({
form: Object,
stations: Object,
stationPermissions: Object
form: {
type: Object,
required: true
},
stations: {
type: Object,
required: true
},
stationPermissions: {
type: Object,
required: true
}
});
const remainingStations = computed(() => {

View File

@ -35,10 +35,10 @@
<template #description>
{{ $gettext('Users with this role will have these permissions for this single station.') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-checkbox-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
:options="stationPermissionOptions"
stacked
/>
@ -59,9 +59,18 @@ import {useVModel} from "@vueuse/core";
import {computed} from "vue";
const props = defineProps({
row: Object,
stations: Object,
stationPermissions: Object
row: {
type: Object,
required: true
},
stations: {
type: Object,
required: true
},
stationPermissions: {
type: Object,
required: true
}
});
const emit = defineEmits(['remove', 'update:row']);

View File

@ -91,9 +91,18 @@ import {useTranslate} from "~/vendor/gettext";
import {useVuelidateOnForm} from "~/functions/useVuelidateOnForm";
const props = defineProps({
apiUrl: String,
testMessageUrl: String,
acmeUrl: String,
apiUrl: {
type: String,
required: true,
},
testMessageUrl: {
type: String,
required: true
},
acmeUrl: {
type: String,
required: true
},
releaseChannel: {
type: String,
default: 'rolling',
@ -103,7 +112,7 @@ const props = defineProps({
const emit = defineEmits(['saved']);
const {form, resetForm, v$} = useVuelidateOnForm(
const {form, v$} = useVuelidateOnForm(
{
base_url: {required},
instance_name: {},

View File

@ -75,10 +75,10 @@
$gettext('Set longer to preserve more playback history and listener metadata for stations. Set shorter to save disk space.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="historyKeepDaysOptions"
/>
@ -126,7 +126,10 @@ import {computed} from "vue";
import {useTranslate} from "~/vendor/gettext";
const props = defineProps({
form: Object
form: {
type: Object,
required: true
}
});
const {$gettext} = useTranslate();

View File

@ -18,10 +18,10 @@
$gettext('Aggregate listener statistics are used to show station reports across the system. IP-based listener statistics are used to view live listener tracking and may be required for royalty reports.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
>
<b-form-radio value="all">
@ -100,6 +100,9 @@ import BFormFieldset from "~/components/Form/BFormFieldset.vue";
import BWrappedFormCheckbox from "~/components/Form/BWrappedFormCheckbox.vue";
const props = defineProps({
form: Object
form: {
type: Object,
required: true
}
});
</script>

View File

@ -229,10 +229,10 @@
<template #label>
{{ $gettext('Avatar Service') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="avatarServiceOptions"
/>
@ -318,10 +318,22 @@ import {useNotify} from "~/vendor/bootstrapVue";
import {useAxios} from "~/vendor/axios";
const props = defineProps({
form: Object,
releaseChannel: String,
testMessageUrl: String,
acmeUrl: String,
form: {
type: Object,
required: true
},
releaseChannel: {
type: String,
required: true
},
testMessageUrl: {
type: String,
required: true
},
acmeUrl: {
type: String,
required: true
},
});
const {$gettext} = useTranslate();

View File

@ -44,10 +44,13 @@ import {useVuelidateOnForm} from "~/functions/useVuelidateOnForm";
import {BModal} from "bootstrap-vue";
const props = defineProps({
testMessageUrl: String
testMessageUrl: {
type: String,
required: true
}
});
const {form, resetForm, v$} = useVuelidateOnForm(
const {form, v$} = useVuelidateOnForm(
{
emailAddress: {required, email}
},

View File

@ -90,7 +90,10 @@ import {useTranslate} from "~/vendor/gettext";
import {useAxios} from "~/vendor/axios";
const props = defineProps({
apiUrl: String
apiUrl: {
type: String,
required: true
}
});
const loading = ref(true);

View File

@ -87,7 +87,6 @@
<script>
import DataTable from '~/components/Common/DataTable';
import Icon from '~/components/Common/Icon';
import InfoCard from '~/components/Common/InfoCard';
import AdminStationsEditModal from "./Stations/EditModal";
import _ from "lodash";
import AdminStationsCloneModal from "./Stations/CloneModal";
@ -95,12 +94,21 @@ import stationFormProps from "./Stations/stationFormProps";
export default {
name: 'AdminPermissions',
components: {AdminStationsCloneModal, AdminStationsEditModal, InfoCard, Icon, DataTable},
components: {AdminStationsCloneModal, AdminStationsEditModal, Icon, DataTable},
props: {
...stationFormProps,
listUrl: String,
frontendTypes: Object,
backendTypes: Object
listUrl: {
type: String,
required: true
},
frontendTypes: {
type: Object,
required: true
},
backendTypes: {
type: Object,
required: true
}
},
data() {
return {

View File

@ -29,10 +29,10 @@
<template #label>
{{ $gettext('Copy to New Station') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-checkbox-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
:options="cloneOptions"
stacked
/>
@ -47,7 +47,10 @@ import {computed} from "vue";
import {useTranslate} from "~/vendor/gettext";
const props = defineProps({
form: Object
form: {
type: Object,
required: true
}
});
const {$gettext} = useTranslate();

View File

@ -17,8 +17,8 @@
:is-edit-mode="isEditMode"
@error="close"
@submitted="onSubmit"
@validUpdate="onValidUpdate"
@loadingUpdate="onLoadingUpdate"
@valid-update="onValidUpdate"
@loading-update="onLoadingUpdate"
>
<template #submitButton>
<invisible-submit-button />
@ -54,7 +54,10 @@ import stationFormProps from "~/components/Admin/Stations/stationFormProps";
const props = defineProps({
...stationFormProps,
createUrl: String
createUrl: {
type: String,
required: true
}
});
const emit = defineEmits(['relist']);

View File

@ -48,10 +48,10 @@
<template #label>
{{ $gettext('Media Storage Location') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-select
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
:options="storageLocationOptions.media_storage_location"
/>
</template>
@ -65,10 +65,10 @@
<template #label>
{{ $gettext('Live Recordings Storage Location') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-select
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
:options="storageLocationOptions.recordings_storage_location"
/>
</template>
@ -82,10 +82,10 @@
<template #label>
{{ $gettext('Podcasts Storage Location') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-select
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
:options="storageLocationOptions.podcasts_storage_location"
/>
</template>
@ -105,9 +105,18 @@ import {onMounted, reactive, ref} from "vue";
import {useAxios} from "~/vendor/axios";
const props = defineProps({
form: Object,
isEditMode: Boolean,
storageLocationApiUrl: String,
form: {
type: Object,
required: true
},
isEditMode: {
type: Boolean,
required: true
},
storageLocationApiUrl: {
type: String,
required: true
},
showAdvanced: {
type: Boolean,
default: true

View File

@ -14,10 +14,10 @@
$gettext('This software shuffles from playlists of music constantly and plays when no other radio source is available.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="backendTypeOptions"
/>
@ -42,10 +42,10 @@
$gettext('Choose a method to use when transitioning from one song to another. Smart Mode considers the volume of the two tracks when fading for a smoother effect, but requires more CPU resources.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="crossfadeOptions"
/>
@ -81,10 +81,10 @@
$gettext('Choose a method to use for processing audio which produces a more uniform and "full" sound for your station.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="audioProcessingOptions"
/>
@ -233,10 +233,10 @@
$gettext('For most cases, use the default UTF-8 encoding. The older ISO-8859-1 encoding can be used if accepting connections from Shoutcast 1 DJs or using other legacy software.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="charsetOptions"
/>
@ -257,10 +257,10 @@
$gettext('If your installation is constrained by CPU or memory, you can change this setting to tune the resources used by Liquidsoap.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="performanceModeOptions"
/>
@ -305,12 +305,18 @@ import {computed} from "vue";
import {useTranslate} from "~/vendor/gettext";
const props = defineProps({
form: Object,
station: Object,
isStereoToolInstalled: {
type: Boolean,
default: true
},
form: {
type: Object,
required: true
},
station: {
type: Object,
required: true
},
isStereoToolInstalled: {
type: Boolean,
default: true
},
showAdvanced: {
type: Boolean,
default: true

View File

@ -12,10 +12,10 @@
<template #description>
{{ $gettext('This software delivers your broadcast to the listening audience.') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="frontendTypeOptions"
/>
@ -176,10 +176,10 @@
<template #description>
{{ $gettext('Select the countries that are not allowed to connect to the streams.') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-select
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
:options="countryOptions"
style="min-height: 300px;"
multiple
@ -236,12 +236,18 @@ import {computed} from "vue";
import {useTranslate} from "~/vendor/gettext";
const props = defineProps({
form: Object,
isShoutcastInstalled: {
type: Boolean,
default: false
form: {
type: Object,
required: true
},
isShoutcastInstalled: {
type: Boolean,
default: false
},
countries: {
type: Object,
required: true
},
countries: Object,
showAdvanced: {
type: Boolean,
default: true

View File

@ -104,10 +104,16 @@ import BackendDisabled from "./Common/BackendDisabled.vue";
import {computed} from "vue";
const props = defineProps({
form: Object,
station: Object,
showAdvanced: {
type: Boolean,
form: {
type: Object,
required: true
},
station: {
type: Object,
required: true
},
showAdvanced: {
type: Boolean,
default: true
},
});

View File

@ -61,10 +61,10 @@
$gettext('Scheduled playlists and other timed items will be controlled by this time zone.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-select
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
:options="timezoneOptions"
/>
</template>
@ -117,10 +117,10 @@
$gettext('Customize the number of songs that will appear in the "Song History" section for this station and in all public APIs.')
}}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-select
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
:options="historyItemsOptions"
/>
</template>
@ -198,8 +198,14 @@ import {computed} from "vue";
import {useTranslate} from "~/vendor/gettext";
const props = defineProps({
form: Object,
timezones: Object,
form: {
type: Object,
required: true
},
timezones: {
type: Object,
required: true
},
showAdvanced: {
type: Boolean,
default: true

View File

@ -80,10 +80,16 @@ import BackendDisabled from "./Common/BackendDisabled.vue";
import {computed} from "vue";
const props = defineProps({
form: Object,
station: Object,
showAdvanced: {
type: Boolean,
form: {
type: Object,
required: true
},
station: {
type: Object,
required: true
},
showAdvanced: {
type: Boolean,
default: true
},
});

View File

@ -55,10 +55,10 @@
{{ $gettext('Live Broadcast Recording Format') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="recordStreamsOptions"
/>
@ -74,10 +74,10 @@
{{ $gettext('Live Broadcast Recording Bitrate (kbps)') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:options="recordBitrateOptions"
/>
@ -178,10 +178,16 @@ import BackendDisabled from "./Common/BackendDisabled.vue";
import {computed} from "vue";
const props = defineProps({
form: Object,
station: Object,
showAdvanced: {
type: Boolean,
form: {
type: Object,
required: true
},
station: {
type: Object,
required: true
},
showAdvanced: {
type: Boolean,
default: true
},
});

View File

@ -158,9 +158,18 @@ import stationFormProps from "~/components/Admin/Stations/stationFormProps";
const props = defineProps({
...stationFormProps,
createUrl: String,
editUrl: String,
isEditMode: Boolean,
createUrl: {
type: String,
required: true
},
editUrl: {
type: String,
required: true
},
isEditMode: {
type: Boolean,
required: true
},
isModal: {
type: Boolean,
default: false

View File

@ -100,7 +100,10 @@ import {useNotify} from "~/vendor/bootstrapVue";
import {useAxios} from "~/vendor/axios";
const props = defineProps({
apiUrl: String
apiUrl: {
type: String,
required: true
}
});
const loading = ref(true);

View File

@ -103,7 +103,10 @@ export default {
name: 'AdminStorageLocations',
components: {Icon, EditModal, DataTable},
props: {
listUrl: String
listUrl: {
type: String,
required: true
}
},
data() {
return {

View File

@ -25,7 +25,10 @@ export default {
components: {StorageLocationForm},
mixins: [BaseEditModal],
props: {
type: String
type: {
type: String,
required: true
}
},
setup() {
const blankForm = {

View File

@ -9,10 +9,10 @@
<template #label>
{{ $gettext('Storage Adapter') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
>
<b-form-radio value="local">
@ -258,6 +258,9 @@
import BWrappedFormGroup from "~/components/Form/BWrappedFormGroup.vue";
const props = defineProps({
form: Object
form: {
type: Object,
required: true
}
});
</script>

View File

@ -90,14 +90,19 @@
import DataTable from '~/components/Common/DataTable';
import EditModal from './Users/EditModal';
import Icon from '~/components/Common/Icon';
import InfoCard from '~/components/Common/InfoCard';
export default {
name: 'AdminPermissions',
components: {InfoCard, Icon, EditModal, DataTable},
components: {Icon, EditModal, DataTable},
props: {
listUrl: String,
roles: Object
listUrl: {
type: String,
required: true
},
roles: {
type: Object,
required: true
}
},
data() {
return {

View File

@ -29,7 +29,10 @@ export default {
components: {AdminUsersForm},
mixins: [BaseEditModal],
props: {
roles: Object
roles: {
type: Object,
required: true
}
},
setup() {
return {v$: useVuelidate()}

View File

@ -24,7 +24,7 @@
</template>
<template
v-if="isEditMode"
#description="{lang}"
#description
>
{{ $gettext('Leave blank to use the current password.') }}
</template>
@ -48,10 +48,10 @@
<template #label>
{{ $gettext('Roles') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-checkbox-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
:options="roleOptions"
/>
</template>
@ -66,9 +66,18 @@ import objectToFormOptions from "~/functions/objectToFormOptions";
import {computed} from "vue";
const props = defineProps({
form: Object,
roles: Object,
isEditMode: Boolean
form: {
type: Object,
required: true
},
roles: {
type: Object,
required: true
},
isEditMode: {
type: Boolean,
required: true
}
});
const roleOptions = computed(() => {

View File

@ -19,7 +19,10 @@
import {computed} from "vue";
const props = defineProps({
src: String,
src: {
type: String,
required: true
},
width: {
type: Number,
default: 40

View File

@ -14,7 +14,10 @@ import {defineComponent} from "vue";
export default defineComponent({
props: {
title: String,
title: {
type: String,
required: true
},
volume: {
type: Number,
default: 55

View File

@ -20,9 +20,18 @@ import {useTranslate} from "~/vendor/gettext";
import {computed} from "vue";
const props = defineProps({
url: String,
service: String,
serviceUrl: String,
url: {
type: String,
required: true
},
service: {
type: String,
required: true
},
serviceUrl: {
type: String,
required: true
},
width: {
type: Number,
default: 64

View File

@ -10,7 +10,10 @@ import {computed} from "vue";
import {useGettext} from "vue3-gettext";
const props = defineProps({
enabled: Boolean
enabled: {
type: Boolean,
required: true
}
});
const badgeClass = computed(() => {

View File

@ -10,7 +10,10 @@ import {computed} from "vue";
import {useGettext} from "vue3-gettext";
const props = defineProps({
running: Boolean
running: {
type: Boolean,
required: true
}
});
const badgeClass = computed(() => {

View File

@ -11,7 +11,10 @@ export default {
name: 'BaseEditModal',
components: {ModalForm},
props: {
createUrl: String
createUrl: {
type: String,
required: true
}
},
emits: ['relist'],
setup() {

View File

@ -9,11 +9,21 @@ import {Tableau20} from "~/vendor/chartjs-colorschemes/colorschemes.tableau";
import {Chart} from "chart.js";
import {useTranslate} from "~/vendor/gettext";
import {onMounted, onUnmounted, ref} from "vue";
import {defaultsDeep} from "lodash";
const props = defineProps({
options: Object,
data: Array,
labels: Array
options: {
type: Object,
required: true
},
data: {
type: Array,
default: []
},
labels: {
type: Array,
default: []
}
});
let $chart = null;
@ -58,7 +68,7 @@ onMounted(() => {
$chart.destroy();
}
let chartOptions = _.defaultsDeep({}, props.options, defaultOptions);
let chartOptions = defaultsDeep({}, props.options, defaultOptions);
$chart = new Chart($canvas.value.getContext('2d'), chartOptions);
});

View File

@ -8,11 +8,21 @@
import {Tableau20} from "~/vendor/chartjs-colorschemes/colorschemes.tableau";
import {Chart} from "chart.js";
import {onMounted, onUnmounted, ref} from "vue";
import {defaultsDeep} from "lodash";
const props = defineProps({
options: Object,
data: Array,
labels: Array,
options: {
type: Object,
required: true
},
data: {
type: Array,
default: []
},
labels: {
type: Array,
default: []
},
aspectRatio: {
type: Number,
default: 2
@ -43,7 +53,7 @@ onMounted(() => {
$chart.destroy();
}
let chartOptions = _.defaultsDeep({}, props.options, defaultOptions);
let chartOptions = defaultsDeep({}, props.options, defaultOptions);
$chart = new Chart($canvas.value.getContext('2d'), chartOptions);
});

View File

@ -14,8 +14,14 @@ import {onMounted, onUnmounted, ref} from "vue";
import {useTranslate} from "~/vendor/gettext";
const props = defineProps({
options: Object,
data: Array
options: {
type: Object,
required: true
},
data: {
type: Array,
default: []
}
});
const $canvas = ref(); // Template ref

View File

@ -16,8 +16,14 @@ import {javascript} from "@codemirror/lang-javascript";
import {useAzuraCast} from "~/vendor/azuracast";
const props = defineProps({
modelValue: String,
mode: String
modelValue: {
type: String,
required: true
},
mode: {
type: String,
required: true
}
});
const emit = defineEmits(['update:modelValue']);

View File

@ -123,6 +123,8 @@
<b-table
ref="table"
v-model:current-page="currentPage"
v-model:sort-by="sortBy"
v-model:sort-desc="sortDesc"
show-empty
striped
hover
@ -138,12 +140,10 @@
:no-provider-sorting="handleClientSide"
:no-provider-filtering="handleClientSide"
tbody-tr-class="align-middle"
@row-selected="onRowSelected"
thead-tr-class="align-middle"
selected-variant=""
:filter="filter"
v-model:sort-by="sortBy"
v-model:sort-desc="sortDesc"
@row-selected="onRowSelected"
@filtered="onFiltered"
@refreshed="onRefreshed"
@sort-changed="onSortChanged"
@ -217,7 +217,7 @@
<script>
import store from 'store';
import _ from 'lodash';
import {forEach, filter, map} from 'lodash';
import Icon from './Icon.vue';
import {defineComponent} from "vue";
@ -225,7 +225,10 @@ export default defineComponent({
name: 'DataTable',
components: {Icon},
props: {
id: String,
id: {
type: String,
required: true
},
apiUrl: {
type: String,
default: null
@ -254,7 +257,10 @@ export default defineComponent({
type: Number,
default: 10
},
fields: Array,
fields: {
type: Array,
required: true
},
selectable: {
type: Boolean,
default: false
@ -267,12 +273,25 @@ export default defineComponent({
type: Boolean,
default: false
},
requestConfig: Function,
requestProcess: Function
requestConfig: {
type: Function,
default: () => {
}
},
requestProcess: {
type: Function,
default: () => {
}
}
},
emits: [
'refreshed',
'row-selected',
'filtered'
],
data() {
let allFields = [];
_.forEach(this.fields, function (field) {
forEach(this.fields, function (field) {
allFields.push({
...{
label: '',
@ -345,7 +364,7 @@ export default defineComponent({
return fields;
}
return _.filter(fields, (field) => {
return filter(fields, (field) => {
if (!field.selectable) {
return true;
}
@ -354,7 +373,7 @@ export default defineComponent({
});
},
selectableFields() {
return _.filter(this.allFields.slice(), (field) => {
return filter(this.allFields.slice(), (field) => {
return field.selectable;
});
},
@ -394,7 +413,7 @@ export default defineComponent({
this.perPage = _.defaultTo(settings.perPage, this.defaultPerPage);
_.forEach(this.selectableFields, (field) => {
forEach(this.selectableFields, (field) => {
field.visible = _.includes(settings.visibleFields, field.key);
});
@ -413,7 +432,7 @@ export default defineComponent({
'perPage': this.perPage,
'sortBy': this.sortBy,
'sortDesc': this.sortDesc,
'visibleFields': _.map(this.visibleFields, 'key')
'visibleFields': map(this.visibleFields, 'key')
};
store.set(this.storeKey, settings);

View File

@ -84,7 +84,7 @@ export default {
get() {
return this.modelValue;
},
set(newValue) {
set() {
// Noop
}
},

View File

@ -74,10 +74,13 @@ import {useAzuraCast} from "~/vendor/azuracast";
import {useTranslate} from "~/vendor/gettext";
const props = defineProps({
targetUrl: String,
allowMultiple: {
type: Boolean,
default: false
targetUrl: {
type: String,
required: true
},
allowMultiple: {
type: Boolean,
default: false
},
validMimeTypes: {
type: Array,
@ -183,7 +186,7 @@ onMounted(() => {
flow.on('error', (message, file, chunk) => {
console.error(message, file, chunk);
let messageText = $gettext('Could not upload file.');
let messageText = $gettext('Could not upload file.');
try {
if (typeof message !== 'undefined') {
let messageJson = JSON.parse(message);
@ -195,6 +198,7 @@ onMounted(() => {
}
}
} catch (e) {
// Noop
}
files.get(file).error = messageText;

View File

@ -17,7 +17,10 @@
export default {
name: 'LogList',
props: {
url: String,
url: {
type: String,
required: true
},
},
emits: ['view'],
data() {

View File

@ -109,7 +109,8 @@ export default defineComponent({
default: false,
},
error: {
type: String
type: String,
default: null
}
},
emits: ['submit', 'shown', 'hidden'],

View File

@ -20,7 +20,10 @@ import {useTranslate} from "~/vendor/gettext";
import getUrlWithoutQuery from "~/functions/getUrlWithoutQuery";
const props = defineProps({
url: String,
url: {
type: String,
required: true
},
isStream: {
type: Boolean,
default: false
@ -29,7 +32,10 @@ const props = defineProps({
type: Boolean,
default: false
},
iconClass: String
iconClass: {
type: String,
default: null
}
});
const $store = usePlayerStore();

View File

@ -15,8 +15,14 @@ import {shallowRef} from "vue";
import {useAzuraCast} from "~/vendor/azuracast";
const props = defineProps({
scheduleUrl: String,
stationTimeZone: String
scheduleUrl: {
type: String,
required: true
},
stationTimeZone: {
type: String,
required: true
}
});
const emit = defineEmits(['click']);

View File

@ -14,7 +14,10 @@ import {computed} from "vue";
import _ from 'lodash';
const props = defineProps({
modelValue: String
modelValue: {
type: String,
required: true
}
});
const emit = defineEmits(['update:modelValue']);

View File

@ -78,8 +78,14 @@ import {onMounted, onUnmounted, ref, watch} from "vue";
import {useAxios} from "~/vendor/axios";
const props = defineProps({
audioUrl: String,
waveformUrl: String
audioUrl: {
type: String,
required: true
},
waveformUrl: {
type: String,
required: true
}
});
const emit = defineEmits(['ready']);

View File

@ -332,16 +332,46 @@ import AlbumArt from "~/components/Common/AlbumArt";
export default {
components: {PlayButton, Avatar, Icon, DataTable, TimeSeriesChart, AlbumArt},
props: {
userUrl: String,
profileUrl: String,
adminUrl: String,
showAdmin: Boolean,
notificationsUrl: String,
showCharts: Boolean,
chartsUrl: String,
manageStationsUrl: String,
stationsUrl: String,
showAlbumArt: Boolean
userUrl: {
type: String,
required: true
},
profileUrl: {
type: String,
required: true
},
adminUrl: {
type: String,
required: true
},
showAdmin: {
type: Boolean,
required: true
},
notificationsUrl: {
type: String,
required: true
},
showCharts: {
type: Boolean,
required: true
},
chartsUrl: {
type: String,
required: true
},
manageStationsUrl: {
type: String,
required: true
},
stationsUrl: {
type: String,
required: true
},
showAlbumArt: {
type: Boolean,
required: true
}
},
data() {
return {

View File

@ -69,6 +69,7 @@ const props = defineProps({
},
name: {
type: String,
required: true,
},
field: {
type: Object,

View File

@ -94,6 +94,7 @@ const props = defineProps({
},
name: {
type: String,
required: true
},
field: {
type: Object,

View File

@ -12,7 +12,10 @@ import {get, map} from "lodash";
import {computed} from "vue";
const props = defineProps({
field: Object
field: {
type: Object,
required: true
}
});
const {$gettext} = useTranslate();

View File

@ -29,7 +29,10 @@
import {DateTime} from "luxon";
const props = defineProps({
history: Array,
history: {
type: Array,
default: []
},
showAlbumArt: {
type: Boolean,
default: true

View File

@ -18,7 +18,10 @@
import SongHistory from './SongHistory';
const props = defineProps({
history: Array,
history: {
type: Array,
default: []
},
showAlbumArt: {
type: Boolean,
default: true

View File

@ -95,10 +95,22 @@ import PlayButton from "~/components/Common/PlayButton";
import {useTranslate} from "~/vendor/gettext";
const props = defineProps({
listUrl: String,
stationName: String,
customFields: Array,
showDownloadButton: Boolean
listUrl: {
type: String,
required: true
},
stationName: {
type: String,
required: true
},
customFields: {
type: Array,
default: []
},
showDownloadButton: {
type: Boolean,
default: false
}
});
const {$gettext} = useTranslate();

View File

@ -44,9 +44,18 @@
import Schedule from '~/components/Common/ScheduleView';
const props = defineProps({
scheduleUrl: String,
stationName: String,
stationTimeZone: String
scheduleUrl: {
type: String,
required: true
},
stationName: {
type: String,
required: true
},
stationTimeZone: {
type: String,
required: true
}
});
</script>

View File

@ -58,9 +58,18 @@ export default {
};
},
props: {
stationName: String,
libUrls: Array,
baseUri: String
stationName: {
type: String,
required: true
},
libUrls: {
type: Array,
default: []
},
baseUri: {
type: String,
required: true
}
},
data: function () {
return {

View File

@ -183,7 +183,10 @@ export default {
components: {VolumeSlider, Icon},
extends: track,
props: {
id: String
id: {
type: String,
required: true
}
},
data() {
return {

View File

@ -313,9 +313,18 @@
export default {
inject: ['getStream', 'resumeStream'],
props: {
stationName: String,
libUrls: Array,
baseUri: String
stationName: {
type: String,
required: true
},
libUrls: {
type: Array,
default: []
},
baseUri: {
type: String,
required: true
}
},
data () {
return {

View File

@ -26,7 +26,10 @@ import {onMounted, ref} from "vue";
import {useVModel} from "@vueuse/core";
const props = defineProps({
modelValue: String
modelValue: {
type: String,
required: true
}
});
const emit = defineEmits(['update:modelValue']);

View File

@ -72,11 +72,17 @@ import {required} from '@vuelidate/validators';
import {useVuelidateOnForm} from "~/functions/useVuelidateOnForm";
const props = defineProps({
csrf: String,
error: String,
csrf: {
type: String,
required: true
},
error: {
type: String,
default: null
},
});
const {form, v$} = useVuelidateOnForm(
const {v$} = useVuelidateOnForm(
{
password: {required, validatePassword}
},

View File

@ -104,8 +104,14 @@ import validatePassword from "~/functions/validatePassword";
import useVuelidate from "@vuelidate/core";
const props = defineProps({
csrf: String,
error: String,
csrf: {
type: String,
required: true
},
error: {
type: String,
default: null
},
});
const form = reactive({

View File

@ -29,7 +29,10 @@ import SetupStep from "./SetupStep";
import InfoCard from "~/components/Common/InfoCard";
const props = defineProps({
apiUrl: String,
apiUrl: {
type: String,
required: true
},
releaseChannel: {
type: String,
default: 'rolling',

View File

@ -39,7 +39,10 @@
import Icon from "~/components/Common/Icon";
const props = defineProps({
step: Number
step: {
type: Number,
default: 1
}
});
const getStepperClass = (currentStep) => {

View File

@ -37,7 +37,10 @@ import stationFormProps from "~/components/Admin/Stations/stationFormProps";
const props = defineProps({
...stationFormProps,
createUrl: String,
createUrl: {
type: String,
required: true
},
continueUrl: {
type: String,
required: true

View File

@ -155,13 +155,13 @@
</template>
<script>
import FlowUpload from '~/components/Common/FlowUpload';
export default {
name: 'StationsBulkMedia',
components: {FlowUpload},
props: {
apiUrl: String
apiUrl: {
type: String,
required: true
}
},
data() {
return {

View File

@ -74,8 +74,14 @@ import {ref} from "vue";
import {useAxios} from "~/vendor/axios";
const props = defineProps({
apiUrl: String,
recordHasFallback: Boolean
apiUrl: {
type: String,
required: true
},
recordHasFallback: {
type: Boolean,
required: true
}
});
const hasFallback = ref(props.recordHasFallback);

View File

@ -64,7 +64,10 @@ import LogList from "~/components/Common/LogList";
import {ref} from "vue";
const props = defineProps({
logsUrl: String,
logsUrl: {
type: String,
required: true
},
});
const $modal = ref(); // BModal

View File

@ -85,7 +85,10 @@ import {useAxios} from "~/vendor/axios";
const props = defineProps({
...mayNeedRestartProps,
listUrl: String
listUrl: {
type: String,
required: true
}
});
const {$gettext} = useTranslate();

View File

@ -28,7 +28,7 @@ export default {
name: 'EditModal',
components: {FormBasicInfo},
mixins: [BaseEditModal],
emits: ['needs-restart'],
emits: ['relist', 'needs-restart'],
setup() {
const {form, resetForm, v$} = useVuelidateOnForm(
{

View File

@ -28,12 +28,12 @@
<template #label>
{{ $gettext('Audio Format') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:state="props.state"
:state="slotProps.state"
:options="formatOptions"
/>
</template>
@ -46,12 +46,12 @@
<template #label>
{{ $gettext('Audio Bitrate (kbps)') }}
</template>
<template #default="props">
<template #default="slotProps">
<b-form-radio-group
:id="props.id"
v-model="props.field.$model"
:id="slotProps.id"
v-model="slotProps.field.$model"
stacked
:state="props.state"
:state="slotProps.state"
:options="bitrateOptions"
/>
</template>
@ -66,8 +66,14 @@ import BWrappedFormGroup from "~/components/Form/BWrappedFormGroup";
import {map} from "lodash";
const props = defineProps({
form: Object,
stationFrontendType: String
form: {
type: Object,
required: true
},
stationFrontendType: {
type: String,
required: true
}
});
const formatOptions = [

View File

@ -84,9 +84,18 @@ import {useNotify} from "~/vendor/bootstrapVue";
const props = defineProps({
...mayNeedRestartProps,
settingsUrl: String,
config: Array,
sections: Array,
settingsUrl: {
type: String,
required: true
},
config: {
type: Array,
required: true
},
sections: {
type: Array,
required: true
},
});
const buildForm = () => {

View File

@ -303,10 +303,22 @@ export default {
required: false,
default: () => []
},
stationTimeZone: String,
showSftp: Boolean,
sftpUrl: String,
supportsImmediateQueue: Boolean
stationTimeZone: {
type: String,
required: true
},
showSftp: {
type: Boolean,
default: true
},
sftpUrl: {
type: String,
required: true
},
supportsImmediateQueue: {
type: Boolean,
required: true
}
},
data() {
let fields = [

View File

@ -7,7 +7,10 @@
href="#"
@click.prevent="changeDirectory('')"
>{{ $gettext('Home') }}</a>
<template v-for="part in directoryParts">
<template
v-for="part in directoryParts"
:key="part.dir"
>
&blacktriangleright;
<a
href="#"
@ -21,7 +24,10 @@
import {computed} from "vue";
const props = defineProps({
currentDirectory: String
currentDirectory: {
type: String,
required: true
}
});
const emit = defineEmits(['change-directory']);

View File

@ -90,8 +90,14 @@ import {useAxios} from "~/vendor/axios";
import {useNotify} from "~/vendor/bootstrapVue";
const props = defineProps({
customFields: Array,
playlists: Array
customFields: {
type: Array,
required: true
},
playlists: {
type: Array,
required: true
}
});
const emit = defineEmits(['relist']);

Some files were not shown because too many files have changed in this diff Show More