From 1a8b5b9d42a53c74c4fc0be510dd44627111c6b6 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Tue, 4 Feb 2025 09:58:00 +0100 Subject: [PATCH] FIX: better standalone checkbox support (#31130) Before this commit it was complicated to render a `Checkbox` outside of a `CheckboxGroup` as you would get no title, no description, no optional hint and not tooltip. This commits makes all of this possible by adding a special case for checkboxes, and sharing code for tooltips and optional hint. This commit also uses this opportunity to refactor part of the code to use curryComponent and reduce code duplication. --- .../admin-config-areas/api-keys-new.gjs | 22 +-- .../admin-config-areas/webhooks-form.gjs | 12 +- .../components/fk/control-wrapper.gjs | 69 ++++----- .../components/fk/control/checkbox.gjs | 6 +- .../app/form-kit/components/fk/field-data.gjs | 15 +- .../app/form-kit/components/fk/field.gjs | 139 ++++++------------ .../app/form-kit/components/fk/optional.gjs | 11 ++ .../app/form-kit/components/fk/tooltip.gjs | 22 +++ .../form-kit/controls/checkbox-test.gjs | 26 ++++ .../components/form-kit/field-test.gjs | 8 +- .../form-kit/layout/checkbox-group-test.gjs | 36 ++++- .../stylesheets/common/admin/admin_base.scss | 8 - app/assets/stylesheets/common/admin/api.scss | 14 +- .../stylesheets/common/form-kit/_index.scss | 1 + .../stylesheets/common/form-kit/_tooltip.scss | 3 + 15 files changed, 197 insertions(+), 195 deletions(-) create mode 100644 app/assets/javascripts/discourse/app/form-kit/components/fk/optional.gjs create mode 100644 app/assets/javascripts/discourse/app/form-kit/components/fk/tooltip.gjs create mode 100644 app/assets/stylesheets/common/form-kit/_tooltip.scss diff --git a/app/assets/javascripts/admin/addon/components/admin-config-areas/api-keys-new.gjs b/app/assets/javascripts/admin/addon/components/admin-config-areas/api-keys-new.gjs index c7f2b8efcbd..f4ec63694fa 100644 --- a/app/assets/javascripts/admin/addon/components/admin-config-areas/api-keys-new.gjs +++ b/app/assets/javascripts/admin/addon/components/admin-config-areas/api-keys-new.gjs @@ -13,7 +13,6 @@ import { popupAjaxError } from "discourse/lib/ajax-error"; import { i18n } from "discourse-i18n"; import ApiKeyUrlsModal from "admin/components/modal/api-key-urls"; import EmailGroupUserChooser from "select-kit/components/email-group-user-chooser"; -import DTooltip from "float-kit/components/d-tooltip"; export default class AdminConfigAreasApiKeysNew extends Component { @service router; @@ -239,7 +238,6 @@ export default class AdminConfigAreasApiKeysNew extends Component { - -
{{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)); + } + ); - 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); +}