diff --git a/.eslintignore b/.eslintignore index c7910a26c0..afeff2c869 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,4 @@ +app/assets/javascripts/discourse-loader.js app/assets/javascripts/env.js app/assets/javascripts/main_include_admin.js app/assets/javascripts/vendor.js diff --git a/.eslintrc b/.eslintrc index 320310db8d..e05e8de173 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,9 +1,7 @@ { "extends": "eslint-config-discourse", "rules": { - "discourse-ember/global-ember": 2, - "no-duplicate-imports": 2, - "sort-imports": 2 + "discourse-ember/global-ember": 2 }, "globals": { "moduleFor": "off", @@ -14,6 +12,6 @@ "currentURL": "off", "invisible": "off", "visible": "off", - "count": "off", + "count": "off" } } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8e4c2b6ac1..7583ed8011 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,7 +65,7 @@ jobs: if: env.BUILD_TYPE != 'LINT' run: | sudo apt-get update - sudo apt-get -yqq install postgresql-client libpq-dev jpegoptim optipng jhead + sudo apt-get -yqq install postgresql-client libpq-dev jpegoptim optipng jhead pngcrush pngquant wget -qO- https://raw.githubusercontent.com/discourse/discourse_docker/master/image/base/install-pngquant | sudo sh - name: Update imagemagick diff --git a/.prettierignore b/.prettierignore index ca81e935a8..b8874cd71c 100644 --- a/.prettierignore +++ b/.prettierignore @@ -6,6 +6,7 @@ config/locales/**/*.yml !config/locales/**/*.en*.yml script/import_scripts/**/*.yml +app/assets/javascripts/discourse-loader.js app/assets/javascripts/env.js app/assets/javascripts/main_include_admin.js app/assets/javascripts/vendor.js diff --git a/Gemfile b/Gemfile index 3ea59bc92e..80bf241db0 100644 --- a/Gemfile +++ b/Gemfile @@ -167,6 +167,7 @@ group :test, :development do gem 'parallel_tests' gem 'rswag-specs' + gem 'json_schemer' end group :development do diff --git a/Gemfile.lock b/Gemfile.lock index 3b16e87e10..afa3ff6c3b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -43,7 +43,7 @@ GEM annotate (3.1.1) activerecord (>= 3.2, < 7.0) rake (>= 10.4, < 14.0) - ast (2.4.1) + ast (2.4.2) aws-eventstream (1.1.0) aws-partitions (1.390.0) aws-sdk-core (3.109.2) @@ -72,10 +72,10 @@ GEM rack (>= 0.9.0) binding_of_caller (1.0.0) debug_inspector (>= 0.0.1) - bootsnap (1.5.1) + bootsnap (1.6.0) msgpack (~> 1.0) builder (3.2.4) - bullet (6.1.2) + bullet (6.1.3) activesupport (>= 3.0.0) uniform_notifier (~> 1.11) byebug (11.1.3) @@ -93,7 +93,7 @@ GEM crack (0.4.5) rexml crass (1.0.6) - css_parser (1.7.1) + css_parser (1.8.0) addressable debug_inspector (1.0.0) diff-lcs (1.4.4) @@ -114,6 +114,8 @@ GEM in_threads (~> 1.3) progress (~> 3.0, >= 3.0.1) docile (1.3.5) + ecma-re-validator (0.3.0) + regexp_parser (~> 2.0) email_reply_trimmer (0.1.13) ember-data-source (3.0.2) ember-source (>= 2, < 3.0) @@ -141,6 +143,7 @@ GEM globalid (0.4.2) activesupport (>= 4.2.0) guess_html_encoding (0.0.11) + hana (1.3.7) hashdiff (1.0.1) hashie (4.1.0) highline (2.0.3) @@ -159,9 +162,15 @@ GEM json (2.5.1) json-schema (2.8.1) addressable (>= 2.4) + json_schemer (0.2.17) + ecma-re-validator (~> 0.3) + hana (~> 1.3) + regexp_parser (~> 2.0) + uri_template (~> 0.7) jwt (2.2.2) kgio (2.11.3) libv8 (8.4.255.0) + libv8 (8.4.255.0-universal-darwin-20) libv8 (8.4.255.0-x86_64-darwin-18) libv8 (8.4.255.0-x86_64-darwin-19) libv8 (8.4.255.0-x86_64-darwin-20) @@ -177,7 +186,7 @@ GEM logstash-event (1.2.02) logstash-logger (0.26.1) logstash-event (~> 1.2) - logster (2.9.4) + logster (2.9.5) loofah (2.9.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) @@ -197,13 +206,13 @@ GEM mini_scheduler (0.13.0) sidekiq (>= 4.2.3) mini_sql (1.0.1) - mini_suffix (0.3.0) + mini_suffix (0.3.2) ffi (~> 1.9) minitest (5.14.3) mocha (1.12.0) mock_redis (0.27.3) ruby2_keywords - msgpack (1.3.3) + msgpack (1.4.1) multi_json (1.15.0) multi_xml (0.6.0) multipart-post (2.1.1) @@ -212,6 +221,8 @@ GEM nokogiri (1.11.1) mini_portile2 (~> 2.5.0) racc (~> 1.4) + nokogiri (1.11.1-arm64-darwin) + racc (~> 1.4) nokogiri (1.11.1-x86_64-darwin) racc (~> 1.4) nokogiri (1.11.1-x86_64-linux) @@ -225,7 +236,7 @@ GEM multi_json (~> 1.3) multi_xml (~> 0.5) rack (>= 1.2, < 3) - oj (3.11.0) + oj (3.11.1) omniauth (1.9.1) hashie (>= 3.4.6) rack (>= 1.6.2, < 3) @@ -273,7 +284,7 @@ GEM pry-rails (0.3.9) pry (>= 0.10.4) public_suffix (4.0.6) - puma (5.1.1) + puma (5.2.0) nio4r (~> 2.0) r2 (0.2.7) racc (1.5.2) @@ -364,7 +375,7 @@ GEM rubocop-ast (>= 1.2.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 3.0) - rubocop-ast (1.4.0) + rubocop-ast (1.4.1) parser (>= 2.7.1.5) rubocop-discourse (2.4.1) rubocop (>= 1.1.0) @@ -395,9 +406,9 @@ GEM seed-fu (2.3.9) activerecord (>= 3.1) activesupport (>= 3.1) - shoulda-matchers (4.5.0) + shoulda-matchers (4.5.1) activesupport (>= 4.2.0) - sidekiq (6.1.2) + sidekiq (6.1.3) connection_pool (>= 2.2.2) rack (~> 2.0) redis (>= 4.2.0) @@ -416,7 +427,7 @@ GEM sprockets (>= 3.0.0) sshkey (2.0.0) stackprof (0.2.16) - test-prof (0.12.2) + test-prof (1.0.0) thor (1.1.0) thread_safe (0.3.6) tilt (2.0.10) @@ -432,6 +443,7 @@ GEM kgio (~> 2.6) raindrops (~> 0.7) uniform_notifier (1.13.2) + uri_template (0.7.0) webmock (3.11.1) addressable (>= 2.3.6) crack (>= 0.3.2) @@ -444,6 +456,7 @@ GEM zeitwerk (2.4.2) PLATFORMS + arm64-darwin-20 ruby x86_64-darwin-18 x86_64-darwin-19 @@ -494,6 +507,7 @@ DEPENDENCIES htmlentities http_accept_language json + json_schemer listen lograge logstash-event @@ -575,4 +589,4 @@ DEPENDENCIES yaml-lint BUNDLED WITH - 2.2.3 + 2.2.6 diff --git a/app/assets/javascripts/admin/addon/components/ace-editor.js b/app/assets/javascripts/admin/addon/components/ace-editor.js index 4f70345003..862d611188 100644 --- a/app/assets/javascripts/admin/addon/components/ace-editor.js +++ b/app/assets/javascripts/admin/addon/components/ace-editor.js @@ -10,6 +10,7 @@ export default Component.extend({ _editor: null, _skipContentChangeEvent: null, disabled: false, + htmlPlaceholder: false, @observes("editorId") editorIdChanged() { @@ -86,6 +87,10 @@ export default Component.extend({ loadedAce.config.set("loadWorkerFromBlob", false); loadedAce.config.set("workerPath", getURL("/javascripts/ace")); // Do not use CDN for workers + if (this.htmlPlaceholder) { + this._overridePlaceholder(loadedAce); + } + if (!this.element || this.isDestroying || this.isDestroyed) { return; } @@ -131,4 +136,32 @@ export default Component.extend({ } }, }, + + _overridePlaceholder(loadedAce) { + const originalPlaceholderSetter = + loadedAce.config.$defaultOptions.editor.placeholder.set; + + loadedAce.config.$defaultOptions.editor.placeholder.set = function () { + if (!this.$updatePlaceholder) { + const originalRendererOn = this.renderer.on; + this.renderer.on = function () {}; + originalPlaceholderSetter.call(this, ...arguments); + this.renderer.on = originalRendererOn; + + const originalUpdatePlaceholder = this.$updatePlaceholder; + + this.$updatePlaceholder = function () { + originalUpdatePlaceholder.call(this, ...arguments); + + if (this.renderer.placeholderNode) { + this.renderer.placeholderNode.innerHTML = this.$placeholder || ""; + } + }.bind(this); + + this.on("input", this.$updatePlaceholder); + } + + this.$updatePlaceholder(); + }; + }, }); diff --git a/app/assets/javascripts/admin/addon/components/admin-graph.js b/app/assets/javascripts/admin/addon/components/admin-graph.js index bee93aa1c5..b6bf870bc1 100644 --- a/app/assets/javascripts/admin/addon/components/admin-graph.js +++ b/app/assets/javascripts/admin/addon/components/admin-graph.js @@ -10,7 +10,7 @@ export default Component.extend({ const model = this.model; const rawData = this.get("model.data"); - var data = { + let data = { labels: rawData.map((r) => r.x), datasets: [ { diff --git a/app/assets/javascripts/admin/addon/components/admin-theme-editor.js b/app/assets/javascripts/admin/addon/components/admin-theme-editor.js index ac073c4b55..ebf733e749 100644 --- a/app/assets/javascripts/admin/addon/components/admin-theme-editor.js +++ b/app/assets/javascripts/admin/addon/components/admin-theme-editor.js @@ -2,6 +2,7 @@ import Component from "@ember/component"; import I18n from "I18n"; import discourseComputed from "discourse-common/utils/decorators"; import { fmt } from "discourse/lib/computed"; +import { isDocumentRTL } from "discourse/lib/text-direction"; import { next } from "@ember/runloop"; export default Component.extend({ @@ -43,9 +44,17 @@ export default Component.extend({ @discourseComputed("currentTargetName", "fieldName") placeholder(targetName, fieldName) { - return fieldName && fieldName === "color_definitions" - ? I18n.t("admin.customize.theme.color_definitions.placeholder") - : ""; + if (fieldName && fieldName === "color_definitions") { + const example = + ":root {\n" + + " --mytheme-tertiary-or-quaternary: #{dark-light-choose($tertiary, $quaternary)};\n" + + "}"; + + return I18n.t("admin.customize.theme.color_definitions.placeholder", { + example: isDocumentRTL() ? `
- {{#link-to "adminSiteText.edit" (concat textCustomizationPrefix "name")}} + {{#link-to "adminSiteText" (query-params q=(concat textCustomizationPrefix "name"))}} {{i18n "admin.badges.read_only_setting_help"}} {{/link-to}}
@@ -70,7 +70,7 @@ {{#if buffered.system}} {{textarea name="description" value=buffered.description disabled=true}}- {{#link-to "adminSiteText.edit" (concat textCustomizationPrefix "description")}} + {{#link-to "adminSiteText" (query-params q=(concat textCustomizationPrefix "description"))}} {{i18n "admin.badges.read_only_setting_help"}} {{/link-to}}
@@ -84,7 +84,7 @@ {{#if buffered.system}} {{textarea name="long_description" value=buffered.long_description disabled=true}}- {{#link-to "adminSiteText.edit" (concat textCustomizationPrefix "long_description")}} + {{#link-to "adminSiteText" (query-params q=(concat textCustomizationPrefix "long_description"))}} {{i18n "admin.badges.read_only_setting_help"}} {{/link-to}}
diff --git a/app/assets/javascripts/admin/addon/templates/components/admin-theme-editor.hbs b/app/assets/javascripts/admin/addon/templates/components/admin-theme-editor.hbs index ce928108a2..5458ee10d8 100644 --- a/app/assets/javascripts/admin/addon/templates/components/admin-theme-editor.hbs +++ b/app/assets/javascripts/admin/addon/templates/components/admin-theme-editor.hbs @@ -87,4 +87,4 @@{{error}}
{{/if}}
-{{ace-editor content=activeSection editorId=editorId mode=activeSectionMode autofocus="true" placeholder=placeholder}}
+{{ace-editor content=activeSection editorId=editorId mode=activeSectionMode autofocus="true" placeholder=placeholder htmlPlaceholder=true}}
diff --git a/app/assets/javascripts/admin/addon/templates/components/dashboard-new-feature-item.hbs b/app/assets/javascripts/admin/addon/templates/components/dashboard-new-feature-item.hbs
new file mode 100644
index 0000000000..2aff298640
--- /dev/null
+++ b/app/assets/javascripts/admin/addon/templates/components/dashboard-new-feature-item.hbs
@@ -0,0 +1,13 @@
+{{subtitle}}
diff --git a/app/assets/javascripts/discourse/app/templates/components/edit-category-general.hbs b/app/assets/javascripts/discourse/app/templates/components/edit-category-general.hbs index 353f1be130..60f5047be7 100644 --- a/app/assets/javascripts/discourse/app/templates/components/edit-category-general.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/edit-category-general.hbs @@ -71,7 +71,7 @@{{html-safe model.cannot_delete_reason}}
+