* feat: i18n * feat: request list * refactor: hide stat transition on app.scss * feat: request list i18n * feat: request list => constants and main page * feat: add store * feat: add fetch data * feat: add utilities fn * feat: add store function / types * refactor: request list type * refactor: request list constants * refactor: quotation card => add customData and badge color props * feat: avatar group components * feat: request list group * refactor: request list => remove tab, add table data * feat: send search query * feat: add parameter * refactor: remove unused function * fix: rename component lits to list * feat: show stats from api * chore: cleanup * refactor: make it type safe * refactor: accept rotate flow id as parameter * feat: use page size component * feat: add component, data display & expansion product * feat: i18n * refactor: constants and request list table * refactor: type code, createdAt, updatedAt * refactor: utils function changThemeMode * feat: request list => view page * refactor: use type instead of infer from value * fix: function getEmployeeName att type * refactor: fetch work list * refactor: loop work list * feat: add i18n duty * feat: add form issue component * feat: add form issue section * fix: store error * refactor: edit by value * refactor: accept basic info from outside instead * feat: add status filter support on fetch * refactor: remove delete button * refactor: wording * feat/fix: request list i18n & constant * feat: document type * feat/refactor: request list => document expansion * refactor: doc expansion use FormGroupHead * refactor: fetch data based on id from route param * refactor: text area disable * feat: properties expansion display (mocking) * refactor: add document at product relation * refactor: edit get value product * feat: get workflow step to show on top * refactor: add type * refactor: add get attachment * refactor: add view attachment * refactor: edit file name * refactor: define props get hide icon * refactor: edit align row * refactor: by value table document * refactor: by value row table * feat: add independent ocr dialog * chore: clean up * refactor: accept more props and small adjustment * fix: error withDefault call * feat: accept default metadata when open * fix: typo * feat: add override hook when finish ocr * feat: reset state on open * feat: detect reader result is actually string * fix: variable name conflict * feat: properties to input component * feat: properties input in properties expansion * feat: properties expansion data (temporary) * refactor: add i18n status work * refactor: edit type work status and add step status * refactor: add edit status work * refactor: edit step work * refactor: properties data type * refactor: filter selected product & specific properties * feat: add emit event * refactor: change variable name for better understanding * refactor: hide step that no properties * refactor: work status type to validate * feat: work status color * refactor: key for filename * refactor: close expansion when change step * refactor: responsive meta data * refactor: product expansion responsive * fix: dark mode step text color * fix: document expansion table no data label * refactor: main page body bordered and overflow hidden * refactor: use utils function instead * refactor: add process * refactor: by value name * refactor: add upload file * refactor: upload file * refactor: by value * fix: option worker type * refactor: fetchRequestAttachment after edit * fix: metadata display * refactor: add class full-height * refactor: edit type * refactor: fetch file * refactor: by value visa * refactor: request list attributes type * fix: properties to input props (placeholder, readonly, disable) * feat: request list properties function * fix: error when no workflow * docs: update comment to fix indent * refactor: step type (attributes) * refactor: add attributes payload on editStatusRequestWork function * feat/refactor: functional form expansion/filter worklist * refactor: set attributes properties after submit * refactor: add request work ready status * feat: request list => form employee component * feat/refactor: form expansion select user/layout * fix: properties readonly --------- Co-authored-by: puriphatt <puriphat@frappet.com> Co-authored-by: Thanaphon Frappet <thanaphon@frappet.com>
107 lines
3 KiB
Vue
107 lines
3 KiB
Vue
<script setup lang="ts">
|
|
withDefaults(
|
|
defineProps<{
|
|
data?: Record<string, unknown>[];
|
|
dataLabel?: string;
|
|
dataUrl?: string;
|
|
}>(),
|
|
{
|
|
dataLabel: 'name',
|
|
dataUrl: 'imgUrl',
|
|
data: () => [
|
|
{
|
|
name: 'Someone 1',
|
|
imgUrl:
|
|
'https://images.unsplash.com/photo-1438761681033-6461ffad8d80?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8cGVyc29ufGVufDB8fDB8fA%3D%3D&auto=format&fit=crop&w=500&q=60',
|
|
},
|
|
{
|
|
name: 'Someone 2',
|
|
imgUrl:
|
|
'https://images.unsplash.com/flagged/photo-1570612861542-284f4c12e75f?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8M3x8cGVyc29ufGVufDB8fDB8fA%3D%3D&auto=format&fit=crop&w=500&q=60',
|
|
},
|
|
{
|
|
name: 'Someone 3',
|
|
imgUrl:
|
|
'https://images.unsplash.com/photo-1547425260-76bcadfb4f2c?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8NXx8cGVyc29ufGVufDB8fDB8fA%3D%3D&auto=format&fit=crop&w=500&q=60',
|
|
},
|
|
{
|
|
name: 'Someone 4',
|
|
imgUrl:
|
|
'https://images.unsplash.com/photo-1499952127939-9bbf5af6c51c?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8MTF8fHBlcnNvbnxlbnwwfHwwfHw%3D&auto=format&fit=crop&w=500&q=60',
|
|
},
|
|
{
|
|
name: 'Someone 5',
|
|
imgUrl:
|
|
'https://images.unsplash.com/photo-1504593811423-6dd665756598?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8MTZ8fHBlcnNvbnxlbnwwfHwwfHw%3D&auto=format&fit=crop&w=500&q=60',
|
|
},
|
|
{
|
|
name: 'Someone 6',
|
|
imgUrl:
|
|
'https://images.unsplash.com/photo-1504593811423-6dd665756598?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8MTZ8fHBlcnNvbnxlbnwwfHwwfHw%3D&auto=format&fit=crop&w=500&q=60',
|
|
},
|
|
],
|
|
},
|
|
);
|
|
</script>
|
|
<template>
|
|
<div class="avatar-group">
|
|
<div class="avatar" v-for="(person, i) in data.slice(0, 3)" :key="i">
|
|
<q-tooltip>
|
|
{{ person[dataLabel] }}
|
|
</q-tooltip>
|
|
<img
|
|
:src="
|
|
typeof person[dataUrl] === 'string' ? (person[dataUrl] as string) : ''
|
|
"
|
|
alt="Image"
|
|
/>
|
|
</div>
|
|
<div v-if="data.length > 3" class="avatar remaining-count">
|
|
<q-tooltip>
|
|
<div v-for="(person, i) in data.slice(3)" :key="i + 3">
|
|
{{ person.name }}
|
|
</div>
|
|
</q-tooltip>
|
|
<span>{{ `+${data.length - 3}` }}</span>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<style scoped>
|
|
.avatar-group {
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
.avatar {
|
|
position: relative;
|
|
transition: 0.2s;
|
|
}
|
|
.avatar:not(:first-child) {
|
|
margin-left: -0.75rem;
|
|
}
|
|
.avatar:hover {
|
|
z-index: 1;
|
|
transform: translateY(-0.5rem);
|
|
}
|
|
.avatar img {
|
|
width: 30px;
|
|
height: 30px;
|
|
display: block;
|
|
object-fit: cover;
|
|
border-radius: 50%;
|
|
border: 2px solid var(--border-color);
|
|
}
|
|
.remaining-count {
|
|
color: hsl(var(--text-mute-2));
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 30px;
|
|
height: 30px;
|
|
background-color: var(--surface-2);
|
|
border: 2px solid var(--border-color);
|
|
border-radius: 50%;
|
|
font-size: 0.8rem;
|
|
margin-left: -0.75rem;
|
|
}
|
|
</style>
|