diff --git a/.eslintignore b/.eslintignore index fbd1b3dd1b..6758d7f68c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,8 +1,4 @@ app/assets/javascripts/browser-update.js -app/assets/javascripts/discourse-loader.js -app/assets/javascripts/env.js -app/assets/javascripts/main_include_admin.js -app/assets/javascripts/vendor.js app/assets/javascripts/locales/i18n.js app/assets/javascripts/ember-addons/ app/assets/javascripts/discourse/lib/autosize.js @@ -13,7 +9,6 @@ lib/pretty_text/ plugins/**/lib/javascripts/locale public/ vendor/ -app/assets/javascripts/discourse/tests/test-boot-rails.js app/assets/javascripts/discourse/tests/fixtures node_modules/ spec/ diff --git a/.eslintrc b/.eslintrc index 621a902c84..4aee50ed2a 100644 --- a/.eslintrc +++ b/.eslintrc @@ -21,6 +21,7 @@ "fillIn": "off", "find": "off", "getSettledState": "off", + "globalThis": "readonly", "hasModule": "off", "invisible": "off", "jQuery": "off", diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6ab6fa2dfc..270ee753d9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -31,7 +31,7 @@ jobs: fail-fast: false matrix: - build_type: [backend, frontend, frontend-legacy, annotations] + build_type: [backend, frontend, annotations] target: [core, plugins] exclude: - build_type: annotations @@ -153,24 +153,9 @@ jobs: if: matrix.build_type == 'backend' && matrix.target == 'plugins' run: bin/rake plugin:spec - - name: Core QUnit (Legacy) - if: matrix.build_type == 'frontend-legacy' && matrix.target == 'core' - run: QUNIT_EMBER_CLI=0 bin/rake qunit:test['1200000'] - timeout-minutes: 30 - - - name: Wizard QUnit (Legacy) - if: matrix.build_type == 'frontend-legacy' && matrix.target == 'core' - run: QUNIT_EMBER_CLI=0 bin/rake qunit:test['600000','/wizard/qunit'] - timeout-minutes: 10 - - - name: Plugin QUnit (Legacy) - if: matrix.build_type == 'frontend-legacy' && matrix.target == 'plugins' - run: QUNIT_EMBER_CLI=0 bin/rake plugin:qunit['*','1200000'] - timeout-minutes: 30 - - - name: Plugin QUnit (Ember CLI) + - name: Plugin QUnit if: matrix.build_type == 'frontend' && (matrix.target == 'plugins' || matrix.target == 'core-plugins') - run: QUNIT_EMBER_CLI=1 bin/rake plugin:qunit['*','1200000'] + run: bin/rake plugin:qunit['*','1200000'] timeout-minutes: 30 - name: Check Annotations diff --git a/.prettierignore b/.prettierignore index cbcac8378f..50cabc43a5 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,10 +9,6 @@ config/locales/**/*.yml script/import_scripts/**/*.yml app/assets/javascripts/browser-update.js -app/assets/javascripts/discourse-loader.js -app/assets/javascripts/env.js -app/assets/javascripts/main_include_admin.js -app/assets/javascripts/vendor.js app/assets/javascripts/locales/i18n.js app/assets/javascripts/ember-addons/ app/assets/javascripts/discourse/lib/autosize.js @@ -22,7 +18,6 @@ lib/highlight_js/ plugins/**/lib/javascripts/locale public/ vendor/ -app/assets/javascripts/discourse/tests/test-boot-rails.js app/assets/javascripts/discourse/tests/fixtures spec/ node_modules/ diff --git a/Gemfile.lock b/Gemfile.lock index 6914db5048..4ca163af08 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -107,7 +107,7 @@ GEM addressable debug_inspector (1.1.0) diff-lcs (1.5.0) - diffy (3.4.1) + diffy (3.4.2) digest (3.1.0) discourse-ember-rails (0.18.6) active_model_serializers @@ -135,7 +135,7 @@ GEM excon (0.92.3) execjs (2.8.1) exifr (1.3.9) - fabrication (2.28.0) + fabrication (2.29.0) faker (2.21.0) i18n (>= 1.8.11, < 2) fakeweb (1.3.0) @@ -236,12 +236,12 @@ GEM mini_portile2 (2.8.0) mini_racer (0.6.2) libv8-node (~> 16.10.0.0) - mini_scheduler (0.13.0) + mini_scheduler (0.14.0) sidekiq (>= 4.2.3) mini_sql (1.4.0) mini_suffix (0.3.3) ffi (~> 1.9) - minitest (5.15.0) + minitest (5.16.1) mocha (1.14.0) msgpack (1.5.2) multi_json (1.15.0) @@ -311,11 +311,11 @@ GEM openssl (> 2.0, < 3.1) optimist (3.0.1) parallel (1.22.1) - parallel_tests (3.11.0) + parallel_tests (3.11.1) parallel parser (3.1.2.0) ast (~> 2.4.1) - pg (1.3.5) + pg (1.4.1) progress (3.6.0) pry (0.13.1) coderay (~> 1.1) @@ -335,8 +335,8 @@ GEM rack (>= 1.2.0) rack-protection (2.2.0) rack - rack-test (1.1.0) - rack (>= 1.0, < 3) + rack-test (2.0.2) + rack (>= 1.3) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) @@ -410,7 +410,8 @@ GEM activesupport (>= 3.1, < 7.1) json-schema (~> 2.2) railties (>= 3.1, < 7.1) - rubocop (1.30.1) + rubocop (1.31.1) + json (~> 2.3) parallel (~> 1.10) parser (>= 3.1.0.0) rainbow (>= 2.2.2, < 4.0) @@ -450,7 +451,7 @@ GEM activesupport (>= 3.1) shoulda-matchers (5.1.0) activesupport (>= 5.2.0) - sidekiq (6.4.2) + sidekiq (6.5.1) connection_pool (>= 2.2.2) rack (~> 2.0) redis (>= 4.2.0) @@ -481,7 +482,7 @@ GEM unf (0.1.4) unf_ext unf_ext (0.0.8.2) - unicode-display_width (2.1.0) + unicode-display_width (2.2.0) unicorn (6.1.0) kgio (~> 2.6) raindrops (~> 0.7) @@ -497,7 +498,7 @@ GEM jwt (~> 2.0) xorcist (1.1.2) yaml-lint (0.0.10) - zeitwerk (2.5.4) + zeitwerk (2.6.0) PLATFORMS aarch64-linux @@ -637,4 +638,4 @@ DEPENDENCIES yaml-lint BUNDLED WITH - 2.3.13 + 2.3.16 diff --git a/README.md b/README.md index 6bda1d93f4..e40a099058 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,6 @@ If you want to set up a Discourse forum for production use, see our [**Discourse If you're looking for business class hosting, see [discourse.org/buy](https://www.discourse.org/buy/). -If you're looking for our remote work solution, see [teams.discourse.com](https://teams.discourse.com/). - ## Requirements Discourse is built for the *next* 10 years of the Internet, so our requirements are high. diff --git a/app/assets/javascripts/admin.js b/app/assets/javascripts/admin.js deleted file mode 100644 index 3edc85a7d4..0000000000 --- a/app/assets/javascripts/admin.js +++ /dev/null @@ -1,2 +0,0 @@ -//= require main_include_admin -//= require admin-plugins diff --git a/app/assets/javascripts/admin/addon/components/admin-report-table-cell.js b/app/assets/javascripts/admin/addon/components/admin-report-table-cell.js index 7ef4f7d9c1..838d8dbe1d 100644 --- a/app/assets/javascripts/admin/addon/components/admin-report-table-cell.js +++ b/app/assets/javascripts/admin/addon/components/admin-report-table-cell.js @@ -16,6 +16,6 @@ export default Component.extend({ type: alias("label.type"), property: alias("label.mainProperty"), - formatedValue: alias("computedLabel.formatedValue"), + formattedValue: alias("computedLabel.formattedValue"), value: alias("computedLabel.value"), }); diff --git a/app/assets/javascripts/admin/addon/components/watched-word-uploader.js b/app/assets/javascripts/admin/addon/components/watched-word-uploader.js index 8c2864b69b..efbacb9c0b 100644 --- a/app/assets/javascripts/admin/addon/components/watched-word-uploader.js +++ b/app/assets/javascripts/admin/addon/components/watched-word-uploader.js @@ -3,7 +3,6 @@ import I18n from "I18n"; import UppyUploadMixin from "discourse/mixins/uppy-upload"; import { alias } from "@ember/object/computed"; import bootbox from "bootbox"; -import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend(UppyUploadMixin, { type: "txt", @@ -16,9 +15,8 @@ export default Component.extend(UppyUploadMixin, { return { skipValidation: true }; }, - @discourseComputed("actionKey") - data(actionKey) { - return { action_key: actionKey }; + _perFileData() { + return { action_key: this.actionKey }; }, uploadDone() { diff --git a/app/assets/javascripts/admin/addon/controllers/admin-badges-show.js b/app/assets/javascripts/admin/addon/controllers/admin-badges-show.js index 33c8ad620b..91a2687346 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-badges-show.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-badges-show.js @@ -6,7 +6,7 @@ import { bufferedProperty } from "discourse/mixins/buffered-content"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { propertyNotEqual } from "discourse/lib/computed"; import { equal, reads } from "@ember/object/computed"; -import { run } from "@ember/runloop"; +import { next } from "@ember/runloop"; import { action } from "@ember/object"; import getURL from "discourse-common/lib/get-url"; @@ -33,7 +33,7 @@ export default Controller.extend(bufferedProperty("model"), { // this is needed because the model doesnt have default values // and as we are using a bufferedProperty it's not accessible // in any other way - run.next(() => { + next(() => { if (this.model) { if (!this.model.badge_type_id) { this.model.set( diff --git a/app/assets/javascripts/admin/addon/mixins/setting-component.js b/app/assets/javascripts/admin/addon/mixins/setting-component.js index ebf012aae9..78ab3304cf 100644 --- a/app/assets/javascripts/admin/addon/mixins/setting-component.js +++ b/app/assets/javascripts/admin/addon/mixins/setting-component.js @@ -150,7 +150,7 @@ export default Mixin.create({ "default_categories_tracking", "default_categories_muted", "default_categories_watching_first_post", - "default_categories_regular", + "default_categories_normal", "default_tags_watching", "default_tags_tracking", "default_tags_muted", diff --git a/app/assets/javascripts/admin/addon/models/report.js b/app/assets/javascripts/admin/addon/models/report.js index 55c1012eb1..9cd68dc798 100644 --- a/app/assets/javascripts/admin/addon/models/report.js +++ b/app/assets/javascripts/admin/addon/models/report.js @@ -354,7 +354,7 @@ const Report = EmberObject.extend({ value, type, property: mainProperty, - formatedValue: value ? escapeExpression(value) : "—", + formattedValue: value ? escapeExpression(value) : "—", }; }, }; @@ -364,7 +364,7 @@ const Report = EmberObject.extend({ _userLabel(properties, row) { const username = row[properties.username]; - const formatedValue = () => { + const formattedValue = () => { const userId = row[properties.id]; const user = EmberObject.create({ @@ -386,14 +386,14 @@ const Report = EmberObject.extend({ return { value: username, - formatedValue: username ? formatedValue() : "—", + formattedValue: username ? formattedValue() : "—", }; }, _topicLabel(properties, row) { const topicTitle = row[properties.title]; - const formatedValue = () => { + const formattedValue = () => { const topicId = row[properties.id]; const href = getURL(`/t/-/${topicId}`); return `${escapeExpression(topicTitle)}`; @@ -401,7 +401,7 @@ const Report = EmberObject.extend({ return { value: topicTitle, - formatedValue: topicTitle ? formatedValue() : "—", + formattedValue: topicTitle ? formattedValue() : "—", }; }, @@ -414,7 +414,7 @@ const Report = EmberObject.extend({ return { property: properties.title, value: postTitle, - formatedValue: + formattedValue: postTitle && href ? `${escapeExpression(postTitle)}` : "—", @@ -424,14 +424,14 @@ const Report = EmberObject.extend({ _secondsLabel(value) { return { value: toNumber(value), - formatedValue: durationTiny(value), + formattedValue: durationTiny(value), }; }, _percentLabel(value) { return { value: toNumber(value), - formatedValue: value ? `${value}%` : "—", + formattedValue: value ? `${value}%` : "—", }; }, @@ -440,25 +440,25 @@ const Report = EmberObject.extend({ ? true : options.formatNumbers; - const formatedValue = () => (formatNumbers ? number(value) : value); + const formattedValue = () => (formatNumbers ? number(value) : value); return { value: toNumber(value), - formatedValue: value ? formatedValue() : "—", + formattedValue: value ? formattedValue() : "—", }; }, _bytesLabel(value) { return { value: toNumber(value), - formatedValue: I18n.toHumanSize(value), + formattedValue: I18n.toHumanSize(value), }; }, _dateLabel(value, date, format = "LL") { return { value, - formatedValue: value ? date.format(format) : "—", + formattedValue: value ? date.format(format) : "—", }; }, @@ -467,14 +467,14 @@ const Report = EmberObject.extend({ return { value, - formatedValue: value ? escaped : "—", + formattedValue: value ? escaped : "—", }; }, _linkLabel(properties, row) { const property = properties[0]; const value = getURL(row[property]); - const formatedValue = (href, anchor) => { + const formattedValue = (href, anchor) => { return `${escapeExpression( anchor )}`; @@ -482,7 +482,7 @@ const Report = EmberObject.extend({ return { value, - formatedValue: value ? formatedValue(value, row[properties[1]]) : "—", + formattedValue: value ? formattedValue(value, row[properties[1]]) : "—", }; }, diff --git a/app/assets/javascripts/admin/addon/templates/components/admin-report-table-cell.hbs b/app/assets/javascripts/admin/addon/templates/components/admin-report-table-cell.hbs index fb8f2e4cdc..ab2a766612 100644 --- a/app/assets/javascripts/admin/addon/templates/components/admin-report-table-cell.hbs +++ b/app/assets/javascripts/admin/addon/templates/components/admin-report-table-cell.hbs @@ -1 +1 @@ -{{html-safe formatedValue}} +{{html-safe formattedValue}} diff --git a/app/assets/javascripts/admin/addon/templates/components/admin-report-table.hbs b/app/assets/javascripts/admin/addon/templates/components/admin-report-table.hbs index dca6767298..6ff8b0b3e4 100644 --- a/app/assets/javascripts/admin/addon/templates/components/admin-report-table.hbs +++ b/app/assets/javascripts/admin/addon/templates/components/admin-report-table.hbs @@ -31,7 +31,7 @@ {{#each totalsForSample as |total|}} - {{total.formatedValue}} + {{total.formattedValue}} {{/each}} diff --git a/app/assets/javascripts/admin/ember-cli-build.js b/app/assets/javascripts/admin/ember-cli-build.js index 81a8a5e9aa..2171aed7fd 100644 --- a/app/assets/javascripts/admin/ember-cli-build.js +++ b/app/assets/javascripts/admin/ember-cli-build.js @@ -3,7 +3,11 @@ const EmberAddon = require("ember-cli/lib/broccoli/ember-addon"); module.exports = function (defaults) { - let app = new EmberAddon(defaults, {}); + let app = new EmberAddon(defaults, { + autoImport: { + publicAssetURL: "", + }, + }); return app.toTree(); }; diff --git a/app/assets/javascripts/admin/package.json b/app/assets/javascripts/admin/package.json index 76ebe11621..444cb6ac10 100644 --- a/app/assets/javascripts/admin/package.json +++ b/app/assets/javascripts/admin/package.json @@ -15,39 +15,30 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^2.2.4", - "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0", - "xss": "^1.0.8", - "webpack": "^5.67.0" + "ember-auto-import": "^2.4.2", + "ember-cli-babel": "^7.23.1", + "ember-cli-htmlbars": "^6.0.1", + "webpack": "^5.73.0", + "xss": "^1.0.13" }, "devDependencies": { - "@ember/optional-features": "^1.1.0", - "@glimmer/component": "^1.0.0", - "babel-eslint": "^10.0.3", + "@ember/optional-features": "^2.0.0", + "@glimmer/component": "^1.1.2", "broccoli-asset-rev": "^3.0.0", "ember-cli": "~3.25.3", - "ember-cli-dependency-checker": "^3.2.0", - "ember-cli-eslint": "^5.1.0", - "ember-cli-inject-live-reload": "^2.0.1", + "ember-cli-dependency-checker": "^3.3.1", + "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sri": "^2.1.1", - "ember-cli-template-lint": "^1.0.0-beta.3", - "ember-cli-uglify": "^3.0.0", + "ember-cli-terser": "^4.0.2", "ember-disable-prototype-extensions": "^1.1.3", - "ember-export-application-global": "^2.0.1", "ember-load-initializers": "^2.1.1", - "ember-maybe-import-regenerator": "^0.1.6", "ember-resolver": "^7.0.0", "ember-source": "~3.15.0", - "ember-source-channel-url": "^2.0.1", - "ember-try": "^2.0.0", - "eslint": "^7.27.0", - "eslint-plugin-ember": "^7.7.1", - "eslint-plugin-node": "^10.0.0", + "ember-source-channel-url": "^3.0.0", "loader.js": "^4.7.0" }, "engines": { - "node": "12.* || 14.* || >= 16", + "node": "16.* || >= 18", "npm": "please-use-yarn", "yarn": ">= 1.21.1" }, diff --git a/app/assets/javascripts/admin/tests/dummy/app/index.html b/app/assets/javascripts/admin/tests/dummy/app/index.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/admin/tests/dummy/app/styles/.gitkeep b/app/assets/javascripts/admin/tests/dummy/app/styles/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/admin/tests/dummy/app/templates/.gitkeep b/app/assets/javascripts/admin/tests/dummy/app/templates/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/admin/tests/dummy/config/.gitkeep b/app/assets/javascripts/admin/tests/dummy/config/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/admin/tests/dummy/public/.gitkeep b/app/assets/javascripts/admin/tests/dummy/public/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/admin/tests/index.html b/app/assets/javascripts/admin/tests/index.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/app-boot.js b/app/assets/javascripts/app-boot.js deleted file mode 100644 index 834d81cc31..0000000000 --- a/app/assets/javascripts/app-boot.js +++ /dev/null @@ -1,27 +0,0 @@ -// discourse-skip-module - -(function () { - if (window.unsupportedBrowser) { - throw "Unsupported browser detected"; - } - - let Discourse = requirejs("discourse/app").default.create(); - - // required for our template compiler - window.__DISCOURSE_RAW_TEMPLATES = requirejs( - "discourse-common/lib/raw-templates" - ).__DISCOURSE_RAW_TEMPLATES; - - // required for addons to work without Ember CLI - // eslint-disable-next-line no-undef - Object.keys(Ember.TEMPLATES).forEach((k) => { - if (k.indexOf("select-kit") === 0) { - // eslint-disable-next-line no-undef - let template = Ember.TEMPLATES[k]; - define(k, () => template); - } - }); - - // ensure Discourse is added as a global - window.Discourse = Discourse; -})(); diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js deleted file mode 100644 index dbaf4acf87..0000000000 --- a/app/assets/javascripts/application.js +++ /dev/null @@ -1,104 +0,0 @@ -//= require_tree ./truth-helpers/addon -//= require_tree ./discourse-common/addon -//= require ./polyfills -//= require_tree ./select-kit/addon -//= require ./discourse/app/app -//= require ./app-boot - -// Stuff we need to load first -//= require ./discourse/app/lib/to-markdown -//= require ./discourse/app/lib/utilities -//= require ./discourse/app/lib/user-presence -//= require ./discourse/app/lib/logout -//= require ./discourse/app/mixins/singleton -//= require ./discourse/app/models/rest -//= require ./discourse/app/models/session -//= require ./discourse/app/lib/ajax -//= require ./discourse/app/lib/text -//= require ./discourse/app/lib/hash -//= require ./discourse/app/lib/load-script -//= require ./discourse/app/lib/notification-levels -//= require ./discourse/app/services/app-events -//= require ./discourse/app/lib/offset-calculator -//= require ./discourse/app/lib/lock-on -//= require ./discourse/app/lib/url -//= require ./discourse/app/lib/email-provider-default-settings -//= require ./discourse/app/lib/debounce -//= require ./discourse/app/lib/quote -//= require ./discourse/app/lib/key-value-store -//= require ./discourse/app/lib/computed -//= require ./discourse/app/lib/formatter -//= require ./discourse/app/lib/text-direction -//= require ./discourse/app/lib/eyeline -//= require ./discourse/app/lib/show-modal -//= require ./discourse/app/lib/download-calendar -//= require ./discourse/app/mixins/scrolling -//= require ./discourse/app/lib/ajax-error -//= require ./discourse/app/models/result-set -//= require ./discourse/app/models/store -//= require ./discourse/app/models/action-summary -//= require ./discourse/app/models/permission-type -//= require ./discourse/app/models/category -//= require ./discourse/app/models/topic -//= require ./discourse/app/models/draft -//= require ./discourse/app/models/composer -//= require ./discourse/app/models/badge-grouping -//= require ./discourse/app/models/badge -//= require ./discourse/app/models/permission-type -//= require ./discourse/app/models/user-action-group -//= require ./discourse/app/models/trust-level -//= require ./discourse/app/lib/search -//= require ./discourse/app/lib/user-search -//= require ./discourse/app/lib/export-csv -//= require ./discourse/app/lib/autocomplete -//= require ./discourse/app/lib/after-transition -//= require ./discourse/app/lib/safari-hacks -//= require ./discourse/app/lib/put-cursor-at-end -//= require_tree ./discourse/app/adapters -//= require ./discourse/app/models/post-action-type -//= require ./discourse/app/models/post -//= require ./discourse/app/lib/posts-with-placeholders -//= require ./discourse/app/models/post-stream -//= require ./discourse/app/models/topic-details -//= require ./discourse/app/models/topic -//= require ./discourse/app/models/user-action -//= require ./discourse/app/models/draft -//= require ./discourse/app/models/composer -//= require ./discourse/app/models/user-badge -//= require_tree ./discourse/app/lib -//= require_tree ./discourse/app/mixins -//= require ./discourse/app/models/invite -//= require ./discourse/app/controllers/discovery-sortable -//= require ./discourse/app/controllers/navigation/default -//= require ./discourse/app/components/edit-category-panel -//= require ./discourse/app/lib/link-mentions -//= require ./discourse/app/components/site-header -//= require ./discourse/app/components/d-editor -//= require ./discourse/app/routes/discourse -//= require ./discourse/app/routes/build-topic-route -//= require ./discourse/app/routes/restricted-user -//= require ./discourse/app/routes/user-topic-list -//= require ./discourse/app/routes/user-activity-stream -//= require ./discourse/app/routes/topic-from-params -//= require ./discourse/app/components/text-field -//= require ./discourse/app/components/conditional-loading-spinner -//= require ./discourse/app/helpers/user-avatar -//= require ./discourse/app/helpers/cold-age-class -//= require ./discourse/app/helpers/loading-spinner -//= require ./discourse/app/helpers/category-link -//= require ./discourse/app/lib/export-result -//= require ./discourse/app/mapping-router - -//= require_tree ./discourse/app/controllers -//= require_tree ./discourse/app/models -//= require_tree ./discourse/app/components -//= require_tree ./discourse/app/raw-views -//= require_tree ./discourse/app/helpers -//= require_tree ./discourse/app/templates -//= require_tree ./discourse/app/routes -//= require_tree ./discourse/app/pre-initializers -//= require_tree ./discourse/app/initializers -//= require_tree ./discourse/app/services - -//= require_tree ./discourse/app/widgets -//= require ./widget-runtime diff --git a/app/assets/javascripts/discourse-common/addon/config/environment.js b/app/assets/javascripts/discourse-common/addon/config/environment.js index 3e825fa3c8..cc5f76fe17 100644 --- a/app/assets/javascripts/discourse-common/addon/config/environment.js +++ b/app/assets/javascripts/discourse-common/addon/config/environment.js @@ -1,3 +1,5 @@ +import deprecated from "discourse-common/lib/deprecated"; + export const INPUT_DELAY = 250; let environment = "unknown"; @@ -19,6 +21,9 @@ export function isTesting() { // eslint-disable-next-line no-undef let _isLegacy = Ember.VERSION.startsWith("3.12"); export function isLegacyEmber() { + deprecated("`isLegacyEmber()` is now deprecated and always returns true", { + dropFrom: "3.0.0.beta1", + }); return _isLegacy; } diff --git a/app/assets/javascripts/discourse-common/addon/lib/debounce.js b/app/assets/javascripts/discourse-common/addon/lib/debounce.js index dcd2693b78..2bcd387724 100644 --- a/app/assets/javascripts/discourse-common/addon/lib/debounce.js +++ b/app/assets/javascripts/discourse-common/addon/lib/debounce.js @@ -1,5 +1,5 @@ -import { debounce, next, run } from "@ember/runloop"; -import { isLegacyEmber, isTesting } from "discourse-common/config/environment"; +import { debounce } from "@ember/runloop"; +import { isTesting } from "discourse-common/config/environment"; /** Debounce a Javascript function. This means if it's called many times in a time limit it @@ -7,13 +7,13 @@ import { isLegacyEmber, isTesting } from "discourse-common/config/environment"; Original function will be called with the context and arguments from the last call made. **/ -let testingFunc = isLegacyEmber() ? run : next; - export default function () { if (isTesting()) { - // Don't include the time argument (in ms) + // Replace the time argument with 10ms let args = [].slice.call(arguments, 0, -1); - return testingFunc.apply(void 0, args); + args.push(10); + + return debounce.apply(undefined, args); } else { return debounce(...arguments); } diff --git a/app/assets/javascripts/discourse-common/addon/lib/icon-library.js b/app/assets/javascripts/discourse-common/addon/lib/icon-library.js index 7a8588f91b..a77aa591f2 100644 --- a/app/assets/javascripts/discourse-common/addon/lib/icon-library.js +++ b/app/assets/javascripts/discourse-common/addon/lib/icon-library.js @@ -3,6 +3,7 @@ import attributeHook from "discourse-common/lib/attribute-hook"; import { h } from "virtual-dom"; import { isDevelopment } from "discourse-common/config/environment"; import escape from "discourse-common/lib/escape"; +import deprecated from "discourse-common/lib/deprecated"; const SVG_NAMESPACE = "http://www.w3.org/2000/svg"; let _renderers = []; @@ -159,9 +160,18 @@ registerIconRenderer({ I18n.t(params.title) )}'>${html}`; } + if (params.translatedtitle) { + deprecated(`use 'translatedTitle' option instead of 'translatedtitle'`, { + since: "2.9.0.beta6", + dropFrom: "2.10.0.beta1", + }); + params.translatedTitle = params.translatedtitle; + } + + if (params.translatedTitle) { html = `${html}`; } return html; diff --git a/app/assets/javascripts/discourse-common/addon/resolver.js b/app/assets/javascripts/discourse-common/addon/resolver.js index c7914aa912..c0b8162866 100644 --- a/app/assets/javascripts/discourse-common/addon/resolver.js +++ b/app/assets/javascripts/discourse-common/addon/resolver.js @@ -93,6 +93,7 @@ export function buildResolver(baseName) { if (split.length > 1) { const appBase = `${baseName}/${split[0]}s/`; const adminBase = "admin/" + split[0] + "s/"; + const wizardBase = "wizard/" + split[0] + "s/"; // Allow render 'admin/templates/xyz' too split[1] = split[1].replace(".templates", "").replace("/templates", ""); @@ -101,7 +102,8 @@ export function buildResolver(baseName) { let dashed = dasherize(split[1].replace(/\./g, "/")); if ( requirejs.entries[appBase + dashed] || - requirejs.entries[adminBase + dashed] + requirejs.entries[adminBase + dashed] || + requirejs.entries[wizardBase + dashed] ) { return split[0] + ":" + dashed; } @@ -110,7 +112,8 @@ export function buildResolver(baseName) { dashed = dasherize(split[1].replace(/\./g, "-")); if ( requirejs.entries[appBase + dashed] || - requirejs.entries[adminBase + dashed] + requirejs.entries[adminBase + dashed] || + requirejs.entries[wizardBase + dashed] ) { return split[0] + ":" + dashed; } @@ -253,6 +256,7 @@ export function buildResolver(baseName) { templates[decamelized.replace(/\_/, "/")] || templates[`${baseName}/templates/${withoutType}`] || this.findAdminTemplate(parsedName) || + this.findWizardTemplate(parsedName) || this.findUnderscoredTemplate(parsedName) ); }, @@ -296,5 +300,37 @@ export function buildResolver(baseName) { ); } }, + + findWizardTemplate(parsedName) { + let decamelized = decamelize(parsedName.fullNameWithoutType); + if (decamelized.startsWith("components")) { + let comPath = `wizard/templates/${decamelized}`; + const compTemplate = + Ember.TEMPLATES[`javascripts/${comPath}`] || Ember.TEMPLATES[comPath]; + if (compTemplate) { + return compTemplate; + } + } + + if (decamelized === "javascripts/wizard") { + return Ember.TEMPLATES["wizard/templates/wizard"]; + } + + if ( + decamelized.startsWith("wizard") || + decamelized.startsWith("javascripts/wizard") + ) { + decamelized = decamelized.replace(/^wizard\_/, "wizard/templates/"); + decamelized = decamelized.replace(/^wizard\./, "wizard/templates/"); + decamelized = decamelized.replace(/\./g, "_"); + + const dashed = decamelized.replace(/_/g, "-"); + return ( + Ember.TEMPLATES[decamelized] || + Ember.TEMPLATES[dashed] || + Ember.TEMPLATES[dashed.replace("wizard-", "wizard/")] + ); + } + }, }); } diff --git a/app/assets/javascripts/discourse-common/addon/utils/decorators.js b/app/assets/javascripts/discourse-common/addon/utils/decorators.js index 5417a0dabc..b847ad830e 100644 --- a/app/assets/javascripts/discourse-common/addon/utils/decorators.js +++ b/app/assets/javascripts/discourse-common/addon/utils/decorators.js @@ -1,5 +1,35 @@ import { on as emberOn } from "@ember/object/evented"; -import { computed, observer } from "@ember/object"; +import { observer } from "@ember/object"; +import { + alias as EmberAlias, + and as EmberAnd, + bool as EmberBool, + collect as EmberCollect, + empty as EmberEmpty, + equal as EmberEqual, + filter as EmberFilter, + filterBy as EmberFilterBy, + gt as EmberGt, + gte as EmberGte, + lt as EmberLt, + lte as EmberLte, + map as EmberMap, + mapBy as EmberMapBy, + match as EmberMatch, + max as EmberMax, + min as EmberMin, + none as EmberNone, + not as EmberNot, + notEmpty as EmberNotEmpty, + oneWay as EmberOneWay, + or as EmberOr, + reads as EmberReads, + setDiff as EmberSetDiff, + sort as EmberSort, + sum as EmberSum, + union as EmberUnion, + uniq as EmberUniq, +} from "@ember/object/computed"; import { bind as emberBind, schedule } from "@ember/runloop"; import decoratorAlias from "discourse-common/utils/decorator-alias"; import extractValue from "discourse-common/utils/extract-value"; @@ -63,31 +93,31 @@ export const observes = decoratorAlias( "Can not `observe` without property names" ); -export const alias = macroAlias(computed.alias); -export const and = macroAlias(computed.and); -export const bool = macroAlias(computed.bool); -export const collect = macroAlias(computed.collect); -export const empty = macroAlias(computed.empty); -export const equal = macroAlias(computed.equal); -export const filter = macroAlias(computed.filter); -export const filterBy = macroAlias(computed.filterBy); -export const gt = macroAlias(computed.gt); -export const gte = macroAlias(computed.gte); -export const lt = macroAlias(computed.lt); -export const lte = macroAlias(computed.lte); -export const map = macroAlias(computed.map); -export const mapBy = macroAlias(computed.mapBy); -export const match = macroAlias(computed.match); -export const max = macroAlias(computed.max); -export const min = macroAlias(computed.min); -export const none = macroAlias(computed.none); -export const not = macroAlias(computed.not); -export const notEmpty = macroAlias(computed.notEmpty); -export const oneWay = macroAlias(computed.oneWay); -export const or = macroAlias(computed.or); -export const reads = macroAlias(computed.reads); -export const setDiff = macroAlias(computed.setDiff); -export const sort = macroAlias(computed.sort); -export const sum = macroAlias(computed.sum); -export const union = macroAlias(computed.union); -export const uniq = macroAlias(computed.uniq); +export const alias = macroAlias(EmberAlias); +export const and = macroAlias(EmberAnd); +export const bool = macroAlias(EmberBool); +export const collect = macroAlias(EmberCollect); +export const empty = macroAlias(EmberEmpty); +export const equal = macroAlias(EmberEqual); +export const filter = macroAlias(EmberFilter); +export const filterBy = macroAlias(EmberFilterBy); +export const gt = macroAlias(EmberGt); +export const gte = macroAlias(EmberGte); +export const lt = macroAlias(EmberLt); +export const lte = macroAlias(EmberLte); +export const map = macroAlias(EmberMap); +export const mapBy = macroAlias(EmberMapBy); +export const match = macroAlias(EmberMatch); +export const max = macroAlias(EmberMax); +export const min = macroAlias(EmberMin); +export const none = macroAlias(EmberNone); +export const not = macroAlias(EmberNot); +export const notEmpty = macroAlias(EmberNotEmpty); +export const oneWay = macroAlias(EmberOneWay); +export const or = macroAlias(EmberOr); +export const reads = macroAlias(EmberReads); +export const setDiff = macroAlias(EmberSetDiff); +export const sort = macroAlias(EmberSort); +export const sum = macroAlias(EmberSum); +export const union = macroAlias(EmberUnion); +export const uniq = macroAlias(EmberUniq); diff --git a/app/assets/javascripts/discourse-common/ember-cli-build.js b/app/assets/javascripts/discourse-common/ember-cli-build.js index 81a8a5e9aa..2171aed7fd 100644 --- a/app/assets/javascripts/discourse-common/ember-cli-build.js +++ b/app/assets/javascripts/discourse-common/ember-cli-build.js @@ -3,7 +3,11 @@ const EmberAddon = require("ember-cli/lib/broccoli/ember-addon"); module.exports = function (defaults) { - let app = new EmberAddon(defaults, {}); + let app = new EmberAddon(defaults, { + autoImport: { + publicAssetURL: "", + }, + }); return app.toTree(); }; diff --git a/app/assets/javascripts/discourse-common/package.json b/app/assets/javascripts/discourse-common/package.json index 1cb9e5d26a..6761055ed9 100644 --- a/app/assets/javascripts/discourse-common/package.json +++ b/app/assets/javascripts/discourse-common/package.json @@ -21,43 +21,35 @@ "@uppy/drop-target": "^1.1.2", "@uppy/utils": "^4.0.5", "@uppy/xhr-upload": "^2.0.7", - "ember-auto-import": "^2.2.4", - "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0", + "ember-auto-import": "^2.4.2", + "ember-cli-babel": "^7.23.1", + "ember-cli-htmlbars": "^6.0.1", "handlebars": "^4.7.0", "truth-helpers": "^1.0.0", - "webpack": "^5.67.0" + "webpack": "^5.73.0" }, "devDependencies": { - "@ember/optional-features": "^1.1.0", - "@glimmer/component": "^1.0.0", - "babel-eslint": "^10.0.3", + "@ember/optional-features": "^2.0.0", + "@glimmer/component": "^1.1.2", "broccoli-asset-rev": "^3.0.0", "ember-cli": "~3.25.3", - "ember-cli-dependency-checker": "^3.2.0", - "ember-cli-eslint": "^5.1.0", - "ember-cli-inject-live-reload": "^2.0.1", + "ember-cli-dependency-checker": "^3.3.1", + "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sri": "^2.1.1", - "ember-cli-template-lint": "^1.0.0-beta.3", - "ember-cli-uglify": "^3.0.0", + "ember-cli-terser": "^4.0.2", "ember-disable-prototype-extensions": "^1.1.3", - "ember-export-application-global": "^2.0.1", "ember-load-initializers": "^2.1.1", - "ember-maybe-import-regenerator": "^0.1.6", "ember-resolver": "^7.0.0", "ember-source": "~3.15.0", - "ember-source-channel-url": "^2.0.1", - "ember-try": "^2.0.0", - "eslint-plugin-ember": "^7.7.1", - "eslint-plugin-node": "^10.0.0", + "ember-source-channel-url": "^3.0.0", "loader.js": "^4.7.0" }, "engines": { - "node": "12.* || 14.* || >= 16", + "node": "16.* || >= 18", "npm": "please-use-yarn", "yarn": ">= 1.21.1" }, "ember": { - "edition": "octane" + "edition": "default" } } diff --git a/app/assets/javascripts/discourse-common/tests/dummy/app/index.html b/app/assets/javascripts/discourse-common/tests/dummy/app/index.html new file mode 100644 index 0000000000..870306a6ba --- /dev/null +++ b/app/assets/javascripts/discourse-common/tests/dummy/app/index.html @@ -0,0 +1,24 @@ + + + + + Dummy + + + + {{content-for "head"}} + + + + + {{content-for "head-footer"}} + + + {{content-for "body"}} + + + + + {{content-for "body-footer"}} + + \ No newline at end of file diff --git a/app/assets/javascripts/discourse-common/tests/dummy/app/styles/.gitkeep b/app/assets/javascripts/discourse-common/tests/dummy/app/styles/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/discourse-common/tests/dummy/app/templates/.gitkeep b/app/assets/javascripts/discourse-common/tests/dummy/app/templates/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/discourse-common/tests/dummy/config/.gitkeep b/app/assets/javascripts/discourse-common/tests/dummy/config/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/discourse-common/tests/dummy/public/.gitkeep b/app/assets/javascripts/discourse-common/tests/dummy/public/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/discourse-common/tests/index.html b/app/assets/javascripts/discourse-common/tests/index.html new file mode 100644 index 0000000000..5c291da716 --- /dev/null +++ b/app/assets/javascripts/discourse-common/tests/index.html @@ -0,0 +1,39 @@ + + + + + Dummy Tests + + + + {{content-for "head"}} + {{content-for "test-head"}} + + + + + + {{content-for "head-footer"}} + {{content-for "test-head-footer"}} + + + {{content-for "body"}} + {{content-for "test-body"}} + +
+
+
+
+
+
+ + + + + + + + {{content-for "body-footer"}} + {{content-for "test-body-footer"}} + + \ No newline at end of file diff --git a/app/assets/javascripts/discourse-hbr/ember-cli-build.js b/app/assets/javascripts/discourse-hbr/ember-cli-build.js new file mode 100644 index 0000000000..2171aed7fd --- /dev/null +++ b/app/assets/javascripts/discourse-hbr/ember-cli-build.js @@ -0,0 +1,13 @@ +"use strict"; + +const EmberAddon = require("ember-cli/lib/broccoli/ember-addon"); + +module.exports = function (defaults) { + let app = new EmberAddon(defaults, { + autoImport: { + publicAssetURL: "", + }, + }); + + return app.toTree(); +}; diff --git a/app/assets/javascripts/discourse-hbr/package.json b/app/assets/javascripts/discourse-hbr/package.json index dce9d60e8f..5f245a8b8c 100644 --- a/app/assets/javascripts/discourse-hbr/package.json +++ b/app/assets/javascripts/discourse-hbr/package.json @@ -15,43 +15,34 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^2.2.4", - "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0", - "webpack": "^5.67.0" + "ember-auto-import": "^2.4.2", + "ember-cli-babel": "^7.23.1", + "ember-cli-htmlbars": "^6.0.1", + "handlebars": "^4.7.6", + "webpack": "^5.73.0" }, "devDependencies": { - "@ember/optional-features": "^1.1.0", - "@glimmer/component": "^1.0.0", - "babel-eslint": "^10.0.3", + "@ember/optional-features": "^2.0.0", + "@glimmer/component": "^1.1.2", "broccoli-asset-rev": "^3.0.0", - "broccoli-stew": "^3.0.0", "ember-cli": "~3.25.3", - "ember-cli-dependency-checker": "^3.2.0", - "ember-cli-eslint": "^5.1.0", - "ember-cli-inject-live-reload": "^2.0.1", + "ember-cli-dependency-checker": "^3.3.1", + "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sri": "^2.1.1", - "ember-cli-template-lint": "^1.0.0-beta.3", - "ember-cli-uglify": "^3.0.0", + "ember-cli-terser": "^4.0.2", "ember-disable-prototype-extensions": "^1.1.3", - "ember-export-application-global": "^2.0.1", "ember-load-initializers": "^2.1.1", - "ember-maybe-import-regenerator": "^0.1.6", "ember-resolver": "^7.0.0", "ember-source": "~3.15.0", - "ember-source-channel-url": "^2.0.1", - "ember-try": "^2.0.0", - "eslint-plugin-ember": "^7.7.1", - "eslint-plugin-node": "^10.0.0", - "handlebars": "^4.7.6", + "ember-source-channel-url": "^3.0.0", "loader.js": "^4.7.0" }, "engines": { - "node": "12.* || 14.* || >= 16", + "node": "16.* || >= 18", "npm": "please-use-yarn", "yarn": ">= 1.21.1" }, "ember": { - "edition": "octane" + "edition": "default" } } diff --git a/app/assets/javascripts/discourse-hbr/tests/dummy/app/index.html b/app/assets/javascripts/discourse-hbr/tests/dummy/app/index.html new file mode 100644 index 0000000000..870306a6ba --- /dev/null +++ b/app/assets/javascripts/discourse-hbr/tests/dummy/app/index.html @@ -0,0 +1,24 @@ + + + + + Dummy + + + + {{content-for "head"}} + + + + + {{content-for "head-footer"}} + + + {{content-for "body"}} + + + + + {{content-for "body-footer"}} + + \ No newline at end of file diff --git a/app/assets/javascripts/discourse-hbr/tests/dummy/app/styles/.gitkeep b/app/assets/javascripts/discourse-hbr/tests/dummy/app/styles/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/discourse-hbr/tests/dummy/app/templates/.gitkeep b/app/assets/javascripts/discourse-hbr/tests/dummy/app/templates/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/discourse-hbr/tests/dummy/config/.gitkeep b/app/assets/javascripts/discourse-hbr/tests/dummy/config/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/discourse-hbr/tests/dummy/public/.gitkeep b/app/assets/javascripts/discourse-hbr/tests/dummy/public/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/discourse-hbr/tests/index.html b/app/assets/javascripts/discourse-hbr/tests/index.html new file mode 100644 index 0000000000..5c291da716 --- /dev/null +++ b/app/assets/javascripts/discourse-hbr/tests/index.html @@ -0,0 +1,39 @@ + + + + + Dummy Tests + + + + {{content-for "head"}} + {{content-for "test-head"}} + + + + + + {{content-for "head-footer"}} + {{content-for "test-head-footer"}} + + + {{content-for "body"}} + {{content-for "test-body"}} + +
+
+
+
+
+
+ + + + + + + + {{content-for "body-footer"}} + {{content-for "test-body-footer"}} + + \ No newline at end of file diff --git a/app/assets/javascripts/discourse-loader.js b/app/assets/javascripts/discourse-loader.js deleted file mode 100644 index 3686522bdc..0000000000 --- a/app/assets/javascripts/discourse-loader.js +++ /dev/null @@ -1,432 +0,0 @@ -var define, requirejs; - -(function () { - var JS_MODULES = {}; - var ALIASES = { - "ember-addons/ember-computed-decorators": - "discourse-common/utils/decorators", - "discourse/lib/raw-templates": "discourse-common/lib/raw-templates", - "preload-store": "discourse/lib/preload-store", - "fixtures/user_fixtures": "discourse/tests/fixtures/user-fixtures", - }; - var ALIAS_PREPEND = { - fixtures: "discourse/tests/", - helpers: "discourse/tests/", - }; - - // In future versions of ember we don't need this - if (typeof Ember !== "undefined") { - JS_MODULES = { - jquery: { default: $ }, - "@ember/array": { - default: Ember.Array, - A: Ember.A, - isArray: Ember.isArray, - }, - "@ember/array/proxy": { - default: Ember.ArrayProxy, - }, - "@ember/component": { - default: Ember.Component, - }, - "@ember/controller": { - default: Ember.Controller, - inject: Ember.inject.controller, - }, - "@ember/debug": { - assert: Ember.assert, - runInDebug: Ember.runInDebug, - warn: Ember.warn, - }, - "@ember/object": { - action: Ember._action, - default: Ember.Object, - get: Ember.get, - getProperties: Ember.getProperties, - set: Ember.set, - setProperties: Ember.setProperties, - computed: Ember.computed, - defineProperty: Ember.defineProperty, - observer: Ember.observer, - }, - "@ember/object/computed": { - alias: Ember.computed.alias, - and: Ember.computed.and, - bool: Ember.computed.bool, - collect: Ember.computed.collect, - deprecatingAlias: Ember.computed.deprecatingAlias, - empty: Ember.computed.empty, - equal: Ember.computed.equal, - filter: Ember.computed.filter, - filterBy: Ember.computed.filterBy, - gt: Ember.computed.gt, - gte: Ember.computed.gte, - intersect: Ember.computed.intersect, - lt: Ember.computed.lt, - lte: Ember.computed.lte, - map: Ember.computed.map, - mapBy: Ember.computed.mapBy, - match: Ember.computed.match, - max: Ember.computed.max, - min: Ember.computed.min, - none: Ember.computed.none, - not: Ember.computed.not, - notEmpty: Ember.computed.notEmpty, - oneWay: Ember.computed.oneWay, - or: Ember.computed.or, - readOnly: Ember.computed.readOnly, - reads: Ember.computed.reads, - setDiff: Ember.computed.setDiff, - sort: Ember.computed.sort, - sum: Ember.computed.sum, - union: Ember.computed.union, - uniq: Ember.computed.uniq, - uniqBy: Ember.computed.uniqBy, - }, - "@ember/object/mixin": { default: Ember.Mixin }, - "@ember/object/proxy": { default: Ember.ObjectProxy }, - "@ember/object/promise-proxy-mixin": { default: Ember.PromiseProxyMixin }, - "@ember/object/evented": { - default: Ember.Evented, - on: Ember.on, - }, - "@ember/routing/route": { default: Ember.Route }, - "@ember/routing/router": { default: Ember.Router }, - "@ember/runloop": { - bind: Ember.run.bind, - cancel: Ember.run.cancel, - debounce: Ember.testing ? Ember.run : Ember.run.debounce, - later: Ember.run.later, - next: Ember.run.next, - once: Ember.run.once, - run: Ember.run, - schedule: Ember.run.schedule, - scheduleOnce: Ember.run.scheduleOnce, - throttle: Ember.run.throttle, - }, - "@ember/service": { - default: Ember.Service, - inject: Ember.inject.service, - }, - "@ember/utils": { - isBlank: Ember.isBlank, - isEmpty: Ember.isEmpty, - isNone: Ember.isNone, - isPresent: Ember.isPresent, - }, - rsvp: { - asap: Ember.RSVP.asap, - all: Ember.RSVP.all, - allSettled: Ember.RSVP.allSettled, - race: Ember.RSVP.race, - hash: Ember.RSVP.hash, - hashSettled: Ember.RSVP.hashSettled, - rethrow: Ember.RSVP.rethrow, - defer: Ember.RSVP.defer, - denodeify: Ember.RSVP.denodeify, - resolve: Ember.RSVP.resolve, - reject: Ember.RSVP.reject, - map: Ember.RSVP.map, - filter: Ember.RSVP.filter, - default: Ember.RSVP, - Promise: Ember.RSVP.Promise, - EventTarget: Ember.RSVP.EventTarget, - }, - "@ember/string": { - w: Ember.String.w, - dasherize: Ember.String.dasherize, - decamelize: Ember.String.decamelize, - camelize: Ember.String.camelize, - classify: Ember.String.classify, - underscore: Ember.String.underscore, - capitalize: Ember.String.capitalize, - }, - "@ember/template": { - htmlSafe: Ember.String.htmlSafe, - }, - "@ember/application": { - default: Ember.Application, - setOwner: Ember.setOwner, - getOwner: Ember.getOwner, - }, - "@ember/component/helper": { - default: Ember.Helper, - }, - "@ember/component/text-field": { - default: Ember.TextField, - }, - "@ember/component/text-area": { - default: Ember.TextArea, - }, - "@ember/error": { - default: Ember.error, - }, - "@ember/object/internals": { - guidFor: Ember.guidFor, - }, - "@ember/test": { - registerWaiter: Ember.Test && Ember.Test.registerWaiter, - unregisterWaiter: Ember.Test && Ember.Test.unregisterWaiter, - }, - I18n: { - // eslint-disable-next-line - default: I18n, - }, - }; - } - - var _isArray; - if (!Array.isArray) { - _isArray = function (x) { - return Object.prototype.toString.call(x) === "[object Array]"; - }; - } else { - _isArray = Array.isArray; - } - - var registry = {}; - var seen = {}; - var FAILED = false; - - var uuid = 0; - - function tryFinally(tryable, finalizer) { - try { - return tryable(); - } finally { - finalizer(); - } - } - - function unsupportedModule(length) { - throw new Error( - "an unsupported module was defined, expected `define(name, deps, module)` instead got: `" + - length + - "` arguments to define`" - ); - } - - function deprecatedModule(depricated, useInstead) { - var warning = "[DEPRECATION] `" + depricated + "` is deprecated."; - if (useInstead) { - warning += " Please use `" + useInstead + "` instead."; - } - // eslint-disable-next-line no-console - console.warn(warning); - } - - var defaultDeps = ["require", "exports", "module"]; - - function Module(name, deps, callback, exports) { - this.id = uuid++; - this.name = name; - this.deps = !deps.length && callback.length ? defaultDeps : deps; - this.exports = exports || {}; - this.callback = callback; - this.state = undefined; - this._require = undefined; - } - - Module.prototype.makeRequire = function () { - var name = transformForAliases(this.name); - - return ( - this._require || - (this._require = function (dep) { - return requirejs(resolve(dep, name)); - }) - ); - }; - - define = function (name, deps, callback) { - if (arguments.length < 2) { - unsupportedModule(arguments.length); - } - - if (!_isArray(deps)) { - callback = deps; - deps = []; - } - - registry[name] = new Module(name, deps, callback); - }; - - // we don't support all of AMD - // define.amd = {}; - // we will support petals... - define.petal = {}; - - function Alias(path) { - this.name = path; - } - - define.alias = function (path) { - return new Alias(path); - }; - - function reify(mod, name, rseen) { - var deps = mod.deps; - var length = deps.length; - var reified = new Array(length); - var dep; - // TODO: new Module - // TODO: seen refactor - var module = {}; - - for (var i = 0, l = length; i < l; i++) { - dep = deps[i]; - if (dep === "exports") { - module.exports = reified[i] = rseen; - } else if (dep === "require") { - reified[i] = mod.makeRequire(); - } else if (dep === "module") { - mod.exports = rseen; - module = reified[i] = mod; - } else { - reified[i] = requireFrom(resolve(dep, name), name); - } - } - - return { - deps: reified, - module: module, - }; - } - - function requireFrom(name, origin) { - name = transformForAliases(name); - - if (name === "discourse") { - // eslint-disable-next-line no-console - console.log( - "discourse has been moved to `discourse/app` - please update your code" - ); - name = "discourse/app"; - } - - if (name === "discourse/models/input-validation") { - // eslint-disable-next-line no-console - console.log( - "input-validation has been removed and should be replaced with `@ember/object`" - ); - name = "@ember/object"; - } - - var mod = JS_MODULES[name] || registry[name]; - if (!mod) { - throw new Error( - "Could not find module `" + name + "` imported from `" + origin + "`" - ); - } - return requirejs(name); - } - - function missingModule(name) { - throw new Error("Could not find module " + name); - } - - function transformForAliases(name) { - var alias = ALIASES[name]; - if (!alias) { - var segment = name.split("/")[0]; - var prepend = ALIAS_PREPEND[segment]; - if (!prepend) { - return name; - } - alias = prepend + name; - } - deprecatedModule(name, alias); - return alias; - } - - requirejs = require = function (name) { - name = transformForAliases(name); - if (JS_MODULES[name]) { - return JS_MODULES[name]; - } - - var mod = registry[name]; - - if (mod && mod.callback instanceof Alias) { - mod = registry[mod.callback.name]; - } - - if (!mod) { - missingModule(name); - } - - if (mod.state !== FAILED && seen.hasOwnProperty(name)) { - return seen[name]; - } - - var reified; - var module; - var loaded = false; - - seen[name] = {}; // placeholder for run-time cycles - - tryFinally( - function () { - reified = reify(mod, name, seen[name]); - module = mod.callback.apply(this, reified.deps); - loaded = true; - }, - function () { - if (!loaded) { - mod.state = FAILED; - } - } - ); - - var obj; - if (module === undefined && reified.module.exports) { - obj = reified.module.exports; - } else { - obj = seen[name] = module; - } - - if ( - obj !== null && - (typeof obj === "object" || typeof obj === "function") && - obj["default"] === undefined - ) { - obj["default"] = obj; - } - - return (seen[name] = obj); - }; - window.requireModule = requirejs; - - function resolve(child, name) { - if (child.charAt(0) !== ".") { - return child; - } - - var parts = child.split("/"); - var nameParts = name.split("/"); - var parentBase = nameParts.slice(0, -1); - - for (var i = 0, l = parts.length; i < l; i++) { - var part = parts[i]; - - if (part === "..") { - if (parentBase.length === 0) { - throw new Error("Cannot access parent module of root"); - } - parentBase.pop(); - } else if (part === ".") { - continue; - } else { - parentBase.push(part); - } - } - - return parentBase.join("/"); - } - - requirejs.entries = requirejs._eak_seen = registry; - requirejs.clear = function () { - requirejs.entries = requirejs._eak_seen = registry = {}; - seen = {}; - }; -})(); diff --git a/app/assets/javascripts/discourse-shims.js b/app/assets/javascripts/discourse-shims.js deleted file mode 100644 index 7794b099b8..0000000000 --- a/app/assets/javascripts/discourse-shims.js +++ /dev/null @@ -1,67 +0,0 @@ -define("message-bus-client", ["exports"], function (__exports__) { - __exports__.default = window.MessageBus; -}); - -define("ember-buffered-proxy/proxy", ["exports"], function (__exports__) { - __exports__.default = window.BufferedProxy; -}); - -define("bootbox", ["exports"], function (__exports__) { - __exports__.default = window.bootbox; -}); - -define("xss", ["exports"], function (__exports__) { - __exports__.default = window.filterXSS; -}); - -define("@discourse/itsatrap", ["exports"], function (__exports__) { - __exports__.default = window.ItsATrap; -}); - -define("@popperjs/core", ["exports"], function (__exports__) { - __exports__.default = window.Popper; - __exports__.createPopper = window.Popper.createPopper; - __exports__.defaultModifiers = window.Popper.defaultModifiers; - __exports__.popperGenerator = window.Popper.popperGenerator; -}); - -define("tippy.js", ["exports"], function (__exports__) { - __exports__.default = window.tippy; -}); - -define("@uppy/core", ["exports"], function (__exports__) { - __exports__.default = window.Uppy.Core; - __exports__.BasePlugin = window.Uppy.Core.BasePlugin; -}); - -define("@uppy/aws-s3", ["exports"], function (__exports__) { - __exports__.default = window.Uppy.AwsS3; -}); - -define("@uppy/aws-s3-multipart", ["exports"], function (__exports__) { - __exports__.default = window.Uppy.AwsS3Multipart; -}); - -define("@uppy/xhr-upload", ["exports"], function (__exports__) { - __exports__.default = window.Uppy.XHRUpload; -}); - -define("@uppy/drop-target", ["exports"], function (__exports__) { - __exports__.default = window.Uppy.DropTarget; -}); - -define("@uppy/utils/lib/delay", ["exports"], function (__exports__) { - __exports__.default = window.Uppy.Utils.delay; -}); - -define("@uppy/utils/lib/EventTracker", ["exports"], function (__exports__) { - __exports__.default = window.Uppy.Utils.EventTracker; -}); - -define("@uppy/utils/lib/AbortController", ["exports"], function (__exports__) { - __exports__.AbortController = - window.Uppy.Utils.AbortControllerLib.AbortController; - __exports__.AbortSignal = window.Uppy.Utils.AbortControllerLib.AbortSignal; - __exports__.createAbortError = - window.Uppy.Utils.AbortControllerLib.createAbortError; -}); diff --git a/app/assets/javascripts/discourse-widget-hbs/ember-cli-build.js b/app/assets/javascripts/discourse-widget-hbs/ember-cli-build.js new file mode 100644 index 0000000000..2171aed7fd --- /dev/null +++ b/app/assets/javascripts/discourse-widget-hbs/ember-cli-build.js @@ -0,0 +1,13 @@ +"use strict"; + +const EmberAddon = require("ember-cli/lib/broccoli/ember-addon"); + +module.exports = function (defaults) { + let app = new EmberAddon(defaults, { + autoImport: { + publicAssetURL: "", + }, + }); + + return app.toTree(); +}; diff --git a/app/assets/javascripts/discourse-widget-hbs/package.json b/app/assets/javascripts/discourse-widget-hbs/package.json index eb1fbdf001..d41b35867f 100644 --- a/app/assets/javascripts/discourse-widget-hbs/package.json +++ b/app/assets/javascripts/discourse-widget-hbs/package.json @@ -15,43 +15,34 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^2.2.4", - "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0", - "webpack": "^5.67.0" + "ember-auto-import": "^2.4.2", + "ember-cli-babel": "^7.23.1", + "ember-cli-htmlbars": "^6.0.1", + "handlebars": "^4.7.6", + "webpack": "^5.73.0" }, "devDependencies": { - "@ember/optional-features": "^1.1.0", - "@glimmer/component": "^1.0.0", - "babel-eslint": "^10.0.3", + "@ember/optional-features": "^2.0.0", + "@glimmer/component": "^1.1.2", "broccoli-asset-rev": "^3.0.0", - "broccoli-stew": "^3.0.0", "ember-cli": "~3.25.3", - "ember-cli-dependency-checker": "^3.2.0", - "ember-cli-eslint": "^5.1.0", - "ember-cli-inject-live-reload": "^2.0.1", + "ember-cli-dependency-checker": "^3.3.1", + "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sri": "^2.1.1", - "ember-cli-template-lint": "^1.0.0-beta.3", - "ember-cli-uglify": "^3.0.0", + "ember-cli-terser": "^4.0.2", "ember-disable-prototype-extensions": "^1.1.3", - "ember-export-application-global": "^2.0.1", "ember-load-initializers": "^2.1.1", - "ember-maybe-import-regenerator": "^0.1.6", "ember-resolver": "^7.0.0", "ember-source": "~3.15.0", - "ember-source-channel-url": "^2.0.1", - "ember-try": "^2.0.0", - "eslint-plugin-ember": "^7.7.1", - "eslint-plugin-node": "^10.0.0", - "handlebars": "^4.7.6", + "ember-source-channel-url": "^3.0.0", "loader.js": "^4.7.0" }, "engines": { - "node": "12.* || 14.* || >= 16", + "node": "16.* || >= 18", "npm": "please-use-yarn", "yarn": ">= 1.21.1" }, "ember": { - "edition": "octane" + "edition": "default" } } diff --git a/app/assets/javascripts/discourse-widget-hbs/tests/dummy/app/index.html b/app/assets/javascripts/discourse-widget-hbs/tests/dummy/app/index.html new file mode 100644 index 0000000000..870306a6ba --- /dev/null +++ b/app/assets/javascripts/discourse-widget-hbs/tests/dummy/app/index.html @@ -0,0 +1,24 @@ + + + + + Dummy + + + + {{content-for "head"}} + + + + + {{content-for "head-footer"}} + + + {{content-for "body"}} + + + + + {{content-for "body-footer"}} + + \ No newline at end of file diff --git a/app/assets/javascripts/discourse-widget-hbs/tests/dummy/app/styles/.gitkeep b/app/assets/javascripts/discourse-widget-hbs/tests/dummy/app/styles/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/discourse-widget-hbs/tests/dummy/app/templates/.gitkeep b/app/assets/javascripts/discourse-widget-hbs/tests/dummy/app/templates/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/discourse-widget-hbs/tests/dummy/config/.gitkeep b/app/assets/javascripts/discourse-widget-hbs/tests/dummy/config/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/discourse-widget-hbs/tests/dummy/public/.gitkeep b/app/assets/javascripts/discourse-widget-hbs/tests/dummy/public/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/discourse-widget-hbs/tests/index.html b/app/assets/javascripts/discourse-widget-hbs/tests/index.html new file mode 100644 index 0000000000..5c291da716 --- /dev/null +++ b/app/assets/javascripts/discourse-widget-hbs/tests/index.html @@ -0,0 +1,39 @@ + + + + + Dummy Tests + + + + {{content-for "head"}} + {{content-for "test-head"}} + + + + + + {{content-for "head-footer"}} + {{content-for "test-head-footer"}} + + + {{content-for "body"}} + {{content-for "test-body"}} + +
+
+
+
+
+
+ + + + + + + + {{content-for "body-footer"}} + {{content-for "test-body-footer"}} + + \ No newline at end of file diff --git a/app/assets/javascripts/discourse/app/app.js b/app/assets/javascripts/discourse/app/app.js index 19da3d2836..be305596c4 100644 --- a/app/assets/javascripts/discourse/app/app.js +++ b/app/assets/javascripts/discourse/app/app.js @@ -81,6 +81,15 @@ const Discourse = Application.extend({ initialize: () => withPluginApi(cb.version, cb.code), }); }); + + window.addEventListener( + "load", + () => { + // The app booted. Remove the splash screen + document.querySelector("#d-splash")?.remove(); + }, + { once: true } + ); }, _registerPluginCode(version, code) { diff --git a/app/assets/javascripts/discourse/app/components/create-account.js b/app/assets/javascripts/discourse/app/components/create-account.js index a56b945bc0..695cbc1c33 100644 --- a/app/assets/javascripts/discourse/app/components/create-account.js +++ b/app/assets/javascripts/discourse/app/components/create-account.js @@ -1,5 +1,6 @@ import Component from "@ember/component"; import cookie from "discourse/lib/cookie"; +import { bind } from "discourse-common/utils/decorators"; export default Component.extend({ classNames: ["create-account-body"], @@ -21,6 +22,7 @@ export default Component.extend({ } }, + @bind actionOnEnter(event) { if (!this.disabled && event.key === "Enter") { event.preventDefault(); @@ -30,6 +32,7 @@ export default Component.extend({ } }, + @bind selectKitFocus(event) { const target = document.getElementById(event.target.getAttribute("for")); if (target?.classList.contains("select-kit")) { diff --git a/app/assets/javascripts/discourse/app/components/d-editor.js b/app/assets/javascripts/discourse/app/components/d-editor.js index 37d570b268..e669a5685c 100644 --- a/app/assets/javascripts/discourse/app/components/d-editor.js +++ b/app/assets/javascripts/discourse/app/components/d-editor.js @@ -672,6 +672,13 @@ export default Component.extend(TextareaTextManipulation, { return true; }, + @action + onEmojiPickerClose() { + if (!(this.isDestroyed || this.isDestroying)) { + this.set("emojiPickerIsActive", false); + } + }, + actions: { emoji() { if (this.disabled) { diff --git a/app/assets/javascripts/discourse/app/components/d-popover.js b/app/assets/javascripts/discourse/app/components/d-popover.js index 1a3b0ea9b0..930f16348f 100644 --- a/app/assets/javascripts/discourse/app/components/d-popover.js +++ b/app/assets/javascripts/discourse/app/components/d-popover.js @@ -80,12 +80,18 @@ export default class DiscoursePopover extends Component { }, }; + const target = document + .getElementById(this.componentId) + .querySelector( + ':scope > .d-popover-trigger, :scope > .btn, :scope > [role="button"]' + ); + + if (!target) { + return null; + } + const instance = tippy( - document - .getElementById(this.componentId) - .querySelector( - ':scope > .d-popover-trigger, :scope > .btn, :scope > [role="button"]' - ), + target, Object.assign({}, baseOptions, this.options || {}) ); diff --git a/app/assets/javascripts/discourse/app/components/global-notice.js b/app/assets/javascripts/discourse/app/components/global-notice.js index 7432143273..b2097becb6 100644 --- a/app/assets/javascripts/discourse/app/components/global-notice.js +++ b/app/assets/javascripts/discourse/app/components/global-notice.js @@ -50,6 +50,8 @@ const Notice = EmberObject.extend({ }); export default Component.extend({ + tagName: "", + router: service(), logsNoticeService: service("logsNotice"), logNotice: null, @@ -70,6 +72,10 @@ export default Component.extend({ ); }, + get visible() { + return !this.router.currentRouteName.startsWith("wizard."); + }, + @discourseComputed( "site.isReadOnly", "site.wizard_required", diff --git a/app/assets/javascripts/discourse/app/components/sidebar/categories-section.js b/app/assets/javascripts/discourse/app/components/sidebar/categories-section.js index f1f4240650..fa96b5eb35 100644 --- a/app/assets/javascripts/discourse/app/components/sidebar/categories-section.js +++ b/app/assets/javascripts/discourse/app/components/sidebar/categories-section.js @@ -1,9 +1,15 @@ +import I18n from "I18n"; + import { cached } from "@glimmer/tracking"; +import { inject as service } from "@ember/service"; +import { action } from "@ember/object"; import GlimmerComponent from "discourse/components/glimmer"; import CategorySectionLink from "discourse/lib/sidebar/categories-section/category-section-link"; export default class SidebarCategoriesSection extends GlimmerComponent { + @service router; + constructor() { super(...arguments); @@ -20,11 +26,32 @@ export default class SidebarCategoriesSection extends GlimmerComponent { @cached get sectionLinks() { - return this.site.trackedCategoriesList.map((trackedCategory) => { - return new CategorySectionLink({ - category: trackedCategory, - topicTrackingState: this.topicTrackingState, - }); - }); + const links = []; + + for (const category of this.currentUser.sidebarCategories) { + links.push( + new CategorySectionLink({ + category, + topicTrackingState: this.topicTrackingState, + }) + ); + } + + return links; + } + + get noCategoriesText() { + const url = `/u/${this.currentUser.username}/preferences/sidebar`; + + return `${I18n.t( + "sidebar.sections.categories.none" + )} ${I18n.t( + "sidebar.sections.categories.click_to_get_started" + )}`; + } + + @action + editTracked() { + this.router.transitionTo("preferences.sidebar", this.currentUser); } } diff --git a/app/assets/javascripts/discourse/app/components/sidebar/messages-section.js b/app/assets/javascripts/discourse/app/components/sidebar/messages-section.js new file mode 100644 index 0000000000..7c2ff92c3a --- /dev/null +++ b/app/assets/javascripts/discourse/app/components/sidebar/messages-section.js @@ -0,0 +1,142 @@ +import { cached } from "@glimmer/tracking"; + +import { getOwner } from "discourse-common/lib/get-owner"; +import GlimmerComponent from "discourse/components/glimmer"; +import { bind } from "discourse-common/utils/decorators"; +import GroupMessageSectionLink from "discourse/lib/sidebar/messages-section/group-message-section-link"; +import PersonalMessageSectionLink from "discourse/lib/sidebar/messages-section/personal-message-section-link"; + +export const INBOX = "inbox"; +export const UNREAD = "unread"; +const SENT = "sent"; +export const NEW = "new"; +const ARCHIVE = "archive"; + +export const PERSONAL_MESSAGES_INBOX_FILTERS = [ + INBOX, + NEW, + UNREAD, + SENT, + ARCHIVE, +]; + +export const GROUP_MESSAGES_INBOX_FILTERS = [INBOX, NEW, UNREAD, ARCHIVE]; + +export default class SidebarMessagesSection extends GlimmerComponent { + constructor() { + super(...arguments); + + this.appEvents.on( + "page:changed", + this, + this._refreshSectionLinksDisplayState + ); + + this.pmTopicTrackingState + .startTracking() + .then(this._refreshSectionLinkCounts); + + this._pmTopicTrackingStateKey = "messages-section"; + + this.pmTopicTrackingState.onStateChange( + this._pmTopicTrackingStateKey, + this._refreshSectionLinkCounts + ); + } + + @bind + _refreshSectionLinkCounts() { + for (const sectionLink of this.allSectionLinks) { + sectionLink.refreshCount(); + } + } + + willDestroy() { + this.appEvents.off( + "page:changed", + this, + this._refreshSectionLinksDisplayState + ); + + this.pmTopicTrackingState.offStateChange( + this._pmTopicTrackingStateKey, + this._refreshSectionLinkCounts + ); + } + + _refreshSectionLinksDisplayState({ + currentRouteName, + currentRouteParentName, + currentRouteParams, + }) { + if ( + currentRouteParentName !== "userPrivateMessages" && + currentRouteParentName !== "topic" + ) { + for (const sectionLink of this.allSectionLinks) { + sectionLink.collapse(); + } + } else { + const attrs = { + currentRouteName, + currentRouteParams, + }; + + if (currentRouteParentName === "topic") { + const topicController = getOwner(this).lookup("controller:topic"); + + if (topicController.model.isPrivateMessage) { + attrs.privateMessageTopic = topicController.model; + } + } + + for (const sectionLink of this.allSectionLinks) { + sectionLink.pageChanged(attrs); + } + } + } + + @cached + get personalMessagesSectionLinks() { + const links = []; + + PERSONAL_MESSAGES_INBOX_FILTERS.forEach((type) => { + links.push( + new PersonalMessageSectionLink({ + currentUser: this.currentUser, + type, + pmTopicTrackingState: this.pmTopicTrackingState, + }) + ); + }); + + return links; + } + + @cached + get groupMessagesSectionLinks() { + const links = []; + + this.currentUser.groupsWithMessages.forEach((group) => { + GROUP_MESSAGES_INBOX_FILTERS.forEach((groupMessageLink) => { + links.push( + new GroupMessageSectionLink({ + group, + type: groupMessageLink, + currentUser: this.currentUser, + pmTopicTrackingState: this.pmTopicTrackingState, + }) + ); + }); + }); + + return links; + } + + get allSectionLinks() { + return [ + ...this.groupMessagesSectionLinks, + ...this.personalMessagesSectionLinks, + ]; + } +} diff --git a/app/assets/javascripts/discourse/app/components/sidebar/section.js b/app/assets/javascripts/discourse/app/components/sidebar/section.js index 59e16c49d0..47cc438546 100644 --- a/app/assets/javascripts/discourse/app/components/sidebar/section.js +++ b/app/assets/javascripts/discourse/app/components/sidebar/section.js @@ -4,11 +4,27 @@ import { action } from "@ember/object"; import { tracked } from "@glimmer/tracking"; export default class SidebarSection extends GlimmerComponent { - @tracked displaySection = true; + @tracked displaySection; + collapsedSidebarSectionKey = `sidebar-section-${this.args.sectionName}-collapsed`; + + constructor() { + super(...arguments); + + this.displaySection = + this.keyValueStore.getItem(this.collapsedSidebarSectionKey) === undefined + ? true + : false; + } @action toggleSectionDisplay() { this.displaySection = !this.displaySection; + + if (this.displaySection) { + this.keyValueStore.remove(this.collapsedSidebarSectionKey); + } else { + this.keyValueStore.setItem(this.collapsedSidebarSectionKey, true); + } } get headerCaretIcon() { diff --git a/app/assets/javascripts/discourse/app/components/sidebar/tags-section.js b/app/assets/javascripts/discourse/app/components/sidebar/tags-section.js index d5f9ba748f..47a845ceb2 100644 --- a/app/assets/javascripts/discourse/app/components/sidebar/tags-section.js +++ b/app/assets/javascripts/discourse/app/components/sidebar/tags-section.js @@ -1,9 +1,15 @@ +import I18n from "I18n"; + import { cached } from "@glimmer/tracking"; +import { inject as service } from "@ember/service"; +import { action } from "@ember/object"; import GlimmerComponent from "discourse/components/glimmer"; import TagSectionLink from "discourse/lib/sidebar/tags-section/tag-section-link"; export default class SidebarTagsSection extends GlimmerComponent { + @service router; + constructor() { super(...arguments); @@ -20,11 +26,30 @@ export default class SidebarTagsSection extends GlimmerComponent { @cached get sectionLinks() { - return this.currentUser.trackedTags.map((trackedTag) => { - return new TagSectionLink({ - tag: trackedTag, - topicTrackingState: this.topicTrackingState, - }); - }); + const links = []; + + for (const tagName of this.currentUser.sidebarTagNames) { + links.push( + new TagSectionLink({ + tagName, + topicTrackingState: this.topicTrackingState, + }) + ); + } + + return links; + } + + get noTagsText() { + const url = `/u/${this.currentUser.username}/preferences/sidebar`; + + return `${I18n.t("sidebar.sections.tags.none")} ${I18n.t( + "sidebar.sections.tags.click_to_get_started" + )}`; + } + + @action + editTracked() { + this.router.transitionTo("preferences.sidebar", this.currentUser); } } diff --git a/app/assets/javascripts/discourse/app/components/user-card-contents.js b/app/assets/javascripts/discourse/app/components/user-card-contents.js index d755eaf5d1..51d653ddcd 100644 --- a/app/assets/javascripts/discourse/app/components/user-card-contents.js +++ b/app/assets/javascripts/discourse/app/components/user-card-contents.js @@ -14,6 +14,7 @@ import { isEmpty } from "@ember/utils"; import { prioritizeNameInUx } from "discourse/lib/settings"; import { dasherize } from "@ember/string"; import { emojiUnescape } from "discourse/lib/text"; +import { escapeExpression } from "discourse/lib/utilities"; export default Component.extend(CardContentsBase, CanCheckEmails, CleansUp, { elementId: "user-card", @@ -55,10 +56,9 @@ export default Component.extend(CardContentsBase, CanCheckEmails, CleansUp, { return this.siteSettings.enable_user_status && this.user.status; }, - @discourseComputed("user.status") - userStatusEmoji() { - const emoji = this.user.status.emoji ?? "mega"; - return emojiUnescape(`:${emoji}:`); + @discourseComputed("user.status.emoji") + userStatusEmoji(emoji) { + return emojiUnescape(escapeExpression(`:${emoji}:`)); }, isSuspendedOrHasBio: or("user.suspend_reason", "user.bio_excerpt"), diff --git a/app/assets/javascripts/discourse/app/components/user-status-picker.js b/app/assets/javascripts/discourse/app/components/user-status-picker.js new file mode 100644 index 0000000000..691a4e683c --- /dev/null +++ b/app/assets/javascripts/discourse/app/components/user-status-picker.js @@ -0,0 +1,57 @@ +import Component from "@ember/component"; +import { action, computed } from "@ember/object"; +import { scheduleOnce } from "@ember/runloop"; +import { emojiUnescape } from "discourse/lib/text"; +import { escapeExpression } from "discourse/lib/utilities"; + +export default class UserStatusPicker extends Component { + tagName = ""; + isFocused = false; + emojiPickerIsActive = false; + emoji = null; + description = null; + + @computed("emoji") + get emojiHtml() { + const emoji = escapeExpression(`:${this.emoji}:`); + return emojiUnescape(emoji); + } + + @action + blur() { + this.set("isFocused", false); + } + + @action + emojiSelected(emoji) { + this.set("emoji", emoji); + this.set("emojiPickerIsActive", false); + + scheduleOnce("afterRender", () => { + document.querySelector(".btn-emoji")?.focus(); + }); + } + + @action + focus() { + this.set("isFocused", true); + } + + @action + onEmojiPickerOutsideClick() { + this.set("emojiPickerIsActive", false); + } + + @action + setDefaultEmoji() { + if (!this.emoji) { + this.set("emoji", "speech_balloon"); + } + } + + @action + toggleEmojiPicker(event) { + event.stopPropagation(); + this.set("emojiPickerIsActive", !this.emojiPickerIsActive); + } +} diff --git a/app/assets/javascripts/discourse/app/controllers/application.js b/app/assets/javascripts/discourse/app/controllers/application.js index c07ca32adc..5dcdab3097 100644 --- a/app/assets/javascripts/discourse/app/controllers/application.js +++ b/app/assets/javascripts/discourse/app/controllers/application.js @@ -8,11 +8,6 @@ export default Controller.extend({ router: service(), showSidebar: true, - @discourseComputed("showSidebar", "currentUser.experimental_sidebar_enabled") - mainOutletWrapperClasses(showSidebar, experimentalSidebarEnabled) { - return showSidebar && experimentalSidebarEnabled ? "has-sidebar" : ""; - }, - @discourseComputed canSignUp() { return ( diff --git a/app/assets/javascripts/discourse/app/controllers/composer.js b/app/assets/javascripts/discourse/app/controllers/composer.js index 37706589b9..e0fbdbf396 100644 --- a/app/assets/javascripts/discourse/app/controllers/composer.js +++ b/app/assets/javascripts/discourse/app/controllers/composer.js @@ -136,7 +136,7 @@ export default Controller.extend({ }, set disableSubmit(value) { - this.set("_disableSubmit", value); + return this.set("_disableSubmit", value); }, @discourseComputed("showPreview") @@ -233,6 +233,7 @@ export default Controller.extend({ }, isStaffUser: reads("currentUser.staff"), + whisperer: reads("currentUser.whisperer"), canUnlistTopic: and("model.creatingTopic", "isStaffUser"), @@ -289,12 +290,12 @@ export default Controller.extend({ return SAVE_LABELS[modelAction]; }, - @discourseComputed("isStaffUser", "model.action") - canWhisper(isStaffUser, modelAction) { + @discourseComputed("whisperer", "model.action") + canWhisper(whisperer, modelAction) { return ( this.siteSettings.enable_whispers && - isStaffUser && - Composer.REPLY === modelAction + Composer.REPLY === modelAction && + whisperer ); }, diff --git a/app/assets/javascripts/discourse/app/controllers/preferences/sidebar.js b/app/assets/javascripts/discourse/app/controllers/preferences/sidebar.js new file mode 100644 index 0000000000..10358abf31 --- /dev/null +++ b/app/assets/javascripts/discourse/app/controllers/preferences/sidebar.js @@ -0,0 +1,41 @@ +import Controller from "@ember/controller"; +import { action } from "@ember/object"; +import { tracked } from "@glimmer/tracking"; + +import { popupAjaxError } from "discourse/lib/ajax-error"; + +export default class extends Controller { + @tracked saved = false; + @tracked selectedSiderbarCategories = []; + @tracked selectedSidebarTagNames = []; + + @action + tagUpdated(tagNames) { + this.selectedSidebarTagNames = tagNames; + this.model.set("sidebar_tag_names", tagNames); + this.saved = false; + } + + @action + categoryUpdated(categories) { + this.selectedSiderbarCategories = categories; + this.model.set("sidebarCategoryIds", categories.mapBy("id")); + this.saved = false; + } + + @action + save() { + this.model + .save() + .then(() => { + this.saved = true; + this.initialSidebarCategoryIds = this.model.sidebarCategoryIds; + this.initialSidebarTagNames = this.model.initialSidebarTagNames; + }) + .catch((error) => { + this.model.set("sidebarCategoryIds", this.initialSidebarCategoryIds); + this.model.set("sidebar_tag_names", this.initialSidebarTagNames); + popupAjaxError(error); + }); + } +} diff --git a/app/assets/javascripts/discourse/app/controllers/tag-show.js b/app/assets/javascripts/discourse/app/controllers/tag-show.js index c3339debfc..e0faae1e25 100644 --- a/app/assets/javascripts/discourse/app/controllers/tag-show.js +++ b/app/assets/javascripts/discourse/app/controllers/tag-show.js @@ -181,14 +181,15 @@ export default DiscoverySortableController.extend( this.tagNotification .update({ notification_level: notificationLevel }) .then((response) => { - this.currentUser.set( - "muted_tag_ids", - this.currentUser.calculateMutedIds( - notificationLevel, - response.responseJson.tag_id, - "muted_tag_ids" - ) - ); + const payload = response.responseJson; + + this.currentUser.setProperties({ + watched_tags: payload.watched_tags, + watching_first_post_tags: payload.watching_first_post_tags, + tracked_tags: payload.tracked_tags, + muted_tags: payload.muted_tags, + regular_tags: payload.regular_tags, + }); }); }, } diff --git a/app/assets/javascripts/discourse/app/controllers/topic.js b/app/assets/javascripts/discourse/app/controllers/topic.js index 3832df9372..7d4321d6c6 100644 --- a/app/assets/javascripts/discourse/app/controllers/topic.js +++ b/app/assets/javascripts/discourse/app/controllers/topic.js @@ -890,7 +890,8 @@ export default Controller.extend(bufferedProperty("model"), { selectReplies(post) { ajax(`/posts/${post.id}/reply-ids.json`).then((replies) => { const replyIds = replies.map((r) => r.id); - this.selectedPostIds.pushObjects([post.id, ...replyIds]); + const postIds = [...this.selectedPostIds, post.id, ...replyIds]; + this.set("selectedPostIds", [...new Set(postIds)]); this._forceRefreshPostStream(); }); }, @@ -1699,6 +1700,30 @@ export default Controller.extend(bufferedProperty("model"), { topic.set("message_archived", true); break; } + case "stats": { + let updateStream = false; + ["last_posted_at", "like_count", "posts_count"].forEach( + (property) => { + const value = data[property]; + if (typeof value !== "undefined") { + topic.set(property, value); + updateStream = true; + } + } + ); + + if (data["last_poster"]) { + topic.details.set("last_poster", data["last_poster"]); + updateStream = true; + } + + if (updateStream) { + postStream + .triggerChangedTopicStats() + .then((firstPostId) => refresh({ id: firstPostId })); + } + break; + } default: { let callback = customPostMessageCallbacks[data.type]; if (callback) { diff --git a/app/assets/javascripts/discourse/app/controllers/user-status.js b/app/assets/javascripts/discourse/app/controllers/user-status.js index b43309e9d1..20f025d379 100644 --- a/app/assets/javascripts/discourse/app/controllers/user-status.js +++ b/app/assets/javascripts/discourse/app/controllers/user-status.js @@ -1,49 +1,49 @@ import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { action } from "@ember/object"; -import { notEmpty } from "@ember/object/computed"; import { inject as service } from "@ember/service"; import { popupAjaxError } from "discourse/lib/ajax-error"; import bootbox from "bootbox"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend(ModalFunctionality, { userStatusService: service("user-status"), + emoji: null, description: null, - statusIsSet: notEmpty("description"), showDeleteButton: false, onShow() { - if (this.currentUser.status) { - this.setProperties({ - description: this.currentUser.status.description, - showDeleteButton: true, - }); - } + const status = this.currentUser.status; + this.setProperties({ + emoji: status?.emoji, + description: status?.description, + showDeleteButton: !!status, + }); + }, + + @discourseComputed("emoji", "description") + statusIsSet(emoji, description) { + return !!emoji && !!description; }, @action delete() { this.userStatusService .clear() - .then(() => { - this._resetModal(); - this.send("closeModal"); - }) + .then(() => this.send("closeModal")) .catch((e) => this._handleError(e)); }, @action saveAndClose() { - if (this.description) { - const status = { description: this.description }; - this.userStatusService - .set(status) - .then(() => { - this.send("closeModal"); - }) - .catch((e) => this._handleError(e)); - } + const status = { description: this.description, emoji: this.emoji }; + this.userStatusService + .set(status) + .then(() => { + this.send("closeModal"); + }) + .catch((e) => this._handleError(e)); }, _handleError(e) { @@ -53,9 +53,4 @@ export default Controller.extend(ModalFunctionality, { popupAjaxError(e); } }, - - _resetModal() { - this.set("description", null); - this.set("showDeleteButton", false); - }, }); diff --git a/app/assets/javascripts/discourse/app/helpers/category-badge.js b/app/assets/javascripts/discourse/app/helpers/category-badge.js index 887e5fcf97..b9e51674c9 100644 --- a/app/assets/javascripts/discourse/app/helpers/category-badge.js +++ b/app/assets/javascripts/discourse/app/helpers/category-badge.js @@ -1,11 +1,12 @@ import { categoryLinkHTML } from "discourse/helpers/category-link"; import { registerUnbound } from "discourse-common/lib/helpers"; +import { isPresent } from "@ember/utils"; registerUnbound("category-badge", function (cat, options) { return categoryLinkHTML(cat, { hideParent: options.hideParent, allowUncategorized: options.allowUncategorized, categoryStyle: options.categoryStyle, - link: false, + link: isPresent(options.link) ? options.link : false, }); }); diff --git a/app/assets/javascripts/discourse/app/helpers/route-action.js b/app/assets/javascripts/discourse/app/helpers/route-action.js index c55052a6dd..d9dcad74e3 100644 --- a/app/assets/javascripts/discourse/app/helpers/route-action.js +++ b/app/assets/javascripts/discourse/app/helpers/route-action.js @@ -2,7 +2,7 @@ import { A } from "@ember/array"; import Helper from "@ember/component/helper"; import { computed, get } from "@ember/object"; import { getOwner } from "@ember/application"; -import { run } from "@ember/runloop"; +import { join } from "@ember/runloop"; import { assert, runInDebug } from "@ember/debug"; function getCurrentRouteInfos(router) { @@ -40,7 +40,7 @@ export function routeAction(actionName, router, ...params) { return function (...invocationArgs) { let { action, handler } = getRouteWithAction(router, actionName); let args = params.concat(invocationArgs); - return run.join(handler, action, ...args); + return join(handler, action, ...args); }; } diff --git a/app/assets/javascripts/discourse/app/index.html b/app/assets/javascripts/discourse/app/index.html index ba049ba54c..ad51651ba8 100644 --- a/app/assets/javascripts/discourse/app/index.html +++ b/app/assets/javascripts/discourse/app/index.html @@ -11,13 +11,26 @@ {{content-for "before-script-load"}} - - + + + + {{content-for "head"}} + + + + {{content-for "discourse-stylesheets"}} + + + + + + + {{content-for "body"}} @@ -25,9 +38,8 @@ - - + {{content-for "body-footer"}} diff --git a/app/assets/javascripts/discourse/app/initializers/inject-objects.js b/app/assets/javascripts/discourse/app/initializers/inject-objects.js index 6f3c229da6..18fc431d3f 100644 --- a/app/assets/javascripts/discourse/app/initializers/inject-objects.js +++ b/app/assets/javascripts/discourse/app/initializers/inject-objects.js @@ -1,54 +1,50 @@ import { setDefaultOwner } from "discourse-common/lib/get-owner"; -import { isLegacyEmber } from "discourse-common/config/environment"; import User from "discourse/models/user"; import Site from "discourse/models/site"; import deprecated from "discourse-common/lib/deprecated"; export default { name: "inject-objects", - after: isLegacyEmber() ? null : "export-application-global", + after: "export-application-global", initialize(container, app) { // This is required for Ember CLI tests to work setDefaultOwner(app.__container__); - // Backwards compatibility for Discourse.SiteSettings and Discourse.User - if (!isLegacyEmber()) { - Object.defineProperty(app, "SiteSettings", { - get() { - deprecated( - `use injected siteSettings instead of Discourse.SiteSettings`, - { - since: "2.8", - dropFrom: "2.9", - } - ); - return container.lookup("site-settings:main"); - }, - }); - Object.defineProperty(app, "User", { - get() { - deprecated( - `import discourse/models/user instead of using Discourse.User`, - { - since: "2.8", - dropFrom: "2.9", - } - ); - return User; - }, - }); - Object.defineProperty(app, "Site", { - get() { - deprecated( - `import discourse/models/site instead of using Discourse.Site`, - { - since: "2.8", - dropFrom: "2.9", - } - ); - return Site; - }, - }); - } + Object.defineProperty(app, "SiteSettings", { + get() { + deprecated( + `use injected siteSettings instead of Discourse.SiteSettings`, + { + since: "2.8", + dropFrom: "2.9", + } + ); + return container.lookup("site-settings:main"); + }, + }); + Object.defineProperty(app, "User", { + get() { + deprecated( + `import discourse/models/user instead of using Discourse.User`, + { + since: "2.8", + dropFrom: "2.9", + } + ); + return User; + }, + }); + Object.defineProperty(app, "Site", { + get() { + deprecated( + `import discourse/models/site instead of using Discourse.Site`, + { + since: "2.8", + dropFrom: "2.9", + } + ); + return Site; + }, + }); }, }; diff --git a/app/assets/javascripts/discourse/app/initializers/subscribe-user-notifications.js b/app/assets/javascripts/discourse/app/initializers/subscribe-user-notifications.js index 373327f532..bf4235ba85 100644 --- a/app/assets/javascripts/discourse/app/initializers/subscribe-user-notifications.js +++ b/app/assets/javascripts/discourse/app/initializers/subscribe-user-notifications.js @@ -108,19 +108,17 @@ export default { user.notification_channel_position ); - bus.subscribe(`/user-updates/${user.id}`, (data) => { - switch (data.type) { - case "drafts": - user.updateDraftProperties(data.payload); - break; - case "do_not_disturb": - user.updateDoNotDisturbStatus(data.payload.ends_at); - break; - case "user_status": - user.set("status", data.payload); - appEvents.trigger("user-status:changed"); - break; - } + bus.subscribe(`/user-drafts/${user.id}`, (data) => { + user.updateDraftProperties(data); + }); + + bus.subscribe(`/do-not-disturb/${user.get("id")}`, (data) => { + user.updateDoNotDisturbStatus(data.ends_at); + }); + + bus.subscribe(`/user-status/${user.id}`, (data) => { + user.set("status", data); + appEvents.trigger("user-status:changed"); }); const site = container.lookup("site:main"); diff --git a/app/assets/javascripts/discourse/app/lib/d-popover.js b/app/assets/javascripts/discourse/app/lib/d-popover.js index 052ae5c201..f5d5e131b5 100644 --- a/app/assets/javascripts/discourse/app/lib/d-popover.js +++ b/app/assets/javascripts/discourse/app/lib/d-popover.js @@ -1,5 +1,3 @@ -import { isLegacyEmber } from "discourse-common/config/environment"; -import { run } from "@ember/runloop"; import tippy from "tippy.js"; import { iconHTML } from "discourse-common/lib/icon-library"; @@ -39,14 +37,6 @@ export function showPopover(event, options = {}) { ? event.target._tippy : setup(event.target, options); - // hangs on legacy ember - if (!isLegacyEmber) { - run.begin(); - instance.popper.addEventListener("transitionend", run.end, { - once: true, - }); - } - if (instance.state.isShown) { instance.hide(); } else { @@ -72,8 +62,7 @@ export default function setup(target, options) { options ); - // legacy support - delete tippyOptions.textContent; + // legacy support delete tippyOptions.textContent; delete tippyOptions.htmlContent; return tippy(target, tippyOptions); diff --git a/app/assets/javascripts/discourse/app/lib/load-script.js b/app/assets/javascripts/discourse/app/lib/load-script.js index 2eb5a52c09..5acbbceac4 100644 --- a/app/assets/javascripts/discourse/app/lib/load-script.js +++ b/app/assets/javascripts/discourse/app/lib/load-script.js @@ -119,7 +119,7 @@ export function cacheBuster(url) { if (PUBLIC_JS_VERSIONS) { let [folder, ...lib] = url.split("/").filter(Boolean); if (folder === "javascripts") { - lib = lib.join("/"); + lib = lib.join("/").toLowerCase(); const versionedPath = PUBLIC_JS_VERSIONS[lib]; if (versionedPath) { return `/javascripts/${versionedPath}`; diff --git a/app/assets/javascripts/discourse/app/lib/notification-levels.js b/app/assets/javascripts/discourse/app/lib/notification-levels.js index 8bd3efaaa2..c3423f5ac2 100644 --- a/app/assets/javascripts/discourse/app/lib/notification-levels.js +++ b/app/assets/javascripts/discourse/app/lib/notification-levels.js @@ -1,5 +1,6 @@ const MUTED = 0; const REGULAR = 1; +const NORMAL = 1; // alias for REGULAR const TRACKING = 2; const WATCHING = 3; const WATCHING_FIRST_POST = 4; @@ -9,6 +10,7 @@ export const NotificationLevels = { WATCHING, TRACKING, REGULAR, + NORMAL, MUTED, }; diff --git a/app/assets/javascripts/discourse/app/lib/page-tracker.js b/app/assets/javascripts/discourse/app/lib/page-tracker.js index 3cb60f36ff..66316654cf 100644 --- a/app/assets/javascripts/discourse/app/lib/page-tracker.js +++ b/app/assets/javascripts/discourse/app/lib/page-tracker.js @@ -42,6 +42,8 @@ export function startPageTracking(router, appEvents, documentTitle) { url, title: documentTitle.getTitle(), currentRouteName: router.currentRouteName, + currentRouteParams: router.currentRoute.params, + currentRouteParentName: router.currentRoute.parent?.name, replacedOnlyQueryParams, }); }); diff --git a/app/assets/javascripts/discourse/app/lib/public-js-versions.js b/app/assets/javascripts/discourse/app/lib/public-js-versions.js index 393052736c..a8ced62efa 100644 --- a/app/assets/javascripts/discourse/app/lib/public-js-versions.js +++ b/app/assets/javascripts/discourse/app/lib/public-js-versions.js @@ -4,7 +4,7 @@ export const PUBLIC_JS_VERSIONS = { "ace/ace.js": "ace.js/1.4.13/ace.js", "jsoneditor.js": "@json-editor/json-editor/2.6.1/jsoneditor.js", - "Chart.min.js": "chart.js/3.5.1/Chart.min.js", + "chart.min.js": "chart.js/3.5.1/chart.min.js", "chartjs-plugin-datalabels.min.js": "chartjs-plugin-datalabels/2.0.0/chartjs-plugin-datalabels.min.js", "diffhtml.min.js": "diffhtml/1.0.0-beta.20/diffhtml.min.js", diff --git a/app/assets/javascripts/discourse/app/lib/sidebar/messages-section/group-message-section-link.js b/app/assets/javascripts/discourse/app/lib/sidebar/messages-section/group-message-section-link.js new file mode 100644 index 0000000000..ce6ec8bc7d --- /dev/null +++ b/app/assets/javascripts/discourse/app/lib/sidebar/messages-section/group-message-section-link.js @@ -0,0 +1,70 @@ +import I18n from "I18n"; + +import { capitalize } from "@ember/string"; +import MessageSectionLink from "discourse/lib/sidebar/messages-section/message-section-link"; + +export default class GroupMessageSectionLink extends MessageSectionLink { + routeNames = new Set([ + "userPrivateMessages.group", + "userPrivateMessages.groupUnread", + "userPrivateMessages.groupNew", + "userPrivateMessages.groupArchive", + ]); + + get name() { + return `group-messages-${this.type}`; + } + + get class() { + return this.group.name; + } + + get route() { + if (this._isInbox) { + return "userPrivateMessages.group"; + } else { + return `userPrivateMessages.group${capitalize(this.type)}`; + } + } + + get currentWhen() { + if (this._isInbox) { + return [...this.routeNames].join(" "); + } + } + + get models() { + return [this.currentUser, this.group.name]; + } + + get text() { + if (this._isInbox) { + return this.group.name; + } else if (this.count > 0) { + return I18n.t(`sidebar.sections.messages.links.${this.type}_with_count`, { + count: this.count, + }); + } else { + return I18n.t(`sidebar.sections.messages.links.${this.type}`); + } + } + + pageChanged({ currentRouteName, currentRouteParams, privateMessageTopic }) { + if (this._isInbox) { + return; + } + + if ( + privateMessageTopic?.allowedGroups?.some( + (g) => g.name === this.group.name + ) + ) { + this.setDisplayState = true; + return; + } + + this.setDisplayState = + this.routeNames.has(currentRouteName) && + currentRouteParams.name.toLowerCase() === this.group.name.toLowerCase(); + } +} diff --git a/app/assets/javascripts/discourse/app/lib/sidebar/messages-section/message-section-link.js b/app/assets/javascripts/discourse/app/lib/sidebar/messages-section/message-section-link.js new file mode 100644 index 0000000000..bef0aef095 --- /dev/null +++ b/app/assets/javascripts/discourse/app/lib/sidebar/messages-section/message-section-link.js @@ -0,0 +1,74 @@ +import { tracked } from "@glimmer/tracking"; + +import { + INBOX, + NEW, + UNREAD, +} from "discourse/components/sidebar/messages-section"; + +export default class MessageSectionLink { + @tracked shouldDisplay = this._isInbox; + @tracked count = 0; + + constructor({ group, currentUser, type, pmTopicTrackingState }) { + this.group = group; + this.currentUser = currentUser; + this.type = type; + this.pmTopicTrackingState = pmTopicTrackingState; + } + + refreshCount() { + this._refreshCount(); + } + + _refreshCount() { + if (this.shouldDisplay && this._shouldTrack) { + this.count = this.pmTopicTrackingState.lookupCount(this.type, { + inboxFilter: this.group ? "group" : "user", + groupName: this.group?.name, + }); + } + } + + set setDisplayState(value) { + const changed = this.shouldDisplay !== value; + this.shouldDisplay = value; + + if (changed) { + this._refreshCount(); + } + } + + get inboxFilter() { + throw "not implemented"; + } + + expand() { + if (this._isInbox) { + return; + } + + this.setDisplayState = true; + } + + collapse() { + if (this._isInbox) { + return; + } + + this.setDisplayState = false; + } + + // eslint-disable-next-line no-unused-vars + pageChanged({ currentRouteName, currentRouteParams, privateMessageTopic }) { + throw "not implemented"; + } + + get _isInbox() { + return this.type === INBOX; + } + + get _shouldTrack() { + return this.type === NEW || this.type === UNREAD; + } +} diff --git a/app/assets/javascripts/discourse/app/lib/sidebar/messages-section/personal-message-section-link.js b/app/assets/javascripts/discourse/app/lib/sidebar/messages-section/personal-message-section-link.js new file mode 100644 index 0000000000..bbf813f352 --- /dev/null +++ b/app/assets/javascripts/discourse/app/lib/sidebar/messages-section/personal-message-section-link.js @@ -0,0 +1,62 @@ +import I18n from "I18n"; + +import MessageSectionLink from "discourse/lib/sidebar/messages-section/message-section-link"; + +export default class PersonalMessageSectionLink extends MessageSectionLink { + routeNames = new Set([ + "userPrivateMessages.index", + "userPrivateMessages.unread", + "userPrivateMessages.sent", + "userPrivateMessages.new", + "userPrivateMessages.archive", + ]); + + get name() { + return `personal-messages-${this.type}`; + } + + get class() { + return `personal-messages`; + } + + get route() { + if (this._isInbox) { + return "userPrivateMessages.index"; + } else { + return `userPrivateMessages.${this.type}`; + } + } + + get currentWhen() { + if (this._isInbox) { + return [...this.routeNames].join(" "); + } + } + + get model() { + return this.currentUser; + } + + get text() { + if (this.count > 0) { + return I18n.t(`sidebar.sections.messages.links.${this.type}_with_count`, { + count: this.count, + }); + } else { + return I18n.t(`sidebar.sections.messages.links.${this.type}`); + } + } + + pageChanged({ currentRouteName, privateMessageTopic }) { + if (this._isInbox) { + return; + } + + if (privateMessageTopic?.allowedGroups?.length === 0) { + this.setDisplayState = true; + return; + } + + this.setDisplayState = this.routeNames.has(currentRouteName); + } +} diff --git a/app/assets/javascripts/discourse/app/lib/sidebar/tags-section/tag-section-link.js b/app/assets/javascripts/discourse/app/lib/sidebar/tags-section/tag-section-link.js index cf161a1aff..fda4b8fa29 100644 --- a/app/assets/javascripts/discourse/app/lib/sidebar/tags-section/tag-section-link.js +++ b/app/assets/javascripts/discourse/app/lib/sidebar/tags-section/tag-section-link.js @@ -8,8 +8,8 @@ export default class TagSectionLink { @tracked totalUnread = 0; @tracked totalNew = 0; - constructor({ tag, topicTrackingState }) { - this.tag = tag; + constructor({ tagName, topicTrackingState }) { + this.tagName = tagName; this.topicTrackingState = topicTrackingState; this.refreshCounts(); } @@ -17,22 +17,22 @@ export default class TagSectionLink { @bind refreshCounts() { this.totalUnread = this.topicTrackingState.countUnread({ - tagId: this.tag, + tagId: this.tagName, }); if (this.totalUnread === 0) { this.totalNew = this.topicTrackingState.countNew({ - tagId: this.tag, + tagId: this.tagName, }); } } get name() { - return this.tag; + return this.tagName; } get model() { - return this.tag; + return this.tagName; } get currentWhen() { @@ -44,7 +44,7 @@ export default class TagSectionLink { } get text() { - return this.tag; + return this.tagName; } get badgeText() { diff --git a/app/assets/javascripts/discourse/app/lib/svg-sprite-loader.js b/app/assets/javascripts/discourse/app/lib/svg-sprite-loader.js index d08ebd2304..42f033c413 100644 --- a/app/assets/javascripts/discourse/app/lib/svg-sprite-loader.js +++ b/app/assets/javascripts/discourse/app/lib/svg-sprite-loader.js @@ -7,7 +7,8 @@ export function loadSprites(spritePath, spriteName) { if (!spriteContainer) { spriteContainer = document.createElement("div"); spriteContainer.id = SVG_CONTAINER_ID; - document.body.appendChild(spriteContainer); + const spriteWrapper = document.querySelector("discourse-assets-icons"); + spriteWrapper?.appendChild(spriteContainer); } let sprites = spriteContainer.querySelector(`.${spriteName}`); diff --git a/app/assets/javascripts/discourse/app/lib/to-markdown.js b/app/assets/javascripts/discourse/app/lib/to-markdown.js index c8bbbf7eb5..e6309b9d3e 100644 --- a/app/assets/javascripts/discourse/app/lib/to-markdown.js +++ b/app/assets/javascripts/discourse/app/lib/to-markdown.js @@ -6,9 +6,11 @@ const MSO_LIST_CLASSES = [ let tagDecorateCallbacks = []; let blockDecorateCallbacks = []; +let textDecorateCallbacks = []; /** - * Allows to add support for custom inline markdown/bbcode + * Allows to add support for custom inline markdown/bbcode prefixes + * to convert nodes back to bbcode. * * ``` * addTagDecorateCallback(function (text) { @@ -29,7 +31,8 @@ export function clearTagDecorateCallbacks() { } /** - * Allows to add support for custom block markdown/bbcode + * Allows to add support for custom block markdown/bbcode prefixes + * to convert nodes back to bbcode. * * ``` * addBlockDecorateCallback(function (text) { @@ -48,6 +51,30 @@ export function clearBlockDecorateCallbacks() { blockDecorateCallbacks = []; } +/** + * Allows to add support for custom text node transformations + * based on the next/previous elements. + * + * ``` + * addTextDecorateCallback(function (text, nextElement, previousElement) { + * if ( + * startRangeOpts && + * nextElement?.attributes.class?.includes("discourse-local-date") && + * text === "→" + * ) { + * return ""; + * } + * }); + * ``` + */ +export function addTextDecorateCallback(callback) { + textDecorateCallbacks.push(callback); +} + +export function clearTextDecorateCallbacks() { + textDecorateCallbacks = []; +} + export class Tag { static named(name) { const klass = class NamedTag extends Tag {}; @@ -657,9 +684,10 @@ function tagByName(name) { } class Element { - constructor(element, parent, previous, next) { + constructor(element, parent, previous, next, metadata) { this.name = element.name; this.data = element.data; + this.metadata = metadata; this.children = element.children; this.attributes = element.attributes; @@ -682,6 +710,7 @@ class Element { tag() { const tag = new (tagByName(this.name) || Tag)(); tag.element = this; + tag.metadata = this.metadata; return tag; } @@ -709,6 +738,19 @@ class Element { } text = text.replace(/[\s\t]+/g, " "); + textDecorateCallbacks.forEach((callback) => { + const result = callback.call( + this, + text, + this.next, + this.previous, + this.metadata + ); + + if (typeof result !== "undefined") { + text = result; + } + }); return text; } @@ -721,8 +763,8 @@ class Element { return this.parentNames.filter((p) => names.includes(p)); } - static toMarkdown(element, parent, prev, next) { - return new Element(element, parent, prev, next).toMarkdown(); + static toMarkdown(element, parent, prev, next, metadata) { + return new Element(element, parent, prev, next, metadata).toMarkdown(); } static parseChildren(parent) { @@ -732,12 +774,15 @@ class Element { static parse(elements, parent = null) { if (elements) { let result = []; + let metadata = {}; for (let i = 0; i < elements.length; i++) { const prev = i === 0 ? null : elements[i - 1]; const next = i === elements.length ? null : elements[i + 1]; - result.push(Element.toMarkdown(elements[i], parent, prev, next)); + result.push( + Element.toMarkdown(elements[i], parent, prev, next, metadata) + ); } return result.join(""); diff --git a/app/assets/javascripts/discourse/app/lib/uppy-plugin-base.js b/app/assets/javascripts/discourse/app/lib/uppy-plugin-base.js index 51e5907ebd..421229e999 100644 --- a/app/assets/javascripts/discourse/app/lib/uppy-plugin-base.js +++ b/app/assets/javascripts/discourse/app/lib/uppy-plugin-base.js @@ -1,6 +1,7 @@ import { BasePlugin } from "@uppy/core"; import { Promise } from "rsvp"; import { warn } from "@ember/debug"; +import { isTesting } from "discourse-common/config/environment"; export class UppyPluginBase extends BasePlugin { constructor(uppy, opts) { @@ -9,7 +10,9 @@ export class UppyPluginBase extends BasePlugin { } _consoleWarn(msg) { - warn(`[${this.id}] ${msg}`, { id: `discourse.${this.id}` }); + if (!isTesting()) { + warn(`[${this.id}] ${msg}`, { id: `discourse.${this.id}` }); + } } _consoleDebug(msg) { diff --git a/app/assets/javascripts/discourse/app/lib/url.js b/app/assets/javascripts/discourse/app/lib/url.js index f9bc2565ca..6c092a4f81 100644 --- a/app/assets/javascripts/discourse/app/lib/url.js +++ b/app/assets/javascripts/discourse/app/lib/url.js @@ -24,7 +24,6 @@ const SERVER_SIDE_ONLY = [ /^\/raw\//, /^\/posts\/\d+\/raw/, /^\/raw\/\d+/, - /^\/wizard/, /\.rss$/, /\.json$/, /^\/admin\/upgrade$/, diff --git a/app/assets/javascripts/discourse/app/mixins/textarea-text-manipulation.js b/app/assets/javascripts/discourse/app/mixins/textarea-text-manipulation.js index 462324baf2..9e46e0c454 100644 --- a/app/assets/javascripts/discourse/app/mixins/textarea-text-manipulation.js +++ b/app/assets/javascripts/discourse/app/mixins/textarea-text-manipulation.js @@ -570,14 +570,12 @@ export default Mixin.create({ this.addText(selected, `:${code}:`); } } else { - let numOfRemovedChars = selected.pre.length - captures[1].length; - selected.pre = selected.pre.slice( - 0, - selected.pre.length - captures[1].length + let numOfRemovedChars = captures[1].length; + this._insertAt( + selected.start - numOfRemovedChars, + selected.end, + `${code}:` ); - selected.start -= numOfRemovedChars; - selected.end -= numOfRemovedChars; - this.addText(selected, `${code}:`); } }, }); diff --git a/app/assets/javascripts/discourse/app/models/nav-item.js b/app/assets/javascripts/discourse/app/models/nav-item.js index 9b4cec0f76..56d1f9566c 100644 --- a/app/assets/javascripts/discourse/app/models/nav-item.js +++ b/app/assets/javascripts/discourse/app/models/nav-item.js @@ -27,7 +27,7 @@ const NavItem = EmberObject.extend({ }, set(value) { - this.set("_title", value); + return this.set("_title", value); }, }, @@ -56,7 +56,7 @@ const NavItem = EmberObject.extend({ }, set(value) { - this.set("_displayName", value); + return this.set("_displayName", value); }, }, diff --git a/app/assets/javascripts/discourse/app/models/post-stream.js b/app/assets/javascripts/discourse/app/models/post-stream.js index 9b6d10a8e5..c03dbb6f45 100644 --- a/app/assets/javascripts/discourse/app/models/post-stream.js +++ b/app/assets/javascripts/discourse/app/models/post-stream.js @@ -872,6 +872,17 @@ export default RestModel.extend({ return resolved; }, + triggerChangedTopicStats() { + if (this.firstPostNotLoaded) { + return Promise.reject(); + } + + return Promise.resolve().then(() => { + const firstPost = this.posts.findBy("post_number", 1); + return firstPost.id; + }); + }, + postForPostNumber(postNumber) { if (!this.hasPosts) { return; diff --git a/app/assets/javascripts/discourse/app/models/private-message-topic-tracking-state.js b/app/assets/javascripts/discourse/app/models/private-message-topic-tracking-state.js index 5a96b7064f..1c95bbfcaa 100644 --- a/app/assets/javascripts/discourse/app/models/private-message-topic-tracking-state.js +++ b/app/assets/javascripts/discourse/app/models/private-message-topic-tracking-state.js @@ -1,3 +1,5 @@ +import { Promise } from "rsvp"; + import EmberObject from "@ember/object"; import { ajax } from "discourse/lib/ajax"; import { bind, on } from "discourse-common/utils/decorators"; @@ -25,16 +27,20 @@ const PrivateMessageTopicTrackingState = EmberObject.extend({ this.statesModificationCounter = 0; this.isTracking = false; this.newIncoming = []; - this.stateChangeCallbacks = {}; + this.stateChangeCallbacks = new Map(); }, - onStateChange(name, callback) { - this.stateChangeCallbacks[name] = callback; + onStateChange(key, callback) { + this.stateChangeCallbacks.set(key, callback); + }, + + offStateChange(key) { + this.stateChangeCallbacks.delete(key); }, startTracking() { if (this.isTracking) { - return; + return Promise.resolve(); } this._establishChannels(); @@ -46,13 +52,13 @@ const PrivateMessageTopicTrackingState = EmberObject.extend({ _establishChannels() { this.messageBus.subscribe( - this._userChannel(), + this.userChannel(), this._processMessage.bind(this) ); this.currentUser.groupsWithMessages?.forEach((group) => { this.messageBus.subscribe( - this._groupChannel(group.id), + this.groupChannel(group.id), this._processMessage.bind(this) ); }); @@ -111,11 +117,11 @@ const PrivateMessageTopicTrackingState = EmberObject.extend({ return this.states.get(topicId); }, - _userChannel() { + userChannel() { return `${this.CHANNEL_PREFIX}/user/${this.currentUser.id}`; }, - _groupChannel(groupId) { + groupChannel(groupId) { return `${this.CHANNEL_PREFIX}/group/${groupId}`; }, @@ -263,7 +269,7 @@ const PrivateMessageTopicTrackingState = EmberObject.extend({ _afterStateChange() { this.incrementProperty("statesModificationCounter"); - Object.values(this.stateChangeCallbacks).forEach((callback) => callback()); + this.stateChangeCallbacks.forEach((callback) => callback()); }, }); diff --git a/app/assets/javascripts/discourse/app/models/topic-tracking-state.js b/app/assets/javascripts/discourse/app/models/topic-tracking-state.js index 109bd65707..0a2a9dac3c 100644 --- a/app/assets/javascripts/discourse/app/models/topic-tracking-state.js +++ b/app/assets/javascripts/discourse/app/models/topic-tracking-state.js @@ -32,15 +32,15 @@ function isUnseen(topic) { return !topic.is_seen; } -function hasMutedTags(topicTagIds, mutedTagIds, siteSettings) { - if (!mutedTagIds || !topicTagIds) { +function hasMutedTags(topicTags, mutedTags, siteSettings) { + if (!mutedTags || !topicTags) { return false; } return ( (siteSettings.remove_muted_tags_from_latest === "always" && - topicTagIds.any((tagId) => mutedTagIds.includes(tagId))) || + topicTags.any((topicTag) => mutedTags.includes(topicTag))) || (siteSettings.remove_muted_tags_from_latest === "only_muted" && - topicTagIds.every((tagId) => mutedTagIds.includes(tagId))) + topicTags.every((topicTag) => mutedTags.includes(topicTag))) ); } @@ -876,10 +876,9 @@ const TopicTrackingState = EmberObject.extend({ } if (["new_topic", "latest"].includes(data.message_type)) { - const mutedTagIds = User.currentProp("muted_tag_ids"); - if ( - hasMutedTags(data.payload.topic_tag_ids, mutedTagIds, this.siteSettings) - ) { + const mutedTags = User.currentProp("muted_tags"); + + if (hasMutedTags(data.payload.tags, mutedTags, this.siteSettings)) { return; } } diff --git a/app/assets/javascripts/discourse/app/models/topic.js b/app/assets/javascripts/discourse/app/models/topic.js index ccb9f1a675..9b00d32746 100644 --- a/app/assets/javascripts/discourse/app/models/topic.js +++ b/app/assets/javascripts/discourse/app/models/topic.js @@ -70,6 +70,7 @@ const Topic = RestModel.extend({ lastPosterUser: alias("lastPoster.user"), lastPosterGroup: alias("lastPoster.primary_group"), + allowedGroups: alias("details.allowed_groups"), @discourseComputed("posters.[]", "participants.[]", "allowed_user_count") featuredUsers(posters, participants, allowedUserCount) { diff --git a/app/assets/javascripts/discourse/app/models/user.js b/app/assets/javascripts/discourse/app/models/user.js index 086dbf4d37..b24c8d9636 100644 --- a/app/assets/javascripts/discourse/app/models/user.js +++ b/app/assets/javascripts/discourse/app/models/user.js @@ -1,7 +1,7 @@ import EmberObject, { computed, get, getProperties } from "@ember/object"; import cookie, { removeCookie } from "discourse/lib/cookie"; import { defaultHomepage, escapeExpression } from "discourse/lib/utilities"; -import { equal, filterBy, gt, or } from "@ember/object/computed"; +import { alias, equal, filterBy, gt, or } from "@ember/object/computed"; import getURL, { getURLWithCDN } from "discourse-common/lib/get-url"; import { A } from "@ember/array"; import Badge from "discourse/models/badge"; @@ -62,6 +62,8 @@ let userFields = [ "primary_group_id", "flair_group_id", "user_notification_schedule", + "sidebar_category_ids", + "sidebar_tag_names", ]; export function addSaveableUserField(fieldName) { @@ -307,6 +309,35 @@ const User = RestModel.extend({ @discourseComputed("silenced_till") silencedTillDate: longDate, + sidebarCategoryIds: alias("sidebar_category_ids"), + + @discourseComputed("sidebar_tag_names.[]") + sidebarTagNames(sidebarTagNames) { + if (!sidebarTagNames || sidebarTagNames.length === 0) { + return []; + } + + return sidebarTagNames; + }, + + @discourseComputed("sidebar_category_ids.[]") + sidebarCategories(sidebarCategoryIds) { + if (!sidebarCategoryIds || sidebarCategoryIds.length === 0) { + return []; + } + + return Site.current().categoriesList.filter((category) => { + if ( + this.siteSettings.suppress_uncategorized_badge && + category.isUncategorizedCategory + ) { + return false; + } + + return sidebarCategoryIds.includes(category.id); + }); + }, + changeUsername(new_username) { return ajax(userPath(`${this.username_lower}/preferences/username`), { type: "PUT", @@ -385,6 +416,12 @@ const User = RestModel.extend({ } }); + ["sidebar_category_ids", "sidebar_tag_names"].forEach((prop) => { + if (data[prop]?.length === 0) { + data[prop] = null; + } + }); + return this._saveUserData(data, updatedState); }, diff --git a/app/assets/javascripts/discourse/app/pre-initializers/discourse-bootstrap.js b/app/assets/javascripts/discourse/app/pre-initializers/discourse-bootstrap.js index 17de813fe6..78b9dc698d 100644 --- a/app/assets/javascripts/discourse/app/pre-initializers/discourse-bootstrap.js +++ b/app/assets/javascripts/discourse/app/pre-initializers/discourse-bootstrap.js @@ -70,9 +70,8 @@ export default { } session.darkModeAvailable = - document.head.querySelectorAll( - 'link[media="(prefers-color-scheme: dark)"]' - ).length > 0; + document.querySelectorAll('link[media="(prefers-color-scheme: dark)"]') + .length > 0; session.defaultColorSchemeIsDark = setupData.colorSchemeIsDark === "true"; diff --git a/app/assets/javascripts/discourse/app/pre-initializers/map-routes.js b/app/assets/javascripts/discourse/app/pre-initializers/map-routes.js index 19933c1480..27b1196a8c 100644 --- a/app/assets/javascripts/discourse/app/pre-initializers/map-routes.js +++ b/app/assets/javascripts/discourse/app/pre-initializers/map-routes.js @@ -1,9 +1,5 @@ -import Application from "@ember/application"; -import { isLegacyEmber } from "discourse-common/config/environment"; import { registerRouter, teardownRouter } from "discourse/mapping-router"; -let originalBuildInstance; - export default { name: "map-routes", after: "inject-discourse-objects", @@ -12,17 +8,6 @@ export default { let routerClass = registerRouter(app); container.registry.register("router:main", routerClass); this.routerClass = routerClass; - - if (isLegacyEmber()) { - // HACK to fix: https://github.com/emberjs/ember.js/issues/10310 - originalBuildInstance = - originalBuildInstance || Application.prototype.buildInstance; - - Application.prototype.buildInstance = function () { - this.buildRegistry(); - return originalBuildInstance.apply(this); - }; - } }, teardown() { diff --git a/app/assets/javascripts/discourse/app/routes/app-route-map.js b/app/assets/javascripts/discourse/app/routes/app-route-map.js index e26451223f..9306fa71de 100644 --- a/app/assets/javascripts/discourse/app/routes/app-route-map.js +++ b/app/assets/javascripts/discourse/app/routes/app-route-map.js @@ -166,6 +166,7 @@ export default function () { this.route("tags"); this.route("interface"); this.route("apps"); + this.route("sidebar"); this.route("username"); this.route("email"); diff --git a/app/assets/javascripts/discourse/app/routes/application.js b/app/assets/javascripts/discourse/app/routes/application.js index 0b02e6417f..59aecbb31a 100644 --- a/app/assets/javascripts/discourse/app/routes/application.js +++ b/app/assets/javascripts/discourse/app/routes/application.js @@ -48,6 +48,9 @@ const ApplicationRoute = DiscourseRoute.extend(OpenComposer, { }, toggleSidebar() { + // enables CSS transitions, but not on did-insert + document.querySelector("body").classList.add("sidebar-animate"); + this.controllerFor("application").toggleProperty("showSidebar"); }, diff --git a/app/assets/javascripts/discourse/app/routes/preferences-sidebar.js b/app/assets/javascripts/discourse/app/routes/preferences-sidebar.js new file mode 100644 index 0000000000..f9d430144e --- /dev/null +++ b/app/assets/javascripts/discourse/app/routes/preferences-sidebar.js @@ -0,0 +1,20 @@ +import RestrictedUserRoute from "discourse/routes/restricted-user"; + +export default RestrictedUserRoute.extend({ + showFooter: true, + + setupController(controller, user) { + const props = { + model: user, + selectedSiderbarCategories: user.sidebarCategories, + initialSidebarCategoryIds: user.sidebarCategoryIds, + }; + + if (this.siteSettings.tagging_enabled) { + props.selectedSidebarTagNames = user.sidebarTagNames; + props.initialSidebarTagNames = user.sidebarTagNames; + } + + controller.setProperties(props); + }, +}); diff --git a/app/assets/javascripts/discourse/app/services/presence.js b/app/assets/javascripts/discourse/app/services/presence.js index d0394aef89..0219142a01 100644 --- a/app/assets/javascripts/discourse/app/services/presence.js +++ b/app/assets/javascripts/discourse/app/services/presence.js @@ -1,6 +1,5 @@ import Service from "@ember/service"; -import EmberObject, { computed, defineProperty } from "@ember/object"; -import { readOnly } from "@ember/object/computed"; +import EmberObject, { computed } from "@ember/object"; import { ajax } from "discourse/lib/ajax"; import { cancel, @@ -13,13 +12,14 @@ import { } from "@ember/runloop"; import Session from "discourse/models/session"; import { Promise } from "rsvp"; -import { isLegacyEmber, isTesting } from "discourse-common/config/environment"; import User from "discourse/models/user"; import userPresent, { onPresenceChange, removeOnPresenceChange, } from "discourse/lib/user-presence"; import { bind } from "discourse-common/utils/decorators"; +import Evented from "@ember/object/evented"; +import { isTesting } from "discourse-common/config/environment"; const PRESENCE_INTERVAL_S = 30; const PRESENCE_DEBOUNCE_MS = isTesting() ? 0 : 500; @@ -45,17 +45,12 @@ export class PresenceChannelNotFound extends Error {} // Instances of this class are handed out to consumers. They act as // convenient proxies to the PresenceService and PresenceServiceState -class PresenceChannel extends EmberObject { +// The 'change' event is fired whenever the users list or the count change +class PresenceChannel extends EmberObject.extend(Evented) { init({ name, presenceService }) { super.init(...arguments); this.name = name; this.presenceService = presenceService; - defineProperty( - this, - "_presenceState", - readOnly(`presenceService._presenceChannelStates.${name}`) - ); - this.set("present", false); this.set("subscribed", false); } @@ -91,8 +86,12 @@ class PresenceChannel extends EmberObject { if (this.subscribed) { return; } - await this.presenceService._subscribe(this, initialData); + const state = await this.presenceService._subscribe(this, initialData); this.set("subscribed", true); + this.set("_presenceState", state); + + this._publishChange(); + state.on("change", this._publishChange); } async unsubscribe() { @@ -101,6 +100,14 @@ class PresenceChannel extends EmberObject { } await this.presenceService._unsubscribe(this); this.set("subscribed", false); + this._presenceState.off("change", this._publishChange); + this.set("_presenceState", null); + this._publishChange(); + } + + @bind + _publishChange() { + this.trigger("change", this); } @computed("_presenceState.users", "subscribed") @@ -128,7 +135,7 @@ class PresenceChannel extends EmberObject { } } -class PresenceChannelState extends EmberObject { +class PresenceChannelState extends EmberObject.extend(Evented) { init({ name, presenceService }) { super.init(...arguments); this.name = name; @@ -179,6 +186,7 @@ class PresenceChannelState extends EmberObject { ); this.set("_subscribedCallback", callback); + this.trigger("change"); } // Stop subscribing to updates from the server about this channel @@ -191,6 +199,7 @@ class PresenceChannelState extends EmberObject { this.set("_subscribedCallback", null); this.set("users", null); this.set("count", null); + this.trigger("change"); } } @@ -221,6 +230,7 @@ class PresenceChannelState extends EmberObject { if (this.countOnly && data.count_delta !== undefined) { this.set("count", this.count + data.count_delta); + this.trigger("change"); } else if ( !this.countOnly && (data.entering_users || data.leaving_user_ids) @@ -235,6 +245,7 @@ class PresenceChannelState extends EmberObject { this.users.removeObjects(toRemove); } this.set("count", this.users.length); + this.trigger("change"); } else { // Unexpected message await this._resubscribe(); @@ -247,7 +258,7 @@ export default class PresenceService extends Service { init() { super.init(...arguments); this._queuedEvents = []; - this._presenceChannelStates = EmberObject.create(); + this._presenceChannelStates = new Map(); this._presentProxies = new Map(); this._subscribedProxies = new Map(); this._initialDataRequests = new Map(); @@ -429,7 +440,7 @@ export default class PresenceService extends Service { this._addSubscribed(channelProxy); const channelName = channelProxy.name; - let state = this._presenceChannelStates[channelName]; + let state = this._presenceChannelStates.get(channelName); if (!state) { state = PresenceChannelState.create({ name: channelName, @@ -438,14 +449,15 @@ export default class PresenceService extends Service { this._presenceChannelStates.set(channelName, state); await state.subscribe(initialData); } + return state; } _unsubscribe(channelProxy) { const subscribedCount = this._removeSubscribed(channelProxy); if (subscribedCount === 0) { const channelName = channelProxy.name; - this._presenceChannelStates[channelName].unsubscribe(); - this._presenceChannelStates.set(channelName, undefined); + this._presenceChannelStates.get(channelName).unsubscribe(); + this._presenceChannelStates.delete(channelName); } } @@ -537,13 +549,6 @@ export default class PresenceService extends Service { } }); } catch (e) { - if (e.jqXHR?.status === 403 && isTesting() && isLegacyEmber()) { - // Legacy testing environment will remove the User.current() value before disposing of controllers/components. - // Presence often involves making HTTP calls during disposal of components, so this can cause issues. - // Modern Ember-CLI environment does not require this hack - return; - } - // Put the failed events back in the queue for next time this._queuedEvents.unshift(...queue); if (e.jqXHR?.status === 429) { diff --git a/app/assets/javascripts/discourse/app/services/user-status.js b/app/assets/javascripts/discourse/app/services/user-status.js index b152a55698..0b6835f15e 100644 --- a/app/assets/javascripts/discourse/app/services/user-status.js +++ b/app/assets/javascripts/discourse/app/services/user-status.js @@ -8,7 +8,7 @@ export default class UserStatusService extends Service { await ajax({ url: "/user-status.json", type: "PUT", - data: { description: status.description }, + data: status, }); this.currentUser.set("status", status); diff --git a/app/assets/javascripts/discourse/app/templates/application.hbs b/app/assets/javascripts/discourse/app/templates/application.hbs index 7e16b0f910..1a8cf13f5e 100644 --- a/app/assets/javascripts/discourse/app/templates/application.hbs +++ b/app/assets/javascripts/discourse/app/templates/application.hbs @@ -15,9 +15,9 @@ {{plugin-outlet name="below-site-header" connectorTagName="div" args=(hash currentPath=router._router.currentPath)}} -
- {{#if currentUser.experimental_sidebar_enabled}} - +
+ {{#if (and currentUser.experimental_sidebar_enabled showSidebar)}} + {{/if}}
diff --git a/app/assets/javascripts/discourse/app/templates/components/bookmark-icon.hbs b/app/assets/javascripts/discourse/app/templates/components/bookmark-icon.hbs index 2a1a2af91c..6d82c0977d 100644 --- a/app/assets/javascripts/discourse/app/templates/components/bookmark-icon.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/bookmark-icon.hbs @@ -1 +1 @@ -{{d-icon icon translatedtitle=title class=cssClasses}} +{{d-icon icon translatedTitle=title class=cssClasses}} diff --git a/app/assets/javascripts/discourse/app/templates/components/categories-boxes-with-topics.hbs b/app/assets/javascripts/discourse/app/templates/components/categories-boxes-with-topics.hbs index 0a041d8cc0..e25f0d922c 100644 --- a/app/assets/javascripts/discourse/app/templates/components/categories-boxes-with-topics.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/categories-boxes-with-topics.hbs @@ -1,5 +1,5 @@ {{#each categories as |c|}} -
+ diff --git a/app/assets/javascripts/discourse/app/templates/components/categories-boxes.hbs b/app/assets/javascripts/discourse/app/templates/components/categories-boxes.hbs index d806ed1aaf..95758c17e5 100644 --- a/app/assets/javascripts/discourse/app/templates/components/categories-boxes.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/categories-boxes.hbs @@ -1,6 +1,7 @@ {{#each categories as |c|}} {{plugin-outlet name="category-box-before-each-box" args=(hash category=c)}} -
+ +
{{#unless c.isMuted}} {{/unless}} + + {{plugin-outlet name="category-box-after-each-box" args=(hash category=c)}} {{/each}} + {{plugin-outlet name="category-boxes-after-boxes" args=(hash category=c)}} diff --git a/app/assets/javascripts/discourse/app/templates/components/d-editor.hbs b/app/assets/javascripts/discourse/app/templates/components/d-editor.hbs index a8bad744e3..f6ca96a8ea 100644 --- a/app/assets/javascripts/discourse/app/templates/components/d-editor.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/d-editor.hbs @@ -74,5 +74,5 @@ isEditorFocused=isEditorFocused initialFilter=this.emojiFilter emojiSelected=(action "emojiSelected") - onEmojiPickerClose=(action (mut emojiPickerIsActive) false) + onEmojiPickerClose=onEmojiPickerClose }} diff --git a/app/assets/javascripts/discourse/app/templates/components/emoji-uploader.hbs b/app/assets/javascripts/discourse/app/templates/components/emoji-uploader.hbs index 32c118bc3f..519f95e4e2 100644 --- a/app/assets/javascripts/discourse/app/templates/components/emoji-uploader.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/emoji-uploader.hbs @@ -40,7 +40,7 @@ type="file" multiple="true" accept=".png,.gif"> - {{d-button class="btn-primary" computedLabel=buttonLabel icon="plus" action=(action "chooseFiles") disabled=uploading}} + {{d-button class="btn-primary" translatedLabel=buttonLabel icon="plus" action=(action "chooseFiles") disabled=uploading}}
diff --git a/app/assets/javascripts/discourse/app/templates/components/global-notice.hbs b/app/assets/javascripts/discourse/app/templates/components/global-notice.hbs index 08ff36603f..efb640d1be 100644 --- a/app/assets/javascripts/discourse/app/templates/components/global-notice.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/global-notice.hbs @@ -1,19 +1,27 @@ -{{#each notices as |notice|}} -
-
- {{#if notice.options.html}} - {{html-safe notice.options.html}} - {{/if}} - {{html-safe notice.text}} +
+ {{#if this.visible}} + {{#each notices as |notice|}} +
+
+ {{#if notice.options.html}} + {{html-safe notice.options.html}} + {{/if}} - {{#if notice.options.dismissable}} - {{d-button - class="btn-flat close" - icon="times" - action=(action "dismissNotice") - actionParam=notice - }} - {{/if}} -
-
-{{/each}} + {{html-safe notice.text}} + + {{#if notice.options.dismissable}} + {{d-button + class="btn-flat close" + icon="times" + action=(action "dismissNotice") + actionParam=notice + }} + {{/if}} +
+
+ {{/each}} + {{/if}} +
diff --git a/app/assets/javascripts/discourse/app/templates/components/parent-category-row.hbs b/app/assets/javascripts/discourse/app/templates/components/parent-category-row.hbs index a00118be6e..19fd656fd0 100644 --- a/app/assets/javascripts/discourse/app/templates/components/parent-category-row.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/parent-category-row.hbs @@ -1,14 +1,17 @@ {{#unless isHidden}} {{plugin-outlet name="category-list-above-each-category" args=(hash category=category)}} + - + {{category-title-link category=category}} {{plugin-outlet name="below-category-title-link" connectorTagName="div" args=(hash category=category)}} + {{#if category.description_excerpt}}
{{dir-span category.description_excerpt htmlSafe="true"}}
{{/if}} + {{#if category.isGrandParent}} @@ -25,10 +28,12 @@ {{/if}} + + {{#unless isMuted}} {{#if showTopics}} '; - } - } - if (opts.isDisabled) { - arr.push('is-disabled'); - } - if (opts.isToday) { - arr.push('is-today'); - } - if (opts.isSelected) { - arr.push('is-selected'); - ariaSelected = 'true'; - } - if (opts.hasEvent) { - arr.push('has-event'); - } - if (opts.isInRange) { - arr.push('is-inrange'); - } - if (opts.isStartRange) { - arr.push('is-startrange'); - } - if (opts.isEndRange) { - arr.push('is-endrange'); - } - return ''; - }, - - renderWeek = function (d, m, y) { - // Lifted from http://javascript.about.com/library/blweekyear.htm, lightly modified. - var onejan = new Date(y, 0, 1), - weekNum = Math.ceil((((new Date(y, m, d) - onejan) / 86400000) + onejan.getDay()+1)/7); - return ''; - }, - - renderRow = function(days, isRTL, pickWholeWeek, isRowSelected) - { - return '' + (isRTL ? days.reverse() : days).join('') + ''; - }, - - renderBody = function(rows) - { - return '' + rows.join('') + ''; - }, - - renderHead = function(opts) - { - var i, arr = []; - if (opts.showWeekNumber) { - arr.push(''); - } - for (i = 0; i < 7; i++) { - arr.push(''); - } - return '' + (opts.isRTL ? arr.reverse() : arr).join('') + ''; - }, - - renderTitle = function(instance, c, year, month, refYear, randId) - { - var i, j, arr, - opts = instance._o, - isMinYear = year === opts.minYear, - isMaxYear = year === opts.maxYear, - html = '
', - monthHtml, - yearHtml, - prev = true, - next = true; - - for (arr = [], i = 0; i < 12; i++) { - arr.push(''); - } - - monthHtml = '
' + opts.i18n.months[month] + '
'; - - if (isArray(opts.yearRange)) { - i = opts.yearRange[0]; - j = opts.yearRange[1] + 1; - } else { - i = year - opts.yearRange; - j = 1 + year + opts.yearRange; - } - - for (arr = []; i < j && i <= opts.maxYear; i++) { - if (i >= opts.minYear) { - arr.push(''); - } - } - yearHtml = '
' + year + opts.yearSuffix + '
'; - - if (opts.showMonthAfterYear) { - html += yearHtml + monthHtml; - } else { - html += monthHtml + yearHtml; - } - - if (isMinYear && (month === 0 || opts.minMonth >= month)) { - prev = false; - } - - if (isMaxYear && (month === 11 || opts.maxMonth <= month)) { - next = false; - } - - if (c === 0) { - html += ''; - } - if (c === (instance._o.numberOfMonths - 1) ) { - html += ''; - } - - return html += '
'; - }, - - renderTable = function(opts, data, randId) - { - return '
{{html-safe category.stat}}
{{category-unread category=category tagName="div" class="unread-new"}}
diff --git a/app/assets/javascripts/discourse/app/templates/components/sidebar.hbs b/app/assets/javascripts/discourse/app/templates/components/sidebar.hbs index 9c69d3ae7c..1f1e8160fa 100644 --- a/app/assets/javascripts/discourse/app/templates/components/sidebar.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/sidebar.hbs @@ -1,12 +1,14 @@ -{{#if @shouldDisplay}} - ' + - '' + - '' + weekNum + '
' + renderDayName(opts, i, true) + '
' + renderHead(opts) + renderBody(data) + '
'; - }, - - - /** - * Pikaday constructor - */ - Pikaday = function(options) - { - var self = this, - opts = self.config(options); - - self._onMouseDown = function(e) - { - if (!self._v) { - return; - } - e = e || window.event; - var target = e.target || e.srcElement; - if (!target) { - return; - } - - if (!hasClass(target, 'is-disabled')) { - if (hasClass(target, 'pika-button') && !hasClass(target, 'is-empty') && !hasClass(target.parentNode, 'is-disabled')) { - self.setDate(new Date(target.getAttribute('data-pika-year'), target.getAttribute('data-pika-month'), target.getAttribute('data-pika-day'))); - if (opts.bound) { - sto(function() { - self.hide(); - if (opts.blurFieldOnSelect && opts.field) { - opts.field.blur(); - } - }, 100); - } - } - else if (hasClass(target, 'pika-prev')) { - self.prevMonth(); - } - else if (hasClass(target, 'pika-next')) { - self.nextMonth(); - } - } - if (!hasClass(target, 'pika-select')) { - // if this is touch event prevent mouse events emulation - if (e.preventDefault) { - e.preventDefault(); - } else { - e.returnValue = false; - return false; - } - } else { - self._c = true; - } - }; - - self._onChange = function(e) - { - e = e || window.event; - var target = e.target || e.srcElement; - if (!target) { - return; - } - if (hasClass(target, 'pika-select-month')) { - self.gotoMonth(target.value); - } - else if (hasClass(target, 'pika-select-year')) { - self.gotoYear(target.value); - } - }; - - self._onKeyChange = function(e) - { - e = e || window.event; - - if (self.isVisible()) { - - switch(e.keyCode){ - case 13: - case 27: - if (opts.field) { - opts.field.blur(); - } - break; - case 37: - e.preventDefault(); - self.adjustDate('subtract', 1); - break; - case 38: - self.adjustDate('subtract', 7); - break; - case 39: - self.adjustDate('add', 1); - break; - case 40: - self.adjustDate('add', 7); - break; - } - } - }; - - self._onInputChange = function(e) - { - var date; - - if (e.firedBy === self) { - return; - } - if (opts.parse) { - date = opts.parse(opts.field.value, opts.format); - } else if (hasMoment) { - date = moment(opts.field.value, opts.format, opts.formatStrict); - date = (date && date.isValid()) ? date.toDate() : null; - } - else { - date = new Date(Date.parse(opts.field.value)); - } - if (isDate(date)) { - self.setDate(date); - } - if (!self._v) { - self.show(); - } - }; - - self._onInputFocus = function() - { - self.show(); - }; - - self._onInputClick = function() - { - self.show(); - }; - - self._onInputBlur = function() - { - // IE allows pika div to gain focus; catch blur the input field - var pEl = document.activeElement; - do { - if (hasClass(pEl, 'pika-single')) { - return; - } - } - while ((pEl = pEl.parentNode)); - - if (!self._c) { - self._b = sto(function() { - self.hide(); - }, 50); - } - self._c = false; - }; - - self._onClick = function(e) - { - e = e || window.event; - var target = e.target || e.srcElement, - pEl = target; - if (!target) { - return; - } - if (!hasEventListeners && hasClass(target, 'pika-select')) { - if (!target.onchange) { - target.setAttribute('onchange', 'return;'); - addEvent(target, 'change', self._onChange); - } - } - do { - if (hasClass(pEl, 'pika-single') || pEl === opts.trigger) { - return; - } - } - while ((pEl = pEl.parentNode)); - if (self._v && target !== opts.trigger && pEl !== opts.trigger) { - self.hide(); - } - }; - - self.el = document.createElement('div'); - self.el.className = 'pika-single' + (opts.isRTL ? ' is-rtl' : '') + (opts.theme ? ' ' + opts.theme : ''); - - addEvent(self.el, 'mousedown', self._onMouseDown, true); - addEvent(self.el, 'touchend', self._onMouseDown, true); - addEvent(self.el, 'change', self._onChange); - - if (opts.keyboardInput) { - addEvent(document, 'keydown', self._onKeyChange); - } - - if (opts.field) { - if (opts.container) { - opts.container.appendChild(self.el); - } else if (opts.bound) { - document.body.appendChild(self.el); - } else { - opts.field.parentNode.insertBefore(self.el, opts.field.nextSibling); - } - addEvent(opts.field, 'change', self._onInputChange); - - if (!opts.defaultDate) { - if (hasMoment && opts.field.value) { - opts.defaultDate = moment(opts.field.value, opts.format).toDate(); - } else { - opts.defaultDate = new Date(Date.parse(opts.field.value)); - } - opts.setDefaultDate = true; - } - } - - var defDate = opts.defaultDate; - - if (isDate(defDate)) { - if (opts.setDefaultDate) { - self.setDate(defDate, true); - } else { - self.gotoDate(defDate); - } - } else { - self.gotoDate(new Date()); - } - - if (opts.bound) { - this.hide(); - self.el.className += ' is-bound'; - addEvent(opts.trigger, 'click', self._onInputClick); - addEvent(opts.trigger, 'focus', self._onInputFocus); - addEvent(opts.trigger, 'blur', self._onInputBlur); - } else { - this.show(); - } - }; - - - /** - * public Pikaday API - */ - Pikaday.prototype = { - - - /** - * configure functionality - */ - config: function(options) - { - if (!this._o) { - this._o = extend({}, defaults, true); - } - - var opts = extend(this._o, options, true); - - opts.isRTL = !!opts.isRTL; - - opts.field = (opts.field && opts.field.nodeName) ? opts.field : null; - - opts.theme = (typeof opts.theme) === 'string' && opts.theme ? opts.theme : null; - - opts.bound = !!(opts.bound !== undefined ? opts.field && opts.bound : opts.field); - - opts.trigger = (opts.trigger && opts.trigger.nodeName) ? opts.trigger : opts.field; - - opts.disableWeekends = !!opts.disableWeekends; - - opts.disableDayFn = (typeof opts.disableDayFn) === 'function' ? opts.disableDayFn : null; - - var nom = parseInt(opts.numberOfMonths, 10) || 1; - opts.numberOfMonths = nom > 4 ? 4 : nom; - - if (!isDate(opts.minDate)) { - opts.minDate = false; - } - if (!isDate(opts.maxDate)) { - opts.maxDate = false; - } - if ((opts.minDate && opts.maxDate) && opts.maxDate < opts.minDate) { - opts.maxDate = opts.minDate = false; - } - if (opts.minDate) { - this.setMinDate(opts.minDate); - } - if (opts.maxDate) { - this.setMaxDate(opts.maxDate); - } - - if (isArray(opts.yearRange)) { - var fallback = new Date().getFullYear() - 10; - opts.yearRange[0] = parseInt(opts.yearRange[0], 10) || fallback; - opts.yearRange[1] = parseInt(opts.yearRange[1], 10) || fallback; - } else { - opts.yearRange = Math.abs(parseInt(opts.yearRange, 10)) || defaults.yearRange; - if (opts.yearRange > 100) { - opts.yearRange = 100; - } - } - - return opts; - }, - - /** - * return a formatted string of the current selection (using Moment.js if available) - */ - toString: function(format) - { - format = format || this._o.format; - if (!isDate(this._d)) { - return ''; - } - if (this._o.toString) { - return this._o.toString(this._d, format); - } - if (hasMoment) { - return moment(this._d).format(format); - } - return this._d.toDateString(); - }, - - /** - * return a Moment.js object of the current selection (if available) - */ - getMoment: function() - { - return hasMoment ? moment(this._d) : null; - }, - - /** - * set the current selection from a Moment.js object (if available) - */ - setMoment: function(date, preventOnSelect) - { - if (hasMoment && moment.isMoment(date)) { - this.setDate(date.toDate(), preventOnSelect); - } - }, - - /** - * return a Date object of the current selection - */ - getDate: function() - { - return isDate(this._d) ? new Date(this._d.getTime()) : null; - }, - - /** - * set the current selection - */ - setDate: function(date, preventOnSelect) - { - if (!date) { - this._d = null; - - if (this._o.field) { - this._o.field.value = ''; - fireEvent(this._o.field, 'change', { firedBy: this }); - } - - return this.draw(); - } - if (typeof date === 'string') { - date = new Date(Date.parse(date)); - } - if (!isDate(date)) { - return; - } - - var min = this._o.minDate, - max = this._o.maxDate; - - if (isDate(min) && date < min) { - date = min; - } else if (isDate(max) && date > max) { - date = max; - } - - this._d = new Date(date.getTime()); - setToStartOfDay(this._d); - this.gotoDate(this._d); - - if (this._o.field) { - this._o.field.value = this.toString(); - fireEvent(this._o.field, 'change', { firedBy: this }); - } - if (!preventOnSelect && typeof this._o.onSelect === 'function') { - this._o.onSelect.call(this, this.getDate()); - } - }, - - /** - * change view to a specific date - */ - gotoDate: function(date) - { - var newCalendar = true; - - if (!isDate(date)) { - return; - } - - if (this.calendars) { - var firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1), - lastVisibleDate = new Date(this.calendars[this.calendars.length-1].year, this.calendars[this.calendars.length-1].month, 1), - visibleDate = date.getTime(); - // get the end of the month - lastVisibleDate.setMonth(lastVisibleDate.getMonth()+1); - lastVisibleDate.setDate(lastVisibleDate.getDate()-1); - newCalendar = (visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate); - } - - if (newCalendar) { - this.calendars = [{ - month: date.getMonth(), - year: date.getFullYear() - }]; - if (this._o.mainCalendar === 'right') { - this.calendars[0].month += 1 - this._o.numberOfMonths; - } - } - - this.adjustCalendars(); - }, - - adjustDate: function(sign, days) { - - var day = this.getDate() || new Date(); - var difference = parseInt(days)*24*60*60*1000; - - var newDay; - - if (sign === 'add') { - newDay = new Date(day.valueOf() + difference); - } else if (sign === 'subtract') { - newDay = new Date(day.valueOf() - difference); - } - - this.setDate(newDay); - }, - - adjustCalendars: function() { - this.calendars[0] = adjustCalendar(this.calendars[0]); - for (var c = 1; c < this._o.numberOfMonths; c++) { - this.calendars[c] = adjustCalendar({ - month: this.calendars[0].month + c, - year: this.calendars[0].year - }); - } - this.draw(); - }, - - gotoToday: function() - { - this.gotoDate(new Date()); - }, - - /** - * change view to a specific month (zero-index, e.g. 0: January) - */ - gotoMonth: function(month) - { - if (!isNaN(month)) { - this.calendars[0].month = parseInt(month, 10); - this.adjustCalendars(); - } - }, - - nextMonth: function() - { - this.calendars[0].month++; - this.adjustCalendars(); - }, - - prevMonth: function() - { - this.calendars[0].month--; - this.adjustCalendars(); - }, - - /** - * change view to a specific full year (e.g. "2012") - */ - gotoYear: function(year) - { - if (!isNaN(year)) { - this.calendars[0].year = parseInt(year, 10); - this.adjustCalendars(); - } - }, - - /** - * change the minDate - */ - setMinDate: function(value) - { - if(value instanceof Date) { - setToStartOfDay(value); - this._o.minDate = value; - this._o.minYear = value.getFullYear(); - this._o.minMonth = value.getMonth(); - } else { - this._o.minDate = defaults.minDate; - this._o.minYear = defaults.minYear; - this._o.minMonth = defaults.minMonth; - this._o.startRange = defaults.startRange; - } - - this.draw(); - }, - - /** - * change the maxDate - */ - setMaxDate: function(value) - { - if(value instanceof Date) { - setToStartOfDay(value); - this._o.maxDate = value; - this._o.maxYear = value.getFullYear(); - this._o.maxMonth = value.getMonth(); - } else { - this._o.maxDate = defaults.maxDate; - this._o.maxYear = defaults.maxYear; - this._o.maxMonth = defaults.maxMonth; - this._o.endRange = defaults.endRange; - } - - this.draw(); - }, - - setStartRange: function(value) - { - this._o.startRange = value; - }, - - setEndRange: function(value) - { - this._o.endRange = value; - }, - - /** - * refresh the HTML - */ - draw: function(force) - { - if (!this._v && !force) { - return; - } - var opts = this._o, - minYear = opts.minYear, - maxYear = opts.maxYear, - minMonth = opts.minMonth, - maxMonth = opts.maxMonth, - html = '', - randId; - - if (this._y <= minYear) { - this._y = minYear; - if (!isNaN(minMonth) && this._m < minMonth) { - this._m = minMonth; - } - } - if (this._y >= maxYear) { - this._y = maxYear; - if (!isNaN(maxMonth) && this._m > maxMonth) { - this._m = maxMonth; - } - } - - randId = 'pika-title-' + Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 2); - - for (var c = 0; c < opts.numberOfMonths; c++) { - html += '
' + renderTitle(this, c, this.calendars[c].year, this.calendars[c].month, this.calendars[0].year, randId) + this.render(this.calendars[c].year, this.calendars[c].month, randId) + '
'; - } - - this.el.innerHTML = html; - - if (opts.bound) { - if(opts.field.type !== 'hidden') { - sto(function() { - opts.trigger.focus(); - }, 1); - } - } - - if (typeof this._o.onDraw === 'function') { - this._o.onDraw(this); - } - - if (opts.bound) { - // let the screen reader user know to use arrow keys - opts.field.setAttribute('aria-label', opts.ariaLabel); - } - }, - - adjustPosition: function() - { - var field, pEl, width, height, viewportWidth, viewportHeight, scrollTop, left, top, clientRect, leftAligned, bottomAligned; - - if (this._o.container) return; - - this.el.style.position = 'absolute'; - - field = this._o.trigger; - pEl = field; - width = this.el.offsetWidth; - height = this.el.offsetHeight; - viewportWidth = window.innerWidth || document.documentElement.clientWidth; - viewportHeight = window.innerHeight || document.documentElement.clientHeight; - scrollTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop; - leftAligned = true; - bottomAligned = true; - - if (typeof field.getBoundingClientRect === 'function') { - clientRect = field.getBoundingClientRect(); - left = clientRect.left + window.pageXOffset; - top = clientRect.bottom + window.pageYOffset; - } else { - left = pEl.offsetLeft; - top = pEl.offsetTop + pEl.offsetHeight; - while((pEl = pEl.offsetParent)) { - left += pEl.offsetLeft; - top += pEl.offsetTop; - } - } - - // default position is bottom & left - if ((this._o.reposition && left + width > viewportWidth) || - ( - this._o.position.indexOf('right') > -1 && - left - width + field.offsetWidth > 0 - ) - ) { - left = left - width + field.offsetWidth; - leftAligned = false; - } - if ((this._o.reposition && top + height > viewportHeight + scrollTop) || - ( - this._o.position.indexOf('top') > -1 && - top - height - field.offsetHeight > 0 - ) - ) { - top = top - height - field.offsetHeight; - bottomAligned = false; - } - - this.el.style.left = left + 'px'; - this.el.style.top = top + 'px'; - - addClass(this.el, leftAligned ? 'left-aligned' : 'right-aligned'); - addClass(this.el, bottomAligned ? 'bottom-aligned' : 'top-aligned'); - removeClass(this.el, !leftAligned ? 'left-aligned' : 'right-aligned'); - removeClass(this.el, !bottomAligned ? 'bottom-aligned' : 'top-aligned'); - }, - - /** - * render HTML for a particular month - */ - render: function(year, month, randId) - { - var opts = this._o, - now = new Date(), - days = getDaysInMonth(year, month), - before = new Date(year, month, 1).getDay(), - data = [], - row = []; - setToStartOfDay(now); - if (opts.firstDay > 0) { - before -= opts.firstDay; - if (before < 0) { - before += 7; - } - } - var previousMonth = month === 0 ? 11 : month - 1, - nextMonth = month === 11 ? 0 : month + 1, - yearOfPreviousMonth = month === 0 ? year - 1 : year, - yearOfNextMonth = month === 11 ? year + 1 : year, - daysInPreviousMonth = getDaysInMonth(yearOfPreviousMonth, previousMonth); - var cells = days + before, - after = cells; - while(after > 7) { - after -= 7; - } - cells += 7 - after; - var isWeekSelected = false; - for (var i = 0, r = 0; i < cells; i++) - { - var day = new Date(year, month, 1 + (i - before)), - isSelected = isDate(this._d) ? compareDates(day, this._d) : false, - isToday = compareDates(day, now), - hasEvent = opts.events.indexOf(day.toDateString()) !== -1 ? true : false, - isEmpty = i < before || i >= (days + before), - dayNumber = 1 + (i - before), - monthNumber = month, - yearNumber = year, - isStartRange = opts.startRange && compareDates(opts.startRange, day), - isEndRange = opts.endRange && compareDates(opts.endRange, day), - isInRange = opts.startRange && opts.endRange && opts.startRange < day && day < opts.endRange, - isDisabled = (opts.minDate && day < opts.minDate) || - (opts.maxDate && day > opts.maxDate) || - (opts.disableWeekends && isWeekend(day)) || - (opts.disableDayFn && opts.disableDayFn(day)); - - if (isEmpty) { - if (i < before) { - dayNumber = daysInPreviousMonth + dayNumber; - monthNumber = previousMonth; - yearNumber = yearOfPreviousMonth; - } else { - dayNumber = dayNumber - days; - monthNumber = nextMonth; - yearNumber = yearOfNextMonth; - } - } - - var dayConfig = { - day: dayNumber, - month: monthNumber, - year: yearNumber, - hasEvent: hasEvent, - isSelected: isSelected, - isToday: isToday, - isDisabled: isDisabled, - isEmpty: isEmpty, - isStartRange: isStartRange, - isEndRange: isEndRange, - isInRange: isInRange, - showDaysInNextAndPreviousMonths: opts.showDaysInNextAndPreviousMonths, - enableSelectionDaysInNextAndPreviousMonths: opts.enableSelectionDaysInNextAndPreviousMonths - }; - - if (opts.pickWholeWeek && isSelected) { - isWeekSelected = true; - } - - row.push(renderDay(dayConfig)); - - if (++r === 7) { - if (opts.showWeekNumber) { - row.unshift(renderWeek(i - before, month, year)); - } - data.push(renderRow(row, opts.isRTL, opts.pickWholeWeek, isWeekSelected)); - row = []; - r = 0; - isWeekSelected = false; - } - } - return renderTable(opts, data, randId); - }, - - isVisible: function() - { - return this._v; - }, - - show: function() - { - if (!this.isVisible()) { - this._v = true; - this.draw(); - removeClass(this.el, 'is-hidden'); - if (this._o.bound) { - addEvent(document, 'click', this._onClick); - this.adjustPosition(); - } - if (typeof this._o.onOpen === 'function') { - this._o.onOpen.call(this); - } - } - }, - - hide: function() - { - var v = this._v; - if (v !== false) { - if (this._o.bound) { - removeEvent(document, 'click', this._onClick); - } - this.el.style.position = 'static'; // reset - this.el.style.left = 'auto'; - this.el.style.top = 'auto'; - addClass(this.el, 'is-hidden'); - this._v = false; - if (v !== undefined && typeof this._o.onClose === 'function') { - this._o.onClose.call(this); - } - } - }, - - /** - * GAME OVER - */ - destroy: function() - { - var opts = this._o; - - this.hide(); - removeEvent(this.el, 'mousedown', this._onMouseDown, true); - removeEvent(this.el, 'touchend', this._onMouseDown, true); - removeEvent(this.el, 'change', this._onChange); - if (opts.keyboardInput) { - removeEvent(document, 'keydown', this._onKeyChange); - } - if (opts.field) { - removeEvent(opts.field, 'change', this._onInputChange); - if (opts.bound) { - removeEvent(opts.trigger, 'click', this._onInputClick); - removeEvent(opts.trigger, 'focus', this._onInputFocus); - removeEvent(opts.trigger, 'blur', this._onInputBlur); - } - } - if (this.el.parentNode) { - this.el.parentNode.removeChild(this.el); - } - } - - }; - - return Pikaday; -})); diff --git a/public/popper.js.map b/public/popper.js.map deleted file mode 100644 index f560b118ee..0000000000 --- a/public/popper.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"popper.js","sources":["../../src/dom-utils/getBoundingClientRect.js","../../src/dom-utils/getWindow.js","../../src/dom-utils/getWindowScroll.js","../../src/dom-utils/instanceOf.js","../../src/dom-utils/getHTMLElementScroll.js","../../src/dom-utils/getNodeScroll.js","../../src/dom-utils/getNodeName.js","../../src/dom-utils/getDocumentElement.js","../../src/dom-utils/getWindowScrollBarX.js","../../src/dom-utils/getComputedStyle.js","../../src/dom-utils/isScrollParent.js","../../src/dom-utils/getCompositeRect.js","../../src/dom-utils/getLayoutRect.js","../../src/dom-utils/getParentNode.js","../../src/dom-utils/getScrollParent.js","../../src/dom-utils/listScrollParents.js","../../src/dom-utils/isTableElement.js","../../src/dom-utils/getOffsetParent.js","../../src/enums.js","../../src/utils/orderModifiers.js","../../src/utils/debounce.js","../../src/utils/format.js","../../src/utils/validateModifiers.js","../../src/utils/uniqueBy.js","../../src/utils/getBasePlacement.js","../../src/utils/mergeByName.js","../../src/dom-utils/getViewportRect.js","../../src/utils/math.js","../../src/dom-utils/getDocumentRect.js","../../src/dom-utils/contains.js","../../src/utils/rectToClientRect.js","../../src/dom-utils/getClippingRect.js","../../src/utils/getVariation.js","../../src/utils/getMainAxisFromPlacement.js","../../src/utils/computeOffsets.js","../../src/utils/getFreshSideObject.js","../../src/utils/mergePaddingObject.js","../../src/utils/expandToHashMap.js","../../src/utils/detectOverflow.js","../../src/createPopper.js","../../src/modifiers/eventListeners.js","../../src/modifiers/popperOffsets.js","../../src/modifiers/computeStyles.js","../../src/modifiers/applyStyles.js","../../src/modifiers/offset.js","../../src/utils/getOppositePlacement.js","../../src/utils/getOppositeVariationPlacement.js","../../src/utils/computeAutoPlacement.js","../../src/modifiers/flip.js","../../src/utils/getAltAxis.js","../../src/utils/within.js","../../src/modifiers/preventOverflow.js","../../src/modifiers/arrow.js","../../src/modifiers/hide.js","../../src/popper-lite.js","../../src/popper.js"],"sourcesContent":["// @flow\nimport type { ClientRectObject, VirtualElement } from '../types';\n// import { isHTMLElement } from './instanceOf';\n\nexport default function getBoundingClientRect(\n element: Element | VirtualElement,\n // eslint-disable-next-line unused-imports/no-unused-vars\n includeScale: boolean = false\n): ClientRectObject {\n const rect = element.getBoundingClientRect();\n let scaleX = 1;\n let scaleY = 1;\n\n // FIXME:\n // `offsetWidth` returns an integer while `getBoundingClientRect`\n // returns a float. This results in `scaleX` or `scaleY` being\n // non-1 when it should be for elements that aren't a full pixel in\n // width or height.\n // if (isHTMLElement(element) && includeScale) {\n // const offsetHeight = element.offsetHeight;\n // const offsetWidth = element.offsetWidth;\n\n // // Do not attempt to divide by 0, otherwise we get `Infinity` as scale\n // // Fallback to 1 in case both values are `0`\n // if (offsetWidth > 0) {\n // scaleX = rect.width / offsetWidth || 1;\n // }\n // if (offsetHeight > 0) {\n // scaleY = rect.height / offsetHeight || 1;\n // }\n // }\n\n return {\n width: rect.width / scaleX,\n height: rect.height / scaleY,\n top: rect.top / scaleY,\n right: rect.right / scaleX,\n bottom: rect.bottom / scaleY,\n left: rect.left / scaleX,\n x: rect.left / scaleX,\n y: rect.top / scaleY,\n };\n}\n","// @flow\nimport type { Window } from '../types';\ndeclare function getWindow(node: Node | Window): Window;\n\nexport default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n const ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}\n","// @flow\nimport getWindow from './getWindow';\nimport type { Window } from '../types';\n\nexport default function getWindowScroll(node: Node | Window) {\n const win = getWindow(node);\n const scrollLeft = win.pageXOffset;\n const scrollTop = win.pageYOffset;\n\n return {\n scrollLeft,\n scrollTop,\n };\n}\n","// @flow\nimport getWindow from './getWindow';\n\ndeclare function isElement(node: mixed): boolean %checks(node instanceof\n Element);\nfunction isElement(node) {\n const OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\ndeclare function isHTMLElement(node: mixed): boolean %checks(node instanceof\n HTMLElement);\nfunction isHTMLElement(node) {\n const OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\ndeclare function isShadowRoot(node: mixed): boolean %checks(node instanceof\n ShadowRoot);\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n const OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };\n","// @flow\n\nexport default function getHTMLElementScroll(element: HTMLElement) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop,\n };\n}\n","// @flow\nimport getWindowScroll from './getWindowScroll';\nimport getWindow from './getWindow';\nimport { isHTMLElement } from './instanceOf';\nimport getHTMLElementScroll from './getHTMLElementScroll';\nimport type { Window } from '../types';\n\nexport default function getNodeScroll(node: Node | Window) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}\n","// @flow\nimport type { Window } from '../types';\n\nexport default function getNodeName(element: ?Node | Window): ?string {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}\n","// @flow\nimport { isElement } from './instanceOf';\nimport type { Window } from '../types';\n\nexport default function getDocumentElement(\n element: Element | Window\n): HTMLElement {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return (\n (isElement(element)\n ? element.ownerDocument\n : // $FlowFixMe[prop-missing]\n element.document) || window.document\n ).documentElement;\n}\n","// @flow\nimport getBoundingClientRect from './getBoundingClientRect';\nimport getDocumentElement from './getDocumentElement';\nimport getWindowScroll from './getWindowScroll';\n\nexport default function getWindowScrollBarX(element: Element): number {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return (\n getBoundingClientRect(getDocumentElement(element)).left +\n getWindowScroll(element).scrollLeft\n );\n}\n","// @flow\nimport getWindow from './getWindow';\n\nexport default function getComputedStyle(\n element: Element\n): CSSStyleDeclaration {\n return getWindow(element).getComputedStyle(element);\n}\n","// @flow\nimport getComputedStyle from './getComputedStyle';\n\nexport default function isScrollParent(element: HTMLElement): boolean {\n // Firefox wants us to check `-x` and `-y` variations as well\n const { overflow, overflowX, overflowY } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}\n","// @flow\nimport type { Rect, VirtualElement, Window } from '../types';\nimport getBoundingClientRect from './getBoundingClientRect';\nimport getNodeScroll from './getNodeScroll';\nimport getNodeName from './getNodeName';\nimport { isHTMLElement } from './instanceOf';\nimport getWindowScrollBarX from './getWindowScrollBarX';\nimport getDocumentElement from './getDocumentElement';\nimport isScrollParent from './isScrollParent';\n\nfunction isElementScaled(element: HTMLElement) {\n const rect = element.getBoundingClientRect();\n const scaleX = rect.width / element.offsetWidth || 1;\n const scaleY = rect.height / element.offsetHeight || 1;\n\n return scaleX !== 1 || scaleY !== 1;\n}\n\n// Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\nexport default function getCompositeRect(\n elementOrVirtualElement: Element | VirtualElement,\n offsetParent: Element | Window,\n isFixed: boolean = false\n): Rect {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const offsetParentIsScaled =\n isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const rect = getBoundingClientRect(\n elementOrVirtualElement,\n offsetParentIsScaled\n );\n\n let scroll = { scrollLeft: 0, scrollTop: 0 };\n let offsets = { x: 0, y: 0 };\n\n if (isOffsetParentAnElement || (!isOffsetParentAnElement && !isFixed)) {\n if (\n getNodeName(offsetParent) !== 'body' ||\n // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)\n ) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height,\n };\n}\n","// @flow\nimport type { Rect } from '../types';\nimport getBoundingClientRect from './getBoundingClientRect';\n\n// Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\nexport default function getLayoutRect(element: HTMLElement): Rect {\n const clientRect = getBoundingClientRect(element);\n\n // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n let width = element.offsetWidth;\n let height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width,\n height,\n };\n}\n","// @flow\nimport getNodeName from './getNodeName';\nimport getDocumentElement from './getDocumentElement';\nimport { isShadowRoot } from './instanceOf';\n\nexport default function getParentNode(element: Node | ShadowRoot): Node {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (\n // this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || // DOM Element detected\n (isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n );\n}\n","// @flow\nimport getParentNode from './getParentNode';\nimport isScrollParent from './isScrollParent';\nimport getNodeName from './getNodeName';\nimport { isHTMLElement } from './instanceOf';\n\nexport default function getScrollParent(node: Node): HTMLElement {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}\n","// @flow\nimport getScrollParent from './getScrollParent';\nimport getParentNode from './getParentNode';\nimport getWindow from './getWindow';\nimport type { Window, VisualViewport } from '../types';\nimport isScrollParent from './isScrollParent';\n\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\nexport default function listScrollParents(\n element: Node,\n list: Array = []\n): Array {\n const scrollParent = getScrollParent(element);\n const isBody = scrollParent === element.ownerDocument?.body;\n const win = getWindow(scrollParent);\n const target = isBody\n ? [win].concat(\n win.visualViewport || [],\n isScrollParent(scrollParent) ? scrollParent : []\n )\n : scrollParent;\n const updatedList = list.concat(target);\n\n return isBody\n ? updatedList\n : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}\n","// @flow\nimport getNodeName from './getNodeName';\n\nexport default function isTableElement(element: Element): boolean {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}\n","// @flow\nimport getWindow from './getWindow';\nimport getNodeName from './getNodeName';\nimport getComputedStyle from './getComputedStyle';\nimport { isHTMLElement } from './instanceOf';\nimport isTableElement from './isTableElement';\nimport getParentNode from './getParentNode';\n\nfunction getTrueOffsetParent(element: Element): ?Element {\n if (\n !isHTMLElement(element) ||\n // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed'\n ) {\n return null;\n }\n\n return element.offsetParent;\n}\n\n// `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\nfunction getContainingBlock(element: Element) {\n const isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n const isIE = navigator.userAgent.indexOf('Trident') !== -1;\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n const elementCss = getComputedStyle(element);\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n let currentNode = getParentNode(element);\n\n while (\n isHTMLElement(currentNode) &&\n ['html', 'body'].indexOf(getNodeName(currentNode)) < 0\n ) {\n const css = getComputedStyle(currentNode);\n\n // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n if (\n css.transform !== 'none' ||\n css.perspective !== 'none' ||\n css.contain === 'paint' ||\n ['transform', 'perspective'].indexOf(css.willChange) !== -1 ||\n (isFirefox && css.willChange === 'filter') ||\n (isFirefox && css.filter && css.filter !== 'none')\n ) {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nexport default function getOffsetParent(element: Element) {\n const window = getWindow(element);\n\n let offsetParent = getTrueOffsetParent(element);\n\n while (\n offsetParent &&\n isTableElement(offsetParent) &&\n getComputedStyle(offsetParent).position === 'static'\n ) {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (\n offsetParent &&\n (getNodeName(offsetParent) === 'html' ||\n (getNodeName(offsetParent) === 'body' &&\n getComputedStyle(offsetParent).position === 'static'))\n ) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}\n","// @flow\nexport const top: 'top' = 'top';\nexport const bottom: 'bottom' = 'bottom';\nexport const right: 'right' = 'right';\nexport const left: 'left' = 'left';\nexport const auto: 'auto' = 'auto';\nexport type BasePlacement =\n | typeof top\n | typeof bottom\n | typeof right\n | typeof left;\nexport const basePlacements: Array = [top, bottom, right, left];\n\nexport const start: 'start' = 'start';\nexport const end: 'end' = 'end';\nexport type Variation = typeof start | typeof end;\n\nexport const clippingParents: 'clippingParents' = 'clippingParents';\nexport const viewport: 'viewport' = 'viewport';\nexport type Boundary =\n | HTMLElement\n | Array\n | typeof clippingParents;\nexport type RootBoundary = typeof viewport | 'document';\n\nexport const popper: 'popper' = 'popper';\nexport const reference: 'reference' = 'reference';\nexport type Context = typeof popper | typeof reference;\n\nexport type VariationPlacement =\n | 'top-start'\n | 'top-end'\n | 'bottom-start'\n | 'bottom-end'\n | 'right-start'\n | 'right-end'\n | 'left-start'\n | 'left-end';\nexport type AutoPlacement = 'auto' | 'auto-start' | 'auto-end';\nexport type ComputedPlacement = VariationPlacement | BasePlacement;\nexport type Placement = AutoPlacement | BasePlacement | VariationPlacement;\n\nexport const variationPlacements: Array = basePlacements.reduce(\n (acc: Array, placement: BasePlacement) =>\n acc.concat([(`${placement}-${start}`: any), (`${placement}-${end}`: any)]),\n []\n);\nexport const placements: Array = [...basePlacements, auto].reduce(\n (\n acc: Array,\n placement: BasePlacement | typeof auto\n ): Array =>\n acc.concat([\n placement,\n (`${placement}-${start}`: any),\n (`${placement}-${end}`: any),\n ]),\n []\n);\n\n// modifiers that need to read the DOM\nexport const beforeRead: 'beforeRead' = 'beforeRead';\nexport const read: 'read' = 'read';\nexport const afterRead: 'afterRead' = 'afterRead';\n// pure-logic modifiers\nexport const beforeMain: 'beforeMain' = 'beforeMain';\nexport const main: 'main' = 'main';\nexport const afterMain: 'afterMain' = 'afterMain';\n// modifier with the purpose to write to the DOM (or write into a framework state)\nexport const beforeWrite: 'beforeWrite' = 'beforeWrite';\nexport const write: 'write' = 'write';\nexport const afterWrite: 'afterWrite' = 'afterWrite';\nexport const modifierPhases: Array = [\n beforeRead,\n read,\n afterRead,\n beforeMain,\n main,\n afterMain,\n beforeWrite,\n write,\n afterWrite,\n];\n\nexport type ModifierPhases =\n | typeof beforeRead\n | typeof read\n | typeof afterRead\n | typeof beforeMain\n | typeof main\n | typeof afterMain\n | typeof beforeWrite\n | typeof write\n | typeof afterWrite;\n","// @flow\nimport type { Modifier } from '../types';\nimport { modifierPhases } from '../enums';\n\n// source: https://stackoverflow.com/questions/49875255\nfunction order(modifiers) {\n const map = new Map();\n const visited = new Set();\n const result = [];\n\n modifiers.forEach(modifier => {\n map.set(modifier.name, modifier);\n });\n\n // On visiting object, check for its dependencies and visit them recursively\n function sort(modifier: Modifier) {\n visited.add(modifier.name);\n\n const requires = [\n ...(modifier.requires || []),\n ...(modifier.requiresIfExists || []),\n ];\n\n requires.forEach(dep => {\n if (!visited.has(dep)) {\n const depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n\n result.push(modifier);\n }\n\n modifiers.forEach(modifier => {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n\n return result;\n}\n\nexport default function orderModifiers(\n modifiers: Array>\n): Array> {\n // order based on dependencies\n const orderedModifiers = order(modifiers);\n\n // order based on phase\n return modifierPhases.reduce((acc, phase) => {\n return acc.concat(\n orderedModifiers.filter(modifier => modifier.phase === phase)\n );\n }, []);\n}\n","// @flow\n\nexport default function debounce(fn: Function): () => Promise {\n let pending;\n return () => {\n if (!pending) {\n pending = new Promise(resolve => {\n Promise.resolve().then(() => {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}\n","// @flow\n\nexport default function format(str: string, ...args: Array) {\n return [...args].reduce((p, c) => p.replace(/%s/, c), str);\n}\n","// @flow\nimport format from './format';\nimport { modifierPhases } from '../enums';\n\nconst INVALID_MODIFIER_ERROR =\n 'Popper: modifier \"%s\" provided an invalid %s property, expected %s but got %s';\nconst MISSING_DEPENDENCY_ERROR =\n 'Popper: modifier \"%s\" requires \"%s\", but \"%s\" modifier is not available';\nconst VALID_PROPERTIES = [\n 'name',\n 'enabled',\n 'phase',\n 'fn',\n 'effect',\n 'requires',\n 'options',\n];\n\nexport default function validateModifiers(modifiers: Array): void {\n modifiers.forEach((modifier) => {\n [...Object.keys(modifier), ...VALID_PROPERTIES]\n // IE11-compatible replacement for `new Set(iterable)`\n .filter((value, index, self) => self.indexOf(value) === index)\n .forEach((key) => {\n switch (key) {\n case 'name':\n if (typeof modifier.name !== 'string') {\n console.error(\n format(\n INVALID_MODIFIER_ERROR,\n String(modifier.name),\n '\"name\"',\n '\"string\"',\n `\"${String(modifier.name)}\"`\n )\n );\n }\n break;\n case 'enabled':\n if (typeof modifier.enabled !== 'boolean') {\n console.error(\n format(\n INVALID_MODIFIER_ERROR,\n modifier.name,\n '\"enabled\"',\n '\"boolean\"',\n `\"${String(modifier.enabled)}\"`\n )\n );\n }\n break;\n case 'phase':\n if (modifierPhases.indexOf(modifier.phase) < 0) {\n console.error(\n format(\n INVALID_MODIFIER_ERROR,\n modifier.name,\n '\"phase\"',\n `either ${modifierPhases.join(', ')}`,\n `\"${String(modifier.phase)}\"`\n )\n );\n }\n break;\n case 'fn':\n if (typeof modifier.fn !== 'function') {\n console.error(\n format(\n INVALID_MODIFIER_ERROR,\n modifier.name,\n '\"fn\"',\n '\"function\"',\n `\"${String(modifier.fn)}\"`\n )\n );\n }\n break;\n case 'effect':\n if (\n modifier.effect != null &&\n typeof modifier.effect !== 'function'\n ) {\n console.error(\n format(\n INVALID_MODIFIER_ERROR,\n modifier.name,\n '\"effect\"',\n '\"function\"',\n `\"${String(modifier.fn)}\"`\n )\n );\n }\n break;\n case 'requires':\n if (\n modifier.requires != null &&\n !Array.isArray(modifier.requires)\n ) {\n console.error(\n format(\n INVALID_MODIFIER_ERROR,\n modifier.name,\n '\"requires\"',\n '\"array\"',\n `\"${String(modifier.requires)}\"`\n )\n );\n }\n break;\n case 'requiresIfExists':\n if (!Array.isArray(modifier.requiresIfExists)) {\n console.error(\n format(\n INVALID_MODIFIER_ERROR,\n modifier.name,\n '\"requiresIfExists\"',\n '\"array\"',\n `\"${String(modifier.requiresIfExists)}\"`\n )\n );\n }\n break;\n case 'options':\n case 'data':\n break;\n default:\n console.error(\n `PopperJS: an invalid property has been provided to the \"${\n modifier.name\n }\" modifier, valid properties are ${VALID_PROPERTIES.map(\n (s) => `\"${s}\"`\n ).join(', ')}; but \"${key}\" was provided.`\n );\n }\n\n modifier.requires &&\n modifier.requires.forEach((requirement) => {\n if (modifiers.find((mod) => mod.name === requirement) == null) {\n console.error(\n format(\n MISSING_DEPENDENCY_ERROR,\n String(modifier.name),\n requirement,\n requirement\n )\n );\n }\n });\n });\n });\n}\n","// @flow\n\nexport default function uniqueBy(arr: Array, fn: T => any): Array {\n const identifiers = new Set();\n\n return arr.filter(item => {\n const identifier = fn(item);\n\n if (!identifiers.has(identifier)) {\n identifiers.add(identifier);\n return true;\n }\n });\n}\n","// @flow\nimport { type BasePlacement, type Placement, auto } from '../enums';\n\nexport default function getBasePlacement(\n placement: Placement | typeof auto\n): BasePlacement {\n return (placement.split('-')[0]: any);\n}\n","// @flow\nimport type { Modifier } from '../types';\n\nexport default function mergeByName(\n modifiers: Array<$Shape>>\n): Array<$Shape>> {\n const merged = modifiers.reduce((merged, current) => {\n const existing = merged[current.name];\n merged[current.name] = existing\n ? {\n ...existing,\n ...current,\n options: { ...existing.options, ...current.options },\n data: { ...existing.data, ...current.data },\n }\n : current;\n return merged;\n }, {});\n\n // IE11 does not support Object.values\n return Object.keys(merged).map(key => merged[key]);\n}\n","// @flow\nimport getWindow from './getWindow';\nimport getDocumentElement from './getDocumentElement';\nimport getWindowScrollBarX from './getWindowScrollBarX';\n\nexport default function getViewportRect(element: Element) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n\n // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n // can be obscured underneath it.\n // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n // if it isn't open, so if this isn't available, the popper will be detected\n // to overflow the bottom of the screen too early.\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n\n // Uses Layout Viewport (like Chrome; Safari does not currently)\n // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n // errors due to floating point numbers, so we need to check precision.\n // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n\n // Feature detection fails in mobile emulation mode in Chrome.\n // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n // 0.001\n // Fallback here: \"Not Safari\" userAgent\n if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width,\n height,\n x: x + getWindowScrollBarX(element),\n y,\n };\n}\n","// @flow\nexport const max = Math.max;\nexport const min = Math.min;\nexport const round = Math.round;\n","// @flow\nimport type { Rect } from '../types';\nimport getDocumentElement from './getDocumentElement';\nimport getComputedStyle from './getComputedStyle';\nimport getWindowScrollBarX from './getWindowScrollBarX';\nimport getWindowScroll from './getWindowScroll';\nimport { max } from '../utils/math';\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\nexport default function getDocumentRect(element: HTMLElement): Rect {\n const html = getDocumentElement(element);\n const winScroll = getWindowScroll(element);\n const body = element.ownerDocument?.body;\n\n const width = max(\n html.scrollWidth,\n html.clientWidth,\n body ? body.scrollWidth : 0,\n body ? body.clientWidth : 0\n );\n const height = max(\n html.scrollHeight,\n html.clientHeight,\n body ? body.scrollHeight : 0,\n body ? body.clientHeight : 0\n );\n\n let x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n const y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return { width, height, x, y };\n}\n","// @flow\nimport { isShadowRoot } from './instanceOf';\n\nexport default function contains(parent: Element, child: Element) {\n const rootNode = child.getRootNode && child.getRootNode();\n\n // First, attempt with faster native method\n if (parent.contains(child)) {\n return true;\n }\n // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n let next = child;\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n }\n // $FlowFixMe[prop-missing]: need a better way to handle this...\n next = next.parentNode || next.host;\n } while (next);\n }\n\n // Give up, the result is false\n return false;\n}\n","// @flow\nimport type { Rect, ClientRectObject } from '../types';\n\nexport default function rectToClientRect(rect: Rect): ClientRectObject {\n return {\n ...rect,\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height,\n };\n}\n","// @flow\nimport type { ClientRectObject } from '../types';\nimport type { Boundary, RootBoundary } from '../enums';\nimport { viewport } from '../enums';\nimport getViewportRect from './getViewportRect';\nimport getDocumentRect from './getDocumentRect';\nimport listScrollParents from './listScrollParents';\nimport getOffsetParent from './getOffsetParent';\nimport getDocumentElement from './getDocumentElement';\nimport getComputedStyle from './getComputedStyle';\nimport { isElement, isHTMLElement } from './instanceOf';\nimport getBoundingClientRect from './getBoundingClientRect';\nimport getParentNode from './getParentNode';\nimport contains from './contains';\nimport getNodeName from './getNodeName';\nimport rectToClientRect from '../utils/rectToClientRect';\nimport { max, min } from '../utils/math';\n\nfunction getInnerBoundingClientRect(element: Element) {\n const rect = getBoundingClientRect(element);\n\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n\n return rect;\n}\n\nfunction getClientRectFromMixedType(\n element: Element,\n clippingParent: Element | RootBoundary\n): ClientRectObject {\n return clippingParent === viewport\n ? rectToClientRect(getViewportRect(element))\n : isHTMLElement(clippingParent)\n ? getInnerBoundingClientRect(clippingParent)\n : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n}\n\n// A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\nfunction getClippingParents(element: Element): Array {\n const clippingParents = listScrollParents(getParentNode(element));\n const canEscapeClipping =\n ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n const clipperElement =\n canEscapeClipping && isHTMLElement(element)\n ? getOffsetParent(element)\n : element;\n\n if (!isElement(clipperElement)) {\n return [];\n }\n\n // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n return clippingParents.filter(\n (clippingParent) =>\n isElement(clippingParent) &&\n contains(clippingParent, clipperElement) &&\n getNodeName(clippingParent) !== 'body'\n );\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping parents\nexport default function getClippingRect(\n element: Element,\n boundary: Boundary,\n rootBoundary: RootBoundary\n): ClientRectObject {\n const mainClippingParents =\n boundary === 'clippingParents'\n ? getClippingParents(element)\n : [].concat(boundary);\n const clippingParents = [...mainClippingParents, rootBoundary];\n const firstClippingParent = clippingParents[0];\n\n const clippingRect = clippingParents.reduce((accRect, clippingParent) => {\n const rect = getClientRectFromMixedType(element, clippingParent);\n\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent));\n\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n\n return clippingRect;\n}\n","// @flow\nimport { type Variation, type Placement } from '../enums';\n\nexport default function getVariation(placement: Placement): ?Variation {\n return (placement.split('-')[1]: any);\n}\n","// @flow\nimport type { Placement } from '../enums';\n\nexport default function getMainAxisFromPlacement(\n placement: Placement\n): 'x' | 'y' {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}\n","// @flow\nimport getBasePlacement from './getBasePlacement';\nimport getVariation from './getVariation';\nimport getMainAxisFromPlacement from './getMainAxisFromPlacement';\nimport type {\n Rect,\n PositioningStrategy,\n Offsets,\n ClientRectObject,\n} from '../types';\nimport { top, right, bottom, left, start, end, type Placement } from '../enums';\n\nexport default function computeOffsets({\n reference,\n element,\n placement,\n}: {\n reference: Rect | ClientRectObject,\n element: Rect | ClientRectObject,\n strategy: PositioningStrategy,\n placement?: Placement,\n}): Offsets {\n const basePlacement = placement ? getBasePlacement(placement) : null;\n const variation = placement ? getVariation(placement) : null;\n const commonX = reference.x + reference.width / 2 - element.width / 2;\n const commonY = reference.y + reference.height / 2 - element.height / 2;\n\n let offsets;\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height,\n };\n break;\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height,\n };\n break;\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY,\n };\n break;\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY,\n };\n break;\n default:\n offsets = {\n x: reference.x,\n y: reference.y,\n };\n }\n\n const mainAxis = basePlacement\n ? getMainAxisFromPlacement(basePlacement)\n : null;\n\n if (mainAxis != null) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] =\n offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n case end:\n offsets[mainAxis] =\n offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n default:\n }\n }\n\n return offsets;\n}\n","// @flow\nimport type { SideObject } from '../types';\n\nexport default function getFreshSideObject(): SideObject {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n };\n}\n","// @flow\nimport type { SideObject } from '../types';\nimport getFreshSideObject from './getFreshSideObject';\n\nexport default function mergePaddingObject(\n paddingObject: $Shape\n): SideObject {\n return {\n ...getFreshSideObject(),\n ...paddingObject,\n };\n}\n","// @flow\n\nexport default function expandToHashMap<\n T: number | string | boolean,\n K: string\n>(value: T, keys: Array): { [key: string]: T } {\n return keys.reduce((hashMap, key) => {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}\n","// @flow\nimport type { State, SideObject, Padding } from '../types';\nimport type { Placement, Boundary, RootBoundary, Context } from '../enums';\nimport getClippingRect from '../dom-utils/getClippingRect';\nimport getDocumentElement from '../dom-utils/getDocumentElement';\nimport getBoundingClientRect from '../dom-utils/getBoundingClientRect';\nimport computeOffsets from './computeOffsets';\nimport rectToClientRect from './rectToClientRect';\nimport {\n clippingParents,\n reference,\n popper,\n bottom,\n top,\n right,\n basePlacements,\n viewport,\n} from '../enums';\nimport { isElement } from '../dom-utils/instanceOf';\nimport mergePaddingObject from './mergePaddingObject';\nimport expandToHashMap from './expandToHashMap';\n\n// eslint-disable-next-line import/no-unused-modules\nexport type Options = {\n placement: Placement,\n boundary: Boundary,\n rootBoundary: RootBoundary,\n elementContext: Context,\n altBoundary: boolean,\n padding: Padding,\n};\n\nexport default function detectOverflow(\n state: State,\n options: $Shape = {}\n): SideObject {\n const {\n placement = state.placement,\n boundary = clippingParents,\n rootBoundary = viewport,\n elementContext = popper,\n altBoundary = false,\n padding = 0,\n } = options;\n\n const paddingObject = mergePaddingObject(\n typeof padding !== 'number'\n ? padding\n : expandToHashMap(padding, basePlacements)\n );\n\n const altContext = elementContext === popper ? reference : popper;\n\n const popperRect = state.rects.popper;\n const element = state.elements[altBoundary ? altContext : elementContext];\n\n const clippingClientRect = getClippingRect(\n isElement(element)\n ? element\n : element.contextElement || getDocumentElement(state.elements.popper),\n boundary,\n rootBoundary\n );\n\n const referenceClientRect = getBoundingClientRect(state.elements.reference);\n\n const popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement,\n });\n\n const popperClientRect = rectToClientRect({\n ...popperRect,\n ...popperOffsets,\n });\n\n const elementClientRect =\n elementContext === popper ? popperClientRect : referenceClientRect;\n\n // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n const overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom:\n elementClientRect.bottom -\n clippingClientRect.bottom +\n paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right:\n elementClientRect.right - clippingClientRect.right + paddingObject.right,\n };\n\n const offsetData = state.modifiersData.offset;\n\n // Offsets can be applied only to the popper element\n if (elementContext === popper && offsetData) {\n const offset = offsetData[placement];\n\n Object.keys(overflowOffsets).forEach((key) => {\n const multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n const axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}\n","// @flow\nimport type {\n State,\n OptionsGeneric,\n Modifier,\n Instance,\n VirtualElement,\n} from './types';\nimport getCompositeRect from './dom-utils/getCompositeRect';\nimport getLayoutRect from './dom-utils/getLayoutRect';\nimport listScrollParents from './dom-utils/listScrollParents';\nimport getOffsetParent from './dom-utils/getOffsetParent';\nimport getComputedStyle from './dom-utils/getComputedStyle';\nimport orderModifiers from './utils/orderModifiers';\nimport debounce from './utils/debounce';\nimport validateModifiers from './utils/validateModifiers';\nimport uniqueBy from './utils/uniqueBy';\nimport getBasePlacement from './utils/getBasePlacement';\nimport mergeByName from './utils/mergeByName';\nimport detectOverflow from './utils/detectOverflow';\nimport { isElement } from './dom-utils/instanceOf';\nimport { auto } from './enums';\n\nconst INVALID_ELEMENT_ERROR =\n 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nconst INFINITE_LOOP_ERROR =\n 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\n\nconst DEFAULT_OPTIONS: OptionsGeneric = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute',\n};\n\ntype PopperGeneratorArgs = {\n defaultModifiers?: Array>,\n defaultOptions?: $Shape>,\n};\n\nfunction areValidElements(...args: Array): boolean {\n return !args.some(\n (element) =>\n !(element && typeof element.getBoundingClientRect === 'function')\n );\n}\n\nexport function popperGenerator(generatorOptions: PopperGeneratorArgs = {}) {\n const {\n defaultModifiers = [],\n defaultOptions = DEFAULT_OPTIONS,\n } = generatorOptions;\n\n return function createPopper>>(\n reference: Element | VirtualElement,\n popper: HTMLElement,\n options: $Shape> = defaultOptions\n ): Instance {\n let state: $Shape = {\n placement: 'bottom',\n orderedModifiers: [],\n options: { ...DEFAULT_OPTIONS, ...defaultOptions },\n modifiersData: {},\n elements: {\n reference,\n popper,\n },\n attributes: {},\n styles: {},\n };\n\n let effectCleanupFns: Array<() => void> = [];\n let isDestroyed = false;\n\n const instance = {\n state,\n setOptions(setOptionsAction) {\n const options =\n typeof setOptionsAction === 'function'\n ? setOptionsAction(state.options)\n : setOptionsAction;\n\n cleanupModifierEffects();\n\n state.options = {\n // $FlowFixMe[exponential-spread]\n ...defaultOptions,\n ...state.options,\n ...options,\n };\n\n state.scrollParents = {\n reference: isElement(reference)\n ? listScrollParents(reference)\n : reference.contextElement\n ? listScrollParents(reference.contextElement)\n : [],\n popper: listScrollParents(popper),\n };\n\n // Orders the modifiers based on their dependencies and `phase`\n // properties\n const orderedModifiers = orderModifiers(\n mergeByName([...defaultModifiers, ...state.options.modifiers])\n );\n\n // Strip out disabled modifiers\n state.orderedModifiers = orderedModifiers.filter((m) => m.enabled);\n\n // Validate the provided modifiers so that the consumer will get warned\n // if one of the modifiers is invalid for any reason\n if (__DEV__) {\n const modifiers = uniqueBy(\n [...orderedModifiers, ...state.options.modifiers],\n ({ name }) => name\n );\n\n validateModifiers(modifiers);\n\n if (getBasePlacement(state.options.placement) === auto) {\n const flipModifier = state.orderedModifiers.find(\n ({ name }) => name === 'flip'\n );\n\n if (!flipModifier) {\n console.error(\n [\n 'Popper: \"auto\" placements require the \"flip\" modifier be',\n 'present and enabled to work.',\n ].join(' ')\n );\n }\n }\n\n const {\n marginTop,\n marginRight,\n marginBottom,\n marginLeft,\n } = getComputedStyle(popper);\n\n // We no longer take into account `margins` on the popper, and it can\n // cause bugs with positioning, so we'll warn the consumer\n if (\n [marginTop, marginRight, marginBottom, marginLeft].some((margin) =>\n parseFloat(margin)\n )\n ) {\n console.warn(\n [\n 'Popper: CSS \"margin\" styles cannot be used to apply padding',\n 'between the popper and its reference element or boundary.',\n 'To replicate margin, use the `offset` modifier, as well as',\n 'the `padding` option in the `preventOverflow` and `flip`',\n 'modifiers.',\n ].join(' ')\n );\n }\n }\n\n runModifierEffects();\n\n return instance.update();\n },\n\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n const { reference, popper } = state.elements;\n\n // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n if (!areValidElements(reference, popper)) {\n if (__DEV__) {\n console.error(INVALID_ELEMENT_ERROR);\n }\n return;\n }\n\n // Store the reference and popper rects to be read by modifiers\n state.rects = {\n reference: getCompositeRect(\n reference,\n getOffsetParent(popper),\n state.options.strategy === 'fixed'\n ),\n popper: getLayoutRect(popper),\n };\n\n // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n state.reset = false;\n\n state.placement = state.options.placement;\n\n // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n state.orderedModifiers.forEach(\n (modifier) =>\n (state.modifiersData[modifier.name] = {\n ...modifier.data,\n })\n );\n\n let __debug_loops__ = 0;\n for (let index = 0; index < state.orderedModifiers.length; index++) {\n if (__DEV__) {\n __debug_loops__ += 1;\n if (__debug_loops__ > 100) {\n console.error(INFINITE_LOOP_ERROR);\n break;\n }\n }\n\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n const { fn, options = {}, name } = state.orderedModifiers[index];\n\n if (typeof fn === 'function') {\n state = fn({ state, options, name, instance }) || state;\n }\n }\n },\n\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce<$Shape>(\n () =>\n new Promise<$Shape>((resolve) => {\n instance.forceUpdate();\n resolve(state);\n })\n ),\n\n destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n },\n };\n\n if (!areValidElements(reference, popper)) {\n if (__DEV__) {\n console.error(INVALID_ELEMENT_ERROR);\n }\n return instance;\n }\n\n instance.setOptions(options).then((state) => {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n });\n\n // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n function runModifierEffects() {\n state.orderedModifiers.forEach(({ name, options = {}, effect }) => {\n if (typeof effect === 'function') {\n const cleanupFn = effect({ state, name, instance, options });\n const noopFn = () => {};\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach((fn) => fn());\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\n\nexport const createPopper = popperGenerator();\n\n// eslint-disable-next-line import/no-unused-modules\nexport { detectOverflow };\n","// @flow\nimport type { ModifierArguments, Modifier } from '../types';\nimport getWindow from '../dom-utils/getWindow';\n\n// eslint-disable-next-line import/no-unused-modules\nexport type Options = {\n scroll: boolean,\n resize: boolean,\n};\n\nconst passive = { passive: true };\n\nfunction effect({ state, instance, options }: ModifierArguments) {\n const { scroll = true, resize = true } = options;\n\n const window = getWindow(state.elements.popper);\n const scrollParents = [\n ...state.scrollParents.reference,\n ...state.scrollParents.popper,\n ];\n\n if (scroll) {\n scrollParents.forEach(scrollParent => {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return () => {\n if (scroll) {\n scrollParents.forEach(scrollParent => {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n}\n\n// eslint-disable-next-line import/no-unused-modules\nexport type EventListenersModifier = Modifier<'eventListeners', Options>;\nexport default ({\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: () => {},\n effect,\n data: {},\n}: EventListenersModifier);\n","// @flow\nimport type { ModifierArguments, Modifier } from '../types';\nimport computeOffsets from '../utils/computeOffsets';\n\nfunction popperOffsets({ state, name }: ModifierArguments<{||}>) {\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement,\n });\n}\n\n// eslint-disable-next-line import/no-unused-modules\nexport type PopperOffsetsModifier = Modifier<'popperOffsets', {||}>;\nexport default ({\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {},\n}: PopperOffsetsModifier);\n","// @flow\nimport type {\n PositioningStrategy,\n Offsets,\n Modifier,\n ModifierArguments,\n Rect,\n Window,\n} from '../types';\nimport {\n type BasePlacement,\n type Variation,\n top,\n left,\n right,\n bottom,\n end,\n} from '../enums';\nimport getOffsetParent from '../dom-utils/getOffsetParent';\nimport getWindow from '../dom-utils/getWindow';\nimport getDocumentElement from '../dom-utils/getDocumentElement';\nimport getComputedStyle from '../dom-utils/getComputedStyle';\nimport getBasePlacement from '../utils/getBasePlacement';\nimport getVariation from '../utils/getVariation';\nimport { round } from '../utils/math';\n\n// eslint-disable-next-line import/no-unused-modules\nexport type RoundOffsets = (\n offsets: $Shape<{ x: number, y: number, centerOffset: number }>\n) => Offsets;\n\n// eslint-disable-next-line import/no-unused-modules\nexport type Options = {\n gpuAcceleration: boolean,\n adaptive: boolean,\n roundOffsets?: boolean | RoundOffsets,\n};\n\nconst unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto',\n};\n\n// Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\nfunction roundOffsetsByDPR({ x, y }): Offsets {\n const win: Window = window;\n const dpr = win.devicePixelRatio || 1;\n\n return {\n x: round(round(x * dpr) / dpr) || 0,\n y: round(round(y * dpr) / dpr) || 0,\n };\n}\n\nexport function mapToStyles({\n popper,\n popperRect,\n placement,\n variation,\n offsets,\n position,\n gpuAcceleration,\n adaptive,\n roundOffsets,\n}: {\n popper: HTMLElement,\n popperRect: Rect,\n placement: BasePlacement,\n variation: ?Variation,\n offsets: $Shape<{ x: number, y: number, centerOffset: number }>,\n position: PositioningStrategy,\n gpuAcceleration: boolean,\n adaptive: boolean,\n roundOffsets: boolean | RoundOffsets,\n}) {\n let { x = 0, y = 0 } =\n roundOffsets === true\n ? roundOffsetsByDPR(offsets)\n : typeof roundOffsets === 'function'\n ? roundOffsets(offsets)\n : offsets;\n\n const hasX = offsets.hasOwnProperty('x');\n const hasY = offsets.hasOwnProperty('y');\n\n let sideX: string = left;\n let sideY: string = top;\n\n const win: Window = window;\n\n if (adaptive) {\n let offsetParent = getOffsetParent(popper);\n let heightProp = 'clientHeight';\n let widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (\n getComputedStyle(offsetParent).position !== 'static' &&\n position === 'absolute'\n ) {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n }\n\n // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n offsetParent = (offsetParent: Element);\n\n if (\n placement === top ||\n ((placement === left || placement === right) && variation === end)\n ) {\n sideY = bottom;\n // $FlowFixMe[prop-missing]\n y -= offsetParent[heightProp] - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (\n placement === left ||\n ((placement === top || placement === bottom) && variation === end)\n ) {\n sideX = right;\n // $FlowFixMe[prop-missing]\n x -= offsetParent[widthProp] - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n const commonStyles = {\n position,\n ...(adaptive && unsetSides),\n };\n\n if (gpuAcceleration) {\n return {\n ...commonStyles,\n [sideY]: hasY ? '0' : '',\n [sideX]: hasX ? '0' : '',\n // Layer acceleration can disable subpixel rendering which causes slightly\n // blurry text on low PPI displays, so we want to use 2D transforms\n // instead\n transform:\n (win.devicePixelRatio || 1) <= 1\n ? `translate(${x}px, ${y}px)`\n : `translate3d(${x}px, ${y}px, 0)`,\n };\n }\n\n return {\n ...commonStyles,\n [sideY]: hasY ? `${y}px` : '',\n [sideX]: hasX ? `${x}px` : '',\n transform: '',\n };\n}\n\nfunction computeStyles({ state, options }: ModifierArguments) {\n const {\n gpuAcceleration = true,\n adaptive = true,\n // defaults to use builtin `roundOffsetsByDPR`\n roundOffsets = true,\n } = options;\n\n if (__DEV__) {\n const transitionProperty =\n getComputedStyle(state.elements.popper).transitionProperty || '';\n\n if (\n adaptive &&\n ['transform', 'top', 'right', 'bottom', 'left'].some(\n (property) => transitionProperty.indexOf(property) >= 0\n )\n ) {\n console.warn(\n [\n 'Popper: Detected CSS transitions on at least one of the following',\n 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".',\n '\\n\\n',\n 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow',\n 'for smooth transitions, or remove these properties from the CSS',\n 'transition declaration on the popper element if only transitioning',\n 'opacity or background-color for example.',\n '\\n\\n',\n 'We recommend using the popper element as a wrapper around an inner',\n 'element that can have any CSS property transitioned for animations.',\n ].join(' ')\n );\n }\n }\n\n const commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration,\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = {\n ...state.styles.popper,\n ...mapToStyles({\n ...commonStyles,\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive,\n roundOffsets,\n }),\n };\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = {\n ...state.styles.arrow,\n ...mapToStyles({\n ...commonStyles,\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets,\n }),\n };\n }\n\n state.attributes.popper = {\n ...state.attributes.popper,\n 'data-popper-placement': state.placement,\n };\n}\n\n// eslint-disable-next-line import/no-unused-modules\nexport type ComputeStylesModifier = Modifier<'computeStyles', Options>;\nexport default ({\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {},\n}: ComputeStylesModifier);\n","// @flow\nimport type { Modifier, ModifierArguments } from '../types';\nimport getNodeName from '../dom-utils/getNodeName';\nimport { isHTMLElement } from '../dom-utils/instanceOf';\n\n// This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles({ state }: ModifierArguments<{||}>) {\n Object.keys(state.elements).forEach((name) => {\n const style = state.styles[name] || {};\n\n const attributes = state.attributes[name] || {};\n const element = state.elements[name];\n\n // arrow is optional + virtual elements\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n Object.assign(element.style, style);\n\n Object.keys(attributes).forEach((name) => {\n const value = attributes[name];\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect({ state }: ModifierArguments<{||}>) {\n const initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0',\n },\n arrow: {\n position: 'absolute',\n },\n reference: {},\n };\n\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return () => {\n Object.keys(state.elements).forEach((name) => {\n const element = state.elements[name];\n const attributes = state.attributes[name] || {};\n\n const styleProperties = Object.keys(\n state.styles.hasOwnProperty(name)\n ? state.styles[name]\n : initialStyles[name]\n );\n\n // Set all values to an empty string to unset them\n const style = styleProperties.reduce((style, property) => {\n style[property] = '';\n return style;\n }, {});\n\n // arrow is optional + virtual elements\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n\n Object.keys(attributes).forEach((attribute) => {\n element.removeAttribute(attribute);\n });\n });\n };\n}\n\n// eslint-disable-next-line import/no-unused-modules\nexport type ApplyStylesModifier = Modifier<'applyStyles', {||}>;\nexport default ({\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect,\n requires: ['computeStyles'],\n}: ApplyStylesModifier);\n","// @flow\nimport type { Placement } from '../enums';\nimport type { ModifierArguments, Modifier, Rect, Offsets } from '../types';\nimport getBasePlacement from '../utils/getBasePlacement';\nimport { top, left, right, placements } from '../enums';\n\ntype OffsetsFunction = ({\n popper: Rect,\n reference: Rect,\n placement: Placement,\n}) => [?number, ?number];\n\ntype Offset = OffsetsFunction | [?number, ?number];\n\n// eslint-disable-next-line import/no-unused-modules\nexport type Options = {\n offset: Offset,\n};\n\nexport function distanceAndSkiddingToXY(\n placement: Placement,\n rects: { popper: Rect, reference: Rect },\n offset: Offset\n): Offsets {\n const basePlacement = getBasePlacement(placement);\n const invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n let [skidding, distance] =\n typeof offset === 'function'\n ? offset({\n ...rects,\n placement,\n })\n : offset;\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n\n return [left, right].indexOf(basePlacement) >= 0\n ? { x: distance, y: skidding }\n : { x: skidding, y: distance };\n}\n\nfunction offset({ state, options, name }: ModifierArguments) {\n const { offset = [0, 0] } = options;\n\n const data = placements.reduce((acc, placement) => {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n\n const { x, y } = data[state.placement];\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n}\n\n// eslint-disable-next-line import/no-unused-modules\nexport type OffsetModifier = Modifier<'offset', Options>;\nexport default ({\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset,\n}: OffsetModifier);\n","// @flow\nimport type { Placement } from '../enums';\n\nconst hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n\nexport default function getOppositePlacement(placement: Placement): Placement {\n return (placement.replace(\n /left|right|bottom|top/g,\n matched => hash[matched]\n ): any);\n}\n","// @flow\nimport type { Placement } from '../enums';\n\nconst hash = { start: 'end', end: 'start' };\n\nexport default function getOppositeVariationPlacement(\n placement: Placement\n): Placement {\n return (placement.replace(/start|end/g, matched => hash[matched]): any);\n}\n","// @flow\nimport type { State, Padding } from '../types';\nimport type {\n Placement,\n ComputedPlacement,\n Boundary,\n RootBoundary,\n} from '../enums';\nimport getVariation from './getVariation';\nimport {\n variationPlacements,\n basePlacements,\n placements as allPlacements,\n} from '../enums';\nimport detectOverflow from './detectOverflow';\nimport getBasePlacement from './getBasePlacement';\n\ntype Options = {\n placement: Placement,\n padding: Padding,\n boundary: Boundary,\n rootBoundary: RootBoundary,\n flipVariations: boolean,\n allowedAutoPlacements?: Array,\n};\n\ntype OverflowsMap = { [ComputedPlacement]: number };\n\nexport default function computeAutoPlacement(\n state: $Shape,\n options: Options = {}\n): Array {\n const {\n placement,\n boundary,\n rootBoundary,\n padding,\n flipVariations,\n allowedAutoPlacements = allPlacements,\n } = options;\n\n const variation = getVariation(placement);\n\n const placements = variation\n ? flipVariations\n ? variationPlacements\n : variationPlacements.filter(\n (placement) => getVariation(placement) === variation\n )\n : basePlacements;\n\n let allowedPlacements = placements.filter(\n (placement) => allowedAutoPlacements.indexOf(placement) >= 0\n );\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n\n if (__DEV__) {\n console.error(\n [\n 'Popper: The `allowedAutoPlacements` option did not allow any',\n 'placements. Ensure the `placement` option matches the variation',\n 'of the allowed placements.',\n 'For example, \"auto\" cannot be used to allow \"bottom-start\".',\n 'Use \"auto-start\" instead.',\n ].join(' ')\n );\n }\n }\n\n // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n const overflows: OverflowsMap = allowedPlacements.reduce((acc, placement) => {\n acc[placement] = detectOverflow(state, {\n placement,\n boundary,\n rootBoundary,\n padding,\n })[getBasePlacement(placement)];\n\n return acc;\n }, {});\n\n return Object.keys(overflows).sort((a, b) => overflows[a] - overflows[b]);\n}\n","// @flow\nimport type { Placement, Boundary, RootBoundary } from '../enums';\nimport type { ModifierArguments, Modifier, Padding } from '../types';\nimport getOppositePlacement from '../utils/getOppositePlacement';\nimport getBasePlacement from '../utils/getBasePlacement';\nimport getOppositeVariationPlacement from '../utils/getOppositeVariationPlacement';\nimport detectOverflow from '../utils/detectOverflow';\nimport computeAutoPlacement from '../utils/computeAutoPlacement';\nimport { bottom, top, start, right, left, auto } from '../enums';\nimport getVariation from '../utils/getVariation';\n\n// eslint-disable-next-line import/no-unused-modules\nexport type Options = {\n mainAxis: boolean,\n altAxis: boolean,\n fallbackPlacements: Array,\n padding: Padding,\n boundary: Boundary,\n rootBoundary: RootBoundary,\n altBoundary: boolean,\n flipVariations: boolean,\n allowedAutoPlacements: Array,\n};\n\nfunction getExpandedFallbackPlacements(placement: Placement): Array {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n const oppositePlacement = getOppositePlacement(placement);\n\n return [\n getOppositeVariationPlacement(placement),\n oppositePlacement,\n getOppositeVariationPlacement(oppositePlacement),\n ];\n}\n\nfunction flip({ state, options, name }: ModifierArguments) {\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n const {\n mainAxis: checkMainAxis = true,\n altAxis: checkAltAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n padding,\n boundary,\n rootBoundary,\n altBoundary,\n flipVariations = true,\n allowedAutoPlacements,\n } = options;\n\n const preferredPlacement = state.options.placement;\n const basePlacement = getBasePlacement(preferredPlacement);\n const isBasePlacement = basePlacement === preferredPlacement;\n\n const fallbackPlacements =\n specifiedFallbackPlacements ||\n (isBasePlacement || !flipVariations\n ? [getOppositePlacement(preferredPlacement)]\n : getExpandedFallbackPlacements(preferredPlacement));\n\n const placements = [preferredPlacement, ...fallbackPlacements].reduce(\n (acc, placement) => {\n return acc.concat(\n getBasePlacement(placement) === auto\n ? computeAutoPlacement(state, {\n placement,\n boundary,\n rootBoundary,\n padding,\n flipVariations,\n allowedAutoPlacements,\n })\n : placement\n );\n },\n []\n );\n\n const referenceRect = state.rects.reference;\n const popperRect = state.rects.popper;\n\n const checksMap = new Map();\n let makeFallbackChecks = true;\n let firstFittingPlacement = placements[0];\n\n for (let i = 0; i < placements.length; i++) {\n const placement = placements[i];\n const basePlacement = getBasePlacement(placement);\n const isStartVariation = getVariation(placement) === start;\n const isVertical = [top, bottom].indexOf(basePlacement) >= 0;\n const len = isVertical ? 'width' : 'height';\n\n const overflow = detectOverflow(state, {\n placement,\n boundary,\n rootBoundary,\n altBoundary,\n padding,\n });\n\n let mainVariationSide: any = isVertical\n ? isStartVariation\n ? right\n : left\n : isStartVariation\n ? bottom\n : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n const altVariationSide: any = getOppositePlacement(mainVariationSide);\n\n const checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(\n overflow[mainVariationSide] <= 0,\n overflow[altVariationSide] <= 0\n );\n }\n\n if (checks.every((check) => check)) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n const numberOfChecks = flipVariations ? 3 : 1;\n\n for (let i = numberOfChecks; i > 0; i--) {\n const fittingPlacement = placements.find((placement) => {\n const checks = checksMap.get(placement);\n if (checks) {\n return checks.slice(0, i).every((check) => check);\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n break;\n }\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n}\n\n// eslint-disable-next-line import/no-unused-modules\nexport type FlipModifier = Modifier<'flip', Options>;\nexport default ({\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: { _skip: false },\n}: FlipModifier);\n","// @flow\n\nexport default function getAltAxis(axis: 'x' | 'y'): 'x' | 'y' {\n return axis === 'x' ? 'y' : 'x';\n}\n","// @flow\nimport { max as mathMax, min as mathMin } from './math';\n\nexport default function within(\n min: number,\n value: number,\n max: number\n): number {\n return mathMax(min, mathMin(value, max));\n}\n","// @flow\nimport { top, left, right, bottom, start } from '../enums';\nimport type { Placement, Boundary, RootBoundary } from '../enums';\nimport type { Rect, ModifierArguments, Modifier, Padding } from '../types';\nimport getBasePlacement from '../utils/getBasePlacement';\nimport getMainAxisFromPlacement from '../utils/getMainAxisFromPlacement';\nimport getAltAxis from '../utils/getAltAxis';\nimport within from '../utils/within';\nimport getLayoutRect from '../dom-utils/getLayoutRect';\nimport getOffsetParent from '../dom-utils/getOffsetParent';\nimport detectOverflow from '../utils/detectOverflow';\nimport getVariation from '../utils/getVariation';\nimport getFreshSideObject from '../utils/getFreshSideObject';\nimport { max as mathMax, min as mathMin } from '../utils/math';\n\ntype TetherOffset =\n | (({\n popper: Rect,\n reference: Rect,\n placement: Placement,\n }) => number)\n | number;\n\n// eslint-disable-next-line import/no-unused-modules\nexport type Options = {\n /* Prevents boundaries overflow on the main axis */\n mainAxis: boolean,\n /* Prevents boundaries overflow on the alternate axis */\n altAxis: boolean,\n /* The area to check the popper is overflowing in */\n boundary: Boundary,\n /* If the popper is not overflowing the main area, fallback to this one */\n rootBoundary: RootBoundary,\n /* Use the reference's \"clippingParents\" boundary context */\n altBoundary: boolean,\n /**\n * Allows the popper to overflow from its boundaries to keep it near its\n * reference element\n */\n tether: boolean,\n /* Offsets when the `tether` option should activate */\n tetherOffset: TetherOffset,\n /* Sets a padding to the provided boundary */\n padding: Padding,\n};\n\nfunction preventOverflow({ state, options, name }: ModifierArguments) {\n const {\n mainAxis: checkMainAxis = true,\n altAxis: checkAltAxis = false,\n boundary,\n rootBoundary,\n altBoundary,\n padding,\n tether = true,\n tetherOffset = 0,\n } = options;\n\n const overflow = detectOverflow(state, {\n boundary,\n rootBoundary,\n padding,\n altBoundary,\n });\n const basePlacement = getBasePlacement(state.placement);\n const variation = getVariation(state.placement);\n const isBasePlacement = !variation;\n const mainAxis = getMainAxisFromPlacement(basePlacement);\n const altAxis = getAltAxis(mainAxis);\n const popperOffsets = state.modifiersData.popperOffsets;\n const referenceRect = state.rects.reference;\n const popperRect = state.rects.popper;\n const tetherOffsetValue =\n typeof tetherOffset === 'function'\n ? tetherOffset({\n ...state.rects,\n placement: state.placement,\n })\n : tetherOffset;\n\n const data = { x: 0, y: 0 };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis || checkAltAxis) {\n const mainSide = mainAxis === 'y' ? top : left;\n const altSide = mainAxis === 'y' ? bottom : right;\n const len = mainAxis === 'y' ? 'height' : 'width';\n const offset = popperOffsets[mainAxis];\n\n const min = popperOffsets[mainAxis] + overflow[mainSide];\n const max = popperOffsets[mainAxis] - overflow[altSide];\n\n const additive = tether ? -popperRect[len] / 2 : 0;\n\n const minLen = variation === start ? referenceRect[len] : popperRect[len];\n const maxLen = variation === start ? -popperRect[len] : -referenceRect[len];\n\n // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n const arrowElement = state.elements.arrow;\n const arrowRect =\n tether && arrowElement\n ? getLayoutRect(arrowElement)\n : { width: 0, height: 0 };\n const arrowPaddingObject = state.modifiersData['arrow#persistent']\n ? state.modifiersData['arrow#persistent'].padding\n : getFreshSideObject();\n const arrowPaddingMin = arrowPaddingObject[mainSide];\n const arrowPaddingMax = arrowPaddingObject[altSide];\n\n // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n const arrowLen = within(0, referenceRect[len], arrowRect[len]);\n\n const minOffset = isBasePlacement\n ? referenceRect[len] / 2 -\n additive -\n arrowLen -\n arrowPaddingMin -\n tetherOffsetValue\n : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;\n const maxOffset = isBasePlacement\n ? -referenceRect[len] / 2 +\n additive +\n arrowLen +\n arrowPaddingMax +\n tetherOffsetValue\n : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;\n\n const arrowOffsetParent =\n state.elements.arrow && getOffsetParent(state.elements.arrow);\n const clientOffset = arrowOffsetParent\n ? mainAxis === 'y'\n ? arrowOffsetParent.clientTop || 0\n : arrowOffsetParent.clientLeft || 0\n : 0;\n\n const offsetModifierValue = state.modifiersData.offset\n ? state.modifiersData.offset[state.placement][mainAxis]\n : 0;\n\n const tetherMin =\n popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;\n const tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;\n\n if (checkMainAxis) {\n const preventedOffset = within(\n tether ? mathMin(min, tetherMin) : min,\n offset,\n tether ? mathMax(max, tetherMax) : max\n );\n\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n const mainSide = mainAxis === 'x' ? top : left;\n const altSide = mainAxis === 'x' ? bottom : right;\n const offset = popperOffsets[altAxis];\n\n const min = offset + overflow[mainSide];\n const max = offset - overflow[altSide];\n\n const preventedOffset = within(\n tether ? mathMin(min, tetherMin) : min,\n offset,\n tether ? mathMax(max, tetherMax) : max\n );\n\n popperOffsets[altAxis] = preventedOffset;\n data[altAxis] = preventedOffset - offset;\n }\n }\n\n state.modifiersData[name] = data;\n}\n\n// eslint-disable-next-line import/no-unused-modules\nexport type PreventOverflowModifier = Modifier<'preventOverflow', Options>;\nexport default ({\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset'],\n}: PreventOverflowModifier);\n","// @flow\nimport type { Modifier, ModifierArguments, Padding, Rect } from '../types';\nimport type { Placement } from '../enums';\nimport getBasePlacement from '../utils/getBasePlacement';\nimport getLayoutRect from '../dom-utils/getLayoutRect';\nimport contains from '../dom-utils/contains';\nimport getOffsetParent from '../dom-utils/getOffsetParent';\nimport getMainAxisFromPlacement from '../utils/getMainAxisFromPlacement';\nimport within from '../utils/within';\nimport mergePaddingObject from '../utils/mergePaddingObject';\nimport expandToHashMap from '../utils/expandToHashMap';\nimport { left, right, basePlacements, top, bottom } from '../enums';\nimport { isHTMLElement } from '../dom-utils/instanceOf';\n\n// eslint-disable-next-line import/no-unused-modules\nexport type Options = {\n element: HTMLElement | string | null,\n padding:\n | Padding\n | (({|\n popper: Rect,\n reference: Rect,\n placement: Placement,\n |}) => Padding),\n};\n\nconst toPaddingObject = (padding, state) => {\n padding =\n typeof padding === 'function'\n ? padding({ ...state.rects, placement: state.placement })\n : padding;\n\n return mergePaddingObject(\n typeof padding !== 'number'\n ? padding\n : expandToHashMap(padding, basePlacements)\n );\n};\n\nfunction arrow({ state, name, options }: ModifierArguments) {\n const arrowElement = state.elements.arrow;\n const popperOffsets = state.modifiersData.popperOffsets;\n const basePlacement = getBasePlacement(state.placement);\n const axis = getMainAxisFromPlacement(basePlacement);\n const isVertical = [left, right].indexOf(basePlacement) >= 0;\n const len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n const paddingObject = toPaddingObject(options.padding, state);\n const arrowRect = getLayoutRect(arrowElement);\n const minProp = axis === 'y' ? top : left;\n const maxProp = axis === 'y' ? bottom : right;\n\n const endDiff =\n state.rects.reference[len] +\n state.rects.reference[axis] -\n popperOffsets[axis] -\n state.rects.popper[len];\n const startDiff = popperOffsets[axis] - state.rects.reference[axis];\n\n const arrowOffsetParent = getOffsetParent(arrowElement);\n const clientSize = arrowOffsetParent\n ? axis === 'y'\n ? arrowOffsetParent.clientHeight || 0\n : arrowOffsetParent.clientWidth || 0\n : 0;\n\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n const min = paddingObject[minProp];\n const max = clientSize - arrowRect[len] - paddingObject[maxProp];\n const center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n const offset = within(min, center, max);\n\n // Prevents breaking syntax highlighting...\n const axisProp: string = axis;\n state.modifiersData[name] = {\n [axisProp]: offset,\n centerOffset: offset - center,\n };\n}\n\nfunction effect({ state, options }: ModifierArguments) {\n let { element: arrowElement = '[data-popper-arrow]' } = options;\n\n if (arrowElement == null) {\n return;\n }\n\n // CSS selector\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (__DEV__) {\n if (!isHTMLElement(arrowElement)) {\n console.error(\n [\n 'Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).',\n 'To use an SVG arrow, wrap it in an HTMLElement that will be used as',\n 'the arrow.',\n ].join(' ')\n );\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n if (__DEV__) {\n console.error(\n [\n 'Popper: \"arrow\" modifier\\'s `element` must be a child of the popper',\n 'element.',\n ].join(' ')\n );\n }\n\n return;\n }\n\n state.elements.arrow = arrowElement;\n}\n\n// eslint-disable-next-line import/no-unused-modules\nexport type ArrowModifier = Modifier<'arrow', Options>;\nexport default ({\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow'],\n}: ArrowModifier);\n","// @flow\nimport type {\n ModifierArguments,\n Modifier,\n Rect,\n SideObject,\n Offsets,\n} from '../types';\nimport { top, bottom, left, right } from '../enums';\nimport detectOverflow from '../utils/detectOverflow';\n\nfunction getSideOffsets(\n overflow: SideObject,\n rect: Rect,\n preventedOffsets: Offsets = { x: 0, y: 0 }\n): SideObject {\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x,\n };\n}\n\nfunction isAnySideFullyClipped(overflow: SideObject): boolean {\n return [top, right, bottom, left].some((side) => overflow[side] >= 0);\n}\n\nfunction hide({ state, name }: ModifierArguments<{||}>) {\n const referenceRect = state.rects.reference;\n const popperRect = state.rects.popper;\n const preventedOffsets = state.modifiersData.preventOverflow;\n\n const referenceOverflow = detectOverflow(state, {\n elementContext: 'reference',\n });\n const popperAltOverflow = detectOverflow(state, {\n altBoundary: true,\n });\n\n const referenceClippingOffsets = getSideOffsets(\n referenceOverflow,\n referenceRect\n );\n const popperEscapeOffsets = getSideOffsets(\n popperAltOverflow,\n popperRect,\n preventedOffsets\n );\n\n const isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n const hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n\n state.modifiersData[name] = {\n referenceClippingOffsets,\n popperEscapeOffsets,\n isReferenceHidden,\n hasPopperEscaped,\n };\n\n state.attributes.popper = {\n ...state.attributes.popper,\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped,\n };\n}\n\n// eslint-disable-next-line import/no-unused-modules\nexport type HideModifier = Modifier<'hide', {||}>;\nexport default ({\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide,\n}: HideModifier);\n","// @flow\nimport { popperGenerator, detectOverflow } from './createPopper';\n\nimport eventListeners from './modifiers/eventListeners';\nimport popperOffsets from './modifiers/popperOffsets';\nimport computeStyles from './modifiers/computeStyles';\nimport applyStyles from './modifiers/applyStyles';\n\nexport type * from './types';\n\nconst defaultModifiers = [\n eventListeners,\n popperOffsets,\n computeStyles,\n applyStyles,\n];\n\nconst createPopper = popperGenerator({ defaultModifiers });\n\n// eslint-disable-next-line import/no-unused-modules\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };\n","// @flow\nimport { popperGenerator, detectOverflow } from './createPopper';\n\nimport eventListeners from './modifiers/eventListeners';\nimport popperOffsets from './modifiers/popperOffsets';\nimport computeStyles from './modifiers/computeStyles';\nimport applyStyles from './modifiers/applyStyles';\nimport offset from './modifiers/offset';\nimport flip from './modifiers/flip';\nimport preventOverflow from './modifiers/preventOverflow';\nimport arrow from './modifiers/arrow';\nimport hide from './modifiers/hide';\n\nexport type * from './types';\n\nconst defaultModifiers = [\n eventListeners,\n popperOffsets,\n computeStyles,\n applyStyles,\n offset,\n flip,\n preventOverflow,\n arrow,\n hide,\n];\n\nconst createPopper = popperGenerator({ defaultModifiers });\n\n// eslint-disable-next-line import/no-unused-modules\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };\n// eslint-disable-next-line import/no-unused-modules\nexport { createPopper as createPopperLite } from './popper-lite';\n// eslint-disable-next-line import/no-unused-modules\nexport * from './modifiers';\n"],"names":["getBoundingClientRect","element","includeScale","rect","scaleX","scaleY","width","height","top","right","bottom","left","x","y","getWindow","node","window","toString","ownerDocument","defaultView","getWindowScroll","win","scrollLeft","pageXOffset","scrollTop","pageYOffset","isElement","OwnElement","Element","isHTMLElement","HTMLElement","isShadowRoot","ShadowRoot","getHTMLElementScroll","getNodeScroll","getNodeName","nodeName","toLowerCase","getDocumentElement","document","documentElement","getWindowScrollBarX","getComputedStyle","isScrollParent","overflow","overflowX","overflowY","test","isElementScaled","offsetWidth","offsetHeight","getCompositeRect","elementOrVirtualElement","offsetParent","isFixed","isOffsetParentAnElement","scroll","offsets","clientLeft","clientTop","getLayoutRect","clientRect","Math","abs","offsetLeft","offsetTop","getParentNode","assignedSlot","parentNode","host","getScrollParent","indexOf","body","listScrollParents","list","scrollParent","isBody","target","concat","visualViewport","updatedList","isTableElement","getTrueOffsetParent","position","getContainingBlock","isFirefox","navigator","userAgent","isIE","elementCss","currentNode","css","transform","perspective","contain","willChange","filter","getOffsetParent","auto","basePlacements","start","end","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","order","modifiers","map","Map","visited","Set","result","forEach","modifier","set","name","sort","add","requires","requiresIfExists","dep","has","depModifier","get","push","orderModifiers","orderedModifiers","phase","debounce","fn","pending","Promise","resolve","then","undefined","format","str","args","p","c","replace","INVALID_MODIFIER_ERROR","MISSING_DEPENDENCY_ERROR","VALID_PROPERTIES","validateModifiers","Object","keys","value","index","self","key","console","error","String","enabled","join","effect","Array","isArray","s","requirement","find","mod","uniqueBy","arr","identifiers","item","identifier","getBasePlacement","split","mergeByName","merged","current","existing","options","data","getViewportRect","html","clientWidth","clientHeight","max","min","round","getDocumentRect","winScroll","scrollWidth","scrollHeight","direction","contains","parent","child","rootNode","getRootNode","next","isSameNode","rectToClientRect","getInnerBoundingClientRect","getClientRectFromMixedType","clippingParent","getClippingParents","canEscapeClipping","clipperElement","getClippingRect","boundary","rootBoundary","mainClippingParents","firstClippingParent","clippingRect","accRect","getVariation","getMainAxisFromPlacement","computeOffsets","basePlacement","variation","commonX","commonY","mainAxis","len","getFreshSideObject","mergePaddingObject","paddingObject","expandToHashMap","hashMap","detectOverflow","state","elementContext","altBoundary","padding","altContext","popperRect","rects","elements","clippingClientRect","contextElement","referenceClientRect","popperOffsets","strategy","popperClientRect","elementClientRect","overflowOffsets","offsetData","modifiersData","offset","multiply","axis","INVALID_ELEMENT_ERROR","INFINITE_LOOP_ERROR","DEFAULT_OPTIONS","areValidElements","some","popperGenerator","generatorOptions","defaultModifiers","defaultOptions","createPopper","attributes","styles","effectCleanupFns","isDestroyed","instance","setOptions","setOptionsAction","cleanupModifierEffects","scrollParents","m","flipModifier","marginTop","marginRight","marginBottom","marginLeft","margin","parseFloat","warn","runModifierEffects","update","forceUpdate","reset","__debug_loops__","length","destroy","onFirstUpdate","cleanupFn","noopFn","passive","resize","addEventListener","removeEventListener","unsetSides","roundOffsetsByDPR","dpr","devicePixelRatio","mapToStyles","gpuAcceleration","adaptive","roundOffsets","hasX","hasOwnProperty","hasY","sideX","sideY","heightProp","widthProp","commonStyles","computeStyles","transitionProperty","property","arrow","applyStyles","style","assign","removeAttribute","setAttribute","initialStyles","styleProperties","attribute","distanceAndSkiddingToXY","invertDistance","skidding","distance","hash","getOppositePlacement","matched","getOppositeVariationPlacement","computeAutoPlacement","flipVariations","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","a","b","getExpandedFallbackPlacements","oppositePlacement","flip","_skip","checkMainAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","preferredPlacement","isBasePlacement","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","i","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","numberOfChecks","fittingPlacement","slice","getAltAxis","within","mathMax","mathMin","preventOverflow","tether","tetherOffset","tetherOffsetValue","mainSide","altSide","additive","minLen","maxLen","arrowElement","arrowRect","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","arrowOffsetParent","clientOffset","offsetModifierValue","tetherMin","tetherMax","preventedOffset","toPaddingObject","minProp","maxProp","endDiff","startDiff","clientSize","centerToReference","center","axisProp","centerOffset","querySelector","getSideOffsets","preventedOffsets","isAnySideFullyClipped","side","hide","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","eventListeners"],"mappings":"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"} \ No newline at end of file diff --git a/public/route-recognizer.js.map b/public/route-recognizer.js.map deleted file mode 100644 index 1c846e3a4d..0000000000 --- a/public/route-recognizer.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"route-recognizer.js","sources":["route-recognizer/util.ts","route-recognizer/dsl.ts","route-recognizer/normalizer.ts","route-recognizer.ts"],"sourcesContent":["const createObject = Object.create;\nexport function createMap() {\n const map: { [key: string]: T | undefined } = createObject(null);\n map[\"__\"] = undefined;\n delete map[\"__\"];\n return map;\n}\n","import { createMap } from \"./util\";\n\nexport interface Delegate {\n contextEntered?(context: string, route: MatchDSL): void;\n willAddRoute?(context: string | undefined, route: string): string;\n}\n\nexport type Opaque = {} | void | null | undefined;\n\nexport interface Route {\n path: string;\n handler: Opaque;\n queryParams?: string[];\n}\n\nexport interface RouteRecognizer {\n delegate: Delegate | undefined;\n add(routes: Route[]): void;\n}\n\nexport interface MatchCallback {\n (match: MatchDSL): void;\n}\n\nexport interface MatchDSL {\n (path: string): ToDSL;\n (path: string, callback: MatchCallback): void;\n}\n\nexport interface ToDSL {\n to(name: string, callback?: MatchCallback): void;\n}\n\nclass Target implements ToDSL {\n path: string;\n matcher: Matcher;\n delegate: Delegate | undefined;\n\n constructor(path: string, matcher: Matcher, delegate: Delegate | undefined) {\n this.path = path;\n this.matcher = matcher;\n this.delegate = delegate;\n }\n\n to(target: string, callback: MatchCallback) {\n let delegate = this.delegate;\n\n if (delegate && delegate.willAddRoute) {\n target = delegate.willAddRoute(this.matcher.target, target);\n }\n\n this.matcher.add(this.path, target);\n\n if (callback) {\n if (callback.length === 0) { throw new Error(\"You must have an argument in the function passed to `to`\"); }\n this.matcher.addChild(this.path, target, callback, this.delegate);\n }\n }\n}\n\nexport class Matcher {\n routes: {\n [path: string]: string | undefined;\n };\n children: {\n [path: string]: Matcher | undefined;\n };\n target: string | undefined;\n\n constructor(target?: string) {\n this.routes = createMap();\n this.children = createMap();\n this.target = target;\n }\n\n add(path: string, target: string) {\n this.routes[path] = target;\n }\n\n addChild(path: string, target: string, callback: MatchCallback, delegate: Delegate | undefined) {\n let matcher = new Matcher(target);\n this.children[path] = matcher;\n\n let match = generateMatch(path, matcher, delegate);\n\n if (delegate && delegate.contextEntered) {\n delegate.contextEntered(target, match);\n }\n\n callback(match);\n }\n}\n\nfunction generateMatch(startingPath: string, matcher: Matcher, delegate: Delegate | undefined): MatchDSL {\n function match(path: string): ToDSL;\n function match(path: string, callback: MatchCallback): void;\n function match(path: string, callback?: MatchCallback): ToDSL | void {\n let fullPath = startingPath + path;\n if (callback) {\n callback(generateMatch(fullPath, matcher, delegate));\n } else {\n return new Target(fullPath, matcher, delegate);\n }\n };\n return match;\n}\n\nfunction addRoute(routeArray: Route[], path: string, handler: any) {\n let len = 0;\n for (let i = 0; i < routeArray.length; i++) {\n len += routeArray[i].path.length;\n }\n\n path = path.substr(len);\n let route = { path: path, handler: handler };\n routeArray.push(route);\n}\n\nfunction eachRoute(baseRoute: Route[], matcher: Matcher, callback: (this: T, routes: Route[]) => void, binding: T) {\n let routes = matcher.routes;\n let paths = Object.keys(routes);\n for (let i = 0; i < paths.length; i++) {\n let path = paths[i];\n let routeArray = baseRoute.slice();\n addRoute(routeArray, path, routes[path]);\n let nested = matcher.children[path];\n if (nested) {\n eachRoute(routeArray, nested, callback, binding);\n } else {\n callback.call(binding, routeArray);\n }\n }\n}\n\nexport default function (this: T, callback: MatchCallback, addRouteCallback?: (routeRecognizer: T, routes: Route[]) => void) {\n let matcher = new Matcher();\n\n callback(generateMatch(\"\", matcher, this.delegate));\n\n eachRoute([], matcher, function(routes: Route[]) {\n if (addRouteCallback) { addRouteCallback(this, routes); }\n else { this.add(routes); }\n }, this);\n}\n","// Normalizes percent-encoded values in `path` to upper-case and decodes percent-encoded\n// values that are not reserved (i.e., unicode characters, emoji, etc). The reserved\n// chars are \"/\" and \"%\".\n// Safe to call multiple times on the same path.\nexport function normalizePath(path: string): string {\n return path.split(\"/\")\n .map(normalizeSegment)\n .join(\"/\");\n}\n\n// We want to ensure the characters \"%\" and \"/\" remain in percent-encoded\n// form when normalizing paths, so replace them with their encoded form after\n// decoding the rest of the path\nconst SEGMENT_RESERVED_CHARS = /%|\\//g;\nexport function normalizeSegment(segment: string) {\n if (segment.length < 3 || segment.indexOf(\"%\") === -1) return segment;\n return decodeURIComponent(segment).replace(SEGMENT_RESERVED_CHARS, encodeURIComponent);\n}\n\n// We do not want to encode these characters when generating dynamic path segments\n// See https://tools.ietf.org/html/rfc3986#section-3.3\n// sub-delims: \"!\", \"$\", \"&\", \"'\", \"(\", \")\", \"*\", \"+\", \",\", \";\", \"=\"\n// others allowed by RFC 3986: \":\", \"@\"\n//\n// First encode the entire path segment, then decode any of the encoded special chars.\n//\n// The chars \"!\", \"'\", \"(\", \")\", \"*\" do not get changed by `encodeURIComponent`,\n// so the possible encoded chars are:\n// ['%24', '%26', '%2B', '%2C', '%3B', '%3D', '%3A', '%40'].\nconst PATH_SEGMENT_ENCODINGS = /%(?:2(?:4|6|B|C)|3(?:B|D|A)|40)/g;\n\nexport function encodePathSegment(str: string) {\n return encodeURIComponent(str).replace(PATH_SEGMENT_ENCODINGS, decodeURIComponent);\n}\n","import { createMap } from \"./route-recognizer/util\";\nimport map, { Delegate, Route, Opaque, MatchCallback } from \"./route-recognizer/dsl\";\nimport { normalizePath, normalizeSegment, encodePathSegment } from \"./route-recognizer/normalizer\";\nexport { Delegate, MatchCallback } from './route-recognizer/dsl';\n\nconst enum CHARS {\n ANY = -1,\n STAR = 42,\n SLASH = 47,\n COLON = 58\n}\n\nconst escapeRegex = /(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\)/g;\n\nconst isArray = Array.isArray;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction getParam(params: Params | null | undefined, key: string): string {\n if (typeof params !== \"object\" || params === null) {\n throw new Error(\"You must pass an object as the second argument to `generate`.\");\n }\n\n if (!hasOwnProperty.call(params, key)) {\n throw new Error(\"You must provide param `\" + key + \"` to `generate`.\");\n }\n\n let value = params[key];\n let str = typeof value === \"string\" ? value : \"\" + value;\n if (str.length === 0) {\n throw new Error(\"You must provide a param `\" + key + \"`.\");\n }\n return str;\n}\n\nconst enum SegmentType {\n Static = 0,\n Dynamic = 1,\n Star = 2,\n Epsilon = 4\n}\n\nconst enum SegmentFlags {\n Static = 2 << SegmentType.Static,\n Dynamic = 2 << SegmentType.Dynamic,\n Star = 2 << SegmentType.Star,\n Epsilon = 2 << SegmentType.Epsilon,\n Named = Dynamic | Star,\n Decoded = Dynamic,\n Counted = Static | Dynamic | Star\n}\n\nconst eachChar: ((segment: Segment, currentState: State) => State)[] = [];\neachChar[SegmentType.Static] = function (segment: Segment, currentState: State) {\n let state = currentState;\n let value = segment.value;\n for (let i = 0; i < value.length; i++) {\n let ch = value.charCodeAt(i);\n state = state.put(ch, false, false);\n }\n return state;\n};\neachChar[SegmentType.Dynamic] = function (_: Segment, currentState: State) {\n return currentState.put(CHARS.SLASH, true, true);\n};\neachChar[SegmentType.Star] = function (_: Segment, currentState: State) {\n return currentState.put(CHARS.ANY, false, true);\n};\neachChar[SegmentType.Epsilon] = function (_: Segment, currentState: State) {\n return currentState;\n};\n\nconst regex: ((segment: Segment) => string)[] = [];\nregex[SegmentType.Static] = function (segment: Segment) {\n return segment.value.replace(escapeRegex, \"\\\\$1\");\n};\nregex[SegmentType.Dynamic] = function () {\n return \"([^/]+)\";\n};\nregex[SegmentType.Star] = function () {\n return \"(.+)\";\n};\nregex[SegmentType.Epsilon] = function () {\n return \"\";\n};\n\nconst generate: ((segment: Segment, params?: Params | null) => string)[] = [];\ngenerate[SegmentType.Static] = function (segment: Segment) {\n return segment.value;\n};\ngenerate[SegmentType.Dynamic] = function (segment: Segment, params?: Params) {\n let value = getParam(params, segment.value);\n if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS) {\n return encodePathSegment(value);\n } else {\n return value;\n }\n};\ngenerate[SegmentType.Star] = function (segment: Segment, params?: Params) {\n return getParam(params, segment.value);\n};\ngenerate[SegmentType.Epsilon] = function () {\n return \"\";\n};\n\n// A Segment represents a segment in the original route description.\n// Each Segment type provides an `eachChar` and `regex` method.\n//\n// The `eachChar` method invokes the callback with one or more character\n// specifications. A character specification consumes one or more input\n// characters.\n//\n// The `regex` method returns a regex fragment for the segment. If the\n// segment is a dynamic of star segment, the regex fragment also includes\n// a capture.\n//\n// A character specification contains:\n//\n// * `validChars`: a String with a list of all valid characters, or\n// * `invalidChars`: a String with a list of all invalid characters\n// * `repeat`: true if the character specification can repeat\ninterface Segment {\n type: SegmentType;\n value: string;\n}\n\nexport interface Params {\n [key: string]: Opaque;\n [key: number]: Opaque;\n queryParams?: QueryParams | null;\n}\n\ninterface PopulatedParsedHandlers {\n names: string[];\n shouldDecodes: any[];\n}\n\nconst EmptyObject = Object.freeze({});\ntype EmptyObject = Readonly<{}>\n\nconst EmptyArray = Object.freeze([]) as ReadonlyArray;\ntype EmptyArray = ReadonlyArray;\n\ninterface EmptyParsedHandlers {\n names: EmptyArray;\n shouldDecodes: EmptyArray;\n}\n\ntype ParsedHandler = PopulatedParsedHandlers | EmptyParsedHandlers;\n\n// The `names` will be populated with the paramter name for each dynamic/star\n// segment. `shouldDecodes` will be populated with a boolean for each dyanamic/star\n// segment, indicating whether it should be decoded during recognition.\nfunction parse(segments: Segment[], route: string, types: [number, number, number]) {\n // normalize route as not starting with a \"/\". Recognition will\n // also normalize.\n if (route.length > 0 && route.charCodeAt(0) === CHARS.SLASH) { route = route.substr(1); }\n\n let parts = route.split(\"/\");\n let names: void | string[] = undefined;\n let shouldDecodes: void | any[] = undefined;\n\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i];\n let flags: SegmentFlags = 0;\n let type: SegmentType = 0;\n\n if (part === \"\") {\n type = SegmentType.Epsilon;\n } else if (part.charCodeAt(0) === CHARS.COLON) {\n type = SegmentType.Dynamic;\n } else if (part.charCodeAt(0) === CHARS.STAR) {\n type = SegmentType.Star;\n } else {\n type = SegmentType.Static;\n }\n\n flags = 2 << type;\n\n if (flags & SegmentFlags.Named) {\n part = part.slice(1);\n names = names || [];\n names.push(part);\n\n shouldDecodes = shouldDecodes || [];\n shouldDecodes.push((flags & SegmentFlags.Decoded) !== 0);\n }\n\n if (flags & SegmentFlags.Counted) {\n types[type]++;\n }\n\n segments.push({\n type,\n value: normalizeSegment(part)\n });\n }\n\n return {\n names: names || EmptyArray,\n shouldDecodes: shouldDecodes || EmptyArray,\n } as ParsedHandler;\n}\n\nfunction isEqualCharSpec(spec: CharSpec, char: number, negate: boolean) {\n return spec.char === char && spec.negate === negate;\n}\n\ninterface EmptyHandler {\n handler: Opaque;\n names: EmptyArray;\n shouldDecodes: EmptyArray;\n}\n\ninterface PopulatedHandler {\n handler: Opaque;\n names: string [];\n shouldDecodes: boolean[];\n}\n\ntype Handler = EmptyHandler | PopulatedHandler;\n\n// A State has a character specification and (`charSpec`) and a list of possible\n// subsequent states (`nextStates`).\n//\n// If a State is an accepting state, it will also have several additional\n// properties:\n//\n// * `regex`: A regular expression that is used to extract parameters from paths\n// that reached this accepting state.\n// * `handlers`: Information on how to convert the list of captures into calls\n// to registered handlers with the specified parameters\n// * `types`: How many static, dynamic or star segments in this route. Used to\n// decide which route to use if multiple registered routes match a path.\n//\n// Currently, State is implemented naively by looping over `nextStates` and\n// comparing a character specification against a character. A more efficient\n// implementation would use a hash of keys pointing at one or more next states.\nclass State implements CharSpec {\n states: State[];\n id: number;\n negate: boolean;\n char: number;\n nextStates: number[] | number | null;\n pattern: string;\n _regex: RegExp | undefined;\n handlers: Handler[] | undefined;\n types: [number, number, number] | undefined;\n\n constructor(states: State[], id: number, char: number, negate: boolean, repeat: boolean) {\n this.states = states;\n this.id = id;\n this.char = char;\n this.negate = negate;\n this.nextStates = repeat ? id : null;\n this.pattern = \"\";\n this._regex = undefined;\n this.handlers = undefined;\n this.types = undefined;\n }\n\n regex(): RegExp {\n if (!this._regex) {\n this._regex = new RegExp(this.pattern);\n }\n return this._regex;\n }\n\n get(char: number, negate: boolean): State | void {\n let nextStates = this.nextStates;\n if (nextStates === null) return;\n if (isArray(nextStates)) {\n for (let i = 0; i < nextStates.length; i++) {\n let child = this.states[nextStates[i]];\n if (isEqualCharSpec(child, char, negate)) {\n return child;\n }\n }\n } else {\n let child = this.states[nextStates];\n if (isEqualCharSpec(child, char, negate)) {\n return child;\n }\n }\n }\n\n put(char: number, negate: boolean, repeat: boolean) {\n let state: State | void;\n\n // If the character specification already exists in a child of the current\n // state, just return that state.\n if (state = this.get(char, negate)) { return state; }\n\n // Make a new state for the character spec\n let states = this.states;\n state = new State(states, states.length, char, negate, repeat);\n states[states.length] = state;\n\n // Insert the new state as a child of the current state\n if (this.nextStates == null) {\n this.nextStates = state.id;\n } else if (isArray(this.nextStates)) {\n this.nextStates.push(state.id);\n } else {\n this.nextStates = [this.nextStates, state.id];\n }\n\n // Return the new state\n return state;\n }\n\n // Find a list of child states matching the next character\n match(ch: number): State[] {\n let nextStates = this.nextStates;\n if (!nextStates) return [];\n\n let returned: State[] = [];\n if (isArray(nextStates)) {\n for (let i = 0; i < nextStates.length; i++) {\n let child = this.states[nextStates[i]];\n\n if (isMatch(child, ch)) {\n returned.push(child);\n }\n }\n } else {\n let child = this.states[nextStates];\n if (isMatch(child, ch)) {\n returned.push(child);\n }\n }\n return returned;\n }\n}\n\nfunction isMatch(spec: CharSpec, char: number) {\n return spec.negate ? spec.char !== char && spec.char !== CHARS.ANY : spec.char === char || spec.char === CHARS.ANY;\n}\n\n// This is a somewhat naive strategy, but should work in a lot of cases\n// A better strategy would properly resolve /posts/:id/new and /posts/edit/:id.\n//\n// This strategy generally prefers more static and less dynamic matching.\n// Specifically, it\n//\n// * prefers fewer stars to more, then\n// * prefers using stars for less of the match to more, then\n// * prefers fewer dynamic segments to more, then\n// * prefers more static segments to more\nfunction sortSolutions(states: State[]) {\n return states.sort(function(a, b) {\n let [ astatics, adynamics, astars ] = a.types || [0, 0, 0];\n let [ bstatics, bdynamics, bstars ] = b.types || [0, 0, 0];\n if (astars !== bstars) { return astars - bstars; }\n\n if (astars) {\n if (astatics !== bstatics) { return bstatics - astatics; }\n if (adynamics !== bdynamics) { return bdynamics - adynamics; }\n }\n\n if (adynamics !== bdynamics) { return adynamics - bdynamics; }\n if (astatics !== bstatics) { return bstatics - astatics; }\n\n return 0;\n });\n}\n\nfunction recognizeChar(states: State[], ch: number) {\n let nextStates: State[] = [];\n\n for (let i = 0, l = states.length; i < l; i++) {\n let state = states[i];\n\n nextStates = nextStates.concat(state.match(ch));\n }\n\n return nextStates;\n}\n\n\nexport interface QueryParams {\n [param: string]: any[] | any | null | undefined;\n}\n\nexport interface Result {\n handler: Opaque;\n params: Params;\n isDynamic: boolean;\n}\n\nexport interface Results extends ArrayLike {\n queryParams: QueryParams;\n slice(start?: number, end?: number): Result[];\n splice(start: number, deleteCount: number, ...items: Result[]): Result[];\n push(...results: Result[]): number;\n}\n\nclass RecognizeResults implements Results {\n queryParams: QueryParams;\n length = 0;\n [index: number]: Result | undefined;\n splice: (start: number, deleteCount: number, ...items: Result[]) => Result[];\n slice: (start?: number, end?: number) => Result[];\n push: (...results: Result[]) => number;\n\n constructor(queryParams?: QueryParams) {\n this.queryParams = queryParams || {};\n }\n};\n\nRecognizeResults.prototype.splice = Array.prototype.splice;\nRecognizeResults.prototype.slice = Array.prototype.slice;\nRecognizeResults.prototype.push = Array.prototype.push;\n\nfunction findHandler(state: State, originalPath: string, queryParams: QueryParams): Results {\n let handlers = state.handlers;\n let regex: RegExp = state.regex();\n if (!regex || !handlers) throw new Error(\"state not initialized\");\n let captures: RegExpMatchArray | null = originalPath.match(regex);\n let currentCapture = 1;\n let result = new RecognizeResults(queryParams);\n\n result.length = handlers.length;\n\n for (let i = 0; i < handlers.length; i++) {\n let handler = handlers[i];\n let names = handler.names;\n let shouldDecodes = handler.shouldDecodes;\n let params: EmptyObject | Params = EmptyObject;\n\n let isDynamic = false;\n\n if (names !== EmptyArray && shouldDecodes !== EmptyArray) {\n for (let j = 0; j < names.length; j++) {\n isDynamic = true;\n let name = names[j];\n let capture = captures && captures[currentCapture++];\n\n if (params === EmptyObject) {\n params = {};\n }\n\n if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS && shouldDecodes[j]) {\n (params)[name] = capture && decodeURIComponent(capture);\n } else {\n (params)[name] = capture;\n }\n }\n }\n\n result[i] = {\n handler: handler.handler,\n params,\n isDynamic\n };\n }\n\n return result;\n}\n\nfunction decodeQueryParamPart(part: string): string {\n // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1\n part = part.replace(/\\+/gm, \"%20\");\n let result;\n try {\n result = decodeURIComponent(part);\n } catch (error) {result = \"\"; }\n return result;\n}\n\ninterface NamedRoute {\n segments: Segment[];\n handlers: Handler[];\n}\n\nclass RouteRecognizer {\n private states: State[];\n private rootState: State;\n private names: {\n [name: string]: NamedRoute | undefined;\n } = createMap();\n map: (context: MatchCallback, addCallback?: (router: this, routes: Route[]) => void) => void;\n delegate: Delegate | undefined;\n\n constructor() {\n let states: State[] = [];\n let state = new State(states, 0, CHARS.ANY, true, false);\n states[0] = state;\n this.states = states;\n this.rootState = state;\n }\n\n static VERSION = \"0.3.4\";\n // Set to false to opt-out of encoding and decoding path segments.\n // See https://github.com/tildeio/route-recognizer/pull/55\n static ENCODE_AND_DECODE_PATH_SEGMENTS = true;\n static Normalizer = {\n normalizeSegment, normalizePath, encodePathSegment\n };\n\n add(routes: Route[], options?: { as: string }) {\n let currentState = this.rootState;\n let pattern = \"^\";\n let types: [number, number, number] = [0, 0, 0];\n let handlers: Handler[] = new Array(routes.length);\n let allSegments: Segment[] = [];\n\n let isEmpty = true;\n let j = 0;\n for (let i = 0; i < routes.length; i++) {\n let route = routes[i];\n let { names, shouldDecodes } = parse(allSegments, route.path, types);\n\n // preserve j so it points to the start of newly added segments\n for (; j < allSegments.length; j++) {\n let segment = allSegments[j];\n\n if (segment.type === SegmentType.Epsilon) { continue; }\n\n isEmpty = false;\n\n // Add a \"/\" for the new segment\n currentState = currentState.put(CHARS.SLASH, false, false);\n pattern += \"/\";\n\n // Add a representation of the segment to the NFA and regex\n currentState = eachChar[segment.type](segment, currentState);\n pattern += regex[segment.type](segment);\n }\n handlers[i] = {\n handler: route.handler,\n names,\n shouldDecodes\n };\n }\n\n if (isEmpty) {\n currentState = currentState.put(CHARS.SLASH, false, false);\n pattern += \"/\";\n }\n\n currentState.handlers = handlers;\n currentState.pattern = pattern + \"$\";\n currentState.types = types;\n\n let name: string | undefined;\n if (typeof options === \"object\" && options !== null && options.as) {\n name = options.as;\n }\n\n if (name) {\n // if (this.names[name]) {\n // throw new Error(\"You may not add a duplicate route named `\" + name + \"`.\");\n // }\n\n this.names[name] = {\n segments: allSegments,\n handlers\n };\n }\n }\n\n handlersFor(name: string) {\n let route = this.names[name];\n\n if (!route) { throw new Error(\"There is no route named \" + name); }\n\n let result = new Array(route.handlers.length);\n\n for (let i = 0; i < route.handlers.length; i++) {\n let handler = route.handlers[i];\n result[i] = handler;\n }\n\n return result;\n }\n\n hasRoute(name: string) {\n return !!this.names[name];\n }\n\n generate(name: string, params?: Params | null) {\n let route = this.names[name];\n let output = \"\";\n if (!route) { throw new Error(\"There is no route named \" + name); }\n\n let segments: Segment[] = route.segments;\n\n for (let i = 0; i < segments.length; i++) {\n let segment: Segment = segments[i];\n\n if (segment.type === SegmentType.Epsilon) {\n continue;\n }\n\n output += \"/\";\n output += generate[segment.type](segment, params);\n }\n\n if (output.charAt(0) !== \"/\") { output = \"/\" + output; }\n\n if (params && params.queryParams) {\n output += this.generateQueryString(params.queryParams);\n }\n\n return output;\n }\n\n generateQueryString(params: QueryParams) {\n let pairs: string[] = [];\n let keys: string[] = Object.keys(params);\n keys.sort();\n for (let i = 0; i < keys.length; i++) {\n let key = keys[i];\n let value = params[key];\n if (value == null) {\n continue;\n }\n let pair = encodeURIComponent(key);\n if (isArray(value)) {\n for (let j = 0; j < value.length; j++) {\n let arrayPair = key + \"[]\" + \"=\" + encodeURIComponent(value[j]);\n pairs.push(arrayPair);\n }\n } else {\n pair += \"=\" + encodeURIComponent(value);\n pairs.push(pair);\n }\n }\n\n if (pairs.length === 0) { return \"\"; }\n\n return \"?\" + pairs.join(\"&\");\n }\n\n parseQueryString(queryString: string): QueryParams {\n let pairs = queryString.split(\"&\");\n let queryParams: QueryParams = {};\n for (let i = 0; i < pairs.length; i++) {\n let pair = pairs[i].split(\"=\"),\n key = decodeQueryParamPart(pair[0]),\n keyLength = key.length,\n isArray = false,\n value;\n if (pair.length === 1) {\n value = \"true\";\n } else {\n // Handle arrays\n if (keyLength > 2 && key.slice(keyLength - 2) === \"[]\") {\n isArray = true;\n key = key.slice(0, keyLength - 2);\n if (!queryParams[key]) {\n queryParams[key] = [];\n }\n }\n value = pair[1] ? decodeQueryParamPart(pair[1]) : \"\";\n }\n if (isArray) {\n (queryParams[key]).push(value);\n } else {\n queryParams[key] = value;\n }\n }\n return queryParams;\n }\n\n recognize(path: string): Results | undefined {\n let results: Results | undefined;\n let states: State[] = [ this.rootState ];\n let queryParams = {};\n let isSlashDropped = false;\n let hashStart = path.indexOf(\"#\");\n if (hashStart !== -1) {\n path = path.substr(0, hashStart);\n }\n\n let queryStart = path.indexOf(\"?\");\n if (queryStart !== -1) {\n let queryString = path.substr(queryStart + 1, path.length);\n path = path.substr(0, queryStart);\n queryParams = this.parseQueryString(queryString);\n }\n\n if (path.charAt(0) !== \"/\") { path = \"/\" + path; }\n let originalPath = path;\n\n if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS) {\n path = normalizePath(path);\n } else {\n path = decodeURI(path);\n originalPath = decodeURI(originalPath);\n }\n\n let pathLen = path.length;\n if (pathLen > 1 && path.charAt(pathLen - 1) === \"/\") {\n path = path.substr(0, pathLen - 1);\n originalPath = originalPath.substr(0, originalPath.length - 1);\n isSlashDropped = true;\n }\n\n for (let i = 0; i < path.length; i++) {\n states = recognizeChar(states, path.charCodeAt(i));\n if (!states.length) { break; }\n }\n\n let solutions: State[] = [];\n for (let i = 0; i < states.length; i++) {\n if (states[i].handlers) { solutions.push(states[i]); }\n }\n\n states = sortSolutions(solutions);\n\n let state = solutions[0];\n\n if (state && state.handlers) {\n // if a trailing slash was dropped and a star segment is the last segment\n // specified, put the trailing slash back\n if (isSlashDropped && state.pattern && state.pattern.slice(-5) === \"(.+)$\") {\n originalPath = originalPath + \"/\";\n }\n results = findHandler(state, originalPath, queryParams);\n }\n\n return results;\n }\n}\n\nRouteRecognizer.prototype.map = map;\n\nexport default RouteRecognizer;\n\ninterface CharSpec {\n negate: boolean;\n char: number;\n}\n"],"names":["const","let","this","child","i"],"mappings":"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"} \ No newline at end of file diff --git a/public/tippy.umd.js.map b/public/tippy.umd.js.map deleted file mode 100644 index 82b7f97066..0000000000 --- a/public/tippy.umd.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"tippy.umd.js","sources":["../src/constants.ts","../src/utils.ts","../src/dom-utils.ts","../src/bindGlobalEventListeners.ts","../src/browser.ts","../src/validation.ts","../src/props.ts","../src/template.ts","../src/createTippy.ts","../src/index.ts","../src/addons/createSingleton.ts","../src/addons/delegate.ts","../src/plugins/animateFill.ts","../src/plugins/followCursor.ts","../src/plugins/inlinePositioning.ts","../src/plugins/sticky.ts","../build/base-umd.js"],"sourcesContent":["export const ROUND_ARROW =\n '';\n\nexport const BOX_CLASS = `__NAMESPACE_PREFIX__-box`;\nexport const CONTENT_CLASS = `__NAMESPACE_PREFIX__-content`;\nexport const BACKDROP_CLASS = `__NAMESPACE_PREFIX__-backdrop`;\nexport const ARROW_CLASS = `__NAMESPACE_PREFIX__-arrow`;\nexport const SVG_ARROW_CLASS = `__NAMESPACE_PREFIX__-svg-arrow`;\n\nexport const TOUCH_OPTIONS = {passive: true, capture: true};\n\nexport const TIPPY_DEFAULT_APPEND_TO = () => document.body;\n","import {BasePlacement, Placement} from './types';\n\nexport function hasOwnProperty(\n obj: Record,\n key: string\n): boolean {\n return {}.hasOwnProperty.call(obj, key);\n}\n\nexport function getValueAtIndexOrReturn(\n value: T | [T | null, T | null],\n index: number,\n defaultValue: T | [T, T]\n): T {\n if (Array.isArray(value)) {\n const v = value[index];\n return v == null\n ? Array.isArray(defaultValue)\n ? defaultValue[index]\n : defaultValue\n : v;\n }\n\n return value;\n}\n\nexport function isType(value: any, type: string): boolean {\n const str = {}.toString.call(value);\n return str.indexOf('[object') === 0 && str.indexOf(`${type}]`) > -1;\n}\n\nexport function invokeWithArgsOrReturn(value: any, args: any[]): any {\n return typeof value === 'function' ? value(...args) : value;\n}\n\nexport function debounce(\n fn: (arg: T) => void,\n ms: number\n): (arg: T) => void {\n // Avoid wrapping in `setTimeout` if ms is 0 anyway\n if (ms === 0) {\n return fn;\n }\n\n let timeout: any;\n\n return (arg): void => {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n fn(arg);\n }, ms);\n };\n}\n\nexport function removeProperties(obj: T, keys: string[]): Partial {\n const clone = {...obj};\n keys.forEach((key) => {\n delete (clone as any)[key];\n });\n return clone;\n}\n\nexport function splitBySpaces(value: string): string[] {\n return value.split(/\\s+/).filter(Boolean);\n}\n\nexport function normalizeToArray(value: T | T[]): T[] {\n return ([] as T[]).concat(value);\n}\n\nexport function pushIfUnique(arr: T[], value: T): void {\n if (arr.indexOf(value) === -1) {\n arr.push(value);\n }\n}\n\nexport function appendPxIfNumber(value: string | number): string {\n return typeof value === 'number' ? `${value}px` : value;\n}\n\nexport function unique(arr: T[]): T[] {\n return arr.filter((item, index) => arr.indexOf(item) === index);\n}\n\nexport function getNumber(value: string | number): number {\n return typeof value === 'number' ? value : parseFloat(value);\n}\n\nexport function getBasePlacement(placement: Placement): BasePlacement {\n return placement.split('-')[0] as BasePlacement;\n}\n\nexport function arrayFrom(value: ArrayLike): any[] {\n return [].slice.call(value);\n}\n\nexport function removeUndefinedProps(\n obj: Record\n): Partial> {\n return Object.keys(obj).reduce((acc, key) => {\n if (obj[key] !== undefined) {\n (acc as any)[key] = obj[key];\n }\n\n return acc;\n }, {});\n}\n","import {ReferenceElement, Targets} from './types';\nimport {PopperTreeData} from './types-internal';\nimport {arrayFrom, isType, normalizeToArray, getBasePlacement} from './utils';\n\nexport function div(): HTMLDivElement {\n return document.createElement('div');\n}\n\nexport function isElement(value: unknown): value is Element | DocumentFragment {\n return ['Element', 'Fragment'].some((type) => isType(value, type));\n}\n\nexport function isNodeList(value: unknown): value is NodeList {\n return isType(value, 'NodeList');\n}\n\nexport function isMouseEvent(value: unknown): value is MouseEvent {\n return isType(value, 'MouseEvent');\n}\n\nexport function isReferenceElement(value: any): value is ReferenceElement {\n return !!(value && value._tippy && value._tippy.reference === value);\n}\n\nexport function getArrayOfElements(value: Targets): Element[] {\n if (isElement(value)) {\n return [value];\n }\n\n if (isNodeList(value)) {\n return arrayFrom(value);\n }\n\n if (Array.isArray(value)) {\n return value;\n }\n\n return arrayFrom(document.querySelectorAll(value));\n}\n\nexport function setTransitionDuration(\n els: (HTMLDivElement | null)[],\n value: number\n): void {\n els.forEach((el) => {\n if (el) {\n el.style.transitionDuration = `${value}ms`;\n }\n });\n}\n\nexport function setVisibilityState(\n els: (HTMLDivElement | null)[],\n state: 'visible' | 'hidden'\n): void {\n els.forEach((el) => {\n if (el) {\n el.setAttribute('data-state', state);\n }\n });\n}\n\nexport function getOwnerDocument(\n elementOrElements: Element | Element[]\n): Document {\n const [element] = normalizeToArray(elementOrElements);\n\n // Elements created via a