From 339cf211b06d7be436ba136bb250229a482a2911 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Fri, 16 May 2025 16:16:53 +0200 Subject: [PATCH 01/37] wip --- .../addon/components/admin-badges-show.gjs | 25 +++++++++++-------- .../components/fk/control-wrapper.gjs | 4 +-- .../components/fk/control/checkbox.gjs | 4 +-- .../app/form-kit/components/fk/field-data.gjs | 2 +- .../app/form-kit/components/fk/form.gjs | 2 ++ .../app/form-kit/components/fk/header.gjs | 18 +++++++++++++ .../app/form-kit/components/fk/optional.gjs | 11 -------- .../app/form-kit/components/fk/required.gjs | 11 ++++++++ .../app/form-kit/components/fk/section.gjs | 15 +++++++---- .../common/form-kit/_conditional-display.scss | 6 ++--- .../common/form-kit/_container.scss | 24 ++++++++++++------ .../common/form-kit/_control-icon.scss | 15 ++++++++--- .../common/form-kit/_control-select.scss | 6 +---- .../common/form-kit/_control-textarea.scss | 2 ++ .../common/form-kit/_core-ext.scss | 5 ++++ .../common/form-kit/_default-input-mixin.scss | 7 +----- .../stylesheets/common/form-kit/_field.scss | 11 -------- .../common/form-kit/_form-kit.scss | 6 +++++ .../stylesheets/common/form-kit/_header.scss | 21 ++++++++++++++++ .../stylesheets/common/form-kit/_index.scss | 2 ++ .../stylesheets/common/form-kit/_section.scss | 6 +++++ config/locales/client.en.yml | 2 +- 22 files changed, 137 insertions(+), 68 deletions(-) create mode 100644 app/assets/javascripts/discourse/app/form-kit/components/fk/header.gjs delete 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/required.gjs create mode 100644 app/assets/stylesheets/common/form-kit/_core-ext.scss create mode 100644 app/assets/stylesheets/common/form-kit/_header.scss diff --git a/app/assets/javascripts/admin/addon/components/admin-badges-show.gjs b/app/assets/javascripts/admin/addon/components/admin-badges-show.gjs index 1936cd7a59ec6..aea19f6978162 100644 --- a/app/assets/javascripts/admin/addon/components/admin-badges-show.gjs +++ b/app/assets/javascripts/admin/addon/components/admin-badges-show.gjs @@ -244,11 +244,15 @@ export default class AdminBadgesShow extends Component { class="badge-form current-badge content-body" as |form data| > - -

- {{iconOrImage data}} - {{data.name}} -

+ + + {{iconOrImage data}} + {{data.name}} + + + This is a subtitle + + {{/if}} - + @@ -504,7 +511,6 @@ export default class AdminBadgesShow extends Component { @showTitle={{false}} @name="multiple_grant" @disabled={{this.readOnly}} - @format="full" as |field| > @@ -520,7 +526,6 @@ export default class AdminBadgesShow extends Component { @showTitle={{false}} @name="listable" @disabled={{this.readOnly}} - @format="full" as |field| > @@ -531,7 +536,6 @@ export default class AdminBadgesShow extends Component { @showTitle={{false}} @name="show_posts" @disabled={{this.readOnly}} - @format="full" as |field| > @@ -542,7 +546,6 @@ export default class AdminBadgesShow extends Component { @showTitle={{false}} @name="show_in_post_header" @disabled={{this.disableBadgeOnPosts data}} - @format="full" as |field| > diff --git a/app/assets/javascripts/discourse/app/form-kit/components/fk/control-wrapper.gjs b/app/assets/javascripts/discourse/app/form-kit/components/fk/control-wrapper.gjs index 8f47bfd80ee7b..4a50a5719ffb2 100644 --- a/app/assets/javascripts/discourse/app/form-kit/components/fk/control-wrapper.gjs +++ b/app/assets/javascripts/discourse/app/form-kit/components/fk/control-wrapper.gjs @@ -6,7 +6,7 @@ import willDestroy from "@ember/render-modifiers/modifiers/will-destroy"; import { eq } from "truth-helpers"; import FKLabel from "discourse/form-kit/components/fk/label"; import FKMeta from "discourse/form-kit/components/fk/meta"; -import FKOptional from "discourse/form-kit/components/fk/optional"; +import FKRequired from "discourse/form-kit/components/fk/required"; import FKText from "discourse/form-kit/components/fk/text"; import FKTooltip from "discourse/form-kit/components/fk/tooltip"; import concatClass from "discourse/helpers/concat-class"; @@ -72,7 +72,7 @@ export default class FKControlWrapper extends Component { > {{@field.title}} - + {{/if}} diff --git a/app/assets/javascripts/discourse/app/form-kit/components/fk/control/checkbox.gjs b/app/assets/javascripts/discourse/app/form-kit/components/fk/control/checkbox.gjs index ef5486ed34a7c..28e03df4a8a1f 100644 --- a/app/assets/javascripts/discourse/app/form-kit/components/fk/control/checkbox.gjs +++ b/app/assets/javascripts/discourse/app/form-kit/components/fk/control/checkbox.gjs @@ -3,7 +3,7 @@ import { on } from "@ember/modifier"; import { action } from "@ember/object"; import { eq } from "truth-helpers"; import FKLabel from "discourse/form-kit/components/fk/label"; -import FKOptional from "discourse/form-kit/components/fk/optional"; +import FKRequired from "discourse/form-kit/components/fk/required"; import FKTooltip from "discourse/form-kit/components/fk/tooltip"; export default class FKControlCheckbox extends Component { @@ -27,7 +27,7 @@ export default class FKControlCheckbox extends Component { {{@field.title}} - + {{#if (has-block)}} 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 2819e171818e6..eaa07251a2847 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 @@ -94,7 +94,7 @@ export default class FKFieldData extends Component { * @type {string} */ get format() { - return this.args.format; + return this.args.format ?? "full"; } /** diff --git a/app/assets/javascripts/discourse/app/form-kit/components/fk/form.gjs b/app/assets/javascripts/discourse/app/form-kit/components/fk/form.gjs index dfb1c50c040ba..da592b47cf891 100644 --- a/app/assets/javascripts/discourse/app/form-kit/components/fk/form.gjs +++ b/app/assets/javascripts/discourse/app/form-kit/components/fk/form.gjs @@ -15,6 +15,7 @@ import FKControlConditionalContent from "discourse/form-kit/components/fk/contro import FKErrorsSummary from "discourse/form-kit/components/fk/errors-summary"; import FKField from "discourse/form-kit/components/fk/field"; import FKFieldset from "discourse/form-kit/components/fk/fieldset"; +import FKHeader from "discourse/form-kit/components/fk/header"; import FKInputGroup from "discourse/form-kit/components/fk/input-group"; import FKObject from "discourse/form-kit/components/fk/object"; import Row from "discourse/form-kit/components/fk/row"; @@ -278,6 +279,7 @@ class FKForm extends Component { {{yield (hash + Header=FKHeader Row=Row Section=FKSection Fieldset=FKFieldset diff --git a/app/assets/javascripts/discourse/app/form-kit/components/fk/header.gjs b/app/assets/javascripts/discourse/app/form-kit/components/fk/header.gjs new file mode 100644 index 0000000000000..4ae7323c8b89a --- /dev/null +++ b/app/assets/javascripts/discourse/app/form-kit/components/fk/header.gjs @@ -0,0 +1,18 @@ +import { hash } from "@ember/helper"; + +const Title = ; + +const Subtitle = ; + +const FKHeader = ; + +export default FKHeader; 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 deleted file mode 100644 index ce3f88694c034..0000000000000 --- a/app/assets/javascripts/discourse/app/form-kit/components/fk/optional.gjs +++ /dev/null @@ -1,11 +0,0 @@ -import { i18n } from "discourse-i18n"; - -const FKOptional = ; - -export default FKOptional; diff --git a/app/assets/javascripts/discourse/app/form-kit/components/fk/required.gjs b/app/assets/javascripts/discourse/app/form-kit/components/fk/required.gjs new file mode 100644 index 0000000000000..d5599f72f9894 --- /dev/null +++ b/app/assets/javascripts/discourse/app/form-kit/components/fk/required.gjs @@ -0,0 +1,11 @@ +import { i18n } from "discourse-i18n"; + +const FKRequired = ; + +export default FKRequired; diff --git a/app/assets/javascripts/discourse/app/form-kit/components/fk/section.gjs b/app/assets/javascripts/discourse/app/form-kit/components/fk/section.gjs index e69da76f079e7..89a08c097a0e4 100644 --- a/app/assets/javascripts/discourse/app/form-kit/components/fk/section.gjs +++ b/app/assets/javascripts/discourse/app/form-kit/components/fk/section.gjs @@ -1,13 +1,18 @@ +import { or } from "truth-helpers"; import concatClass from "discourse/helpers/concat-class"; const FKSection = } diff --git a/app/assets/javascripts/discourse/app/form-kit/components/fk/form.gjs b/app/assets/javascripts/discourse/app/form-kit/components/fk/form.gjs index a5c5cdbbd3706..8e4167997dcca 100644 --- a/app/assets/javascripts/discourse/app/form-kit/components/fk/form.gjs +++ b/app/assets/javascripts/discourse/app/form-kit/components/fk/form.gjs @@ -342,7 +342,11 @@ const Form = ; From 4d691333238a16d6b6ed47e2c47844dae6df69c2 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Wed, 21 May 2025 11:54:41 +0200 Subject: [PATCH 21/37] remove this test --- .../javascripts/discourse/app/form-kit/components/fk/field.gjs | 1 - 1 file changed, 1 deletion(-) 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 2580d69f493ae..8f78efe020167 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 @@ -110,7 +110,6 @@ export default class FKField extends Component { {{else}} - {{yield to="primary-actions"}} {{#if (has-block "body")}} {{yield yieldArgs to="body"}} {{else}} From ae24dea78791d0cf591dfbfb0f308eee36aeb826 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Wed, 21 May 2025 12:53:46 +0200 Subject: [PATCH 22/37] primary/secondary actions --- .../form-kit-site-setting-wrapper.gjs | 19 +++++++++++----- .../components/fk/control-wrapper.gjs | 22 ++++++++++++++----- .../form-kit/components/fk/control/input.gjs | 13 ----------- .../app/form-kit/components/fk/field-data.gjs | 17 -------------- .../app/form-kit/components/fk/field.gjs | 2 -- .../app/form-kit/components/fk/form.gjs | 10 --------- .../components/fk/primary-actions.gjs | 11 ---------- .../common/form-kit/_container.scss | 4 ++++ 8 files changed, 34 insertions(+), 64 deletions(-) delete mode 100644 app/assets/javascripts/discourse/app/form-kit/components/fk/primary-actions.gjs diff --git a/app/assets/javascripts/admin/addon/components/form-kit-site-setting-wrapper.gjs b/app/assets/javascripts/admin/addon/components/form-kit-site-setting-wrapper.gjs index bf0cb2fd8ab16..1e227e222d0bb 100644 --- a/app/assets/javascripts/admin/addon/components/form-kit-site-setting-wrapper.gjs +++ b/app/assets/javascripts/admin/addon/components/form-kit-site-setting-wrapper.gjs @@ -57,16 +57,23 @@ export default class FormKitSiteSettingWrapper extends Component { @name={{@setting.setting}} @title={{this.settingTitle}} @description={{htmlSafe @setting.description}} - @primaryActionsComponent={{component PrimaryActions setting=@setting}} > - <:primary-actions> - primary-actions - <:body as |field|> {{#if (eq @setting.type "string")}} - + + <:primary-actions as |actions|> + + + <:secondary-actions as |actions|> + + + {{else if (eq @setting.type "upload")}} - + + <:primary-actions> + primary + + {{else if (eq @setting.type "bool")}} {{htmlSafe @setting.description}} diff --git a/app/assets/javascripts/discourse/app/form-kit/components/fk/control-wrapper.gjs b/app/assets/javascripts/discourse/app/form-kit/components/fk/control-wrapper.gjs index 49cdd782160cb..8ba7e96e86e41 100644 --- a/app/assets/javascripts/discourse/app/form-kit/components/fk/control-wrapper.gjs +++ b/app/assets/javascripts/discourse/app/form-kit/components/fk/control-wrapper.gjs @@ -1,13 +1,12 @@ import Component from "@glimmer/component"; import { tracked } from "@glimmer/tracking"; -import { concat, fn } from "@ember/helper"; +import { concat, fn, hash } from "@ember/helper"; import didInsert from "@ember/render-modifiers/modifiers/did-insert"; import willDestroy from "@ember/render-modifiers/modifiers/will-destroy"; import { eq } from "truth-helpers"; +import DButton from "discourse/components/d-button"; import FKLabel from "discourse/form-kit/components/fk/label"; -import FKMenu from "discourse/form-kit/components/fk/menu"; import FKMeta from "discourse/form-kit/components/fk/meta"; -import FKPrimaryActions from "discourse/form-kit/components/fk/primary-actions"; import FKRequired from "discourse/form-kit/components/fk/required"; import FKText from "discourse/form-kit/components/fk/text"; import FKTooltip from "discourse/form-kit/components/fk/tooltip"; @@ -76,9 +75,22 @@ export default class FKControlWrapper extends Component { - - {{yield to="primary-actions"}} + {{#let + (hash + Button=(component DButton class="form-kit__button btn-flat") + ) + as |actions| + }} + +
+ {{yield actions to="primary-actions"}} +
+ +
+ {{yield actions to="secondary-actions"}} +
+ {{/let}} {{/if}} diff --git a/app/assets/javascripts/discourse/app/form-kit/components/fk/control/input.gjs b/app/assets/javascripts/discourse/app/form-kit/components/fk/control/input.gjs index 6a10ee4f7b93e..e411575856f26 100644 --- a/app/assets/javascripts/discourse/app/form-kit/components/fk/control/input.gjs +++ b/app/assets/javascripts/discourse/app/form-kit/components/fk/control/input.gjs @@ -25,18 +25,6 @@ const SUPPORTED_TYPES = [ export default class FKControlInput extends Component { static controlType = "input"; - onFocusOut = modifierFn((element, [onFocusOut]) => { - if (onFocusOut) { - element.addEventListener("focusout", onFocusOut); - } - - return () => { - if (onFocusOut) { - element.removeEventListener("focusout", onFocusOut); - } - }; - }); - constructor(owner, args) { super(...arguments); @@ -88,7 +76,6 @@ export default class FKControlInput extends Component { disabled={{@field.disabled}} ...attributes {{on "input" this.handleInput}} - {{this.onFocusOut @field.onFocusOut}} /> {{#if @after}} 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 33d760061008b..eaa07251a2847 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 @@ -3,7 +3,6 @@ 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"; -import noop from "discourse/helpers/noop"; import uniqueId from "discourse/helpers/unique-id"; /** @@ -98,22 +97,6 @@ export default class FKFieldData extends Component { return this.args.format ?? "full"; } - /** - * Called when a control loses focus. - * @type {string} - */ - get onFocusOut() { - return this.args.onFocusOut; - } - - /** - * Optional component for primary actions. - * @type {string} - */ - get primaryActionsComponent() { - return this.args.primaryActionsComponent; - } - /** * Format of the title. * @type {string} 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 8f78efe020167..d8d84ea5b65a9 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 @@ -50,8 +50,6 @@ export default class FKField extends Component { - {{yield - (hash Button=(component DButton class="form-kit__button btn-flat")) - }} - -} diff --git a/app/assets/stylesheets/common/form-kit/_container.scss b/app/assets/stylesheets/common/form-kit/_container.scss index eef7476d006b8..a7a88b2fc50cc 100644 --- a/app/assets/stylesheets/common/form-kit/_container.scss +++ b/app/assets/stylesheets/common/form-kit/_container.scss @@ -4,6 +4,10 @@ flex-direction: column; align-items: flex-start; + &-secondary-actions { + margin-left: auto; + } + &.--column { .form-kit__container-content { flex-direction: column; From 2b23f85e5e68e24b24b80a87850f064a2d1d5da6 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Wed, 21 May 2025 12:55:46 +0200 Subject: [PATCH 23/37] reusable template --- .../components/form-kit-site-setting-wrapper.gjs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/admin/addon/components/form-kit-site-setting-wrapper.gjs b/app/assets/javascripts/admin/addon/components/form-kit-site-setting-wrapper.gjs index 1e227e222d0bb..5d9a94d4f23ff 100644 --- a/app/assets/javascripts/admin/addon/components/form-kit-site-setting-wrapper.gjs +++ b/app/assets/javascripts/admin/addon/components/form-kit-site-setting-wrapper.gjs @@ -7,11 +7,8 @@ import Form from "discourse/components/form"; import { humanizedSettingName } from "discourse/lib/site-settings-utils"; import SiteSetting from "admin/models/site-setting"; -const PrimaryActions = ; +const PrimaryActions = ; +const SecondaryActions = ; export default class FormKitSiteSettingWrapper extends Component { get settingTitle() { @@ -62,10 +59,10 @@ export default class FormKitSiteSettingWrapper extends Component { {{#if (eq @setting.type "string")}} <:primary-actions as |actions|> - + <:secondary-actions as |actions|> - + {{else if (eq @setting.type "upload")}} From 8582dcc411c05e34873d60fcf7b19f4ffc10f8e8 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Wed, 21 May 2025 18:11:41 +0200 Subject: [PATCH 24/37] new iteration --- .../form-kit-site-setting-wrapper.gjs | 112 +++++++++++++++++- .../components/fk/control-wrapper.gjs | 2 + .../app/form-kit/components/fk/field-data.gjs | 27 +++++ .../app/form-kit/components/fk/field.gjs | 4 + .../app/form-kit/lib/fk-form-data.js | 21 ++-- .../float-kit/addon/components/d-menu.gjs | 2 + 6 files changed, 154 insertions(+), 14 deletions(-) diff --git a/app/assets/javascripts/admin/addon/components/form-kit-site-setting-wrapper.gjs b/app/assets/javascripts/admin/addon/components/form-kit-site-setting-wrapper.gjs index 5d9a94d4f23ff..de28353b4657b 100644 --- a/app/assets/javascripts/admin/addon/components/form-kit-site-setting-wrapper.gjs +++ b/app/assets/javascripts/admin/addon/components/form-kit-site-setting-wrapper.gjs @@ -1,14 +1,107 @@ import Component from "@glimmer/component"; import { cached } from "@glimmer/tracking"; +import { concat, fn } from "@ember/helper"; import { action } from "@ember/object"; +import { service } from "@ember/service"; import { htmlSafe } from "@ember/template"; import { eq } from "truth-helpers"; +import DButton from "discourse/components/d-button"; import Form from "discourse/components/form"; import { humanizedSettingName } from "discourse/lib/site-settings-utils"; import SiteSetting from "admin/models/site-setting"; -const PrimaryActions = ; -const SecondaryActions = ; +class PrimaryActions extends Component { + @service toasts; + @service router; + + @action + settingHistory() { + this.router.transitionTo("adminLogs.staffActionLogs", { + queryParams: { + filters: { + subject: this.args.setting.setting, + action_name: "change_site_setting", + }, + force_refresh: true, + }, + }); + } + + @action + async copyStettingAsUrl(menu) { + await menu.close(); + + const url = `${window.location.origin}/admin/site_settings/category/all_results?filter=${this.args.setting.setting}`; + navigator.clipboard.writeText(url).then(() => { + this.toasts.success({ data: { message: "Copied to clipboard!" } }); + }); + } + + +} + +class SecondaryActions extends Component { + @action + async discardChanges() { + await this.args.field.rollback(); + } + + get cannotRevert() { + return this.args.field.value === this.args.setting.default; + } + + @action + revertToDefault() { + this.args.field.set(this.args.setting.default); + this.args.save({ + [this.args.setting.setting]: this.args.field.value, + }); + } + + @action + save() { + this.args.save({ + [this.args.setting.setting]: this.args.field.value, + }); + this.args.field.resetPatches(); + } + + +} export default class FormKitSiteSettingWrapper extends Component { get settingTitle() { @@ -44,7 +137,6 @@ export default class FormKitSiteSettingWrapper extends Component {