|
| 1 | +--- |
| 2 | +title: Template fichier personnalisé |
| 3 | +description: Personnalisation de la présentation de la sélection des fichiers |
| 4 | +layout: libdoc/page-split |
| 5 | +category: Exemples |
| 6 | +order: 40 |
| 7 | +--- |
| 8 | + |
| 9 | +```html |
| 10 | +<label for="first">Template fichier nommé "foo"</label> |
| 11 | +<input type="file" id="first" multiple> |
| 12 | +<div data-cpreview="first" data-cpreview-template-file="foo" class="c-dis m-flex m-gap-3 m-wrap"></div> |
| 13 | +``` |
| 14 | +{:.playground title="Template fichier personnalisé"} |
| 15 | + |
| 16 | +Quand l'attribut `data-cpreview-template-file="TOKEN_TEMPLATE_FILE"` est renseigné, cPreview invoque `cPreviewTemplates[TOKEN_TEMPLATE_FILE]` et l'utilise pour générer le HTML du template fichiers sélectionnés. |
| 17 | + |
| 18 | +Pour ajouter un template de fichiers, ajouter une méthode dans l'objet `cPreviewTemplates.file[TOKEN_NOM_DU NOUVEAU_TEMPLATE]`, sur la base de l'exemple suivant: |
| 19 | + |
| 20 | +```javascript |
| 21 | +// cPreview Templates optionnels |
| 22 | +let cPreviewTemplates = { |
| 23 | + file: { |
| 24 | + /** |
| 25 | + * CUSTOM TEMPLATE FOR FILE ITEM |
| 26 | + * @param {Object} data |
| 27 | + * @param {Object} data.el_target_container DOM element if the file item |
| 28 | + * @param {Object} data.e Reader onload event |
| 29 | + * @param {Object} data.el_file File List element |
| 30 | + */ |
| 31 | + foo: function(data) { |
| 32 | + // Create blob |
| 33 | + const blob_url = URL.createObjectURL(data.el_file); |
| 34 | + // Create thumb item |
| 35 | + const el_item = document.createElement('div'); |
| 36 | + el_item.setAttribute('class', 'c-dis m-flex m-column m-main-space-between m-gap-3 c-dim m-o-hidden'); |
| 37 | + el_item.setAttribute('m-w-4t', 'md,lg,xl'); |
| 38 | + el_item.setAttribute('m-w-6t', 'sm'); |
| 39 | + el_item.setAttribute('m-w-100', 'xs'); |
| 40 | + // Get optional current language |
| 41 | + const current_lang = data.el_target_container.dataset.cpreviewI18n; |
| 42 | + |
| 43 | + el_item.innerHTML = ` |
| 44 | + <picture class=" |
| 45 | + c-dis m-flex m-main-center m-cross-center |
| 46 | + c-dim m-w-100 m-o-hidden"></picture> |
| 47 | + <ul class=" |
| 48 | + c-dis m-flex m-column |
| 49 | + c-dim m-m-0 m-p-0 |
| 50 | + c-txt m-fs-4 |
| 51 | + c-skin m-ls-none main-data"> |
| 52 | + <li class=" |
| 53 | + c-dis m-flex m-main-space-between m-gap-3 |
| 54 | + c-dim m-order--1"> |
| 55 | + ${cPreview.getLanguageString('file_name', current_lang) || 'File name'} |
| 56 | + <strong class="c-txt m-ff-lead-500 m-ta-right m-wb-break-word"> |
| 57 | + ${data.el_file.name} |
| 58 | + </strong> |
| 59 | + </li> |
| 60 | + <li class=" |
| 61 | + c-dis m-flex m-main-space-between m-gap-3 |
| 62 | + c-dim m-order--1"> |
| 63 | + ${cPreview.getLanguageString('file_size', current_lang) || 'File size'} |
| 64 | + <strong class="c-txt m-ff-lead-500 m-ta-right m-wb-break-word"> |
| 65 | + ${cPreview.formatBytes(data.e.loaded, null, current_lang)} |
| 66 | + </strong> |
| 67 | + </li> |
| 68 | + <li class=" |
| 69 | + c-dis m-flex m-main-space-between m-gap-3 |
| 70 | + c-dim m-order--1"> |
| 71 | + ${cPreview.getLanguageString('file_type', current_lang) || 'File type'} |
| 72 | + <strong class="c-txt m-ff-lead-500 m-ta-right m-wb-break-word"> |
| 73 | + ${data.el_file.type} |
| 74 | + </strong> |
| 75 | + </li> |
| 76 | + <li class="c-dis m-flex m-main-space-between m-gap-3"> |
| 77 | + <span onclick="cPreview.remove(this, '${data.el_file.name}')" |
| 78 | + class="c-skin m-c-support-danger-500 m-cur-pointer"> |
| 79 | + ${cPreview.getLanguageString('remove', current_lang) || 'Remove'} |
| 80 | + </span> |
| 81 | + </li> |
| 82 | + </ul>`; |
| 83 | + data.el_target_container.appendChild(el_item); |
| 84 | + const el_picture = el_item.querySelector('picture'); |
| 85 | + el_picture.innerHTML = ''; |
| 86 | + // If file is an image or video |
| 87 | + if (data.el_file.type.indexOf('image/') == 0 || data.el_file.type.indexOf('video/') == 0) { |
| 88 | + el_picture.innerHTML = ` |
| 89 | + <div class=" |
| 90 | + c-dim m-order--1 m-m-6 m-p-3 |
| 91 | + c-skin m-brad-3"></div>`; |
| 92 | + // Create thumb image item |
| 93 | + let el_image = document.createElement('img'); |
| 94 | + if (data.el_file.type.indexOf('video/') == 0) { |
| 95 | + el_image = document.createElement('video'); |
| 96 | + el_image.setAttribute('controls', 'true') |
| 97 | + } |
| 98 | + // el_image.src = data.e.target.result; |
| 99 | + el_image.src = blob_url; |
| 100 | + const loading = setInterval(() => { |
| 101 | + // console.log('attempt', data.el_file.name); |
| 102 | + if ((el_image.naturalWidth > 0 && el_image.naturalHeight > 0) || data.el_file.type == 'image/svg+xml' || data.el_file.type.indexOf('video/') == 0) { |
| 103 | + |
| 104 | + const image_definition = el_image.naturalWidth * el_image.naturalHeight; |
| 105 | + let image_definition_status_class = 'c-skin m-c-support-success-400'; |
| 106 | + if (image_definition < 5000000) { |
| 107 | + image_definition_status_class = 'u-c-support-warning-400'; |
| 108 | + } |
| 109 | + el_image.classList.add('c-dim', 'm-w-100', 'm-h-auto'); |
| 110 | + el_image.setAttribute('alt', data.el_file.name); |
| 111 | + el_picture.innerHTML = ''; |
| 112 | + el_picture.appendChild(el_image); |
| 113 | + el_item.querySelector('.main-data').insertAdjacentHTML( |
| 114 | + 'beforeend', |
| 115 | + ` |
| 116 | + <li class=" |
| 117 | + c-dis m-flex m-main-space-between m-gap-3 |
| 118 | + c-dim m-order--1 |
| 119 | + ${image_definition_status_class}"> |
| 120 | + ${cPreview.getLanguageString('definition', current_lang) || 'Definition'} |
| 121 | + <strong class="c-txt m-ff-lead-500 m-ta-right"> |
| 122 | + <span>${el_image.naturalWidth || el_image.videoWidth}</span> x <span>${el_image.naturalHeight || el_image.videoHeight}</span> px |
| 123 | + </strong> |
| 124 | + </li> |
| 125 | + ` |
| 126 | + ); |
| 127 | + clearInterval(loading); |
| 128 | + } |
| 129 | + }, 500); |
| 130 | + } else { |
| 131 | + if (data.el_file.type == 'application/pdf' || data.el_file.type == 'text/html' || data.el_file.type == 'text/plain') { |
| 132 | + el_picture.setAttribute('class', 'c-dis m-flex m-main-center m-cross-center c-dim m-w-100 m-o-hidden c-skin m-c-primary-500 m-bc-primary-100 m-brad-1'); |
| 133 | + el_picture.innerHTML = `<iframe src="${blob_url}" class="c-dim m-w-100 c-skin m-b-0" height="200"></iframe>`; |
| 134 | + } else { |
| 135 | + el_picture.setAttribute('class', 'c-dis m-flex m-main-center m-cross-center c-dim m-w-100 m-o-hidden m-pt-6 m-pb-6 c-skin m-c-primary-500 m-bc-primary-100 m-brad-1'); |
| 136 | + el_picture.innerHTML = `<span class="c-txt m-fs-10">↥</span>`; |
| 137 | + } |
| 138 | + } |
| 139 | + }, |
| 140 | + /** |
| 141 | + * DEFAULT TEMPLATE FOR FILE ITEM |
| 142 | + * @param {Object} data |
| 143 | + * @param {Object} data.el_target_container DOM element if the file item |
| 144 | + * @param {Object} data.e Reader onload event |
| 145 | + * @param {Object} data.el_file File List element |
| 146 | + */ |
| 147 | + default: function(data) { |
| 148 | + // Create thumb item |
| 149 | + const el_item = document.createElement('div'); |
| 150 | + const current_lang = data.el_target_container.dataset.cpreviewI18n; |
| 151 | + el_item.innerHTML = ` |
| 152 | + <ul> |
| 153 | + <li>${cPreview.getLanguageString('file_name', current_lang) || 'File name'}: ${data.el_file.name}</li> |
| 154 | + <li>${cPreview.getLanguageString('file_size', current_lang) || 'File size'}: ${cPreview.formatBytes(data.e.loaded, current_lang)}</li> |
| 155 | + <li>${cPreview.getLanguageString('file_type', current_lang) || 'File type'}: ${data.el_file.type}</li> |
| 156 | + <li> |
| 157 | + <button onclick="cPreview.remove(this, '${data.el_file.name}')"> |
| 158 | + ${cPreview.getLanguageString('remove', current_lang) || 'Remove'} |
| 159 | + </button> |
| 160 | + </li> |
| 161 | + </ul>`; |
| 162 | + // Insert file markup |
| 163 | + data.el_target_container.appendChild(el_item); |
| 164 | + } |
| 165 | + } |
| 166 | +} |
| 167 | +``` |
| 168 | + |
0 commit comments