+
{{ t('No data to display') }}
@@ -416,6 +413,7 @@ defineExpose({
v-shortcut
@click="showFormDialog()"
class="fill-icon"
+ data-cy="addButton"
>
{{ t('Upload file') }}
diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue
index 8f106a9f124..136dbf2a438 100644
--- a/src/components/common/VnLog.vue
+++ b/src/components/common/VnLog.vue
@@ -10,7 +10,7 @@ import { useColor } from 'src/composables/useColor';
import { useCapitalize } from 'src/composables/useCapitalize';
import { useValidator } from 'src/composables/useValidator';
import VnAvatar from '../ui/VnAvatar.vue';
-import VnJsonValue from '../common/VnJsonValue.vue';
+import VnLogValue from './VnLogValue.vue';
import FetchData from '../FetchData.vue';
import VnSelect from './VnSelect.vue';
import VnUserLink from '../ui/VnUserLink.vue';
@@ -560,10 +560,11 @@ watch(
value.nameI18n
}}:
-
@@ -614,7 +615,11 @@ watch(
>
{{ prop.nameI18n }}:
-
+
+
-
→
-
-
+import { useDescriptorStore } from 'src/stores/useDescriptorStore';
+import VnJsonValue from './VnJsonValue.vue';
+import { computed } from 'vue';
+const descriptorStore = useDescriptorStore();
+
+const $props = defineProps({
+ name: { type: [String], default: undefined },
+});
+
+const descriptor = computed(() => descriptorStore.has($props.name));
+
+
+
+
+
+
diff --git a/src/components/common/__tests__/VnLogValue.spec.js b/src/components/common/__tests__/VnLogValue.spec.js
new file mode 100644
index 00000000000..c23743a02e8
--- /dev/null
+++ b/src/components/common/__tests__/VnLogValue.spec.js
@@ -0,0 +1,26 @@
+import { describe, it, expect } from 'vitest';
+import VnLogValue from 'src/components/common/VnLogValue.vue';
+import { createWrapper } from 'app/test/vitest/helper';
+
+const buildComponent = (props) => {
+ return createWrapper(VnLogValue, {
+ props,
+ global: {},
+ }).wrapper;
+};
+
+describe('VnLogValue', () => {
+ const id = 1;
+ it('renders without descriptor', async () => {
+ expect(getIcon('inventFk').exists()).toBe(false);
+ });
+
+ it('renders with descriptor', async () => {
+ expect(getIcon('claimFk').text()).toBe('launch');
+ });
+
+ function getIcon(name) {
+ const wrapper = buildComponent({ value: { val: id }, name });
+ return wrapper.find('.q-icon');
+ }
+});
diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue
index 744f84e6d9d..57d8b042139 100644
--- a/src/components/ui/CardDescriptor.vue
+++ b/src/components/ui/CardDescriptor.vue
@@ -180,6 +180,7 @@ const toModule = computed(() => {
color="white"
class="link"
v-if="summary"
+ data-cy="openSummaryBtn"
>
{{ t('components.smartCard.openSummary') }}
@@ -194,6 +195,7 @@ const toModule = computed(() => {
icon="launch"
round
size="md"
+ data-cy="goToSummaryBtn"
>
{{ t('components.cardDescriptor.summary') }}
@@ -222,7 +224,7 @@ const toModule = computed(() => {
-
+
#{{ getValueFromPath(subtitle) ?? entity.id }}
diff --git a/src/pages/Account/Card/AccountDescriptorProxy.vue b/src/pages/Account/Card/AccountDescriptorProxy.vue
new file mode 100644
index 00000000000..de3220fea32
--- /dev/null
+++ b/src/pages/Account/Card/AccountDescriptorProxy.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/src/pages/Claim/Card/ClaimDescriptorProxy.vue b/src/pages/Claim/Card/ClaimDescriptorProxy.vue
new file mode 100644
index 00000000000..78e6867456c
--- /dev/null
+++ b/src/pages/Claim/Card/ClaimDescriptorProxy.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/src/pages/Entry/Card/EntryBasicData.vue b/src/pages/Entry/Card/EntryBasicData.vue
index 6462ed24a99..34e4a0f9ca3 100644
--- a/src/pages/Entry/Card/EntryBasicData.vue
+++ b/src/pages/Entry/Card/EntryBasicData.vue
@@ -13,6 +13,7 @@ import VnSelect from 'src/components/common/VnSelect.vue';
import VnInputNumber from 'src/components/common/VnInputNumber.vue';
import VnSelectTravelExtended from 'src/components/common/VnSelectTravelExtended.vue';
import VnSelectSupplier from 'src/components/common/VnSelectSupplier.vue';
+import VnCheckbox from 'src/components/common/VnCheckbox.vue';
const route = useRoute();
const { t } = useI18n();
@@ -53,7 +54,7 @@ onMounted(() => {
:clear-store-on-unmount="false"
>
-
+
{
:required="true"
/>
-
+
{
:positive="false"
/>
-
+
{
:options="companiesOptions"
option-value="id"
option-label="code"
+ sort-by="code"
map-options
hide-selected
:required="true"
/>
-
+
{
:options="currenciesOptions"
option-value="id"
option-label="code"
+ sort-by="code"
/>
-
+
{
:decimal-places="2"
:positive="false"
/>
+
-
+
{
fill-input
/>
-
-
-
-
+
-
+
+ parseFloat(row['price2']).toFixed(2),
@@ -320,7 +291,9 @@ const columns = [
label: t('Box'),
name: 'price3',
component: 'number',
- createDisable: true,
+ createAttrs: {
+ disable: true,
+ },
cellEvent: {
'update:modelValue': async (value, oldValue, row) => {
row['price2'] = row['price2'] * (value / oldValue);
@@ -340,13 +313,6 @@ const columns = [
toggleIndeterminate: false,
},
component: 'checkbox',
- cellEvent: {
- 'update:modelValue': async (value, oldValue, row) => {
- await axios.patch(`Items/${row['itemFk']}`, {
- hasMinPrice: value,
- });
- },
- },
width: '25px',
},
{
@@ -356,13 +322,6 @@ const columns = [
toolTip: t('Minimum price'),
name: 'minPrice',
component: 'number',
- cellEvent: {
- 'update:modelValue': async (value, oldValue, row) => {
- await axios.patch(`Items/${row['itemFk']}`, {
- minPrice: value,
- });
- },
- },
width: '35px',
style: (row) => {
if (!row?.hasMinPrice) return { color: 'var(--vn-label-color)' };
@@ -425,6 +384,23 @@ const columns = [
},
},
];
+const buyerFk = ref(null);
+const itemTypeFk = ref(null);
+const inkFk = ref(null);
+const tag1 = ref(null);
+const tag2 = ref(null);
+const tag1Filter = ref(null);
+const tag2Filter = ref(null);
+const filter = computed(() => {
+ const where = {};
+ where.workerFk = buyerFk.value;
+ where.itemTypeFk = itemTypeFk.value;
+ where.inkFk = inkFk.value;
+ where.tag1 = tag1.value;
+ where.tag2 = tag2.value;
+
+ return { where };
+});
function getQuantityStyle(row) {
if (row?.quantity !== row?.stickers * row?.packing)
@@ -610,6 +586,7 @@ onMounted(() => {
:url="`Entries/${entityId}/getBuyList`"
search-url="EntryBuys"
save-url="Buys/crud"
+ :filter="filter"
:disable-option="{ card: true }"
v-model:selected="selectedRows"
@on-fetch="() => footerFetchDataRef.fetch()"
@@ -655,7 +632,7 @@ onMounted(() => {
:is-editable="editableMode"
:without-header="!editableMode"
:with-filters="editableMode"
- :right-search="editableMode"
+ :right-search="false"
:row-click="false"
:columns="columns"
:beforeSaveFn="beforeSave"
@@ -666,6 +643,46 @@ onMounted(() => {
data-cy="entry-buys"
overlay
>
+
+
+
+
+
+
+
+
+
@@ -696,7 +713,7 @@ onMounted(() => {