mirror of
https://github.com/CorentinTh/it-tools.git
synced 2025-04-25 01:06:15 -04:00
feat(new tool): pdf signature checker (#745)
This commit is contained in:
parent
205e360400
commit
478192065e
20 changed files with 448 additions and 21 deletions
5
src/ui/c-collapse/c-collapse.demo.vue
Normal file
5
src/ui/c-collapse/c-collapse.demo.vue
Normal file
|
@ -0,0 +1,5 @@
|
|||
<template>
|
||||
<c-collapse title="Collapse title">
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquet iaculis class cubilia metus per nullam gravida ad venenatis. Id elementum elementum enim orci elementum justo facilisi habitant consequat. Justo eget ligula purus laoreet penatibus eros quisque fusce sociis. In eget amet sagittis dignissim eleifend proin lacinia potenti tellus. Interdum vulputate condimentum molestie pulvinar praesent accumsan quisque venenatis imperdiet.
|
||||
</c-collapse>
|
||||
</template>
|
25
src/ui/c-collapse/c-collapse.vue
Normal file
25
src/ui/c-collapse/c-collapse.vue
Normal file
|
@ -0,0 +1,25 @@
|
|||
<script lang="ts" setup>
|
||||
const props = withDefaults(defineProps<{ title?: string }>(), { title: '' });
|
||||
const { title } = toRefs(props);
|
||||
|
||||
const isCollapsed = ref(true);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div flex cursor-pointer items-center @click="isCollapsed = !isCollapsed">
|
||||
<icon-mdi-triangle-down :class="{ 'transform-rotate--90': isCollapsed }" op-50 transition />
|
||||
|
||||
<slot name="title">
|
||||
<span class="ml-2" font-bold>{{ title }}</span>
|
||||
</slot>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-show="!isCollapsed"
|
||||
mt-2
|
||||
>
|
||||
<slot />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
3
src/ui/c-file-upload/c-file-upload.demo.vue
Normal file
3
src/ui/c-file-upload/c-file-upload.demo.vue
Normal file
|
@ -0,0 +1,3 @@
|
|||
<template>
|
||||
<c-file-upload />
|
||||
</template>
|
95
src/ui/c-file-upload/c-file-upload.vue
Normal file
95
src/ui/c-file-upload/c-file-upload.vue
Normal file
|
@ -0,0 +1,95 @@
|
|||
<script lang="ts" setup>
|
||||
import _ from 'lodash';
|
||||
|
||||
const props = withDefaults(defineProps<{
|
||||
multiple?: boolean
|
||||
accept?: string
|
||||
title?: string
|
||||
}>(), {
|
||||
multiple: false,
|
||||
accept: undefined,
|
||||
title: 'Drag and drop files here, or click to select files',
|
||||
});
|
||||
|
||||
const emit = defineEmits<{
|
||||
(event: 'filesUpload', files: File[]): void
|
||||
(event: 'fileUpload', file: File): void
|
||||
}>();
|
||||
|
||||
const { multiple } = toRefs(props);
|
||||
|
||||
const isOverDropZone = ref(false);
|
||||
|
||||
const fileInput = ref<HTMLInputElement | null>(null);
|
||||
|
||||
function triggerFileInput() {
|
||||
fileInput.value?.click();
|
||||
}
|
||||
|
||||
function handleFileInput(event: Event) {
|
||||
const files = (event.target as HTMLInputElement).files;
|
||||
|
||||
handleUpload(files);
|
||||
}
|
||||
|
||||
function handleDrop(event: DragEvent) {
|
||||
event.preventDefault();
|
||||
const files = event.dataTransfer?.files;
|
||||
|
||||
handleUpload(files);
|
||||
}
|
||||
|
||||
function handleUpload(files: FileList | null | undefined) {
|
||||
if (_.isNil(files) || _.isEmpty(files)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (multiple.value) {
|
||||
emit('filesUpload', Array.from(files));
|
||||
return;
|
||||
}
|
||||
|
||||
emit('fileUpload', files[0]);
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div
|
||||
class="flex flex-col cursor-pointer items-center justify-center border-2px border-gray-300 border-opacity-50 rounded-lg border-dashed p-8 transition-colors"
|
||||
:class="{
|
||||
'border-primary border-opacity-100': isOverDropZone,
|
||||
}"
|
||||
@click="triggerFileInput"
|
||||
@drop.prevent="handleDrop"
|
||||
@dragover.prevent
|
||||
@dragenter="isOverDropZone = true"
|
||||
@dragleave="isOverDropZone = false"
|
||||
>
|
||||
<input
|
||||
ref="fileInput"
|
||||
type="file"
|
||||
class="hidden"
|
||||
:multiple="multiple"
|
||||
:accept="accept"
|
||||
@change="handleFileInput"
|
||||
>
|
||||
<slot>
|
||||
<span op-70>
|
||||
{{ title }}
|
||||
</span>
|
||||
|
||||
<!-- separator -->
|
||||
<div my-4 w-full flex items-center justify-center op-70>
|
||||
<div class="h-1px max-w-100px flex-1 bg-gray-300 op-50" />
|
||||
<div class="mx-2 text-gray-400">
|
||||
or
|
||||
</div>
|
||||
<div class="h-1px max-w-100px flex-1 bg-gray-300 op-50" />
|
||||
</div>
|
||||
|
||||
<c-button>
|
||||
Browse files
|
||||
</c-button>
|
||||
</slot>
|
||||
</div>
|
||||
</template>
|
|
@ -9,13 +9,13 @@ const formattedItems = computed(() => items.value.filter(item => !_.isNil(item.v
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<div my-5>
|
||||
<div v-for="item in formattedItems" :key="item.label" flex gap-2 py-1 class="c-key-value-list__item">
|
||||
<div flex-basis-180px text-right font-bold class="c-key-value-list__key">
|
||||
<div flex flex-col gap-2>
|
||||
<div v-for="item in formattedItems" :key="item.label" class="c-key-value-list__item">
|
||||
<div class="c-key-value-list__key" text-13px lh-normal>
|
||||
{{ item.label }}
|
||||
</div>
|
||||
|
||||
<c-key-value-list-item :item="item" class="c-key-value-list__value" />
|
||||
<c-key-value-list-item :item="item" class="c-key-value-list__value" font-bold lh-normal />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
21
src/ui/c-modal-value/c-modal-value.demo.vue
Normal file
21
src/ui/c-modal-value/c-modal-value.demo.vue
Normal file
|
@ -0,0 +1,21 @@
|
|||
<template>
|
||||
<div flex gap-2>
|
||||
<c-modal-value value="lorem ipsum" label="test" />
|
||||
<c-modal-value>
|
||||
<template #label="{ toggleModal }">
|
||||
<c-button class="text-left" size="small" @click="toggleModal">
|
||||
Bonjour
|
||||
</c-button>
|
||||
</template>
|
||||
|
||||
<template #value>
|
||||
<pre>
|
||||
Lorem ipsum dolor sit amet consectetur adipisicing elit.
|
||||
Molestias, quisquam vitae saepe dolores quas debitis ab r
|
||||
ecusandae suscipit ex dignissimos minus quam repellat sunt.
|
||||
Molestiae culpa blanditiis totam sapiente dignissimos.
|
||||
</pre>
|
||||
</template>
|
||||
</c-modal-value>
|
||||
</div>
|
||||
</template>
|
31
src/ui/c-modal-value/c-modal-value.vue
Normal file
31
src/ui/c-modal-value/c-modal-value.vue
Normal file
|
@ -0,0 +1,31 @@
|
|||
<script lang="ts" setup>
|
||||
import { useCopy } from '@/composable/copy';
|
||||
|
||||
const props = withDefaults(defineProps<{ value: string; label?: string; copyable?: boolean }>(), { label: undefined, copyable: true });
|
||||
const { value, label } = toRefs(props);
|
||||
|
||||
const { copy, isJustCopied } = useCopy({ source: value });
|
||||
|
||||
const isModalOpen = ref(false);
|
||||
const toggleModal = useToggle(isModalOpen);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<slot name="label" :value="value" :toggle-modal="toggleModal" :is-modal-open="isModalOpen">
|
||||
<c-button class="text-left" @click="isModalOpen = true">
|
||||
{{ label }}
|
||||
</c-button>
|
||||
</slot>
|
||||
|
||||
<c-modal v-model:open="isModalOpen">
|
||||
<slot name="value" :value="value" :toggle-modal="toggleModal" :is-modal-open="isModalOpen">
|
||||
{{ value }}
|
||||
</slot>
|
||||
|
||||
<div mt-4 flex justify-center>
|
||||
<c-button class="w-full" @click="copy">
|
||||
{{ isJustCopied ? 'Copied!' : 'Copy' }}
|
||||
</c-button>
|
||||
</div>
|
||||
</c-modal>
|
||||
</template>
|
|
@ -39,7 +39,7 @@ const headers = computed(() => {
|
|||
<template>
|
||||
<div class="relative overflow-x-auto rounded">
|
||||
<table class="w-full border-collapse text-left text-sm text-gray-500 dark:text-gray-400" role="table" :aria-label="description">
|
||||
<thead v-if="!hideHeaders" class="bg-#ffffff uppercase text-gray-700 dark:bg-#333333 dark:text-gray-400">
|
||||
<thead v-if="!hideHeaders" class="bg-#ffffff uppercase text-gray-700 dark:bg-#333333 dark:text-gray-400" border-b="1px solid dark:transparent #efeff5">
|
||||
<tr>
|
||||
<th v-for="header in headers" :key="header.key" scope="col" class="px-6 py-3 text-xs">
|
||||
{{ header.label }}
|
||||
|
@ -54,7 +54,7 @@ const headers = computed(() => {
|
|||
}"
|
||||
>
|
||||
<td v-for="header in headers" :key="header.key" class="px-6 py-4">
|
||||
<slot :name="header" :row="row" :headers="headers" :value="row[header.key]">
|
||||
<slot :name="header.key" :row="row" :headers="headers" :value="row[header.key]">
|
||||
{{ row[header.key] }}
|
||||
</slot>
|
||||
</td>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue