- |
|
{{i18n "admin.api.scopes.allowed_urls"}} |
{{i18n
@@ -265,28 +263,18 @@ export default class AdminConfigAreasApiKeysNew extends Component {
-
-
- |
-
- {{collectionData.name}}
-
+ as |field|
+ >
+
+
|
-
-
-
+
- {{#if @field.showTitle}}
-
- {{@field.title}}
+ {{#unless (eq @field.type "checkbox")}}
+ {{#if @field.showTitle}}
+
+ {{@field.title}}
- {{#unless @field.required}}
- ({{i18n
- "form_kit.optional"
- }})
- {{/unless}}
+
+
+
+ {{/if}}
- {{#if @field.tooltip}}
- {{#if this.isComponentTooltip}}
- <@field.tooltip />
- {{else}}
-
- {{/if}}
- {{/if}}
-
- {{/if}}
-
- {{#if @field.description}}
- {{@field.description}}
- {{/if}}
+ {{#if @field.description}}
+ {{@field.description}}
+ {{/if}}
+ {{/unless}}
- {{@field.title}}
+ {{@field.title}}
+
+
{{#if (has-block)}}
{{yield}}
diff --git a/app/assets/javascripts/discourse/app/form-kit/components/fk/field-data.gjs b/app/assets/javascripts/discourse/app/form-kit/components/fk/field-data.gjs
index fcfac8293ed..10ff02c8743 100644
--- a/app/assets/javascripts/discourse/app/form-kit/components/fk/field-data.gjs
+++ b/app/assets/javascripts/discourse/app/form-kit/components/fk/field-data.gjs
@@ -1,4 +1,5 @@
import Component from "@glimmer/component";
+import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";
import ValidationParser from "discourse/form-kit/lib/validation-parser";
import Validator from "discourse/form-kit/lib/validator";
@@ -8,6 +9,12 @@ import uniqueId from "discourse/helpers/unique-id";
* Represents a field in a form with validation, registration, and field data management capabilities.
*/
export default class FKFieldData extends Component {
+ /**
+ * Type of the field.
+ * @type {string}
+ */
+ @tracked type;
+
/**
* Unique identifier for the field.
* @type {string}
@@ -20,12 +27,6 @@ export default class FKFieldData extends Component {
*/
errorId = uniqueId();
- /**
- * Type of the field.
- * @type {string}
- */
- type;
-
/**
* Initializes the FKFieldData component.
* Validates the presence of required arguments and registers the field.
@@ -37,8 +38,6 @@ export default class FKFieldData extends Component {
if (!this.args.title?.length) {
throw new Error("@title is required on ``.");
}
-
- this.args.registerField(this.name, this);
}
/**
diff --git a/app/assets/javascripts/discourse/app/form-kit/components/fk/field.gjs b/app/assets/javascripts/discourse/app/form-kit/components/fk/field.gjs
index 4c161dffa35..7f36dbcdb7a 100644
--- a/app/assets/javascripts/discourse/app/form-kit/components/fk/field.gjs
+++ b/app/assets/javascripts/discourse/app/form-kit/components/fk/field.gjs
@@ -1,5 +1,8 @@
import Component from "@glimmer/component";
import { hash } from "@ember/helper";
+import { action } from "@ember/object";
+import { getOwner } from "@ember/owner";
+import curryComponent from "ember-curry-component";
import FKControlCheckbox from "discourse/form-kit/components/fk/control/checkbox";
import FKControlCode from "discourse/form-kit/components/fk/control/code";
import FKControlComposer from "discourse/form-kit/components/fk/control/composer";
@@ -40,6 +43,30 @@ export default class FKField extends Component {
}
}
+ @action
+ componentFor(component, field) {
+ const instance = this;
+ const baseArguments = {
+ get errors() {
+ return instance.args.errors;
+ },
+ unregisterField: instance.args.unregisterField,
+ registerField: instance.args.registerField,
+ component,
+ field,
+ };
+
+ if (!component.controlType) {
+ throw new Error(
+ `Static property \`controlType\` is required on component:\n\n ${component}`
+ );
+ }
+
+ field.type = component.controlType;
+
+ return curryComponent(FKControlWrapper, baseArguments, getOwner(this));
+ }
+
{{yield
(hash
- Custom=(component
- FKControlWrapper
- unregisterField=@unregisterField
- errors=@errors
- component=FKControlCustom
- field=field
- )
- Code=(component
- FKControlWrapper
- unregisterField=@unregisterField
- errors=@errors
- component=FKControlCode
- field=field
- )
- Question=(component
- FKControlWrapper
- unregisterField=@unregisterField
- errors=@errors
- component=FKControlQuestion
- field=field
- )
- Textarea=(component
- FKControlWrapper
- unregisterField=@unregisterField
- errors=@errors
- component=FKControlTextarea
- field=field
- )
- Checkbox=(component
- FKControlWrapper
- unregisterField=@unregisterField
- errors=@errors
- component=FKControlCheckbox
- field=field
- )
- Image=(component
- FKControlWrapper
- unregisterField=@unregisterField
- errors=@errors
- component=FKControlImage
- field=field
- )
- Password=(component
- FKControlWrapper
- unregisterField=@unregisterField
- errors=@errors
- component=FKControlPassword
- field=field
- )
- Composer=(component
- FKControlWrapper
- unregisterField=@unregisterField
- errors=@errors
- component=FKControlComposer
- field=field
- )
- Icon=(component
- FKControlWrapper
- unregisterField=@unregisterField
- errors=@errors
- component=FKControlIcon
- field=field
- )
- Toggle=(component
- FKControlWrapper
- unregisterField=@unregisterField
- errors=@errors
- component=FKControlToggle
- field=field
- )
- Menu=(component
- FKControlWrapper
- unregisterField=@unregisterField
- errors=@errors
- component=FKControlMenu
- field=field
- )
- Select=(component
- FKControlWrapper
- unregisterField=@unregisterField
- errors=@errors
- component=FKControlSelect
- field=field
- )
- Input=(component
- FKControlWrapper
- unregisterField=@unregisterField
- errors=@errors
- component=FKControlInput
- field=field
- )
- RadioGroup=(component
- FKControlWrapper
- unregisterField=@unregisterField
- errors=@errors
- component=FKControlRadioGroup
- field=field
- )
+ Custom=(this.componentFor FKControlCustom field)
+ Code=(this.componentFor FKControlCode field)
+ Question=(this.componentFor FKControlQuestion field)
+ Textarea=(this.componentFor FKControlTextarea field)
+ Checkbox=(this.componentFor FKControlCheckbox field)
+ Image=(this.componentFor FKControlImage field)
+ Password=(this.componentFor FKControlPassword field)
+ Composer=(this.componentFor FKControlComposer field)
+ Icon=(this.componentFor FKControlIcon field)
+ Toggle=(this.componentFor FKControlToggle field)
+ Menu=(this.componentFor FKControlMenu field)
+ Select=(this.componentFor FKControlSelect field)
+ Input=(this.componentFor FKControlInput field)
+ RadioGroup=(this.componentFor FKControlRadioGroup field)
errorId=field.errorId
id=field.id
name=field.name
diff --git a/app/assets/javascripts/discourse/app/form-kit/components/fk/optional.gjs b/app/assets/javascripts/discourse/app/form-kit/components/fk/optional.gjs
new file mode 100644
index 00000000000..ce3f88694c0
--- /dev/null
+++ b/app/assets/javascripts/discourse/app/form-kit/components/fk/optional.gjs
@@ -0,0 +1,11 @@
+import { i18n } from "discourse-i18n";
+
+const FKOptional =
+ {{#unless @field.required}}
+ ({{i18n
+ "form_kit.optional"
+ }})
+ {{/unless}}
+;
+
+export default FKOptional;
diff --git a/app/assets/javascripts/discourse/app/form-kit/components/fk/tooltip.gjs b/app/assets/javascripts/discourse/app/form-kit/components/fk/tooltip.gjs
new file mode 100644
index 00000000000..4dc4e279563
--- /dev/null
+++ b/app/assets/javascripts/discourse/app/form-kit/components/fk/tooltip.gjs
@@ -0,0 +1,22 @@
+import Component from "@glimmer/component";
+import DTooltip from "float-kit/components/d-tooltip";
+
+export default class FKTooltip extends Component {
+ get isComponentTooltip() {
+ return typeof this.args.field.tooltip === "object";
+ }
+
+
+ {{#if @field.tooltip}}
+ {{#if this.isComponentTooltip}}
+ <@field.tooltip />
+ {{else}}
+
+ {{/if}}
+ {{/if}}
+
+}
diff --git a/app/assets/javascripts/discourse/tests/integration/components/form-kit/controls/checkbox-test.gjs b/app/assets/javascripts/discourse/tests/integration/components/form-kit/controls/checkbox-test.gjs
index b14132765ab..7d0700aadfa 100644
--- a/app/assets/javascripts/discourse/tests/integration/components/form-kit/controls/checkbox-test.gjs
+++ b/app/assets/javascripts/discourse/tests/integration/components/form-kit/controls/checkbox-test.gjs
@@ -44,5 +44,31 @@ module(
assert.dom(".form-kit__control-checkbox").hasAttribute("disabled");
});
+
+ test("@tooltip", async function (assert) {
+ await render(
+
+
+
+
+ );
+
+ assert
+ .dom(".form-kit__control-checkbox-content .form-kit__tooltip")
+ .exists();
+ });
+
+ test("optional", async function (assert) {
+ await render(
+
+
+
+
+ );
+
+ assert.form().field("foo").hasTitle("Foo (optional)");
+ });
}
);
diff --git a/app/assets/javascripts/discourse/tests/integration/components/form-kit/field-test.gjs b/app/assets/javascripts/discourse/tests/integration/components/form-kit/field-test.gjs
index 33435eb23a4..02508d36e44 100644
--- a/app/assets/javascripts/discourse/tests/integration/components/form-kit/field-test.gjs
+++ b/app/assets/javascripts/discourse/tests/integration/components/form-kit/field-test.gjs
@@ -83,8 +83,8 @@ module("Integration | Component | FormKit | Field", function (hooks) {
await render(
- Test
+
+
);
@@ -102,8 +102,8 @@ module("Integration | Component | FormKit | Field", function (hooks) {
await render(
- Test
+
+
);
diff --git a/app/assets/javascripts/discourse/tests/integration/components/form-kit/layout/checkbox-group-test.gjs b/app/assets/javascripts/discourse/tests/integration/components/form-kit/layout/checkbox-group-test.gjs
index bf0548cc530..c785a7ec655 100644
--- a/app/assets/javascripts/discourse/tests/integration/components/form-kit/layout/checkbox-group-test.gjs
+++ b/app/assets/javascripts/discourse/tests/integration/components/form-kit/layout/checkbox-group-test.gjs
@@ -22,9 +22,41 @@ module(
);
- assert.form().field("foo").hasTitle("Foo");
- assert.form().field("bar").hasTitle("Bar");
+ assert.form().field("foo").hasTitle("Foo (optional)");
+ assert.form().field("bar").hasTitle("Bar (optional)");
assert.form().field("bar").hasDescription("A description");
});
+
+ test("@title", async function (assert) {
+ await render(
+
+
+
+
+
+
+ );
+
+ assert
+ .dom(".form-kit__checkbox-group .form-kit__fieldset-title")
+ .hasText("bar");
+ });
+
+ test("@description", async function (assert) {
+ await render(
+
+
+
+
+
+
+ );
+
+ assert
+ .dom(".form-kit__checkbox-group .form-kit__fieldset-description")
+ .hasText("bar");
+ });
}
);
diff --git a/app/assets/stylesheets/common/admin/admin_base.scss b/app/assets/stylesheets/common/admin/admin_base.scss
index 0695d6870ce..3ec363b9acb 100644
--- a/app/assets/stylesheets/common/admin/admin_base.scss
+++ b/app/assets/stylesheets/common/admin/admin_base.scss
@@ -811,14 +811,6 @@ $mobile-breakpoint: 700px;
}
}
-.badges,
-.web-hook-container {
- input[type="text"],
- textarea {
- min-width: 350px;
- }
-}
-
.text-successful {
color: var(--success);
}
diff --git a/app/assets/stylesheets/common/admin/api.scss b/app/assets/stylesheets/common/admin/api.scss
index 0445f9ab3e0..1110353cfcc 100644
--- a/app/assets/stylesheets/common/admin/api.scss
+++ b/app/assets/stylesheets/common/admin/api.scss
@@ -24,6 +24,10 @@
// Api keys
.admin-api-keys {
+ .form-kit__container-optional {
+ display: none;
+ }
+
.api-key-show {
.form-element,
.form-element-desc {
@@ -136,16 +140,6 @@
display: none;
}
- input {
- max-width: calc(100% - 10px);
- }
-
- .select-kit,
- .select-kit.multi-select {
- width: 100%;
- max-width: 360px;
- }
-
.event-selector {
display: grid;
grid-template-columns: auto auto;
diff --git a/app/assets/stylesheets/common/form-kit/_index.scss b/app/assets/stylesheets/common/form-kit/_index.scss
index 76c6b570259..d807c0a1e74 100644
--- a/app/assets/stylesheets/common/form-kit/_index.scss
+++ b/app/assets/stylesheets/common/form-kit/_index.scss
@@ -30,3 +30,4 @@
@import "_row";
@import "_section";
@import "_variables";
+@import "_tooltip";
diff --git a/app/assets/stylesheets/common/form-kit/_tooltip.scss b/app/assets/stylesheets/common/form-kit/_tooltip.scss
new file mode 100644
index 00000000000..3e3f21f7b70
--- /dev/null
+++ b/app/assets/stylesheets/common/form-kit/_tooltip.scss
@@ -0,0 +1,3 @@
+.form-kit__tooltip {
+ color: var(--primary-medium);
+}
|