mirror of
https://github.com/CorentinTh/it-tools.git
synced 2025-04-20 06:55:06 -04:00
refactor(c-key-value-list): got rid of table for layout (#611)
This commit is contained in:
parent
c7d4562d3b
commit
7ab9204e96
6 changed files with 49 additions and 33 deletions
1
components.d.ts
vendored
1
components.d.ts
vendored
|
@ -33,6 +33,7 @@ declare module '@vue/runtime-core' {
|
||||||
CInputText: typeof import('./src/ui/c-input-text/c-input-text.vue')['default']
|
CInputText: typeof import('./src/ui/c-input-text/c-input-text.vue')['default']
|
||||||
'CInputText.demo': typeof import('./src/ui/c-input-text/c-input-text.demo.vue')['default']
|
'CInputText.demo': typeof import('./src/ui/c-input-text/c-input-text.demo.vue')['default']
|
||||||
CKeyValueList: typeof import('./src/ui/c-key-value-list/c-key-value-list.vue')['default']
|
CKeyValueList: typeof import('./src/ui/c-key-value-list/c-key-value-list.vue')['default']
|
||||||
|
CKeyValueListItem: typeof import('./src/ui/c-key-value-list/c-key-value-list-item.vue')['default']
|
||||||
CLabel: typeof import('./src/ui/c-label/c-label.vue')['default']
|
CLabel: typeof import('./src/ui/c-label/c-label.vue')['default']
|
||||||
CLink: typeof import('./src/ui/c-link/c-link.vue')['default']
|
CLink: typeof import('./src/ui/c-link/c-link.vue')['default']
|
||||||
'CLink.demo': typeof import('./src/ui/c-link/c-link.demo.vue')['default']
|
'CLink.demo': typeof import('./src/ui/c-link/c-link.demo.vue')['default']
|
||||||
|
|
|
@ -1,14 +1,15 @@
|
||||||
import { type Page, expect, test } from '@playwright/test';
|
import { type Page, expect, test } from '@playwright/test';
|
||||||
import _ from 'lodash';
|
|
||||||
|
|
||||||
async function extractIbanInfo({ page }: { page: Page }) {
|
async function extractIbanInfo({ page }: { page: Page }) {
|
||||||
const tdHandles = await page.locator('table tr td').elementHandles();
|
const itemsLines = await page
|
||||||
const tdTextContents = await Promise.all(tdHandles.map(el => el.textContent()));
|
.locator('.c-key-value-list__item').all();
|
||||||
|
|
||||||
return _.chain(tdTextContents)
|
return await Promise.all(
|
||||||
.map(tdTextContent => tdTextContent?.trim().replace(' Copy to clipboard', ''))
|
itemsLines.map(async item => [
|
||||||
.chunk(2)
|
(await item.locator('.c-key-value-list__key').textContent() ?? '').trim(),
|
||||||
.value();
|
(await item.locator('.c-key-value-list__value').textContent() ?? '').trim(),
|
||||||
|
]),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
test.describe('Tool - Iban validator and parser', () => {
|
test.describe('Tool - Iban validator and parser', () => {
|
||||||
|
@ -41,7 +42,7 @@ test.describe('Tool - Iban validator and parser', () => {
|
||||||
|
|
||||||
expect(ibanInfo).toEqual([
|
expect(ibanInfo).toEqual([
|
||||||
['Is IBAN valid ?', 'No'],
|
['Is IBAN valid ?', 'No'],
|
||||||
['IBAN errors', 'Wrong account bank branch checksumWrong IBAN checksum Copy to clipboard'],
|
['IBAN errors', 'Wrong account bank branch checksum Wrong IBAN checksum'],
|
||||||
['Is IBAN a QR-IBAN ?', 'No'],
|
['Is IBAN a QR-IBAN ?', 'No'],
|
||||||
['Country code', 'N/A'],
|
['Country code', 'N/A'],
|
||||||
['BBAN', 'N/A'],
|
['BBAN', 'N/A'],
|
||||||
|
|
|
@ -60,7 +60,7 @@ const ibanExamples = [
|
||||||
<div>
|
<div>
|
||||||
<c-input-text v-model:value="rawIban" placeholder="Enter an IBAN to check for validity..." test-id="iban-input" />
|
<c-input-text v-model:value="rawIban" placeholder="Enter an IBAN to check for validity..." test-id="iban-input" />
|
||||||
|
|
||||||
<c-key-value-list :items="ibanInfo" my-5 />
|
<c-key-value-list :items="ibanInfo" my-5 data-test-id="iban-info" />
|
||||||
|
|
||||||
<c-card title="Valid IBAN examples">
|
<c-card title="Valid IBAN examples">
|
||||||
<div v-for="iban in ibanExamples" :key="iban">
|
<div v-for="iban in ibanExamples" :key="iban">
|
||||||
|
|
27
src/ui/c-key-value-list/c-key-value-list-item.vue
Normal file
27
src/ui/c-key-value-list/c-key-value-list-item.vue
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import _ from 'lodash';
|
||||||
|
import type { CKeyValueListItem } from './c-key-value-list.types';
|
||||||
|
|
||||||
|
const props = defineProps<{ item: CKeyValueListItem }>();
|
||||||
|
const { item } = toRefs(props);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div v-if="_.isArray(item.value)">
|
||||||
|
<div v-for="value in item.value" :key="value">
|
||||||
|
<c-text-copyable :value="value" :show-icon="item.showCopyButton ?? true" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else-if="_.isBoolean(item.value)">
|
||||||
|
<c-text-copyable :value="item.value ? 'true' : 'false'" :displayed-value="item.value ? 'Yes' : 'No'" :show-icon="item.showCopyButton ?? true" />
|
||||||
|
</div>
|
||||||
|
<div v-else-if="_.isNumber(item.value)" font-mono>
|
||||||
|
<c-text-copyable :value="String(item.value)" :show-icon="item.showCopyButton ?? true" />
|
||||||
|
</div>
|
||||||
|
<div v-else-if="_.isNil(item.value) || item.value === ''" op-70>
|
||||||
|
{{ item.placeholder ?? 'N/A' }}
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<c-text-copyable :value="item.value" :show-icon="item.showCopyButton ?? true" />
|
||||||
|
</div>
|
||||||
|
</template>
|
|
@ -9,29 +9,13 @@ const formattedItems = computed(() => items.value.filter(item => !_.isNil(item.v
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<table border-collapse table-fixed>
|
<div my-5>
|
||||||
<tr v-for="item in formattedItems" :key="item.label">
|
<div v-for="item in formattedItems" :key="item.label" flex gap-2 py-1 class="c-key-value-list__item">
|
||||||
<td py-1 pr-2 text-right font-bold>
|
<div flex-basis-180px text-right font-bold class="c-key-value-list__key">
|
||||||
{{ item.label }}
|
{{ item.label }}
|
||||||
</td>
|
</div>
|
||||||
|
|
||||||
<td v-if="_.isArray(item.value)">
|
<c-key-value-list-item :item="item" class="c-key-value-list__value" />
|
||||||
<div v-for="value in item.value" :key="value">
|
</div>
|
||||||
<c-text-copyable :value="value" :show-icon="item.showCopyButton ?? true" />
|
</div>
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td v-else-if="_.isBoolean(item.value)">
|
|
||||||
<c-text-copyable :value="item.value ? 'true' : 'false'" :displayed-value="item.value ? 'Yes' : 'No'" :show-icon="item.showCopyButton ?? true" />
|
|
||||||
</td>
|
|
||||||
<td v-else-if="_.isNumber(item.value)" font-mono>
|
|
||||||
<c-text-copyable :value="String(item.value)" :show-icon="item.showCopyButton ?? true" />
|
|
||||||
</td>
|
|
||||||
<td v-else-if="_.isNil(item.value) || item.value === ''" op-70>
|
|
||||||
{{ item.placeholder ?? 'N/A' }}
|
|
||||||
</td>
|
|
||||||
<td v-else>
|
|
||||||
<c-text-copyable :value="item.value" :show-icon="item.showCopyButton ?? true" />
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -19,7 +19,10 @@ const isTargetHovered = useElementHover(targetRef);
|
||||||
'op-100 scale-100': isTargetHovered,
|
'op-100 scale-100': isTargetHovered,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<slot name="tooltip">
|
<slot
|
||||||
|
v-if="isTargetHovered"
|
||||||
|
name="tooltip"
|
||||||
|
>
|
||||||
{{ tooltip }}
|
{{ tooltip }}
|
||||||
</slot>
|
</slot>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue