mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-12-19 07:08:48 +08:00
Fix CSS issues assigned user task flyout [SCI-10367] (#7253)
This commit is contained in:
parent
3d1907d972
commit
cc388d9669
2 changed files with 27 additions and 15 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<GeneralDropdown @open="loadUsers" @close="closeFlyout">
|
<GeneralDropdown @open="() => loadUsers(true)" @close="closeFlyout">
|
||||||
<template v-slot:field>
|
<template v-slot:field>
|
||||||
<div v-if="!params.data.folder" class="flex items-center gap-1 cursor-pointer h-9" @click="openAccessModal">
|
<div v-if="!params.data.folder" class="flex items-center gap-1 cursor-pointer h-9" @click="openAccessModal">
|
||||||
<div v-for="(user, i) in visibleUsers" :key="i" :title="user.full_name">
|
<div v-for="(user, i) in visibleUsers" :key="i" :title="user.full_name">
|
||||||
|
|
@ -24,25 +24,25 @@
|
||||||
:placeholder="i18n.t('experiments.table.search')" />
|
:placeholder="i18n.t('experiments.table.search')" />
|
||||||
<i class="sn-icon sn-icon-search"></i>
|
<i class="sn-icon sn-icon-search"></i>
|
||||||
</div>
|
</div>
|
||||||
<div class="h-64 overflow-y-auto">
|
<perfect-scrollbar class="relative max-h-96 overflow-y-auto max-w-[280px]">
|
||||||
<div v-for="user in allUsers"
|
<div v-for="user in allUsers"
|
||||||
:key="user.value"
|
:key="user.value"
|
||||||
@click="selectUser(user)"
|
@click="selectUser(user)"
|
||||||
:class="{
|
:class="{
|
||||||
'!bg-sn-super-light-blue': selectedUsers.includes(user.value),
|
'!bg-sn-super-light-blue': selectedUsers.some(({ value }) => value === user.value),
|
||||||
'cursor-pointer hover:bg-sn-super-light-grey': canManage
|
'cursor-pointer hover:bg-sn-super-light-grey': canManage
|
||||||
}"
|
}"
|
||||||
class="whitespace-nowrap rounded px-3 py-2.5 flex items-center gap-2
|
class="whitespace-nowrap rounded px-3 py-2.5 flex items-center gap-2
|
||||||
hover:no-underline leading-5"
|
hover:no-underline leading-5"
|
||||||
>
|
>
|
||||||
<div class="sci-checkbox-container">
|
<div class="sci-checkbox-container">
|
||||||
<input type="checkbox" class="sci-checkbox" :disabled="!canManage" :checked="selectedUsers.includes(user.value)" />
|
<input type="checkbox" class="sci-checkbox" :disabled="!canManage" :checked="selectedUsers.some(({ value }) => value === user.value)" />
|
||||||
<label class="sci-checkbox-label"></label>
|
<label class="sci-checkbox-label"></label>
|
||||||
</div>
|
</div>
|
||||||
<img :src="user.params.avatar_url" class="w-7 h-7" />
|
<img :src="user.params.avatar_url" class="w-7 h-7" />
|
||||||
{{ user.label }}
|
<span class="truncate">{{ user.label }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</perfect-scrollbar>
|
||||||
</template>
|
</template>
|
||||||
</GeneralDropdown>
|
</GeneralDropdown>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -92,14 +92,18 @@ export default {
|
||||||
this.loadUsers();
|
this.loadUsers();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
|
||||||
this.selectedUsers = this.users.map((user) => (user.id));
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
loadUsers() {
|
loadUsers(setSelectedUsers = false) {
|
||||||
axios.get(`${this.params.data.urls.users_list}?query=${this.query}`)
|
axios.get(`${this.params.data.urls.users_list}?query=${this.query}`)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
this.allUsers = response.data.users;
|
if (setSelectedUsers) {
|
||||||
|
this.selectedUsers = response.data.users.filter((item) => this.users.some((user) => user.id === item.value));
|
||||||
|
this.allUsers = response.data.users;
|
||||||
|
this.flyoutLoaded = true;
|
||||||
|
} else {
|
||||||
|
const nonAssignedUsers = response.data.users.filter((item) => !this.selectedUsers.some(({ value }) => value === item.value));
|
||||||
|
this.allUsers = this.selectedUsers.concat(nonAssignedUsers);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
closeFlyout() {
|
closeFlyout() {
|
||||||
|
|
@ -116,11 +120,11 @@ export default {
|
||||||
|
|
||||||
this.changed = true;
|
this.changed = true;
|
||||||
|
|
||||||
if (this.selectedUsers.includes(user.value)) {
|
if (this.selectedUsers.some(({ value }) => value === user.value)) {
|
||||||
axios.delete(user.params.unassign_url, {
|
axios.delete(user.params.unassign_url, {
|
||||||
table: true
|
table: true
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.selectedUsers = this.selectedUsers.filter((id) => id !== user.value);
|
this.selectedUsers = this.selectedUsers.filter(({ value }) => value !== user.value);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
axios.post(user.params.assign_url, {
|
axios.post(user.params.assign_url, {
|
||||||
|
|
@ -131,7 +135,7 @@ export default {
|
||||||
}
|
}
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
this.allUsers.find((u) => u.value === user.value).params.unassign_url = response.data.unassign_url;
|
this.allUsers.find((u) => u.value === user.value).params.unassign_url = response.data.unassign_url;
|
||||||
this.selectedUsers.push(user.value);
|
this.selectedUsers.push(user);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ export default {
|
||||||
if (!field || !flyout) return;
|
if (!field || !flyout) return;
|
||||||
|
|
||||||
const rect = field.getBoundingClientRect();
|
const rect = field.getBoundingClientRect();
|
||||||
|
const flyoutRect = flyout.getBoundingClientRect();
|
||||||
const screenHeight = window.innerHeight;
|
const screenHeight = window.innerHeight;
|
||||||
|
|
||||||
const windowHasScroll = document.documentElement.scrollHeight > document.documentElement.clientHeight;
|
const windowHasScroll = document.documentElement.scrollHeight > document.documentElement.clientHeight;
|
||||||
|
|
@ -62,11 +63,18 @@ export default {
|
||||||
} else {
|
} else {
|
||||||
flyout.style.minWidth = `${width}px`;
|
flyout.style.minWidth = `${width}px`;
|
||||||
}
|
}
|
||||||
if (this.position === 'right') {
|
|
||||||
|
if (window.innerWidth - flyoutRect.right < 0) { // when flyout is out of screen
|
||||||
|
flyout.style.left = 'unset';
|
||||||
|
flyout.style.right = `${rightScrollOffset}px`;
|
||||||
|
} else if (this.position === 'right') {
|
||||||
flyout.style.right = `${right - rightScrollOffset}px`;
|
flyout.style.right = `${right - rightScrollOffset}px`;
|
||||||
|
flyout.style.left = 'unset';
|
||||||
} else {
|
} else {
|
||||||
flyout.style.left = `${left}px`;
|
flyout.style.left = `${left}px`;
|
||||||
|
flyout.style.right = 'unset';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bottom < top) {
|
if (bottom < top) {
|
||||||
flyout.style.bottom = `${bottom}px`;
|
flyout.style.bottom = `${bottom}px`;
|
||||||
flyout.style.top = 'unset';
|
flyout.style.top = 'unset';
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue