All checks were successful
CI / container-job (push) Successful in 41s
- adonisrc.ts: Load official drive_provider and unload custom driver_provider. - packages.json: Add @headlessui/vue dependency for tab components. - AvatarController.ts: Rewrite avatar generation logic to always return the same avatar per user. - auth/UserController.ts: Add profile and profileUpdate methods to support user profile editing. - Submitter/datasetController.ts & app/models/file.ts: Adapt code to use the official drive_provider. - app/models/user.ts: Introduce “isAdmin” getter. - config/drive.ts: Create new configuration for the official drive_provider. - providers/vinejs_provider.ts: Adapt allowedExtensions control to use provided options or database enabled extensions. - resource/js/app.ts: Load default Head and Link components. - resources/js/menu.ts: Add settings-profile.edit menu point. - resources/js/Components/action-message.vue: Add new component for improved user feedback after form submissions. - New avatar-input.vue component: Enable profile picture selection. - Components/CardBox.vue: Alter layout to optionally show HeaderIcon in title bar. - FormControl.vue: Define a readonly prop for textareas. - Improve overall UI with updates to NavBar.vue, UserAvatar.vue, UserAvatarCurrentUser.vue, and add v-model support to password-meter.vue. - Remove profile editing logic from AccountInfo.vue and introduce new profile components (show.vue, update-password-form.vue, update-profile-information.vue). - app.edge: Modify page (add @inertiaHead tag) for better meta management. - routes.ts: Add new routes for editing user profiles. - General npm updates.
53 lines
1.1 KiB
Vue
53 lines
1.1 KiB
Vue
<script setup>
|
|
import { computed, useSlots } from 'vue';
|
|
|
|
|
|
const props = defineProps({
|
|
label: {
|
|
type: String,
|
|
default: null,
|
|
},
|
|
labelFor: {
|
|
type: String,
|
|
default: null,
|
|
},
|
|
help: {
|
|
type: String,
|
|
default: null,
|
|
},
|
|
// class: {
|
|
// type: Object,
|
|
// default: {},
|
|
// },
|
|
});
|
|
|
|
const slots = useSlots();
|
|
|
|
const wrapperClass = computed(() => {
|
|
const base = [];
|
|
const slotsLength = slots.default().length;
|
|
|
|
if (slotsLength > 1) {
|
|
base.push('grid grid-cols-1 gap-3');
|
|
}
|
|
|
|
if (slotsLength === 2) {
|
|
base.push('md:grid-cols-2');
|
|
}
|
|
|
|
return base;
|
|
});
|
|
</script>
|
|
|
|
<template>
|
|
<div :class="['last:mb-0', 'mb-6']">
|
|
<!-- <label v-if="label" :for="labelFor" class="block font-bold mb-2">{{ label }}</label> -->
|
|
<label v-if="label" :for="labelFor" class="font-bold h-6 mt-3 text-xs leading-8 uppercase">{{ label }}</label>
|
|
<div v-bind:class="wrapperClass">
|
|
<slot />
|
|
</div>
|
|
<div v-if="help" class="text-xs text-gray-500 dark:text-slate-400 mt-1">
|
|
{{ help }}
|
|
</div>
|
|
</div>
|
|
</template>
|