) {
const defaults = { addKeyCodes: ["Comma"], limit: Infinity, accept: "options", orderable: true };
const options = Object.assign({}, defaults, userOptions);
@@ -42,15 +49,15 @@ export class TagInput {
options.orderable = false;
}
- field.className = "form-input-tag";
+ field.className = "form-input-tags-wrap";
- innerInput.className = "form-input tag-inner-input";
+ innerInput.className = "form-input";
innerInput.type = "text";
+ innerInput.id = input.id;
innerInput.placeholder = input.placeholder;
- hiddenInput.className = "form-input-tag-hidden";
+ hiddenInput.className = "form-input-hidden";
hiddenInput.name = input.name;
- hiddenInput.id = input.id;
hiddenInput.type = "text";
hiddenInput.value = input.value;
hiddenInput.readOnly = true;
@@ -130,7 +137,7 @@ export class TagInput {
function createDropdown() {
if ("options" in input.dataset) {
- const list: { [key: string | number]: string } = JSON.parse(input.dataset.options ?? "{}");
+ const list: { [key: string | number]: string | TagsInputDropdownItem } = JSON.parse(input.dataset.options ?? "{}");
const isAssociative = !Array.isArray(list);
if ("accept" in input.dataset) {
@@ -143,9 +150,22 @@ export class TagInput {
for (const key in list) {
const item = document.createElement("div");
+
+ const { value, icon, thumb } = typeof list[key] === "object" ? list[key] : { value: list[key], icon: undefined, thumb: undefined };
+
item.className = "dropdown-item";
- item.innerHTML = list[key];
- item.dataset.value = isAssociative ? key : list[key];
+ item.innerHTML = value;
+ item.dataset.value = isAssociative ? key : value;
+
+ if (thumb) {
+ const img = document.createElement("img");
+ img.src = thumb;
+ img.className = "dropdown-thumb";
+ item.insertAdjacentElement("afterbegin", img);
+ } else if (icon) {
+ insertIcon(icon, item);
+ }
+
item.addEventListener("click", function () {
if (this.dataset.value) {
addTag(this.dataset.value);
diff --git a/panel/views/fields/file.php b/panel/views/fields/file.php
new file mode 100644
index 000000000..8a9b57cb5
--- /dev/null
+++ b/panel/views/fields/file.php
@@ -0,0 +1,19 @@
+layout('fields.field') ?>
+
+ = $this->icon($field->get('icon', 'file')) ?>
+ attr([
+ 'class' => 'form-select',
+ 'id' => $field->name(),
+ 'name' => $field->formName(),
+ 'required' => $field->isRequired(),
+ 'disabled' => $field->isDisabled(),
+ 'hidden' => $field->isHidden(),
+ ]) ?>>
+ isRequired()): ?>
+ = $this->translate('fields.file.none') ?>
+
+ options() as $value => $label) : ?>
+ attr(['value' => $value, 'selected' => $value == $field->value(), 'data-icon' => $label['icon'], 'data-thumb' => $label['thumb']]) ?>>= $this->escape($label['value']) ?>
+
+
+
\ No newline at end of file
diff --git a/panel/views/fields/files.php b/panel/views/fields/files.php
new file mode 100644
index 000000000..f82743953
--- /dev/null
+++ b/panel/views/fields/files.php
@@ -0,0 +1,19 @@
+layout('fields.field') ?>
+
+ = $this->icon($field->get('icon', 'file')) ?>
+ attr([
+ 'class' => ['form-input', 'form-input-tags'],
+ 'type' => 'text',
+ 'id' => $field->name(),
+ 'name' => $field->formName(),
+ 'value' => implode(', ', (array) $field->value()),
+ 'placeholder' => $field->placeholder(),
+ 'required' => $field->isRequired(),
+ 'disabled' => $field->isDisabled(),
+ 'hidden' => $field->isHidden(),
+ 'data-limit' => $field->limit(),
+ 'data-options' => Formwork\Parsers\Json::encode($field->options()),
+ 'data-accept' => 'options',
+ 'data-orderable' => $field->isOrderable(),
+ ]) ?>>
+
\ No newline at end of file
diff --git a/panel/views/fields/image.php b/panel/views/fields/image.php
index 20953c0f4..4087ade4c 100644
--- a/panel/views/fields/image.php
+++ b/panel/views/fields/image.php
@@ -1,17 +1,19 @@
layout('fields.field') ?>
= $this->icon($field->get('icon', 'image')) ?>
- attr([
- 'type' => 'text',
- 'class' => ['form-input', 'form-input-image'],
- 'id' => $field->name(),
- 'name' => $field->formName(),
- 'value' => basename($field->value() ?? ''),
- 'placeholder' => $field->placeholder(),
- 'readonly' => true,
- 'required' => $field->isRequired(),
- 'disabled' => $field->isDisabled(),
- 'hidden' => $field->isHidden(),
+ attr([
+ 'class' => 'form-select',
+ 'id' => $field->name(),
+ 'name' => $field->formName(),
+ 'required' => $field->isRequired(),
+ 'disabled' => $field->isDisabled(),
+ 'hidden' => $field->isHidden(),
]) ?>>
- = $this->icon('times-circle') ?>
+ isRequired()): ?>
+ = $this->translate('fields.image.none') ?>
+
+ options() as $value => $label) : ?>
+ attr(['value' => $value, 'selected' => $value == $field->value(), 'data-icon' => $label['icon'], 'data-thumb' => $label['thumb']]) ?>>= $this->escape($label['value']) ?>
+
+
\ No newline at end of file
diff --git a/panel/views/fields/images.php b/panel/views/fields/images.php
new file mode 100644
index 000000000..0b15ee773
--- /dev/null
+++ b/panel/views/fields/images.php
@@ -0,0 +1,19 @@
+layout('fields.field') ?>
+
+ = $this->icon($field->get('icon', 'image')) ?>
+ attr([
+ 'class' => ['form-input', 'form-input-tags'],
+ 'type' => 'text',
+ 'id' => $field->name(),
+ 'name' => $field->formName(),
+ 'value' => implode(', ', (array) $field->value()),
+ 'placeholder' => $field->placeholder(),
+ 'required' => $field->isRequired(),
+ 'disabled' => $field->isDisabled(),
+ 'hidden' => $field->isHidden(),
+ 'data-limit' => $field->limit(),
+ 'data-options' => Formwork\Parsers\Json::encode($field->options()),
+ 'data-accept' => 'options',
+ 'data-orderable' => $field->isOrderable(),
+ ]) ?>>
+
\ No newline at end of file
diff --git a/panel/views/fields/tags.php b/panel/views/fields/tags.php
index f1e92d935..0e66a33f6 100644
--- a/panel/views/fields/tags.php
+++ b/panel/views/fields/tags.php
@@ -2,7 +2,7 @@
= $this->icon($field->get('icon', 'tag')) ?>
attr([
- 'class' => 'form-input',
+ 'class' => ['form-input', 'form-input-tags'],
'type' => 'text',
'id' => $field->name(),
'name' => $field->formName(),
@@ -11,10 +11,9 @@
'required' => $field->isRequired(),
'disabled' => $field->isDisabled(),
'hidden' => $field->isHidden(),
- 'data-field' => 'tags',
- 'data-limit' => $field->get('limit'),
- 'data-options' => $field->has('options') ? Formwork\Parsers\Json::encode($field->options()) : null,
- 'data-accept' => $field->get('accept', 'options'),
- 'data-orderable' => $field->is('orderable', true),
+ 'data-limit' => $field->limit(),
+ 'data-options' => $field->options() ? Formwork\Parsers\Json::encode($field->options()) : null,
+ 'data-accept' => $field->accept(),
+ 'data-orderable' => $field->isOrderable(),
]) ?>>
\ No newline at end of file
diff --git a/site/schemes/pages/post.yaml b/site/schemes/pages/post.yaml
index df3063faf..c2ead81cb 100644
--- a/site/schemes/pages/post.yaml
+++ b/site/schemes/pages/post.yaml
@@ -10,7 +10,7 @@ options:
layout:
sections:
content:
- fields: [title, image, tags, summary, content]
+ fields: [title, coverImage, tags, summary, content]
fields:
summary:
@@ -18,11 +18,9 @@ fields:
label: '{{page.summary}}'
rows: 5
- image:
+ coverImage:
type: image
- default: null
label: '{{page.image}}'
- placeholder: '{{page.noImage}}'
tags:
type: tags
diff --git a/site/templates/partials/cover-image.php b/site/templates/partials/cover-image.php
index a04d7949c..493f2ed8c 100644
--- a/site/templates/partials/cover-image.php
+++ b/site/templates/partials/cover-image.php
@@ -1,3 +1,3 @@
-has('image') && !$page->image()->isEmpty() && $page->images()->has($page->image())) : ?>
-
+has('coverImage') && ($image = $page->coverImage())) : ?>
+
\ No newline at end of file