diff --git a/resources/js/components/field-validation/Builder.vue b/resources/js/components/field-validation/Builder.vue index 0f7c91bb072..2128eacc9cf 100644 --- a/resources/js/components/field-validation/Builder.vue +++ b/resources/js/components/field-validation/Builder.vue @@ -34,6 +34,7 @@ multiple searchable taggable + paste-delimiter="|" close-on-select :model-value="rules" @selected="add($event)" diff --git a/resources/js/components/fieldtypes/TagsFieldtype.vue b/resources/js/components/fieldtypes/TagsFieldtype.vue index c4b3e091467..6187d397d07 100644 --- a/resources/js/components/fieldtypes/TagsFieldtype.vue +++ b/resources/js/components/fieldtypes/TagsFieldtype.vue @@ -6,6 +6,7 @@ :multiple="true" :options="options" :placeholder="__(config.placeholder)" + :paste-delimiter="config.paste_delimiter || ','" :read-only="isReadOnly" :taggable="true" :should-open-dropdown="(open) => open && options.length > 0" diff --git a/resources/js/components/ui/Combobox/Combobox.vue b/resources/js/components/ui/Combobox/Combobox.vue index 5f7eda802ea..478da310f21 100644 --- a/resources/js/components/ui/Combobox/Combobox.vue +++ b/resources/js/components/ui/Combobox/Combobox.vue @@ -55,6 +55,8 @@ const props = defineProps({ options: { type: Array, default: () => [] }, /** Key of the option's value in the option's object. */ optionValue: { type: String, default: 'value' }, + /** The delimiter used to split pasted text into multiple tags. Only used when `taggable` is `true`. */ + pasteDelimiter: { type: String, default: ',' }, placeholder: { type: String, default: () => __('Select...') }, readOnly: { type: Boolean, default: false }, /** When `true`, the options will be searchable. */ @@ -315,7 +317,12 @@ function onPaste(e) { const pastedValue = e.clipboardData.getData('text'); - updateModelValue([...(props.modelValue ?? []), ...pastedValue.split(',').map((v) => v.trim())]); + const tags = pastedValue + .split(props.pasteDelimiter) + .map((v) => v.trim()) + .filter((v) => v !== ''); + + updateModelValue([...(props.modelValue ?? []), ...tags]); } function pushTaggableOption(e) { diff --git a/src/Http/Controllers/CP/Assets/AssetContainersController.php b/src/Http/Controllers/CP/Assets/AssetContainersController.php index 06085646662..42e08525a99 100644 --- a/src/Http/Controllers/CP/Assets/AssetContainersController.php +++ b/src/Http/Controllers/CP/Assets/AssetContainersController.php @@ -188,6 +188,7 @@ protected function formBlueprint($container = null) 'type' => 'taggable', 'display' => __('Validation Rules'), 'instructions' => __('statamic::messages.asset_container_validation_rules_instructions'), + 'paste_delimiter' => '|', ], ], ],