diff --git a/packages/components/src/components/input-file/shadow.tsx b/packages/components/src/components/input-file/shadow.tsx index 12bf929f06..a605215201 100644 --- a/packages/components/src/components/input-file/shadow.tsx +++ b/packages/components/src/components/input-file/shadow.tsx @@ -25,6 +25,8 @@ import KolFormFieldStateWrapperFc, { type FormFieldStateWrapperProps } from '../ import KolInputStateWrapperFc, { type InputStateWrapperProps } from '../../functional-component-wrappers/InputStateWrapper'; import KolInputContainerFc from '../../functional-component-wrappers/InputContainerStateWrapper'; import { InputFileController } from './controller'; +import { translate } from '../../i18n'; +import { KolButtonWcTag } from '../../core/component-names'; /** * @slot - Die Beschriftung des Eingabefeldes. @@ -93,7 +95,9 @@ export class KolInputFile implements InputFileAPI, FocusableElement { return ( + {this.filename} + ); @@ -204,6 +208,7 @@ export class KolInputFile implements InputFileAPI, FocusableElement { */ @Prop({ mutable: true, reflect: true }) public _touched?: boolean = false; + @State() private filename: string = translate('kol-filename-text'); @State() public state: InputFileStates = { _hideMsg: false, _id: `id-${nonce()}`, @@ -315,13 +320,43 @@ export class KolInputFile implements InputFileAPI, FocusableElement { this.controller.componentWillLoad(); } + public componentDidLoad(): void { + const container = this.inputRef?.parentElement?.parentElement; + container?.addEventListener('dragover', this.onDragOver); + container?.addEventListener('dragleave', this.onDragLeave); + container?.addEventListener('drop', this.onDrop); + } + + private onDragOver = (event: DragEvent): void => { + event.preventDefault(); + this.inputRef?.parentElement?.parentElement?.classList.add('kol-input-container--is-dragover'); + }; + + private onDragLeave = (): void => { + this.inputRef?.parentElement?.parentElement?.classList.remove('kol-input-container--is-dragover'); + }; + + private onDrop = (event: DragEvent): void => { + event.preventDefault(); + this.inputRef?.parentElement?.parentElement?.classList.remove('kol-input-container--is-dragover'); + if (event.dataTransfer?.files.length) { + const files = event.dataTransfer.files; + this.filename = Array.from(files) + .map((file) => file.name) + .join(', '); + this.controller.setFormAssociatedValue(files); + } + }; private onChange = (event: Event): void => { if (this.inputRef instanceof HTMLInputElement && this.inputRef.type === 'file') { const value = this.inputRef.files; + this.filename = value?.length + ? Array.from(value) + .map((file) => file.name) + .join(', ') + : translate('kol-filename-text'); this.controller.onFacade.onChange(event, value); - - // Static form handling this.controller.setFormAssociatedValue(value); } }; diff --git a/packages/components/src/components/input-file/style.scss b/packages/components/src/components/input-file/style.scss index 6320d2b279..ca949f9415 100644 --- a/packages/components/src/components/input-file/style.scss +++ b/packages/components/src/components/input-file/style.scss @@ -13,5 +13,35 @@ @layer kol-component { .kol-input { padding: calc((var(--a11y-min-size) - rem(16)) / 10) 0.5em; + position: absolute; + inset: 0; + width: 100%; + height: 100%; + opacity: 0; + cursor: pointer; + } + + .kol-input-container { + $root: &; + padding: 0 0 0 rem(8) !important; + + &__container { + display: flex; + align-items: center; + overflow: hidden; + height: var(--a11y-min-size); + } + + &__filename { + flex-grow: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin-left: rem(4); + } + + &:has(> #{$root}__adornment--start):has(> #{$root}__adornment--end) { + grid-template-columns: auto 1fr; + } } } diff --git a/packages/components/src/components/input-file/test/__snapshots__/snapshot.spec.tsx.snap b/packages/components/src/components/input-file/test/__snapshots__/snapshot.spec.tsx.snap index 8d67d7e52b..9f494ace3b 100644 --- a/packages/components/src/components/input-file/test/__snapshots__/snapshot.spec.tsx.snap +++ b/packages/components/src/components/input-file/test/__snapshots__/snapshot.spec.tsx.snap @@ -15,7 +15,11 @@ exports[`kol-input-file should render with _label="Label" _name="field" _placeho
+ + kol-filename-text + +
@@ -38,7 +42,11 @@ exports[`kol-input-file should render with _label="Label" _name="field" _placeho
+ + kol-filename-text + +
@@ -61,7 +69,11 @@ exports[`kol-input-file should render with _label="Label" _name="field" _placeho
+ + kol-filename-text + +
@@ -84,7 +96,11 @@ exports[`kol-input-file should render with _label="Label" _name="field" _placeho
+ + kol-filename-text + +
@@ -113,7 +129,11 @@ exports[`kol-input-file should render with _label="Label" _name="field" _placeho
+ + kol-filename-text + +
@@ -142,7 +162,11 @@ exports[`kol-input-file should render with _label="Label" _name="field" _placeho
+ + kol-filename-text + +
@@ -167,7 +191,11 @@ exports[`kol-input-file should render with _label="Label" _name="field" _placeho
+ + kol-filename-text + +
@@ -193,7 +221,11 @@ exports[`kol-input-file should render with _label="Label" _name="field" _placeho
+ + kol-filename-text + +
@@ -216,7 +248,11 @@ exports[`kol-input-file should render with _label="Label" _name="field" _placeho
+ + kol-filename-text + +
@@ -239,7 +275,11 @@ exports[`kol-input-file should render with _label="Label" _name="field" _placeho
+ + kol-filename-text + +
@@ -263,7 +303,11 @@ exports[`kol-input-file should render with _label="Label" _name="field" _placeho
+ + kol-filename-text + +
@@ -287,7 +331,11 @@ exports[`kol-input-file should render with _label="Label" _name="field" _placeho
+ + kol-filename-text + +
@@ -313,7 +361,11 @@ exports[`kol-input-file should render with _label="Label" _name="field" _placeho
+ + kol-filename-text + +
@@ -336,7 +388,11 @@ exports[`kol-input-file should render with _label="Label" _name="field" _placeho
+ + kol-filename-text + +
diff --git a/packages/components/src/locales/de.ts b/packages/components/src/locales/de.ts index 54690dbc48..306e4aa3f9 100644 --- a/packages/components/src/locales/de.ts +++ b/packages/components/src/locales/de.ts @@ -48,4 +48,6 @@ export default { 'hide-password': 'ausblenden', 'no-results-message': 'Keine Ergebnisse gefunden.', 'delete-selection': 'Auswahl entfernen', + 'filename-text': 'Datei auswählen oder hier ablegen...', + 'data-browse-text': 'Datei auswählen', }; diff --git a/packages/components/src/locales/en.ts b/packages/components/src/locales/en.ts index e4567e70f6..363d595b1e 100644 --- a/packages/components/src/locales/en.ts +++ b/packages/components/src/locales/en.ts @@ -48,4 +48,6 @@ export default { 'hide-password': 'Hide', 'no-results-message': 'No results found.', 'delete-selection': 'Delete selection', + 'filename-text': 'Choose a file or drop it here...', + 'data-browse-text': 'Browse', }; diff --git a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-handout-basic-firefox-linux.png b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-handout-basic-firefox-linux.png index e6ee9090fc..381100309c 100644 Binary files a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-handout-basic-firefox-linux.png and b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-handout-basic-firefox-linux.png differ diff --git a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-handout-basic-zoom-firefox-linux.png b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-handout-basic-zoom-firefox-linux.png index f4083651d0..96e6c92769 100644 Binary files a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-handout-basic-zoom-firefox-linux.png and b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-handout-basic-zoom-firefox-linux.png differ diff --git a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-firefox-linux.png b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-firefox-linux.png index 168ac43a58..c4b79e8200 100644 Binary files a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-firefox-linux.png and b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-firefox-linux.png differ diff --git a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-zoom-firefox-linux.png b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-zoom-firefox-linux.png index 0fcf1d8ea9..a111ce5ef0 100644 Binary files a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-zoom-firefox-linux.png and b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-zoom-firefox-linux.png differ diff --git a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-firefox-linux.png b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-firefox-linux.png index f110ad5224..85f39370f0 100644 Binary files a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-firefox-linux.png and b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-firefox-linux.png differ diff --git a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-zoom-firefox-linux.png b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-zoom-firefox-linux.png index 682840efe1..96157209fe 100644 Binary files a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-zoom-firefox-linux.png and b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-zoom-firefox-linux.png differ diff --git a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-firefox-linux.png b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-firefox-linux.png index 3597755e69..02247bc8f6 100644 Binary files a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-firefox-linux.png and b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-firefox-linux.png differ diff --git a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-zoom-firefox-linux.png b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-zoom-firefox-linux.png index bb24b6b74b..063c6becb9 100644 Binary files a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-zoom-firefox-linux.png and b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-zoom-firefox-linux.png differ diff --git a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-firefox-linux.png b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-firefox-linux.png index df127777b1..be83e4a88d 100644 Binary files a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-firefox-linux.png and b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-firefox-linux.png differ diff --git a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-zoom-firefox-linux.png b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-zoom-firefox-linux.png index 25152df59f..4c8da2e64e 100644 Binary files a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-zoom-firefox-linux.png and b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-zoom-firefox-linux.png differ diff --git a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-static-form-firefox-linux.png b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-static-form-firefox-linux.png index 8700dbbbe2..e7e1442969 100644 Binary files a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-static-form-firefox-linux.png and b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-static-form-firefox-linux.png differ diff --git a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-static-form-zoom-firefox-linux.png b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-static-form-zoom-firefox-linux.png index f11ce6a70d..5f34b42d80 100644 Binary files a/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-static-form-zoom-firefox-linux.png and b/packages/test-tag-name-transformer/snapshots/theme-default/snapshot-for-scenarios-static-form-zoom-firefox-linux.png differ diff --git a/packages/themes/default/snapshots/theme-default/snapshot-for-handout-basic-firefox-linux.png b/packages/themes/default/snapshots/theme-default/snapshot-for-handout-basic-firefox-linux.png index e6ee9090fc..381100309c 100644 Binary files a/packages/themes/default/snapshots/theme-default/snapshot-for-handout-basic-firefox-linux.png and b/packages/themes/default/snapshots/theme-default/snapshot-for-handout-basic-firefox-linux.png differ diff --git a/packages/themes/default/snapshots/theme-default/snapshot-for-handout-basic-zoom-firefox-linux.png b/packages/themes/default/snapshots/theme-default/snapshot-for-handout-basic-zoom-firefox-linux.png index f4083651d0..96e6c92769 100644 Binary files a/packages/themes/default/snapshots/theme-default/snapshot-for-handout-basic-zoom-firefox-linux.png and b/packages/themes/default/snapshots/theme-default/snapshot-for-handout-basic-zoom-firefox-linux.png differ diff --git a/packages/themes/default/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-firefox-linux.png b/packages/themes/default/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-firefox-linux.png index 168ac43a58..c4b79e8200 100644 Binary files a/packages/themes/default/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-firefox-linux.png and b/packages/themes/default/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-firefox-linux.png differ diff --git a/packages/themes/default/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-zoom-firefox-linux.png b/packages/themes/default/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-zoom-firefox-linux.png index 0fcf1d8ea9..a111ce5ef0 100644 Binary files a/packages/themes/default/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-zoom-firefox-linux.png and b/packages/themes/default/snapshots/theme-default/snapshot-for-input-file-basic-noColumns-zoom-firefox-linux.png differ diff --git a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-firefox-linux.png b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-firefox-linux.png index f110ad5224..85f39370f0 100644 Binary files a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-firefox-linux.png and b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-firefox-linux.png differ diff --git a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-zoom-firefox-linux.png b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-zoom-firefox-linux.png index 682840efe1..96157209fe 100644 Binary files a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-zoom-firefox-linux.png and b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-disabled-interactive-scenario-zoom-firefox-linux.png differ diff --git a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-firefox-linux.png b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-firefox-linux.png index 3597755e69..02247bc8f6 100644 Binary files a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-firefox-linux.png and b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-firefox-linux.png differ diff --git a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-zoom-firefox-linux.png b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-zoom-firefox-linux.png index bb24b6b74b..063c6becb9 100644 Binary files a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-zoom-firefox-linux.png and b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFile-zoom-firefox-linux.png differ diff --git a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-firefox-linux.png b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-firefox-linux.png index df127777b1..be83e4a88d 100644 Binary files a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-firefox-linux.png and b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-firefox-linux.png differ diff --git a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-zoom-firefox-linux.png b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-zoom-firefox-linux.png index 25152df59f..4c8da2e64e 100644 Binary files a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-zoom-firefox-linux.png and b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-focus-elements-component-inputFileMultiple-zoom-firefox-linux.png differ diff --git a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-static-form-firefox-linux.png b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-static-form-firefox-linux.png index 8700dbbbe2..e7e1442969 100644 Binary files a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-static-form-firefox-linux.png and b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-static-form-firefox-linux.png differ diff --git a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-static-form-zoom-firefox-linux.png b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-static-form-zoom-firefox-linux.png index f11ce6a70d..5f34b42d80 100644 Binary files a/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-static-form-zoom-firefox-linux.png and b/packages/themes/default/snapshots/theme-default/snapshot-for-scenarios-static-form-zoom-firefox-linux.png differ diff --git a/packages/themes/default/src/components/input-file.scss b/packages/themes/default/src/components/input-file.scss index 6563f36af9..da55916d9f 100644 --- a/packages/themes/default/src/components/input-file.scss +++ b/packages/themes/default/src/components/input-file.scss @@ -1,9 +1,27 @@ @use '../@shared/input-text' as *; @use '../mixins/rem' as *; +@use '../mixins/button' as *; @layer kol-theme-component { + @include kol-button('kol-button'); + .kol-input-container { gap: initial; + + &__filename { + color: var(--color-subtle); + } + + &--is-dragover { + border-color: var(--color-primary) !important; + } + } + + .kol-button { + &__text { + border-radius: 0 !important; + white-space: nowrap; + } } .kol-input { diff --git a/packages/themes/ecl/src/ecl-ec/components/input-file.scss b/packages/themes/ecl/src/ecl-ec/components/input-file.scss index 5ce54a978e..93d580d999 100644 --- a/packages/themes/ecl/src/ecl-ec/components/input-file.scss +++ b/packages/themes/ecl/src/ecl-ec/components/input-file.scss @@ -1 +1,18 @@ @use '../@shared/input-text' as *; +@use '../mixins/button' as *; + +@layer kol-theme-component { + @include kol-button('kol-button'); + + .kol-button { + &__text { + white-space: nowrap; + } + } + + .kol-input-container { + &--is-dragover { + border-color: var(--color-blue) !important; + } + } +} diff --git a/packages/themes/ecl/src/ecl-eu/components/input-file.scss b/packages/themes/ecl/src/ecl-eu/components/input-file.scss index 5ce54a978e..44aaadce65 100644 --- a/packages/themes/ecl/src/ecl-eu/components/input-file.scss +++ b/packages/themes/ecl/src/ecl-eu/components/input-file.scss @@ -1 +1,19 @@ @use '../@shared/input-text' as *; +@use '../mixins/button' as *; + +@layer kol-theme-component { + @include kol-button('kol-button'); + + .kol-button { + &__text { + border-radius: 0 !important; + white-space: nowrap; + } + } + + .kol-input-container { + &--is-dragover { + border-color: var(--color-blue) !important; + } + } +}