fixes
Build And Push Image / docker (push) Successful in 1m27s
Details
Build And Push Image / docker (push) Successful in 1m27s
Details
This commit is contained in:
parent
4adbb0465a
commit
7784fab23f
|
|
@ -8,10 +8,23 @@
|
||||||
>
|
>
|
||||||
<v-card>
|
<v-card>
|
||||||
<v-card-title class="d-flex align-center pa-6 bg-primary">
|
<v-card-title class="d-flex align-center pa-6 bg-primary">
|
||||||
<v-icon class="mr-3 text-white">mdi-account-edit</v-icon>
|
<ProfileAvatar
|
||||||
<h2 class="text-h5 text-white font-weight-bold flex-grow-1">
|
v-if="member"
|
||||||
Edit Member: {{ member?.FullName || `${member?.first_name} ${member?.last_name}` }}
|
:member-id="member.member_id"
|
||||||
</h2>
|
:member-name="member.FullName || `${member.first_name} ${member.last_name}`"
|
||||||
|
:first-name="member.first_name"
|
||||||
|
:last-name="member.last_name"
|
||||||
|
size="large"
|
||||||
|
class="mr-4"
|
||||||
|
clickable
|
||||||
|
show-border
|
||||||
|
@click="openImageLightbox"
|
||||||
|
/>
|
||||||
|
<div class="flex-grow-1">
|
||||||
|
<h2 class="text-h5 text-white font-weight-bold">
|
||||||
|
Edit Member: {{ member?.FullName || `${member?.first_name} ${member?.last_name}` }}
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
<v-btn
|
<v-btn
|
||||||
icon
|
icon
|
||||||
variant="text"
|
variant="text"
|
||||||
|
|
@ -243,6 +256,38 @@
|
||||||
</v-card-actions>
|
</v-card-actions>
|
||||||
</v-card>
|
</v-card>
|
||||||
</v-dialog>
|
</v-dialog>
|
||||||
|
|
||||||
|
<!-- Image Lightbox -->
|
||||||
|
<v-dialog
|
||||||
|
v-model="showImageLightbox"
|
||||||
|
max-width="800"
|
||||||
|
@click:outside="showImageLightbox = false"
|
||||||
|
>
|
||||||
|
<v-card class="pa-0" v-if="member && lightboxImageUrl">
|
||||||
|
<v-card-title class="d-flex align-center pa-4">
|
||||||
|
<span class="text-h6">{{ member.FullName || `${member.first_name} ${member.last_name}` }} - Profile Photo</span>
|
||||||
|
<v-spacer />
|
||||||
|
<v-btn
|
||||||
|
icon
|
||||||
|
variant="text"
|
||||||
|
@click="showImageLightbox = false"
|
||||||
|
>
|
||||||
|
<v-icon>mdi-close</v-icon>
|
||||||
|
</v-btn>
|
||||||
|
</v-card-title>
|
||||||
|
<v-card-text class="pa-4">
|
||||||
|
<div class="text-center">
|
||||||
|
<v-img
|
||||||
|
:src="lightboxImageUrl"
|
||||||
|
:alt="`${member.FullName || `${member.first_name} ${member.last_name}`} profile photo`"
|
||||||
|
max-height="500"
|
||||||
|
contain
|
||||||
|
class="mx-auto"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</v-card-text>
|
||||||
|
</v-card>
|
||||||
|
</v-dialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
|
@ -266,6 +311,10 @@ const formRef = ref();
|
||||||
const formValid = ref(false);
|
const formValid = ref(false);
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
|
|
||||||
|
// Lightbox state
|
||||||
|
const showImageLightbox = ref(false);
|
||||||
|
const lightboxImageUrl = ref<string | null>(null);
|
||||||
|
|
||||||
// Form data - using snake_case field names
|
// Form data - using snake_case field names
|
||||||
const form = ref({
|
const form = ref({
|
||||||
first_name: '',
|
first_name: '',
|
||||||
|
|
@ -539,6 +588,23 @@ watch(() => props.member, (newMember) => {
|
||||||
populateForm();
|
populateForm();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Lightbox functionality
|
||||||
|
const openImageLightbox = async () => {
|
||||||
|
if (!props.member?.member_id) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Fetch the original sized image for the lightbox
|
||||||
|
const response = await $fetch(`/api/profile/image/${props.member.member_id}/medium`) as any;
|
||||||
|
if (response?.success && response?.imageUrl) {
|
||||||
|
lightboxImageUrl.value = response.imageUrl;
|
||||||
|
showImageLightbox.value = true;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.warn('Could not load image for lightbox:', error);
|
||||||
|
// Could show a snackbar here if needed
|
||||||
|
}
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|
|
||||||
|
|
@ -62,15 +62,14 @@
|
||||||
<!-- Card Content -->
|
<!-- Card Content -->
|
||||||
<v-card-text class="pb-4 pt-3">
|
<v-card-text class="pb-4 pt-3">
|
||||||
<div class="d-flex align-center mb-2">
|
<div class="d-flex align-center mb-2">
|
||||||
<v-avatar
|
<ProfileAvatar
|
||||||
:color="avatarColor"
|
:member-id="member.member_id"
|
||||||
size="40"
|
:member-name="displayName"
|
||||||
|
:first-name="member.first_name"
|
||||||
|
:last-name="member.last_name"
|
||||||
|
size="medium"
|
||||||
class="mr-3"
|
class="mr-3"
|
||||||
>
|
/>
|
||||||
<span class="text-white font-weight-bold">
|
|
||||||
{{ memberInitials }}
|
|
||||||
</span>
|
|
||||||
</v-avatar>
|
|
||||||
|
|
||||||
<div class="flex-grow-1">
|
<div class="flex-grow-1">
|
||||||
<h3 class="text-subtitle-1 font-weight-bold mb-1">
|
<h3 class="text-subtitle-1 font-weight-bold mb-1">
|
||||||
|
|
|
||||||
|
|
@ -9,15 +9,17 @@
|
||||||
<v-card v-if="member">
|
<v-card v-if="member">
|
||||||
<!-- Header -->
|
<!-- Header -->
|
||||||
<v-card-title class="d-flex align-center pa-6 bg-primary">
|
<v-card-title class="d-flex align-center pa-6 bg-primary">
|
||||||
<v-avatar
|
<ProfileAvatar
|
||||||
:color="avatarColor"
|
:member-id="member.member_id"
|
||||||
size="48"
|
:member-name="member.FullName || `${member.first_name} ${member.last_name}`"
|
||||||
|
:first-name="member.first_name"
|
||||||
|
:last-name="member.last_name"
|
||||||
|
size="large"
|
||||||
class="mr-4"
|
class="mr-4"
|
||||||
>
|
clickable
|
||||||
<span class="text-white font-weight-bold text-h6">
|
show-border
|
||||||
{{ memberInitials }}
|
@click="openImageLightbox"
|
||||||
</span>
|
/>
|
||||||
</v-avatar>
|
|
||||||
|
|
||||||
<div class="flex-grow-1">
|
<div class="flex-grow-1">
|
||||||
<h2 class="text-h5 text-white font-weight-bold">
|
<h2 class="text-h5 text-white font-weight-bold">
|
||||||
|
|
@ -192,6 +194,38 @@
|
||||||
</v-card-actions>
|
</v-card-actions>
|
||||||
</v-card>
|
</v-card>
|
||||||
</v-dialog>
|
</v-dialog>
|
||||||
|
|
||||||
|
<!-- Image Lightbox -->
|
||||||
|
<v-dialog
|
||||||
|
v-model="showImageLightbox"
|
||||||
|
max-width="800"
|
||||||
|
@click:outside="showImageLightbox = false"
|
||||||
|
>
|
||||||
|
<v-card class="pa-0" v-if="member && lightboxImageUrl">
|
||||||
|
<v-card-title class="d-flex align-center pa-4">
|
||||||
|
<span class="text-h6">{{ member.FullName || `${member.first_name} ${member.last_name}` }} - Profile Photo</span>
|
||||||
|
<v-spacer />
|
||||||
|
<v-btn
|
||||||
|
icon
|
||||||
|
variant="text"
|
||||||
|
@click="showImageLightbox = false"
|
||||||
|
>
|
||||||
|
<v-icon>mdi-close</v-icon>
|
||||||
|
</v-btn>
|
||||||
|
</v-card-title>
|
||||||
|
<v-card-text class="pa-4">
|
||||||
|
<div class="text-center">
|
||||||
|
<v-img
|
||||||
|
:src="lightboxImageUrl"
|
||||||
|
:alt="`${member.FullName || `${member.first_name} ${member.last_name}`} profile photo`"
|
||||||
|
max-height="500"
|
||||||
|
contain
|
||||||
|
class="mx-auto"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</v-card-text>
|
||||||
|
</v-card>
|
||||||
|
</v-dialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
|
@ -214,6 +248,10 @@ const props = withDefaults(defineProps<Props>(), {
|
||||||
|
|
||||||
defineEmits<Emits>();
|
defineEmits<Emits>();
|
||||||
|
|
||||||
|
// Lightbox state
|
||||||
|
const showImageLightbox = ref(false);
|
||||||
|
const lightboxImageUrl = ref<string | null>(null);
|
||||||
|
|
||||||
// Computed properties
|
// Computed properties
|
||||||
const memberInitials = computed(() => {
|
const memberInitials = computed(() => {
|
||||||
if (!props.member) return '';
|
if (!props.member) return '';
|
||||||
|
|
@ -295,6 +333,22 @@ const formatDate = (dateString: string): string => {
|
||||||
return dateString;
|
return dateString;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const openImageLightbox = async () => {
|
||||||
|
if (!props.member?.member_id) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Fetch the original sized image for the lightbox
|
||||||
|
const response = await $fetch(`/api/profile/image/${props.member.member_id}/medium`) as any;
|
||||||
|
if (response?.success && response?.imageUrl) {
|
||||||
|
lightboxImageUrl.value = response.imageUrl;
|
||||||
|
showImageLightbox.value = true;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.warn('Could not load image for lightbox:', error);
|
||||||
|
// Could show a snackbar here if needed
|
||||||
|
}
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue