picklist ksfolders
This commit is contained in:
@@ -60,6 +60,63 @@
|
||||
</template>
|
||||
</MultiSelect>
|
||||
|
||||
<!-- KS Folders MultiSelect -->
|
||||
<MultiSelect
|
||||
v-else-if="dataSource === 'ksFolders'"
|
||||
v-model="selectedValue"
|
||||
:options="safeOptions"
|
||||
optionLabel="name"
|
||||
:filter="true"
|
||||
:placeholder="placeholder || 'Select Folders'"
|
||||
:disabled="disabled"
|
||||
:loading="loading"
|
||||
:virtualScrollerOptions="{ itemSize: 50 }"
|
||||
class="w-full ks-folders-multiselect"
|
||||
panelClass="ks-folders-panel"
|
||||
@change="onSelectionChange"
|
||||
>
|
||||
<template #option="slotProps">
|
||||
<div class="flex align-items-center justify-between p-3 hover:bg-gray-50">
|
||||
<div class="flex align-items-center flex-1">
|
||||
<i class="pi pi-folder mr-3 text-violet-600"></i>
|
||||
<div class="flex-1">
|
||||
<div class="font-medium text-sm">{{ slotProps.option.name }}</div>
|
||||
<small class="text-muted">
|
||||
{{ slotProps.option.itemCount }} items
|
||||
<span v-if="slotProps.option.subfolderCount > 0">
|
||||
• {{ slotProps.option.subfolderCount }} subfolders
|
||||
</span>
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<template #value="slotProps">
|
||||
<div v-if="!slotProps.value || slotProps.value.length === 0" class="p-multiselect-placeholder">
|
||||
{{ placeholder || 'Select Folders' }}
|
||||
</div>
|
||||
<div v-else class="p-multiselect-label">
|
||||
{{ slotProps.value.length }} folder{{ slotProps.value.length > 1 ? 's' : '' }} selected
|
||||
</div>
|
||||
</template>
|
||||
</MultiSelect>
|
||||
|
||||
<!-- Custom Clickable Chips for ksFolders -->
|
||||
<div v-if="dataSource === 'ksFolders' && selectedValue && selectedValue.length > 0" class="ks-folders-chips-container">
|
||||
<div
|
||||
v-for="folder in selectedValue"
|
||||
:key="folder.id || folder.path"
|
||||
class="ks-folder-chip"
|
||||
@click="removeFolder(folder)"
|
||||
:title="`Click to remove ${folder.name}`"
|
||||
>
|
||||
<i class="pi pi-folder mr-2"></i>
|
||||
<span class="folder-name">{{ folder.name }}</span>
|
||||
<i class="pi pi-times ml-2 remove-icon"></i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Dropdown per selezione singola -->
|
||||
<Dropdown
|
||||
v-else-if="multiple === false"
|
||||
@@ -74,9 +131,9 @@
|
||||
@change="onSelectionChange"
|
||||
/>
|
||||
|
||||
<!-- MultiSelect generico per altri tipi -->
|
||||
<!-- MultiSelect generico per altri tipi (esclusi videoGroups, ksDocuments, ksFolders) -->
|
||||
<MultiSelect
|
||||
v-else-if="safeOptions && safeOptions.length > 0"
|
||||
v-else-if="dataSource !== 'videoGroups' && dataSource !== 'ksDocuments' && dataSource !== 'ksFolders'"
|
||||
v-model="selectedValue"
|
||||
:options="safeOptions"
|
||||
optionLabel="name"
|
||||
@@ -186,6 +243,20 @@ const safeOptions = computed(() => {
|
||||
return Array.isArray(props.options) ? props.options : [];
|
||||
});
|
||||
|
||||
// Funzione per rimuovere una folder dalla selezione
|
||||
const removeFolder = (folderToRemove) => {
|
||||
if (!selectedValue.value || !Array.isArray(selectedValue.value)) return;
|
||||
|
||||
const newValue = selectedValue.value.filter(folder => {
|
||||
const currentPath = folder.path || folder.id || folder;
|
||||
const removePathKey = folderToRemove.path || folderToRemove.id || folderToRemove;
|
||||
return currentPath !== removePathKey;
|
||||
});
|
||||
|
||||
selectedValue.value = newValue;
|
||||
emit('change', newValue);
|
||||
};
|
||||
|
||||
const getFileIcon = (document) => {
|
||||
if (!document) return 'pi pi-file';
|
||||
|
||||
@@ -228,7 +299,7 @@ const onSelectionChange = (event) => {
|
||||
<style scoped>
|
||||
.input-wrapper {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
gap: 0.5em;
|
||||
margin-top: 10px;
|
||||
}
|
||||
@@ -236,12 +307,78 @@ const onSelectionChange = (event) => {
|
||||
.text-muted {
|
||||
color: #6c757d;
|
||||
}
|
||||
|
||||
/* Custom Clickable Chips Container */
|
||||
.ks-folders-chips-container {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5rem;
|
||||
margin-top: 0.75rem;
|
||||
padding: 0.5rem;
|
||||
background: #f8f9fa;
|
||||
border-radius: 8px;
|
||||
min-height: 40px;
|
||||
}
|
||||
|
||||
/* Custom Folder Chip */
|
||||
.ks-folder-chip {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
padding: 0.5rem 0.75rem;
|
||||
background: linear-gradient(135deg, #a100ff 0%, #7b00cc 100%);
|
||||
color: white;
|
||||
border-radius: 20px;
|
||||
font-size: 0.875rem;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
box-shadow: 0 2px 8px rgba(161, 0, 255, 0.3);
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.ks-folder-chip:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 12px rgba(161, 0, 255, 0.4);
|
||||
background: linear-gradient(135deg, #8a00db 0%, #6600a8 100%);
|
||||
}
|
||||
|
||||
.ks-folder-chip:active {
|
||||
transform: translateY(0);
|
||||
box-shadow: 0 2px 6px rgba(161, 0, 255, 0.35);
|
||||
}
|
||||
|
||||
.ks-folder-chip .pi-folder {
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
|
||||
.ks-folder-chip .folder-name {
|
||||
max-width: 200px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.ks-folder-chip .remove-icon {
|
||||
font-size: 0.75rem;
|
||||
opacity: 0.8;
|
||||
transition: opacity 0.2s ease;
|
||||
}
|
||||
|
||||
.ks-folder-chip:hover .remove-icon {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Hide default chips display for ksFolders */
|
||||
.ks-folders-multiselect :deep(.p-multiselect-token) {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style>
|
||||
/* Personalizzazione delle panel dei MultiSelect per migliorare la visualizzazione */
|
||||
.ks-documents-panel .p-multiselect-panel,
|
||||
.video-groups-panel .p-multiselect-panel,
|
||||
.ks-folders-panel .p-multiselect-panel,
|
||||
.generic-multiselect-panel .p-multiselect-panel {
|
||||
min-width: 350px;
|
||||
max-width: 500px;
|
||||
@@ -249,12 +386,14 @@ const onSelectionChange = (event) => {
|
||||
|
||||
.ks-documents-panel .p-multiselect-items,
|
||||
.video-groups-panel .p-multiselect-items,
|
||||
.ks-folders-panel .p-multiselect-items,
|
||||
.generic-multiselect-panel .p-multiselect-items {
|
||||
max-height: 300px;
|
||||
}
|
||||
|
||||
.ks-documents-panel .p-multiselect-item,
|
||||
.video-groups-panel .p-multiselect-item,
|
||||
.ks-folders-panel .p-multiselect-item,
|
||||
.generic-multiselect-panel .p-multiselect-item {
|
||||
padding: 0.75rem;
|
||||
border-bottom: 1px solid #e9ecef;
|
||||
@@ -265,12 +404,14 @@ const onSelectionChange = (event) => {
|
||||
|
||||
.ks-documents-panel .p-multiselect-item:last-child,
|
||||
.video-groups-panel .p-multiselect-item:last-child,
|
||||
.ks-folders-panel .p-multiselect-item:last-child,
|
||||
.generic-multiselect-panel .p-multiselect-item:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.ks-documents-panel .p-multiselect-item:hover,
|
||||
.video-groups-panel .p-multiselect-item:hover,
|
||||
.ks-folders-panel .p-multiselect-item:hover,
|
||||
.generic-multiselect-panel .p-multiselect-item:hover {
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
@@ -285,4 +426,29 @@ const onSelectionChange = (event) => {
|
||||
font-size: 1.2rem;
|
||||
min-width: 1.5rem;
|
||||
}
|
||||
|
||||
/* Stili per le folder chips */
|
||||
.ks-folders-panel .p-multiselect-chip {
|
||||
background-color: #a100ff15;
|
||||
color: #a100ff;
|
||||
padding: 0.25rem 0.5rem;
|
||||
border-radius: 6px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.25rem;
|
||||
}
|
||||
|
||||
.ks-folders-panel .p-multiselect-chip .pi-folder {
|
||||
font-size: 0.875rem;
|
||||
}
|
||||
|
||||
.ks-folders-panel .p-multiselect-token {
|
||||
background-color: #a100ff15;
|
||||
color: #a100ff;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.ks-folders-panel .p-multiselect-token-icon {
|
||||
color: #a100ff;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -17,9 +17,15 @@ const emit = defineEmits(['download-file']);
|
||||
const filteredInputs = computed(() => {
|
||||
const filtered = {};
|
||||
for (const [key, value] of Object.entries(props.inputs)) {
|
||||
if (!(key.includes('input_multiselect') && key.endsWith('_id'))) {
|
||||
filtered[key] = value;
|
||||
// Escludi le chiavi _id per multiselect
|
||||
if (key.includes('input_multiselect') && key.endsWith('_id')) {
|
||||
continue;
|
||||
}
|
||||
// Escludi selectedFolders_name e selectedFolders_id
|
||||
if (key === 'selectedFolders_name' || key === 'selectedFolders_id') {
|
||||
continue;
|
||||
}
|
||||
filtered[key] = value;
|
||||
}
|
||||
return filtered;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user