diff --git a/.discourse-compatibility b/.discourse-compatibility
index b53ff04d..ff1e994a 100644
--- a/.discourse-compatibility
+++ b/.discourse-compatibility
@@ -1,2 +1,4 @@
+3.2.0.beta2: 1ee2f7d8babafe32912372fbbfa50c89f5b09ba9
+3.1.999: 1f35b80f85e5fd1efb7f4851f0845700432febdc
2.7.99: e07a57e398b6b1676ab42a7e34467556fca5416b
2.5.1: bb85b3a0d2c0ab6b59bcb405731c39089ec6731c
diff --git a/.github/workflows/discourse-plugin.yml b/.github/workflows/discourse-plugin.yml
new file mode 100644
index 00000000..13850e3e
--- /dev/null
+++ b/.github/workflows/discourse-plugin.yml
@@ -0,0 +1,13 @@
+name: Discourse Plugin
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ schedule:
+ - cron: "0 0 * * *"
+
+jobs:
+ ci:
+ uses: discourse/.github/.github/workflows/discourse-plugin.yml@v1
diff --git a/.github/workflows/plugin-linting.yml b/.github/workflows/plugin-linting.yml
deleted file mode 100644
index a915ea7f..00000000
--- a/.github/workflows/plugin-linting.yml
+++ /dev/null
@@ -1,56 +0,0 @@
-name: Linting
-
-on:
- push:
- branches:
- - master
- - main
- - stable
- pull_request:
- schedule:
- - cron: '0 0 * * *'
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v2
-
- - name: Set up Node.js
- uses: actions/setup-node@v1
- with:
- node-version: 14
-
- - name: Set up ruby
- uses: ruby/setup-ruby@v1
- with:
- ruby-version: 2.7
-
- - name: Setup bundler
- run: gem install bundler -v 2.1.4 --no-doc
-
- - name: Setup gems
- run: bundle install --jobs 4
-
- - name: Yarn install
- run: yarn install --dev
-
- - name: ESLint
- run: yarn eslint --ext .js,.js.es6 --no-error-on-unmatched-pattern {test,assets}/javascripts
-
- - name: Prettier
- run: |
- yarn prettier -v
- if [ -d "assets" ]; then \
- yarn prettier --list-different "assets/**/*.{scss,js,es6}" ; \
- fi
- if [ -d "test" ]; then \
- yarn prettier --list-different "test/**/*.{js,es6}" ; \
- fi
-
- - name: Ember template lint
- run: yarn ember-template-lint assets/javascripts
-
- - name: Rubocop
- run: bundle exec rubocop .
\ No newline at end of file
diff --git a/.github/workflows/plugin-metadata.yml b/.github/workflows/plugin-metadata.yml
index c5e3caff..42069470 100644
--- a/.github/workflows/plugin-metadata.yml
+++ b/.github/workflows/plugin-metadata.yml
@@ -36,9 +36,9 @@ jobs:
uses: actions/github-script@v5
with:
script: |
- const semver = require('semver');
- const { head_version, base_version } = process.env;
+ const semver = require('semver');
+ const { head_version, base_version } = process.env;
- if (semver.lte(head_version, base_version)) {
- core.setFailed("Head version is equal to or lower than base version.");
- }
+ if (semver.lte(head_version, base_version)) {
+ core.setFailed("Head version is equal to or lower than base version.");
+ }
diff --git a/.github/workflows/plugin-tests.yml b/.github/workflows/plugin-tests.yml
deleted file mode 100644
index 497486ea..00000000
--- a/.github/workflows/plugin-tests.yml
+++ /dev/null
@@ -1,139 +0,0 @@
-name: Plugin Tests
-
-on:
- push:
- branches:
- - stable
- - master
- - main
- pull_request:
- schedule:
- - cron: '0 */12 * * *'
-
-jobs:
- build:
- name: ${{ matrix.build_type }}
- runs-on: ubuntu-latest
- timeout-minutes: 60
-
- env:
- DISCOURSE_HOSTNAME: www.example.com
- RUBY_GLOBAL_METHOD_CACHE_SIZE: 131072
- RAILS_ENV: test
- PGHOST: localhost
- PGUSER: discourse
- PGPASSWORD: discourse
-
- strategy:
- fail-fast: false
-
- matrix:
- build_type: ["backend", "frontend"]
- ruby: ["2.7"]
- postgres: ["12"]
- redis: ["6.x"]
-
- services:
- postgres:
- image: postgres:${{ matrix.postgres }}
- ports:
- - 5432:5432
- env:
- POSTGRES_USER: discourse
- POSTGRES_PASSWORD: discourse
- options: >-
- --mount type=tmpfs,destination=/var/lib/postgresql/data
- --health-cmd pg_isready
- --health-interval 10s
- --health-timeout 5s
- --health-retries 5
-
- steps:
- - uses: haya14busa/action-cond@v1
- id: discourse_branch
- with:
- cond: ${{ github.base_ref == 'stable' }}
- if_true: "stable"
- if_false: "tests-passed"
-
- - uses: actions/checkout@v3
- with:
- repository: discourse/discourse
- ref: ${{ steps.discourse_branch.outputs.value }}
- fetch-depth: 1
-
- - name: Install plugin
- uses: actions/checkout@v2
- with:
- path: plugins/${{ github.event.repository.name }}
- ref: "${{ github.head_ref }}"
- fetch-depth: 1
-
- - name: Setup Git
- run: |
- git config --global user.email "ci@ci.invalid"
- git config --global user.name "Discourse CI"
-
- - name: Setup packages
- run: |
- sudo apt-get update
- sudo apt-get -yqq install postgresql-client libpq-dev gifsicle jpegoptim optipng jhead
- wget -qO- https://raw.githubusercontent.com/discourse/discourse_docker/master/image/base/install-pngquant | sudo sh
-
- - name: Update imagemagick
- if: matrix.build_type == 'backend'
- run: |
- wget https://raw.githubusercontent.com/discourse/discourse_docker/master/image/base/install-imagemagick
- chmod +x install-imagemagick
- sudo ./install-imagemagick
-
- - name: Setup redis
- uses: shogo82148/actions-setup-redis@v1
- with:
- redis-version: ${{ matrix.redis }}
-
- - name: Setup ruby
- uses: ruby/setup-ruby@v1
- with:
- ruby-version: ${{ matrix.ruby }}
- bundler-cache: true
-
- - name: Lint English locale
- if: matrix.build_type == 'backend'
- run: bundle exec ruby script/i18n_lint.rb "plugins/${{ steps.repo-name.outputs.value }}/locales/{client,server}.en.yml"
-
- - name: Get yarn cache directory
- id: yarn-cache-dir
- run: echo "::set-output name=dir::$(yarn cache dir)"
-
- - name: Yarn cache
- uses: actions/cache@v2
- id: yarn-cache
- with:
- path: ${{ steps.yarn-cache-dir.outputs.dir }}
- key: ${{ runner.os }}-${{ matrix.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
- restore-keys: |
- ${{ runner.os }}-${{ matrix.os }}-yarn-
-
- - name: Yarn install
- run: yarn install --dev
-
- - name: Migrate database
- run: |
- bin/rake db:create
- bin/rake db:migrate
-
- - name: Plugin RSpec with Coverage
- if: matrix.build_type == 'backend'
- run: |
- if [ -e plugins/${{ steps.repo-name.outputs.value }}/.simplecov ]
- then
- cp plugins/${{ steps.repo-name.outputs.value }}/.simplecov .simplecov
- export COVERAGE=1
- fi
- bin/rake plugin:spec[${{ steps.repo-name.outputs.value }}]
-
- - name: Plugin QUnit
- if: matrix.build_type == 'frontend'
- run: LOAD_PLUGINS=1 QUNIT_EMBER_CLI=0 QUNIT_SKIP_CORE=1 bin/rake qunit:test['600000','/w/qunit']
- timeout-minutes: 10
diff --git a/.gitignore b/.gitignore
index 11ce0a3c..3da9ad01 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,8 @@
coverage/*
!coverage/.last_run.json
-gems/
+gems/*
.bundle/
auto_generated
.DS_Store
node_modules/
+vendor/*
diff --git a/.rubocop.yml b/.rubocop.yml
index d46296cf..74c8c853 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -1,2 +1,11 @@
inherit_gem:
rubocop-discourse: default.yml
+
+RSpec/ContextWording:
+ Enabled: false
+
+RSpec/DescribeClass:
+ Enabled: false
+
+Discourse/TimeEqMatcher:
+ Enabled: false
diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt
index 48cea364..66b401ac 100644
--- a/COPYRIGHT.txt
+++ b/COPYRIGHT.txt
@@ -1,4 +1,4 @@
-All code in this repository is Copyright 2018 by Angus McLeod.
+All code in this repository is Copyright 2023 by Angus McLeod.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/Gemfile.lock b/Gemfile.lock
index 2416ce66..5ab57bb6 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -2,31 +2,32 @@ GEM
remote: https://rubygems.org/
specs:
ast (2.4.2)
- parallel (1.20.1)
- parser (3.0.1.0)
+ json (2.6.2)
+ parallel (1.22.1)
+ parser (3.1.2.1)
ast (~> 2.4.1)
- rainbow (3.0.0)
- regexp_parser (2.1.1)
+ rainbow (3.1.1)
+ regexp_parser (2.6.0)
rexml (3.2.5)
- rubocop (1.12.1)
+ rubocop (1.36.0)
+ json (~> 2.3)
parallel (~> 1.10)
- parser (>= 3.0.0.0)
+ parser (>= 3.1.2.1)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
- rexml
- rubocop-ast (>= 1.2.0, < 2.0)
+ rexml (>= 3.2.5, < 4.0)
+ rubocop-ast (>= 1.20.1, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 3.0)
- rubocop-ast (1.4.1)
- parser (>= 2.7.1.5)
- rubocop-discourse (2.4.1)
+ rubocop-ast (1.22.0)
+ parser (>= 3.1.1.0)
+ rubocop-discourse (3.0)
rubocop (>= 1.1.0)
rubocop-rspec (>= 2.0.0)
- rubocop-rspec (2.2.0)
- rubocop (~> 1.0)
- rubocop-ast (>= 1.1.0)
+ rubocop-rspec (2.13.2)
+ rubocop (~> 1.33)
ruby-progressbar (1.11.0)
- unicode-display_width (2.0.0)
+ unicode-display_width (2.3.0)
PLATFORMS
ruby
diff --git a/README.md b/README.md
index 602709f5..063ceaa2 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,31 @@
-# discourse-custom-wizard
+# Discourse Custom Wizard Plugin
-See further: https://thepavilion.io/c/knowledge/discourse/custom-wizard/118
+The Custom Wizard Plugin lets you make forms for your Discourse forum. Better user onboarding, structured posting, data enrichment, automated actions and much more for your community.
+
+
+
+👋 Looking to report an issue? We're managing issues for this plugin using our [bug report wizard](https://pavilion.tech/products/discourse-custom-wizard-plugin/support/bug-report).
+
+## Install
+
+If you're not sure how to install a plugin in Discourse, please follow the [plugin installation guide](https://meta.discourse.org/t/install-a-plugin/19157) or contact your Discourse hosting provider.
+
+## Documentation
+
+[Read the full documentation here](https://pavilion.tech/products/discourse-custom-wizard-plugin/documentation/), or go directly to the relevant section
+
+- [Wizard Administration](https://coop.pavilion.tech/t/1602)
+- [Wizard Settings](https://coop.pavilion.tech/t/1614)
+- [Step Settings](https://pavilion.tech/products/discourse-custom-wizard-plugin/documentation/step-settings)
+- [Field Settings](https://pavilion.tech/products/discourse-custom-wizard-plugin/documentation/field-settings)
+- [Conditional Settings](https://pavilion.tech/products/discourse-custom-wizard-plugin/documentation/conditional-settings)
+- [Field Interpolation](https://pavilion.tech/products/discourse-custom-wizard-plugin/documentation/field-interpolation)
+- [Handling Dates and Times](https://coop.pavilion.tech/t/1708)
+
+## Support
+
+- [Report an issue](https://pavilion.tech/products/discourse-custom-wizard-plugin/support/bug-report)
+
+## Statistics
+
+For improved service and development, this plugin collects some generalised quantitative data related to version and usage. No personal or sensitive information is gathered. Please email contact@pavilion.tech if you have any questions or concerns about our data collection.
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 00000000..c799fa5a
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,7 @@
+# Security Policy
+
+The security of Discourse plugins are premised on the security of [Discourse](https://github.com/discourse/discourse). Please first consider whether a security issue is best reported and handled by the Discourse team. You can view the Discourse security policy [here](https://github.com/discourse/discourse/security/policy).
+
+## Reporting a Vulnerability
+
+If you find a security vulnerability that is specific to this plugin, please report it to development@pavilion.tech. Security issues always take precedence over all other work. All commits specific to security are prefixed with SECURITY.
diff --git a/app/controllers/custom_wizard/admin/admin.rb b/app/controllers/custom_wizard/admin/admin.rb
index c99954d6..2b950b23 100644
--- a/app/controllers/custom_wizard/admin/admin.rb
+++ b/app/controllers/custom_wizard/admin/admin.rb
@@ -2,9 +2,6 @@
class CustomWizard::AdminController < ::Admin::AdminController
before_action :ensure_admin
- def index
- end
-
private
def find_wizard
diff --git a/app/controllers/custom_wizard/admin/api.rb b/app/controllers/custom_wizard/admin/api.rb
index a913e9ca..e4ac31e9 100644
--- a/app/controllers/custom_wizard/admin/api.rb
+++ b/app/controllers/custom_wizard/admin/api.rb
@@ -20,6 +20,10 @@ class CustomWizard::AdminApiController < CustomWizard::AdminController
raise Discourse::InvalidParameters, "An API with that name already exists: '#{current.title || current.name}'"
end
+ unless subscription.includes?(:api, :all)
+ raise Discourse::InvalidParameters, "Your subscription doesn't include API features."
+ end
+
PluginStoreRow.transaction do
CustomWizard::Api.set(api_params[:name], title: api_params[:title])
@@ -130,4 +134,8 @@ class CustomWizard::AdminApiController < CustomWizard::AdminController
@auth_data ||= auth_data
end
+
+ def subscription
+ @subscription ||= CustomWizard::Subscription.new
+ end
end
diff --git a/app/controllers/custom_wizard/admin/custom_fields.rb b/app/controllers/custom_wizard/admin/custom_fields.rb
index c52759c9..111e9faf 100644
--- a/app/controllers/custom_wizard/admin/custom_fields.rb
+++ b/app/controllers/custom_wizard/admin/custom_fields.rb
@@ -1,7 +1,9 @@
# frozen_string_literal: true
class CustomWizard::AdminCustomFieldsController < CustomWizard::AdminController
def index
- render_json_dump(custom_field_list)
+ render_json_dump(
+ custom_fields: custom_field_list
+ )
end
def update
diff --git a/app/controllers/custom_wizard/admin/logs.rb b/app/controllers/custom_wizard/admin/logs.rb
index 976814f8..7ca37bb2 100644
--- a/app/controllers/custom_wizard/admin/logs.rb
+++ b/app/controllers/custom_wizard/admin/logs.rb
@@ -1,9 +1,44 @@
# frozen_string_literal: true
class CustomWizard::AdminLogsController < CustomWizard::AdminController
+ before_action :find_wizard, except: [:index]
+
def index
- render_serialized(
- CustomWizard::Log.list(params[:page].to_i, params[:limit].to_i),
- CustomWizard::LogSerializer
+ render json: ActiveModel::ArraySerializer.new(
+ CustomWizard::Wizard.list(current_user),
+ each_serializer: CustomWizard::BasicWizardSerializer
)
end
+
+ def show
+ render_json_dump(
+ wizard: CustomWizard::BasicWizardSerializer.new(@wizard, root: false),
+ logs: ActiveModel::ArraySerializer.new(
+ log_list.logs,
+ each_serializer: CustomWizard::LogSerializer
+ ),
+ total: log_list.total
+ )
+ end
+
+ protected
+
+ def log_list
+ @log_list ||= begin
+ list = CustomWizard::Log.list(params[:page].to_i, params[:limit].to_i, params[:wizard_id])
+
+ if list.logs.any? && (usernames = list.logs.map(&:username)).present?
+ user_map = User.where(username: usernames)
+ .reduce({}) do |result, user|
+ result[user.username] = user
+ result
+ end
+
+ list.logs.each do |log_item|
+ log_item.user = user_map[log_item.username]
+ end
+ end
+
+ list
+ end
+ end
end
diff --git a/app/controllers/custom_wizard/admin/submissions.rb b/app/controllers/custom_wizard/admin/submissions.rb
index 4cb2a0e4..d5994c96 100644
--- a/app/controllers/custom_wizard/admin/submissions.rb
+++ b/app/controllers/custom_wizard/admin/submissions.rb
@@ -13,12 +13,21 @@ class CustomWizard::AdminSubmissionsController < CustomWizard::AdminController
def show
render_json_dump(
wizard: CustomWizard::BasicWizardSerializer.new(@wizard, root: false),
- submissions: ActiveModel::ArraySerializer.new(ordered_submissions, each_serializer: CustomWizard::SubmissionSerializer)
+ submissions: ActiveModel::ArraySerializer.new(
+ submission_list.submissions,
+ each_serializer: CustomWizard::SubmissionSerializer
+ ),
+ total: submission_list.total
)
end
def download
- send_data ordered_submissions.to_json,
+ content = ActiveModel::ArraySerializer.new(
+ CustomWizard::Submission.list(@wizard).submissions,
+ each_serializer: CustomWizard::SubmissionSerializer
+ )
+
+ send_data content.to_json,
filename: "#{Discourse.current_hostname}-wizard-submissions-#{@wizard.name}.json",
content_type: "application/json",
disposition: "attachment"
@@ -26,7 +35,7 @@ class CustomWizard::AdminSubmissionsController < CustomWizard::AdminController
protected
- def ordered_submissions
- CustomWizard::Submission.list(@wizard, order_by: 'id')
+ def submission_list
+ CustomWizard::Submission.list(@wizard, page: params[:page].to_i)
end
end
diff --git a/app/controllers/custom_wizard/admin/subscription.rb b/app/controllers/custom_wizard/admin/subscription.rb
new file mode 100644
index 00000000..7b596ec6
--- /dev/null
+++ b/app/controllers/custom_wizard/admin/subscription.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+class CustomWizard::SubscriptionController < ::Admin::AdminController
+ before_action :ensure_admin
+
+ def index
+ if params[:update_from_remote]
+ subscription = CustomWizard::Subscription.new(true)
+ else
+ subscription = CustomWizard::Subscription.new
+ end
+
+ render_json_dump(
+ subscribed: subscription.subscribed?,
+ subscription_type: subscription.type,
+ subscription_attributes: CustomWizard::Subscription.attributes,
+ )
+ end
+end
diff --git a/app/controllers/custom_wizard/admin/wizard.rb b/app/controllers/custom_wizard/admin/wizard.rb
index 0a59e02b..08e7b6d0 100644
--- a/app/controllers/custom_wizard/admin/wizard.rb
+++ b/app/controllers/custom_wizard/admin/wizard.rb
@@ -88,6 +88,7 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController
:title,
:key,
:banner,
+ :banner_upload_id,
:raw_description,
:required_data_message,
:force_final,
@@ -99,6 +100,7 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController
:index,
:label,
:image,
+ :image_upload_id,
:description,
:required,
:key,
@@ -112,6 +114,7 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController
:property,
:preview_template,
:placeholder,
+ :can_create_tag,
prefill: mapped_params,
content: mapped_params,
condition: mapped_params,
@@ -161,7 +164,9 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController
mentionable_level: mapped_params,
messageable_level: mapped_params,
visibility_level: mapped_params,
- members_visibility_level: mapped_params
+ members_visibility_level: mapped_params,
+ add_event: mapped_params,
+ add_location: mapped_params
]
)
end
diff --git a/app/controllers/custom_wizard/steps.rb b/app/controllers/custom_wizard/steps.rb
index df3c2cb3..2a4305c7 100644
--- a/app/controllers/custom_wizard/steps.rb
+++ b/app/controllers/custom_wizard/steps.rb
@@ -1,6 +1,5 @@
# frozen_string_literal: true
-class CustomWizard::StepsController < ::ApplicationController
- before_action :ensure_logged_in
+class CustomWizard::StepsController < ::CustomWizard::WizardClientController
before_action :ensure_can_update
def update
@@ -22,7 +21,7 @@ class CustomWizard::StepsController < ::ApplicationController
if updater.success?
wizard_id = update_params[:wizard_id]
- builder = CustomWizard::Builder.new(wizard_id, current_user)
+ builder = CustomWizard::Builder.new(wizard_id, current_user, guest_id)
@wizard = builder.build(force: true)
current_step = @wizard.find_step(update[:step_id])
@@ -85,7 +84,6 @@ class CustomWizard::StepsController < ::ApplicationController
private
def ensure_can_update
- @builder = CustomWizard::Builder.new(update_params[:wizard_id], current_user)
raise Discourse::InvalidParameters.new(:wizard_id) if @builder.template.nil?
raise Discourse::InvalidAccess.new if !@builder.wizard || !@builder.wizard.can_access?
diff --git a/app/controllers/custom_wizard/wizard.rb b/app/controllers/custom_wizard/wizard.rb
index bb53670b..dd4ea4ca 100644
--- a/app/controllers/custom_wizard/wizard.rb
+++ b/app/controllers/custom_wizard/wizard.rb
@@ -1,39 +1,10 @@
# frozen_string_literal: true
-class CustomWizard::WizardController < ::ActionController::Base
- helper ApplicationHelper
-
- include CurrentUser
- include CanonicalURL::ControllerExtensions
- include GlobalPath
-
- prepend_view_path(Rails.root.join('plugins', 'discourse-custom-wizard', 'app', 'views'))
- layout :set_wizard_layout
-
- before_action :preload_wizard_json
- before_action :ensure_plugin_enabled
- before_action :ensure_logged_in, only: [:skip]
-
- helper_method :wizard_page_title
- helper_method :wizard_theme_id
- helper_method :wizard_theme_lookup
- helper_method :wizard_theme_translations_lookup
-
- def set_wizard_layout
- action_name === 'qunit' ? 'qunit' : 'wizard'
- end
-
- def index
- respond_to do |format|
- format.json do
- if wizard.present?
- render json: CustomWizard::WizardSerializer.new(wizard, scope: guardian, root: false).as_json, status: 200
- else
- render json: { error: I18n.t('wizard.none') }
- end
- end
- format.html do
- render "default/empty"
- end
+class CustomWizard::WizardController < ::CustomWizard::WizardClientController
+ def show
+ if wizard.present?
+ render json: CustomWizard::WizardSerializer.new(wizard, scope: guardian, root: false).as_json, status: 200
+ else
+ render json: { error: I18n.t('wizard.none') }
end
end
@@ -57,69 +28,12 @@ class CustomWizard::WizardController < ::ActionController::Base
render json: result
end
- def qunit
- raise Discourse::InvalidAccess.new if Rails.env.production?
-
- respond_to do |format|
- format.html do
- render "default/empty"
- end
- end
- end
-
protected
- def ensure_logged_in
- raise Discourse::NotLoggedIn.new unless current_user.present?
- end
-
- def guardian
- @guardian ||= Guardian.new(current_user, request)
- end
-
def wizard
@wizard ||= begin
- builder = CustomWizard::Builder.new(params[:wizard_id].underscore, current_user)
- return nil unless builder.present?
- opts = {}
- opts[:reset] = params[:reset]
- builder.build(opts, params)
- end
- end
-
- def wizard_page_title
- wizard ? (wizard.name || wizard.id) : I18n.t('wizard.custom_title')
- end
-
- def wizard_theme_id
- wizard ? wizard.theme_id : nil
- end
-
- def wizard_theme_lookup(name)
- Theme.lookup_field(wizard_theme_id, view_context.mobile_view? ? :mobile : :desktop, name)
- end
-
- def wizard_theme_translations_lookup
- Theme.lookup_field(wizard_theme_id, :translations, I18n.locale)
- end
-
- def preload_wizard_json
- return if request.xhr? || request.format.json?
- return if request.method != "GET"
-
- store_preloaded("siteSettings", SiteSetting.client_settings_json)
- end
-
- def store_preloaded(key, json)
- @preloaded ||= {}
- @preloaded[key] = json.gsub("", "<\\/")
- end
-
- private
-
- def ensure_plugin_enabled
- unless SiteSetting.custom_wizard_enabled
- redirect_to path("/")
+ return nil unless @builder.present?
+ @builder.build({ reset: params[:reset] }, params)
end
end
end
diff --git a/app/controllers/custom_wizard/wizard_client.rb b/app/controllers/custom_wizard/wizard_client.rb
new file mode 100644
index 00000000..e898852a
--- /dev/null
+++ b/app/controllers/custom_wizard/wizard_client.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+class CustomWizard::WizardClientController < ::ApplicationController
+ before_action :ensure_plugin_enabled
+ before_action :set_builder
+
+ private
+
+ def ensure_plugin_enabled
+ unless SiteSetting.custom_wizard_enabled
+ redirect_to path("/")
+ end
+ end
+
+ def guest_id
+ return nil if current_user.present?
+ cookies[:custom_wizard_guest_id] ||= CustomWizard::Wizard.generate_guest_id
+ cookies[:custom_wizard_guest_id]
+ end
+
+ def set_builder
+ @builder = CustomWizard::Builder.new(params[:wizard_id].underscore, current_user, guest_id)
+ end
+end
diff --git a/app/jobs/refresh_api_access_token.rb b/app/jobs/regular/refresh_api_access_token.rb
similarity index 100%
rename from app/jobs/refresh_api_access_token.rb
rename to app/jobs/regular/refresh_api_access_token.rb
diff --git a/app/jobs/set_after_time_wizard.rb b/app/jobs/regular/set_after_time_wizard.rb
similarity index 100%
rename from app/jobs/set_after_time_wizard.rb
rename to app/jobs/regular/set_after_time_wizard.rb
diff --git a/app/serializers/custom_wizard/log_serializer.rb b/app/serializers/custom_wizard/log_serializer.rb
index e521c573..56c5fd8f 100644
--- a/app/serializers/custom_wizard/log_serializer.rb
+++ b/app/serializers/custom_wizard/log_serializer.rb
@@ -1,4 +1,10 @@
# frozen_string_literal: true
+
class CustomWizard::LogSerializer < ApplicationSerializer
- attributes :message, :date
+ attributes :date,
+ :action,
+ :username,
+ :message
+
+ has_one :user, serializer: ::BasicUserSerializer, embed: :objects
end
diff --git a/app/serializers/custom_wizard/submission_serializer.rb b/app/serializers/custom_wizard/submission_serializer.rb
index 52f0cb32..ed9ad411 100644
--- a/app/serializers/custom_wizard/submission_serializer.rb
+++ b/app/serializers/custom_wizard/submission_serializer.rb
@@ -1,16 +1,35 @@
# frozen_string_literal: true
class CustomWizard::SubmissionSerializer < ApplicationSerializer
attributes :id,
- :username,
:fields,
:submitted_at,
- :route_to,
- :redirect_on_complete,
- :redirect_to
+ :user
- def username
- object.user.present? ?
- object.user.username :
- I18n.t('admin.wizard.submission.no_user', user_id: object.user_id)
+ def include_user?
+ object.wizard.user.present?
+ end
+
+ def user
+ ::BasicUserSerializer.new(object.wizard.user, root: false).as_json
+ end
+
+ def fields
+ @fields ||= begin
+ result = {}
+
+ object.wizard.template['steps'].each do |step|
+ step['fields'].each do |field|
+ if value = object.fields[field['id']]
+ result[field['id']] = {
+ value: value,
+ type: field['type'],
+ label: field['label']
+ }
+ end
+ end
+ end
+
+ result
+ end
end
end
diff --git a/app/serializers/custom_wizard/wizard_field_serializer.rb b/app/serializers/custom_wizard/wizard_field_serializer.rb
index 70784f7f..56e86cc8 100644
--- a/app/serializers/custom_wizard/wizard_field_serializer.rb
+++ b/app/serializers/custom_wizard/wizard_field_serializer.rb
@@ -17,6 +17,7 @@ class CustomWizard::FieldSerializer < ::ApplicationSerializer
:property,
:content,
:tag_groups,
+ :can_create_tag,
:validations,
:max_length,
:char_counter,
@@ -42,13 +43,8 @@ class CustomWizard::FieldSerializer < ::ApplicationSerializer
object.value
end
- def i18n_key
- @i18n_key ||= "wizard.step.#{object.step.id}.fields.#{object.id}".underscore
- end
-
def label
- return object.label if object.label.present?
- I18n.t("#{object.key || i18n_key}.label", default: '')
+ I18n.t("#{i18n_key}.label", default: object.label, base_url: Discourse.base_url)
end
def include_label?
@@ -56,14 +52,21 @@ class CustomWizard::FieldSerializer < ::ApplicationSerializer
end
def description
- return object.description if object.description.present?
- I18n.t("#{object.key || i18n_key}.description", default: '', base_url: Discourse.base_url)
+ I18n.t("#{i18n_key}.description", default: object.description, base_url: Discourse.base_url)
end
def include_description?
description.present?
end
+ def placeholder
+ I18n.t("#{i18n_key}.placeholder", default: object.placeholder)
+ end
+
+ def include_placeholder?
+ placeholder.present?
+ end
+
def image
object.image
end
@@ -72,15 +75,6 @@ class CustomWizard::FieldSerializer < ::ApplicationSerializer
object.image.present?
end
- def placeholder
- return object.placeholder if object.placeholder.present?
- I18n.t("#{object.key || i18n_key}.placeholder", default: '')
- end
-
- def include_placeholder?
- placeholder.present?
- end
-
def file_types
object.file_types
end
@@ -105,6 +99,10 @@ class CustomWizard::FieldSerializer < ::ApplicationSerializer
object.tag_groups
end
+ def can_create_tag
+ object.can_create_tag
+ end
+
def validations
validations = {}
object.validations&.each do |type, props|
@@ -127,4 +125,14 @@ class CustomWizard::FieldSerializer < ::ApplicationSerializer
def preview_template
object.preview_template
end
+
+ protected
+
+ def i18n_key
+ @i18n_key ||= "#{object.step.wizard.id}.#{object.step.id}.#{object.id}".underscore
+ end
+
+ def subscribed?
+ @subscribed ||= CustomWizard::Subscription.subscribed?
+ end
end
diff --git a/app/serializers/custom_wizard/wizard_serializer.rb b/app/serializers/custom_wizard/wizard_serializer.rb
index f23ff7e1..9741d7af 100644
--- a/app/serializers/custom_wizard/wizard_serializer.rb
+++ b/app/serializers/custom_wizard/wizard_serializer.rb
@@ -9,13 +9,10 @@ class CustomWizard::WizardSerializer < CustomWizard::BasicWizardSerializer
:completed,
:required,
:permitted,
- :uncategorized_category_id,
- :categories,
:resume_on_revisit
has_many :steps, serializer: ::CustomWizard::StepSerializer, embed: :objects
has_one :user, serializer: ::BasicUserSerializer, embed: :objects
- has_many :groups, serializer: ::BasicGroupSerializer, embed: :objects
def completed
object.completed?
@@ -46,24 +43,4 @@ class CustomWizard::WizardSerializer < CustomWizard::BasicWizardSerializer
def include_steps?
!include_completed?
end
-
- def include_categories?
- object.needs_categories
- end
-
- def include_groups?
- object.needs_groups
- end
-
- def uncategorized_category_id
- SiteSetting.uncategorized_category_id
- end
-
- def include_uncategorized_category_id?
- object.needs_categories
- end
-
- def categories
- object.categories.map { |c| c.to_h }
- end
end
diff --git a/app/serializers/custom_wizard/wizard_step_serializer.rb b/app/serializers/custom_wizard/wizard_step_serializer.rb
index 85f527bb..a2a314a4 100644
--- a/app/serializers/custom_wizard/wizard_step_serializer.rb
+++ b/app/serializers/custom_wizard/wizard_step_serializer.rb
@@ -39,13 +39,8 @@ class CustomWizard::StepSerializer < ::ApplicationSerializer
object.previous.present?
end
- def i18n_key
- @i18n_key ||= "wizard.step.#{object.id}".underscore
- end
-
def title
- return PrettyText.cook(object.title) if object.title
- PrettyText.cook(I18n.t("#{object.key || i18n_key}.title", default: ''))
+ I18n.t("#{i18n_key}.title", default: object.title, base_url: Discourse.base_url)
end
def include_title?
@@ -53,8 +48,7 @@ class CustomWizard::StepSerializer < ::ApplicationSerializer
end
def description
- return object.description if object.description
- PrettyText.cook(I18n.t("#{object.key || i18n_key}.description", default: '', base_url: Discourse.base_url))
+ I18n.t("#{i18n_key}.description", default: object.description, base_url: Discourse.base_url)
end
def include_description?
@@ -80,4 +74,10 @@ class CustomWizard::StepSerializer < ::ApplicationSerializer
def final
object.final?
end
+
+ protected
+
+ def i18n_key
+ @i18n_key ||= "#{object.wizard.id}.#{object.id}".underscore
+ end
end
diff --git a/app/views/layouts/wizard.html.erb b/app/views/layouts/wizard.html.erb
deleted file mode 100644
index f909ae84..00000000
--- a/app/views/layouts/wizard.html.erb
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
- <%= discourse_color_scheme_stylesheets %>
-
- <%= discourse_stylesheet_link_tag :wizard, theme_id: nil %>
- <%= discourse_stylesheet_link_tag :wizard_custom %>
- <%- if wizard_theme_id.present? %>
- <%= discourse_stylesheet_link_tag (mobile_view? ? :mobile_theme : :desktop_theme), theme_id: wizard_theme_id %>
- <%- end %>
-
- <%= preload_script "locales/#{I18n.locale}" %>
- <%= preload_script "ember_jquery" %>
- <%= preload_script "wizard-vendor" %>
- <%= preload_script "wizard-custom" %>
- <%= preload_script "wizard-raw-templates" %>
- <%= preload_script "wizard-plugin" %>
- <%= preload_script "pretty-text-bundle" %>
-
- <%= csrf_meta_tags %>
-
- <%- unless customization_disabled? %>
- <%= wizard_theme_translations_lookup %>
- <%= raw wizard_theme_lookup("head_tag") %>
- <%- end %>
-
- <%= server_plugin_outlet "custom_wizard" %>
-
- <%= tag.meta id: 'data-discourse-setup', data: client_side_setup_data %>
-
-
-
-
- <%= render partial: "layouts/head" %>
- <%= wizard_page_title %>
-
-
-
- <%- unless customization_disabled? %>
- <%= raw wizard_theme_lookup("header") %>
- <%- end %>
-
-
-
- <%- unless customization_disabled? %>
- <%= raw wizard_theme_lookup("body_tag") %>
- <%- end %>
-
- <%- if current_user %>
- <%= preload_script 'wizard-custom-start' %>
- <%- else %>
- <%= preload_script 'wizard-custom-guest' %>
- <%- end %>
-
-
-
- <%= raw SvgSprite.bundle %>
-
-
-
-
-
-
diff --git a/assets/javascripts/discourse/components/custom-field-input.js.es6 b/assets/javascripts/discourse/components/custom-field-input.js.es6
index e49c6f1d..5d2d6c3b 100644
--- a/assets/javascripts/discourse/components/custom-field-input.js.es6
+++ b/assets/javascripts/discourse/components/custom-field-input.js.es6
@@ -3,27 +3,12 @@ import discourseComputed, { observes } from "discourse-common/utils/decorators";
import { alias, equal, or } from "@ember/object/computed";
import I18n from "I18n";
-const generateContent = function (array, type) {
- return array.map((key) => ({
- id: key,
- name: I18n.t(`admin.wizard.custom_field.${type}.${key}`),
- }));
-};
-
export default Component.extend({
tagName: "tr",
topicSerializers: ["topic_view", "topic_list_item"],
postSerializers: ["post"],
groupSerializers: ["basic_group"],
categorySerializers: ["basic_category"],
- klassContent: generateContent(
- ["topic", "post", "group", "category"],
- "klass"
- ),
- typeContent: generateContent(
- ["string", "boolean", "integer", "json"],
- "type"
- ),
showInputs: or("field.new", "field.edit"),
classNames: ["custom-field-input"],
loading: or("saving", "destroying"),
@@ -40,9 +25,13 @@ export default Component.extend({
const serializers = this.get(`${klass}Serializers`);
if (serializers) {
- return generateContent(serializers, "serializers");
- } else {
- return [];
+ return serializers.reduce((result, key) => {
+ result.push({
+ id: key,
+ name: I18n.t(`admin.wizard.custom_field.serializers.${key}`),
+ });
+ return result;
+ }, []);
}
},
diff --git a/assets/javascripts/wizard/components/custom-user-selector.js.es6 b/assets/javascripts/discourse/components/custom-user-selector.js.es6
similarity index 94%
rename from assets/javascripts/wizard/components/custom-user-selector.js.es6
rename to assets/javascripts/discourse/components/custom-user-selector.js.es6
index 56eb8f57..59711ec2 100644
--- a/assets/javascripts/wizard/components/custom-user-selector.js.es6
+++ b/assets/javascripts/discourse/components/custom-user-selector.js.es6
@@ -3,11 +3,11 @@ import {
observes,
} from "discourse-common/utils/decorators";
import { renderAvatar } from "discourse/helpers/user-avatar";
-import userSearch from "../lib/user-search";
-import WizardI18n from "../lib/wizard-i18n";
+import userSearch from "discourse/lib/user-search";
+import I18n from "I18n";
import Handlebars from "handlebars";
import { isEmpty } from "@ember/utils";
-import TextField from "@ember/component/text-field";
+import TextField from "discourse/components/text-field";
const template = function (params) {
const options = params.options;
@@ -41,7 +41,7 @@ export default TextField.extend({
@computed("placeholderKey")
placeholder(placeholderKey) {
- return placeholderKey ? WizardI18n(placeholderKey) : "";
+ return placeholderKey ? I18n.t(placeholderKey) : "";
},
@observes("usernames")
diff --git a/assets/javascripts/wizard/components/wizard-category-selector.js.es6 b/assets/javascripts/discourse/components/custom-wizard-category-selector.js.es6
similarity index 100%
rename from assets/javascripts/wizard/components/wizard-category-selector.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-category-selector.js.es6
diff --git a/assets/javascripts/wizard/components/wizard-composer-editor.js.es6 b/assets/javascripts/discourse/components/custom-wizard-composer-editor.js.es6
similarity index 68%
rename from assets/javascripts/wizard/components/wizard-composer-editor.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-composer-editor.js.es6
index 4f44d439..95ae56c0 100644
--- a/assets/javascripts/wizard/components/wizard-composer-editor.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-composer-editor.js.es6
@@ -1,5 +1,6 @@
import ComposerEditor from "discourse/components/composer-editor";
import {
+ bind,
default as discourseComputed,
on,
} from "discourse-common/utils/decorators";
@@ -8,16 +9,21 @@ import { scheduleOnce } from "@ember/runloop";
import { caretPosition, inCodeBlock } from "discourse/lib/utilities";
import highlightSyntax from "discourse/lib/highlight-syntax";
import { alias } from "@ember/object/computed";
-import Site from "../models/site";
+import Site from "discourse/models/site";
import { uploadIcon } from "discourse/lib/uploads";
import { dasherize } from "@ember/string";
+import InsertHyperlink from "discourse/components/modal/insert-hyperlink";
+import { inject as service } from "@ember/service";
+
+const IMAGE_MARKDOWN_REGEX =
+ /!\[(.*?)\|(\d{1,4}x\d{1,4})(,\s*\d{1,3}%)?(.*?)\]\((upload:\/\/.*?)\)(?!(.*`))/g;
export default ComposerEditor.extend({
- layoutName: "wizard/templates/components/wizard-composer-editor",
+ modal: service(),
+
classNameBindings: ["fieldClass"],
allowUpload: true,
showLink: false,
- showHyperlinkBox: false,
topic: null,
showToolbar: true,
focusTarget: "reply",
@@ -26,7 +32,8 @@ export default ComposerEditor.extend({
popupMenuOptions: [],
draftStatus: "null",
replyPlaceholder: alias("field.translatedPlaceholder"),
- uploadingFieldId: null,
+ wizardEventFieldId: null,
+ composerEventPrefix: "wizard-editor",
@on("didInsertElement")
_composerEditorInit() {
@@ -35,7 +42,7 @@ export default ComposerEditor.extend({
if (this.siteSettings.enable_mentions) {
$input.autocomplete({
template: findRawTemplate("user-selector-autocomplete"),
- dataSource: (term) => this.userSearchTerm.call(this, term),
+ dataSource: (term) => this._userSearchTerm.call(this, term),
key: "@",
transformComplete: (v) => v.username || v.name,
afterComplete: (value) => {
@@ -75,43 +82,13 @@ export default ComposerEditor.extend({
$input.on("scroll", this._throttledSyncEditorAndPreviewScroll);
this._bindUploadTarget();
- const wizardEventNames = ["insert-text", "replace-text"];
- const eventPrefix = this.eventPrefix;
- const session = this.get("session");
- this.appEvents.reopen({
- trigger(name, ...args) {
- let eventParts = name.split(":");
- let currentEventPrefix = eventParts[0];
- let currentEventName = eventParts[1];
+ const field = this.field;
+ this.editorInputClass = `.${dasherize(field.type)}-${dasherize(
+ field.id
+ )} .d-editor-input`;
- if (
- currentEventPrefix !== "wizard-editor" &&
- wizardEventNames.some((wen) => wen === currentEventName)
- ) {
- let wizardName = name.replace(eventPrefix, "wizard-editor");
- if (currentEventName === "insert-text") {
- args = {
- text: args[0],
- };
- }
- if (currentEventName === "replace-text") {
- args = {
- oldVal: args[0],
- newVal: args[1],
- };
- }
- let wizardArgs = Object.assign(
- {},
- {
- fieldId: session.get("uploadingFieldId"),
- },
- args
- );
- return this._super(wizardName, wizardArgs);
- } else {
- return this._super(name, ...args);
- }
- },
+ this._uppyInstance.on("file-added", () => {
+ this.session.set("wizardEventFieldId", field.id);
});
},
@@ -133,17 +110,33 @@ export default ComposerEditor.extend({
return uploadIcon(false, this.siteSettings);
},
- click(e) {
- if ($(e.target).hasClass("wizard-composer-hyperlink")) {
- this.set("showHyperlinkBox", false);
+ @bind
+ _handleImageDeleteButtonClick(event) {
+ if (!event.target.classList.contains("delete-image-button")) {
+ return;
}
+
+ const index = parseInt(
+ event.target.closest(".button-wrapper").dataset.imageIndex,
+ 10
+ );
+ const matchingPlaceholder =
+ this.get("composer.reply").match(IMAGE_MARKDOWN_REGEX);
+
+ this.session.set("wizardEventFieldId", this.field.id);
+ this.appEvents.trigger(
+ "composer:replace-text",
+ matchingPlaceholder[index],
+ "",
+ { regex: IMAGE_MARKDOWN_REGEX, index }
+ );
},
actions: {
extraButtons(toolbar) {
const component = this;
- if (this.allowUpload && this.uploadIcon && !this.site.mobileView) {
+ if (this.allowUpload && this.uploadIcon) {
toolbar.addButton({
id: "upload",
group: "insertions",
@@ -159,7 +152,7 @@ export default ComposerEditor.extend({
shortcut: "K",
trimLeading: true,
unshift: true,
- sendAction: () => component.set("showHyperlinkBox", true),
+ sendAction: (event) => component.send("showLinkModal", event),
});
if (this.siteSettings.mentionables_enabled) {
@@ -188,33 +181,32 @@ export default ComposerEditor.extend({
}
},
- previewUpdated($preview) {
- highlightSyntax($preview[0], this.siteSettings, this.session);
+ previewUpdated(preview) {
+ highlightSyntax(preview, this.siteSettings, this.session);
if (this.siteSettings.mentionables_enabled) {
const { linkSeenMentionableItems } = requirejs(
"discourse/plugins/discourse-mentionables/discourse/lib/mentionable-items-preview-styling"
);
- linkSeenMentionableItems($preview, this.siteSettings);
+ linkSeenMentionableItems(preview, this.siteSettings);
}
this._super(...arguments);
},
- addLink(linkName, linkUrl) {
- let link = `[${linkName}](${linkUrl})`;
- this.appEvents.trigger("wizard-editor:insert-text", {
- fieldId: this.field.id,
- text: link,
- });
- this.set("showHyperlinkBox", false);
- },
+ showLinkModal(toolbarEvent) {
+ let linkText = "";
+ this._lastSel = toolbarEvent.selected;
- hideBox() {
- this.set("showHyperlinkBox", false);
+ if (this._lastSel) {
+ linkText = this._lastSel.value;
+ }
+ this.modal.show(InsertHyperlink, {
+ model: { linkText, toolbarEvent },
+ });
},
showUploadModal() {
- this.session.set("uploadingFieldId", this.field.id);
+ this.session.set("wizardEventFieldId", this.field.id);
document.getElementById(this.fileUploadElementId).click();
},
},
diff --git a/assets/javascripts/wizard/components/wizard-date-input.js.es6 b/assets/javascripts/discourse/components/custom-wizard-date-input.js.es6
similarity index 84%
rename from assets/javascripts/wizard/components/wizard-date-input.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-date-input.js.es6
index da2711c7..2805c370 100644
--- a/assets/javascripts/wizard/components/wizard-date-input.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-date-input.js.es6
@@ -3,7 +3,7 @@ import discourseComputed from "discourse-common/utils/decorators";
export default DateInput.extend({
useNativePicker: false,
- layoutName: "wizard/templates/components/wizard-date-input",
+ classNameBindings: ["fieldClass"],
@discourseComputed()
placeholder() {
diff --git a/assets/javascripts/wizard/components/wizard-date-time-input.js.es6 b/assets/javascripts/discourse/components/custom-wizard-date-time-input.js.es6
similarity index 86%
rename from assets/javascripts/wizard/components/wizard-date-time-input.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-date-time-input.js.es6
index 84a2b03e..1fcb62f5 100644
--- a/assets/javascripts/wizard/components/wizard-date-time-input.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-date-time-input.js.es6
@@ -2,7 +2,7 @@ import DateTimeInput from "discourse/components/date-time-input";
import discourseComputed from "discourse-common/utils/decorators";
export default DateTimeInput.extend({
- layoutName: "wizard/templates/components/wizard-date-time-input",
+ classNameBindings: ["fieldClass"],
@discourseComputed("timeFirst", "tabindex")
timeTabindex(timeFirst, tabindex) {
diff --git a/assets/javascripts/wizard/components/wizard-field-category.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-category.js.es6
similarity index 93%
rename from assets/javascripts/wizard/components/wizard-field-category.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-field-category.js.es6
index 441f83d3..65e4a1c7 100644
--- a/assets/javascripts/wizard/components/wizard-field-category.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field-category.js.es6
@@ -3,8 +3,6 @@ import Category from "discourse/models/category";
import Component from "@ember/component";
export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-category",
-
didInsertElement() {
const property = this.field.property || "id";
const value = this.field.value;
diff --git a/assets/javascripts/discourse/components/custom-wizard-field-checkbox.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-checkbox.js.es6
new file mode 100644
index 00000000..87d5ddb0
--- /dev/null
+++ b/assets/javascripts/discourse/components/custom-wizard-field-checkbox.js.es6
@@ -0,0 +1,3 @@
+import Component from "@ember/component";
+
+export default Component.extend({});
diff --git a/assets/javascripts/wizard/components/wizard-field-composer-preview.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-composer-preview.js.es6
similarity index 93%
rename from assets/javascripts/wizard/components/wizard-field-composer-preview.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-field-composer-preview.js.es6
index a2056a86..b49233f2 100644
--- a/assets/javascripts/wizard/components/wizard-field-composer-preview.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field-composer-preview.js.es6
@@ -7,8 +7,6 @@ import { ajax } from "discourse/lib/ajax";
import { on } from "discourse-common/utils/decorators";
export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-composer-preview",
-
@on("init")
updatePreview() {
if (this.isDestroyed) {
diff --git a/assets/javascripts/wizard/components/wizard-field-composer.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-composer.js.es6
similarity index 93%
rename from assets/javascripts/wizard/components/wizard-field-composer.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-field-composer.js.es6
index 255982ea..1a25344c 100644
--- a/assets/javascripts/wizard/components/wizard-field-composer.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field-composer.js.es6
@@ -6,8 +6,6 @@ import EmberObject from "@ember/object";
import Component from "@ember/component";
export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-composer",
-
showPreview: false,
classNameBindings: [
":wizard-field-composer",
diff --git a/assets/javascripts/wizard/components/wizard-field-date-time.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-date-time.js.es6
similarity index 83%
rename from assets/javascripts/wizard/components/wizard-field-date-time.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-field-date-time.js.es6
index eee98892..2d918636 100644
--- a/assets/javascripts/wizard/components/wizard-field-date-time.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field-date-time.js.es6
@@ -2,8 +2,6 @@ import Component from "@ember/component";
import { observes } from "discourse-common/utils/decorators";
export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-date-time",
-
@observes("dateTime")
setValue() {
this.set("field.value", this.dateTime.format(this.field.format));
diff --git a/assets/javascripts/wizard/components/wizard-field-date.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-date.js.es6
similarity index 84%
rename from assets/javascripts/wizard/components/wizard-field-date.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-field-date.js.es6
index df35638c..d5d0a830 100644
--- a/assets/javascripts/wizard/components/wizard-field-date.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field-date.js.es6
@@ -2,8 +2,6 @@ import Component from "@ember/component";
import { observes } from "discourse-common/utils/decorators";
export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-date",
-
@observes("date")
setValue() {
this.set("field.value", this.date.format(this.field.format));
diff --git a/assets/javascripts/wizard/components/wizard-field-dropdown.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-dropdown.js.es6
similarity index 76%
rename from assets/javascripts/wizard/components/wizard-field-dropdown.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-field-dropdown.js.es6
index e6b08102..659b8f29 100644
--- a/assets/javascripts/wizard/components/wizard-field-dropdown.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field-dropdown.js.es6
@@ -1,8 +1,6 @@
import Component from "@ember/component";
export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-dropdown",
-
keyPress(e) {
e.stopPropagation();
},
diff --git a/assets/javascripts/discourse/components/custom-wizard-field-group.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-group.js.es6
new file mode 100644
index 00000000..87d5ddb0
--- /dev/null
+++ b/assets/javascripts/discourse/components/custom-wizard-field-group.js.es6
@@ -0,0 +1,3 @@
+import Component from "@ember/component";
+
+export default Component.extend({});
diff --git a/assets/javascripts/discourse/components/custom-wizard-field-number.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-number.js.es6
new file mode 100644
index 00000000..87d5ddb0
--- /dev/null
+++ b/assets/javascripts/discourse/components/custom-wizard-field-number.js.es6
@@ -0,0 +1,3 @@
+import Component from "@ember/component";
+
+export default Component.extend({});
diff --git a/assets/javascripts/discourse/components/custom-wizard-field-tag.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-tag.js.es6
new file mode 100644
index 00000000..87d5ddb0
--- /dev/null
+++ b/assets/javascripts/discourse/components/custom-wizard-field-tag.js.es6
@@ -0,0 +1,3 @@
+import Component from "@ember/component";
+
+export default Component.extend({});
diff --git a/assets/javascripts/wizard/components/wizard-field-text.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-text.js.es6
similarity index 66%
rename from assets/javascripts/wizard/components/wizard-field-text.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-field-text.js.es6
index d9e7cca8..3e49cb35 100644
--- a/assets/javascripts/wizard/components/wizard-field-text.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field-text.js.es6
@@ -1,8 +1,6 @@
import Component from "@ember/component";
export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-text",
-
keyPress(e) {
e.stopPropagation();
},
diff --git a/assets/javascripts/wizard/components/wizard-field-textarea.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-textarea.js.es6
similarity index 65%
rename from assets/javascripts/wizard/components/wizard-field-textarea.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-field-textarea.js.es6
index e59a1707..3e49cb35 100644
--- a/assets/javascripts/wizard/components/wizard-field-textarea.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field-textarea.js.es6
@@ -1,8 +1,6 @@
import Component from "@ember/component";
export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-textarea",
-
keyPress(e) {
e.stopPropagation();
},
diff --git a/assets/javascripts/wizard/components/wizard-field-time.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-time.js.es6
similarity index 87%
rename from assets/javascripts/wizard/components/wizard-field-time.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-field-time.js.es6
index a2f2a10d..1406d63b 100644
--- a/assets/javascripts/wizard/components/wizard-field-time.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field-time.js.es6
@@ -2,7 +2,7 @@ import Component from "@ember/component";
import { observes } from "discourse-common/utils/decorators";
export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-time",
+ classNameBindings: ["fieldClass"],
@observes("time")
setValue() {
diff --git a/assets/javascripts/wizard/components/wizard-field-upload.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-upload.js.es6
similarity index 88%
rename from assets/javascripts/wizard/components/wizard-field-upload.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-field-upload.js.es6
index 4774e942..990d7daa 100644
--- a/assets/javascripts/wizard/components/wizard-field-upload.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field-upload.js.es6
@@ -3,9 +3,8 @@ import Component from "@ember/component";
import { computed } from "@ember/object";
export default Component.extend(UppyUploadMixin, {
- layoutName: "wizard/templates/components/wizard-field-upload",
classNames: ["wizard-field-upload"],
- classNameBindings: ["isImage"],
+ classNameBindings: ["isImage", "fieldClass"],
uploading: false,
type: computed(function () {
return `wizard_${this.field.id}`;
diff --git a/assets/javascripts/discourse/components/custom-wizard-field-url.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-url.js.es6
new file mode 100644
index 00000000..87d5ddb0
--- /dev/null
+++ b/assets/javascripts/discourse/components/custom-wizard-field-url.js.es6
@@ -0,0 +1,3 @@
+import Component from "@ember/component";
+
+export default Component.extend({});
diff --git a/assets/javascripts/wizard/components/wizard-field-tag.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field-user-selector.js.es6
similarity index 56%
rename from assets/javascripts/wizard/components/wizard-field-tag.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-field-user-selector.js.es6
index 473bba08..64741c6b 100644
--- a/assets/javascripts/wizard/components/wizard-field-tag.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field-user-selector.js.es6
@@ -1,5 +1,5 @@
import Component from "@ember/component";
export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-tag",
+ classNameBindings: ["fieldClass"],
});
diff --git a/assets/javascripts/wizard/components/wizard-field.js.es6 b/assets/javascripts/discourse/components/custom-wizard-field.js.es6
similarity index 70%
rename from assets/javascripts/wizard/components/wizard-field.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-field.js.es6
index 493d7676..bb368310 100644
--- a/assets/javascripts/wizard/components/wizard-field.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-field.js.es6
@@ -1,10 +1,9 @@
import Component from "@ember/component";
import { dasherize } from "@ember/string";
import discourseComputed from "discourse-common/utils/decorators";
-import { cook } from "discourse/plugins/discourse-custom-wizard/wizard/lib/text-lite";
+import { cook } from "discourse/lib/text";
export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field",
classNameBindings: [
":wizard-field",
"typeClasses",
@@ -12,6 +11,14 @@ export default Component.extend({
"field.id",
],
+ didReceiveAttrs() {
+ this._super(...arguments);
+
+ cook(this.field.translatedDescription).then((cookedDescription) => {
+ this.set("cookedDescription", cookedDescription);
+ });
+ },
+
@discourseComputed("field.type", "field.id")
typeClasses: (type, id) =>
`${dasherize(type)}-field ${dasherize(type)}-${dasherize(id)}`,
@@ -24,12 +31,7 @@ export default Component.extend({
if (["text_only"].includes(type)) {
return false;
}
- return dasherize(type === "component" ? id : `wizard-field-${type}`);
- },
-
- @discourseComputed("field.translatedDescription")
- cookedDescription(description) {
- return cook(description);
+ return dasherize(type === "component" ? id : `custom-wizard-field-${type}`);
},
@discourseComputed("field.type")
diff --git a/assets/javascripts/wizard/components/wizard-group-selector.js.es6 b/assets/javascripts/discourse/components/custom-wizard-group-selector.js.es6
similarity index 89%
rename from assets/javascripts/wizard/components/wizard-group-selector.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-group-selector.js.es6
index 4ff56ec9..cb613107 100644
--- a/assets/javascripts/wizard/components/wizard-group-selector.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-group-selector.js.es6
@@ -3,7 +3,6 @@ import { computed } from "@ember/object";
import { makeArray } from "discourse-common/lib/helpers";
export default ComboBox.extend({
- layoutName: "wizard/templates/components/wizard-group-selector",
content: computed("groups.[]", "field.content.[]", function () {
const whitelist = makeArray(this.field.content);
return this.groups
diff --git a/assets/javascripts/wizard/components/wizard-no-access.js.es6 b/assets/javascripts/discourse/components/custom-wizard-no-access.js.es6
similarity index 65%
rename from assets/javascripts/wizard/components/wizard-no-access.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-no-access.js.es6
index 492a41dc..b3b2e26c 100644
--- a/assets/javascripts/wizard/components/wizard-no-access.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-no-access.js.es6
@@ -1,11 +1,11 @@
-import CustomWizard from "../models/wizard";
+import CustomWizard from "../models/custom-wizard";
import discourseComputed from "discourse-common/utils/decorators";
import Component from "@ember/component";
import { dasherize } from "@ember/string";
+import getURL from "discourse-common/lib/get-url";
export default Component.extend({
classNameBindings: [":wizard-no-access", "reasonClass"],
- layoutName: "wizard/templates/components/wizard-no-access",
@discourseComputed("reason")
reasonClass(reason) {
@@ -19,7 +19,11 @@ export default Component.extend({
actions: {
skip() {
- CustomWizard.skip(this.get("wizardId"));
+ if (this.currentUser) {
+ CustomWizard.skip(this.get("wizardId"));
+ } else {
+ window.location = getURL("/");
+ }
},
},
});
diff --git a/assets/javascripts/wizard/components/wizard-similar-topics.js.es6 b/assets/javascripts/discourse/components/custom-wizard-similar-topics.js.es6
similarity index 92%
rename from assets/javascripts/wizard/components/wizard-similar-topics.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-similar-topics.js.es6
index 6a56873e..687cfa86 100644
--- a/assets/javascripts/wizard/components/wizard-similar-topics.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-similar-topics.js.es6
@@ -4,7 +4,6 @@ import { observes } from "discourse-common/utils/decorators";
export default Component.extend({
classNames: ["wizard-similar-topics"],
- layoutName: "wizard/templates/components/wizard-similar-topics",
showTopics: true,
didInsertElement() {
diff --git a/assets/javascripts/wizard/components/wizard-step-form.js.es6 b/assets/javascripts/discourse/components/custom-wizard-step-form.js.es6
similarity index 100%
rename from assets/javascripts/wizard/components/wizard-step-form.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-step-form.js.es6
diff --git a/assets/javascripts/wizard/components/wizard-step.js.es6 b/assets/javascripts/discourse/components/custom-wizard-step.js.es6
similarity index 78%
rename from assets/javascripts/wizard/components/wizard-step.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-step.js.es6
index cc23c5bf..250f9140 100644
--- a/assets/javascripts/wizard/components/wizard-step.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-step.js.es6
@@ -4,15 +4,16 @@ import I18n from "I18n";
import getUrl from "discourse-common/lib/get-url";
import { htmlSafe } from "@ember/template";
import { schedule } from "@ember/runloop";
-import { cook } from "discourse/plugins/discourse-custom-wizard/wizard/lib/text-lite";
-import { updateCachedWizard } from "discourse/plugins/discourse-custom-wizard/wizard/models/wizard";
+import { cook } from "discourse/lib/text";
+import CustomWizard, {
+ updateCachedWizard,
+} from "discourse/plugins/discourse-custom-wizard/discourse/models/custom-wizard";
import { alias, not } from "@ember/object/computed";
-import CustomWizard from "../models/wizard";
+import discourseLater from "discourse-common/lib/later";
const alreadyWarned = {};
export default Component.extend({
- layoutName: "wizard/templates/components/wizard-step",
classNameBindings: [":wizard-step", "step.id"],
saving: null,
@@ -21,6 +22,17 @@ export default Component.extend({
this.set("stylingDropdown", {});
},
+ didReceiveAttrs() {
+ this._super(...arguments);
+
+ cook(this.step.translatedTitle).then((cookedTitle) => {
+ this.set("cookedTitle", cookedTitle);
+ });
+ cook(this.step.translatedDescription).then((cookedDescription) => {
+ this.set("cookedDescription", cookedDescription);
+ });
+ },
+
didInsertElement() {
this._super(...arguments);
this.autoFocus();
@@ -32,16 +44,6 @@ export default Component.extend({
showNextButton: not("step.final"),
showDoneButton: alias("step.final"),
- @discourseComputed("step.translatedTitle")
- cookedTitle(title) {
- return cook(title);
- },
-
- @discourseComputed("step.translatedDescription")
- cookedDescription(description) {
- return cook(description);
- },
-
@discourseComputed(
"step.index",
"step.displayIndex",
@@ -90,16 +92,6 @@ export default Component.extend({
this.showMessage(message);
},
- keyPress(event) {
- if (event.key === "Enter") {
- if (this.showDoneButton) {
- this.send("quit");
- } else {
- this.send("nextStep");
- }
- }
- },
-
@discourseComputed("step.index", "wizard.totalSteps")
barStyle(displayIndex, totalSteps) {
let ratio = parseFloat(displayIndex) / parseFloat(totalSteps - 1);
@@ -119,34 +111,24 @@ export default Component.extend({
},
autoFocus() {
- schedule("afterRender", () => {
- const $invalid = $(
- ".wizard-field.invalid:nth-of-type(1) .wizard-focusable"
- );
-
- if ($invalid.length) {
- return $invalid.focus();
- }
-
- $(".wizard-focusable:first").focus();
+ discourseLater(() => {
+ schedule("afterRender", () => {
+ if ($(".invalid .wizard-focusable").length) {
+ this.animateInvalidFields();
+ }
+ });
});
},
animateInvalidFields() {
schedule("afterRender", () => {
- let $element = $(
- ".invalid input[type=text],.invalid textarea,.invalid input[type=checkbox],.invalid .select-kit"
- );
-
- if ($element.length) {
+ let $invalid = $(".invalid .wizard-focusable");
+ if ($invalid.length) {
$([document.documentElement, document.body]).animate(
{
- scrollTop: $element.offset().top - 200,
+ scrollTop: $invalid.offset().top - 200,
},
- 400,
- function () {
- $element.wiggle(2, 100);
- }
+ 400
);
}
});
diff --git a/assets/javascripts/wizard/components/wizard-tag-chooser.js.es6 b/assets/javascripts/discourse/components/custom-wizard-tag-chooser.js.es6
similarity index 70%
rename from assets/javascripts/wizard/components/wizard-tag-chooser.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-tag-chooser.js.es6
index 32a1fd6a..8d439aa4 100644
--- a/assets/javascripts/wizard/components/wizard-tag-chooser.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-tag-chooser.js.es6
@@ -4,7 +4,10 @@ export default TagChooser.extend({
searchTags(url, data, callback) {
if (this.tagGroups) {
let tagGroupsString = this.tagGroups.join(",");
- data.tag_groups = tagGroupsString;
+ data.filterForInput = {
+ name: "custom-wizard-tag-chooser",
+ groups: tagGroupsString,
+ };
}
return this._super(url, data, callback);
diff --git a/assets/javascripts/wizard/components/wizard-tag-selector.js.es6 b/assets/javascripts/discourse/components/custom-wizard-tag-selector.js.es6
similarity index 100%
rename from assets/javascripts/wizard/components/wizard-tag-selector.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-tag-selector.js.es6
diff --git a/assets/javascripts/wizard/components/wizard-text-field.js.es6 b/assets/javascripts/discourse/components/custom-wizard-text-field.js.es6
similarity index 84%
rename from assets/javascripts/wizard/components/wizard-text-field.js.es6
rename to assets/javascripts/discourse/components/custom-wizard-text-field.js.es6
index 5991eefc..d2832282 100644
--- a/assets/javascripts/wizard/components/wizard-text-field.js.es6
+++ b/assets/javascripts/discourse/components/custom-wizard-text-field.js.es6
@@ -1,7 +1,7 @@
import computed from "discourse-common/utils/decorators";
import { isLTR, isRTL, siteDir } from "discourse/lib/text-direction";
-import WizardI18n from "../lib/wizard-i18n";
-import TextField from "@ember/component/text-field";
+import I18n from "I18n";
+import TextField from "discourse/components/text-field";
export default TextField.extend({
attributeBindings: [
@@ -39,6 +39,6 @@ export default TextField.extend({
@computed("placeholderKey")
placeholder(placeholderKey) {
- return placeholderKey ? WizardI18n(placeholderKey) : "";
+ return placeholderKey ? I18n.t(placeholderKey) : "";
},
});
diff --git a/assets/javascripts/discourse/components/custom-wizard-time-input.js.es6 b/assets/javascripts/discourse/components/custom-wizard-time-input.js.es6
new file mode 100644
index 00000000..c09ed110
--- /dev/null
+++ b/assets/javascripts/discourse/components/custom-wizard-time-input.js.es6
@@ -0,0 +1,3 @@
+import TimeInput from "discourse/components/time-input";
+
+export default TimeInput.extend({});
diff --git a/assets/javascripts/wizard/components/field-validators.js.es6 b/assets/javascripts/discourse/components/field-validators.js.es6
similarity index 73%
rename from assets/javascripts/wizard/components/field-validators.js.es6
rename to assets/javascripts/discourse/components/field-validators.js.es6
index 7284241c..8b9b39da 100644
--- a/assets/javascripts/wizard/components/field-validators.js.es6
+++ b/assets/javascripts/discourse/components/field-validators.js.es6
@@ -1,8 +1,6 @@
import Component from "@ember/component";
export default Component.extend({
- layoutName: "wizard/templates/components/field-validators",
-
actions: {
perform() {
this.appEvents.trigger("custom-wizard:validate");
diff --git a/assets/javascripts/discourse/components/modal/admin-wizards-columns.hbs b/assets/javascripts/discourse/components/modal/admin-wizards-columns.hbs
new file mode 100644
index 00000000..5e3829da
--- /dev/null
+++ b/assets/javascripts/discourse/components/modal/admin-wizards-columns.hbs
@@ -0,0 +1,34 @@
+
+ {{#if loading}}
+
+ {{else}}
+
+ {{#each @model.columns as |column|}}
+
+
+
+
+ {{directory-table-header-title
+ field=column.label
+ translated=true
+ }}
+
+
+
+ {{/each}}
+
+ {{/if}}
+
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/components/modal/admin-wizards-columns.js b/assets/javascripts/discourse/components/modal/admin-wizards-columns.js
new file mode 100644
index 00000000..8204f6c3
--- /dev/null
+++ b/assets/javascripts/discourse/components/modal/admin-wizards-columns.js
@@ -0,0 +1,17 @@
+import Component from "@glimmer/component";
+import { action } from "@ember/object";
+import I18n from "I18n";
+
+export default class AdminWizardsColumnComponent extends Component {
+ title = I18n.t("admin.wizard.edit_columns");
+
+ @action
+ save() {
+ this.args.closeModal();
+ }
+
+ @action
+ resetToDefault() {
+ this.args.model.reset();
+ }
+}
diff --git a/assets/javascripts/discourse/components/modal/next-session-scheduled.hbs b/assets/javascripts/discourse/components/modal/next-session-scheduled.hbs
new file mode 100644
index 00000000..2bb4a784
--- /dev/null
+++ b/assets/javascripts/discourse/components/modal/next-session-scheduled.hbs
@@ -0,0 +1,20 @@
+
+
+
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/components/modal/next-session-scheduled.js b/assets/javascripts/discourse/components/modal/next-session-scheduled.js
new file mode 100644
index 00000000..e5b719f8
--- /dev/null
+++ b/assets/javascripts/discourse/components/modal/next-session-scheduled.js
@@ -0,0 +1,32 @@
+import Component from "@glimmer/component";
+import { tracked } from "@glimmer/tracking";
+import { action } from "@ember/object";
+import I18n from "I18n";
+
+export default class NextSessionScheduledComponent extends Component {
+ @tracked bufferedDateTime;
+ title = I18n.t("admin.wizard.after_time_modal.title");
+
+ constructor() {
+ super(...arguments);
+ this.bufferedDateTime = this.args.model.dateTime
+ ? moment(this.args.model.dateTime)
+ : moment(Date.now());
+ }
+
+ get submitDisabled() {
+ return moment().isAfter(this.bufferedDateTime);
+ }
+
+ @action
+ submit() {
+ const dateTime = this.bufferedDateTime;
+ this.args.model.update(moment(dateTime).utc().toISOString());
+ this.args.closeModal();
+ }
+
+ @action
+ dateTimeChanged(dateTime) {
+ this.bufferedDateTime = dateTime;
+ }
+}
diff --git a/assets/javascripts/wizard/components/similar-topics-validator.js.es6 b/assets/javascripts/discourse/components/similar-topics-validator.js.es6
similarity index 96%
rename from assets/javascripts/wizard/components/similar-topics-validator.js.es6
rename to assets/javascripts/discourse/components/similar-topics-validator.js.es6
index 4f722123..634af983 100644
--- a/assets/javascripts/wizard/components/similar-topics-validator.js.es6
+++ b/assets/javascripts/discourse/components/similar-topics-validator.js.es6
@@ -1,4 +1,4 @@
-import WizardFieldValidator from "../../wizard/components/validator";
+import WizardFieldValidator from "discourse/plugins/discourse-custom-wizard/discourse/components/validator";
import { deepMerge } from "discourse-common/lib/object";
import discourseComputed, { observes } from "discourse-common/utils/decorators";
import { cancel, later } from "@ember/runloop";
@@ -10,7 +10,6 @@ import { dasherize } from "@ember/string";
export default WizardFieldValidator.extend({
classNames: ["similar-topics-validator"],
- layoutName: "wizard/templates/components/similar-topics-validator",
similarTopics: null,
hasInput: notEmpty("field.value"),
hasSimilarTopics: notEmpty("similarTopics"),
diff --git a/assets/javascripts/wizard/components/validator.js.es6 b/assets/javascripts/discourse/components/validator.js.es6
similarity index 87%
rename from assets/javascripts/wizard/components/validator.js.es6
rename to assets/javascripts/discourse/components/validator.js.es6
index aa68660c..3c19cc3d 100644
--- a/assets/javascripts/wizard/components/validator.js.es6
+++ b/assets/javascripts/discourse/components/validator.js.es6
@@ -1,12 +1,10 @@
import Component from "@ember/component";
import { equal } from "@ember/object/computed";
-import { ajax } from "discourse/lib/ajax";
-import { getToken } from "wizard/lib/ajax";
+import { ajax, getToken } from "discourse/lib/ajax";
export default Component.extend({
classNames: ["validator"],
classNameBindings: ["isValid", "isInvalid"],
- layoutName: "wizard/templates/components/validator",
validMessageKey: null,
invalidMessageKey: null,
isValid: null,
diff --git a/assets/javascripts/discourse/components/wizard-advanced-toggle.js.es6 b/assets/javascripts/discourse/components/wizard-advanced-toggle.js.es6
deleted file mode 100644
index c6e1fd9c..00000000
--- a/assets/javascripts/discourse/components/wizard-advanced-toggle.js.es6
+++ /dev/null
@@ -1,21 +0,0 @@
-import { default as discourseComputed } from "discourse-common/utils/decorators";
-import Component from "@ember/component";
-
-export default Component.extend({
- classNames: "wizard-advanced-toggle",
-
- @discourseComputed("showAdvanced")
- toggleClass(showAdvanced) {
- let classes = "btn";
- if (showAdvanced) {
- classes += " btn-primary";
- }
- return classes;
- },
-
- actions: {
- toggleAdvanced() {
- this.toggleProperty("showAdvanced");
- },
- },
-});
diff --git a/assets/javascripts/discourse/components/wizard-custom-action.js.es6 b/assets/javascripts/discourse/components/wizard-custom-action.js.es6
index feb83754..b9329617 100644
--- a/assets/javascripts/discourse/components/wizard-custom-action.js.es6
+++ b/assets/javascripts/discourse/components/wizard-custom-action.js.es6
@@ -1,8 +1,7 @@
import { default as discourseComputed } from "discourse-common/utils/decorators";
-import { and, empty, equal, or } from "@ember/object/computed";
+import { empty, equal, or } from "@ember/object/computed";
import { notificationLevels, selectKitContent } from "../lib/wizard";
import { computed } from "@ember/object";
-import wizardSchema from "../lib/wizard-schema";
import UndoChanges from "../mixins/undo-changes";
import Component from "@ember/component";
import I18n from "I18n";
@@ -16,6 +15,7 @@ export default Component.extend(UndoChanges, {
createTopic: equal("action.type", "create_topic"),
updateProfile: equal("action.type", "update_profile"),
watchCategories: equal("action.type", "watch_categories"),
+ watchTags: equal("action.type", "watch_tags"),
sendMessage: equal("action.type", "send_message"),
openComposer: equal("action.type", "open_composer"),
sendToApi: equal("action.type", "send_to_api"),
@@ -25,8 +25,6 @@ export default Component.extend(UndoChanges, {
createGroup: equal("action.type", "create_group"),
apiEmpty: empty("action.api"),
groupPropertyTypes: selectKitContent(["id", "name"]),
- hasAdvanced: or("hasCustomFields", "routeTo"),
- showAdvanced: and("hasAdvanced", "action.type"),
hasCustomFields: or(
"basicTopicFields",
"updateProfile",
@@ -36,22 +34,15 @@ export default Component.extend(UndoChanges, {
basicTopicFields: or("createTopic", "sendMessage", "openComposer"),
publicTopicFields: or("createTopic", "openComposer"),
showPostAdvanced: or("createTopic", "sendMessage"),
- actionTypes: Object.keys(wizardSchema.action.types).map((type) => {
- return {
- id: type,
- name: I18n.t(`admin.wizard.action.${type}.label`),
- };
- }),
availableNotificationLevels: notificationLevels.map((type) => {
return {
id: type,
- name: I18n.t(
- `admin.wizard.action.watch_categories.notification_level.${type}`
- ),
+ name: I18n.t(`admin.wizard.action.watch_x.notification_level.${type}`),
};
}),
- messageUrl: "https://thepavilion.io/t/2810",
+ messageUrl:
+ "https://pavilion.tech/products/discourse-custom-wizard-plugin/documentation/action-settings",
@discourseComputed("action.type")
messageKey(type) {
@@ -101,4 +92,14 @@ export default Component.extend(UndoChanges, {
}
return apis.find((a) => a.name === api).endpoints;
},
+
+ @discourseComputed("fieldTypes")
+ hasEventField(fieldTypes) {
+ return fieldTypes.map((ft) => ft.id).includes("event");
+ },
+
+ @discourseComputed("fieldTypes")
+ hasLocationField(fieldTypes) {
+ return fieldTypes.map((ft) => ft.id).includes("location");
+ },
});
diff --git a/assets/javascripts/discourse/components/wizard-custom-field.js.es6 b/assets/javascripts/discourse/components/wizard-custom-field.js.es6
index 8efb7f0c..b19667ad 100644
--- a/assets/javascripts/discourse/components/wizard-custom-field.js.es6
+++ b/assets/javascripts/discourse/components/wizard-custom-field.js.es6
@@ -1,5 +1,5 @@
import { default as discourseComputed } from "discourse-common/utils/decorators";
-import { alias, equal, or } from "@ember/object/computed";
+import { equal, or } from "@ember/object/computed";
import { computed } from "@ember/object";
import { selectKitContent } from "../lib/wizard";
import UndoChanges from "../mixins/undo-changes";
@@ -27,8 +27,8 @@ export default Component.extend(UndoChanges, {
isTextType: or("isText", "isTextarea", "isComposer"),
isComposerPreview: equal("field.type", "composer_preview"),
categoryPropertyTypes: selectKitContent(["id", "slug"]),
- showAdvanced: alias("field.type"),
- messageUrl: "https://thepavilion.io/t/2809",
+ messageUrl:
+ "https://pavilion.tech/products/discourse-custom-wizard-plugin/documentation/field-settings",
@discourseComputed("field.type")
validations(type) {
@@ -144,11 +144,17 @@ export default Component.extend(UndoChanges, {
actions: {
imageUploadDone(upload) {
- this.set("field.image", upload.url);
+ this.setProperties({
+ "field.image": upload.url,
+ "field.image_upload_id": upload.id,
+ });
},
imageUploadDeleted() {
- this.set("field.image", null);
+ this.setProperties({
+ "field.image": null,
+ "field.image_upload_id": null,
+ });
},
},
});
diff --git a/assets/javascripts/discourse/components/wizard-custom-step.js.es6 b/assets/javascripts/discourse/components/wizard-custom-step.js.es6
index 2a07dd65..7605d8a4 100644
--- a/assets/javascripts/discourse/components/wizard-custom-step.js.es6
+++ b/assets/javascripts/discourse/components/wizard-custom-step.js.es6
@@ -24,11 +24,17 @@ export default Component.extend({
actions: {
bannerUploadDone(upload) {
- this.set("step.banner", upload.url);
+ this.setProperties({
+ "step.banner": upload.url,
+ "step.banner_upload_id": upload.id,
+ });
},
bannerUploadDeleted() {
- this.set("step.banner", null);
+ this.setProperties({
+ "step.banner": null,
+ "step.banner_upload_id": null,
+ });
},
},
});
diff --git a/assets/javascripts/discourse/components/wizard-links.js.es6 b/assets/javascripts/discourse/components/wizard-links.js.es6
index bf0dd242..6d02987a 100644
--- a/assets/javascripts/discourse/components/wizard-links.js.es6
+++ b/assets/javascripts/discourse/components/wizard-links.js.es6
@@ -71,6 +71,17 @@ export default Component.extend({
});
},
+ getNextIndex() {
+ const items = this.items;
+ if (!items || items.length === 0) {
+ return 0;
+ }
+ const numbers = items
+ .map((i) => Number(i.id.split("_").pop()))
+ .sort((a, b) => a - b);
+ return numbers[numbers.length - 1];
+ },
+
actions: {
add() {
const items = this.get("items");
@@ -78,7 +89,7 @@ export default Component.extend({
let params = setWizardDefaults({}, itemType);
params.isNew = true;
- params.index = items.length;
+ params.index = this.getNextIndex();
let id = `${itemType}_${params.index + 1}`;
if (itemType === "field") {
diff --git a/assets/javascripts/discourse/components/wizard-mapper-selector.js.es6 b/assets/javascripts/discourse/components/wizard-mapper-selector.js.es6
index 8a2ae9ce..eb9e735a 100644
--- a/assets/javascripts/discourse/components/wizard-mapper-selector.js.es6
+++ b/assets/javascripts/discourse/components/wizard-mapper-selector.js.es6
@@ -4,7 +4,7 @@ import {
default as discourseComputed,
observes,
} from "discourse-common/utils/decorators";
-import { getOwner } from "discourse-common/lib/get-owner";
+import { getOwner } from "@ember/application";
import { defaultSelectionType, selectionTypes } from "../lib/wizard-mapper";
import {
generateName,
@@ -15,6 +15,7 @@ import {
import Component from "@ember/component";
import { bind, later } from "@ember/runloop";
import I18n from "I18n";
+import { inject as service } from "@ember/service";
const customFieldActionMap = {
topic: ["create_topic", "send_message"],
@@ -28,6 +29,7 @@ const values = ["present", "true", "false"];
export default Component.extend({
classNameBindings: [":mapper-selector", "activeType"],
+ subscription: service(),
showText: computed("activeType", function () {
return this.showInput("text");
@@ -116,6 +118,9 @@ export default Component.extend({
groupEnabled: computed("options.groupSelection", "inputType", function () {
return this.optionEnabled("groupSelection");
}),
+ guestGroup: computed("options.guestGroup", "inputType", function () {
+ return this.optionEnabled("guestGroup");
+ }),
userEnabled: computed("options.userSelection", "inputType", function () {
return this.optionEnabled("userSelection");
}),
@@ -126,7 +131,33 @@ export default Component.extend({
return this.connector === "is";
}),
- groups: alias("site.groups"),
+ @discourseComputed(
+ "site.groups",
+ "guestGroup",
+ "subscription.subscriptionType"
+ )
+ groups(groups, guestGroup, subscriptionType) {
+ let result = groups;
+ if (!guestGroup) {
+ return result;
+ }
+
+ if (["standard", "business"].includes(subscriptionType)) {
+ let guestIndex;
+ result.forEach((r, index) => {
+ if (r.id === 0) {
+ r.name = I18n.t("admin.wizard.selector.label.users");
+ guestIndex = index;
+ }
+ });
+ result.splice(guestIndex, 0, {
+ id: -1,
+ name: I18n.t("admin.wizard.selector.label.guests"),
+ });
+ }
+
+ return result;
+ },
categories: alias("site.categories"),
showComboBox: or(
"showWizardField",
@@ -377,7 +408,7 @@ export default Component.extend({
this.changeValue(event.target.value);
},
- changeUserValue(previousValue, value) {
+ changeUserValue(value) {
this.changeValue(value);
},
},
diff --git a/assets/javascripts/discourse/components/wizard-mapper.js.es6 b/assets/javascripts/discourse/components/wizard-mapper.js.es6
index 95aabb1c..ec58e3f2 100644
--- a/assets/javascripts/discourse/components/wizard-mapper.js.es6
+++ b/assets/javascripts/discourse/components/wizard-mapper.js.es6
@@ -32,6 +32,7 @@ export default Component.extend({
pairConnector: options.pairConnector || null,
outputConnector: options.outputConnector || null,
context: options.context || null,
+ guestGroup: options.guestGroup || false,
};
let inputTypes = ["key", "value", "output"];
diff --git a/assets/javascripts/discourse/components/wizard-message.js.es6 b/assets/javascripts/discourse/components/wizard-message.js.es6
index b273e78b..686a7254 100644
--- a/assets/javascripts/discourse/components/wizard-message.js.es6
+++ b/assets/javascripts/discourse/components/wizard-message.js.es6
@@ -6,6 +6,7 @@ import I18n from "I18n";
const icons = {
error: "times-circle",
success: "check-circle",
+ warn: "exclamation-circle",
info: "info-circle",
};
diff --git a/assets/javascripts/discourse/components/wizard-realtime-validations.js.es6 b/assets/javascripts/discourse/components/wizard-realtime-validations.js.es6
index 8332b86e..b1d8a0f5 100644
--- a/assets/javascripts/discourse/components/wizard-realtime-validations.js.es6
+++ b/assets/javascripts/discourse/components/wizard-realtime-validations.js.es6
@@ -6,7 +6,8 @@ import discourseComputed from "discourse-common/utils/decorators";
import I18n from "I18n";
export default Component.extend({
- classNames: ["realtime-validations"],
+ classNames: ["realtime-validations", "setting", "full", "subscription"],
+
@discourseComputed
timeUnits() {
return ["days", "weeks", "months", "years"].map((unit) => {
diff --git a/assets/javascripts/discourse/components/wizard-subscription-badge.hbs b/assets/javascripts/discourse/components/wizard-subscription-badge.hbs
new file mode 100644
index 00000000..992504bb
--- /dev/null
+++ b/assets/javascripts/discourse/components/wizard-subscription-badge.hbs
@@ -0,0 +1,19 @@
+
+ {{#if this.updating}}
+ {{loading-spinner size="small"}}
+ {{/if}}
+
+
+ {{d-icon "pavilion-logo"}}
+ {{this.label}}
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/components/wizard-subscription-badge.js b/assets/javascripts/discourse/components/wizard-subscription-badge.js
new file mode 100644
index 00000000..be14b6f8
--- /dev/null
+++ b/assets/javascripts/discourse/components/wizard-subscription-badge.js
@@ -0,0 +1,46 @@
+import { inject as service } from "@ember/service";
+import { action, computed } from "@ember/object";
+import Component from "@glimmer/component";
+import { tracked } from "@glimmer/tracking";
+import I18n from "I18n";
+
+export default class WizardSubscriptionBadge extends Component {
+ @service subscription;
+ @tracked updating = false;
+ @tracked updateIcon = "sync";
+ basePath = "/admin/plugins/subscription-client";
+
+ @computed("subscription.subscriptionType")
+ get i18nKey() {
+ return `admin.wizard.subscription.type.${
+ this.subscription.subscriptionType
+ ? this.subscription.subscriptionType
+ : "none"
+ }`;
+ }
+
+ @computed("i18nKey")
+ get title() {
+ return `${this.i18nKey}.title`;
+ }
+
+ @computed("i18nKey")
+ get label() {
+ return I18n.t(`${this.i18nKey}.label`);
+ }
+
+ @action
+ click() {
+ window.open(this.subscription.subscriptionCtaLink, "_blank").focus();
+ }
+
+ @action
+ update() {
+ this.updating = true;
+ this.updateIcon = null;
+ this.subscription.updateSubscriptionStatus().finally(() => {
+ this.updateIcon = "sync";
+ this.updating = false;
+ });
+ }
+}
diff --git a/assets/javascripts/discourse/components/wizard-subscription-container.hbs b/assets/javascripts/discourse/components/wizard-subscription-container.hbs
new file mode 100644
index 00000000..a59263ed
--- /dev/null
+++ b/assets/javascripts/discourse/components/wizard-subscription-container.hbs
@@ -0,0 +1,17 @@
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/components/wizard-subscription-container.js b/assets/javascripts/discourse/components/wizard-subscription-container.js
new file mode 100644
index 00000000..060d7af6
--- /dev/null
+++ b/assets/javascripts/discourse/components/wizard-subscription-container.js
@@ -0,0 +1,26 @@
+import Component from "@glimmer/component";
+import { computed } from "@ember/object";
+import { inject as service } from "@ember/service";
+
+export default class WizardSubscriptionContainer extends Component {
+ @service subscription;
+
+ @computed("subscription.subscribed")
+ get subscribedIcon() {
+ return this.subscription.subscribed ? "check" : "times";
+ }
+
+ @computed("subscription.subscribed")
+ get subscribedLabel() {
+ return `admin.wizard.subscription.${
+ this.subscription.subscribed ? "subscribed" : "not_subscribed"
+ }.label`;
+ }
+
+ @computed("subscription.subscribed")
+ get subscribedTitle() {
+ return `admin.wizard.subscription.${
+ this.subscription.subscribed ? "subscribed" : "not_subscribed"
+ }.title`;
+ }
+}
diff --git a/assets/javascripts/discourse/components/wizard-subscription-selector.js.es6 b/assets/javascripts/discourse/components/wizard-subscription-selector.js.es6
new file mode 100644
index 00000000..b7203c30
--- /dev/null
+++ b/assets/javascripts/discourse/components/wizard-subscription-selector.js.es6
@@ -0,0 +1,96 @@
+import SingleSelectComponent from "select-kit/components/single-select";
+import { inject as service } from "@ember/service";
+import { filterValues } from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard-schema";
+import discourseComputed from "discourse-common/utils/decorators";
+import I18n from "I18n";
+
+const nameKey = function (feature, attribute, value) {
+ if (feature === "action") {
+ return `admin.wizard.action.${value}.label`;
+ } else {
+ return `admin.wizard.${feature}.${attribute}.${value}`;
+ }
+};
+
+export default SingleSelectComponent.extend({
+ classNames: ["combo-box", "wizard-subscription-selector"],
+ subscription: service(),
+
+ selectKitOptions: {
+ autoFilterable: false,
+ filterable: false,
+ showFullTitle: true,
+ headerComponent:
+ "wizard-subscription-selector/wizard-subscription-selector-header",
+ caretUpIcon: "caret-up",
+ caretDownIcon: "caret-down",
+ },
+
+ allowedSubscriptionTypes(feature, attribute, value) {
+ let attributes = this.subscription.subscriptionAttributes[feature];
+ if (!attributes || !attributes[attribute]) {
+ return ["none"];
+ }
+ let allowedTypes = [];
+ Object.keys(attributes[attribute]).forEach((subscriptionType) => {
+ let values = attributes[attribute][subscriptionType];
+ if (values[0] === "*" || values.includes(value)) {
+ allowedTypes.push(subscriptionType);
+ }
+ });
+ return allowedTypes;
+ },
+
+ @discourseComputed("feature", "attribute", "wizard.allowGuests")
+ content(feature, attribute) {
+ return filterValues(this.wizard, feature, attribute)
+ .map((value) => {
+ let allowedSubscriptionTypes = this.allowedSubscriptionTypes(
+ feature,
+ attribute,
+ value
+ );
+
+ let subscriptionRequired =
+ allowedSubscriptionTypes.length &&
+ !allowedSubscriptionTypes.includes("none");
+
+ let attrs = {
+ id: value,
+ name: I18n.t(nameKey(feature, attribute, value)),
+ subscriptionRequired,
+ };
+ if (subscriptionRequired) {
+ let subscribed = allowedSubscriptionTypes.includes(
+ this.subscription.subscriptionType
+ );
+ let selectorKey = subscribed ? "subscribed" : "not_subscribed";
+ let selectorLabel = `admin.wizard.subscription.${selectorKey}.selector`;
+
+ attrs.disabled = !subscribed;
+ attrs.selectorLabel = selectorLabel;
+ }
+
+ return attrs;
+ })
+ .sort(function (a, b) {
+ if (a.subscriptionType && !b.subscriptionType) {
+ return 1;
+ }
+ if (!a.subscriptionType && b.subscriptionType) {
+ return -1;
+ }
+ if (a.subscriptionType === b.subscriptionType) {
+ return a.subscriptionType
+ ? a.subscriptionType.localeCompare(b.subscriptionType)
+ : 0;
+ } else {
+ return a.subscriptionType === "standard" ? -1 : 0;
+ }
+ });
+ },
+
+ modifyComponentForRow() {
+ return "wizard-subscription-selector/wizard-subscription-selector-row";
+ },
+});
diff --git a/assets/javascripts/discourse/components/wizard-subscription-selector/wizard-subscription-selector-header.js.es6 b/assets/javascripts/discourse/components/wizard-subscription-selector/wizard-subscription-selector-header.js.es6
new file mode 100644
index 00000000..74f29f08
--- /dev/null
+++ b/assets/javascripts/discourse/components/wizard-subscription-selector/wizard-subscription-selector-header.js.es6
@@ -0,0 +1,17 @@
+import SingleSelectHeaderComponent from "select-kit/components/select-kit/single-select-header";
+import { computed } from "@ember/object";
+import { reads } from "@ember/object/computed";
+
+export default SingleSelectHeaderComponent.extend({
+ classNames: ["combo-box-header", "wizard-subscription-selector-header"],
+ caretUpIcon: reads("selectKit.options.caretUpIcon"),
+ caretDownIcon: reads("selectKit.options.caretDownIcon"),
+ caretIcon: computed(
+ "selectKit.isExpanded",
+ "caretUpIcon",
+ "caretDownIcon",
+ function () {
+ return this.selectKit.isExpanded ? this.caretUpIcon : this.caretDownIcon;
+ }
+ ),
+});
diff --git a/assets/javascripts/discourse/components/wizard-subscription-selector/wizard-subscription-selector-row.js.es6 b/assets/javascripts/discourse/components/wizard-subscription-selector/wizard-subscription-selector-row.js.es6
new file mode 100644
index 00000000..1d43047a
--- /dev/null
+++ b/assets/javascripts/discourse/components/wizard-subscription-selector/wizard-subscription-selector-row.js.es6
@@ -0,0 +1,20 @@
+import SelectKitRowComponent from "select-kit/components/select-kit/select-kit-row";
+import { default as discourseComputed } from "discourse-common/utils/decorators";
+
+export default SelectKitRowComponent.extend({
+ classNameBindings: ["isDisabled:disabled"],
+
+ @discourseComputed("item")
+ isDisabled() {
+ return this.item.disabled;
+ },
+
+ click(event) {
+ event.preventDefault();
+ event.stopPropagation();
+ if (!this.item.disabled) {
+ this.selectKit.select(this.rowValue, this.item);
+ }
+ return false;
+ },
+});
diff --git a/assets/javascripts/discourse/components/wizard-subscription-status.hbs b/assets/javascripts/discourse/components/wizard-subscription-status.hbs
new file mode 100644
index 00000000..5309558c
--- /dev/null
+++ b/assets/javascripts/discourse/components/wizard-subscription-status.hbs
@@ -0,0 +1,22 @@
+
+
+ {{#if authorized}}
+ {{conditional-loading-spinner size="small" condition=unauthorizing}}
+
+ {{i18n "admin.wizard.subscription.deauthorize.label"}}
+
+ {{else}}
+
+ {{/if}}
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/components/wizard-subscription-status.js b/assets/javascripts/discourse/components/wizard-subscription-status.js
new file mode 100644
index 00000000..e8efc49c
--- /dev/null
+++ b/assets/javascripts/discourse/components/wizard-subscription-status.js
@@ -0,0 +1,53 @@
+import { action } from "@ember/object";
+import { inject as service } from "@ember/service";
+import Component from "@glimmer/component";
+import { tracked } from "@glimmer/tracking";
+import { ajax } from "discourse/lib/ajax";
+import { popupAjaxError } from "discourse/lib/ajax-error";
+
+export default class WizardSubscriptionStatus extends Component {
+ @service siteSettings;
+ @service subscription;
+ @tracked supplierId = null;
+ @tracked authorized = false;
+ @tracked unauthorizing = false;
+ basePath = "/admin/plugins/subscription-client/suppliers";
+
+ constructor() {
+ super(...arguments);
+ ajax(`${this.basePath}`)
+ .then((result) => {
+ this.supplierId = result.suppliers[0].id;
+ this.authorized = result.suppliers[0].authorized;
+ })
+ .finally(() => {
+ this.subscription.retrieveSubscriptionStatus();
+ });
+ }
+
+ @action
+ authorize() {
+ window.location.href = `${this.basePath}/authorize?supplier_id=${this.supplierId}&final_landing_path=/admin/wizards/wizard`;
+ }
+
+ @action
+ deauthorize() {
+ this.unauthorizing = true;
+
+ ajax(`${this.basePath}/authorize`, {
+ type: "DELETE",
+ data: {
+ supplier_id: this.supplierId,
+ },
+ })
+ .then((result) => {
+ this.supplierId = result.supplier.id;
+ this.authorized = !(result.supplier.authorized_at === null);
+ })
+ .finally(() => {
+ this.unauthorizing = false;
+ this.subscription.retrieveSubscriptionStatus();
+ })
+ .catch(popupAjaxError);
+ }
+}
diff --git a/assets/javascripts/discourse/components/wizard-table-field.js.es6 b/assets/javascripts/discourse/components/wizard-table-field.js.es6
new file mode 100644
index 00000000..93859f1f
--- /dev/null
+++ b/assets/javascripts/discourse/components/wizard-table-field.js.es6
@@ -0,0 +1,139 @@
+import Component from "@ember/component";
+import { action } from "@ember/object";
+import { equal, notEmpty } from "@ember/object/computed";
+import discourseComputed from "discourse-common/utils/decorators";
+import I18n from "I18n";
+
+export default Component.extend({
+ classNameBindings: ["value.type"],
+ isText: equal("value.type", "text"),
+ isComposer: equal("value.type", "composer"),
+ isDate: equal("value.type", "date"),
+ isTime: equal("value.type", "time"),
+ isDateTime: equal("value.type", "date_time"),
+ isNumber: equal("value.type", "number"),
+ isCheckbox: equal("value.type", "checkbox"),
+ isUrl: equal("value.type", "url"),
+ isUpload: equal("value.type", "upload"),
+ isDropdown: equal("value.type", "dropdown"),
+ isTag: equal("value.type", "tag"),
+ isCategory: equal("value.type", "category"),
+ isGroup: equal("value.type", "group"),
+ isUserSelector: equal("value.type", "user_selector"),
+ isSubmittedAt: equal("field", "submitted_at"),
+ isComposerPreview: equal("value.type", "composer_preview"),
+ textState: "text-collapsed",
+ toggleText: I18n.t("admin.wizard.expand_text"),
+
+ @discourseComputed("value", "isUser", "isSubmittedAt")
+ hasValue(value, isUser, isSubmittedAt) {
+ if (isUser || isSubmittedAt) {
+ return value;
+ }
+ return value && value.value;
+ },
+
+ @discourseComputed("field", "value.type")
+ isUser(field, type) {
+ return field === "username" || field === "user" || type === "user";
+ },
+
+ @discourseComputed("value.type")
+ isLongtext(type) {
+ return type === "textarea" || type === "long_text";
+ },
+
+ @discourseComputed("value")
+ checkboxValue(value) {
+ const isCheckbox = this.get("isCheckbox");
+ if (isCheckbox) {
+ if (value.value.includes("true")) {
+ return true;
+ } else if (value.value.includes("false")) {
+ return false;
+ }
+ }
+ },
+
+ @action
+ expandText() {
+ const state = this.get("textState");
+
+ if (state === "text-collapsed") {
+ this.set("textState", "text-expanded");
+ this.set("toggleText", I18n.t("admin.wizard.collapse_text"));
+ } else if (state === "text-expanded") {
+ this.set("textState", "text-collapsed");
+ this.set("toggleText", I18n.t("admin.wizard.expand_text"));
+ }
+ },
+
+ @discourseComputed("value")
+ file(value) {
+ const isUpload = this.get("isUpload");
+ if (isUpload) {
+ return value.value;
+ }
+ },
+
+ @discourseComputed("value")
+ submittedUsers(value) {
+ const isUserSelector = this.get("isUserSelector");
+ const users = [];
+
+ if (isUserSelector) {
+ const userData = value.value;
+ const usernames = [];
+
+ if (userData.indexOf(",")) {
+ usernames.push(...userData.split(","));
+
+ usernames.forEach((u) => {
+ const user = {
+ username: u,
+ url: `/u/${u}`,
+ };
+ users.push(user);
+ });
+ }
+ }
+ return users;
+ },
+
+ @discourseComputed("isUser", "field", "value")
+ username(isUser, field, value) {
+ if (isUser) {
+ return value.username;
+ }
+ if (field === "username") {
+ return value.value;
+ }
+ return null;
+ },
+
+ showUsername: notEmpty("username"),
+
+ @discourseComputed("username")
+ userProfileUrl(username) {
+ if (username) {
+ return `/u/${username}`;
+ }
+ return "/";
+ },
+
+ @discourseComputed("value")
+ categoryUrl(value) {
+ const isCategory = this.get("isCategory");
+ if (isCategory) {
+ return `/c/${value.value}`;
+ }
+ },
+
+ @discourseComputed("value")
+ groupUrl(value) {
+ const isGroup = this.get("isGroup");
+ if (isGroup) {
+ return `/g/${value.value}`;
+ }
+ },
+});
diff --git a/assets/javascripts/discourse/components/wizard-text-editor.js.es6 b/assets/javascripts/discourse/components/wizard-text-editor.js.es6
index 88d7200c..b6d07cef 100644
--- a/assets/javascripts/discourse/components/wizard-text-editor.js.es6
+++ b/assets/javascripts/discourse/components/wizard-text-editor.js.es6
@@ -5,11 +5,7 @@ import { scheduleOnce } from "@ember/runloop";
import Component from "@ember/component";
import I18n from "I18n";
-const excludedUserProperties = [
- "avatar",
- "profile_background",
- "card_background",
-];
+const excludedUserProperties = ["profile_background", "card_background"];
export default Component.extend({
classNames: "wizard-text-editor",
@@ -52,12 +48,12 @@ export default Component.extend({
@discourseComputed("wizardFields")
wizardFieldList(wizardFields) {
- return wizardFields.map((f) => ` w{${f.id}}`);
+ return (wizardFields || []).map((f) => ` w{${f.id}}`);
},
@discourseComputed("wizardActions")
wizardActionList(wizardActions) {
- return wizardActions.map((a) => ` w{${a.id}}`);
+ return (wizardActions || []).map((a) => ` w{${a.id}}`);
},
actions: {
diff --git a/assets/javascripts/discourse/connectors/admin-menu/wizards-nav-button.hbs b/assets/javascripts/discourse/connectors/admin-menu/wizards-nav-button.hbs
index f76722fc..0aef2dcb 100644
--- a/assets/javascripts/discourse/connectors/admin-menu/wizards-nav-button.hbs
+++ b/assets/javascripts/discourse/connectors/admin-menu/wizards-nav-button.hbs
@@ -1,3 +1,7 @@
{{#if currentUser.admin}}
{{nav-item route="adminWizards" label="admin.wizard.nav_label"}}
-{{/if}}
+
+ {{#if wizardErrorNotice}}
+ {{d-icon "exclaimation-circle"}}
+ {{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/connectors/category-custom-settings/custom-wizard-category-settings.hbs b/assets/javascripts/discourse/connectors/category-custom-settings/custom-wizard-category-settings.hbs
index 4b5d673d..2c6a6975 100644
--- a/assets/javascripts/discourse/connectors/category-custom-settings/custom-wizard-category-settings.hbs
+++ b/assets/javascripts/discourse/connectors/category-custom-settings/custom-wizard-category-settings.hbs
@@ -6,11 +6,10 @@
{{combo-box
- value=wizardListVal
- content=wizardList
- onChange=(action "changeWizard")
- options=(hash
- none="admin.wizard.select"
- )}}
+ value=wizardListVal
+ content=wizardList
+ onChange=(action "changeWizard")
+ options=(hash none="admin.wizard.select")
+ }}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/connectors/category-custom-settings/custom-wizard-category-settings.js.es6 b/assets/javascripts/discourse/connectors/category-custom-settings/custom-wizard-category-settings.js.es6
index 16352f95..7004c317 100644
--- a/assets/javascripts/discourse/connectors/category-custom-settings/custom-wizard-category-settings.js.es6
+++ b/assets/javascripts/discourse/connectors/category-custom-settings/custom-wizard-category-settings.js.es6
@@ -1,9 +1,9 @@
-import CustomWizard from "../../models/custom-wizard";
+import CustomWizardAdmin from "../../models/custom-wizard-admin";
import { popupAjaxError } from "discourse/lib/ajax-error";
export default {
setupComponent(attrs, component) {
- CustomWizard.all()
+ CustomWizardAdmin.all()
.then((result) => {
component.set("wizardList", result);
})
diff --git a/assets/javascripts/discourse/connectors/top-notices/prompt-completion.hbs b/assets/javascripts/discourse/connectors/top-notices/prompt-completion.hbs
index 70c0b7c4..10057345 100644
--- a/assets/javascripts/discourse/connectors/top-notices/prompt-completion.hbs
+++ b/assets/javascripts/discourse/connectors/top-notices/prompt-completion.hbs
@@ -1,7 +1,10 @@
{{#each site.complete_custom_wizard as |wizard|}}
-{{/each}}
+{{/each}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/controllers/admin-wizards-api-show.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-api-show.js.es6
index 5dba2d7f..31b91e16 100644
--- a/assets/javascripts/discourse/controllers/admin-wizards-api-show.js.es6
+++ b/assets/javascripts/discourse/controllers/admin-wizards-api-show.js.es6
@@ -4,14 +4,18 @@ import CustomWizardApi from "../models/custom-wizard-api";
import { default as discourseComputed } from "discourse-common/utils/decorators";
import { and, equal, not } from "@ember/object/computed";
import { selectKitContent } from "../lib/wizard";
+import { underscore } from "@ember/string";
import Controller from "@ember/controller";
import I18n from "I18n";
+import { inject as service } from "@ember/service";
export default Controller.extend({
+ router: service(),
+
queryParams: ["refresh_list"],
loadingSubscriptions: false,
notAuthorized: not("api.authorized"),
- endpointMethods: selectKitContent(["GET", "PUT", "POST", "PATCH", "DELETE"]),
+ endpointMethods: selectKitContent(["PUT", "POST", "PATCH", "DELETE"]),
showRemove: not("isNew"),
showRedirectUri: and("threeLeggedOauth", "api.name"),
responseIcon: null,
@@ -20,29 +24,8 @@ export default Controller.extend({
"application/x-www-form-urlencoded",
]),
successCodes: selectKitContent([
- 100,
- 101,
- 102,
- 200,
- 201,
- 202,
- 203,
- 204,
- 205,
- 206,
- 207,
- 208,
- 226,
- 300,
- 301,
- 302,
- 303,
- 303,
- 304,
- 305,
- 306,
- 307,
- 308,
+ 100, 101, 102, 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301,
+ 302, 303, 303, 304, 305, 306, 307, 308,
]),
@discourseComputed(
@@ -88,6 +71,11 @@ export default Controller.extend({
twoLeggedOauth: equal("api.authType", "oauth_2"),
threeLeggedOauth: equal("api.authType", "oauth_3"),
+ @discourseComputed("api.isNew")
+ nameClass(isNew) {
+ return isNew ? "new" : "saved";
+ },
+
actions: {
addParam() {
this.get("api.authParams").pushObject({});
@@ -113,7 +101,7 @@ export default Controller.extend({
if (authType === "oauth_2") {
this.set("authorizing", true);
- ajax(`/admin/wizards/apis/${name.underscore()}/authorize`)
+ ajax(`/admin/wizards/apis/${underscore(name)}/authorize`)
.catch(popupAjaxError)
.then((result) => {
if (result.success) {
@@ -149,7 +137,6 @@ export default Controller.extend({
const api = this.get("api");
const name = api.name;
const authType = api.authType;
- let refreshList = false; // eslint-disable-line
let error;
if (!name || !authType) {
@@ -164,11 +151,6 @@ export default Controller.extend({
data["title"] = api.title;
}
- const originalTitle = this.get("api.originalTitle");
- if (api.get("isNew") || (originalTitle && api.title !== originalTitle)) {
- refreshList = true;
- }
-
if (api.get("isNew")) {
data["new"] = true;
}
@@ -188,11 +170,11 @@ export default Controller.extend({
if (!api[rp]) {
let key = rp.replace("auth", "");
error = `${I18n.t(
- `admin.wizard.api.auth.${key.underscore()}`
+ `admin.wizard.api.auth.${underscore(key)}`
)} is required for ${authType}`;
break;
}
- data[rp.underscore()] = api[rp];
+ data[underscore(rp)] = api[rp];
}
}
@@ -222,7 +204,7 @@ export default Controller.extend({
this.set("updating", true);
- ajax(`/admin/wizards/api/${name.underscore()}`, {
+ ajax(`/admin/wizards/api/${underscore(name)}`, {
type: "PUT",
data,
})
@@ -245,7 +227,7 @@ export default Controller.extend({
this.set("updating", true);
- ajax(`/admin/wizards/api/${name.underscore()}`, {
+ ajax(`/admin/wizards/api/${underscore(name)}`, {
type: "DELETE",
})
.catch(popupAjaxError)
@@ -263,13 +245,13 @@ export default Controller.extend({
return;
}
- ajax(`/admin/wizards/api/${name.underscore()}/logs`, {
+ ajax(`/admin/wizards/api/${underscore(name)}/logs`, {
type: "DELETE",
})
.catch(popupAjaxError)
.then((result) => {
if (result.success) {
- this.transitionToRoute("adminWizardsApis").then(() => {
+ this.router.transitionTo("adminWizardsApis").then(() => {
this.send("refreshModel");
});
}
diff --git a/assets/javascripts/discourse/controllers/admin-wizards-custom-fields.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-custom-fields.js.es6
index 404c6afd..11e66782 100644
--- a/assets/javascripts/discourse/controllers/admin-wizards-custom-fields.js.es6
+++ b/assets/javascripts/discourse/controllers/admin-wizards-custom-fields.js.es6
@@ -4,7 +4,8 @@ import CustomWizardCustomField from "../models/custom-wizard-custom-field";
export default Controller.extend({
messageKey: "create",
fieldKeys: ["klass", "type", "name", "serializers"],
- documentationUrl: "https://thepavilion.io/t/3572",
+ documentationUrl:
+ "https://pavilion.tech/products/discourse-custom-wizard-plugin/documentation/custom-fields",
actions: {
addField() {
diff --git a/assets/javascripts/discourse/controllers/admin-wizards-logs-show.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-logs-show.js.es6
new file mode 100644
index 00000000..7e3fdff1
--- /dev/null
+++ b/assets/javascripts/discourse/controllers/admin-wizards-logs-show.js.es6
@@ -0,0 +1,52 @@
+import discourseComputed from "discourse-common/utils/decorators";
+import { notEmpty } from "@ember/object/computed";
+import CustomWizardLogs from "../models/custom-wizard-logs";
+import Controller from "@ember/controller";
+
+export default Controller.extend({
+ refreshing: false,
+ hasLogs: notEmpty("logs"),
+ page: 0,
+ canLoadMore: true,
+ logs: [],
+ messageKey: "viewing",
+
+ loadLogs() {
+ if (!this.canLoadMore) {
+ return;
+ }
+ const page = this.get("page");
+ const wizardId = this.get("wizard.id");
+
+ this.set("refreshing", true);
+
+ CustomWizardLogs.list(wizardId, page)
+ .then((result) => {
+ this.set("logs", this.logs.concat(result.logs));
+ })
+ .finally(() => this.set("refreshing", false));
+ },
+
+ @discourseComputed("hasLogs", "refreshing")
+ noResults(hasLogs, refreshing) {
+ return !hasLogs && !refreshing;
+ },
+
+ actions: {
+ loadMore() {
+ if (!this.loadingMore && this.logs.length < this.total) {
+ this.set("page", (this.page += 1));
+ this.loadLogs();
+ }
+ },
+
+ refresh() {
+ this.setProperties({
+ canLoadMore: true,
+ page: 0,
+ logs: [],
+ });
+ this.loadLogs();
+ },
+ },
+});
diff --git a/assets/javascripts/discourse/controllers/admin-wizards-logs.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-logs.js.es6
index 9559b01b..0d321948 100644
--- a/assets/javascripts/discourse/controllers/admin-wizards-logs.js.es6
+++ b/assets/javascripts/discourse/controllers/admin-wizards-logs.js.es6
@@ -1,50 +1,35 @@
-import discourseComputed from "discourse-common/utils/decorators";
-import { notEmpty } from "@ember/object/computed";
-import CustomWizardLogs from "../models/custom-wizard-logs";
import Controller from "@ember/controller";
+import { default as discourseComputed } from "discourse-common/utils/decorators";
export default Controller.extend({
- refreshing: false,
- hasLogs: notEmpty("logs"),
- page: 0,
- canLoadMore: true,
- logs: [],
+ documentationUrl:
+ "https://pavilion.tech/products/discourse-custom-wizard-plugin/documentation/",
- loadLogs() {
- if (!this.canLoadMore) {
- return;
+ @discourseComputed("wizardId")
+ wizardName(wizardId) {
+ let currentWizard = this.wizardList.find(
+ (wizard) => wizard.id === wizardId
+ );
+ if (currentWizard) {
+ return currentWizard.name;
+ }
+ },
+
+ @discourseComputed("wizardName")
+ messageOpts(wizardName) {
+ return {
+ wizardName,
+ };
+ },
+
+ @discourseComputed("wizardId")
+ messageKey(wizardId) {
+ let key = "select";
+
+ if (wizardId) {
+ key = "viewing";
}
- this.set("refreshing", true);
-
- CustomWizardLogs.list()
- .then((result) => {
- if (!result || result.length === 0) {
- this.set("canLoadMore", false);
- }
- this.set("logs", this.logs.concat(result));
- })
- .finally(() => this.set("refreshing", false));
- },
-
- @discourseComputed("hasLogs", "refreshing")
- noResults(hasLogs, refreshing) {
- return !hasLogs && !refreshing;
- },
-
- actions: {
- loadMore() {
- this.set("page", (this.page += 1));
- this.loadLogs();
- },
-
- refresh() {
- this.setProperties({
- canLoadMore: true,
- page: 0,
- logs: [],
- });
- this.loadLogs();
- },
+ return key;
},
});
diff --git a/assets/javascripts/discourse/controllers/admin-wizards-manager.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-manager.js.es6
index 7228d164..65b8987a 100644
--- a/assets/javascripts/discourse/controllers/admin-wizards-manager.js.es6
+++ b/assets/javascripts/discourse/controllers/admin-wizards-manager.js.es6
@@ -7,7 +7,8 @@ import I18n from "I18n";
import { underscore } from "@ember/string";
export default Controller.extend({
- messageUrl: "https://thepavilion.io/t/3652",
+ messageUrl:
+ "https://pavilion.tech/products/discourse-custom-wizard-plugin/documentation/wizard-manager",
messageKey: "info",
messageIcon: "info-circle",
messageClass: "info",
@@ -68,7 +69,7 @@ export default Controller.extend({
file: null,
filename: null,
});
- $("#file-upload").val("");
+ document.getElementById("custom-wizard-file-upload").value = "";
},
@observes("importing", "destroying")
@@ -83,7 +84,7 @@ export default Controller.extend({
actions: {
upload() {
- $("#file-upload").click();
+ document.getElementById("custom-wizard-file-upload").click();
},
clearFile() {
@@ -102,7 +103,7 @@ export default Controller.extend({
if (maxFileSize < file.size) {
this.setMessage("error", "file_size_error");
this.set("file", null);
- $("#file-upload").val("");
+ document.getElementById("custom-wizard-file-upload").value = "";
} else {
this.setProperties({
file,
diff --git a/assets/javascripts/discourse/controllers/admin-wizards-submissions-show.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-submissions-show.js.es6
index f5f9926d..dfcf3b7e 100644
--- a/assets/javascripts/discourse/controllers/admin-wizards-submissions-show.js.es6
+++ b/assets/javascripts/discourse/controllers/admin-wizards-submissions-show.js.es6
@@ -1,6 +1,74 @@
import Controller from "@ember/controller";
+import { empty } from "@ember/object/computed";
+import discourseComputed from "discourse-common/utils/decorators";
import { fmt } from "discourse/lib/computed";
+import { inject as service } from "@ember/service";
+import AdminWizardsColumnsModal from "../components/modal/admin-wizards-columns";
+import CustomWizardAdmin from "../models/custom-wizard-admin";
+import { formatModel } from "../lib/wizard-submission";
export default Controller.extend({
+ modal: service(),
downloadUrl: fmt("wizard.id", "/admin/wizards/submissions/%@/download"),
+ noResults: empty("submissions"),
+ page: 0,
+ total: 0,
+
+ loadMoreSubmissions() {
+ const page = this.get("page");
+ const wizardId = this.get("wizard.id");
+
+ this.set("loadingMore", true);
+ CustomWizardAdmin.submissions(wizardId, page)
+ .then((result) => {
+ if (result.submissions) {
+ const { submissions } = formatModel(result);
+
+ this.get("submissions").pushObjects(submissions);
+ }
+ })
+ .finally(() => {
+ this.set("loadingMore", false);
+ });
+ },
+
+ @discourseComputed("submissions.[]", "fields.@each.enabled")
+ displaySubmissions(submissions, fields) {
+ let result = [];
+
+ submissions.forEach((submission) => {
+ let sub = {};
+
+ Object.keys(submission).forEach((fieldId) => {
+ if (fields.some((f) => f.id === fieldId && f.enabled)) {
+ sub[fieldId] = submission[fieldId];
+ }
+ });
+ result.push(sub);
+ });
+
+ return result;
+ },
+
+ actions: {
+ loadMore() {
+ if (!this.loadingMore && this.submissions.length < this.total) {
+ this.set("page", this.get("page") + 1);
+ this.loadMoreSubmissions();
+ }
+ },
+
+ showEditColumnsModal() {
+ return this.modal.show(AdminWizardsColumnsModal, {
+ model: {
+ columns: this.get("fields"),
+ reset: () => {
+ this.get("fields").forEach((field) => {
+ field.set("enabled", true);
+ });
+ },
+ },
+ });
+ },
+ },
});
diff --git a/assets/javascripts/discourse/controllers/admin-wizards-submissions.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-submissions.js.es6
new file mode 100644
index 00000000..0d321948
--- /dev/null
+++ b/assets/javascripts/discourse/controllers/admin-wizards-submissions.js.es6
@@ -0,0 +1,35 @@
+import Controller from "@ember/controller";
+import { default as discourseComputed } from "discourse-common/utils/decorators";
+
+export default Controller.extend({
+ documentationUrl:
+ "https://pavilion.tech/products/discourse-custom-wizard-plugin/documentation/",
+
+ @discourseComputed("wizardId")
+ wizardName(wizardId) {
+ let currentWizard = this.wizardList.find(
+ (wizard) => wizard.id === wizardId
+ );
+ if (currentWizard) {
+ return currentWizard.name;
+ }
+ },
+
+ @discourseComputed("wizardName")
+ messageOpts(wizardName) {
+ return {
+ wizardName,
+ };
+ },
+
+ @discourseComputed("wizardId")
+ messageKey(wizardId) {
+ let key = "select";
+
+ if (wizardId) {
+ key = "viewing";
+ }
+
+ return key;
+ },
+});
diff --git a/assets/javascripts/discourse/controllers/admin-wizards-wizard-show.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-wizard-show.js.es6
index 1eeb62e6..7ae48709 100644
--- a/assets/javascripts/discourse/controllers/admin-wizards-wizard-show.js.es6
+++ b/assets/javascripts/discourse/controllers/admin-wizards-wizard-show.js.es6
@@ -3,15 +3,18 @@ import {
observes,
} from "discourse-common/utils/decorators";
import { notEmpty } from "@ember/object/computed";
-import showModal from "discourse/lib/show-modal";
+import { inject as service } from "@ember/service";
+import NextSessionScheduledModal from "../components/modal/next-session-scheduled";
import { generateId, wizardFieldList } from "../lib/wizard";
import { dasherize } from "@ember/string";
import { later, scheduleOnce } from "@ember/runloop";
import Controller from "@ember/controller";
import copyText from "discourse/lib/copy-text";
import I18n from "I18n";
+import { filterValues } from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard-schema";
export default Controller.extend({
+ modal: service(),
hasName: notEmpty("wizard.name"),
@observes("currentStep")
@@ -36,7 +39,8 @@ export default Controller.extend({
@discourseComputed("wizard.id")
wizardUrl(wizardId) {
- return window.location.origin + "/w/" + dasherize(wizardId);
+ let baseUrl = window.location.href.split("/admin");
+ return baseUrl[0] + "/w/" + dasherize(wizardId);
},
@discourseComputed("wizard.after_time_scheduled")
@@ -58,6 +62,19 @@ export default Controller.extend({
}
return wizardFieldList(steps);
},
+
+ @discourseComputed("fieldTypes", "wizard.allowGuests")
+ filteredFieldTypes(fieldTypes) {
+ const fieldTypeIds = fieldTypes.map((f) => f.id);
+ const allowedTypeIds = filterValues(
+ this.wizard,
+ "field",
+ "type",
+ fieldTypeIds
+ );
+ return fieldTypes.filter((f) => allowedTypeIds.includes(f.id));
+ },
+
getErrorMessage(result) {
if (result.backend_validation_error) {
return result.backend_validation_error;
@@ -92,7 +109,11 @@ export default Controller.extend({
wizard
.save(opts)
.then((result) => {
- this.send("afterSave", result.wizard_id);
+ if (result.wizard_id) {
+ this.send("afterSave", result.wizard_id);
+ } else if (result.errors) {
+ this.set("error", result.errors.join(", "));
+ }
})
.catch((result) => {
this.set("error", this.getErrorMessage(result));
@@ -107,19 +128,13 @@ export default Controller.extend({
},
setNextSessionScheduled() {
- let controller = showModal("next-session-scheduled", {
+ this.modal.show(NextSessionScheduledModal, {
model: {
dateTime: this.wizard.after_time_scheduled,
update: (dateTime) =>
this.set("wizard.after_time_scheduled", dateTime),
},
});
-
- controller.setup();
- },
-
- toggleAdvanced() {
- this.toggleProperty("wizard.showAdvanced");
},
copyUrl() {
diff --git a/assets/javascripts/discourse/controllers/admin-wizards-wizard.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-wizard.js.es6
index ddd63337..994dd1a6 100644
--- a/assets/javascripts/discourse/controllers/admin-wizards-wizard.js.es6
+++ b/assets/javascripts/discourse/controllers/admin-wizards-wizard.js.es6
@@ -21,5 +21,6 @@ export default Controller.extend({
return key;
},
- messageUrl: "https://thepavilion.io/c/knowledge/discourse/custom-wizard",
+ messageUrl:
+ "https://pavilion.tech/products/discourse-custom-wizard-plugin/documentation/",
});
diff --git a/assets/javascripts/discourse/controllers/admin-wizards.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards.js.es6
new file mode 100644
index 00000000..ded14b91
--- /dev/null
+++ b/assets/javascripts/discourse/controllers/admin-wizards.js.es6
@@ -0,0 +1,12 @@
+import Controller from "@ember/controller";
+import { or } from "@ember/object/computed";
+import { inject as service } from "@ember/service";
+
+export default Controller.extend({
+ subscription: service(),
+
+ showApi: or(
+ "subscription.businessSubscription",
+ "subscription.communitySubscription"
+ ),
+});
diff --git a/assets/javascripts/wizard/controllers/wizard-index.js.es6 b/assets/javascripts/discourse/controllers/custom-wizard-index.js.es6
similarity index 100%
rename from assets/javascripts/wizard/controllers/wizard-index.js.es6
rename to assets/javascripts/discourse/controllers/custom-wizard-index.js.es6
diff --git a/assets/javascripts/wizard/controllers/step.js.es6 b/assets/javascripts/discourse/controllers/custom-wizard-step.js.es6
similarity index 79%
rename from assets/javascripts/wizard/controllers/step.js.es6
rename to assets/javascripts/discourse/controllers/custom-wizard-step.js.es6
index 4b321173..d1a299fd 100644
--- a/assets/javascripts/wizard/controllers/step.js.es6
+++ b/assets/javascripts/discourse/controllers/custom-wizard-step.js.es6
@@ -1,7 +1,9 @@
import Controller from "@ember/controller";
import getUrl from "discourse-common/lib/get-url";
+import { inject as service } from "@ember/service";
export default Controller.extend({
+ router: service(),
wizard: null,
step: null,
@@ -15,12 +17,12 @@ export default Controller.extend({
const wizardId = this.get("wizard.id");
window.location.href = getUrl(`/w/${wizardId}/steps/${nextStepId}`);
} else {
- this.transitionToRoute("step", nextStepId);
+ this.router.transitionTo("customWizardStep", nextStepId);
}
},
goBack() {
- this.transitionToRoute("step", this.get("step.previous"));
+ this.router.transitionTo("customWizardStep", this.get("step.previous"));
},
showMessage(message) {
diff --git a/assets/javascripts/wizard/controllers/wizard.js.es6 b/assets/javascripts/discourse/controllers/custom-wizard.js.es6
similarity index 100%
rename from assets/javascripts/wizard/controllers/wizard.js.es6
rename to assets/javascripts/discourse/controllers/custom-wizard.js.es6
diff --git a/assets/javascripts/discourse/controllers/next-session-scheduled.js.es6 b/assets/javascripts/discourse/controllers/next-session-scheduled.js.es6
deleted file mode 100644
index 4ea22d38..00000000
--- a/assets/javascripts/discourse/controllers/next-session-scheduled.js.es6
+++ /dev/null
@@ -1,27 +0,0 @@
-import { default as discourseComputed } from "discourse-common/utils/decorators";
-import Controller from "@ember/controller";
-
-export default Controller.extend({
- title: "admin.wizard.after_time_modal.title",
-
- setup() {
- this.set("bufferedDateTime", moment(this.model.dateTime));
- },
-
- @discourseComputed("bufferedDateTime")
- submitDisabled(dateTime) {
- return moment().isAfter(dateTime);
- },
-
- actions: {
- submit() {
- const dateTime = this.get("bufferedDateTime");
- this.get("model.update")(moment(dateTime).utc().toISOString());
- this.send("closeModal");
- },
-
- dateTimeChanged(dateTime) {
- this.set("bufferedDateTime", dateTime);
- },
- },
-});
diff --git a/assets/javascripts/discourse/custom-wizard-admin-route-map.js.es6 b/assets/javascripts/discourse/custom-wizard-admin-route-map.js.es6
index 90ab5359..272e276e 100644
--- a/assets/javascripts/discourse/custom-wizard-admin-route-map.js.es6
+++ b/assets/javascripts/discourse/custom-wizard-admin-route-map.js.es6
@@ -43,7 +43,16 @@ export default {
}
);
- this.route("adminWizardsLogs", { path: "/logs", resetNamespace: true });
+ this.route(
+ "adminWizardsLogs",
+ { path: "/logs", resetNamespace: true },
+ function () {
+ this.route("adminWizardsLogsShow", {
+ path: "/:wizardId/",
+ resetNamespace: true,
+ });
+ }
+ );
this.route("adminWizardsManager", {
path: "/manager",
diff --git a/assets/javascripts/discourse/custom-wizard-route-map.js.es6 b/assets/javascripts/discourse/custom-wizard-route-map.js.es6
new file mode 100644
index 00000000..08606301
--- /dev/null
+++ b/assets/javascripts/discourse/custom-wizard-route-map.js.es6
@@ -0,0 +1,12 @@
+export default function () {
+ this.route(
+ "customWizard",
+ { path: "/w/:wizard_id", resetNamespace: true },
+ function () {
+ this.route("customWizardStep", {
+ path: "/steps/:step_id",
+ resetNamespace: true,
+ });
+ }
+ );
+}
diff --git a/assets/javascripts/discourse/helpers/custom-wizard.js.es6 b/assets/javascripts/discourse/helpers/custom-wizard.js.es6
deleted file mode 100644
index fb5063cc..00000000
--- a/assets/javascripts/discourse/helpers/custom-wizard.js.es6
+++ /dev/null
@@ -1,6 +0,0 @@
-import { registerUnbound } from "discourse-common/lib/helpers";
-import { dasherize } from "@ember/string";
-
-registerUnbound("dasherize", function (string) {
- return dasherize(string);
-});
diff --git a/assets/javascripts/wizard/helpers/char-counter.js.es6 b/assets/javascripts/discourse/helpers/wizard-char-counter.js
similarity index 81%
rename from assets/javascripts/wizard/helpers/char-counter.js.es6
rename to assets/javascripts/discourse/helpers/wizard-char-counter.js
index a700a432..97f7e98b 100644
--- a/assets/javascripts/wizard/helpers/char-counter.js.es6
+++ b/assets/javascripts/discourse/helpers/wizard-char-counter.js
@@ -1,8 +1,7 @@
-import { registerUnbound } from "discourse-common/lib/helpers";
import I18n from "I18n";
import Handlebars from "handlebars";
-export default registerUnbound("char-counter", function (body, maxLength) {
+export default function wizardCharCounter(body, maxLength) {
let bodyLength = body ? body.length : 0;
let finalString;
@@ -19,4 +18,4 @@ export default registerUnbound("char-counter", function (body, maxLength) {
}
return new Handlebars.SafeString(finalString);
-});
+}
diff --git a/assets/javascripts/discourse/initializers/custom-wizard-edits.js.es6 b/assets/javascripts/discourse/initializers/custom-wizard-edits.js.es6
index cecf2a03..2fef6452 100644
--- a/assets/javascripts/discourse/initializers/custom-wizard-edits.js.es6
+++ b/assets/javascripts/discourse/initializers/custom-wizard-edits.js.es6
@@ -6,7 +6,7 @@ import { observes } from "discourse-common/utils/decorators";
export default {
name: "custom-wizard-edits",
initialize(container) {
- const siteSettings = container.lookup("site-settings:main");
+ const siteSettings = container.lookup("service:site-settings");
if (!siteSettings.custom_wizard_enabled) {
return;
@@ -20,7 +20,7 @@ export default {
return existing.apply(this, [path, opts]);
};
- withPluginApi("0.8.7", (api) => {
+ withPluginApi("0.8.36", (api) => {
api.modifyClass("component:d-navigation", {
pluginId: "custom-wizard",
actions: {
@@ -38,6 +38,7 @@ export default {
});
api.modifyClass("component:uppy-image-uploader", {
+ pluginId: "custom-wizard",
// Needed to ensure appEvents get registered when navigating between steps
@observes("id")
initOnStepChange() {
@@ -46,6 +47,57 @@ export default {
}
},
});
+
+ api.modifyClass("component:d-editor", {
+ pluginId: "custom-wizard",
+
+ didInsertElement() {
+ this._super(...arguments);
+
+ if (this.wizardComposer) {
+ this.appEvents.on(
+ `wizard-editor:insert-text`,
+ this,
+ "_wizardInsertText"
+ );
+ this.appEvents.on(
+ "wizard-editor:replace-text",
+ this,
+ "_wizardReplaceText"
+ );
+ }
+ },
+
+ _wizardInsertText(text, options) {
+ if (
+ this.session.wizardEventFieldId === this.fieldId &&
+ this.element
+ ) {
+ this.insertText(text, options);
+ }
+ },
+
+ _wizardReplaceText(oldVal, newVal, opts = {}) {
+ if (this.session.wizardEventFieldId === this.fieldId) {
+ this.replaceText(oldVal, newVal, opts);
+ }
+ },
+ });
+
+ api.modifyClass("component:category-chooser", {
+ pluginId: "custom-wizard",
+
+ categoriesByScope(options = {}) {
+ let categories = this._super(options);
+ const currentUser = this.currentUser;
+ if (!currentUser?.staff) {
+ categories = categories.filter((category) => {
+ return !category.custom_fields?.create_topic_wizard;
+ });
+ }
+ return categories;
+ },
+ });
});
},
};
diff --git a/assets/javascripts/discourse/initializers/custom-wizard-redirect.js.es6 b/assets/javascripts/discourse/initializers/custom-wizard-redirect.js.es6
index e413cd17..c02f0f3d 100644
--- a/assets/javascripts/discourse/initializers/custom-wizard-redirect.js.es6
+++ b/assets/javascripts/discourse/initializers/custom-wizard-redirect.js.es6
@@ -1,14 +1,16 @@
-import ApplicationRoute from "discourse/routes/application";
+import DiscourseURL from "discourse/lib/url";
+import { withPluginApi } from "discourse/lib/plugin-api";
+import { dasherize } from "@ember/string";
export default {
name: "custom-wizard-redirect",
after: "message-bus",
- initialize: function (container) {
- const messageBus = container.lookup("message-bus:main");
- const siteSettings = container.lookup("site-settings:main");
+ initialize(container) {
+ const messageBus = container.lookup("service:message-bus");
+ const siteSettings = container.lookup("service:site-settings");
- if (!siteSettings.custom_wizard_enabled || !messageBus) {
+ if (!siteSettings.custom_wizard_enabled) {
return;
}
@@ -17,28 +19,27 @@ export default {
window.location.href = wizardUrl;
});
- ApplicationRoute.reopen({
- actions: {
- willTransition(transition) {
- const redirectToWizard = this.get("currentUser.redirect_to_wizard");
- const excludedPaths = this.siteSettings.wizard_redirect_exclude_paths
+ withPluginApi("0.8.36", (api) => {
+ api.onAppEvent("page:changed", (data) => {
+ const currentUser = api.getCurrentUser();
+
+ if (currentUser) {
+ const redirectToWizard = currentUser.redirect_to_wizard;
+ const excludedPaths = siteSettings.wizard_redirect_exclude_paths
.split("|")
.concat(["loading"]);
-
if (
redirectToWizard &&
- (!transition.intent.name ||
- !excludedPaths.find((p) => {
- return transition.intent.name.indexOf(p) > -1;
- }))
+ !data.url.includes("ignore_redirect") &&
+ data.currentRouteName !== "customWizardStep" &&
+ !excludedPaths.find((p) => {
+ return data.currentRouteName.indexOf(p) > -1;
+ })
) {
- transition.abort();
- window.location = "/w/" + redirectToWizard.dasherize();
+ DiscourseURL.routeTo(`/w/${dasherize(redirectToWizard)}`);
}
-
- return this._super(transition);
- },
- },
+ }
+ });
});
},
};
diff --git a/assets/javascripts/discourse/lib/wizard-json.js.es6 b/assets/javascripts/discourse/lib/wizard-json.js.es6
index 79da60cb..95eaba49 100644
--- a/assets/javascripts/discourse/lib/wizard-json.js.es6
+++ b/assets/javascripts/discourse/lib/wizard-json.js.es6
@@ -97,11 +97,6 @@ function buildObjectArray(json, type) {
if (present(json)) {
json.forEach((objJson, objectIndex) => {
let object = buildObject(objJson, type, objectIndex);
-
- if (hasAdvancedProperties(object, type)) {
- object.set("showAdvanced", true);
- }
-
array.pushObject(object);
});
}
@@ -112,21 +107,11 @@ function buildObjectArray(json, type) {
function buildBasicProperties(json, type, props, objectIndex = null) {
listProperties(type).forEach((p) => {
props[p] = buildProperty(json, p, type, objectIndex);
-
- if (hasAdvancedProperties(json, type)) {
- props.showAdvanced = true;
- }
});
return props;
}
-function hasAdvancedProperties(object, type) {
- return Object.keys(object).some((p) => {
- return wizardSchema[type].advanced.indexOf(p) > -1 && present(object[p]);
- });
-}
-
/// to be removed: necessary due to action array being moved from step to wizard
function actionPatch(json) {
let actions = json.actions || [];
diff --git a/assets/javascripts/discourse/lib/wizard-mapper.js.es6 b/assets/javascripts/discourse/lib/wizard-mapper.js.es6
index c398eaf4..9037bec5 100644
--- a/assets/javascripts/discourse/lib/wizard-mapper.js.es6
+++ b/assets/javascripts/discourse/lib/wizard-mapper.js.es6
@@ -35,6 +35,7 @@ function inputTypesContent(options = {}) {
const connectors = {
pair: [
"equal",
+ "not_equal",
"greater",
"less",
"greater_or_equal",
diff --git a/assets/javascripts/discourse/lib/wizard-schema.js.es6 b/assets/javascripts/discourse/lib/wizard-schema.js.es6
index 5445223a..959185da 100644
--- a/assets/javascripts/discourse/lib/wizard-schema.js.es6
+++ b/assets/javascripts/discourse/lib/wizard-schema.js.es6
@@ -1,5 +1,5 @@
import { get, set } from "@ember/object";
-import { getOwner } from "discourse-common/lib/get-owner";
+import { getOwnerWithFallback } from "discourse-common/lib/get-owner";
const wizard = {
basic: {
@@ -19,7 +19,6 @@ const wizard = {
permitted: null,
},
mapped: ["permitted"],
- advanced: ["restart_on_revisit"],
required: ["id"],
dependent: {
after_time: "after_time_scheduled",
@@ -41,8 +40,8 @@ const step = {
id: null,
index: null,
title: null,
- key: null,
banner: null,
+ banner_upload_id: null,
raw_description: null,
required_data: null,
required_data_message: null,
@@ -51,7 +50,6 @@ const step = {
force_final: false,
},
mapped: ["required_data", "permitted_params", "condition", "index"],
- advanced: ["required_data", "permitted_params", "condition", "index"],
required: ["id"],
dependent: {},
objectArrays: {
@@ -68,15 +66,16 @@ const field = {
index: null,
label: null,
image: null,
+ image_upload_id: null,
description: null,
+ property: null,
required: null,
- key: null,
type: null,
condition: null,
+ tag_groups: null,
},
types: {},
mapped: ["prefill", "content", "condition", "index"],
- advanced: ["property", "key", "condition", "index"],
required: ["id", "type"],
dependent: {},
objectArrays: {},
@@ -100,6 +99,8 @@ const action = {
custom_fields: null,
skip_redirect: null,
suppress_notifications: null,
+ add_event: null,
+ add_location: null,
},
send_message: {
title: null,
@@ -132,6 +133,12 @@ const action = {
wizard_user: true,
usernames: null,
},
+ watch_tags: {
+ tags: null,
+ notification_level: null,
+ wizard_user: true,
+ usernames: null,
+ },
send_to_api: {
api: null,
api_endpoint: null,
@@ -196,35 +203,83 @@ const action = {
"messageable_level",
"visibility_level",
"members_visibility_level",
- ],
- advanced: [
- "code",
- "custom_fields",
- "skip_redirect",
- "suppress_notifications",
- "required",
+ "add_event",
+ "add_location",
],
required: ["id", "type"],
dependent: {},
objectArrays: {},
};
-const wizardSchema = {
- wizard,
- step,
- field,
- action,
+const filters = {
+ allow_guests: {
+ field: {
+ type: [
+ "text",
+ "textarea",
+ "text_only",
+ "date",
+ "time",
+ "date_time",
+ "number",
+ "checkbox",
+ "url",
+ "dropdown",
+ "tag",
+ "category",
+ "group",
+ "user_selector",
+ ],
+ },
+ action: {
+ type: ["route_to", "send_message"],
+ },
+ },
+};
+
+const custom_field = {
+ klass: ["topic", "post", "group", "category"],
+ type: ["string", "boolean", "integer", "json"],
};
export function buildFieldTypes(types) {
wizardSchema.field.types = types;
+ wizardSchema.field.type = Object.keys(types);
}
+field.type = Object.keys(field.types);
+action.type = Object.keys(action.types);
+
+const wizardSchema = {
+ wizard,
+ step,
+ field,
+ custom_field,
+ action,
+ filters,
+};
+
export function buildFieldValidations(validations) {
wizardSchema.field.validations = validations;
}
-const siteSettings = getOwner(this).lookup("site-settings:main");
+export function filterValues(currentWizard, feature, attribute, values = null) {
+ values = values || wizardSchema[feature][attribute];
+
+ if (currentWizard && currentWizard.allowGuests) {
+ const filteredFeature = wizardSchema.filters.allow_guests[feature];
+ if (filteredFeature) {
+ const filtered = filteredFeature[attribute];
+ if (filtered) {
+ values = values.filter((v) => filtered.includes(v));
+ }
+ }
+ }
+
+ return values;
+}
+
+const siteSettings = getOwnerWithFallback(this).lookup("service:site-settings");
if (siteSettings.wizard_apis_enabled) {
wizardSchema.action.types.send_to_api = {
api: null,
diff --git a/assets/javascripts/discourse/lib/wizard-submission.js.es6 b/assets/javascripts/discourse/lib/wizard-submission.js.es6
new file mode 100644
index 00000000..8fa2a3be
--- /dev/null
+++ b/assets/javascripts/discourse/lib/wizard-submission.js.es6
@@ -0,0 +1,39 @@
+import EmberObject from "@ember/object";
+
+function formatModel(model) {
+ let fields = [
+ EmberObject.create({
+ id: "submitted_at",
+ label: "Submitted At",
+ enabled: true,
+ }),
+ EmberObject.create({ id: "username", label: "User", enabled: true }),
+ ];
+ let submissions = [];
+
+ model.submissions.forEach((s) => {
+ let submission = {
+ submitted_at: s.submitted_at,
+ username: s.user,
+ };
+
+ Object.keys(s.fields).forEach((fieldId) => {
+ if (!fields.some((field) => field.id === fieldId)) {
+ fields.push(
+ EmberObject.create({
+ id: fieldId,
+ label: s.fields[fieldId].label,
+ enabled: true,
+ })
+ );
+ }
+ submission[fieldId] = s.fields[fieldId];
+ });
+
+ submissions.push(EmberObject.create(submission));
+ });
+
+ return { fields, submissions };
+}
+
+export { formatModel };
diff --git a/assets/javascripts/discourse/lib/wizard.js.es6 b/assets/javascripts/discourse/lib/wizard.js.es6
index 98bdbfdd..2eaccb17 100644
--- a/assets/javascripts/discourse/lib/wizard.js.es6
+++ b/assets/javascripts/discourse/lib/wizard.js.es6
@@ -1,5 +1,6 @@
import EmberObject from "@ember/object";
import wizardSchema from "./wizard-schema";
+import I18n from "I18n";
function selectKitContent(content) {
return content.map((i) => ({ id: i, name: i }));
@@ -33,6 +34,10 @@ function camelCase(string) {
});
}
+function translationOrText(i18nKey, text) {
+ return I18n.findTranslation(i18nKey) ? I18n.t(i18nKey) : text;
+}
+
const userProperties = [
"name",
"username",
@@ -121,4 +126,5 @@ export {
notificationLevels,
wizardFieldList,
sentenceCase,
+ translationOrText,
};
diff --git a/assets/javascripts/discourse/mixins/subscription.js.es6 b/assets/javascripts/discourse/mixins/subscription.js.es6
new file mode 100644
index 00000000..9ea9382d
--- /dev/null
+++ b/assets/javascripts/discourse/mixins/subscription.js.es6
@@ -0,0 +1,53 @@
+import Mixin from "@ember/object/mixin";
+import { getOwner } from "@ember/application";
+import { readOnly } from "@ember/object/computed";
+import discourseComputed from "discourse-common/utils/decorators";
+
+const PRODUCT_PAGE = "https://custom-wizard.pavilion.tech";
+const SUPPORT_MESSAGE =
+ "https://coop.pavilion.tech/new-message?username=support&title=Custom%20Wizard%20Support";
+const MANAGER_CATEGORY =
+ "https://pavilion.tech/products/discourse-custom-wizard-plugin/support";
+
+export default Mixin.create({
+ subscriptionLandingUrl: PRODUCT_PAGE,
+ subscriptionClientUrl: "/admin/plugins/subscription-client",
+
+ @discourseComputed
+ adminWizards() {
+ return getOwner(this).lookup("controller:admin-wizards");
+ },
+
+ subscribed: readOnly("adminWizards.subscribed"),
+ subscriptionType: readOnly("adminWizards.subscriptionType"),
+ businessSubscription: readOnly("adminWizards.businessSubscription"),
+ communitySubscription: readOnly("adminWizards.communitySubscription"),
+ standardSubscription: readOnly("adminWizards.standardSubscription"),
+ subscriptionAttributes: readOnly("adminWizards.subscriptionAttributes"),
+ subscriptionClientInstalled: readOnly(
+ "adminWizards.subscriptionClientInstalled"
+ ),
+
+ @discourseComputed("subscriptionClientInstalled")
+ subscriptionLink(subscriptionClientInstalled) {
+ return subscriptionClientInstalled
+ ? this.subscriptionClientUrl
+ : this.subscriptionLandingUrl;
+ },
+
+ @discourseComputed("subscriptionType")
+ subscriptionCtaLink(subscriptionType) {
+ switch (subscriptionType) {
+ case "none":
+ return PRODUCT_PAGE;
+ case "standard":
+ return SUPPORT_MESSAGE;
+ case "business":
+ return SUPPORT_MESSAGE;
+ case "community":
+ return MANAGER_CATEGORY;
+ default:
+ return PRODUCT_PAGE;
+ }
+ },
+});
diff --git a/assets/javascripts/discourse/mixins/undo-changes.js.es6 b/assets/javascripts/discourse/mixins/undo-changes.js.es6
index b2ab322d..e98cfb0e 100644
--- a/assets/javascripts/discourse/mixins/undo-changes.js.es6
+++ b/assets/javascripts/discourse/mixins/undo-changes.js.es6
@@ -4,6 +4,8 @@ import { get, set } from "@ember/object";
import Mixin from "@ember/object/mixin";
import { deepEqual } from "discourse-common/lib/object";
+const observedCache = [];
+
export default Mixin.create({
didInsertElement() {
this._super(...arguments);
@@ -32,7 +34,13 @@ export default Mixin.create({
};
listProperties(componentType, opts).forEach((property) => {
- obj.removeObserver(property, this, this.toggleUndo);
+ if (observedCache.includes(property)) {
+ obj.removeObserver(property, this, this.toggleUndo);
+ let index = observedCache.indexOf(property);
+ if (index !== -1) {
+ observedCache.splice(index, 1);
+ }
+ }
});
},
@@ -45,6 +53,9 @@ export default Mixin.create({
};
listProperties(componentType, opts).forEach((property) => {
+ if (observedCache.indexOf(property) === -1) {
+ observedCache.push(property);
+ }
obj.addObserver(property, this, this.toggleUndo);
});
},
diff --git a/assets/javascripts/discourse/mixins/valid-state.js.es6 b/assets/javascripts/discourse/mixins/valid-state.js.es6
new file mode 100644
index 00000000..ca86d7e4
--- /dev/null
+++ b/assets/javascripts/discourse/mixins/valid-state.js.es6
@@ -0,0 +1,36 @@
+import discourseComputed from "discourse-common/utils/decorators";
+
+export const States = {
+ UNCHECKED: 0,
+ INVALID: 1,
+ VALID: 2,
+};
+
+export default {
+ _validState: null,
+ errorDescription: null,
+
+ init() {
+ this._super(...arguments);
+ this.set("_validState", States.UNCHECKED);
+ },
+
+ @discourseComputed("_validState")
+ valid: (state) => state === States.VALID,
+
+ @discourseComputed("_validState")
+ invalid: (state) => state === States.INVALID,
+
+ @discourseComputed("_validState")
+ unchecked: (state) => state === States.UNCHECKED,
+
+ setValid(valid, description) {
+ this.set("_validState", valid ? States.VALID : States.INVALID);
+
+ if (!valid && description && description.length) {
+ this.set("errorDescription", description);
+ } else {
+ this.set("errorDescription", null);
+ }
+ },
+};
diff --git a/assets/javascripts/discourse/models/custom-wizard-admin.js.es6 b/assets/javascripts/discourse/models/custom-wizard-admin.js.es6
new file mode 100644
index 00000000..afca4833
--- /dev/null
+++ b/assets/javascripts/discourse/models/custom-wizard-admin.js.es6
@@ -0,0 +1,242 @@
+import EmberObject from "@ember/object";
+import { buildProperties, mapped, present } from "../lib/wizard-json";
+import { listProperties, snakeCase } from "../lib/wizard";
+import wizardSchema from "../lib/wizard-schema";
+import { Promise } from "rsvp";
+import { ajax } from "discourse/lib/ajax";
+import { popupAjaxError } from "discourse/lib/ajax-error";
+import discourseComputed from "discourse-common/utils/decorators";
+
+const GUEST_GROUP_ID = -1;
+
+const CustomWizardAdmin = EmberObject.extend({
+ @discourseComputed("permitted.@each.output")
+ allowGuests(permitted) {
+ return (
+ permitted &&
+ permitted.filter((p) => p.output && p.output.includes(GUEST_GROUP_ID))
+ .length
+ );
+ },
+
+ save(opts) {
+ return new Promise((resolve, reject) => {
+ let wizard = this.buildJson(this, "wizard");
+
+ if (wizard.error) {
+ reject(wizard);
+ }
+
+ let data = {
+ wizard,
+ };
+
+ if (opts.create) {
+ data.create = true;
+ }
+
+ ajax(`/admin/wizards/wizard/${wizard.id}`, {
+ type: "PUT",
+ contentType: "application/json",
+ data: JSON.stringify(data),
+ }).then((result) => {
+ if (result.backend_validation_error) {
+ reject(result);
+ } else {
+ resolve(result);
+ }
+ });
+ });
+ },
+
+ buildJson(object, type, result = {}) {
+ let objectType = object.type || null;
+
+ if (wizardSchema[type].types) {
+ if (!objectType) {
+ result.error = {
+ type: "required",
+ params: { type, property: "type" },
+ };
+ return result;
+ }
+ }
+
+ for (let property of listProperties(type, { objectType })) {
+ let value = object.get(property);
+
+ result = this.validateValue(property, value, object, type, result);
+
+ if (result.error) {
+ break;
+ }
+
+ if (mapped(property, type)) {
+ value = this.buildMappedJson(value);
+ }
+
+ if (value !== undefined && value !== null) {
+ result[property] = value;
+ }
+ }
+
+ if (!result.error) {
+ for (let arrayObjectType of Object.keys(
+ wizardSchema[type].objectArrays
+ )) {
+ let arraySchema = wizardSchema[type].objectArrays[arrayObjectType];
+ let objectArray = object.get(arraySchema.property);
+
+ if (arraySchema.required && !present(objectArray)) {
+ result.error = {
+ type: "required",
+ params: { type, property: arraySchema.property },
+ };
+ break;
+ }
+
+ result[arraySchema.property] = [];
+
+ for (let item of objectArray) {
+ let itemProps = this.buildJson(item, arrayObjectType);
+
+ if (itemProps.error) {
+ result.error = itemProps.error;
+ break;
+ } else {
+ result[arraySchema.property].push(itemProps);
+ }
+ }
+ }
+ }
+
+ return result;
+ },
+
+ validateValue(property, value, object, type, result) {
+ if (wizardSchema[type].required.indexOf(property) > -1 && !value) {
+ result.error = {
+ type: "required",
+ params: { type, property },
+ };
+ }
+
+ let dependent = wizardSchema[type].dependent[property];
+ if (dependent && value && !object[dependent]) {
+ result.error = {
+ type: "dependent",
+ params: { property, dependent },
+ };
+ }
+
+ if (property === "api_body") {
+ try {
+ value = JSON.parse(value);
+ } catch (e) {
+ result.error = {
+ type: "invalid",
+ params: { type, property },
+ };
+ }
+ }
+
+ return result;
+ },
+
+ buildMappedJson(value) {
+ if (typeof value === "string" || Number.isInteger(value)) {
+ return value;
+ }
+ if (!value || !value.length) {
+ return false;
+ }
+
+ let inputs = value;
+ let result = [];
+
+ inputs.forEach((inpt) => {
+ let input = {
+ type: inpt.type,
+ };
+
+ if (inpt.connector) {
+ input.connector = inpt.connector;
+ }
+
+ if (present(inpt.output)) {
+ input.output = inpt.output;
+ input.output_type = snakeCase(inpt.output_type);
+ input.output_connector = inpt.output_connector;
+ }
+
+ if (present(inpt.pairs)) {
+ input.pairs = [];
+
+ inpt.pairs.forEach((pr) => {
+ if (present(pr.key) && present(pr.value)) {
+ let pairParams = {
+ index: pr.index,
+ key: pr.key,
+ key_type: snakeCase(pr.key_type),
+ value: pr.value,
+ value_type: snakeCase(pr.value_type),
+ connector: pr.connector,
+ };
+
+ input.pairs.push(pairParams);
+ }
+ });
+ }
+
+ if (
+ (input.type === "assignment" && present(input.output)) ||
+ present(input.pairs)
+ ) {
+ result.push(input);
+ }
+ });
+
+ if (!result.length) {
+ result = false;
+ }
+
+ return result;
+ },
+
+ remove() {
+ return ajax(`/admin/wizards/wizard/${this.id}`, {
+ type: "DELETE",
+ })
+ .then(() => this.destroy())
+ .catch(popupAjaxError);
+ },
+});
+
+CustomWizardAdmin.reopenClass({
+ all() {
+ return ajax("/admin/wizards/wizard", {
+ type: "GET",
+ })
+ .then((result) => {
+ return result.wizard_list;
+ })
+ .catch(popupAjaxError);
+ },
+
+ submissions(wizardId, page = 0) {
+ return ajax(`/admin/wizards/submissions/${wizardId}`, {
+ type: "GET",
+ data: {
+ page,
+ },
+ }).catch(popupAjaxError);
+ },
+
+ create(wizardJson = {}) {
+ const wizard = this._super.apply(this);
+ wizard.setProperties(buildProperties(wizardJson));
+ return wizard;
+ },
+});
+
+export default CustomWizardAdmin;
diff --git a/assets/javascripts/wizard/models/field.js.es6 b/assets/javascripts/discourse/models/custom-wizard-field.js.es6
similarity index 77%
rename from assets/javascripts/wizard/models/field.js.es6
rename to assets/javascripts/discourse/models/custom-wizard-field.js.es6
index 2b88140e..2afe79d9 100644
--- a/assets/javascripts/wizard/models/field.js.es6
+++ b/assets/javascripts/discourse/models/custom-wizard-field.js.es6
@@ -1,7 +1,7 @@
import EmberObject from "@ember/object";
-import ValidState from "wizard/mixins/valid-state";
+import ValidState from "discourse/plugins/discourse-custom-wizard/discourse/mixins/valid-state";
import discourseComputed from "discourse-common/utils/decorators";
-import { translatedText } from "discourse/plugins/discourse-custom-wizard/wizard/lib/wizard-i18n";
+import { translationOrText } from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard";
const StandardFieldValidation = [
"text",
@@ -34,17 +34,17 @@ export default EmberObject.extend(ValidState, {
@discourseComputed("i18nKey", "label")
translatedLabel(i18nKey, label) {
- return translatedText(`${i18nKey}.label`, label);
+ return translationOrText(`${i18nKey}.label`, label);
},
@discourseComputed("i18nKey", "placeholder")
translatedPlaceholder(i18nKey, placeholder) {
- return translatedText(`${i18nKey}.placeholder`, placeholder);
+ return translationOrText(`${i18nKey}.placeholder`, placeholder);
},
@discourseComputed("i18nKey", "description")
translatedDescription(i18nKey, description) {
- return translatedText(`${i18nKey}.description`, description);
+ return translationOrText(`${i18nKey}.description`, description);
},
check() {
@@ -72,7 +72,7 @@ export default EmberObject.extend(ValidState, {
valid = true;
}
- this.setValid(valid);
+ this.setValid(Boolean(valid));
return valid;
},
diff --git a/assets/javascripts/discourse/models/custom-wizard-logs.js.es6 b/assets/javascripts/discourse/models/custom-wizard-logs.js.es6
index e2de8a07..23565e2c 100644
--- a/assets/javascripts/discourse/models/custom-wizard-logs.js.es6
+++ b/assets/javascripts/discourse/models/custom-wizard-logs.js.es6
@@ -3,14 +3,54 @@ import { popupAjaxError } from "discourse/lib/ajax-error";
import EmberObject from "@ember/object";
const CustomWizardLogs = EmberObject.extend();
+const logItemTypes = {
+ date: "date_time",
+ action: "text",
+ message: "long_text",
+ user: "user",
+ username: "text",
+};
+
+function logItem(item, attr) {
+ return {
+ value: item[attr],
+ type: logItemTypes[attr],
+ };
+}
CustomWizardLogs.reopenClass({
- list(page = 0) {
- return ajax("/admin/wizards/logs", {
- data: {
- page,
- },
- }).catch(popupAjaxError);
+ list(wizardId, page = 0) {
+ let data = {
+ page,
+ };
+
+ return ajax(`/admin/wizards/logs/${wizardId}`, { data })
+ .catch(popupAjaxError)
+ .then((result) => {
+ if (result.logs) {
+ result.logs = result.logs.map((item) => {
+ let map = {};
+
+ if (item.date) {
+ map.date = logItem(item, "date");
+ }
+ if (item.action) {
+ map.action = logItem(item, "action");
+ }
+ if (item.user) {
+ map.user = item.user;
+ } else {
+ map.user = logItem(item, "username");
+ }
+ if (item.message) {
+ map.message = logItem(item, "message");
+ }
+
+ return map;
+ });
+ }
+ return result;
+ });
},
});
diff --git a/assets/javascripts/wizard/models/step.js.es6 b/assets/javascripts/discourse/models/custom-wizard-step.js.es6
similarity index 86%
rename from assets/javascripts/wizard/models/step.js.es6
rename to assets/javascripts/discourse/models/custom-wizard-step.js.es6
index 36503276..f7cdc497 100644
--- a/assets/javascripts/wizard/models/step.js.es6
+++ b/assets/javascripts/discourse/models/custom-wizard-step.js.es6
@@ -1,9 +1,9 @@
import EmberObject from "@ember/object";
-import ValidState from "wizard/mixins/valid-state";
-import { ajax } from "wizard/lib/ajax";
+import ValidState from "discourse/plugins/discourse-custom-wizard/discourse/mixins/valid-state";
+import { ajax } from "discourse/lib/ajax";
import discourseComputed from "discourse-common/utils/decorators";
-import { translatedText } from "discourse/plugins/discourse-custom-wizard/wizard/lib/wizard-i18n";
import { later } from "@ember/runloop";
+import { translationOrText } from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard";
export default EmberObject.extend(ValidState, {
id: null,
@@ -15,12 +15,12 @@ export default EmberObject.extend(ValidState, {
@discourseComputed("i18nKey", "title")
translatedTitle(i18nKey, title) {
- return translatedText(`${i18nKey}.title`, title);
+ return translationOrText(`${i18nKey}.title`, title);
},
@discourseComputed("i18nKey", "description")
translatedDescription(i18nKey, description) {
- return translatedText(`${i18nKey}.description`, description);
+ return translationOrText(`${i18nKey}.description`, description);
},
@discourseComputed("index")
@@ -72,6 +72,9 @@ export default EmberObject.extend(ValidState, {
type: "PUT",
data: { fields },
}).catch((response) => {
+ if (response.jqXHR) {
+ response = response.jqXHR;
+ }
if (response && response.responseJSON && response.responseJSON.errors) {
let wizardErrors = [];
response.responseJSON.errors.forEach((err) => {
diff --git a/assets/javascripts/discourse/models/custom-wizard.js.es6 b/assets/javascripts/discourse/models/custom-wizard.js.es6
index 2fa6bc4c..77f439c7 100644
--- a/assets/javascripts/discourse/models/custom-wizard.js.es6
+++ b/assets/javascripts/discourse/models/custom-wizard.js.es6
@@ -1,227 +1,127 @@
-import { ajax } from "discourse/lib/ajax";
import EmberObject from "@ember/object";
-import { buildProperties, mapped, present } from "../lib/wizard-json";
-import { listProperties, snakeCase } from "../lib/wizard";
-import wizardSchema from "../lib/wizard-schema";
-import { Promise } from "rsvp";
+import { ajax } from "discourse/lib/ajax";
import { popupAjaxError } from "discourse/lib/ajax-error";
+import discourseComputed from "discourse-common/utils/decorators";
+import getUrl from "discourse-common/lib/get-url";
+import CustomWizardField from "./custom-wizard-field";
+import CustomWizardStep from "./custom-wizard-step";
const CustomWizard = EmberObject.extend({
- save(opts) {
- return new Promise((resolve, reject) => {
- let wizard = this.buildJson(this, "wizard");
+ @discourseComputed("steps.length")
+ totalSteps: (length) => length,
- if (wizard.error) {
- reject(wizard);
- }
-
- let data = {
- wizard,
- };
-
- if (opts.create) {
- data.create = true;
- }
-
- ajax(`/admin/wizards/wizard/${wizard.id}`, {
- type: "PUT",
- contentType: "application/json",
- data: JSON.stringify(data),
- }).then((result) => {
- if (result.backend_validation_error) {
- reject(result);
- } else {
- resolve(result);
- }
- });
- });
+ skip() {
+ if (this.required && !this.completed && this.permitted) {
+ return;
+ }
+ CustomWizard.skip(this.id);
},
- buildJson(object, type, result = {}) {
- let objectType = object.type || null;
-
- if (wizardSchema[type].types) {
- if (!objectType) {
- result.error = {
- type: "required",
- params: { type, property: "type" },
- };
- return result;
- }
- }
-
- for (let property of listProperties(type, { objectType })) {
- let value = object.get(property);
-
- result = this.validateValue(property, value, object, type, result);
-
- if (result.error) {
- break;
- }
-
- if (mapped(property, type)) {
- value = this.buildMappedJson(value);
- }
-
- if (value !== undefined && value !== null) {
- result[property] = value;
- }
- }
-
- if (!result.error) {
- for (let arrayObjectType of Object.keys(
- wizardSchema[type].objectArrays
- )) {
- let arraySchema = wizardSchema[type].objectArrays[arrayObjectType];
- let objectArray = object.get(arraySchema.property);
-
- if (arraySchema.required && !present(objectArray)) {
- result.error = {
- type: "required",
- params: { type, property: arraySchema.property },
- };
- break;
- }
-
- result[arraySchema.property] = [];
-
- for (let item of objectArray) {
- let itemProps = this.buildJson(item, arrayObjectType);
-
- if (itemProps.error) {
- result.error = itemProps.error;
- break;
- } else {
- result[arraySchema.property].push(itemProps);
- }
- }
- }
- }
-
- return result;
- },
-
- validateValue(property, value, object, type, result) {
- if (wizardSchema[type].required.indexOf(property) > -1 && !value) {
- result.error = {
- type: "required",
- params: { type, property },
- };
- }
-
- let dependent = wizardSchema[type].dependent[property];
- if (dependent && value && !object[dependent]) {
- result.error = {
- type: "dependent",
- params: { property, dependent },
- };
- }
-
- if (property === "api_body") {
- try {
- value = JSON.parse(value);
- } catch (e) {
- result.error = {
- type: "invalid",
- params: { type, property },
- };
- }
- }
-
- return result;
- },
-
- buildMappedJson(value) {
- if (typeof value === "string" || Number.isInteger(value)) {
- return value;
- }
- if (!value || !value.length) {
- return false;
- }
-
- let inputs = value;
- let result = [];
-
- inputs.forEach((inpt) => {
- let input = {
- type: inpt.type,
- };
-
- if (inpt.connector) {
- input.connector = inpt.connector;
- }
-
- if (present(inpt.output)) {
- input.output = inpt.output;
- input.output_type = snakeCase(inpt.output_type);
- input.output_connector = inpt.output_connector;
- }
-
- if (present(inpt.pairs)) {
- input.pairs = [];
-
- inpt.pairs.forEach((pr) => {
- if (present(pr.key) && present(pr.value)) {
- let pairParams = {
- index: pr.index,
- key: pr.key,
- key_type: snakeCase(pr.key_type),
- value: pr.value,
- value_type: snakeCase(pr.value_type),
- connector: pr.connector,
- };
-
- input.pairs.push(pairParams);
- }
- });
- }
-
- if (
- (input.type === "assignment" && present(input.output)) ||
- present(input.pairs)
- ) {
- result.push(input);
- }
- });
-
- if (!result.length) {
- result = false;
- }
-
- return result;
- },
-
- remove() {
- return ajax(`/admin/wizards/wizard/${this.id}`, {
- type: "DELETE",
- })
- .then(() => this.destroy())
- .catch(popupAjaxError);
+ restart() {
+ CustomWizard.restart(this.id);
},
});
CustomWizard.reopenClass({
- all() {
- return ajax("/admin/wizards/wizard", {
- type: "GET",
- })
+ skip(wizardId) {
+ ajax({ url: `/w/${wizardId}/skip`, type: "PUT" })
.then((result) => {
- return result.wizard_list;
+ CustomWizard.finished(result);
})
.catch(popupAjaxError);
},
- submissions(wizardId) {
- return ajax(`/admin/wizards/submissions/${wizardId}`, {
- type: "GET",
- }).catch(popupAjaxError);
+ restart(wizardId) {
+ ajax({ url: `/w/${wizardId}/skip`, type: "PUT" })
+ .then(() => {
+ window.location.href = `/w/${wizardId}`;
+ })
+ .catch(popupAjaxError);
},
- create(wizardJson = {}) {
- const wizard = this._super.apply(this);
- wizard.setProperties(buildProperties(wizardJson));
- return wizard;
+ finished(result) {
+ let url = "/";
+ if (result.redirect_on_complete) {
+ url = result.redirect_on_complete;
+ }
+ window.location.href = getUrl(url);
+ },
+
+ build(wizardJson) {
+ if (!wizardJson) {
+ return null;
+ }
+
+ if (!wizardJson.completed && wizardJson.steps) {
+ wizardJson.steps = wizardJson.steps
+ .map((step) => {
+ const stepObj = CustomWizardStep.create(step);
+ stepObj.wizardId = wizardJson.id;
+
+ stepObj.fields.sort((a, b) => {
+ return parseFloat(a.number) - parseFloat(b.number);
+ });
+
+ let tabindex = 1;
+ stepObj.fields.forEach((f) => {
+ f.tabindex = tabindex;
+
+ if (["date_time"].includes(f.type)) {
+ tabindex = tabindex + 2;
+ } else {
+ tabindex++;
+ }
+ });
+
+ stepObj.fields = stepObj.fields.map((f) => {
+ f.wizardId = wizardJson.id;
+ f.stepId = stepObj.id;
+ return CustomWizardField.create(f);
+ });
+
+ return stepObj;
+ })
+ .sort((a, b) => {
+ return parseFloat(a.index) - parseFloat(b.index);
+ });
+ }
+ return CustomWizard.create(wizardJson);
},
});
+export function findCustomWizard(wizardId, params = {}) {
+ let url = `/w/${wizardId}.json`;
+
+ let paramKeys = Object.keys(params).filter((k) => {
+ if (k === "wizard_id") {
+ return false;
+ }
+ return !!params[k];
+ });
+
+ if (paramKeys.length) {
+ url += "?";
+ paramKeys.forEach((k, i) => {
+ if (i > 0) {
+ url += "&";
+ }
+ url += `${k}=${params[k]}`;
+ });
+ }
+
+ return ajax(url).then((result) => {
+ return CustomWizard.build(result);
+ });
+}
+
+let _wizard_store;
+
+export function updateCachedWizard(wizard) {
+ _wizard_store = wizard;
+}
+
+export function getCachedWizard() {
+ return _wizard_store;
+}
+
export default CustomWizard;
diff --git a/assets/javascripts/discourse/routes/admin-wizards-api-show.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-api-show.js.es6
index 6c0ed7a8..a431e9ae 100644
--- a/assets/javascripts/discourse/routes/admin-wizards-api-show.js.es6
+++ b/assets/javascripts/discourse/routes/admin-wizards-api-show.js.es6
@@ -1,7 +1,10 @@
import CustomWizardApi from "../models/custom-wizard-api";
import DiscourseRoute from "discourse/routes/discourse";
+import { inject as service } from "@ember/service";
export default DiscourseRoute.extend({
+ router: service(),
+
model(params) {
if (params.name === "create") {
return CustomWizardApi.create({ isNew: true });
@@ -10,6 +13,12 @@ export default DiscourseRoute.extend({
}
},
+ afterModel(model) {
+ if (model === null) {
+ return this.router.transitionTo("adminWizardsApi");
+ }
+ },
+
setupController(controller, model) {
controller.set("api", model);
},
diff --git a/assets/javascripts/discourse/routes/admin-wizards-api.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-api.js.es6
index 541ab028..2b108460 100644
--- a/assets/javascripts/discourse/routes/admin-wizards-api.js.es6
+++ b/assets/javascripts/discourse/routes/admin-wizards-api.js.es6
@@ -1,7 +1,10 @@
import DiscourseRoute from "discourse/routes/discourse";
import CustomWizardApi from "../models/custom-wizard-api";
+import { inject as service } from "@ember/service";
export default DiscourseRoute.extend({
+ router: service(),
+
model() {
return CustomWizardApi.list();
},
@@ -25,11 +28,11 @@ export default DiscourseRoute.extend({
actions: {
changeApi(apiName) {
this.controllerFor("adminWizardsApi").set("apiName", apiName);
- this.transitionTo("adminWizardsApiShow", apiName);
+ this.router.transitionTo("adminWizardsApiShow", apiName);
},
afterDestroy() {
- this.transitionTo("adminWizardsApi").then(() => this.refresh());
+ this.router.transitionTo("adminWizardsApi").then(() => this.refresh());
},
afterSave(apiName) {
@@ -38,7 +41,7 @@ export default DiscourseRoute.extend({
createApi() {
this.controllerFor("adminWizardsApi").set("apiName", "create");
- this.transitionTo("adminWizardsApiShow", "create");
+ this.router.transitionTo("adminWizardsApiShow", "create");
},
},
});
diff --git a/assets/javascripts/discourse/routes/admin-wizards-custom-fields.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-custom-fields.js.es6
index a1c625ad..a04d36f9 100644
--- a/assets/javascripts/discourse/routes/admin-wizards-custom-fields.js.es6
+++ b/assets/javascripts/discourse/routes/admin-wizards-custom-fields.js.es6
@@ -8,7 +8,10 @@ export default DiscourseRoute.extend({
},
setupController(controller, model) {
- const customFields = A(model || []);
- controller.set("customFields", customFields);
+ const customFields = A(model.custom_fields || []);
+
+ controller.setProperties({
+ customFields,
+ });
},
});
diff --git a/assets/javascripts/discourse/routes/admin-wizards-logs-show.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-logs-show.js.es6
new file mode 100644
index 00000000..9c096a1e
--- /dev/null
+++ b/assets/javascripts/discourse/routes/admin-wizards-logs-show.js.es6
@@ -0,0 +1,26 @@
+import CustomWizardLogs from "../models/custom-wizard-logs";
+import DiscourseRoute from "discourse/routes/discourse";
+import { A } from "@ember/array";
+import { inject as service } from "@ember/service";
+
+export default DiscourseRoute.extend({
+ router: service(),
+
+ model(params) {
+ return CustomWizardLogs.list(params.wizardId);
+ },
+
+ afterModel(model) {
+ if (model === null) {
+ return this.router.transitionTo("adminWizardsLogs");
+ }
+ },
+
+ setupController(controller, model) {
+ controller.setProperties({
+ wizard: model.wizard,
+ logs: A(model.logs),
+ total: model.total,
+ });
+ },
+});
diff --git a/assets/javascripts/discourse/routes/admin-wizards-logs.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-logs.js.es6
index 56b91350..6bb5864b 100644
--- a/assets/javascripts/discourse/routes/admin-wizards-logs.js.es6
+++ b/assets/javascripts/discourse/routes/admin-wizards-logs.js.es6
@@ -1,12 +1,27 @@
-import CustomWizardLogs from "../models/custom-wizard-logs";
import DiscourseRoute from "discourse/routes/discourse";
+import { ajax } from "discourse/lib/ajax";
+import { inject as service } from "@ember/service";
export default DiscourseRoute.extend({
+ router: service(),
+
model() {
- return CustomWizardLogs.list();
+ return ajax(`/admin/wizards/wizard`);
},
setupController(controller, model) {
- controller.set("logs", model);
+ const showParams = this.paramsFor("adminWizardsLogsShow");
+
+ controller.setProperties({
+ wizardId: showParams.wizardId,
+ wizardList: model.wizard_list,
+ });
+ },
+
+ actions: {
+ changeWizard(wizardId) {
+ this.controllerFor("adminWizardsLogs").set("wizardId", wizardId);
+ this.router.transitionTo("adminWizardsLogsShow", wizardId);
+ },
},
});
diff --git a/assets/javascripts/discourse/routes/admin-wizards-manager.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-manager.js.es6
index dfbfc472..b3314186 100644
--- a/assets/javascripts/discourse/routes/admin-wizards-manager.js.es6
+++ b/assets/javascripts/discourse/routes/admin-wizards-manager.js.es6
@@ -1,9 +1,9 @@
-import CustomWizard from "../models/custom-wizard";
+import CustomWizardAdmin from "../models/custom-wizard-admin";
import DiscourseRoute from "discourse/routes/discourse";
export default DiscourseRoute.extend({
model() {
- return CustomWizard.all();
+ return CustomWizardAdmin.all();
},
setupController(controller, model) {
diff --git a/assets/javascripts/discourse/routes/admin-wizards-submissions-show.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-submissions-show.js.es6
index 73168ff3..e9bad625 100644
--- a/assets/javascripts/discourse/routes/admin-wizards-submissions-show.js.es6
+++ b/assets/javascripts/discourse/routes/admin-wizards-submissions-show.js.es6
@@ -1,42 +1,30 @@
-import CustomWizard from "../models/custom-wizard";
+import { A } from "@ember/array";
+import CustomWizardAdmin from "../models/custom-wizard-admin";
import DiscourseRoute from "discourse/routes/discourse";
-
-const excludedMetaFields = ["route_to", "redirect_on_complete", "redirect_to"];
+import { formatModel } from "../lib/wizard-submission";
+import { inject as service } from "@ember/service";
export default DiscourseRoute.extend({
+ router: service(),
+
model(params) {
- return CustomWizard.submissions(params.wizardId);
+ return CustomWizardAdmin.submissions(params.wizardId);
+ },
+
+ afterModel(model) {
+ if (model === null) {
+ return this.router.transitionTo("adminWizardsSubmissions");
+ }
},
setupController(controller, model) {
- if (model && model.submissions) {
- let fields = ["username"];
- model.submissions.forEach((s) => {
- Object.keys(s.fields).forEach((k) => {
- if (!excludedMetaFields.includes(k) && fields.indexOf(k) < 0) {
- fields.push(k);
- }
- });
- });
+ const { fields, submissions } = formatModel(model);
- let submissions = [];
- model.submissions.forEach((s) => {
- let submission = {
- username: s.username,
- };
- Object.keys(s.fields).forEach((f) => {
- if (fields.includes(f)) {
- submission[f] = s.fields[f];
- }
- });
- submissions.push(submission);
- });
-
- controller.setProperties({
- wizard: model.wizard,
- submissions,
- fields,
- });
- }
+ controller.setProperties({
+ wizard: model.wizard,
+ fields: A(fields),
+ submissions: A(submissions),
+ total: model.total,
+ });
},
});
diff --git a/assets/javascripts/discourse/routes/admin-wizards-submissions.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-submissions.js.es6
index 9ecb183d..dc0ef5e0 100644
--- a/assets/javascripts/discourse/routes/admin-wizards-submissions.js.es6
+++ b/assets/javascripts/discourse/routes/admin-wizards-submissions.js.es6
@@ -1,7 +1,10 @@
import DiscourseRoute from "discourse/routes/discourse";
import { ajax } from "discourse/lib/ajax";
+import { inject as service } from "@ember/service";
export default DiscourseRoute.extend({
+ router: service(),
+
model() {
return ajax(`/admin/wizards/wizard`);
},
@@ -18,7 +21,7 @@ export default DiscourseRoute.extend({
actions: {
changeWizard(wizardId) {
this.controllerFor("adminWizardsSubmissions").set("wizardId", wizardId);
- this.transitionTo("adminWizardsSubmissionsShow", wizardId);
+ this.router.transitionTo("adminWizardsSubmissionsShow", wizardId);
},
},
});
diff --git a/assets/javascripts/discourse/routes/admin-wizards-wizard-show.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-wizard-show.js.es6
index cb2d54c3..2ed2627f 100644
--- a/assets/javascripts/discourse/routes/admin-wizards-wizard-show.js.es6
+++ b/assets/javascripts/discourse/routes/admin-wizards-wizard-show.js.es6
@@ -1,9 +1,12 @@
-import CustomWizard from "../models/custom-wizard";
+import CustomWizardAdmin from "../models/custom-wizard-admin";
import { ajax } from "discourse/lib/ajax";
import DiscourseRoute from "discourse/routes/discourse";
import I18n from "I18n";
+import { inject as service } from "@ember/service";
export default DiscourseRoute.extend({
+ router: service(),
+
model(params) {
if (params.wizardId === "create") {
return { create: true };
@@ -14,13 +17,15 @@ export default DiscourseRoute.extend({
afterModel(model) {
if (model.none) {
- return this.transitionTo("adminWizardsWizard");
+ return this.router.transitionTo("adminWizardsWizard");
}
},
setupController(controller, model) {
const parentModel = this.modelFor("adminWizardsWizard");
- const wizard = CustomWizard.create(!model || model.create ? {} : model);
+ const wizard = CustomWizardAdmin.create(
+ !model || model.create ? {} : model
+ );
const fieldTypes = Object.keys(parentModel.field_types).map((type) => {
return {
id: type,
diff --git a/assets/javascripts/discourse/routes/admin-wizards-wizard.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-wizard.js.es6
index b23b63f6..6ae31e82 100644
--- a/assets/javascripts/discourse/routes/admin-wizards-wizard.js.es6
+++ b/assets/javascripts/discourse/routes/admin-wizards-wizard.js.es6
@@ -4,8 +4,11 @@ import EmberObject, { set } from "@ember/object";
import { A } from "@ember/array";
import { all } from "rsvp";
import { ajax } from "discourse/lib/ajax";
+import { inject as service } from "@ember/service";
export default DiscourseRoute.extend({
+ router: service(),
+
model() {
return ajax("/admin/wizards/wizard");
},
@@ -80,14 +83,14 @@ export default DiscourseRoute.extend({
this.controllerFor("adminWizardsWizard").set("wizardId", wizardId);
if (wizardId) {
- this.transitionTo("adminWizardsWizardShow", wizardId);
+ this.router.transitionTo("adminWizardsWizardShow", wizardId);
} else {
- this.transitionTo("adminWizardsWizard");
+ this.router.transitionTo("adminWizardsWizard");
}
},
afterDestroy() {
- this.transitionTo("adminWizardsWizard").then(() => this.refresh());
+ this.router.transitionTo("adminWizardsWizard").then(() => this.refresh());
},
afterSave(wizardId) {
@@ -96,7 +99,7 @@ export default DiscourseRoute.extend({
createWizard() {
this.controllerFor("adminWizardsWizard").set("wizardId", "create");
- this.transitionTo("adminWizardsWizardShow", "create");
+ this.router.transitionTo("adminWizardsWizardShow", "create");
},
},
});
diff --git a/assets/javascripts/discourse/routes/admin-wizards.js.es6 b/assets/javascripts/discourse/routes/admin-wizards.js.es6
index 5de271a8..a16df9ae 100644
--- a/assets/javascripts/discourse/routes/admin-wizards.js.es6
+++ b/assets/javascripts/discourse/routes/admin-wizards.js.es6
@@ -1,9 +1,12 @@
import DiscourseRoute from "discourse/routes/discourse";
+import { inject as service } from "@ember/service";
export default DiscourseRoute.extend({
- beforeModel(transition) {
+ router: service(),
+
+ afterModel(model, transition) {
if (transition.targetName === "adminWizards.index") {
- this.transitionTo("adminWizardsWizard");
+ this.router.transitionTo("adminWizardsWizard");
}
},
});
diff --git a/assets/javascripts/wizard/routes/wizard-index.js.es6 b/assets/javascripts/discourse/routes/custom-wizard-index.js.es6
similarity index 69%
rename from assets/javascripts/wizard/routes/wizard-index.js.es6
rename to assets/javascripts/discourse/routes/custom-wizard-index.js.es6
index 264cb0a2..78495607 100644
--- a/assets/javascripts/wizard/routes/wizard-index.js.es6
+++ b/assets/javascripts/discourse/routes/custom-wizard-index.js.es6
@@ -1,17 +1,14 @@
-import { getCachedWizard } from "../models/wizard";
+import { getCachedWizard } from "../models/custom-wizard";
import Route from "@ember/routing/route";
+import { inject as service } from "@ember/service";
export default Route.extend({
+ router: service(),
+
beforeModel() {
const wizard = getCachedWizard();
- if (
- wizard &&
- wizard.user &&
- wizard.permitted &&
- !wizard.completed &&
- wizard.start
- ) {
- this.replaceWith("step", wizard.start);
+ if (wizard && wizard.permitted && !wizard.completed && wizard.start) {
+ this.router.replaceWith("customWizardStep", wizard.start);
}
},
@@ -19,10 +16,6 @@ export default Route.extend({
return getCachedWizard();
},
- renderTemplate() {
- this.render("wizard/templates/wizard-index");
- },
-
setupController(controller, model) {
if (model && model.id) {
const completed = model.get("completed");
@@ -30,7 +23,7 @@ export default Route.extend({
const wizardId = model.get("id");
const user = model.get("user");
const name = model.get("name");
- const requiresLogin = !user;
+ const requiresLogin = !user && !permitted;
const notPermitted = !permitted;
const props = {
diff --git a/assets/javascripts/wizard/routes/step.js.es6 b/assets/javascripts/discourse/routes/custom-wizard-step.js.es6
similarity index 56%
rename from assets/javascripts/wizard/routes/step.js.es6
rename to assets/javascripts/discourse/routes/custom-wizard-step.js.es6
index a076951f..963307e7 100644
--- a/assets/javascripts/wizard/routes/step.js.es6
+++ b/assets/javascripts/discourse/routes/custom-wizard-step.js.es6
@@ -1,10 +1,20 @@
-import WizardI18n from "../lib/wizard-i18n";
-import { getCachedWizard } from "../models/wizard";
+import I18n from "I18n";
+import { getCachedWizard } from "../models/custom-wizard";
import Route from "@ember/routing/route";
+import { scrollTop } from "discourse/mixins/scroll-top";
+import { action } from "@ember/object";
+import { inject as service } from "@ember/service";
export default Route.extend({
+ router: service(),
+
beforeModel() {
- this.set("wizard", getCachedWizard());
+ const wizard = getCachedWizard();
+ this.set("wizard", wizard);
+
+ if (!wizard || !wizard.permitted || wizard.completed) {
+ this.router.replaceWith("customWizard");
+ }
},
model(params) {
@@ -20,15 +30,11 @@ export default Route.extend({
afterModel(model) {
if (model.completed) {
- return this.transitionTo("wizard.index");
+ return this.router.transitionTo("wizard.index");
}
return model.set("wizardId", this.wizard.id);
},
- renderTemplate() {
- this.render("wizard/templates/step");
- },
-
setupController(controller, model) {
let props = {
step: model,
@@ -38,8 +44,7 @@ export default Route.extend({
if (!model.permitted) {
props["stepMessage"] = {
state: "not-permitted",
- text:
- model.permitted_message || WizardI18n("wizard.step_not_permitted"),
+ text: model.permitted_message || I18n.t("wizard.step_not_permitted"),
};
if (model.index > 0) {
props["showReset"] = true;
@@ -48,4 +53,10 @@ export default Route.extend({
controller.setProperties(props);
},
+
+ @action
+ didTransition() {
+ scrollTop();
+ return true;
+ },
});
diff --git a/assets/javascripts/wizard/routes/wizard.js.es6 b/assets/javascripts/discourse/routes/custom-wizard.js.es6
similarity index 52%
rename from assets/javascripts/wizard/routes/wizard.js.es6
rename to assets/javascripts/discourse/routes/custom-wizard.js.es6
index a2c34f13..1a214a2d 100644
--- a/assets/javascripts/wizard/routes/wizard.js.es6
+++ b/assets/javascripts/discourse/routes/custom-wizard.js.es6
@@ -1,10 +1,14 @@
-import { findCustomWizard, updateCachedWizard } from "../models/wizard";
-import WizardI18n from "../lib/wizard-i18n";
-import Route from "@ember/routing/route";
-import { scheduleOnce } from "@ember/runloop";
-import { getOwner } from "discourse-common/lib/get-owner";
+import { findCustomWizard, updateCachedWizard } from "../models/custom-wizard";
+import I18n from "I18n";
+import DiscourseRoute from "discourse/routes/discourse";
+import bootbox from "bootbox";
+
+export default DiscourseRoute.extend({
+ titleToken() {
+ const wizard = this.modelFor("custom-wizard");
+ return wizard ? wizard.name || wizard.id : I18n.t("wizard.custom_title");
+ },
-export default Route.extend({
beforeModel(transition) {
if (transition.intent.queryParams) {
this.set("queryParams", transition.intent.queryParams);
@@ -16,7 +20,7 @@ export default Route.extend({
},
showDialog(wizardModel) {
- const title = WizardI18n("wizard.incomplete_submission.title", {
+ const title = I18n.t("wizard.incomplete_submission.title", {
date: moment(wizardModel.submission_last_updated_at).format(
"MMMM Do YYYY"
),
@@ -24,14 +28,14 @@ export default Route.extend({
const buttons = [
{
- label: WizardI18n("wizard.incomplete_submission.restart"),
+ label: I18n.t("wizard.incomplete_submission.restart"),
class: "btn btn-default",
callback: () => {
wizardModel.restart();
},
},
{
- label: WizardI18n("wizard.incomplete_submission.resume"),
+ label: I18n.t("wizard.incomplete_submission.resume"),
class: "btn btn-primary",
},
];
@@ -47,28 +51,15 @@ export default Route.extend({
updateCachedWizard(model);
},
- renderTemplate() {
- this.render("wizard/templates/wizard");
- },
-
setupController(controller, model) {
- const background = model ? model.get("background") : "";
-
- scheduleOnce("afterRender", this, function () {
- $("body").css("background", background);
-
- if (model && model.id) {
- $(getOwner(this).rootElement).addClass(model.id.dasherize());
- }
- });
-
controller.setProperties({
customWizard: true,
logoUrl: this.siteSettings.logo_small,
reset: null,
+ model,
});
- const stepModel = this.modelFor("step");
+ const stepModel = this.modelFor("custom-wizard-step");
if (
model.resume_on_revisit &&
model.submission_last_updated_at &&
@@ -76,5 +67,24 @@ export default Route.extend({
) {
this.showDialog(model);
}
+
+ const background = model.get("background");
+ if (background) {
+ document.body.style.background = background;
+ }
+ },
+
+ activate() {
+ if (!document.body.classList.contains("custom-wizard")) {
+ document.body.classList.add("custom-wizard");
+ }
+ },
+
+ deactivate() {
+ if (document.body.classList.contains("custom-wizard")) {
+ document.body.classList.remove("custom-wizard");
+ }
+
+ document.body.style.background = "";
},
});
diff --git a/assets/javascripts/discourse/services/subscription.js b/assets/javascripts/discourse/services/subscription.js
new file mode 100644
index 00000000..499e734c
--- /dev/null
+++ b/assets/javascripts/discourse/services/subscription.js
@@ -0,0 +1,65 @@
+import Service from "@ember/service";
+import { tracked } from "@glimmer/tracking";
+import { ajax } from "discourse/lib/ajax";
+import { popupAjaxError } from "discourse/lib/ajax-error";
+
+const PRODUCT_PAGE = "https://custom-wizard.pavilion.tech";
+const SUPPORT_MESSAGE =
+ "https://coop.pavilion.tech/new-message?username=support&title=Custom%20Wizard%20Support";
+const MANAGER_CATEGORY =
+ "https://coop.pavilion.tech/c/support/discourse-custom-wizard";
+
+export default class SubscriptionService extends Service {
+ @tracked subscribed = false;
+ @tracked subscriptionType = "";
+ @tracked businessSubscription = false;
+ @tracked communitySubscription = false;
+ @tracked standardSubscription = false;
+ @tracked subscriptionAttributes = {};
+
+ async init() {
+ super.init(...arguments);
+ await this.retrieveSubscriptionStatus();
+ }
+
+ async retrieveSubscriptionStatus() {
+ let result = await ajax("/admin/wizards/subscription").catch(
+ popupAjaxError
+ );
+
+ this.subscribed = result.subscribed;
+ this.subscriptionType = result.subscription_type;
+ this.subscriptionAttributes = result.subscription_attributes;
+ this.businessSubscription = this.subscriptionType === "business";
+ this.communitySubscription = this.subscriptionType === "community";
+ this.standardSubscription = this.subscriptionType === "standard";
+ }
+
+ async updateSubscriptionStatus() {
+ let result = await ajax(
+ "/admin/wizards/subscription?update_from_remote=true"
+ ).catch(popupAjaxError);
+
+ this.subscribed = result.subscribed;
+ this.subscriptionType = result.subscription_type;
+ this.subscriptionAttributes = result.subscription_attributes;
+ this.businessSubscription = this.subscriptionType === "business";
+ this.communitySubscription = this.subscriptionType === "community";
+ this.standardSubscription = this.subscriptionType === "standard";
+ }
+
+ get subscriptionCtaLink() {
+ switch (this.subscriptionType) {
+ case "none":
+ return PRODUCT_PAGE;
+ case "standard":
+ return SUPPORT_MESSAGE;
+ case "business":
+ return SUPPORT_MESSAGE;
+ case "community":
+ return MANAGER_CATEGORY;
+ default:
+ return PRODUCT_PAGE;
+ }
+ }
+}
diff --git a/assets/javascripts/discourse/templates/admin-wizards-api-show.hbs b/assets/javascripts/discourse/templates/admin-wizards-api-show.hbs
index 4d3def3d..5270aa28 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-api-show.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-api-show.hbs
@@ -8,7 +8,12 @@
{{/if}}
{{/if}}
- {{d-button label="admin.wizard.api.save" action=(action "save") class="btn-primary" disabled=saveDisabled}}
+ {{d-button
+ label="admin.wizard.api.save"
+ action=(action "save")
+ class="btn-primary"
+ disabled=saveDisabled
+ }}
{{#if showRemove}}
{{d-button action=(action "remove") label="admin.wizard.api.remove"}}
@@ -21,26 +26,32 @@
{{/if}}
-
-
-
{{outlet}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-custom-fields.hbs b/assets/javascripts/discourse/templates/admin-wizards-custom-fields.hbs
index 10501498..4dda0ac8 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-custom-fields.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-custom-fields.hbs
@@ -5,7 +5,8 @@
{{d-button
label="admin.wizard.custom_field.add"
icon="plus"
- action="addField"}}
+ action=(action "addField")
+ }}
@@ -14,7 +15,8 @@
opts=messageOpts
type=messageType
url=documentationUrl
- component="custom_fields"}}
+ component="custom_fields"
+}}
{{#if customFields}}
@@ -32,9 +34,10 @@
{{custom-field-input
field=field
removeField=(action "removeField")
- saveField=(action "saveField")}}
+ saveField=(action "saveField")
+ }}
{{/each}}
{{/if}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-logs-show.hbs b/assets/javascripts/discourse/templates/admin-wizards-logs-show.hbs
new file mode 100644
index 00000000..deb7ed8b
--- /dev/null
+++ b/assets/javascripts/discourse/templates/admin-wizards-logs-show.hbs
@@ -0,0 +1,49 @@
+{{#if logs}}
+
+
+
+ {{#load-more selector=".wizard-table tr" action=(action "loadMore")}}
+ {{#if noResults}}
+
{{i18n "search.no_results"}}
+ {{else}}
+
+
+
+ {{i18n "admin.wizard.log.date"}}
+ {{i18n "admin.wizard.log.action"}}
+ {{i18n "admin.wizard.log.user"}}
+ {{i18n "admin.wizard.log.message"}}
+
+
+
+ {{#each logs as |log|}}
+
+ {{#each-in log as |field value|}}
+ {{wizard-table-field
+ field=field
+ value=value
+ }}
+ {{/each-in}}
+
+ {{/each}}
+
+
+ {{/if}}
+
+ {{conditional-loading-spinner condition=refreshing}}
+ {{/load-more}}
+
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-logs.hbs b/assets/javascripts/discourse/templates/admin-wizards-logs.hbs
index b0dd3de6..703f4fa3 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-logs.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-logs.hbs
@@ -1,34 +1,19 @@
-
-
{{i18n "admin.wizard.log.nav_label"}}
-
- {{d-button
- label="refresh"
- icon="sync"
- action="refresh"
- class="refresh"}}
+
+ {{combo-box
+ value=wizardId
+ content=wizardList
+ onChange=(route-action "changeWizard")
+ options=(hash none="admin.wizard.select")
+ }}
-{{#load-more selector=".log-list tr" action=(action "loadMore") class="wizard-logs"}}
- {{#if noResults}}
-
{{i18n "search.no_results"}}
- {{else}}
-
-
-
- Message
- Date
-
-
-
- {{#each logs as |log|}}
-
- {{log.message}}
- {{bound-date log.date}}
-
- {{/each}}
-
-
- {{/if}}
+{{wizard-message
+ key=messageKey
+ opts=messageOpts
+ url=documentationUrl
+ component="logs"
+}}
- {{conditional-loading-spinner condition=refreshing}}
-{{/load-more}}
+
+ {{outlet}}
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-manager.hbs b/assets/javascripts/discourse/templates/admin-wizards-manager.hbs
index 9ee2f080..f2de0783 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-manager.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-manager.hbs
@@ -11,30 +11,35 @@
{{/if}}
- {{input
- id="file-upload"
- type="file"
+
{{d-button
id="upload-button"
label="admin.wizard.manager.upload"
- action=(action "upload")}}
+ action=(action "upload")
+ }}
{{d-button
id="import-button"
label="admin.wizard.manager.import"
action=(action "import")
- disabled=importDisabled}}
+ disabled=importDisabled
+ }}
{{d-button
id="export-button"
label="admin.wizard.manager.export"
action=(action "export")
- disabled=exportDisabled}}
+ disabled=exportDisabled
+ }}
{{d-button
id="destroy-button"
label="admin.wizard.manager.destroy"
action=(action "destroy")
- disabled=destoryDisabled}}
+ disabled=destoryDisabled
+ }}
@@ -45,7 +50,8 @@
opts=messageOpts
items=messageItems
loading=loading
- component="manager"}}
+ component="manager"
+}}
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-submissions-show.hbs b/assets/javascripts/discourse/templates/admin-wizards-submissions-show.hbs
index 6d1f255b..96a24a9d 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-submissions-show.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-submissions-show.hbs
@@ -1,8 +1,24 @@
{{#if submissions}}
-
-
-
-
- {{#each fields as |f|}}
- {{f}}
- {{/each}}
-
-
-
- {{#each submissions as |s|}}
-
- {{#each-in s as |k v|}}
- {{v}}
- {{/each-in}}
-
- {{/each}}
-
-
+
+ {{#load-more selector=".wizard-table tr" action=(action "loadMore")}}
+ {{#if noResults}}
+
{{i18n "search.no_results"}}
+ {{else}}
+
+
+
+ {{#each fields as |field|}}
+ {{#if field.enabled}}
+
+ {{field.label}}
+
+ {{/if}}
+ {{/each}}
+
+
+
+ {{#each displaySubmissions as |submission|}}
+
+ {{#each-in submission as |field value|}}
+ {{wizard-table-field field=field value=value}}
+ {{/each-in}}
+
+ {{/each}}
+
+
+ {{/if}}
+
+ {{conditional-loading-spinner condition=loadingMore}}
+ {{/load-more}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-submissions.hbs b/assets/javascripts/discourse/templates/admin-wizards-submissions.hbs
index d843485a..1ccaa3b8 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-submissions.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-submissions.hbs
@@ -1,13 +1,19 @@
-
+
{{combo-box
value=wizardId
content=wizardList
onChange=(route-action "changeWizard")
- options=(hash
- none="admin.wizard.select"
- )}}
+ options=(hash none="admin.wizard.select")
+ }}
+{{wizard-message
+ key=messageKey
+ opts=messageOpts
+ url=documentationUrl
+ component="submissions"
+}}
+
{{outlet}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-wizard-show.hbs b/assets/javascripts/discourse/templates/admin-wizards-wizard-show.hbs
index c5ed70a7..053deb73 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-wizard-show.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-wizard-show.hbs
@@ -1,18 +1,31 @@
{{#if wizard}}
@@ -23,11 +36,12 @@
{{i18n "admin.wizard.background"}}
- {{input
+
@@ -41,9 +55,8 @@
valueProperty="id"
value=wizard.theme_id
onChange=(action (mut wizard.theme_id))
- options=(hash
- none="admin.wizard.no_theme"
- )}}
+ options=(hash none="admin.wizard.no_theme")
+ }}
@@ -55,21 +68,11 @@
- {{i18n "admin.wizard.required"}}
+ {{i18n "admin.wizard.save_submissions"}}
- {{input type="checkbox" checked=wizard.required}}
- {{i18n "admin.wizard.required_label"}}
-
-
-
-
-
- {{i18n "admin.wizard.after_signup"}}
-
-
- {{input type="checkbox" checked=wizard.after_signup}}
- {{i18n "admin.wizard.after_signup_label"}}
+
+ {{i18n "admin.wizard.save_submissions_label"}}
@@ -78,17 +81,27 @@
{{i18n "admin.wizard.multiple_submissions"}}
- {{input type="checkbox" checked=wizard.multiple_submissions}}
+
{{i18n "admin.wizard.multiple_submissions_label"}}
+
+
+ {{i18n "admin.wizard.after_signup"}}
+
+
+
+ {{i18n "admin.wizard.after_signup_label"}}
+
+
+
@@ -98,77 +111,61 @@
{{i18n "admin.wizard.after_time"}}
- {{input type="checkbox" checked=wizard.after_time}}
+
{{i18n "admin.wizard.after_time_label"}}
{{d-button
- action="setNextSessionScheduled"
+ action=(action "setNextSessionScheduled")
translatedLabel=nextSessionScheduledLabel
class="btn-after-time"
- icon="far-calendar"}}
+ icon="far-calendar"
+ }}
-
-
- {{i18n "admin.wizard.permitted"}}
-
-
- {{wizard-mapper
- inputs=wizard.permitted
- options=(hash
- context="wizard"
- inputTypes="assignment,validation"
- groupSelection="output"
- userFieldSelection="key"
- textSelection="value"
- inputConnector="and"
- )}}
-
-
-
- {{wizard-advanced-toggle showAdvanced=wizard.showAdvanced}}
-
- {{#if wizard.showAdvanced}}
-
-
-
-
- {{i18n "admin.wizard.save_submissions"}}
-
-
- {{input type="checkbox" checked=wizard.save_submissions}}
- {{i18n "admin.wizard.save_submissions_label"}}
-
+ {{#wizard-subscription-container}}
+
+
+ {{i18n "admin.wizard.required"}}
-
-
-
- {{i18n "admin.wizard.restart_on_revisit"}}
-
-
- {{input type="checkbox" checked=wizard.restart_on_revisit}}
- {{i18n "admin.wizard.restart_on_revisit_label"}}
-
+
+
+ {{i18n "admin.wizard.required_label"}}
-
-
-
- {{i18n "admin.wizard.resume_on_revisit"}}
-
-
- {{input type="checkbox" checked=wizard.resume_on_revisit}}
- {{i18n "admin.wizard.resume_on_revisit_label"}}
-
-
-
- {{/if}}
+
+
+
+ {{i18n "admin.wizard.restart_on_revisit"}}
+
+
+
+ {{i18n "admin.wizard.restart_on_revisit_label"}}
+
+
+
+
+
+ {{i18n "admin.wizard.permitted"}}
+
+
+ {{wizard-mapper
+ inputs=wizard.permitted
+ options=(hash
+ context="wizard"
+ inputTypes="assignment,validation"
+ groupSelection="output"
+ guestGroup=true
+ userFieldSelection="key"
+ textSelection="value"
+ inputConnector="and"
+ )
+ }}
+
+
+ {{/wizard-subscription-container}}
- {{wizard-links
- itemType="step"
- current=currentStep
- items=wizard.steps}}
+ {{wizard-links itemType="step" current=currentStep items=wizard.steps}}
{{#if currentStep}}
{{wizard-custom-step
@@ -176,27 +173,37 @@
wizard=wizard
currentField=currentField
wizardFields=wizardFields
- fieldTypes=fieldTypes}}
+ fieldTypes=filteredFieldTypes
+ subscribed=subscribed
+ }}
{{/if}}
{{wizard-links
itemType="action"
current=currentAction
items=wizard.actions
- generateLabels=true}}
+ generateLabels=true
+ }}
- {{#each wizard.actions as |action|}}
+ {{#each wizard.actions as |wizardAction|}}
{{wizard-custom-action
- action=action
+ action=wizardAction
currentActionId=currentAction.id
wizard=wizard
apis=apis
removeAction="removeAction"
- wizardFields=wizardFields}}
+ wizardFields=wizardFields
+ fieldTypes=filteredFieldTypes
+ }}
{{/each}}
-
+
{{i18n "admin.wizard.save"}}
@@ -212,4 +219,4 @@
{{d-icon "times"}}{{error}}
{{/if}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards-wizard.hbs b/assets/javascripts/discourse/templates/admin-wizards-wizard.hbs
index 081cd5f3..7a33dac1 100644
--- a/assets/javascripts/discourse/templates/admin-wizards-wizard.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards-wizard.hbs
@@ -3,21 +3,18 @@
value=wizardListVal
content=wizardList
onChange=(route-action "changeWizard")
- options=(hash
- none="admin.wizard.select"
- )}}
+ options=(hash none="admin.wizard.select")
+ }}
{{d-button
- action="createWizard"
+ action=(route-action "createWizard")
label="admin.wizard.create"
- icon="plus"}}
+ icon="plus"
+ }}
-{{wizard-message
- key=messageKey
- url=messageUrl
- component="wizard"}}
+{{wizard-message key=messageKey url=messageUrl component="wizard"}}
{{outlet}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/admin-wizards.hbs b/assets/javascripts/discourse/templates/admin-wizards.hbs
index bd575aae..d650986d 100644
--- a/assets/javascripts/discourse/templates/admin-wizards.hbs
+++ b/assets/javascripts/discourse/templates/admin-wizards.hbs
@@ -1,14 +1,27 @@
{{#admin-nav}}
{{nav-item route="adminWizardsWizard" label="admin.wizard.nav_label"}}
- {{nav-item route="adminWizardsCustomFields" label="admin.wizard.custom_field.nav_label"}}
- {{nav-item route="adminWizardsSubmissions" label="admin.wizard.submissions.nav_label"}}
- {{#if siteSettings.wizard_apis_enabled}}
+ {{nav-item
+ route="adminWizardsCustomFields"
+ label="admin.wizard.custom_field.nav_label"
+ }}
+ {{nav-item
+ route="adminWizardsSubmissions"
+ label="admin.wizard.submissions.nav_label"
+ }}
+ {{#if showApi}}
{{nav-item route="adminWizardsApi" label="admin.wizard.api.nav_label"}}
{{/if}}
{{nav-item route="adminWizardsLogs" label="admin.wizard.log.nav_label"}}
- {{nav-item route="adminWizardsManager" label="admin.wizard.manager.nav_label"}}
+ {{nav-item
+ route="adminWizardsManager"
+ label="admin.wizard.manager.nav_label"
+ }}
+
+
+
+
{{/admin-nav}}
{{outlet}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-field-input.hbs b/assets/javascripts/discourse/templates/components/custom-field-input.hbs
index 43a97be8..4e3fa2f0 100644
--- a/assets/javascripts/discourse/templates/components/custom-field-input.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-field-input.hbs
@@ -1,29 +1,35 @@
{{#if showInputs}}
- {{combo-box
+ {{wizard-subscription-selector
value=field.klass
- content=klassContent
- none="admin.wizard.custom_field.klass.select"
- onChange=(action (mut field.klass))}}
+ feature="custom_field"
+ attribute="klass"
+ onChange=(action (mut field.klass))
+ options=(hash none="admin.wizard.custom_field.klass.select")
+ }}
- {{combo-box
+ {{wizard-subscription-selector
value=field.type
- content=typeContent
- none="admin.wizard.custom_field.type.select"
- onChange=(action (mut field.type))}}
+ feature="custom_field"
+ attribute="type"
+ onChange=(action (mut field.type))
+ options=(hash none="admin.wizard.custom_field.type.select")
+ }}
- {{input
- value=field.name
- placeholder=(i18n "admin.wizard.custom_field.name.select")}}
+
{{multi-select
value=field.serializers
content=serializerContent
- none="admin.wizard.custom_field.serializers.select"
- onChange=(action (mut field.serializers))}}
+ onChange=(action (mut field.serializers))
+ options=(hash none="admin.wizard.custom_field.serializers.select")
+ }}
{{#if loading}}
@@ -34,19 +40,18 @@
{{/if}}
{{/if}}
{{d-button
- action="destroy"
+ action=(action "destroy")
icon="trash-alt"
class="destroy"
- disabled=destroyDisabled}}
+ disabled=destroyDisabled
+ }}
{{d-button
icon="save"
- action="save"
+ action=(action "save")
disabled=saveDisabled
- class="save"}}
- {{d-button
- action="close"
- icon="times"
- disabled=closeDisabled}}
+ class="save"
+ }}
+ {{d-button action=(action "close") icon="times" disabled=closeDisabled}}
{{else}}
{{field.klass}}
@@ -69,7 +74,7 @@
{{else}}
- {{d-button action="edit" icon="pencil-alt"}}
+ {{d-button action=(action "edit") icon="pencil-alt"}}
{{/if}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/wizard-composer-editor.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-composer-editor.hbs
similarity index 86%
rename from assets/javascripts/wizard/templates/components/wizard-composer-editor.hbs
rename to assets/javascripts/discourse/templates/components/custom-wizard-composer-editor.hbs
index 7d453a0b..70286603 100644
--- a/assets/javascripts/wizard/templates/components/wizard-composer-editor.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-composer-editor.hbs
@@ -11,10 +11,11 @@
validation=validation
loading=composer.loading
showLink=showLink
- wizardComposerEvents=true
+ wizardComposer=true
fieldId=field.id
disabled=disableTextarea
- outletArgs=(hash composer=composer editorType="composer")}}
+ outletArgs=(hash composer=composer editorType="composer")
+}}
+/>
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-date-input.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-date-input.hbs
new file mode 100644
index 00000000..3f1cc4c6
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-date-input.hbs
@@ -0,0 +1,11 @@
+
+
+
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/wizard-date-time-input.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-date-time-input.hbs
similarity index 71%
rename from assets/javascripts/wizard/templates/components/wizard-date-time-input.hbs
rename to assets/javascripts/discourse/templates/components/custom-wizard-date-time-input.hbs
index 0981f739..051ce6f8 100644
--- a/assets/javascripts/wizard/templates/components/wizard-date-time-input.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-date-time-input.hbs
@@ -1,5 +1,5 @@
{{#unless timeFirst}}
- {{wizard-date-input
+ {{custom-wizard-date-input
date=date
relativeDate=relativeDate
onChange=(action "onChangeDate")
@@ -8,7 +8,7 @@
{{/unless}}
{{#if showTime}}
- {{wizard-time-input
+ {{custom-wizard-time-input
date=date
relativeDate=relativeDate
onChange=(action "onChangeTime")
@@ -17,7 +17,7 @@
{{/if}}
{{#if timeFirst}}
- {{wizard-date-input
+ {{custom-wizard-date-input
date=date
relativeDate=relativeDate
onChange=(action "onChangeDate")
@@ -26,9 +26,5 @@
{{/if}}
{{#if clearable}}
- {{d-button
- class="clear-date-time"
- icon="times"
- action=(action "onClear")
- }}
-{{/if}}
+ {{d-button class="clear-date-time" icon="times" action=(action "onClear")}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/wizard-editor.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-editor.hbs
similarity index 64%
rename from assets/javascripts/wizard/templates/components/wizard-editor.hbs
rename to assets/javascripts/discourse/templates/components/custom-wizard-editor.hbs
index 861d2449..fd10299c 100644
--- a/assets/javascripts/wizard/templates/components/wizard-editor.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-editor.hbs
@@ -2,7 +2,7 @@
{{#if showPreview}}
-
+
{{html-safe preview}}
@@ -18,16 +18,19 @@
onExpand=(action b.action b)
class=b.className
content=popupMenuOptions
- options=(hash
- popupTitle=b.title
- icon=b.icon
- )}}
+ options=(hash popupTitle=b.title icon=b.icon)
+ }}
{{else}}
{{d.icon}}
-
+
{{d-icon b.icon}}
{{#if b.label}}
- {{wizard-i18n b.label}}
+ {{i18n b.label}}
{{/if}}
{{/if}}
@@ -40,7 +43,12 @@
{{conditional-loading-spinner condition=loading}}
- {{textarea tabindex=tabindex value=value class="d-editor-input" placeholder=placeholder}}
+
{{/if}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-category.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-category.hbs
new file mode 100644
index 00000000..ee777850
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-category.hbs
@@ -0,0 +1,8 @@
+{{custom-wizard-category-selector
+ categories=categories
+ class=fieldClass
+ whitelist=field.content
+ onChange=(action (mut categories))
+ tabindex=field.tabindex
+ options=(hash maximum=field.limit)
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-checkbox.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-checkbox.hbs
new file mode 100644
index 00000000..dd75b5fb
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-checkbox.hbs
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-composer-preview.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-composer-preview.hbs
similarity index 95%
rename from assets/javascripts/wizard/templates/components/wizard-field-composer-preview.hbs
rename to assets/javascripts/discourse/templates/components/custom-wizard-field-composer-preview.hbs
index 508cf31d..7e4e777f 100644
--- a/assets/javascripts/wizard/templates/components/wizard-field-composer-preview.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-composer-preview.hbs
@@ -2,4 +2,4 @@
{{html-safe field.preview_template}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-composer.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-composer.hbs
new file mode 100644
index 00000000..ecc8058b
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-composer.hbs
@@ -0,0 +1,25 @@
+{{custom-wizard-composer-editor
+ field=field
+ composer=composer
+ wizard=wizard
+ fieldClass=fieldClass
+ groupsMentioned=(action "groupsMentioned")
+ cannotSeeMention=(action "cannotSeeMention")
+ importQuote=(action "importQuote")
+ togglePreview=(action "togglePreview")
+ afterRefresh=(action "afterRefresh")
+}}
+
+
+
+ {{i18n togglePreviewLabel}}
+
+
+ {{#if field.char_counter}}
+ {{wizard-char-counter field.value field.max_length}}
+ {{/if}}
+
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-date-time.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-date-time.hbs
similarity index 68%
rename from assets/javascripts/wizard/templates/components/wizard-field-date-time.hbs
rename to assets/javascripts/discourse/templates/components/custom-wizard-field-date-time.hbs
index dae4523d..5faeb3fb 100644
--- a/assets/javascripts/wizard/templates/components/wizard-field-date-time.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-date-time.hbs
@@ -1,5 +1,5 @@
-{{wizard-date-time-input
+{{custom-wizard-date-time-input
date=dateTime
onChange=(action "onChange")
tabindex=field.tabindex
-}}
+}}
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-date.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-date.hbs
similarity index 75%
rename from assets/javascripts/wizard/templates/components/wizard-field-date.hbs
rename to assets/javascripts/discourse/templates/components/custom-wizard-field-date.hbs
index ed4d14e3..14504896 100644
--- a/assets/javascripts/wizard/templates/components/wizard-field-date.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-date.hbs
@@ -1,6 +1,6 @@
-{{wizard-date-input
+{{custom-wizard-date-input
date=date
onChange=(action "onChange")
tabindex=field.tabindex
format=field.format
-}}
+}}
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-dropdown.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-dropdown.hbs
similarity index 68%
rename from assets/javascripts/wizard/templates/components/wizard-field-dropdown.hbs
rename to assets/javascripts/discourse/templates/components/custom-wizard-field-dropdown.hbs
index 42fc63e8..f03bb975 100644
--- a/assets/javascripts/wizard/templates/components/wizard-field-dropdown.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-dropdown.hbs
@@ -4,6 +4,5 @@
content=field.content
tabindex=field.tabindex
onChange=(action "onChangeValue")
- options=(hash
- none="select_kit.default_header_text"
- )}}
+ options=(hash none="select_kit.default_header_text")
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-group.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-group.hbs
new file mode 100644
index 00000000..da487422
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-group.hbs
@@ -0,0 +1,10 @@
+{{custom-wizard-group-selector
+ groups=site.groups
+ class=fieldClass
+ field=field
+ whitelist=field.content
+ value=field.value
+ tabindex=field.tabindex
+ onChange=(action (mut field.value))
+ options=(hash none="select_kit.default_header_text")
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-number.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-number.hbs
new file mode 100644
index 00000000..0bfc99be
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-number.hbs
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-tag.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-tag.hbs
new file mode 100644
index 00000000..71ffe7d7
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-tag.hbs
@@ -0,0 +1,8 @@
+{{custom-wizard-tag-chooser
+ tags=field.value
+ class=fieldClass
+ tabindex=field.tabindex
+ tagGroups=field.tag_groups
+ everyTag=true
+ options=(hash maximum=field.limit allowAny=field.can_create_tag)
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-text.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-text.hbs
new file mode 100644
index 00000000..76dbee2a
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-text.hbs
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-textarea.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-textarea.hbs
new file mode 100644
index 00000000..5431538c
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-textarea.hbs
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-time.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-time.hbs
similarity index 70%
rename from assets/javascripts/wizard/templates/components/wizard-field-time.hbs
rename to assets/javascripts/discourse/templates/components/custom-wizard-field-time.hbs
index d4cc425a..665028d0 100644
--- a/assets/javascripts/wizard/templates/components/wizard-field-time.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-time.hbs
@@ -1,5 +1,5 @@
-{{wizard-time-input
+{{custom-wizard-time-input
date=time
onChange=(action "onChange")
tabindex=field.tabindex
-}}
+}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-upload.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-upload.hbs
new file mode 100644
index 00000000..f899f580
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-upload.hbs
@@ -0,0 +1,27 @@
+
+ {{#if uploading}}
+ {{i18n "wizard.uploading"}}
+ {{else}}
+ {{i18n "wizard.upload"}}
+ {{d-icon "upload"}}
+ {{/if}}
+
+
+
+
+{{#if field.value}}
+ {{#if isImage}}
+
+ {{else}}
+ {{field.value.original_filename}}
+ {{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-field-url.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-url.hbs
new file mode 100644
index 00000000..ccbedaf3
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-url.hbs
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-user-selector.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field-user-selector.hbs
similarity index 74%
rename from assets/javascripts/wizard/templates/components/wizard-field-user-selector.hbs
rename to assets/javascripts/discourse/templates/components/custom-wizard-field-user-selector.hbs
index 5f8c1443..7261cf78 100644
--- a/assets/javascripts/wizard/templates/components/wizard-field-user-selector.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field-user-selector.hbs
@@ -1,4 +1,5 @@
{{custom-user-selector
usernames=field.value
placeholderKey=field.placeholder
- tabindex=field.tabindex}}
+ tabindex=field.tabindex
+}}
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/wizard-field.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-field.hbs
similarity index 53%
rename from assets/javascripts/wizard/templates/components/wizard-field.hbs
rename to assets/javascripts/discourse/templates/components/custom-wizard-field.hbs
index efda8629..0678ac73 100644
--- a/assets/javascripts/wizard/templates/components/wizard-field.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-field.hbs
@@ -1,29 +1,38 @@
-
- {{html-safe field.translatedLabel}}
-
-
-{{#if field.image}}
-
-{{/if}}
-
-{{#if field.description}}
- {{cookedDescription}}
-{{/if}}
-
-{{#field-validators field=field as |validators|}}
- {{#if inputComponentName}}
-
- {{component inputComponentName field=field step=step fieldClass=fieldClass wizard=wizard autocomplete=validators.autocomplete}}
-
- {{/if}}
-{{/field-validators}}
-
-{{#if field.char_counter}}
- {{#if textType}}
- {{char-counter field.value field.max_length}}
- {{/if}}
-{{/if}}
-
-{{#if field.errorDescription}}
- {{html-safe field.errorDescription}}
-{{/if}}
+
+ {{html-safe field.translatedLabel}}
+
+
+{{#if field.image}}
+
+{{/if}}
+
+{{#if field.description}}
+ {{cookedDescription}}
+{{/if}}
+
+{{#field-validators field=field as |validators|}}
+ {{#if inputComponentName}}
+
+ {{component
+ inputComponentName
+ field=field
+ step=step
+ fieldClass=fieldClass
+ wizard=wizard
+ autocomplete=validators.autocomplete
+ }}
+
+ {{/if}}
+{{/field-validators}}
+
+{{#if field.char_counter}}
+ {{#if textType}}
+ {{wizard-char-counter field.value field.max_length}}
+ {{/if}}
+{{/if}}
+
+{{#if field.errorDescription}}
+ {{html-safe
+ field.errorDescription
+ }}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-no-access.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-no-access.hbs
new file mode 100644
index 00000000..cb9f59f1
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-no-access.hbs
@@ -0,0 +1,11 @@
+{{text}}
+
+
+ {{i18n "wizard.return_to_site" siteName=siteName}}
+ {{d-icon "sign-out-alt"}}
+
+
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/wizard-similar-topic.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-similar-topic.hbs
similarity index 56%
rename from assets/javascripts/wizard/templates/components/wizard-similar-topic.hbs
rename to assets/javascripts/discourse/templates/components/custom-wizard-similar-topic.hbs
index 47197dbc..286521b3 100644
--- a/assets/javascripts/wizard/templates/components/wizard-similar-topic.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-similar-topic.hbs
@@ -1,4 +1,6 @@
{{html-safe topic.fancy_title}}
- {{date-node topic.created_at}} - {{html-safe topic.blurb}}
-
+ {{date-node topic.created_at}}
+ -
+ {{html-safe topic.blurb}}
+
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/wizard-similar-topics.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-similar-topics.hbs
similarity index 55%
rename from assets/javascripts/wizard/templates/components/wizard-similar-topics.hbs
rename to assets/javascripts/discourse/templates/components/custom-wizard-similar-topics.hbs
index d1ee1fa1..ba745b2d 100644
--- a/assets/javascripts/wizard/templates/components/wizard-similar-topics.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-similar-topics.hbs
@@ -1,11 +1,11 @@
-{{#if showTopics}}
-
- {{#each topics as |topic|}}
- {{wizard-similar-topic topic=topic}}
- {{/each}}
-
-{{else}}
-
- {{wizard-i18n "realtime_validations.similar_topics.show"}}
-
-{{/if}}
+{{#if showTopics}}
+
+ {{#each topics as |topic|}}
+ {{custom-wizard-similar-topic topic=topic}}
+ {{/each}}
+
+{{else}}
+
+ {{i18n "realtime_validations.similar_topics.show"}}
+
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/custom-wizard-step.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-step.hbs
new file mode 100644
index 00000000..b9f0c06e
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-step.hbs
@@ -0,0 +1,84 @@
+
+ {{#if step.title}}
+
{{cookedTitle}}
+ {{/if}}
+
+ {{#if bannerImage}}
+
+
+
+ {{/if}}
+
+ {{#if step.description}}
+
{{cookedDescription}}
+ {{/if}}
+
+ {{#custom-wizard-step-form step=step}}
+ {{#each step.fields as |field|}}
+ {{custom-wizard-field field=field step=step wizard=wizard}}
+ {{/each}}
+ {{/custom-wizard-step-form}}
+
+
+
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/wizard-time-input.hbs b/assets/javascripts/discourse/templates/components/custom-wizard-time-input.hbs
similarity index 98%
rename from assets/javascripts/wizard/templates/components/wizard-time-input.hbs
rename to assets/javascripts/discourse/templates/components/custom-wizard-time-input.hbs
index 73fa4968..6207851b 100644
--- a/assets/javascripts/wizard/templates/components/wizard-time-input.hbs
+++ b/assets/javascripts/discourse/templates/components/custom-wizard-time-input.hbs
@@ -10,4 +10,4 @@
autoInsertNoneItem=false
translatedFilterPlaceholder="--:--"
)
-}}
+}}
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/field-validators.hbs b/assets/javascripts/discourse/templates/components/field-validators.hbs
similarity index 53%
rename from assets/javascripts/wizard/templates/components/field-validators.hbs
rename to assets/javascripts/discourse/templates/components/field-validators.hbs
index 1fc04012..0bfd3875 100644
--- a/assets/javascripts/wizard/templates/components/field-validators.hbs
+++ b/assets/javascripts/discourse/templates/components/field-validators.hbs
@@ -1,13 +1,23 @@
-{{#if field.validations}}
- {{#each-in field.validations.above as |type validation|}}
- {{component validation.component field=field type=type validation=validation}}
- {{/each-in}}
-
- {{yield (hash perform=(action "perform") autocomplete="off")}}
-
- {{#each-in field.validations.below as |type validation|}}
- {{component validation.component field=field type=type validation=validation}}
- {{/each-in}}
-{{else}}
- {{yield}}
-{{/if}}
+{{#if field.validations}}
+ {{#each-in field.validations.above as |type validation|}}
+ {{component
+ validation.component
+ field=field
+ type=type
+ validation=validation
+ }}
+ {{/each-in}}
+
+ {{yield (hash perform=(action "perform") autocomplete="off")}}
+
+ {{#each-in field.validations.below as |type validation|}}
+ {{component
+ validation.component
+ field=field
+ type=type
+ validation=validation
+ }}
+ {{/each-in}}
+{{else}}
+ {{yield}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/components/similar-topics-validator.hbs b/assets/javascripts/discourse/templates/components/similar-topics-validator.hbs
similarity index 51%
rename from assets/javascripts/wizard/templates/components/similar-topics-validator.hbs
rename to assets/javascripts/discourse/templates/components/similar-topics-validator.hbs
index 2e92333d..0849c020 100644
--- a/assets/javascripts/wizard/templates/components/similar-topics-validator.hbs
+++ b/assets/javascripts/discourse/templates/components/similar-topics-validator.hbs
@@ -1,13 +1,13 @@
{{#if currentState}}
{{#if insufficientCharactersCategories}}
- {{html-safe (wizard-i18n currentStateKey catLinks=catLinks)}}
+ {{html-safe (i18n currentStateKey catLinks=catLinks)}}
{{else}}
- {{wizard-i18n currentStateKey}}
+ {{i18n currentStateKey}}
{{/if}}
{{/if}}
{{#if showSimilarTopics}}
- {{wizard-similar-topics topics=similarTopics}}
-{{/if}}
+ {{custom-wizard-similar-topics topics=similarTopics}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/validator.hbs b/assets/javascripts/discourse/templates/components/validator.hbs
new file mode 100644
index 00000000..a64c4e93
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/validator.hbs
@@ -0,0 +1,5 @@
+{{#if isValid}}
+ {{i18n validMessageKey}}
+{{else}}
+ {{i18n invalidMessageKey}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-advanced-toggle.hbs b/assets/javascripts/discourse/templates/components/wizard-advanced-toggle.hbs
deleted file mode 100644
index ec2bcb76..00000000
--- a/assets/javascripts/discourse/templates/components/wizard-advanced-toggle.hbs
+++ /dev/null
@@ -1,4 +0,0 @@
-{{d-button
- action="toggleAdvanced"
- label="admin.wizard.advanced"
- class=toggleClass}}
diff --git a/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs b/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs
index 4c645cf7..80152674 100644
--- a/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-custom-action.hbs
@@ -1,9 +1,10 @@
{{#if showUndo}}
{{d-button
- action="undoChanges"
+ action=(action "undoChanges")
icon=undoIcon
label=undoKey
- class="undo-changes"}}
+ class="undo-changes"
+ }}
{{/if}}
@@ -12,13 +13,14 @@
- {{combo-box
- value=action.type
- content=actionTypes
+ {{wizard-subscription-selector
+ value=this.action.type
+ feature="action"
+ attribute="type"
onChange=(action "changeType")
- options=(hash
- none="admin.wizard.select_type"
- )}}
+ wizard=wizard
+ options=(hash none="admin.wizard.select_type")
+ }}
@@ -29,16 +31,14 @@
{{combo-box
- value=action.run_after
+ value=this.action.run_after
content=runAfterContent
- onChange=(action (mut action.run_after))}}
+ onChange=(action (mut this.action.run_after))
+ }}
-{{wizard-message
- key=messageKey
- url=messageUrl
- component="action"}}
+{{wizard-message key=messageKey url=messageUrl component="action"}}
{{#if basicTopicFields}}
@@ -48,14 +48,15 @@
{{wizard-mapper
- inputs=action.title
+ inputs=this.action.title
property="title"
onUpdate=(action "mappedFieldUpdated")
options=(hash
wizardFieldSelection=true
userFieldSelection="key,value"
context="action"
- )}}
+ )
+ }}
@@ -66,23 +67,24 @@
- {{#if action.post_builder}}
+ {{#if this.action.post_builder}}
{{i18n "admin.wizard.action.post_builder.label"}}
@@ -90,8 +92,9 @@
{{wizard-text-editor
- value=action.post_template
- wizardFields=wizardFields}}
+ value=this.action.post_template
+ wizardFields=wizardFields
+ }}
{{/if}}
@@ -105,7 +108,7 @@
{{wizard-mapper
- inputs=action.category
+ inputs=this.action.category
property="category"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -116,7 +119,8 @@
wizardActionSelection="output"
outputDefaultSelection="category"
context="action"
- )}}
+ )
+ }}
@@ -127,7 +131,7 @@
{{wizard-mapper
- inputs=action.tags
+ inputs=this.action.tags
property="tags"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -137,7 +141,8 @@
wizardFieldSelection=true
userFieldSelection="key,value"
context="action"
- )}}
+ )
+ }}
@@ -148,16 +153,49 @@
{{wizard-mapper
- inputs=action.visible
+ inputs=this.action.visible
property="visible"
onUpdate=(action "mappedFieldUpdated")
options=(hash
- wizardFieldSelection=true
- userFieldSelection=true
- context="action"
- )}}
+ wizardFieldSelection=true userFieldSelection=true context="action"
+ )
+ }}
+
+ {{#if hasEventField}}
+
+
+ {{i18n "admin.wizard.action.create_topic.add_event"}}
+
+
+
+ {{wizard-mapper
+ inputs=this.action.add_event
+ property="add_event"
+ onUpdate=(action "mappedFieldUpdated")
+ options=(hash wizardFieldSelection=true context="action")
+ }}
+
+
+ {{/if}}
+
+ {{#if hasLocationField}}
+
+
+ {{i18n "admin.wizard.action.create_topic.add_location"}}
+
+
+
+ {{wizard-mapper
+ inputs=this.action.add_location
+ property="add_location"
+ onUpdate=(action "mappedFieldUpdated")
+ options=(hash wizardFieldSelection=true context="action")
+ }}
+
+
+ {{/if}}
{{/if}}
{{#if sendMessage}}
@@ -168,7 +206,7 @@
{{wizard-mapper
- inputs=action.recipient
+ inputs=this.action.recipient
property="recipient"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -179,7 +217,8 @@
userSelection="output"
outputDefaultSelection="user"
context="action"
- )}}
+ )
+ }}
{{/if}}
@@ -191,7 +230,7 @@
{{wizard-mapper
- inputs=action.profile_updates
+ inputs=this.action.profile_updates
property="profile_updates"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -202,7 +241,8 @@
wizardActionSelection="value"
keyDefaultSelection="userField"
context="action"
- )}}
+ )
+ }}
{{/if}}
@@ -214,13 +254,14 @@
{{combo-box
- value=action.api
+ value=this.action.api
content=availableApis
- onChange=(action (mut action.api))
+ onChange=(action (mut this.action.api))
options=(hash
- isDisabled=action.custom_title_enabled
+ isDisabled=this.action.custom_title_enabled
none="admin.wizard.action.send_to_api.select_an_api"
- )}}
+ )
+ }}
@@ -231,13 +272,14 @@
{{combo-box
- value=action.api_endpoint
+ value=this.action.api_endpoint
content=availableEndpoints
- onChange=(action (mut action.api_endpoint))
+ onChange=(action (mut this.action.api_endpoint))
options=(hash
isDisabled=apiEmpty
none="admin.wizard.action.send_to_api.select_an_endpoint"
- )}}
+ )
+ }}
@@ -248,11 +290,12 @@
{{wizard-text-editor
- value=action.api_body
+ value=this.action.api_body
previewEnabled=false
barEnabled=false
wizardFields=wizardFields
- placeholder="admin.wizard.action.send_to_api.body_placeholder"}}
+ placeholder="admin.wizard.action.send_to_api.body_placeholder"
+ }}
{{/if}}
@@ -265,7 +308,7 @@
{{wizard-mapper
- inputs=action.group
+ inputs=this.action.group
property="group"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -276,7 +319,8 @@
groupSelection="value,output"
outputDefaultSelection="group"
context="action"
- )}}
+ )
+ }}
{{/if}}
@@ -289,7 +333,7 @@
{{wizard-mapper
- inputs=action.url
+ inputs=this.action.url
property="url"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -299,7 +343,8 @@
groupSelection="key,value"
categorySelection="key,value"
userSelection="key,value"
- )}}
+ )
+ }}
{{/if}}
@@ -312,7 +357,7 @@
{{wizard-mapper
- inputs=action.categories
+ inputs=this.action.categories
property="categories"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -322,63 +367,70 @@
userFieldSelection="key,value"
categorySelection="output"
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.watch_categories.mute_remainder"}}
+ {{i18n
+ "admin.wizard.action.watch_categories.mute_remainder"
+ }}
{{wizard-mapper
- inputs=action.mute_remainder
+ inputs=this.action.mute_remainder
property="mute_remainder"
onUpdate=(action "mappedFieldUpdated")
options=(hash
context="action"
wizardFieldSelection=true
userFieldSelection="key,value"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.watch_categories.notification_level.label"}}
+ {{i18n
+ "admin.wizard.action.watch_x.notification_level.label"
+ }}
{{combo-box
- value=action.notification_level
+ value=this.action.notification_level
content=availableNotificationLevels
- onChange=(action (mut action.notification_level))
+ onChange=(action (mut this.action.notification_level))
options=(hash
- isDisabled=action.custom_title_enabled
- none="admin.wizard.action.watch_categories.select_a_notification_level"
- )}}
+ isDisabled=this.action.custom_title_enabled
+ none="admin.wizard.action.watch_x.select_a_notification_level"
+ )
+ }}
- {{i18n "admin.wizard.action.watch_categories.usernames"}}
+ {{i18n "admin.wizard.action.watch_x.usernames"}}
{{wizard-mapper
- inputs=action.usernames
+ inputs=this.action.usernames
property="usernames"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -386,7 +438,82 @@
wizardFieldSelection=true
userFieldSelection="key,value"
userSelection="output"
- )}}
+ )
+ }}
+
+
+{{/if}}
+
+{{#if watchTags}}
+
+
+ {{i18n "admin.wizard.action.watch_tags.tags"}}
+
+
+
+ {{wizard-mapper
+ inputs=this.action.tags
+ property="tags"
+ onUpdate=(action "mappedFieldUpdated")
+ options=(hash
+ textSelection="key,value"
+ tagSelection="output"
+ wizardFieldSelection=true
+ wizardActionSelection=true
+ userFieldSelection="key,value"
+ context="action"
+ )
+ }}
+
+
+
+
+
+ {{i18n
+ "admin.wizard.action.watch_x.notification_level.label"
+ }}
+
+
+
+ {{combo-box
+ value=this.action.notification_level
+ content=availableNotificationLevels
+ onChange=(action (mut this.action.notification_level))
+ options=(hash
+ isDisabled=this.action.custom_title_enabled
+ none="admin.wizard.action.watch_x.select_a_notification_level"
+ )
+ }}
+
+
+
+
+
+ {{i18n "admin.wizard.action.watch_x.wizard_user"}}
+
+
+
+
+
+
+
+
+
+ {{i18n "admin.wizard.action.watch_x.usernames"}}
+
+
+
+ {{wizard-mapper
+ inputs=this.action.usernames
+ property="usernames"
+ onUpdate=(action "mappedFieldUpdated")
+ options=(hash
+ context="action"
+ wizardFieldSelection=true
+ userFieldSelection="key,value"
+ userSelection="output"
+ )
+ }}
{{/if}}
@@ -399,7 +526,7 @@
{{wizard-mapper
- inputs=action.name
+ inputs=this.action.name
property="name"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -407,7 +534,8 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
@@ -417,7 +545,7 @@
{{wizard-mapper
- inputs=action.full_name
+ inputs=this.action.full_name
property="full_name"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -425,7 +553,8 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
@@ -435,7 +564,7 @@
{{wizard-mapper
- inputs=action.title
+ inputs=this.action.title
property="title"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -443,7 +572,8 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
@@ -453,7 +583,7 @@
{{wizard-mapper
- inputs=action.bio_raw
+ inputs=this.action.bio_raw
property="bio_raw"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -461,7 +591,8 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
@@ -471,7 +602,7 @@
{{wizard-mapper
- inputs=action.owner_usernames
+ inputs=this.action.owner_usernames
property="owner_usernames"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -480,7 +611,8 @@
userFieldSelection=true
userSelection="output"
context="action"
- )}}
+ )
+ }}
@@ -490,7 +622,7 @@
{{wizard-mapper
- inputs=action.usernames
+ inputs=this.action.usernames
property="usernames"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -499,17 +631,20 @@
userFieldSelection=true
userSelection="output"
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.create_group.grant_trust_level"}}
+ {{i18n
+ "admin.wizard.action.create_group.grant_trust_level"
+ }}
{{wizard-mapper
- inputs=action.grant_trust_level
+ inputs=this.action.grant_trust_level
property="grant_trust_level"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -517,17 +652,20 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.create_group.mentionable_level"}}
+ {{i18n
+ "admin.wizard.action.create_group.mentionable_level"
+ }}
{{wizard-mapper
- inputs=action.mentionable_level
+ inputs=this.action.mentionable_level
property="mentionable_level"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -535,17 +673,20 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.create_group.messageable_level"}}
+ {{i18n
+ "admin.wizard.action.create_group.messageable_level"
+ }}
{{wizard-mapper
- inputs=action.messageable_level
+ inputs=this.action.messageable_level
property="messageable_level"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -553,17 +694,20 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.create_group.visibility_level"}}
+ {{i18n
+ "admin.wizard.action.create_group.visibility_level"
+ }}
{{wizard-mapper
- inputs=action.visibility_level
+ inputs=this.action.visibility_level
property="visibility_level"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -571,17 +715,20 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.create_group.members_visibility_level"}}
+ {{i18n
+ "admin.wizard.action.create_group.members_visibility_level"
+ }}
{{wizard-mapper
- inputs=action.members_visibility_level
+ inputs=this.action.members_visibility_level
property="members_visibility_level"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -589,7 +736,8 @@
wizardFieldSelection=true
userFieldSelection=true
context="action"
- )}}
+ )
+ }}
{{/if}}
@@ -602,15 +750,16 @@
{{wizard-mapper
- inputs=action.name
+ inputs=this.action.name
property="name"
onUpdate=(action "mappedFieldUpdated")
options=(hash
- textSelection="key,value"
+ textSelection="key,value,output"
wizardFieldSelection=true
userFieldSelection="key,value"
context="action"
- )}}
+ )
+ }}
@@ -621,7 +770,7 @@
{{wizard-mapper
- inputs=action.slug
+ inputs=this.action.slug
property="slug"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -629,7 +778,8 @@
wizardFieldSelection=true
userFieldSelection="key,value"
context="action"
- )}}
+ )
+ }}
@@ -640,7 +790,7 @@
{{wizard-mapper
- inputs=action.color
+ inputs=this.action.color
property="color"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -648,7 +798,8 @@
wizardFieldSelection=true
userFieldSelection="key,value"
context="action"
- )}}
+ )
+ }}
@@ -659,7 +810,7 @@
{{wizard-mapper
- inputs=action.text_color
+ inputs=this.action.text_color
property="text_color"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -667,18 +818,21 @@
wizardFieldSelection=true
userFieldSelection="key,value"
context="action"
- )}}
+ )
+ }}
- {{i18n "admin.wizard.action.create_category.parent_category"}}
+ {{i18n
+ "admin.wizard.action.create_category.parent_category"
+ }}
{{wizard-mapper
- inputs=action.parent_category_id
+ inputs=this.action.parent_category_id
property="parent_category_id"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -687,7 +841,8 @@
userFieldSelection="key,value"
categorySelection="output"
context="action"
- )}}
+ )
+ }}
@@ -698,7 +853,7 @@
{{wizard-mapper
- inputs=action.permissions
+ inputs=this.action.permissions
property="permissions"
onUpdate=(action "mappedFieldUpdated")
options=(hash
@@ -709,104 +864,101 @@
userFieldSelection=true
groupSelection="key"
context="action"
- )}}
+ )
+ }}
{{/if}}
-{{#if showAdvanced}}
- {{wizard-advanced-toggle showAdvanced=action.showAdvanced}}
-
- {{#if action.showAdvanced}}
-
-
- {{#if hasCustomFields}}
-
-
- {{i18n "admin.wizard.action.custom_fields.label"}}
-
-
-
- {{wizard-mapper
- inputs=action.custom_fields
- property="custom_fields"
- onUpdate=(action "mappedFieldUpdated")
- options=(hash
- inputTypes="association"
- customFieldSelection="key"
- wizardFieldSelection="value"
- wizardActionSelection="value"
- userFieldSelection="value"
- keyPlaceholder="admin.wizard.action.custom_fields.key"
- context=customFieldsContext
- )}}
-
-
- {{/if}}
-
- {{#if sendMessage}}
-
-
- {{i18n "admin.wizard.required"}}
-
-
-
- {{wizard-mapper
- inputs=action.required
- property="required"
- onUpdate=(action "mappedFieldUpdated")
- options=(hash
- textSelection="value"
- wizardFieldSelection=true
- userFieldSelection=true
- groupSelection=true
- context="action"
- )}}
-
-
- {{/if}}
-
- {{#if showPostAdvanced}}
-
-
- {{i18n "admin.wizard.action.skip_redirect.label"}}
-
-
-
- {{input type="checkbox" checked=action.skip_redirect}}
-
-
- {{i18n "admin.wizard.action.skip_redirect.description" type="topic"}}
-
-
-
-
-
-
- {{i18n "admin.wizard.action.suppress_notifications.label"}}
-
-
-
- {{input type="checkbox" checked=action.suppress_notifications}}
-
-
- {{i18n "admin.wizard.action.suppress_notifications.description" type="topic"}}
-
-
-
- {{/if}}
-
- {{#if routeTo}}
-
-
- {{i18n "admin.wizard.action.route_to.code"}}
-
-
-
- {{input value=action.code}}
-
-
- {{/if}}
+{{#if hasCustomFields}}
+
+
+ {{i18n "admin.wizard.action.custom_fields.label"}}
- {{/if}}
+
+
+ {{wizard-mapper
+ inputs=this.action.custom_fields
+ property="custom_fields"
+ onUpdate=(action "mappedFieldUpdated")
+ options=(hash
+ inputTypes="association"
+ customFieldSelection="key"
+ wizardFieldSelection="value"
+ wizardActionSelection="value"
+ userFieldSelection="value"
+ keyPlaceholder="admin.wizard.action.custom_fields.key"
+ context=customFieldsContext
+ )
+ }}
+
+
{{/if}}
+
+{{#if sendMessage}}
+
+
+ {{i18n "admin.wizard.required"}}
+
+
+
+ {{wizard-mapper
+ inputs=this.action.required
+ property="required"
+ onUpdate=(action "mappedFieldUpdated")
+ options=(hash
+ textSelection="value"
+ wizardFieldSelection=true
+ userFieldSelection=true
+ groupSelection=true
+ context="action"
+ )
+ }}
+
+
+{{/if}}
+
+{{#if showPostAdvanced}}
+
+
+ {{i18n "admin.wizard.action.skip_redirect.label"}}
+
+
+
+
+
+
+ {{i18n "admin.wizard.action.skip_redirect.description" type="topic"}}
+
+
+
+
+
+
+ {{i18n "admin.wizard.action.suppress_notifications.label"}}
+
+
+
+
+
+
+ {{i18n
+ "admin.wizard.action.suppress_notifications.description"
+ type="topic"
+ }}
+
+
+
+{{/if}}
+
+{{#if routeTo}}
+
+
+ {{i18n "admin.wizard.action.route_to.code"}}
+
+
+
+
+
+
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs b/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs
index 6866f3ef..c4d297ff 100644
--- a/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs
@@ -1,293 +1,289 @@
-{{#if showUndo}}
- {{d-button
- action="undoChanges"
- icon=undoIcon
- label=undoKey
- class="undo-changes"}}
-{{/if}}
-
-
-
- {{i18n "admin.wizard.field.label"}}
-
-
- {{input name="label" value=field.label}}
-
-
-
-
-
- {{i18n "admin.wizard.field.required"}}
-
-
-
- {{i18n "admin.wizard.field.required_label"}}
- {{input type="checkbox" checked=field.required}}
-
-
-
-
-
- {{i18n "admin.wizard.field.description"}}
-
-
- {{textarea name="description" value=field.description}}
-
-
-
-
-
- {{i18n "admin.wizard.field.image"}}
-
-
- {{uppy-image-uploader
- imageUrl=field.image
- onUploadDone=(action "imageUploadDone")
- onUploadDeleted=(action "imageUploadDeleted")
- type="wizard-step"
- class="no-repeat contain-image"
- id=(concat "wizard-field-" field.id "-image-upload")}}
-
-
-
-
-
- {{i18n "admin.wizard.type"}}
-
-
-
- {{combo-box
- value=field.type
- content=fieldTypes
- onChange=(action "changeType")
- options=(hash
- none="admin.wizard.select_type"
- )}}
-
-
-
-{{wizard-message
- key=messageKey
- url=messageUrl
- component="field"}}
-
-{{#if isTextType}}
-
-
- {{i18n "admin.wizard.field.min_length"}}
-
-
-
- {{input
- type="number"
- name="min_length"
- value=field.min_length
- class="small"}}
-
-
-
-
-
- {{i18n "admin.wizard.field.max_length"}}
-
-
-
- {{input
- type="number"
- name="max_length"
- value=field.max_length
- class="small"}}
-
-
-
-
-
- {{i18n "admin.wizard.field.char_counter"}}
-
-
-
- {{i18n "admin.wizard.field.char_counter_placeholder"}}
- {{input
- type="checkbox"
- checked=field.char_counter}}
-
-
-
-
-
- {{i18n "admin.wizard.field.field_placeholder"}}
-
-
-
- {{textarea
- name="field_placeholder"
- class="medium"
- value=field.placeholder}}
-
-
-{{/if}}
-
-{{#if isComposerPreview}}
-
-
- {{i18n "admin.wizard.field.preview_template"}}
-
-
-
- {{textarea name="preview-template" value=field.preview_template class="preview-template"}}
-
-
-{{/if}}
-
-{{#if isUpload}}
-
-
- {{i18n "admin.wizard.field.file_types"}}
-
-
-
- {{input value=field.file_types class="medium"}}
-
-
-{{/if}}
-
-{{#if showLimit}}
-
-
- {{i18n "admin.wizard.field.limit"}}
-
-
-
- {{input type="number" value=field.limit class="small"}}
-
-
-{{/if}}
-
-{{#if isDateTime}}
-
-
- {{html-safe (i18n "admin.wizard.field.date_time_format.label")}}
-
-
-
- {{input value=field.format class="medium"}}
- {{html-safe (i18n "admin.wizard.field.date_time_format.instructions")}}
-
-
-{{/if}}
-
-{{#if showPrefill}}
-
-
- {{i18n "admin.wizard.field.prefill"}}
-
-
-
- {{wizard-mapper
- inputs=field.prefill
- property="prefill"
- onUpdate=(action "mappedFieldUpdated")
- options=prefillOptions}}
-
-
-{{/if}}
-
-{{#if showContent}}
-
-
- {{i18n "admin.wizard.field.content"}}
-
-
-
- {{wizard-mapper
- inputs=field.content
- property="content"
- onUpdate=(action "mappedFieldUpdated")
- options=contentOptions}}
-
-
-{{/if}}
-
-{{#if isTag}}
-
-
- {{i18n "admin.wizard.field.tag_groups"}}
-
-
-
- {{tag-group-chooser
- id=(concat field.id "-tag-groups")
- tagGroups=field.tag_groups
- onChange=(action (mut field.tag_groups))
- }}
-
-
-{{/if}}
-
-{{#if showAdvanced}}
- {{wizard-advanced-toggle showAdvanced=field.showAdvanced}}
-
- {{#if field.showAdvanced}}
-
-
-
-
- {{i18n "admin.wizard.condition"}}
-
-
-
- {{wizard-mapper
- inputs=field.condition
- options=fieldConditionOptions}}
-
-
-
-
-
- {{i18n "admin.wizard.index"}}
-
-
-
- {{wizard-mapper
- inputs=field.index
- options=fieldIndexOptions}}
-
-
-
- {{#if isCategory}}
-
-
- {{i18n "admin.wizard.field.property"}}
-
-
-
- {{combo-box
- value=field.property
- content=categoryPropertyTypes
- onChange=(action (mut field.property))
- options=(hash
- none="admin.wizard.selector.placeholder.property"
- )}}
-
-
- {{/if}}
-
-
-
- {{i18n "admin.wizard.translation"}}
-
-
- {{input
- name="key"
- value=field.key
- class="medium"
- placeholderKey="admin.wizard.translation_placeholder"}}
-
-
-
- {{#if validations}}
- {{wizard-realtime-validations field=field validations=validations}}
- {{/if}}
-
- {{/if}}
-{{/if}}
+{{#if showUndo}}
+ {{d-button
+ action=(action "undoChanges")
+ icon=undoIcon
+ label=undoKey
+ class="undo-changes"
+ }}
+{{/if}}
+
+
+
+ {{i18n "admin.wizard.field.label"}}
+
+
+
+
+
+
+
+
+ {{i18n "admin.wizard.field.required"}}
+
+
+
+ {{i18n "admin.wizard.field.required_label"}}
+
+
+
+
+
+
+ {{i18n "admin.wizard.field.description"}}
+
+
+
+
+
+
+
+
+ {{i18n "admin.wizard.field.image"}}
+
+
+ {{uppy-image-uploader
+ imageUrl=field.image
+ onUploadDone=(action "imageUploadDone")
+ onUploadDeleted=(action "imageUploadDeleted")
+ type="wizard-field-image"
+ class="no-repeat contain-image"
+ id=(concat "wizard-field-" field.id "-image-upload")
+ }}
+
+
+
+
+
+ {{i18n "admin.wizard.type"}}
+
+
+
+ {{wizard-subscription-selector
+ value=field.type
+ feature="field"
+ attribute="type"
+ onChange=(action "changeType")
+ wizard=wizard
+ options=(hash none="admin.wizard.select_type")
+ }}
+
+
+
+{{wizard-message key=messageKey url=messageUrl component="field"}}
+
+{{#if isTextType}}
+
+
+ {{i18n "admin.wizard.field.min_length"}}
+
+
+
+
+
+
+
+
+
+ {{i18n "admin.wizard.field.max_length"}}
+
+
+
+
+
+
+
+
+
+ {{i18n "admin.wizard.field.char_counter"}}
+
+
+
+ {{i18n "admin.wizard.field.char_counter_placeholder"}}
+
+
+
+
+
+
+ {{i18n "admin.wizard.field.field_placeholder"}}
+
+
+
+
+
+
+{{/if}}
+
+{{#if isComposerPreview}}
+
+
+ {{i18n "admin.wizard.field.preview_template"}}
+
+
+
+
+
+
+{{/if}}
+
+{{#if isUpload}}
+
+
+ {{i18n "admin.wizard.field.file_types"}}
+
+
+
+
+
+
+{{/if}}
+
+{{#if showLimit}}
+
+
+ {{i18n "admin.wizard.field.limit"}}
+
+
+
+
+
+
+{{/if}}
+
+{{#if isDateTime}}
+
+
+ {{html-safe
+ (i18n "admin.wizard.field.date_time_format.label")
+ }}
+
+
+
+
+ {{html-safe
+ (i18n "admin.wizard.field.date_time_format.instructions")
+ }}
+
+
+{{/if}}
+
+{{#if showPrefill}}
+
+
+ {{i18n "admin.wizard.field.prefill"}}
+
+
+
+ {{wizard-mapper
+ inputs=field.prefill
+ property="prefill"
+ onUpdate=(action "mappedFieldUpdated")
+ options=prefillOptions
+ }}
+
+
+{{/if}}
+
+{{#if showContent}}
+
+
+ {{i18n "admin.wizard.field.content"}}
+
+
+
+ {{wizard-mapper
+ inputs=field.content
+ property="content"
+ onUpdate=(action "mappedFieldUpdated")
+ options=contentOptions
+ }}
+
+
+{{/if}}
+
+{{#if isTag}}
+
+
+ {{i18n "admin.wizard.field.tag_groups"}}
+
+
+
+ {{tag-group-chooser
+ id=(concat field.id "-tag-groups")
+ tagGroups=field.tag_groups
+ onChange=(action (mut field.tag_groups))
+ }}
+
+
+
+
+
+ {{i18n "admin.wizard.field.can_create_tag"}}
+
+
+
+
+
+
+{{/if}}
+
+{{#wizard-subscription-container}}
+
+
+ {{i18n "admin.wizard.condition"}}
+
+
+
+ {{wizard-mapper inputs=field.condition options=fieldConditionOptions}}
+
+
+
+
+
+ {{i18n "admin.wizard.index"}}
+
+
+
+ {{wizard-mapper inputs=field.index options=fieldIndexOptions}}
+
+
+
+ {{#if isCategory}}
+
+
+ {{i18n "admin.wizard.field.property"}}
+
+
+
+ {{combo-box
+ value=field.property
+ content=categoryPropertyTypes
+ onChange=(action (mut field.property))
+ options=(hash none="admin.wizard.selector.placeholder.property")
+ }}
+
+
+ {{/if}}
+
+ {{#if validations}}
+ {{wizard-realtime-validations field=field validations=validations}}
+ {{/if}}
+{{/wizard-subscription-container}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-custom-step.hbs b/assets/javascripts/discourse/templates/components/wizard-custom-step.hbs
index ad4623c2..e6d4d5a7 100644
--- a/assets/javascripts/discourse/templates/components/wizard-custom-step.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-custom-step.hbs
@@ -1,134 +1,120 @@
-
-
- {{i18n "admin.wizard.step.title"}}
-
-
- {{input
- name="title"
- value=step.title}}
-
-
-
-
-
- {{i18n "admin.wizard.step.banner"}}
-
-
- {{uppy-image-uploader
- imageUrl=step.banner
- onUploadDone=(action "bannerUploadDone")
- onUploadDeleted=(action "bannerUploadDeleted")
- type="wizard-banner"
- class="no-repeat contain-image"
- id=(concat "wizard-step-" step.id "-banner-upload")}}
-
-
-
-
-
- {{i18n "admin.wizard.step.description"}}
-
-
- {{wizard-text-editor
- value=step.raw_description}}
-
-
-
-{{wizard-advanced-toggle showAdvanced=step.showAdvanced}}
-
-{{#if step.showAdvanced}}
-
-
-
-
- {{i18n "admin.wizard.condition"}}
-
-
-
- {{wizard-mapper
- inputs=step.condition
- options=stepConditionOptions}}
-
-
-
-
-
-
-
{{i18n "admin.wizard.step.force_final.label"}}
- {{input type="checkbox" checked=step.force_final}}
- {{i18n "admin.wizard.step.force_final.description"}}
-
-
-
-
-
- {{i18n "admin.wizard.step.required_data.label"}}
-
-
- {{wizard-mapper
- inputs=step.required_data
- options=(hash
- inputTypes="validation"
- inputConnector="and"
- wizardFieldSelection="value"
- userFieldSelection="value"
- keyPlaceholder="admin.wizard.submission_key"
- context="step"
- )}}
- {{#if step.required_data}}
-
-
- {{i18n "admin.wizard.step.required_data.not_permitted_message"}}
-
- {{input value=step.required_data_message}}
-
- {{/if}}
-
-
-
-
-
- {{i18n "admin.wizard.step.permitted_params.label"}}
-
-
- {{wizard-mapper
- inputs=step.permitted_params
- options=(hash
- pairConnector="set"
- inputTypes="association"
- keyPlaceholder="admin.wizard.param_key"
- valuePlaceholder="admin.wizard.submission_key"
- context="step"
- )}}
-
-
-
-
-
- {{i18n "admin.wizard.translation"}}
-
-
- {{input
- name="key"
- value=step.key
- placeholderKey="admin.wizard.translation_placeholder"}}
-
-
-
-{{/if}}
-
-{{wizard-links
- itemType="field"
- current=currentField
- items=step.fields
- parentId=step.id}}
-
-{{#each step.fields as |field|}}
- {{wizard-custom-field
- field=field
- step=step
- currentFieldId=currentField.id
- fieldTypes=fieldTypes
- removeField="removeField"
- wizardFields=wizardFields}}
-{{/each}}
+
+
+ {{i18n "admin.wizard.step.title"}}
+
+
+
+
+
+
+
+
+ {{i18n "admin.wizard.step.banner"}}
+
+
+ {{uppy-image-uploader
+ imageUrl=step.banner
+ onUploadDone=(action "bannerUploadDone")
+ onUploadDeleted=(action "bannerUploadDeleted")
+ type="wizard-step-banner"
+ class="no-repeat contain-image"
+ id=(concat "wizard-step-" step.id "-banner-upload")
+ }}
+
+
+
+
+
+ {{i18n "admin.wizard.step.description"}}
+
+
+ {{wizard-text-editor value=step.raw_description}}
+
+
+
+{{#wizard-subscription-container}}
+
+
+ {{i18n "admin.wizard.condition"}}
+
+
+
+ {{wizard-mapper inputs=step.condition options=stepConditionOptions}}
+
+
+
+
+
+
+
{{i18n "admin.wizard.step.force_final.label"}}
+
+ {{i18n "admin.wizard.step.force_final.description"}}
+
+
+
+
+
+ {{i18n "admin.wizard.step.required_data.label"}}
+
+
+
+ {{wizard-mapper
+ inputs=step.required_data
+ options=(hash
+ inputTypes="validation"
+ inputConnector="and"
+ wizardFieldSelection="value"
+ userFieldSelection="value"
+ keyPlaceholder="admin.wizard.submission_key"
+ context="step"
+ )
+ }}
+ {{#if step.required_data}}
+
+
+ {{i18n "admin.wizard.step.required_data.not_permitted_message"}}
+
+
+
+ {{/if}}
+
+
+
+
+
+ {{i18n "admin.wizard.step.permitted_params.label"}}
+
+
+ {{wizard-mapper
+ inputs=step.permitted_params
+ options=(hash
+ pairConnector="set"
+ inputTypes="association"
+ keyPlaceholder="admin.wizard.param_key"
+ valuePlaceholder="admin.wizard.submission_key"
+ context="step"
+ )
+ }}
+
+
+{{/wizard-subscription-container}}
+
+{{wizard-links
+ itemType="field"
+ current=currentField
+ items=step.fields
+ parentId=step.id
+}}
+
+{{#each step.fields as |field|}}
+ {{wizard-custom-field
+ field=field
+ step=step
+ wizard=wizard
+ currentFieldId=currentField.id
+ fieldTypes=fieldTypes
+ removeField="removeField"
+ wizardFields=wizardFields
+ subscribed=subscribed
+ }}
+{{/each}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-links.hbs b/assets/javascripts/discourse/templates/components/wizard-links.hbs
index a7a7662e..79fbfcda 100644
--- a/assets/javascripts/discourse/templates/components/wizard-links.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-links.hbs
@@ -4,17 +4,36 @@
{{#if anyLinks}}
{{#each links as |link|}}
- {{d-button action="change" actionParam=link.id translatedLabel=link.label class=link.classes}}
+ {{d-button
+ action=(action "change")
+ actionParam=link.id
+ translatedLabel=link.label
+ class=link.classes
+ }}
{{#unless link.first}}
- {{d-button action="back" actionParam=link icon="arrow-left" class="back"}}
+ {{d-button
+ action=(action "back")
+ actionParam=link
+ icon="arrow-left"
+ class="back"
+ }}
{{/unless}}
{{#unless link.last}}
- {{d-button action="forward" actionParam=link icon="arrow-right" class="forward"}}
+ {{d-button
+ action=(action "forward")
+ actionParam=link
+ icon="arrow-right"
+ class="forward"
+ }}
{{/unless}}
- {{d-button action="remove" actionParam=link.id icon="times" class="remove"}}
+ {{d-button
+ action=(action "remove")
+ actionParam=link.id
+ icon="times"
+ class="remove"
+ }}
{{/each}}
{{/if}}
- {{d-button action="add" label="admin.wizard.add" icon="plus"}}
-
-
+ {{d-button action=(action "add") label="admin.wizard.add" icon="plus"}}
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-mapper-connector.hbs b/assets/javascripts/discourse/templates/components/wizard-mapper-connector.hbs
index 7b610e2b..7476c099 100644
--- a/assets/javascripts/discourse/templates/components/wizard-mapper-connector.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-mapper-connector.hbs
@@ -2,11 +2,12 @@
{{combo-box
value=connector
content=connectors
- onChange=(action "changeConnector")}}
+ onChange=(action "changeConnector")
+ }}
{{else}}
{{#if connector}}
{{connectorLabel}}
{{/if}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-mapper-input.hbs b/assets/javascripts/discourse/templates/components/wizard-mapper-input.hbs
index 410db070..d21a90c0 100644
--- a/assets/javascripts/discourse/templates/components/wizard-mapper-input.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-mapper-input.hbs
@@ -1,22 +1,24 @@
{{wizard-mapper-connector
- connector=input.type
- connectors=inputTypes
+ connector=this.input.type
+ connectors=this.inputTypes
inputTypes=true
- inputType=inputType
+ inputType=this.inputType
connectorType="type"
- options=options
- onUpdate=onUpdate}}
+ options=this.options
+ onUpdate=this.onUpdate
+}}
{{#if hasPairs}}
- {{#each input.pairs as |pair|}}
+ {{#each this.input.pairs as |pair|}}
{{wizard-mapper-pair
pair=pair
last=pair.last
- inputType=inputType
- options=options
+ inputType=this.inputType
+ options=this.options
removePair=(action "removePair")
- onUpdate=onUpdate}}
+ onUpdate=this.onUpdate
+ }}
{{/each}}
{{#if canAddPair}}
@@ -30,25 +32,27 @@
{{#if hasOutput}}
{{#if hasPairs}}
{{wizard-mapper-connector
- connector=input.output_connector
- connectors=connectors
+ connector=this.input.output_connector
+ connectors=this.connectors
connectorType="output"
- inputType=inputType
- options=options
- onUpdate=onUpdate}}
+ inputType=this.inputType
+ options=this.options
+ onUpdate=this.onUpdate
+ }}
{{/if}}
{{wizard-mapper-selector
selectorType="output"
- inputType=input.type
- value=input.output
- activeType=input.output_type
- options=options
- onUpdate=onUpdate}}
+ inputType=this.input.type
+ value=this.input.output
+ activeType=this.input.output_type
+ options=this.options
+ onUpdate=this.onUpdate
+ }}
{{/if}}
-
+
{{d-icon "times"}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-mapper-pair.hbs b/assets/javascripts/discourse/templates/components/wizard-mapper-pair.hbs
index c4c15907..33e9ffa1 100644
--- a/assets/javascripts/discourse/templates/components/wizard-mapper-pair.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-mapper-pair.hbs
@@ -5,7 +5,8 @@
value=pair.key
activeType=pair.key_type
options=options
- onUpdate=onUpdate}}
+ onUpdate=onUpdate
+ }}
{{wizard-mapper-connector
@@ -14,7 +15,8 @@
connectorType="pair"
inputType=inputType
options=options
- onUpdate=onUpdate}}
+ onUpdate=onUpdate
+}}
{{wizard-mapper-selector
@@ -24,7 +26,8 @@
activeType=pair.value_type
options=options
onUpdate=onUpdate
- connector=pair.connector}}
+ connector=pair.connector
+ }}
{{#if showJoin}}
@@ -32,5 +35,7 @@
{{/if}}
{{#if showRemove}}
- {{d-icon "times"}}
-{{/if}}
+ {{d-icon
+ "times"
+ }}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-mapper-selector-type.hbs b/assets/javascripts/discourse/templates/components/wizard-mapper-selector-type.hbs
index 32c4c26e..2ef7f2a3 100644
--- a/assets/javascripts/discourse/templates/components/wizard-mapper-selector-type.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-mapper-selector-type.hbs
@@ -1 +1 @@
-{{item.label}}
+{{item.label}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-mapper-selector.hbs b/assets/javascripts/discourse/templates/components/wizard-mapper-selector.hbs
index 60f4c0cf..80669aa4 100644
--- a/assets/javascripts/discourse/templates/components/wizard-mapper-selector.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-mapper-selector.hbs
@@ -10,7 +10,8 @@
{{wizard-mapper-selector-type
activeType=activeType
item=item
- toggle=(action "toggleType")}}
+ toggle=(action "toggleType")
+ }}
{{/each}}
{{/if}}
@@ -21,11 +22,12 @@
{{#if showText}}
- {{input
- type="text"
- value=value
- placeholder=(i18n placeholderKey)
- change=(action "changeInputValue")}}
+
{{/if}}
{{#if showComboBox}}
@@ -33,10 +35,8 @@
value=value
content=comboBoxContent
onChange=(action "changeValue")
- options=(hash
- none=placeholderKey
- allowAny=comboBoxAllowAny
- )}}
+ options=(hash none=placeholderKey allowAny=comboBoxAllowAny)
+ }}
{{/if}}
{{#if showMultiSelect}}
@@ -44,14 +44,16 @@
content=multiSelectContent
value=value
onChange=(action "changeValue")
- options=multiSelectOptions}}
+ options=multiSelectOptions
+ }}
{{/if}}
{{#if showList}}
{{wizard-value-list
values=value
addKey=placeholderKey
- onChange=(action "changeValue")}}
+ onChange=(action "changeValue")
+ }}
{{/if}}
{{#if showTag}}
@@ -59,18 +61,17 @@
tags=value
onChange=(action "changeValue")
everyTag=true
- options=(hash
- none=placeholderKey
- filterable=true
- )}}
+ options=(hash none=placeholderKey filterable=true)
+ }}
{{/if}}
{{#if showUser}}
- {{user-selector
- includeMessageableGroups="true"
+ {{email-group-user-chooser
placeholderKey=placeholderKey
- usernames=value
+ value=value
autocomplete="discourse"
- onChangeCallback=(action "changeUserValue")}}
+ onChange=(action "changeUserValue")
+ options=(hash includeMessageableGroups="true")
+ }}
{{/if}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-mapper.hbs b/assets/javascripts/discourse/templates/components/wizard-mapper.hbs
index 2de35e0d..e58b48e6 100644
--- a/assets/javascripts/discourse/templates/components/wizard-mapper.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-mapper.hbs
@@ -3,18 +3,20 @@
{{wizard-mapper-connector
connector=input.connector
connectorType="input"
- onUpdate=(action "inputUpdated")}}
+ onUpdate=(action "inputUpdated")
+ }}
{{/if}}
{{wizard-mapper-input
input=input
options=inputOptions
remove=(action "remove")
- onUpdate=(action "inputUpdated")}}
+ onUpdate=(action "inputUpdated")
+ }}
{{/each}}
{{#if canAdd}}
- {{d-button action="add" label="admin.wizard.add" icon="plus"}}
+ {{d-button action=(action "add") label="admin.wizard.add" icon="plus"}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-message.hbs b/assets/javascripts/discourse/templates/components/wizard-message.hbs
index 380fc5b3..4c48002a 100644
--- a/assets/javascripts/discourse/templates/components/wizard-message.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-message.hbs
@@ -23,4 +23,4 @@
{{documentation}}
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-realtime-validations.hbs b/assets/javascripts/discourse/templates/components/wizard-realtime-validations.hbs
index cd1298a9..04f2b1c4 100644
--- a/assets/javascripts/discourse/templates/components/wizard-realtime-validations.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-realtime-validations.hbs
@@ -1,50 +1,73 @@
-{{i18n "admin.wizard.field.validations.header"}}
-
-
- {{#each-in field.validations as |type props|}}
-
-
- {{i18n (concat "admin.wizard.field.validations." type)}}
- {{input type="checkbox" checked=props.status}}
- {{i18n "admin.wizard.field.validations.enabled"}}
-
-
-
-
- {{i18n "admin.wizard.field.validations.categories"}}
-
-
- {{category-selector
- categories=(get this (concat "validationBuffer." type ".categories"))
+
+ {{i18n "admin.wizard.field.validations.header"}}
+
+
+
+ {{#each-in field.validations as |type props|}}
+
+
+ {{i18n (concat "admin.wizard.field.validations." type)}}
+
+ {{i18n "admin.wizard.field.validations.enabled"}}
+
+
+
+
+ {{i18n
+ "admin.wizard.field.validations.categories"
+ }}
+
+
+ {{category-selector
+ categories=(get
+ this (concat "validationBuffer." type ".categories")
+ )
onChange=(action "updateValidationCategories" type props)
- class="wizard"}}
+ class="wizard"
+ }}
+
-
-
-
- {{i18n "admin.wizard.field.validations.max_topic_age"}}
-
-
- {{input type="number" class="time-n-value" value=props.time_n_value}}
- {{combo-box
+
+
+ {{i18n
+ "admin.wizard.field.validations.max_topic_age"
+ }}
+
+
+
+ {{combo-box
value=(readonly props.time_unit)
content=timeUnits
class="time-unit-selector"
- onChange=(action (mut props.time_unit))}}
+ onChange=(action (mut props.time_unit))
+ }}
+
+
+
+
+ {{i18n "admin.wizard.field.validations.position"}}
+
+
+ {{radio-button
+ name=(concat type field.id)
+ value="above"
+ selection=props.position
+ }}
+ {{i18n "admin.wizard.field.validations.above"}}
+ {{radio-button
+ name=(concat type field.id)
+ value="below"
+ selection=props.position
+ }}
+ {{i18n "admin.wizard.field.validations.below"}}
+
-
-
- {{i18n "admin.wizard.field.validations.position"}}
-
-
- {{radio-button name=(concat type field.id) value="above" selection=props.position}}
- {{i18n "admin.wizard.field.validations.above"}}
- {{radio-button name=(concat type field.id) value="below" selection=props.position}}
- {{i18n "admin.wizard.field.validations.below"}}
-
-
-
-
- {{/each-in}}
-
+
+ {{/each-in}}
+
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-subscription-selector/wizard-subscription-selector-header.hbs b/assets/javascripts/discourse/templates/components/wizard-subscription-selector/wizard-subscription-selector-header.hbs
new file mode 100644
index 00000000..7d18bdd6
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/wizard-subscription-selector/wizard-subscription-selector-header.hbs
@@ -0,0 +1,16 @@
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-subscription-selector/wizard-subscription-selector-row.hbs b/assets/javascripts/discourse/templates/components/wizard-subscription-selector/wizard-subscription-selector-row.hbs
new file mode 100644
index 00000000..7d62bb8e
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/wizard-subscription-selector/wizard-subscription-selector-row.hbs
@@ -0,0 +1,15 @@
+{{#if icons}}
+
+
+ {{#each icons as |icon|}}
+ {{d-icon icon translatedtitle=(dasherize title)}}
+ {{/each}}
+
+{{/if}}
+
+
+ {{html-safe label}}
+ {{#if item.subscriptionRequired}}
+ {{i18n item.selectorLabel}}
+ {{/if}}
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-table-field.hbs b/assets/javascripts/discourse/templates/components/wizard-table-field.hbs
new file mode 100644
index 00000000..1262809d
--- /dev/null
+++ b/assets/javascripts/discourse/templates/components/wizard-table-field.hbs
@@ -0,0 +1,170 @@
+{{#if hasValue}}
+ {{#if isText}}
+ {{value.value}}
+ {{/if}}
+
+ {{#if isLongtext}}
+
+
+ {{value.value}}
+
+
+ {{toggleText}}
+
+
+ {{/if}}
+
+ {{#if isComposer}}
+
+
+ {{value.value}}
+
+
+ {{toggleText}}
+
+
+ {{/if}}
+
+ {{#if isComposerPreview}}
+ {{d-icon "comment-alt"}}
+
+ {{i18n "admin.wizard.submissions.composer_preview"}}:
+ {{value.value}}
+
+ {{/if}}
+
+ {{#if isTextOnly}}
+ {{value.value}}
+ {{/if}}
+
+ {{#if isDate}}
+
+ {{d-icon "calendar"}}{{value.value}}
+
+ {{/if}}
+
+ {{#if isTime}}
+
+ {{d-icon "clock"}}{{value.value}}
+
+ {{/if}}
+
+ {{#if isDateTime}}
+
+ {{d-icon "calendar"}}{{format-date value.value format="medium"}}
+
+ {{/if}}
+
+ {{#if isNumber}}
+ {{value.value}}
+ {{/if}}
+
+ {{#if isCheckbox}}
+ {{#if checkboxValue}}
+
+ {{d-icon "check"}}{{value.value}}
+
+ {{else}}
+
+ {{d-icon "times"}}{{value.value}}
+
+ {{/if}}
+ {{/if}}
+
+ {{#if isUrl}}
+
+ {{d-icon "link"}}
+
+ {{value.value}}
+
+
+ {{/if}}
+
+ {{#if isUpload}}
+
+ {{file.original_filename}}
+
+ {{/if}}
+
+ {{#if isDropdown}}
+
+ {{d-icon "check-square"}}
+ {{value.value}}
+
+ {{/if}}
+
+ {{#if isTag}}
+ {{#each value.value as |tag|}}
+ {{discourse-tag tag}}
+ {{/each}}
+ {{/if}}
+
+ {{#if isCategory}}
+
+ {{i18n "admin.wizard.submissions.category_id"}}:
+
+
+ {{value.value}}
+
+ {{/if}}
+
+ {{#if isGroup}}
+
+ {{i18n "admin.wizard.submissions.group_id"}}:
+
+ {{value.value}}
+ {{/if}}
+
+ {{#if isUserSelector}}
+ {{#each submittedUsers as |user|}}
+ {{d-icon "user"}}
+
+ {{user.username}}
+
+ {{/each}}
+ {{/if}}
+
+ {{#if isUser}}
+ {{#link-to "user" value.username}}
+ {{avatar value imageSize="tiny"}}
+ {{/link-to}}
+ {{/if}}
+
+ {{#if showUsername}}
+
+ {{username}}
+
+ {{/if}}
+
+ {{#if isSubmittedAt}}
+
+ {{raw-date value}}
+
+ {{/if}}
+{{else}}
+ —
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/components/wizard-text-editor.hbs b/assets/javascripts/discourse/templates/components/wizard-text-editor.hbs
index c657049d..2f13ebe1 100644
--- a/assets/javascripts/discourse/templates/components/wizard-text-editor.hbs
+++ b/assets/javascripts/discourse/templates/components/wizard-text-editor.hbs
@@ -1,19 +1,12 @@
-{{d-editor
- value=value
- forcePreview=forcePreview
- placeholder=placeholder}}
+{{d-editor value=value forcePreview=forcePreview placeholder=placeholder}}
{{#if previewEnabled}}
- {{d-button
- action="togglePreview"
- translatedLabel=previewLabel}}
+ {{d-button action=(action "togglePreview") translatedLabel=previewLabel}}
{{/if}}
{{#if fieldsEnabled}}
- {{d-button
- action="togglePopover"
- translatedLabel=popoverLabel}}
+ {{d-button action=(action "togglePopover") translatedLabel=popoverLabel}}
{{#if showPopover}}
@@ -38,4 +31,4 @@
{{/if}}
{{/if}}
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/custom-wizard-index.hbs b/assets/javascripts/discourse/templates/custom-wizard-index.hbs
new file mode 100644
index 00000000..c03a5219
--- /dev/null
+++ b/assets/javascripts/discourse/templates/custom-wizard-index.hbs
@@ -0,0 +1,7 @@
+{{#if noAccess}}
+ {{custom-wizard-no-access
+ text=(i18n noAccessI18nKey)
+ wizardId=wizardId
+ reason=noAccessReason
+ }}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/step.hbs b/assets/javascripts/discourse/templates/custom-wizard-step.hbs
similarity index 54%
rename from assets/javascripts/wizard/templates/step.hbs
rename to assets/javascripts/discourse/templates/custom-wizard-step.hbs
index 5ed14cdf..135fb825 100644
--- a/assets/javascripts/wizard/templates/step.hbs
+++ b/assets/javascripts/discourse/templates/custom-wizard-step.hbs
@@ -5,15 +5,17 @@
{{#if showReset}}
- {{wizard-i18n "wizard.reset"}}
+ {{i18n "wizard.reset"}}
{{/if}}
{{/if}}
{{#if step.permitted}}
- {{wizard-step step=step
- wizard=wizard
- goNext=(action "goNext")
- goBack=(action "goBack")
- showMessage=(action "showMessage")}}
-{{/if}}
+ {{custom-wizard-step
+ step=step
+ wizard=wizard
+ goNext=(action "goNext")
+ goBack=(action "goBack")
+ showMessage=(action "showMessage")
+ }}
+{{/if}}
\ No newline at end of file
diff --git a/assets/javascripts/wizard/templates/wizard.hbs b/assets/javascripts/discourse/templates/custom-wizard.hbs
similarity index 64%
rename from assets/javascripts/wizard/templates/wizard.hbs
rename to assets/javascripts/discourse/templates/custom-wizard.hbs
index f6d6127e..c428dbc3 100644
--- a/assets/javascripts/wizard/templates/wizard.hbs
+++ b/assets/javascripts/discourse/templates/custom-wizard.hbs
@@ -4,9 +4,12 @@
-
+
\ No newline at end of file
diff --git a/assets/javascripts/discourse/templates/modal/next-session-scheduled.hbs b/assets/javascripts/discourse/templates/modal/next-session-scheduled.hbs
deleted file mode 100644
index 1b138360..00000000
--- a/assets/javascripts/discourse/templates/modal/next-session-scheduled.hbs
+++ /dev/null
@@ -1,16 +0,0 @@
-{{#d-modal-body class="next-session-time-modal" title=title}}
- {{date-time-input
- date=bufferedDateTime
- onChange=(action "dateTimeChanged")
- showTime=true
- clearable=true
- }}
-{{/d-modal-body}}
-
-
diff --git a/assets/javascripts/wizard-custom-guest.js b/assets/javascripts/wizard-custom-guest.js
deleted file mode 100644
index 4493cf01..00000000
--- a/assets/javascripts/wizard-custom-guest.js
+++ /dev/null
@@ -1,4 +0,0 @@
-(function () {
- document.cookie = "destination_url=" + window.location.href + ";path=/";
- window.location.href = "/login";
-})();
diff --git a/assets/javascripts/wizard-custom-start.js b/assets/javascripts/wizard-custom-start.js
deleted file mode 100644
index b92d2871..00000000
--- a/assets/javascripts/wizard-custom-start.js
+++ /dev/null
@@ -1,4 +0,0 @@
-(function () {
- let wizard = require("discourse/plugins/discourse-custom-wizard/wizard/application").default.create();
- wizard.start();
-})();
diff --git a/assets/javascripts/wizard-custom.js b/assets/javascripts/wizard-custom.js
deleted file mode 100644
index 667d23fd..00000000
--- a/assets/javascripts/wizard-custom.js
+++ /dev/null
@@ -1,81 +0,0 @@
-//= require_tree_discourse truth-helpers/addon
-//= require_tree_discourse discourse-common/addon
-//= require_tree_discourse select-kit/addon
-//= require_tree_discourse wizard/lib
-//= require_tree_discourse wizard/mixins
-//= require_tree_discourse discourse/app/lib
-//= require_tree_discourse discourse/app/mixins
-
-//= require discourse/app/adapters/rest
-//= require message-bus
-//= require_tree_discourse discourse/app/models
-
-//= require discourse/app/helpers/category-link
-//= require discourse/app/helpers/user-avatar
-//= require discourse/app/helpers/format-username
-//= require discourse/app/helpers/share-url
-//= require discourse/app/helpers/decorate-username-selector
-//= require discourse/app/helpers/discourse-tag
-
-//= require discourse/app/services/app-events
-//= require discourse/app/services/emoji-store
-//= require discourse/app/services/store
-
-//= require discourse/app/components/user-selector
-//= require discourse/app/components/conditional-loading-spinner
-//= require discourse/app/components/d-button
-//= require discourse/app/components/composer-editor
-//= require discourse/app/components/d-editor
-//= require discourse/app/components/input-tip
-//= require discourse/app/components/emoji-picker
-//= require discourse/app/components/input-tip
-//= require discourse/app/components/date-picker
-//= require discourse/app/components/time-input
-//= require discourse/app/components/date-input
-//= require discourse/app/components/date-time-input
-//= require discourse/app/components/text-field
-//= require discourse/app/components/d-textarea
-//= require discourse/app/components/popup-input-tip
-
-//= require discourse/app/templates/components/conditional-loading-spinner
-//= require discourse/app/templates/components/d-button
-//= require discourse/app/templates/components/d-editor
-//= require discourse/app/templates/components/date-picker
-//= require discourse/app/templates/components/date-input
-//= require discourse/app/templates/components/time-input
-//= require discourse/app/templates/components/date-time-input
-//= require discourse/app/templates/components/emoji-picker
-//= require discourse/app/templates/components/popup-input-tip
-//= require discourse/app/templates/category-tag-autocomplete
-//= require discourse/app/templates/emoji-selector-autocomplete
-//= require discourse/app/templates/user-selector-autocomplete
-
-//= require discourse/app/initializers/jquery-plugins
-//= require discourse/app/pre-initializers/sniff-capabilities
-
-//= require pretty-text-bundle
-
-//= require ember-addons/decorator-alias
-//= require ember-addons/macro-alias
-//= require ember-addons/fmt
-//= require polyfills
-
-//= require markdown-it-bundle
-//= require template_include.js
-//= require itsatrap.js
-//= require caret_position.js
-//= require popper.js
-//= require uppy.js
-//= require bootstrap-modal.js
-//= require bootbox.js
-//= require discourse-shims
-
-//= require ./wizard/application
-//= require ./wizard/router
-//= require_tree ./wizard/components
-//= require_tree ./wizard/controllers
-//= require_tree ./wizard/helpers
-//= require_tree ./wizard/lib
-//= require_tree ./wizard/models
-//= require_tree ./wizard/routes
-//= require_tree ./wizard/templates
diff --git a/assets/javascripts/wizard-plugin.js.erb b/assets/javascripts/wizard-plugin.js.erb
deleted file mode 100644
index 86b8c81e..00000000
--- a/assets/javascripts/wizard-plugin.js.erb
+++ /dev/null
@@ -1,19 +0,0 @@
-// loads files for plugins that have been added via CustomWizard::Field
-<%
-Discourse.unofficial_plugins.each do |plugin|
- plugin_name = plugin.metadata.name
- if require_plugin_assets = CustomWizard::Field.require_assets[plugin_name]
- plugin.each_globbed_asset do |path, is_dir|
- next if path.include? "raw.hbs"
-
- if require_plugin_assets.any? { |dir| path.include?(dir) }
- if is_dir
- depend_on(path)
- else
- require_asset(path)
- end
- end
- end
- end
-end
-%>
diff --git a/assets/javascripts/wizard-qunit.js b/assets/javascripts/wizard-qunit.js
deleted file mode 100644
index 8aaf23ab..00000000
--- a/assets/javascripts/wizard-qunit.js
+++ /dev/null
@@ -1,17 +0,0 @@
-//= require env
-//= require jquery.debug
-//= require ember.debug
-//= require route-recognizer
-//= require fake_xml_http_request
-//= require pretender
-//= require qunit
-//= require ember-qunit
-//= require test-shims
-//= require ember-template-compiler
-
-//= require_tree ./wizard/tests/fixtures
-//= require ./wizard/tests/pretender
-//= require_tree ./wizard/tests/helpers
-//= require_tree ./wizard/tests/acceptance
-
-//= require ./wizard/tests/bootstrap
diff --git a/assets/javascripts/wizard-raw-templates.js.erb b/assets/javascripts/wizard-raw-templates.js.erb
deleted file mode 100644
index fb4c2dda..00000000
--- a/assets/javascripts/wizard-raw-templates.js.erb
+++ /dev/null
@@ -1,36 +0,0 @@
-<%=
-result = ''
-Discourse.unofficial_plugins.each do |plugin|
- plugin_name = plugin.metadata.name
-
- if plugin_name == 'discourse-custom-wizard' || CustomWizard::Field.require_assets[plugin_name]
-
- files = []
-
- plugin.each_globbed_asset do |f, is_dir|
- files.push(f) if f.include? "hbr"
- end
-
- Dir.glob("#{Rails.root}/app/assets/javascripts/discourse/app/templates/*.hbr").each do |f|
- files.push(f)
- end
-
- files.each do |f|
- name = File.basename(f, ".hbr")
- compiled = Barber::Precompiler.new().compile(File.read(f))
- result << "
- (function() {
- requirejs('discourse-common/lib/raw-templates').addRawTemplate(#{compiled});
- })();
- "
- end
-
- result << "
- (function() {
- window.__DISCOURSE_RAW_TEMPLATES = requirejs('discourse-common/lib/raw-templates').__DISCOURSE_RAW_TEMPLATES;
- })();
- "
- end
-end
-result
-%>
diff --git a/assets/javascripts/wizard/application.js.es6 b/assets/javascripts/wizard/application.js.es6
deleted file mode 100644
index 012949b3..00000000
--- a/assets/javascripts/wizard/application.js.es6
+++ /dev/null
@@ -1,19 +0,0 @@
-import { buildResolver } from "discourse-common/resolver";
-import Application from "@ember/application";
-import WizardInitializer from "./lib/initialize/wizard";
-import { isTesting } from "discourse-common/config/environment";
-
-export default Application.extend({
- rootElement: "#custom-wizard-main",
- Resolver: buildResolver("discourse/plugins/discourse-custom-wizard/wizard"),
-
- customEvents: {
- paste: "paste",
- },
-
- start() {
- if (!isTesting()) {
- this.initializer(WizardInitializer);
- }
- },
-});
diff --git a/assets/javascripts/wizard/components/wizard-composer-hyperlink.js.es6 b/assets/javascripts/wizard/components/wizard-composer-hyperlink.js.es6
deleted file mode 100644
index 0eeeb176..00000000
--- a/assets/javascripts/wizard/components/wizard-composer-hyperlink.js.es6
+++ /dev/null
@@ -1,16 +0,0 @@
-import Component from "@ember/component";
-
-export default Component.extend({
- classNames: ["wizard-composer-hyperlink"],
- layoutName: "wizard/templates/components/wizard-composer-hyperlink",
-
- actions: {
- addLink() {
- this.addLink(this.linkName, this.linkUrl);
- },
-
- hideBox() {
- this.hideBox();
- },
- },
-});
diff --git a/assets/javascripts/wizard/components/wizard-field-checkbox.js.es6 b/assets/javascripts/wizard/components/wizard-field-checkbox.js.es6
deleted file mode 100644
index 6f9daba2..00000000
--- a/assets/javascripts/wizard/components/wizard-field-checkbox.js.es6
+++ /dev/null
@@ -1,5 +0,0 @@
-import Component from "@ember/component";
-
-export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-checkbox",
-});
diff --git a/assets/javascripts/wizard/components/wizard-field-group.js.es6 b/assets/javascripts/wizard/components/wizard-field-group.js.es6
deleted file mode 100644
index 65a19719..00000000
--- a/assets/javascripts/wizard/components/wizard-field-group.js.es6
+++ /dev/null
@@ -1,5 +0,0 @@
-import Component from "@ember/component";
-
-export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-group",
-});
diff --git a/assets/javascripts/wizard/components/wizard-field-number.js.es6 b/assets/javascripts/wizard/components/wizard-field-number.js.es6
deleted file mode 100644
index 14e1bfcd..00000000
--- a/assets/javascripts/wizard/components/wizard-field-number.js.es6
+++ /dev/null
@@ -1,5 +0,0 @@
-import Component from "@ember/component";
-
-export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-number",
-});
diff --git a/assets/javascripts/wizard/components/wizard-field-url.js.es6 b/assets/javascripts/wizard/components/wizard-field-url.js.es6
deleted file mode 100644
index 96c10cc2..00000000
--- a/assets/javascripts/wizard/components/wizard-field-url.js.es6
+++ /dev/null
@@ -1,5 +0,0 @@
-import Component from "@ember/component";
-
-export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-url",
-});
diff --git a/assets/javascripts/wizard/components/wizard-field-user-selector.js.es6 b/assets/javascripts/wizard/components/wizard-field-user-selector.js.es6
deleted file mode 100644
index 7cf5b446..00000000
--- a/assets/javascripts/wizard/components/wizard-field-user-selector.js.es6
+++ /dev/null
@@ -1,5 +0,0 @@
-import Component from "@ember/component";
-
-export default Component.extend({
- layoutName: "wizard/templates/components/wizard-field-user-selector",
-});
diff --git a/assets/javascripts/wizard/components/wizard-time-input.js.es6 b/assets/javascripts/wizard/components/wizard-time-input.js.es6
deleted file mode 100644
index 14b08288..00000000
--- a/assets/javascripts/wizard/components/wizard-time-input.js.es6
+++ /dev/null
@@ -1,5 +0,0 @@
-import TimeInput from "discourse/components/time-input";
-
-export default TimeInput.extend({
- layoutName: "wizard/templates/components/wizard-time-input",
-});
diff --git a/assets/javascripts/wizard/helpers/date-node.js.es6 b/assets/javascripts/wizard/helpers/date-node.js.es6
deleted file mode 100644
index b7d19d0f..00000000
--- a/assets/javascripts/wizard/helpers/date-node.js.es6
+++ /dev/null
@@ -1,23 +0,0 @@
-import { registerUnbound } from "discourse-common/lib/helpers";
-import { longDate, relativeAge } from "discourse/lib/formatter";
-import Handlebars from "handlebars";
-
-export default registerUnbound("date-node", function (dt) {
- if (typeof dt === "string") {
- dt = new Date(dt);
- }
- if (dt) {
- const attributes = {
- title: longDate(dt),
- "data-time": dt.getTime(),
- "data-format": "tiny",
- };
-
- const finalString = `${relativeAge(dt)} `;
- return new Handlebars.SafeString(finalString);
- }
-});
diff --git a/assets/javascripts/wizard/helpers/dir-span.js.es6 b/assets/javascripts/wizard/helpers/dir-span.js.es6
deleted file mode 100644
index 45720796..00000000
--- a/assets/javascripts/wizard/helpers/dir-span.js.es6
+++ /dev/null
@@ -1,6 +0,0 @@
-import { registerUnbound } from "discourse-common/lib/helpers";
-import Handlebars from "handlebars";
-
-export default registerUnbound("dir-span", function (str) {
- return new Handlebars.SafeString(str);
-});
diff --git a/assets/javascripts/wizard/helpers/loading-spinner.es6 b/assets/javascripts/wizard/helpers/loading-spinner.es6
deleted file mode 100644
index 5f15403d..00000000
--- a/assets/javascripts/wizard/helpers/loading-spinner.es6
+++ /dev/null
@@ -1,17 +0,0 @@
-import { htmlHelper } from "discourse-common/lib/helpers";
-
-function renderSpinner(cssClass) {
- var html = "
";
-}
-var spinnerHTML = renderSpinner();
-
-export default htmlHelper((params) => {
- const hash = params.hash;
- return renderSpinner(hash && hash.size ? hash.size : undefined);
-});
-
-export { spinnerHTML, renderSpinner };
diff --git a/assets/javascripts/wizard/helpers/plugin-outlet.js.es6 b/assets/javascripts/wizard/helpers/plugin-outlet.js.es6
deleted file mode 100644
index e6ff81a6..00000000
--- a/assets/javascripts/wizard/helpers/plugin-outlet.js.es6
+++ /dev/null
@@ -1,6 +0,0 @@
-import { registerUnbound } from "discourse-common/lib/helpers";
-import Handlebars from "handlebars";
-
-export default registerUnbound("plugin-outlet", function () {
- return new Handlebars.SafeString("");
-});
diff --git a/assets/javascripts/wizard/helpers/wizard-i18n.js.es6 b/assets/javascripts/wizard/helpers/wizard-i18n.js.es6
deleted file mode 100644
index 30cfb8a4..00000000
--- a/assets/javascripts/wizard/helpers/wizard-i18n.js.es6
+++ /dev/null
@@ -1,6 +0,0 @@
-import { registerUnbound } from "discourse-common/lib/helpers";
-import WizardI18n from "../lib/wizard-i18n";
-
-export default registerUnbound("wizard-i18n", (key, params) => {
- return WizardI18n(key, params);
-});
diff --git a/assets/javascripts/wizard/lib/initialize/create-contexts.js.es6 b/assets/javascripts/wizard/lib/initialize/create-contexts.js.es6
deleted file mode 100644
index 0e637f6c..00000000
--- a/assets/javascripts/wizard/lib/initialize/create-contexts.js.es6
+++ /dev/null
@@ -1,12 +0,0 @@
-export default {
- run(app, container) {
- const { createHelperContext } = requirejs("discourse-common/lib/helpers");
-
- createHelperContext({
- siteSettings: container.lookup("site-settings:main"),
- site: container.lookup("site:main"),
- session: container.lookup("session:main"),
- capabilities: container.lookup("capabilities:main"),
- });
- },
-};
diff --git a/assets/javascripts/wizard/lib/initialize/inject-objects.js.es6 b/assets/javascripts/wizard/lib/initialize/inject-objects.js.es6
deleted file mode 100644
index 51dff7e1..00000000
--- a/assets/javascripts/wizard/lib/initialize/inject-objects.js.es6
+++ /dev/null
@@ -1,58 +0,0 @@
-export default {
- run(app) {
- // siteSettings must always be registered first
- if (!app.hasRegistration("site-settings:main")) {
- const siteSettings = app.SiteSettings;
- app.register("site-settings:main", siteSettings, { instantiate: false });
- }
-
- const Store = requirejs("discourse/services/store").default;
- const Site = requirejs(
- "discourse/plugins/discourse-custom-wizard/wizard/models/site"
- ).default;
- const Session = requirejs("discourse/models/session").default;
- const RestAdapter = requirejs("discourse/adapters/rest").default;
- const messageBus = requirejs("message-bus-client").default;
- const sniffCapabilites = requirejs(
- "discourse/pre-initializers/sniff-capabilities"
- ).default;
-
- const site = Site.current();
- const session = Session.current();
- const registrations = [
- ["message-bus:main", messageBus, false],
- ["site:main", site, false],
- ["session:main", session, false],
- ["service:store", Store, true],
- ["adapter:rest", RestAdapter, true],
- ];
-
- registrations.forEach((registration) => {
- if (!app.hasRegistration(registration[0])) {
- app.register(registration[0], registration[1], {
- instantiate: registration[2],
- });
- }
- });
-
- const targets = ["controller", "component", "route", "model", "adapter"];
-
- targets.forEach((t) => {
- app.inject(t, "appEvents", "service:app-events");
- app.inject(t, "store", "service:store");
- app.inject(t, "site", "site:main");
- });
-
- targets.concat("service").forEach((t) => {
- app.inject(t, "session", "session:main");
- app.inject(t, "messageBus", "message-bus:main");
- app.inject(t, "siteSettings", "site-settings:main");
- });
-
- if (!app.hasRegistration("capabilities:main")) {
- sniffCapabilites.initialize(null, app);
- }
-
- site.set("can_create_tag", false);
- },
-};
diff --git a/assets/javascripts/wizard/lib/initialize/patch-components.js.es6 b/assets/javascripts/wizard/lib/initialize/patch-components.js.es6
deleted file mode 100644
index 9d13160e..00000000
--- a/assets/javascripts/wizard/lib/initialize/patch-components.js.es6
+++ /dev/null
@@ -1,162 +0,0 @@
-export default {
- run(app, container) {
- const getToken = requirejs("wizard/lib/ajax").getToken;
- const isTesting = requirejs("discourse-common/config/environment")
- .isTesting;
-
- if (!isTesting()) {
- // Add a CSRF token to all AJAX requests
- let token = getToken();
- const session = container.lookup("session:main");
- session.set("csrfToken", token);
- let callbacks = $.Callbacks();
- $.ajaxPrefilter(callbacks.fire);
-
- callbacks.add(function (options, originalOptions, xhr) {
- if (!options.crossDomain) {
- xhr.setRequestHeader("X-CSRF-Token", session.get("csrfToken"));
- }
- });
- }
-
- const DEditor = requirejs("discourse/components/d-editor").default;
- const { clipboardHelpers } = requirejs("discourse/lib/utilities");
- const toMarkdown = requirejs("discourse/lib/to-markdown").default;
- const discourseComputed = requirejs("discourse-common/utils/decorators")
- .default;
- const WizardI18n = requirejs(
- "discourse/plugins/discourse-custom-wizard/wizard/lib/wizard-i18n"
- ).default;
- const isInside = (text, regex) => {
- const matches = text.match(regex);
- return matches && matches.length % 2;
- };
-
- DEditor.reopen({
- isComposer: true,
-
- didInsertElement() {
- this._super();
- if (this.wizardComposerEvents) {
- this.appEvents.on(
- "wizard-editor:insert-text",
- this,
- "_wizardInsertText"
- );
- this.appEvents.on(
- "wizard-editor:replace-text",
- this,
- "_wizardReplaceText"
- );
- }
- },
-
- @discourseComputed("placeholder", "placeholderOverride")
- placeholderTranslated(placeholder, placeholderOverride) {
- if (placeholderOverride) {
- return placeholderOverride;
- }
- if (placeholder) {
- return WizardI18n(placeholder);
- }
- return null;
- },
-
- _wizardInsertText(args = {}) {
- if (args.fieldId === this.fieldId) {
- this.insertText(args.text, args.options);
- }
- },
-
- _wizardReplaceText(args = {}) {
- if (args.fieldId === this.fieldId) {
- this.replaceText(args.oldVal, args.newVal, (args.opts = {}));
- }
- },
-
- paste(e) {
- if (!$(".d-editor-input").is(":focus")) {
- return;
- }
-
- const isComposer = this.isComposer;
- let { clipboard, canPasteHtml, canUpload } = clipboardHelpers(e, {
- siteSettings: this.siteSettings,
- canUpload: isComposer,
- });
-
- let plainText = clipboard.getData("text/plain");
- let html = clipboard.getData("text/html");
- let handled = false;
-
- const { pre, lineVal } = this.getSelected(null, { lineVal: true });
- const isInlinePasting = pre.match(/[^\n]$/);
- const isCodeBlock = isInside(pre, /(^|\n)```/g);
-
- if (
- plainText &&
- this.siteSettings.enable_rich_text_paste &&
- !isInlinePasting &&
- !isCodeBlock
- ) {
- plainText = plainText.trim().replace(/\r/g, "");
- const table = this.extractTable(plainText);
- if (table) {
- this.appEvents.trigger("wizard-editor:insert-text", {
- fieldId: this.fieldId,
- text: table,
- });
- handled = true;
- }
- }
-
- if (canPasteHtml && plainText) {
- if (isInlinePasting) {
- canPasteHtml = !(
- lineVal.match(/^```/) ||
- isInside(pre, /`/g) ||
- lineVal.match(/^ /)
- );
- } else {
- canPasteHtml = !isCodeBlock;
- }
- }
-
- if (canPasteHtml && !handled) {
- let markdown = toMarkdown(html);
-
- if (!plainText || plainText.length < markdown.length) {
- if (isInlinePasting) {
- markdown = markdown.replace(/^#+/, "").trim();
- markdown = pre.match(/\S$/) ? ` ${markdown}` : markdown;
- }
-
- this.appEvents.trigger("wizard-editor:insert-text", {
- fieldId: this.fieldId,
- text: markdown,
- });
- handled = true;
- }
- }
-
- if (handled || (canUpload && !plainText)) {
- e.preventDefault();
- }
- },
- });
-
- // IE11 Polyfill - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Polyfill
- if (!Object.entries) {
- Object.entries = function (obj) {
- let ownProps = Object.keys(obj),
- i = ownProps.length,
- resArray = new Array(i); // preallocate the Array
- while (i--) {
- resArray[i] = [ownProps[i], obj[ownProps[i]]];
- }
-
- return resArray;
- };
- }
- },
-};
diff --git a/assets/javascripts/wizard/lib/initialize/register-files.js.es6 b/assets/javascripts/wizard/lib/initialize/register-files.js.es6
deleted file mode 100644
index 85079270..00000000
--- a/assets/javascripts/wizard/lib/initialize/register-files.js.es6
+++ /dev/null
@@ -1,30 +0,0 @@
-export default {
- run(app, container) {
- const RawHandlebars = requirejs("discourse-common/lib/raw-handlebars")
- .default;
- const Handlebars = requirejs("handlebars").default;
- const registerRawHelpers = requirejs(
- "discourse-common/lib/raw-handlebars-helpers"
- ).registerRawHelpers;
- const { registerHelpers } = requirejs("discourse-common/lib/helpers");
- const jqueryPlugins = requirejs("discourse/initializers/jquery-plugins")
- .default;
-
- Object.keys(Ember.TEMPLATES).forEach((k) => {
- if (k.indexOf("select-kit") === 0) {
- let template = Ember.TEMPLATES[k];
- define(k, () => template);
- }
- });
-
- Object.keys(requirejs.entries).forEach((entry) => {
- if (/\/helpers\//.test(entry)) {
- requirejs(entry, null, null, true);
- }
- });
-
- registerRawHelpers(RawHandlebars, Handlebars);
- registerHelpers(app);
- jqueryPlugins.initialize(container, app);
- },
-};
diff --git a/assets/javascripts/wizard/lib/initialize/wizard.js.es6 b/assets/javascripts/wizard/lib/initialize/wizard.js.es6
deleted file mode 100644
index 915e5f26..00000000
--- a/assets/javascripts/wizard/lib/initialize/wizard.js.es6
+++ /dev/null
@@ -1,57 +0,0 @@
-export default {
- name: "custom-wizard",
- initialize(app) {
- const isTesting = requirejs("discourse-common/config/environment")
- .isTesting;
- const isWizard = window.location.pathname.indexOf("/w/") > -1;
-
- if (!isWizard && !isTesting()) {
- return;
- }
-
- const container = app.__container__;
- const setDefaultOwner = requirejs("discourse-common/lib/get-owner")
- .setDefaultOwner;
- setDefaultOwner(container);
-
- if (!isTesting()) {
- const PreloadStore = requirejs("discourse/lib/preload-store").default;
-
- let preloaded;
- const preloadedDataElement = document.getElementById(
- "data-preloaded-wizard"
- );
- if (preloadedDataElement) {
- preloaded = JSON.parse(preloadedDataElement.dataset.preloadedWizard);
- }
-
- Object.keys(preloaded).forEach(function (key) {
- PreloadStore.store(key, JSON.parse(preloaded[key]));
- });
-
- app.SiteSettings = PreloadStore.get("siteSettings");
- }
-
- const setEnvironment = requirejs("discourse-common/config/environment")
- .setEnvironment;
- const setupData = document.getElementById("data-discourse-setup").dataset;
- setEnvironment(setupData.environment);
-
- const Session = requirejs("discourse/models/session").default;
- const session = Session.current();
- session.set("highlightJsPath", setupData.highlightJsPath);
- session.set("markdownItUrl", setupData.markdownItUrl);
-
- [
- "register-files",
- "inject-objects",
- "create-contexts",
- "patch-components",
- ].forEach((fileName) => {
- const initializer = requirejs(
- `discourse/plugins/discourse-custom-wizard/wizard/lib/initialize/${fileName}`
- ).default;
- initializer.run(app, container);
- });
- },
-};
diff --git a/assets/javascripts/wizard/lib/load-script.js.es6 b/assets/javascripts/wizard/lib/load-script.js.es6
deleted file mode 100644
index d0b07c26..00000000
--- a/assets/javascripts/wizard/lib/load-script.js.es6
+++ /dev/null
@@ -1,109 +0,0 @@
-import { ajax } from "wizard/lib/ajax";
-import getURL, { getURLWithCDN } from "discourse-common/lib/get-url";
-import { run } from "@ember/runloop";
-import { Promise } from "rsvp";
-
-const _loaded = {};
-const _loading = {};
-
-function loadWithTag(path, cb) {
- const head = document.getElementsByTagName("head")[0];
-
- let finished = false;
- let s = document.createElement("script");
- s.src = path;
- if (Ember.Test) {
- Ember.Test.registerWaiter(() => finished);
- }
- head.appendChild(s);
-
- s.onload = s.onreadystatechange = function (_, abort) {
- finished = true;
- if (
- abort ||
- !s.readyState ||
- s.readyState === "loaded" ||
- s.readyState === "complete"
- ) {
- s = s.onload = s.onreadystatechange = null;
- if (!abort) {
- run(null, cb);
- }
- }
- };
-}
-
-export function loadCSS(url) {
- return loadScript(url, { css: true });
-}
-
-export default function loadScript(url, opts) {
- // TODO: Remove this once plugins have been updated not to use it:
- if (url === "defer/html-sanitizer-bundle") {
- return Promise.resolve();
- }
-
- opts = opts || {};
-
- $("script").each((i, tag) => {
- const src = tag.getAttribute("src");
-
- if (src && (opts.scriptTag || src !== url)) {
- _loaded[tag.getAttribute("src")] = true;
- }
- });
-
- return new Promise(function (resolve) {
- url = getURL(url);
-
- // If we already loaded this url
- if (_loaded[url]) {
- return resolve();
- }
- if (_loading[url]) {
- return _loading[url].then(resolve);
- }
-
- let done;
- _loading[url] = new Promise(function (_done) {
- done = _done;
- });
-
- _loading[url].then(function () {
- delete _loading[url];
- });
-
- const cb = function (data) {
- if (opts && opts.css) {
- $("head").append("");
- }
- done();
- resolve();
- _loaded[url] = true;
- };
-
- let cdnUrl = url;
-
- // Scripts should always load from CDN
- // CSS is type text, to accept it from a CDN we would need to handle CORS
- if (!opts.css) {
- cdnUrl = getURLWithCDN(url);
- }
-
- // Some javascript depends on the path of where it is loaded (ace editor)
- // to dynamically load more JS. In that case, add the `scriptTag: true`
- // option.
- if (opts.scriptTag) {
- if (Ember.testing) {
- throw `In test mode scripts cannot be loaded async ${cdnUrl}`;
- }
- loadWithTag(cdnUrl, cb);
- } else {
- ajax({
- url: cdnUrl,
- dataType: opts.css ? "text" : "script",
- cache: true,
- }).then(cb);
- }
- });
-}
diff --git a/assets/javascripts/wizard/lib/text-lite.js.es6 b/assets/javascripts/wizard/lib/text-lite.js.es6
deleted file mode 100644
index 26cfc27a..00000000
--- a/assets/javascripts/wizard/lib/text-lite.js.es6
+++ /dev/null
@@ -1,34 +0,0 @@
-import loadScript from "./load-script";
-import { default as PrettyText, buildOptions } from "pretty-text/pretty-text";
-import Handlebars from "handlebars";
-import getURL from "discourse-common/lib/get-url";
-import { getOwner } from "discourse-common/lib/get-owner";
-import { Promise } from "rsvp";
-import Session from "discourse/models/session";
-
-export function cook(text, options) {
- if (!options) {
- options = buildOptions({
- getURL,
- siteSettings: getOwner(this).lookup("site-settings:main"),
- });
- }
-
- return new Handlebars.SafeString(new PrettyText(options).cook(text));
-}
-
-// everything should eventually move to async API and this should be renamed
-// cook
-export function cookAsync(text, options) {
- let markdownItURL = Session.currentProp("markdownItURL");
- if (markdownItURL) {
- return (
- loadScript(markdownItURL)
- .then(() => cook(text, options))
- // eslint-disable-next-line no-console
- .catch((e) => console.error(e))
- );
- } else {
- return Promise.resolve(cook(text));
- }
-}
diff --git a/assets/javascripts/wizard/lib/user-search.js.es6 b/assets/javascripts/wizard/lib/user-search.js.es6
deleted file mode 100644
index 04b6f97c..00000000
--- a/assets/javascripts/wizard/lib/user-search.js.es6
+++ /dev/null
@@ -1,161 +0,0 @@
-import { CANCELLED_STATUS } from "discourse/lib/autocomplete";
-import { debounce } from "@ember/runloop";
-import getUrl from "discourse-common/lib/get-url";
-import { Promise } from "rsvp";
-
-let cache = {},
- cacheTopicId,
- cacheTime,
- currentTerm,
- oldSearch;
-
-function performSearch(
- term,
- topicId,
- includeGroups,
- includeMentionableGroups,
- includeMessageableGroups,
- allowedUsers,
- group,
- resultsFn
-) {
- let cached = cache[term];
- if (cached) {
- resultsFn(cached);
- return;
- }
-
- // need to be able to cancel this
- oldSearch = $.ajax(getUrl("/u/search/users"), {
- data: {
- term,
- topic_id: topicId,
- include_groups: includeGroups,
- include_mentionable_groups: includeMentionableGroups,
- include_messageable_groups: includeMessageableGroups,
- group,
- topic_allowed_users: allowedUsers,
- },
- });
-
- let returnVal = CANCELLED_STATUS;
-
- oldSearch
- .then(function (r) {
- cache[term] = r;
- cacheTime = new Date();
- // If there is a newer search term, return null
- if (term === currentTerm) {
- returnVal = r;
- }
- })
- .always(function () {
- oldSearch = null;
- resultsFn(returnVal);
- });
-}
-
-function organizeResults(r, options) {
- if (r === CANCELLED_STATUS) {
- return r;
- }
-
- let exclude = options.exclude || [],
- limit = options.limit || 5,
- users = [],
- emails = [],
- groups = [],
- results = [];
-
- if (r.users) {
- r.users.every(function (u) {
- if (exclude.indexOf(u.username) === -1) {
- users.push(u);
- results.push(u);
- }
- return results.length <= limit;
- });
- }
-
- if (options.term.match(/@/)) {
- let e = { username: options.term };
- emails = [e];
- results.push(e);
- }
-
- if (r.groups) {
- r.groups.every(function (g) {
- if (
- results.length > limit &&
- options.term.toLowerCase() !== g.name.toLowerCase()
- ) {
- return false;
- }
- if (exclude.indexOf(g.name) === -1) {
- groups.push(g);
- results.push(g);
- }
- return true;
- });
- }
-
- results.users = users;
- results.emails = emails;
- results.groups = groups;
- return results;
-}
-
-export default function userSearch(options) {
- let term = options.term || "",
- includeGroups = options.includeGroups,
- includeMentionableGroups = options.includeMentionableGroups,
- includeMessageableGroups = options.includeMessageableGroups,
- allowedUsers = options.allowedUsers,
- topicId = options.topicId,
- group = options.group;
-
- if (oldSearch) {
- oldSearch.abort();
- oldSearch = null;
- }
-
- currentTerm = term;
-
- return new Promise(function (resolve) {
- // TODO site setting for allowed regex in username
- if (term.match(/[^\w_\-\.@\+]/)) {
- resolve([]);
- return;
- }
- if (new Date() - cacheTime > 30000 || cacheTopicId !== topicId) {
- cache = {};
- }
-
- cacheTopicId = topicId;
-
- let clearPromise = setTimeout(function () {
- resolve(CANCELLED_STATUS);
- }, 5000);
-
- // TODO: Use discouseDebounce after it is available on stable.
- debounce(
- this,
- function () {
- performSearch(
- term,
- topicId,
- includeGroups,
- includeMentionableGroups,
- includeMessageableGroups,
- allowedUsers,
- group,
- function (r) {
- clearTimeout(clearPromise);
- resolve(organizeResults(r, options));
- }
- );
- },
- 300
- );
- });
-}
diff --git a/assets/javascripts/wizard/lib/wizard-i18n.js.es6 b/assets/javascripts/wizard/lib/wizard-i18n.js.es6
deleted file mode 100644
index 9b9f8dd9..00000000
--- a/assets/javascripts/wizard/lib/wizard-i18n.js.es6
+++ /dev/null
@@ -1,50 +0,0 @@
-import I18n from "I18n";
-
-const getThemeId = () => {
- let themeId = parseInt(
- document.querySelector("meta[name=discourse_theme_id]").content,
- 10
- );
-
- if (!isNaN(themeId)) {
- return themeId.toString();
- } else {
- return null;
- }
-};
-
-const getThemeKey = (key) => {
- const themeId = getThemeId();
- return `theme_translations.${themeId}.${key}`;
-};
-
-const translationExists = (key) => {
- return (
- I18n.findTranslation(key, { locale: I18n.locale }) ||
- I18n.findTranslation(key, { locale: I18n.defaultLocale })
- );
-};
-
-const translatedText = (key, value) => {
- const themeKey = getThemeKey(key);
- return translationExists(themeKey) ? I18n.t(themeKey) : value;
-};
-
-export { translatedText };
-
-const WizardI18n = (key, params = {}) => {
- const themeId = getThemeId();
- if (!themeId) {
- return I18n.t(key, params);
- }
-
- let themeKey = getThemeKey(key);
-
- if (translationExists(themeKey)) {
- return I18n.t(themeKey, params);
- } else {
- return I18n.t(key, params);
- }
-};
-
-export default WizardI18n;
diff --git a/assets/javascripts/wizard/models/site.js.es6 b/assets/javascripts/wizard/models/site.js.es6
deleted file mode 100644
index 96837ff2..00000000
--- a/assets/javascripts/wizard/models/site.js.es6
+++ /dev/null
@@ -1,11 +0,0 @@
-import Site from "discourse/models/site";
-import { getOwner } from "discourse-common/lib/get-owner";
-
-export default Site.reopenClass({
- // There is no site data actually loaded by the CW yet. This placeholder is
- // needed by imported classes
- createCurrent() {
- const store = getOwner(this).lookup("service:store");
- return store.createRecord("site", {});
- },
-});
diff --git a/assets/javascripts/wizard/models/wizard.js.es6 b/assets/javascripts/wizard/models/wizard.js.es6
deleted file mode 100644
index 15bcbb8c..00000000
--- a/assets/javascripts/wizard/models/wizard.js.es6
+++ /dev/null
@@ -1,164 +0,0 @@
-import { default as computed } from "discourse-common/utils/decorators";
-import getUrl from "discourse-common/lib/get-url";
-import Field from "./field";
-import { ajax } from "wizard/lib/ajax";
-import { popupAjaxError } from "discourse/lib/ajax-error";
-import Step from "./step";
-import EmberObject from "@ember/object";
-import Site from "./site";
-
-const CustomWizard = EmberObject.extend({
- @computed("steps.length")
- totalSteps: (length) => length,
-
- skip() {
- if (this.required && !this.completed && this.permitted) {
- return;
- }
- CustomWizard.skip(this.id);
- },
-
- restart() {
- CustomWizard.restart(this.id);
- },
-});
-
-CustomWizard.reopenClass({
- skip(wizardId) {
- ajax({ url: `/w/${wizardId}/skip`, type: "PUT" })
- .then((result) => {
- CustomWizard.finished(result);
- })
- .catch(popupAjaxError);
- },
-
- restart(wizardId) {
- ajax({ url: `/w/${wizardId}/skip`, type: "PUT" })
- .then(() => {
- window.location.href = `/w/${wizardId}`;
- })
- .catch(popupAjaxError);
- },
-
- finished(result) {
- let url = "/";
- if (result.redirect_on_complete) {
- url = result.redirect_on_complete;
- }
- window.location.href = getUrl(url);
- },
-
- build(wizardJson) {
- if (!wizardJson) {
- return null;
- }
-
- if (!wizardJson.completed && wizardJson.steps) {
- wizardJson.steps = wizardJson.steps
- .map((step) => {
- const stepObj = Step.create(step);
- stepObj.wizardId = wizardJson.id;
-
- stepObj.fields.sort((a, b) => {
- return parseFloat(a.number) - parseFloat(b.number);
- });
-
- let tabindex = 1;
- stepObj.fields.forEach((f) => {
- f.tabindex = tabindex;
-
- if (["date_time"].includes(f.type)) {
- tabindex = tabindex + 2;
- } else {
- tabindex++;
- }
- });
-
- stepObj.fields = stepObj.fields.map((f) => {
- f.wizardId = wizardJson.id;
- f.stepId = stepObj.id;
- return Field.create(f);
- });
-
- return stepObj;
- })
- .sort((a, b) => {
- return parseFloat(a.index) - parseFloat(b.index);
- });
- }
-
- if (wizardJson.categories) {
- let subcatMap = {};
- let categoriesById = {};
- let categories = wizardJson.categories.map((c) => {
- if (c.parent_category_id) {
- subcatMap[c.parent_category_id] =
- subcatMap[c.parent_category_id] || [];
- subcatMap[c.parent_category_id].push(c.id);
- }
- return (categoriesById[c.id] = EmberObject.create(c));
- });
-
- // Associate the categories with their parents
- categories.forEach((c) => {
- let subcategoryIds = subcatMap[c.get("id")];
- if (subcategoryIds) {
- c.set(
- "subcategories",
- subcategoryIds.map((id) => categoriesById[id])
- );
- }
- if (c.get("parent_category_id")) {
- c.set("parentCategory", categoriesById[c.get("parent_category_id")]);
- }
- });
-
- Site.currentProp("categories", categories);
- Site.currentProp("listByActivity", categories);
- Site.currentProp("categoriesById", categoriesById);
- Site.currentProp(
- "uncategorized_category_id",
- wizardJson.uncategorized_category_id
- );
- }
-
- return CustomWizard.create(wizardJson);
- },
-});
-
-export function findCustomWizard(wizardId, params = {}) {
- let url = `/w/${wizardId}`;
-
- let paramKeys = Object.keys(params).filter((k) => {
- if (k === "wizard_id") {
- return false;
- }
- return !!params[k];
- });
-
- if (paramKeys.length) {
- url += "?";
- paramKeys.forEach((k, i) => {
- if (i > 0) {
- url += "&";
- }
- url += `${k}=${params[k]}`;
- });
- }
-
- return ajax({ url, cache: false, dataType: "json" }).then((result) => {
- return CustomWizard.build(result);
- });
-}
-
-let _wizard_store;
-
-export function updateCachedWizard(wizard) {
- _wizard_store = wizard;
-}
-
-export function getCachedWizard() {
- return _wizard_store;
-}
-
-export default CustomWizard;
diff --git a/assets/javascripts/wizard/router.js.es6 b/assets/javascripts/wizard/router.js.es6
deleted file mode 100644
index 5178c91f..00000000
--- a/assets/javascripts/wizard/router.js.es6
+++ /dev/null
@@ -1,17 +0,0 @@
-import EmberRouter from "@ember/routing/router";
-import getUrl from "discourse-common/lib/get-url";
-import { isTesting } from "discourse-common/config/environment";
-
-const Router = EmberRouter.extend({
- rootURL: isTesting() ? getUrl("/") : getUrl("/w/"),
- location: isTesting() ? "none" : "history",
-});
-
-Router.map(function () {
- this.route("wizard", { path: "/:wizard_id" }, function () {
- this.route("steps", { path: "/steps", resetNamespace: true });
- this.route("step", { path: "/steps/:step_id", resetNamespace: true });
- });
-});
-
-export default Router;
diff --git a/assets/javascripts/wizard/routes/application.js.es6 b/assets/javascripts/wizard/routes/application.js.es6
deleted file mode 100644
index 0051f5ce..00000000
--- a/assets/javascripts/wizard/routes/application.js.es6
+++ /dev/null
@@ -1,3 +0,0 @@
-import Route from "@ember/routing/route";
-
-export default Route.extend();
diff --git a/assets/javascripts/wizard/routes/index.js.es6 b/assets/javascripts/wizard/routes/index.js.es6
deleted file mode 100644
index b24b3631..00000000
--- a/assets/javascripts/wizard/routes/index.js.es6
+++ /dev/null
@@ -1,9 +0,0 @@
-import Route from "@ember/routing/route";
-
-export default Route.extend({
- beforeModel(transition) {
- if (transition.intent.params) {
- this.transitionTo("wizard");
- }
- },
-});
diff --git a/assets/javascripts/wizard/routes/steps.js.es6 b/assets/javascripts/wizard/routes/steps.js.es6
deleted file mode 100644
index 6f35d152..00000000
--- a/assets/javascripts/wizard/routes/steps.js.es6
+++ /dev/null
@@ -1,7 +0,0 @@
-import Route from "@ember/routing/route";
-
-export default Route.extend({
- redirect() {
- this.transitionTo("wizard.index");
- },
-});
diff --git a/assets/javascripts/wizard/templates/application.hbs b/assets/javascripts/wizard/templates/application.hbs
deleted file mode 100644
index c24cd689..00000000
--- a/assets/javascripts/wizard/templates/application.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{outlet}}
diff --git a/assets/javascripts/wizard/templates/components/validator.hbs b/assets/javascripts/wizard/templates/components/validator.hbs
deleted file mode 100644
index a233df9c..00000000
--- a/assets/javascripts/wizard/templates/components/validator.hbs
+++ /dev/null
@@ -1,5 +0,0 @@
-{{#if isValid}}
- {{wizard-i18n validMessageKey}}
-{{else}}
- {{wizard-i18n invalidMessageKey}}
-{{/if}}
diff --git a/assets/javascripts/wizard/templates/components/wizard-composer-hyperlink.hbs b/assets/javascripts/wizard/templates/components/wizard-composer-hyperlink.hbs
deleted file mode 100644
index c4403633..00000000
--- a/assets/javascripts/wizard/templates/components/wizard-composer-hyperlink.hbs
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
{{wizard-i18n "composer.link_dialog_title"}}
- {{input
- class="composer-link-name"
- placeholder=(wizard-i18n "composer.link_optional_text")
- type="text"
- value=linkName}}
- {{input
- class="composer-link-url"
- placeholder=(wizard-i18n "composer.link_url_placeholder")
- type="text"
- value=linkUrl}}
- {{d-button
- label="wizard_composer.modal_ok"
- class="add-link btn-primary"
- click=(action "addLink")}}
- {{d-button
- label="wizard_composer.modal_cancel"
- class="hide-hyperlink-box btn-danger"
- click=(action "hideBox")}}
-
diff --git a/assets/javascripts/wizard/templates/components/wizard-date-input.hbs b/assets/javascripts/wizard/templates/components/wizard-date-input.hbs
deleted file mode 100644
index 3b776215..00000000
--- a/assets/javascripts/wizard/templates/components/wizard-date-input.hbs
+++ /dev/null
@@ -1,11 +0,0 @@
-{{input
- type=inputType
- class="date-picker"
- placeholder=placeholder
- value=(readonly value)
- input=(action "onChangeDate")
- tabindex=tabindex
- autocomplete="off"
-}}
-
-
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-category.hbs b/assets/javascripts/wizard/templates/components/wizard-field-category.hbs
deleted file mode 100644
index 62d4383c..00000000
--- a/assets/javascripts/wizard/templates/components/wizard-field-category.hbs
+++ /dev/null
@@ -1,7 +0,0 @@
-{{wizard-category-selector
- categories=categories
- whitelist=field.content
- maximum=field.limit
- onChange=(action (mut categories))
- tabindex=field.tabindex}}
-
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-checkbox.hbs b/assets/javascripts/wizard/templates/components/wizard-field-checkbox.hbs
deleted file mode 100644
index 053e0218..00000000
--- a/assets/javascripts/wizard/templates/components/wizard-field-checkbox.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{input type="checkbox" id=field.id checked=field.value tabindex=field.tabindex}}
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-composer.hbs b/assets/javascripts/wizard/templates/components/wizard-field-composer.hbs
deleted file mode 100644
index 262f0e69..00000000
--- a/assets/javascripts/wizard/templates/components/wizard-field-composer.hbs
+++ /dev/null
@@ -1,19 +0,0 @@
-{{wizard-composer-editor
- field=field
- composer=composer
- wizard=wizard
- groupsMentioned=(action "groupsMentioned")
- cannotSeeMention=(action "cannotSeeMention")
- importQuote=(action "importQuote")
- togglePreview=(action "togglePreview")
- afterRefresh=(action "afterRefresh")}}
-
-
-
- {{wizard-i18n togglePreviewLabel}}
-
-
- {{#if field.char_counter}}
- {{char-counter field.value field.max_length}}
- {{/if}}
-
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-group.hbs b/assets/javascripts/wizard/templates/components/wizard-field-group.hbs
deleted file mode 100644
index 92c08e2b..00000000
--- a/assets/javascripts/wizard/templates/components/wizard-field-group.hbs
+++ /dev/null
@@ -1,10 +0,0 @@
-{{wizard-group-selector
- groups=wizard.groups
- field=field
- whitelist=field.content
- value=field.value
- tabindex=field.tabindex
- onChange=(action (mut field.value))
- options=(hash
- none="group.select"
- )}}
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-number.hbs b/assets/javascripts/wizard/templates/components/wizard-field-number.hbs
deleted file mode 100644
index f5d6543c..00000000
--- a/assets/javascripts/wizard/templates/components/wizard-field-number.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{input type="number" step="0.01" id=field.id value=field.value tabindex=field.tabindex}}
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-tag.hbs b/assets/javascripts/wizard/templates/components/wizard-field-tag.hbs
deleted file mode 100644
index 1916f3d1..00000000
--- a/assets/javascripts/wizard/templates/components/wizard-field-tag.hbs
+++ /dev/null
@@ -1,7 +0,0 @@
-{{wizard-tag-chooser
- tags=field.value
- maximum=field.limit
- tabindex=field.tabindex
- tagGroups=field.tag_groups
- everyTag=true
-}}
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-text.hbs b/assets/javascripts/wizard/templates/components/wizard-field-text.hbs
deleted file mode 100644
index 08733d3f..00000000
--- a/assets/javascripts/wizard/templates/components/wizard-field-text.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{input id=field.id value=field.value class=fieldClass placeholder=field.translatedPlaceholder tabindex=field.tabindex autocomplete=autocomplete}}
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-textarea.hbs b/assets/javascripts/wizard/templates/components/wizard-field-textarea.hbs
deleted file mode 100644
index dda299bc..00000000
--- a/assets/javascripts/wizard/templates/components/wizard-field-textarea.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{textarea id=field.id value=field.value class=fieldClass placeholder=field.translatedPlaceholder tabindex=field.tabindex}}
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-upload.hbs b/assets/javascripts/wizard/templates/components/wizard-field-upload.hbs
deleted file mode 100644
index 4f4ee1f5..00000000
--- a/assets/javascripts/wizard/templates/components/wizard-field-upload.hbs
+++ /dev/null
@@ -1,18 +0,0 @@
-
- {{#if uploading}}
- {{wizard-i18n "wizard.uploading"}}
- {{else}}
- {{wizard-i18n "wizard.upload"}}
- {{d-icon "upload"}}
- {{/if}}
-
-
-
-
-{{#if field.value}}
- {{#if isImage}}
-
- {{else}}
- {{field.value.original_filename}}
- {{/if}}
-{{/if}}
diff --git a/assets/javascripts/wizard/templates/components/wizard-field-url.hbs b/assets/javascripts/wizard/templates/components/wizard-field-url.hbs
deleted file mode 100644
index c7e1a508..00000000
--- a/assets/javascripts/wizard/templates/components/wizard-field-url.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{input type="text" id=field.id value=field.value tabindex=field.tabindex}}
diff --git a/assets/javascripts/wizard/templates/components/wizard-no-access.hbs b/assets/javascripts/wizard/templates/components/wizard-no-access.hbs
deleted file mode 100644
index f27be5b3..00000000
--- a/assets/javascripts/wizard/templates/components/wizard-no-access.hbs
+++ /dev/null
@@ -1,7 +0,0 @@
-{{text}}
-
-
- {{wizard-i18n "wizard.return_to_site" siteName=siteName}}
- {{d-icon "sign-out-alt"}}
-
-
diff --git a/assets/javascripts/wizard/templates/components/wizard-step.hbs b/assets/javascripts/wizard/templates/components/wizard-step.hbs
deleted file mode 100644
index 5277ef03..00000000
--- a/assets/javascripts/wizard/templates/components/wizard-step.hbs
+++ /dev/null
@@ -1,58 +0,0 @@
-
- {{#if step.title}}
-
{{cookedTitle}}
- {{/if}}
-
- {{#if bannerImage}}
-
-
-
- {{/if}}
-
- {{#if step.description}}
-
{{cookedDescription}}
- {{/if}}
-
- {{#wizard-step-form step=step}}
- {{#each step.fields as |field|}}
- {{wizard-field field=field step=step wizard=wizard}}
- {{/each}}
- {{/wizard-step-form}}
-
-
-
diff --git a/assets/javascripts/wizard/templates/index.hbs b/assets/javascripts/wizard/templates/index.hbs
deleted file mode 100644
index c24cd689..00000000
--- a/assets/javascripts/wizard/templates/index.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{outlet}}
diff --git a/assets/javascripts/wizard/templates/wizard-index.hbs b/assets/javascripts/wizard/templates/wizard-index.hbs
deleted file mode 100644
index a8f1b9ba..00000000
--- a/assets/javascripts/wizard/templates/wizard-index.hbs
+++ /dev/null
@@ -1,3 +0,0 @@
-{{#if noAccess}}
- {{wizard-no-access text=(wizard-i18n noAccessI18nKey) wizardId=wizardId reason=noAccessReason}}
-{{/if}}
diff --git a/assets/javascripts/wizard/tests/acceptance/wizard-test.js.es6 b/assets/javascripts/wizard/tests/acceptance/wizard-test.js.es6
deleted file mode 100644
index 8fd82d11..00000000
--- a/assets/javascripts/wizard/tests/acceptance/wizard-test.js.es6
+++ /dev/null
@@ -1,73 +0,0 @@
-import { visit } from "@ember/test-helpers";
-import { test } from "qunit";
-import { exists } from "../helpers/test";
-import acceptance, { count, query, visible } from "../helpers/acceptance";
-import {
- getWizard,
- wizard,
- wizardCompleted,
- wizardNoUser,
- wizardNotPermitted,
-} from "../helpers/wizard";
-
-acceptance("Wizard | Not logged in", [getWizard(wizardNoUser)], function () {
- test("Wizard no access requires login", async function (assert) {
- await visit("/wizard");
- assert.ok(exists(".wizard-no-access.requires-login"));
- });
-});
-
-acceptance(
- "Wizard | Not permitted",
- [getWizard(wizardNotPermitted)],
- function () {
- test("Wizard no access not permitted", async function (assert) {
- await visit("/wizard");
- assert.ok(exists(".wizard-no-access.not-permitted"));
- });
- }
-);
-
-acceptance("Wizard | Completed", [getWizard(wizardCompleted)], function () {
- test("Wizard no access completed", async function (assert) {
- await visit("/wizard");
- assert.ok(exists(".wizard-no-access.completed"));
- });
-});
-
-acceptance("Wizard | Wizard", [getWizard(wizard)], function () {
- test("Starts", async function (assert) {
- await visit("/wizard");
- assert.ok(query(".wizard-column"), true);
- });
-
- test("Applies the body background color", async function (assert) {
- await visit("/wizard");
- assert.ok($("body")[0].style.background);
- });
-
- test("Renders the wizard form", async function (assert) {
- await visit("/wizard");
- assert.ok(visible(".wizard-column-contents .wizard-step"), true);
- assert.ok(visible(".wizard-footer img"), true);
- });
-
- test("Renders the first step", async function (assert) {
- await visit("/wizard");
- assert.strictEqual(
- query(".wizard-step-title p").textContent.trim(),
- "Text"
- );
- assert.strictEqual(
- query(".wizard-step-description p").textContent.trim(),
- "Text inputs!"
- );
- assert.strictEqual(
- query(".wizard-step-description p").textContent.trim(),
- "Text inputs!"
- );
- assert.strictEqual(count(".wizard-step-form .wizard-field"), 6);
- assert.ok(visible(".wizard-step-footer .wizard-progress"), true);
- assert.ok(visible(".wizard-step-footer .wizard-buttons"), true);
- });
-});
diff --git a/assets/javascripts/wizard/tests/bootstrap.js.es6 b/assets/javascripts/wizard/tests/bootstrap.js.es6
deleted file mode 100644
index a3343b9a..00000000
--- a/assets/javascripts/wizard/tests/bootstrap.js.es6
+++ /dev/null
@@ -1,26 +0,0 @@
-// discourse-skip-module
-/*global document, Logster */
-
-if (window.location.pathname.indexOf("/w/") > -1 && Ember.testing) {
- document.addEventListener("DOMContentLoaded", function () {
- document.body.insertAdjacentHTML(
- "afterbegin",
- `
-
-
- `
- );
- });
-
- Object.keys(requirejs.entries).forEach(function (entry) {
- if (/\-test/.test(entry)) {
- requirejs(entry);
- }
- });
-
- if (window.Logster) {
- Logster.enabled = false;
- } else {
- window.Logster = { enabled: false };
- }
-}
diff --git a/assets/javascripts/wizard/tests/helpers/acceptance.js.es6 b/assets/javascripts/wizard/tests/helpers/acceptance.js.es6
deleted file mode 100644
index 913e8c7a..00000000
--- a/assets/javascripts/wizard/tests/helpers/acceptance.js.es6
+++ /dev/null
@@ -1,53 +0,0 @@
-import { module } from "qunit";
-import setupPretender, { response } from "../pretender";
-import startApp from "../helpers/start-app";
-
-let server;
-let app;
-
-function acceptance(name, requests, cb) {
- module(`Acceptance: ${name}`, function (hooks) {
- hooks.beforeEach(function () {
- server = setupPretender(function (pretender) {
- requests.forEach((req) => {
- pretender[req.verb](req.path, () =>
- response(req.status, req.response)
- );
- });
- return pretender;
- });
- app = startApp();
- });
-
- hooks.afterEach(function () {
- app.destroy();
- server.shutdown();
- });
-
- cb(hooks);
- });
-}
-
-export default acceptance;
-
-export { server };
-
-// The discourse/test/helpers/qunit-helpers file has many functions and imports
-// we don't need, so there will be some duplciation here.
-
-export function queryAll(selector, context) {
- context = context || "#ember-testing";
- return $(selector, context);
-}
-
-export function query() {
- return document.querySelector("#ember-testing").querySelector(...arguments);
-}
-
-export function visible(selector) {
- return queryAll(selector + ":visible").length > 0;
-}
-
-export function count(selector) {
- return queryAll(selector).length;
-}
diff --git a/assets/javascripts/wizard/tests/helpers/start-app.js.es6 b/assets/javascripts/wizard/tests/helpers/start-app.js.es6
deleted file mode 100644
index 821d8033..00000000
--- a/assets/javascripts/wizard/tests/helpers/start-app.js.es6
+++ /dev/null
@@ -1,25 +0,0 @@
-const CustomWizard = requirejs(
- "discourse/plugins/discourse-custom-wizard/wizard/application"
-).default;
-const initializer = requirejs(
- "discourse/plugins/discourse-custom-wizard/wizard/lib/initialize/wizard"
-).default;
-const siteSettings = requirejs(
- "discourse/plugins/discourse-custom-wizard/wizard/tests/fixtures/site-settings"
-).default;
-const { cloneJSON } = requirejs("discourse-common/lib/object").default;
-
-let app;
-
-export default function () {
- app = CustomWizard.create({ rootElement: "#ember-testing" });
- app.start();
-
- app.SiteSettings = cloneJSON(siteSettings);
- initializer.initialize(app);
-
- app.setupForTesting();
- app.injectTestHelpers();
-
- return app;
-}
diff --git a/assets/javascripts/wizard/tests/helpers/step.js.es6 b/assets/javascripts/wizard/tests/helpers/step.js.es6
deleted file mode 100644
index 41fe16cd..00000000
--- a/assets/javascripts/wizard/tests/helpers/step.js.es6
+++ /dev/null
@@ -1,17 +0,0 @@
-import updateJson from "../fixtures/update";
-import { cloneJSON } from "discourse-common/lib/object";
-import wizardJson from "../fixtures/wizard";
-
-const update = cloneJSON(updateJson);
-update.wizard = cloneJSON(wizardJson);
-
-const saveStep = function (response) {
- return {
- verb: "put",
- path: "/w/wizard/steps/:step_id",
- status: 200,
- response,
- };
-};
-
-export { saveStep, update };
diff --git a/assets/javascripts/wizard/tests/helpers/test.js.es6 b/assets/javascripts/wizard/tests/helpers/test.js.es6
deleted file mode 100644
index 360c883a..00000000
--- a/assets/javascripts/wizard/tests/helpers/test.js.es6
+++ /dev/null
@@ -1,5 +0,0 @@
-function exists(selector) {
- return document.querySelector(selector) !== null;
-}
-
-export { exists };
diff --git a/assets/javascripts/wizard/tests/pretender.js.es6 b/assets/javascripts/wizard/tests/pretender.js.es6
deleted file mode 100644
index 1f1d4a7d..00000000
--- a/assets/javascripts/wizard/tests/pretender.js.es6
+++ /dev/null
@@ -1,35 +0,0 @@
-import Pretender from "pretender";
-
-function response(code, obj) {
- if (typeof code === "object") {
- obj = code;
- code = 200;
- }
- return [code, { "Content-Type": "application/json" }, obj];
-}
-
-export { response };
-
-export default function (cb) {
- let server = new Pretender();
-
- if (cb) {
- server = cb(server);
- }
-
- server.prepareBody = function (body) {
- if (body && typeof body === "object") {
- return JSON.stringify(body);
- }
- return body;
- };
-
- server.unhandledRequest = function (verb, path) {
- const error =
- "Unhandled request in test environment: " + path + " (" + verb + ")";
- window.console.error(error);
- throw error;
- };
-
- return server;
-}
diff --git a/assets/stylesheets/common/wizard-admin.scss b/assets/stylesheets/common/admin.scss
similarity index 68%
rename from assets/stylesheets/common/wizard-admin.scss
rename to assets/stylesheets/common/admin.scss
index 607f9037..f188ee1d 100644
--- a/assets/stylesheets/common/wizard-admin.scss
+++ b/assets/stylesheets/common/admin.scss
@@ -1,17 +1,46 @@
-@import "wizard-mapper";
-@import "wizard-manager";
-@import "wizard-api";
+@import "admin/mapper";
+@import "admin/manager";
+@import "admin/api";
@import "common/components/buttons";
+@import "admin/variables";
+
+$expired: #339b18;
+$info: #038ae7;
+$warning: #d47e00;
+$error: #ef1700;
+
+.announcement {
+ margin-left: auto;
+
+ a {
+ display: flex;
+ color: #fff;
+ background-color: #3c1c8d;
+ padding: 6px 12px;
+ text-decoration: none;
+
+ img {
+ width: 20px;
+ height: 20px;
+ margin-right: 0.5rem;
+ }
+ }
+}
.admin-wizard-controls {
display: flex;
align-items: center;
justify-content: space-between;
- margin-bottom: 20px;
+ margin-bottom: 10px;
+ min-height: 34px;
& + .wizard-message + div {
margin-top: 20px;
}
+
+ h3 {
+ margin-bottom: 0;
+ }
}
.wizard-message {
@@ -60,35 +89,68 @@
}
}
- & + div {
+ & + div,
+ & + div + div {
margin-top: 30px;
}
}
-.wizard-submissions {
+.wizard-table {
overflow: scroll;
- table td {
+ table td:not(.small) {
min-width: 150px;
}
-}
-.admin-wizards-logs {
- .admin-wizard-controls {
- h3 {
- margin: 0 7px;
+ table thead th {
+ text-transform: capitalize;
+ }
+
+ .wizard-table-icon-item {
+ display: flex;
+ align-items: center;
+
+ svg {
+ margin-right: 5px;
}
}
- .wizard-logs {
- .date {
- width: 100px;
+ .wizard-table-checkbox-true {
+ text-transform: capitalize;
+ color: var(--success);
+ }
+
+ .wizard-table-checkbox-false {
+ text-transform: capitalize;
+ color: var(--danger);
+ }
+
+ .wizard-table-long-text {
+ &-content {
+ white-space: nowrap;
+ word-wrap: break-word;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ width: 250px;
+ margin-bottom: 0;
+
+ &.text-expanded {
+ white-space: normal;
+ }
}
+
+ a {
+ font-size: var(--font-down-1);
+ }
+ }
+
+ .wizard-table-composer-text {
+ font-family: monospace;
}
}
.wizard-settings-parent {
- padding: 20px;
+ padding: 1em;
border: 1px solid var(--primary-low);
}
@@ -109,7 +171,7 @@
.wizard-basic-details,
.wizard-custom-field,
-.advanced-settings {
+.subscription-settings {
@extend .wizard-settings-group;
}
@@ -151,6 +213,7 @@
.wizard-header {
margin-bottom: 20px;
+ display: flex;
&.large {
font-size: 1.5em;
@@ -169,6 +232,10 @@
margin-bottom: 0;
}
+ button {
+ font-size: 1rem;
+ }
+
.download-link {
font-size: 1rem;
line-height: 20px;
@@ -184,25 +251,28 @@
font-size: 1rem;
background-color: var(--primary-low);
}
-
- button {
- font-size: 1rem;
- }
}
}
&.medium {
- font-size: 1.3em;
+ font-size: 1.2em;
}
&.small {
font-size: 1em;
+ font-weight: 700;
margin-bottom: 5px;
}
&.underline {
text-decoration: underline;
}
+
+ .controls {
+ font-size: 1rem;
+ display: flex;
+ margin-left: auto;
+ }
}
.admin-wizard-buttons {
@@ -243,7 +313,7 @@
font-size: 0.85em;
}
- span {
+ > span {
font-size: 0.929em;
}
@@ -376,14 +446,16 @@
.setting-gutter {
margin-top: 5px;
}
- }
- .advanced-settings {
- width: 100%;
- margin-top: 30px;
+ &.subscription {
+ .setting-label {
+ display: flex;
+ flex-direction: column;
- [class~="setting"]:first-of-type {
- border-top: none;
+ label {
+ margin: 0;
+ }
+ }
}
}
@@ -681,27 +753,59 @@
}
}
-.realtime-validations > ul {
+.admin-wizard-container.settings .realtime-validations .setting-value > ul {
list-style: none;
margin: 0;
+ width: 100%;
+ display: flex;
+ flex-wrap: wrap;
> li {
- background-color: var(--primary-low);
+ border: 1px solid var(--primary);
padding: 1em;
margin: 0 0 1em 0;
- input {
- margin-bottom: 0;
+ .setting-title {
+ display: flex;
+ align-items: center;
+
+ h4 {
+ margin: 0 15px 0 0;
+ }
+
+ input[type="checkbox"] {
+ margin: 0 5px 0 0;
+ }
+ }
+
+ .setting-label {
+ width: 100px;
+ }
+
+ .setting-value {
+ display: flex;
+ align-items: center;
+
+ .input .select-kit,
+ > .select-kit {
+ max-width: unset !important;
+ }
+
+ > span {
+ margin-right: 1em;
+ }
}
}
}
.validation-container {
display: flex;
+ flex-direction: column;
padding: 1em 0;
.validation-section {
- width: 250px;
+ min-width: 250px;
+ margin: 0.5em 0;
}
}
@@ -718,3 +822,129 @@
width: 80px;
vertical-align: middle;
}
+
+.wizard-subscription-container {
+ width: 100%;
+ padding: 1em;
+ background-color: rgba($pavilion_primary, 0.1);
+
+ .subscription-header {
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 0.5em;
+
+ h3 {
+ margin: 0;
+ }
+
+ a {
+ color: var(--primary);
+ }
+ }
+
+ &:not(.subscribed) .subscription-settings {
+ filter: blur(1px);
+ pointer-events: none;
+ }
+}
+
+.wizard-subscription-badge {
+ display: inline-flex;
+ align-items: center;
+ max-height: 34px;
+ box-sizing: border-box;
+ position: relative;
+ cursor: pointer;
+ padding: 0.5em 0.65em;
+ background-color: rgba($primary-medium, 0.05);
+ border: 1.5px solid rgba($primary-medium, 0.5);
+ color: var(--secondary);
+
+ svg.d-icon-pavilion-logo {
+ width: 15px;
+ height: 15px;
+ margin-right: 0.45em;
+ margin-bottom: 0.15em;
+ color: var(--secondary);
+ }
+
+ &.none {
+ background-color: var(--subscription-none);
+ border: 1.5px solid var(--subscription-none);
+ }
+
+ &.standard {
+ background-color: var(--subscription-standard);
+ border: 1.5px solid var(--subscription-standard);
+ }
+
+ &.business {
+ background-color: var(--subscription-business);
+ border: 1.5px solid var(--subscription-business);
+ }
+
+ &.community {
+ background-color: var(--subscription-community);
+ border: 1.5px solid var(--pavilion-primary);
+ color: var(--pavilion-primary);
+
+ &:hover,
+ svg {
+ color: var(--pavilion-primary);
+ }
+ }
+
+ .d-icon {
+ margin-right: 0.75em;
+ }
+}
+
+.wizard-subscription-selector.select-kit.single-select {
+ .select-kit-row {
+ .texts {
+ display: flex;
+ align-items: center;
+ }
+ &.disabled {
+ background: var(--primary-low);
+ cursor: unset;
+ }
+ }
+
+ .subscription-label {
+ margin-left: 0.75em;
+ padding-top: 0.25em;
+ color: var(--pavilion-primary);
+ font-size: 0.75em;
+ }
+}
+
+.admin-wizards .admin-actions {
+ .supplier-authorize {
+ display: inline-flex;
+
+ button.update {
+ width: 40px;
+ height: 34px;
+ }
+
+ .wizard-subscription-badge {
+ margin-right: 5px;
+ svg {
+ margin-right: 0.45em;
+ }
+ }
+
+ .btn-primary {
+ margin-right: 5px;
+ }
+
+ .deauthorize {
+ background-color: var(--secondary);
+
+ &:hover {
+ color: var(--primary);
+ }
+ }
+ }
+}
diff --git a/assets/stylesheets/common/wizard-api.scss b/assets/stylesheets/common/admin/api.scss
similarity index 90%
rename from assets/stylesheets/common/wizard-api.scss
rename to assets/stylesheets/common/admin/api.scss
index 9d0ad261..29aff22d 100644
--- a/assets/stylesheets/common/wizard-api.scss
+++ b/assets/stylesheets/common/admin/api.scss
@@ -40,9 +40,18 @@
float: right;
}
- .wizard-header {
- overflow: hidden;
- font-size: 1.3em;
+ .metadata {
+ display: flex;
+
+ .title {
+ margin-right: 1em;
+ }
+
+ .name.saved span {
+ display: inline-block;
+ padding: 6px 12px;
+ background-color: var(--primary-low);
+ }
}
}
@@ -74,10 +83,6 @@
width: 50%;
max-width: 50%;
- .wizard-header {
- overflow: hidden;
- }
-
.authorization {
float: right;
}
diff --git a/assets/stylesheets/common/wizard-manager.scss b/assets/stylesheets/common/admin/manager.scss
similarity index 94%
rename from assets/stylesheets/common/wizard-manager.scss
rename to assets/stylesheets/common/admin/manager.scss
index a3b30c98..4ad56a78 100644
--- a/assets/stylesheets/common/wizard-manager.scss
+++ b/assets/stylesheets/common/admin/manager.scss
@@ -2,10 +2,6 @@
display: flex;
justify-content: flex-start;
- h3 {
- margin-bottom: 0;
- }
-
.buttons {
display: flex;
margin-left: auto;
@@ -26,7 +22,7 @@
}
}
- #file-upload {
+ #custom-wizard-file-upload {
display: none;
}
diff --git a/assets/stylesheets/common/wizard-mapper.scss b/assets/stylesheets/common/admin/mapper.scss
similarity index 100%
rename from assets/stylesheets/common/wizard-mapper.scss
rename to assets/stylesheets/common/admin/mapper.scss
diff --git a/assets/stylesheets/common/admin/variables.scss b/assets/stylesheets/common/admin/variables.scss
new file mode 100644
index 00000000..8b263fd5
--- /dev/null
+++ b/assets/stylesheets/common/admin/variables.scss
@@ -0,0 +1,18 @@
+$pavilion_primary: #3c1c8c;
+$pavilion_secondary: #ffffff;
+$pavilion_warning: rgb(243, 163, 61);
+
+$subscription_none: $pavilion_primary;
+$subscription_standard: $pavilion_primary;
+$subscription_business: #333;
+$subscription_community: #fff;
+
+:root {
+ --pavilion-primary: #{$pavilion_primary};
+ --pavilion-secondary: #{$pavilion_secondary};
+ --pavilion-warning: #{$pavilion_warning};
+ --subscription-none: #{$subscription_none};
+ --subscription-standard: #{$subscription_standard};
+ --subscription-business: #{$subscription_business};
+ --subscription-community: #{$subscription_community};
+}
diff --git a/assets/stylesheets/common/wizard.scss b/assets/stylesheets/common/wizard.scss
new file mode 100644
index 00000000..391c3a78
--- /dev/null
+++ b/assets/stylesheets/common/wizard.scss
@@ -0,0 +1,14 @@
+@import "wizard/base";
+@import "wizard/wizard";
+@import "wizard/header";
+@import "wizard/step";
+@import "wizard/badges";
+@import "wizard/buttons";
+@import "wizard/field";
+@import "wizard/validators";
+@import "wizard/mobile";
+@import "wizard/autocomplete";
+@import "wizard/composer";
+@import "wizard/events";
+@import "wizard/locations";
+@import "wizard/mentionables";
diff --git a/assets/stylesheets/common/wizard/autocomplete.scss b/assets/stylesheets/common/wizard/autocomplete.scss
new file mode 100644
index 00000000..60ca0180
--- /dev/null
+++ b/assets/stylesheets/common/wizard/autocomplete.scss
@@ -0,0 +1,172 @@
+body.custom-wizard {
+ div.ac-wrap {
+ box-sizing: border-box;
+ position: relative;
+ overflow: visible;
+ max-height: 150px;
+ min-height: 34px;
+ background-color: var(--secondary);
+ border: 1px solid var(--primary-medium);
+ padding: 5px;
+
+ div.item {
+ float: left;
+ margin-bottom: 4px;
+ margin-right: 10px;
+ line-height: 1.6;
+
+ span {
+ height: 24px;
+ display: inline-block;
+ line-height: 20px;
+ }
+ }
+
+ .ac-collapsed-button {
+ float: left;
+ border-radius: 20px;
+ position: relative;
+ top: -2px;
+ margin-right: 10px;
+ }
+
+ input[type="text"] {
+ border: 0;
+ }
+
+ .remove-link {
+ margin-left: 4px;
+ font-size: $font-down-1;
+ line-height: $line-height-small;
+ padding: 1px 3.5px;
+ border-radius: 12px;
+ box-sizing: border-box;
+ border: 1px solid var(--primary-low);
+
+ &:hover {
+ background-color: var(--danger-low);
+ border: 1px solid var(--danger-medium);
+ text-decoration: none;
+ color: var(--danger);
+ }
+ }
+
+ .ac-loading {
+ position: absolute;
+ top: 7px;
+ right: 5px;
+ }
+
+ input {
+ margin-bottom: 0;
+ }
+
+ .autocomplete {
+ z-index: 999999;
+ position: absolute;
+ width: inherit;
+ max-width: 240px;
+ box-sizing: border-box;
+ background-color: var(--secondary);
+ border: 1px solid var(--primary-low);
+
+ li,
+ .no-results {
+ padding: 10px;
+ }
+
+ ul {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+
+ li {
+ .d-users {
+ color: var(--primary-medium);
+ padding: 0 2px;
+ }
+
+ border-bottom: 1px solid var(--primary-low);
+
+ a {
+ padding: 5px;
+ display: block;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ font-size: 14px;
+ text-decoration: none;
+ color: var(--primary);
+
+ img {
+ margin-right: 5px;
+ }
+
+ span.username {
+ color: var(--primary);
+ vertical-align: middle;
+ }
+
+ span.name {
+ font-size: $font-down-1;
+ vertical-align: middle;
+ margin-left: 5px;
+ color: var(--primary);
+ }
+
+ &.selected {
+ background-color: var(--tertiary);
+
+ span.username,
+ span.name {
+ color: var(--secondary);
+ }
+ }
+
+ &:hover:not(.selected) {
+ background-color: var(--highlight-low);
+ text-decoration: none;
+ }
+ }
+ }
+ }
+
+ ul > label {
+ margin: 5px 0;
+ padding: 0 5px;
+ font-size: 80%;
+ line-height: 1.4em;
+
+ a {
+ text-decoration: underline;
+ }
+ }
+ }
+ }
+
+ .ac-form-result {
+ cursor: pointer;
+ background-color: var(--secondary);
+ display: flex;
+
+ &:hover,
+ &.selected {
+ background-color: var(--tertiary);
+ color: white;
+
+ label {
+ color: white;
+ }
+ }
+
+ label {
+ flex: 1 1 auto;
+ margin-bottom: 0;
+ cursor: pointer;
+ }
+
+ i {
+ margin-right: 5px;
+ }
+ }
+}
diff --git a/assets/stylesheets/common/wizard/badges.scss b/assets/stylesheets/common/wizard/badges.scss
new file mode 100644
index 00000000..4439346d
--- /dev/null
+++ b/assets/stylesheets/common/wizard/badges.scss
@@ -0,0 +1,132 @@
+body.custom-wizard {
+ .badge-wrapper {
+ font-size: $font-down-1;
+ font-weight: bold;
+ white-space: nowrap;
+ position: relative;
+ display: inline-flex;
+ align-items: baseline;
+
+ .badge-category {
+ display: inline-flex;
+ align-items: baseline;
+
+ .category-name {
+ text-overflow: ellipsis;
+ overflow: hidden;
+ }
+
+ .d-icon {
+ margin-right: 3px;
+ width: 0.74em;
+ height: 0.74em;
+ color: inherit;
+ }
+ }
+
+ &.bullet {
+ margin-right: 8px;
+
+ span.badge-category {
+ color: var(--primary-high);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ .extra-info-wrapper & {
+ color: var(--header_primary);
+ }
+ }
+
+ .badge-category-parent-bg,
+ .badge-category-bg {
+ flex: 0 0 auto;
+ width: 9px;
+ height: 9px;
+ margin-right: 5px;
+ display: inline-block;
+ }
+
+ .badge-category-parent-bg {
+ width: 5px;
+ margin-right: 0;
+ + .badge-category-bg {
+ width: 5px;
+ }
+ }
+
+ .d-icon {
+ color: var(--primary-medium);
+ }
+ }
+
+ &.box {
+ margin-right: 5px;
+ padding: 2px 4px 2px 4px;
+ display: inline-flex;
+
+ span {
+ overflow: hidden;
+ text-overflow: ellipsis;
+
+ &.badge-category-bg,
+ &.badge-category-parent-bg {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ }
+
+ &.badge-category-parent-bg {
+ width: calc(100% - 5px);
+
+ & + .badge-category-bg {
+ left: 5px;
+ width: calc(100% - 5px);
+
+ & + .badge-category {
+ margin-left: 5px;
+ }
+ }
+ }
+
+ &.badge-category {
+ position: relative;
+ }
+ }
+
+ + .topic-header-extra {
+ padding: 2px 4px 2px 4px;
+ }
+ }
+
+ &.bar {
+ margin-right: 5px;
+
+ span.badge-category {
+ color: var(--primary-high);
+ padding: 1px 3px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+
+ .extra-info-wrapper & {
+ color: var(--header_primary);
+ }
+ }
+
+ .badge-category-parent-bg,
+ .badge-category-bg {
+ display: inline-block;
+ padding: 0 1px;
+
+ &:before {
+ content: "\a0";
+ }
+ }
+ }
+
+ &.none {
+ color: var(--primary-high);
+ margin-right: 5px;
+ }
+ }
+}
diff --git a/assets/stylesheets/common/wizard/base.scss b/assets/stylesheets/common/wizard/base.scss
new file mode 100644
index 00000000..f5c60356
--- /dev/null
+++ b/assets/stylesheets/common/wizard/base.scss
@@ -0,0 +1,65 @@
+body.custom-wizard {
+ input {
+ display: inline-block;
+ padding: 4px 10px;
+ margin-bottom: 9px;
+ font-size: 1em;
+ line-height: 1;
+ color: var(--primary);
+ background-color: var(--secondary);
+ border: 1px solid var(--primary-medium);
+ border-radius: 0;
+ box-sizing: border-box;
+ }
+
+ textarea {
+ height: auto;
+ background-color: var(--secondary);
+ border: 1px solid var(--primary-medium);
+ min-height: 150px;
+
+ &:focus {
+ border-color: var(--tertiary);
+ box-shadow: shadow("focus");
+ outline: 0;
+ }
+ }
+
+ input,
+ select,
+ textarea {
+ color: var(--primary);
+ caret-color: currentColor;
+
+ &[class*="span"] {
+ float: none;
+ margin-left: 0;
+ }
+
+ &[disabled],
+ &[readonly] {
+ cursor: not-allowed;
+ background-color: var(--primary-low);
+ border-color: var(--primary-low);
+ }
+
+ &:focus:required:invalid {
+ color: var(--danger);
+ border-color: var(--danger);
+ }
+
+ &:focus:required:invalid:focus {
+ border-color: var(--danger);
+ box-shadow: shadow("focus-danger");
+ }
+
+ &[type="checkbox"] {
+ margin-bottom: 0;
+ margin-right: 10px;
+ }
+ }
+
+ .body-length {
+ text-align: right;
+ }
+}
diff --git a/assets/stylesheets/common/wizard/buttons.scss b/assets/stylesheets/common/wizard/buttons.scss
new file mode 100644
index 00000000..c0c43099
--- /dev/null
+++ b/assets/stylesheets/common/wizard/buttons.scss
@@ -0,0 +1,90 @@
+body.custom-wizard {
+ .wizard-btn {
+ border-radius: 2px;
+ font-size: var(--font-0);
+ border: 0;
+ padding: 0.5em;
+ transition: background-color 0.3s;
+ margin-right: 0.5em;
+ text-decoration: none;
+ background-color: var(--secondary);
+ color: var(--primary-very-high);
+ box-shadow: 0 1px 4px rgba(var(--always-black-rgb), 0.4);
+ cursor: pointer;
+
+ &.small {
+ padding: 0.25em 0.5em;
+ font-size: var(--font-down-1);
+ }
+
+ &:hover,
+ &:focus {
+ background-color: var(--primary-low);
+ }
+
+ &:active {
+ background-color: var(--primary-low-mid);
+ }
+
+ &:disabled,
+ &.disabled {
+ background-color: var(--primary-medium);
+ }
+
+ .d-icon-chevron-right {
+ margin-left: 0.25em;
+ font-size: 0.8em;
+ }
+ .d-icon-chevron-left {
+ margin-right: 0.25em;
+ font-size: 0.8em;
+ }
+ }
+
+ .wizard-btn.primary {
+ background-color: var(--tertiary);
+ color: var(--secondary);
+ box-shadow: 0 1px 4px rgba(var(--always-black-rgb), 0.6);
+
+ &:hover,
+ &:focus {
+ background-color: var(--tertiary-hover);
+ }
+
+ &:active {
+ background-color: var(--tertiary-high);
+ }
+
+ &:disabled {
+ background-color: var(--tertiary-low);
+ }
+ }
+
+ .wizard-btn.danger {
+ background-color: var(--danger);
+ color: var(--secondary);
+
+ &:hover,
+ &:focus {
+ background-color: var(--danger-hover);
+ }
+
+ &:active {
+ background-color: var(--danger-medium);
+ }
+
+ &:disabled {
+ background-color: var(--danger-low);
+ }
+ }
+
+ .action-link {
+ margin-right: 1em;
+ text-decoration: none;
+ color: var(--tertiary);
+
+ &:hover {
+ color: var(--tertiary-hover);
+ }
+ }
+}
diff --git a/assets/stylesheets/common/wizard/composer.scss b/assets/stylesheets/common/wizard/composer.scss
new file mode 100644
index 00000000..aee47333
--- /dev/null
+++ b/assets/stylesheets/common/wizard/composer.scss
@@ -0,0 +1,282 @@
+body.custom-wizard {
+ .d-editor-container {
+ display: flex;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+
+ .d-editor-overlay {
+ position: absolute;
+ background-color: black;
+ opacity: 0.8;
+ z-index: z("modal", "overlay");
+ }
+
+ .d-editor-modals {
+ position: absolute;
+ z-index: z("modal", "content");
+ }
+
+ .d-editor {
+ display: flex;
+ flex-grow: 1;
+ min-height: 0;
+ }
+
+ .d-editor .d-editor-modal {
+ min-width: 400px;
+ position: absolute;
+ background-color: var(--secondary);
+ border: 1px solid var(--primary);
+ padding: 1em;
+ top: 25px;
+
+ @media screen and (max-width: 424px) {
+ min-width: 300px;
+ }
+
+ input {
+ width: 95%;
+ }
+ h3 {
+ margin-bottom: 0.5em;
+ }
+ }
+
+ .wizard-field-composer .wmd-controls {
+ position: relative;
+ }
+
+ .wizard-field-composer.show-preview .d-editor-textarea-column {
+ display: none;
+ }
+
+ .d-editor-textarea-wrapper,
+ .d-editor-preview-wrapper {
+ background-color: var(--secondary);
+ border: 1px solid var(--primary-medium);
+ flex: 1;
+ max-width: unset;
+ }
+
+ .d-editor-textarea-wrapper {
+ display: flex;
+ flex-direction: column;
+ position: relative;
+
+ textarea {
+ background: transparent;
+ }
+ }
+
+ .d-editor-preview-wrapper {
+ display: flex;
+ flex-direction: column;
+ margin-left: 0;
+ overflow: auto;
+ cursor: default;
+ margin-top: unset;
+ padding-top: unset;
+ }
+
+ .d-editor-button-bar {
+ display: flex;
+ align-items: center;
+ border-bottom: none;
+ min-height: 30px;
+ padding-left: 3px;
+ border-bottom: 1px solid var(--primary-low);
+
+ button {
+ background-color: transparent;
+ color: var(--primary);
+ }
+
+ .btn:not(.no-text) {
+ font-size: 1.1487em;
+ }
+
+ .btn.bold {
+ font-weight: bolder;
+ }
+
+ .btn.italic {
+ font-style: italic;
+ }
+ }
+
+ .d-editor-spacer {
+ width: 1px;
+ height: 20px;
+ margin: 0 5px;
+ display: inline-block;
+ }
+
+ .d-editor-input,
+ .d-editor-preview {
+ box-sizing: border-box;
+ flex: 1 1 100%;
+ width: 100%;
+ margin: 0;
+ min-height: auto;
+ word-wrap: break-word;
+ -webkit-appearance: none;
+ border-radius: 0;
+ &:focus {
+ box-shadow: none;
+ border: 0;
+ outline: 0;
+ }
+ }
+
+ .d-editor-input {
+ border: 0;
+ padding: 10px;
+ height: unset; // overrides core css
+ overflow-x: hidden;
+ resize: none;
+ }
+
+ .d-editor-preview {
+ height: auto;
+ padding: 10px;
+ }
+
+ .d-editor-plugin {
+ display: flex;
+ flex: 1 1;
+ overflow: auto;
+ }
+
+ .composing-whisper .d-editor-preview {
+ font-style: italic;
+ color: var(--primary) !important;
+ }
+
+ .d-editor-preview > *:first-child {
+ margin-top: 0;
+ }
+
+ .hide-preview .d-editor-preview-wrapper {
+ display: none;
+ flex: 0;
+ }
+
+ ////
+
+ .d-editor {
+ min-height: 200px;
+
+ .d-editor-input {
+ resize: vertical;
+ flex: initial;
+ }
+
+ textarea {
+ min-height: calc(200px - 32px);
+ }
+ }
+
+ .d-editor-modal.hidden {
+ display: none;
+ }
+
+ .d-editor-button-bar .btn {
+ border: none;
+ font-size: 0.9em;
+ }
+
+ .wizard-composer-upload {
+ display: none;
+ }
+
+ .wizard-composer-hyperlink {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(var(--primary-rgb), 0.8);
+ }
+
+ .wizard-composer-hyperlink-contents {
+ background-color: var(--secondary);
+ padding: 20px;
+
+ h3 {
+ margin-top: 0;
+ }
+
+ .composer-link-url,
+ .composer-link-name {
+ display: block;
+ min-width: 450px;
+ }
+ }
+
+ .hide-hyperlink-box,
+ .add-link {
+ display: inline;
+ }
+
+ #file-uploading {
+ position: absolute;
+ bottom: 1px;
+ right: 1px;
+ padding: 10px;
+ background-color: var(--secondary);
+ }
+
+ .bottom-bar {
+ display: flex;
+ justify-content: space-between;
+ margin-top: 20px;
+ align-items: center;
+ }
+
+ // Markdown table styles for wizard composer preview
+
+ .cooked,
+ .d-editor-preview {
+ a.mention {
+ display: inline-block; // https://bugzilla.mozilla.org/show_bug.cgi?id=1656119
+ font-weight: bold;
+ font-size: 0.93em;
+ color: var(--primary-high-or-secondary-low);
+ padding: 0 4px 1px;
+ background: var(--primary-low);
+ border-radius: 8px;
+ }
+
+ table {
+ border-collapse: collapse;
+
+ tr {
+ border-bottom: 1px solid var(--primary-low);
+ &.highlighted {
+ animation: background-fade-highlight 2.5s ease-out;
+ }
+ }
+
+ thead {
+ th {
+ text-align: left;
+ padding: 0.5em;
+ font-weight: bold;
+ color: var(--primary);
+ }
+ }
+
+ tbody {
+ border-top: 3px solid var(--primary-low);
+ }
+
+ td {
+ padding: 3px 3px 3px 0.5em;
+ }
+ }
+ }
+}
diff --git a/assets/stylesheets/common/wizard/events.scss b/assets/stylesheets/common/wizard/events.scss
new file mode 100644
index 00000000..c540661b
--- /dev/null
+++ b/assets/stylesheets/common/wizard/events.scss
@@ -0,0 +1,514 @@
+body.custom-wizard {
+ .event-form {
+ width: 585px;
+ max-width: 80vw;
+
+ .control {
+ display: inline-flex;
+ align-items: flex-start;
+ min-height: 30px;
+ margin-right: 20px;
+
+ > input:first-child {
+ margin-top: 10px !important;
+ }
+
+ > span:first-child {
+ margin-top: 5px !important;
+ }
+
+ > input + span {
+ margin-top: 5px;
+ }
+
+ &:last-of-type {
+ margin-right: 0;
+ }
+
+ input[type="checkbox"] {
+ margin: 0 10px 0 0;
+ }
+
+ input[type="number"] {
+ width: 50px;
+ margin: 0;
+ min-height: 34px;
+ border: 1px solid #e9e9e9;
+ }
+
+ &.full-width {
+ flex: 1;
+ }
+
+ .select-kit,
+ .ac-wrap {
+ width: 100% !important;
+ max-width: 330px;
+ }
+
+ .select-kit-body {
+ width: 100% !important;
+ max-width: 330px;
+ }
+ }
+
+ .event-controls {
+ margin-bottom: 20px;
+ display: flex;
+ align-items: flex-start;
+ }
+
+ .datetime-controls {
+ display: flex;
+ margin-bottom: 5px;
+
+ .date-time-card {
+ width: 270px;
+ display: inline-block;
+ text-align: left;
+ }
+
+ .start-card {
+ border-left: 1px solid transparent;
+ padding-right: 20px;
+ }
+
+ .end-card {
+ border-left: 1px solid #eee;
+ padding-left: 20px;
+
+ &.disabled {
+ span,
+ label,
+ .pika-label,
+ .pika-table th,
+ .pika-button,
+ .pika-prev,
+ .pika-next,
+ input,
+ .pika-lendar,
+ .is-selected .pika-button {
+ color: var(--primary-low);
+ background-image: initial;
+ background: initial;
+ box-shadow: initial;
+ cursor: default;
+ pointer-events: none;
+ }
+
+ input,
+ .pika-lendar {
+ border: 1px solid var(--primary-low) !important;
+ }
+ }
+ }
+
+ .set-all-day {
+ font-size: 1.2em;
+ padding-bottom: 13px;
+ }
+
+ .sub-title {
+ font-size: 1.2em;
+ font-weight: bold;
+ padding-bottom: 2px;
+ padding-right: 10px;
+ }
+
+ .date-time-set {
+ padding-top: 10px;
+ display: flex;
+ flex-direction: row;
+
+ .date-area {
+ order: 1;
+ }
+
+ .time-area {
+ order: 2;
+ margin-left: 10px;
+
+ .modal-time {
+ width: 127px;
+ }
+ }
+
+ input {
+ padding: 4px 10px;
+ font-size: 1em;
+ line-height: 1;
+ color: var(--primary);
+ border: 1px solid var(--primary-medium);
+ min-height: 30px;
+ width: 130px;
+ margin: 10px 0;
+ }
+ }
+
+ #date-container-start,
+ #date-container-end {
+ height: 250px;
+ }
+
+ .ui-timepicker-input {
+ width: 105px;
+ text-align: center;
+ }
+
+ .pika-single {
+ position: relative !important;
+ border: none;
+ z-index: 100;
+
+ .pika-lendar {
+ border: 1px solid var(--primary-medium);
+ padding: 14px;
+ margin: 0;
+ float: none;
+ width: auto;
+ }
+ }
+ }
+
+ .rsvp-controls {
+ .rsvp-container {
+ display: flex;
+ flex-flow: wrap;
+ margin-top: 10px;
+
+ .control span {
+ margin-right: 10px;
+ }
+
+ .full-width {
+ align-items: flex-start;
+ }
+ }
+ }
+ }
+
+ // datepicker
+
+ /*!
+ * Pikaday
+ * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/
+ */
+
+ // Variables
+ // Declare any of these variables before importing this SCSS file to easily override defaults
+ // Variables are namespaced with the pd (pikaday) prefix
+
+ // Colours
+ $pd-text-color: var(--primary) !default;
+ $pd-title-color: var(--primary) !default;
+ $pd-title-bg: var(--secondary) !default;
+ $pd-picker-bg: var(--secondary) !default;
+ $pd-picker-border: var(--primary-low) !default;
+ $pd-picker-border-bottom: var(--primary-low) !default;
+ $pd-picker-shadow: rgba(0, 0, 0, 0.5) !default;
+ $pd-th-color: var(--primary) !default;
+ $pd-day-color: var(--primary) !default;
+ $pd-day-bg: var(--secondary) !default;
+ $pd-day-hover-color: var(--primary) !default;
+ $pd-day-hover-bg: var(--tertiary-low) !default;
+ $pd-day-today-color: var(--tertiary) !default;
+ $pd-day-selected-color: var(--secondary) !default;
+ $pd-day-selected-bg: var(--tertiary) !default;
+ $pd-day-selected-shadow: var(--tertiary-low) !default;
+ $pd-day-disabled-color: var(--primary) !default;
+ $pd-week-color: var(--primary) !default;
+
+ // Font
+ $pd-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !default;
+
+ .pika-single {
+ z-index: 9999;
+ display: block;
+ position: relative;
+ color: $pd-text-color;
+ background: $pd-picker-bg;
+ border: 1px solid $pd-picker-border;
+ border-bottom-color: $pd-picker-border-bottom;
+ font-family: $pd-font-family;
+
+ &.is-hidden {
+ display: none;
+ }
+
+ &.is-bound {
+ position: absolute;
+ box-shadow: 0 5px 15px -5px $pd-picker-shadow;
+ }
+ }
+
+ // clear child float (pika-lendar), using the famous micro clearfix hack
+ // http://nicolasgallagher.com/micro-clearfix-hack/
+ .pika-single {
+ &:before,
+ &:after {
+ content: " ";
+ display: table;
+ }
+
+ &:after {
+ clear: both;
+ }
+ }
+
+ .pika-lendar {
+ float: left;
+ width: 240px;
+ margin: 8px;
+ }
+
+ .pika-title {
+ position: relative;
+ text-align: center;
+
+ select {
+ cursor: pointer;
+ position: absolute;
+ z-index: 9998;
+ margin: 0;
+ left: 0;
+ top: 5px;
+ filter: alpha(opacity=0);
+ opacity: 0;
+ }
+ }
+
+ .pika-label {
+ display: inline-block;
+ position: relative;
+ z-index: 9999;
+ overflow: hidden;
+ margin: 0;
+ padding: 5px 3px;
+ font-size: 14px;
+ line-height: 20px;
+ font-weight: bold;
+ color: $pd-title-color;
+ background-color: $pd-title-bg;
+ }
+
+ .pika-prev,
+ .pika-next {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ outline: none;
+ border: 0;
+ padding: 0;
+ width: 20px;
+ height: 30px;
+ text-indent: 20px; // hide text using text-indent trick, using width value (it's enough)
+ white-space: nowrap;
+ overflow: hidden;
+ background-color: transparent;
+ background-position: center center;
+ background-repeat: no-repeat;
+ background-size: 75% 75%;
+ opacity: 0.5;
+ @if (lightness($secondary) < 50) {
+ // invert the black png if the background is dark
+ filter: invert(1);
+ }
+
+ &:hover {
+ opacity: 1;
+ }
+
+ &.is-disabled {
+ cursor: default;
+ opacity: 0.2;
+ }
+ }
+
+ .pika-prev,
+ .is-rtl .pika-next {
+ float: left;
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==");
+ }
+
+ .pika-next,
+ .is-rtl .pika-prev {
+ float: right;
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=");
+ }
+
+ .pika-select {
+ display: inline-block;
+ }
+
+ .pika-table {
+ width: 100%;
+ border-collapse: collapse;
+ border-spacing: 0;
+ border: 0;
+
+ th,
+ td {
+ width: 14.285714285714286%;
+ padding: 0;
+ }
+
+ th {
+ color: $pd-th-color;
+ font-size: 12px;
+ line-height: 25px;
+ font-weight: bold;
+ text-align: center;
+ }
+
+ abbr {
+ border-bottom: none;
+ cursor: help;
+ }
+ }
+
+ .pika-button {
+ cursor: pointer;
+ display: block;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ outline: none;
+ border: 0;
+ margin: 0;
+ width: 100%;
+ padding: 5px;
+ color: $pd-day-color;
+ font-size: 12px;
+ line-height: 15px;
+ text-align: right;
+ background: $pd-day-bg;
+
+ .is-today & {
+ color: $pd-day-today-color;
+ font-weight: bold;
+ }
+
+ .is-selected & {
+ color: $pd-day-selected-color;
+ font-weight: bold;
+ background: $pd-day-selected-bg;
+ box-shadow: inset 0 1px 3px $pd-day-selected-shadow;
+ border-radius: 3px;
+ }
+
+ .is-disabled &,
+ .is-outside-current-month & {
+ pointer-events: none;
+ cursor: default;
+ color: $pd-day-disabled-color;
+ opacity: 0.3;
+ }
+
+ &:hover {
+ color: $pd-day-hover-color;
+ background: $pd-day-hover-bg;
+ box-shadow: none;
+ border-radius: 3px;
+ }
+ }
+
+ .pika-week {
+ font-size: 11px;
+ color: $pd-week-color;
+ }
+
+ .is-inrange .pika-button {
+ background: #d5e9f7;
+ }
+
+ .is-startrange .pika-button {
+ color: var(--secondary);
+ background: #6cb31d;
+ box-shadow: none;
+ border-radius: 3px;
+ }
+
+ .is-endrange .pika-button {
+ color: var(--secondary);
+ background: var(--tertiary);
+ box-shadow: none;
+ border-radius: 3px;
+ }
+
+ // timepicker
+
+ .ui-timepicker-wrapper {
+ overflow-y: auto;
+ max-height: 150px;
+ width: 6.5em;
+ background: #fff;
+ border: 1px solid #ddd;
+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ outline: none;
+ z-index: 10001;
+ margin: 0;
+ }
+
+ .ui-timepicker-wrapper.ui-timepicker-with-duration {
+ width: 13em;
+ }
+
+ .ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-30,
+ .ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-60 {
+ width: 11em;
+ }
+
+ .ui-timepicker-list {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ }
+
+ .ui-timepicker-duration {
+ margin-left: 5px;
+ color: #888;
+ }
+
+ .ui-timepicker-list:hover .ui-timepicker-duration {
+ color: #888;
+ }
+
+ .ui-timepicker-list li {
+ padding: 3px 0 3px 5px;
+ cursor: pointer;
+ white-space: nowrap;
+ color: #000;
+ list-style: none;
+ margin: 0;
+ }
+
+ .ui-timepicker-list:hover .ui-timepicker-selected {
+ background: #fff;
+ color: #000;
+ }
+
+ li.ui-timepicker-selected,
+ .ui-timepicker-list li:hover,
+ .ui-timepicker-list .ui-timepicker-selected:hover {
+ background: #1980ec;
+ color: #fff;
+ }
+
+ li.ui-timepicker-selected .ui-timepicker-duration,
+ .ui-timepicker-list li:hover .ui-timepicker-duration {
+ color: #ccc;
+ }
+
+ .ui-timepicker-list li.ui-timepicker-disabled,
+ .ui-timepicker-list li.ui-timepicker-disabled:hover,
+ .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
+ color: #888;
+ cursor: default;
+ }
+
+ .ui-timepicker-list li.ui-timepicker-disabled:hover,
+ .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
+ background: #f2f2f2;
+ }
+}
diff --git a/assets/stylesheets/wizard/custom/field.scss b/assets/stylesheets/common/wizard/field.scss
similarity index 86%
rename from assets/stylesheets/wizard/custom/field.scss
rename to assets/stylesheets/common/wizard/field.scss
index cb6f0635..71f12d84 100644
--- a/assets/stylesheets/wizard/custom/field.scss
+++ b/assets/stylesheets/common/wizard/field.scss
@@ -1,4 +1,4 @@
-.custom-wizard {
+body.custom-wizard {
.wizard-field {
margin-bottom: 1em;
@@ -32,13 +32,8 @@
}
}
- &.invalid {
- textarea,
- input[type="text"],
- input[type="checkbox"],
- .select-kit {
- outline: 4px solid var(--danger);
- }
+ &.invalid .wizard-focusable {
+ outline: 4px solid var(--danger);
}
}
@@ -60,16 +55,22 @@
& > label.field-label {
order: 1;
font-weight: 400;
+ margin-bottom: 0;
}
& > .field-description {
margin-top: 0;
order: 2;
}
+
+ & > .field-label + .field-description {
+ margin-left: 0.5em;
+ }
}
.url-field input {
width: 100%;
+ max-width: 500px;
font-size: 1.1487em;
padding: 6px;
transition: border-color 0.5s;
@@ -127,7 +128,6 @@
input.date-picker {
font-size: 1.1487em;
padding: 6px;
- border: 1px solid var(--primary);
transition: border-color 0.5s;
}
@@ -136,13 +136,20 @@
position: absolute !important;
}
- .d-time-input .select-kit.combo-box .select-kit-header {
- font-size: 1.1487em;
- padding: 6px;
+ .d-time-input {
+ .select-kit.combo-box {
+ width: 90px;
+
+ .select-kit-header {
+ font-size: 1.1487em;
+ padding: 6px;
+ }
+ }
}
.d-date-time-input {
display: flex;
+ max-width: 350px;
}
.list-controls {
@@ -171,6 +178,7 @@
&:focus::placeholder {
color: transparent;
}
+ width: 100%;
}
}
diff --git a/assets/stylesheets/common/wizard/header.scss b/assets/stylesheets/common/wizard/header.scss
new file mode 100644
index 00000000..853323ab
--- /dev/null
+++ b/assets/stylesheets/common/wizard/header.scss
@@ -0,0 +1,10 @@
+body.custom-wizard {
+ .d-header,
+ .global-notice,
+ .create-topics-notice,
+ .top-notices-outlet,
+ .consent_banner,
+ .bootstrap-mode-notice {
+ display: none;
+ }
+}
diff --git a/assets/stylesheets/common/wizard/locations.scss b/assets/stylesheets/common/wizard/locations.scss
new file mode 100644
index 00000000..5a8b185c
--- /dev/null
+++ b/assets/stylesheets/common/wizard/locations.scss
@@ -0,0 +1,193 @@
+body.custom-wizard {
+ .location-form-instructions {
+ color: #919191;
+ margin: 5px 0;
+ font-size: 80%;
+ line-height: 1.4em;
+
+ a {
+ text-decoration: underline;
+ }
+ }
+
+ .location-form {
+ display: flex;
+ overflow: visible;
+
+ .title {
+ font-weight: 700;
+ }
+
+ .address {
+ padding-right: 20px;
+ }
+
+ .coordinates {
+ .control-group {
+ display: block;
+
+ .controls {
+ display: flex;
+ width: 100%;
+
+ input {
+ width: 100px;
+ }
+ }
+
+ .icon {
+ margin-left: 10px;
+ display: inline-block;
+ }
+ }
+
+ .icon img {
+ max-width: 30px;
+ }
+ }
+
+ .address + .coordinates {
+ border-left: 1px solid var(--primary-low);
+ padding-left: 20px;
+ }
+
+ .control-group {
+ display: inline-block;
+ vertical-align: top;
+ margin-right: 20px;
+ margin-top: 10px;
+ width: auto;
+
+ .instructions {
+ @extend .location-form-instructions;
+ }
+ }
+
+ .location-search {
+ display: block;
+ margin: 15px 0;
+ }
+
+ .geo-map {
+ height: 400px;
+ }
+ }
+
+ input.input-location,
+ div.input-location {
+ max-height: 150px;
+ background-color: var(--secondary);
+ box-shadow: none;
+ box-sizing: border-box;
+ margin: 0;
+ }
+
+ .input-location .select2-choice {
+ padding: 2px 5px;
+ }
+
+ .input-location.input-small {
+ width: 100px;
+ }
+
+ .location-selector-container {
+ position: relative;
+
+ .ac-wrap {
+ box-sizing: border-box;
+
+ .ac-loading {
+ position: absolute;
+ top: 7px;
+ right: 5px;
+ }
+
+ .item {
+ line-height: 1.6;
+ }
+
+ .autocomplete {
+ width: inherit;
+ left: 0 !important;
+ width: 100%;
+ top: 30px !important;
+ box-sizing: border-box;
+
+ li,
+ .no-results {
+ padding: 10px;
+ }
+
+ ul > label {
+ @extend .location-form-instructions;
+ padding: 0 5px;
+ }
+ }
+ }
+ }
+
+ .location-form-result {
+ cursor: pointer;
+ background-color: var(--secondary);
+ display: flex;
+
+ &:hover,
+ &.selected {
+ background-color: var(--tertiary);
+ color: white;
+
+ label {
+ color: white;
+ }
+ }
+
+ label {
+ flex: 1 1 auto;
+ margin-bottom: 0;
+ cursor: pointer;
+ }
+
+ i {
+ margin-right: 5px;
+ }
+ }
+
+ .location-results {
+ max-width: 550px;
+ position: relative;
+
+ .spinner {
+ position: absolute;
+ right: 50%;
+ top: 50%;
+ }
+
+ ul {
+ background-color: var(--primary-very-low);
+ border: 1px solid #e9e9e9;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ height: 95px;
+ overflow: scroll;
+ }
+
+ li {
+ padding: 6px 12px;
+ }
+
+ .no-results {
+ padding: 15px;
+ }
+
+ .default {
+ margin: 0 auto;
+ top: 50%;
+ transform: translateY(-50%);
+ position: absolute;
+ width: 100%;
+ text-align: center;
+ color: #919191;
+ }
+ }
+}
diff --git a/assets/stylesheets/common/wizard/mentionables.scss b/assets/stylesheets/common/wizard/mentionables.scss
new file mode 100644
index 00000000..9a49cfcf
--- /dev/null
+++ b/assets/stylesheets/common/wizard/mentionables.scss
@@ -0,0 +1,34 @@
+body.custom-wizard {
+ span.mentionable-item {
+ font-weight: bold;
+ }
+
+ a.mentionable-item span {
+ background-color: $primary-low;
+ padding: 3px;
+ border-radius: 3px;
+ color: $primary;
+ }
+
+ .ac-mentionable-item ul li a {
+ display: flex;
+ align-items: center;
+ }
+
+ .ac-mentionable-item-name {
+ padding-left: 0.5em;
+ }
+
+ .ac-mentionable-item-image {
+ width: 25px;
+ height: 25px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ img {
+ height: 100%;
+ object-fit: contain;
+ }
+ }
+}
diff --git a/assets/stylesheets/wizard/custom/mobile.scss b/assets/stylesheets/common/wizard/mobile.scss
similarity index 95%
rename from assets/stylesheets/wizard/custom/mobile.scss
rename to assets/stylesheets/common/wizard/mobile.scss
index 50435f7e..e0fa8a72 100644
--- a/assets/stylesheets/wizard/custom/mobile.scss
+++ b/assets/stylesheets/common/wizard/mobile.scss
@@ -1,4 +1,4 @@
-.custom-wizard {
+body.custom-wizard {
.wizard-step-form {
.wizard-btn {
margin: 0;
diff --git a/assets/stylesheets/wizard/custom/step.scss b/assets/stylesheets/common/wizard/step.scss
similarity index 95%
rename from assets/stylesheets/wizard/custom/step.scss
rename to assets/stylesheets/common/wizard/step.scss
index 8824c8a4..2820cfcb 100644
--- a/assets/stylesheets/wizard/custom/step.scss
+++ b/assets/stylesheets/common/wizard/step.scss
@@ -1,4 +1,4 @@
-.custom-wizard {
+body.custom-wizard .wizard-column {
.wizard-step-contents {
position: relative;
display: flex;
@@ -9,7 +9,7 @@
margin-bottom: 10px;
}
- .wizard-step-title {
+ h1.wizard-step-title {
flex: 0;
p {
@@ -17,7 +17,7 @@
}
}
- img.emoji {
+ .emoji {
width: 20px;
height: 20px;
vertical-align: middle;
@@ -29,7 +29,7 @@
p {
img {
- @extend img.emoji;
+ @extend .emoji;
}
}
diff --git a/assets/stylesheets/common/wizard/validators.scss b/assets/stylesheets/common/wizard/validators.scss
new file mode 100644
index 00000000..3161fff3
--- /dev/null
+++ b/assets/stylesheets/common/wizard/validators.scss
@@ -0,0 +1,42 @@
+body.custom-wizard {
+ .similar-topics-validator {
+ position: relative;
+ display: flex;
+
+ label {
+ min-height: 20px;
+ }
+ }
+
+ .wizard-similar-topics {
+ margin-left: 3px;
+
+ ul {
+ background-color: var(--tertiary-low);
+ padding: 5px;
+ margin: 0;
+ list-style: none;
+ position: absolute;
+ left: 0;
+ top: 25px;
+ box-shadow: shadow("dropdown");
+ width: 100%;
+ box-sizing: border-box;
+ z-index: 100;
+
+ .title {
+ color: var(--primary);
+ }
+
+ .blurb {
+ margin-left: 0.5em;
+ color: var(--primary-high);
+ font-size: $font-down-1;
+ }
+ }
+
+ .show-topics {
+ cursor: pointer;
+ }
+ }
+}
diff --git a/assets/stylesheets/common/wizard/wizard.scss b/assets/stylesheets/common/wizard/wizard.scss
new file mode 100644
index 00000000..0155bbab
--- /dev/null
+++ b/assets/stylesheets/common/wizard/wizard.scss
@@ -0,0 +1,167 @@
+body.custom-wizard {
+ background: var(--secondary);
+ color: var(--primary);
+ font-size: 1.1em;
+
+ .wizard-column {
+ position: relative;
+ z-index: 11;
+ background-color: var(--secondary);
+ box-shadow: 0 5px 10px rgba(var(--primary-rgb), 0.15);
+ box-sizing: border-box;
+ margin: 1.5em auto;
+ padding: 0;
+ max-width: 820px;
+ min-width: 280px;
+ width: 100%;
+ border: 1px solid var(--primary-low-mid);
+ border-radius: 5px;
+ margin: 0 auto 2.5em auto;
+
+ .wizard-field .input-area {
+ margin: 0.5em 0;
+ }
+
+ .wizard-column-contents {
+ padding: 1.2em;
+
+ h1 {
+ margin: 0;
+ }
+ }
+
+ .wizard-footer {
+ border-top: 1px solid var(--primary-low-mid);
+ background-color: var(--secondary);
+ padding: 0.5em;
+ border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px;
+ }
+
+ .wizard-progress {
+ border: 1px solid var(--tertiary-high);
+ width: 200px;
+ height: 1.4em;
+
+ div {
+ position: absolute;
+ height: 1.4em;
+ }
+
+ .white {
+ background: var(--secondary);
+ width: 200px;
+ z-index: 11;
+ }
+
+ .black {
+ background: var(--primary);
+ transition: width 0.3s;
+ z-index: 12;
+ }
+
+ span {
+ position: absolute;
+ font-size: var(--font-0);
+ mix-blend-mode: difference;
+ color: var(--secondary-or-primary);
+ z-index: 13;
+ left: 1.5em;
+ line-height: 1.4em;
+ }
+
+ .screen {
+ background-color: var(--tertiary-high);
+ mix-blend-mode: screen;
+ width: 200px;
+ z-index: 14;
+ }
+ }
+ }
+
+ .wizard-buttons > a,
+ .wizard-buttons > button,
+ .spinner {
+ display: inline-block;
+ vertical-align: middle;
+ }
+
+ .spinner.small {
+ margin-right: 10px;
+ }
+
+ .wizard-column .wizard-btn {
+ color: var(--primary);
+ background: var(--primary-low);
+ cursor: pointer;
+
+ &.primary,
+ &.next {
+ color: var(--secondary);
+ background: var(--tertiary);
+ }
+ }
+
+ .wizard-step-footer {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+
+ .wizard-btn.next {
+ min-width: 70px;
+
+ .d-icon-chevron-right {
+ margin-left: 0.25em;
+ font-size: 0.8em;
+ }
+ }
+
+ button.wizard-btn:last-child {
+ margin-right: 0;
+ }
+
+ button.wizard-btn.done,
+ button.wizard-btn.finish {
+ color: var(--secondary);
+ background-color: var(--success);
+
+ &:hover,
+ &:focus {
+ background-color: var(--success-hover);
+ }
+
+ &:active {
+ background-color: var(--success-medium);
+ }
+
+ &:disabled {
+ background-color: var(--success-low);
+ }
+ }
+ }
+
+ .wizard-column .action-link {
+ color: var(--tertiary);
+ }
+
+ .no-access-gutter {
+ margin-top: 10px;
+ display: flex;
+ justify-content: flex-end;
+ }
+}
+
+/* IE11 hacks */
+
+@media all and (-ms-high-contrast: none) {
+ body.custom-wizard {
+ div.wizard-step-contents {
+ display: block;
+ }
+
+ div.wizard-progress {
+ visibility: hidden;
+ }
+ }
+}
diff --git a/assets/stylesheets/wizard/custom/autocomplete.scss b/assets/stylesheets/wizard/custom/autocomplete.scss
deleted file mode 100644
index 0e3e73e4..00000000
--- a/assets/stylesheets/wizard/custom/autocomplete.scss
+++ /dev/null
@@ -1,176 +0,0 @@
-div.ac-wrap {
- overflow: visible;
- max-height: 150px;
- min-height: 34px;
- background-color: var(--secondary);
- border: 1px solid var(--primary-medium);
- padding: 5px 4px 1px 4px;
-
- div.item {
- float: left;
- margin-bottom: 4px;
- margin-right: 10px;
-
- span {
- height: 24px;
- display: inline-block;
- line-height: 20px;
- }
- }
-
- .ac-collapsed-button {
- float: left;
- border-radius: 20px;
- position: relative;
- top: -2px;
- margin-right: 10px;
- }
-
- input[type="text"] {
- border: 0;
- }
-
- .remove-link {
- margin-left: 4px;
- font-size: $font-down-1;
- line-height: $line-height-small;
- padding: 1px 3.5px;
- border-radius: 12px;
- box-sizing: border-box;
- border: 1px solid var(--primary-low);
-
- &:hover {
- background-color: var(--danger-low);
- border: 1px solid var(--danger-medium);
- text-decoration: none;
- color: var(--danger);
- }
- }
-}
-
-img.avatar {
- border-radius: 50%;
- vertical-align: middle;
-}
-
-.autocomplete {
- z-index: 999999;
- position: absolute;
- width: 240px;
- background-color: var(--secondary);
- border: 1px solid var(--primary-low);
-
- ul {
- list-style: none;
- padding: 0;
- margin: 0;
-
- li {
- .d-users {
- color: var(--primary-medium);
- padding: 0 2px;
- }
-
- border-bottom: 1px solid var(--primary-low);
-
- a {
- padding: 5px;
- display: block;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- font-size: 14px;
- text-decoration: none;
- color: var(--primary);
-
- img {
- margin-right: 5px;
- }
-
- span.username {
- color: var(--primary);
- vertical-align: middle;
- }
- span.name {
- font-size: $font-down-1;
- vertical-align: middle;
- margin-left: 5px;
- color: var(--primary);
- }
- &.selected {
- background-color: var(--tertiary);
- color: var(--secondary);
- }
- &:hover {
- background-color: var(--highlight-low);
- text-decoration: none;
- }
- }
- }
- }
-}
-
-.ac-wrap {
- box-sizing: border-box;
- position: relative;
-
- .ac-loading {
- position: absolute;
- top: 7px;
- right: 5px;
- }
-
- .item {
- line-height: 1.6;
- }
-
- .autocomplete {
- width: inherit;
- left: 0 !important;
- width: 100%;
- top: 30px !important;
- box-sizing: border-box;
-
- li,
- .no-results {
- padding: 10px;
- }
-
- ul > label {
- margin: 5px 0;
- padding: 0 5px;
- font-size: 80%;
- line-height: 1.4em;
-
- a {
- text-decoration: underline;
- }
- }
- }
-}
-
-.ac-form-result {
- cursor: pointer;
- background-color: var(--secondary);
- display: flex;
-
- &:hover,
- &.selected {
- background-color: var(--tertiary);
- color: white;
-
- label {
- color: white;
- }
- }
-
- label {
- flex: 1 1 auto;
- margin-bottom: 0;
- cursor: pointer;
- }
-
- i {
- margin-right: 5px;
- }
-}
diff --git a/assets/stylesheets/wizard/custom/badges.scss b/assets/stylesheets/wizard/custom/badges.scss
deleted file mode 100644
index 53a869c0..00000000
--- a/assets/stylesheets/wizard/custom/badges.scss
+++ /dev/null
@@ -1,130 +0,0 @@
-.badge-wrapper {
- font-size: $font-down-1;
- font-weight: bold;
- white-space: nowrap;
- position: relative;
- display: inline-flex;
- align-items: baseline;
-
- .badge-category {
- display: inline-flex;
- align-items: baseline;
-
- .category-name {
- text-overflow: ellipsis;
- overflow: hidden;
- }
-
- .d-icon {
- margin-right: 3px;
- width: 0.74em;
- height: 0.74em;
- color: inherit;
- }
- }
-
- &.bullet {
- margin-right: 8px;
-
- span.badge-category {
- color: var(--primary-high);
- overflow: hidden;
- text-overflow: ellipsis;
- .extra-info-wrapper & {
- color: var(--header_primary);
- }
- }
-
- .badge-category-parent-bg,
- .badge-category-bg {
- flex: 0 0 auto;
- width: 9px;
- height: 9px;
- margin-right: 5px;
- display: inline-block;
- }
-
- .badge-category-parent-bg {
- width: 5px;
- margin-right: 0;
- + .badge-category-bg {
- width: 5px;
- }
- }
-
- .d-icon {
- color: var(--primary-medium);
- }
- }
-
- &.box {
- margin-right: 5px;
- padding: 2px 4px 2px 4px;
- display: inline-flex;
-
- span {
- overflow: hidden;
- text-overflow: ellipsis;
-
- &.badge-category-bg,
- &.badge-category-parent-bg {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- }
-
- &.badge-category-parent-bg {
- width: calc(100% - 5px);
-
- & + .badge-category-bg {
- left: 5px;
- width: calc(100% - 5px);
-
- & + .badge-category {
- margin-left: 5px;
- }
- }
- }
-
- &.badge-category {
- position: relative;
- }
- }
-
- + .topic-header-extra {
- padding: 2px 4px 2px 4px;
- }
- }
-
- &.bar {
- margin-right: 5px;
-
- span.badge-category {
- color: var(--primary-high);
- padding: 1px 3px;
- overflow: hidden;
- text-overflow: ellipsis;
-
- .extra-info-wrapper & {
- color: var(--header_primary);
- }
- }
-
- .badge-category-parent-bg,
- .badge-category-bg {
- display: inline-block;
- padding: 0 1px;
-
- &:before {
- content: "\a0";
- }
- }
- }
-
- &.none {
- color: var(--primary-high);
- margin-right: 5px;
- }
-}
diff --git a/assets/stylesheets/wizard/custom/base.scss b/assets/stylesheets/wizard/custom/base.scss
deleted file mode 100644
index 39ab061a..00000000
--- a/assets/stylesheets/wizard/custom/base.scss
+++ /dev/null
@@ -1,90 +0,0 @@
-input {
- display: inline-block;
- padding: 4px 10px;
- margin-bottom: 9px;
- font-size: 1em;
- line-height: 1;
- color: var(--primary);
- background-color: var(--secondary);
- border: 1px solid var(--primary-medium);
- border-radius: 0;
- box-sizing: border-box;
-}
-
-textarea {
- height: auto;
- background-color: var(--secondary);
- border: 1px solid var(--primary-medium);
-
- &:focus {
- border-color: var(--tertiary);
- box-shadow: shadow("focus");
- outline: 0;
- }
-}
-
-input,
-select,
-textarea {
- color: var(--primary);
- caret-color: currentColor;
-
- &[class*="span"] {
- float: none;
- margin-left: 0;
- }
-
- &[disabled],
- &[readonly] {
- cursor: not-allowed;
- background-color: var(--primary-low);
- border-color: var(--primary-low);
- }
-
- &:focus:required:invalid {
- color: var(--danger);
- border-color: var(--danger);
- }
-
- &:focus:required:invalid:focus {
- border-color: var(--danger);
- box-shadow: shadow("focus-danger");
- }
-
- &[type="checkbox"] {
- margin-bottom: 0;
- margin-right: 10px;
- }
-}
-
-.spinner {
- margin: 20px auto 20px auto;
- position: relative;
- -webkit-animation: rotate-forever 1s infinite linear;
- animation: rotate-forever 1s infinite linear;
- height: 30px;
- width: 30px;
- border: 4px solid var(--primary-low-mid);
- border-right-color: transparent;
- border-radius: 50%;
-
- &.small {
- width: 10px;
- height: 10px;
- margin: 0;
- display: inline-block;
- }
-}
-
-@keyframes rotate-forever {
- 0% {
- transform: rotate(0deg);
- }
- 100% {
- transform: rotate(360deg);
- }
-}
-
-.body-length {
- text-align: right;
-}
diff --git a/assets/stylesheets/wizard/custom/composer.scss b/assets/stylesheets/wizard/custom/composer.scss
deleted file mode 100644
index aea17d63..00000000
--- a/assets/stylesheets/wizard/custom/composer.scss
+++ /dev/null
@@ -1,280 +0,0 @@
-.d-editor-container {
- display: flex;
- flex-grow: 1;
- max-width: 100%;
-}
-
-.d-editor-overlay {
- position: absolute;
- background-color: black;
- opacity: 0.8;
- z-index: z("modal", "overlay");
-}
-
-.d-editor-modals {
- position: absolute;
- z-index: z("modal", "content");
-}
-
-.d-editor {
- display: flex;
- flex-grow: 1;
- min-height: 0;
-}
-
-.d-editor .d-editor-modal {
- min-width: 400px;
- position: absolute;
- background-color: var(--secondary);
- border: 1px solid var(--primary);
- padding: 1em;
- top: 25px;
-
- @media screen and (max-width: 424px) {
- min-width: 300px;
- }
-
- input {
- width: 95%;
- }
- h3 {
- margin-bottom: 0.5em;
- }
-}
-
-.wizard-field-composer .wmd-controls {
- position: relative;
-}
-
-.wizard-field-composer.show-preview .d-editor-textarea-column {
- display: none;
-}
-
-.d-editor-textarea-wrapper,
-.d-editor-preview-wrapper {
- background-color: var(--secondary);
- border: 1px solid var(--primary-medium);
- flex: 1;
- max-width: unset;
-}
-
-.d-editor-textarea-wrapper {
- display: flex;
- flex-direction: column;
- position: relative;
-
- textarea {
- background: transparent;
- }
-}
-
-.d-editor-preview-wrapper {
- display: flex;
- flex-direction: column;
- margin-left: 0;
- overflow: auto;
- cursor: default;
- margin-top: unset;
- padding-top: unset;
-}
-
-.d-editor-button-bar {
- display: flex;
- align-items: center;
- border-bottom: none;
- min-height: 30px;
- padding-left: 3px;
- border-bottom: 1px solid var(--primary-low);
-
- button {
- background-color: transparent;
- color: var(--primary);
- }
-
- .btn:not(.no-text) {
- font-size: 1.1487em;
- }
-
- .btn.bold {
- font-weight: bolder;
- }
-
- .btn.italic {
- font-style: italic;
- }
-}
-
-.d-editor-spacer {
- width: 1px;
- height: 20px;
- margin: 0 5px;
- display: inline-block;
-}
-
-.d-editor-input,
-.d-editor-preview {
- box-sizing: border-box;
- flex: 1 1 100%;
- width: 100%;
- margin: 0;
- min-height: auto;
- word-wrap: break-word;
- -webkit-appearance: none;
- border-radius: 0;
- &:focus {
- box-shadow: none;
- border: 0;
- outline: 0;
- }
-}
-
-.d-editor-input {
- border: 0;
- padding: 10px;
- height: unset; // overrides core css
- overflow-x: hidden;
- resize: none;
-}
-
-.d-editor-preview {
- height: auto;
- padding: 10px;
-}
-
-.d-editor-plugin {
- display: flex;
- flex: 1 1;
- overflow: auto;
-}
-
-.composing-whisper .d-editor-preview {
- font-style: italic;
- color: var(--primary) !important;
-}
-
-.d-editor-preview > *:first-child {
- margin-top: 0;
-}
-
-.hide-preview .d-editor-preview-wrapper {
- display: none;
- flex: 0;
-}
-
-////
-
-.d-editor {
- min-height: 200px;
-
- .d-editor-input {
- resize: vertical;
- flex: initial;
- }
-
- textarea {
- min-height: calc(200px - 32px);
- }
-}
-
-.d-editor-modal.hidden {
- display: none;
-}
-
-.d-editor-button-bar .btn {
- border: none;
- font-size: 0.9em;
-}
-
-.wizard-composer-upload {
- display: none;
-}
-
-.wizard-composer-hyperlink {
- display: flex;
- justify-content: center;
- align-items: center;
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-color: rgba(var(--primary-rgb), 0.8);
-}
-
-.wizard-composer-hyperlink-contents {
- background-color: var(--secondary);
- padding: 20px;
-
- h3 {
- margin-top: 0;
- }
-
- .composer-link-url,
- .composer-link-name {
- display: block;
- min-width: 450px;
- }
-}
-
-.hide-hyperlink-box,
-.add-link {
- display: inline;
-}
-
-#file-uploading {
- position: absolute;
- bottom: 1px;
- right: 1px;
- padding: 10px;
- background-color: var(--secondary);
-}
-
-.bottom-bar {
- display: flex;
- justify-content: space-between;
- margin-top: 20px;
- align-items: center;
-}
-
-// Markdown table styles for wizard composer preview
-
-.cooked,
-.d-editor-preview {
- a.mention {
- display: inline-block; // https://bugzilla.mozilla.org/show_bug.cgi?id=1656119
- font-weight: bold;
- font-size: 0.93em;
- color: var(--primary-high-or-secondary-low);
- padding: 0 4px 1px;
- background: var(--primary-low);
- border-radius: 8px;
- }
-
- table {
- border-collapse: collapse;
-
- tr {
- border-bottom: 1px solid var(--primary-low);
- &.highlighted {
- animation: background-fade-highlight 2.5s ease-out;
- }
- }
-
- thead {
- th {
- text-align: left;
- padding: 0.5em;
- font-weight: bold;
- color: var(--primary);
- }
- }
-
- tbody {
- border-top: 3px solid var(--primary-low);
- }
-
- td {
- padding: 3px 3px 3px 0.5em;
- }
- }
-}
diff --git a/assets/stylesheets/wizard/custom/events.scss b/assets/stylesheets/wizard/custom/events.scss
deleted file mode 100644
index 747b68aa..00000000
--- a/assets/stylesheets/wizard/custom/events.scss
+++ /dev/null
@@ -1,514 +0,0 @@
-// event form
-
-.event-form {
- width: 585px;
- max-width: 80vw;
-
- .control {
- display: inline-flex;
- align-items: flex-start;
- min-height: 30px;
- margin-right: 20px;
-
- > input:first-child {
- margin-top: 10px !important;
- }
-
- > span:first-child {
- margin-top: 5px !important;
- }
-
- > input + span {
- margin-top: 5px;
- }
-
- &:last-of-type {
- margin-right: 0;
- }
-
- input[type="checkbox"] {
- margin: 0 10px 0 0;
- }
-
- input[type="number"] {
- width: 50px;
- margin: 0;
- min-height: 34px;
- border: 1px solid #e9e9e9;
- }
-
- &.full-width {
- flex: 1;
- }
-
- .select-kit,
- .ac-wrap {
- width: 100% !important;
- max-width: 330px;
- }
-
- .select-kit-body {
- width: 100% !important;
- max-width: 330px;
- }
- }
-
- .event-controls {
- margin-bottom: 20px;
- display: flex;
- align-items: flex-start;
- }
-
- .datetime-controls {
- display: flex;
- margin-bottom: 5px;
-
- .date-time-card {
- width: 270px;
- display: inline-block;
- text-align: left;
- }
-
- .start-card {
- border-left: 1px solid transparent;
- padding-right: 20px;
- }
-
- .end-card {
- border-left: 1px solid #eee;
- padding-left: 20px;
-
- &.disabled {
- span,
- label,
- .pika-label,
- .pika-table th,
- .pika-button,
- .pika-prev,
- .pika-next,
- input,
- .pika-lendar,
- .is-selected .pika-button {
- color: var(--primary-low);
- background-image: initial;
- background: initial;
- box-shadow: initial;
- cursor: default;
- pointer-events: none;
- }
-
- input,
- .pika-lendar {
- border: 1px solid var(--primary-low) !important;
- }
- }
- }
-
- .set-all-day {
- font-size: 1.2em;
- padding-bottom: 13px;
- }
-
- .sub-title {
- font-size: 1.2em;
- font-weight: bold;
- padding-bottom: 2px;
- padding-right: 10px;
- }
-
- .date-time-set {
- padding-top: 10px;
- display: flex;
- flex-direction: row;
-
- .date-area {
- order: 1;
- }
-
- .time-area {
- order: 2;
- margin-left: 10px;
-
- .modal-time {
- width: 127px;
- }
- }
-
- input {
- padding: 4px 10px;
- font-size: 1em;
- line-height: 1;
- color: var(--primary);
- border: 1px solid var(--primary-medium);
- min-height: 30px;
- width: 130px;
- margin: 10px 0;
- }
- }
-
- #date-container-start,
- #date-container-end {
- height: 250px;
- }
-
- .ui-timepicker-input {
- width: 105px;
- text-align: center;
- }
-
- .pika-single {
- position: relative !important;
- border: none;
- z-index: 100;
-
- .pika-lendar {
- border: 1px solid var(--primary-medium);
- padding: 14px;
- margin: 0;
- float: none;
- width: auto;
- }
- }
- }
-
- .rsvp-controls {
- .rsvp-container {
- display: flex;
- flex-flow: wrap;
- margin-top: 10px;
-
- .control span {
- margin-right: 10px;
- }
-
- .full-width {
- align-items: flex-start;
- }
- }
- }
-}
-
-// datepicker
-
-/*!
- * Pikaday
- * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/
- */
-
-// Variables
-// Declare any of these variables before importing this SCSS file to easily override defaults
-// Variables are namespaced with the pd (pikaday) prefix
-
-// Colours
-$pd-text-color: var(--primary) !default;
-$pd-title-color: var(--primary) !default;
-$pd-title-bg: var(--secondary) !default;
-$pd-picker-bg: var(--secondary) !default;
-$pd-picker-border: var(--primary-low) !default;
-$pd-picker-border-bottom: var(--primary-low) !default;
-$pd-picker-shadow: rgba(0, 0, 0, 0.5) !default;
-$pd-th-color: var(--primary) !default;
-$pd-day-color: var(--primary) !default;
-$pd-day-bg: var(--secondary) !default;
-$pd-day-hover-color: var(--primary) !default;
-$pd-day-hover-bg: var(--tertiary-low) !default;
-$pd-day-today-color: var(--tertiary) !default;
-$pd-day-selected-color: var(--secondary) !default;
-$pd-day-selected-bg: var(--tertiary) !default;
-$pd-day-selected-shadow: var(--tertiary-low) !default;
-$pd-day-disabled-color: var(--primary) !default;
-$pd-week-color: var(--primary) !default;
-
-// Font
-$pd-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !default;
-
-.pika-single {
- z-index: 9999;
- display: block;
- position: relative;
- color: $pd-text-color;
- background: $pd-picker-bg;
- border: 1px solid $pd-picker-border;
- border-bottom-color: $pd-picker-border-bottom;
- font-family: $pd-font-family;
-
- &.is-hidden {
- display: none;
- }
-
- &.is-bound {
- position: absolute;
- box-shadow: 0 5px 15px -5px $pd-picker-shadow;
- }
-}
-
-// clear child float (pika-lendar), using the famous micro clearfix hack
-// http://nicolasgallagher.com/micro-clearfix-hack/
-.pika-single {
- &:before,
- &:after {
- content: " ";
- display: table;
- }
-
- &:after {
- clear: both;
- }
-}
-
-.pika-lendar {
- float: left;
- width: 240px;
- margin: 8px;
-}
-
-.pika-title {
- position: relative;
- text-align: center;
-
- select {
- cursor: pointer;
- position: absolute;
- z-index: 9998;
- margin: 0;
- left: 0;
- top: 5px;
- filter: alpha(opacity=0);
- opacity: 0;
- }
-}
-
-.pika-label {
- display: inline-block;
- position: relative;
- z-index: 9999;
- overflow: hidden;
- margin: 0;
- padding: 5px 3px;
- font-size: 14px;
- line-height: 20px;
- font-weight: bold;
- color: $pd-title-color;
- background-color: $pd-title-bg;
-}
-
-.pika-prev,
-.pika-next {
- display: block;
- cursor: pointer;
- position: relative;
- outline: none;
- border: 0;
- padding: 0;
- width: 20px;
- height: 30px;
- text-indent: 20px; // hide text using text-indent trick, using width value (it's enough)
- white-space: nowrap;
- overflow: hidden;
- background-color: transparent;
- background-position: center center;
- background-repeat: no-repeat;
- background-size: 75% 75%;
- opacity: 0.5;
- @if (lightness($secondary) < 50) {
- // invert the black png if the background is dark
- filter: invert(1);
- }
-
- &:hover {
- opacity: 1;
- }
-
- &.is-disabled {
- cursor: default;
- opacity: 0.2;
- }
-}
-
-.pika-prev,
-.is-rtl .pika-next {
- float: left;
- background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==");
-}
-
-.pika-next,
-.is-rtl .pika-prev {
- float: right;
- background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=");
-}
-
-.pika-select {
- display: inline-block;
-}
-
-.pika-table {
- width: 100%;
- border-collapse: collapse;
- border-spacing: 0;
- border: 0;
-
- th,
- td {
- width: 14.285714285714286%;
- padding: 0;
- }
-
- th {
- color: $pd-th-color;
- font-size: 12px;
- line-height: 25px;
- font-weight: bold;
- text-align: center;
- }
-
- abbr {
- border-bottom: none;
- cursor: help;
- }
-}
-
-.pika-button {
- cursor: pointer;
- display: block;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- outline: none;
- border: 0;
- margin: 0;
- width: 100%;
- padding: 5px;
- color: $pd-day-color;
- font-size: 12px;
- line-height: 15px;
- text-align: right;
- background: $pd-day-bg;
-
- .is-today & {
- color: $pd-day-today-color;
- font-weight: bold;
- }
-
- .is-selected & {
- color: $pd-day-selected-color;
- font-weight: bold;
- background: $pd-day-selected-bg;
- box-shadow: inset 0 1px 3px $pd-day-selected-shadow;
- border-radius: 3px;
- }
-
- .is-disabled &,
- .is-outside-current-month & {
- pointer-events: none;
- cursor: default;
- color: $pd-day-disabled-color;
- opacity: 0.3;
- }
-
- &:hover {
- color: $pd-day-hover-color;
- background: $pd-day-hover-bg;
- box-shadow: none;
- border-radius: 3px;
- }
-}
-
-.pika-week {
- font-size: 11px;
- color: $pd-week-color;
-}
-
-.is-inrange .pika-button {
- background: #d5e9f7;
-}
-
-.is-startrange .pika-button {
- color: var(--secondary);
- background: #6cb31d;
- box-shadow: none;
- border-radius: 3px;
-}
-
-.is-endrange .pika-button {
- color: var(--secondary);
- background: var(--tertiary);
- box-shadow: none;
- border-radius: 3px;
-}
-
-// timepicker
-
-.ui-timepicker-wrapper {
- overflow-y: auto;
- max-height: 150px;
- width: 6.5em;
- background: #fff;
- border: 1px solid #ddd;
- -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- outline: none;
- z-index: 10001;
- margin: 0;
-}
-
-.ui-timepicker-wrapper.ui-timepicker-with-duration {
- width: 13em;
-}
-
-.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-30,
-.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-60 {
- width: 11em;
-}
-
-.ui-timepicker-list {
- margin: 0;
- padding: 0;
- list-style: none;
-}
-
-.ui-timepicker-duration {
- margin-left: 5px;
- color: #888;
-}
-
-.ui-timepicker-list:hover .ui-timepicker-duration {
- color: #888;
-}
-
-.ui-timepicker-list li {
- padding: 3px 0 3px 5px;
- cursor: pointer;
- white-space: nowrap;
- color: #000;
- list-style: none;
- margin: 0;
-}
-
-.ui-timepicker-list:hover .ui-timepicker-selected {
- background: #fff;
- color: #000;
-}
-
-li.ui-timepicker-selected,
-.ui-timepicker-list li:hover,
-.ui-timepicker-list .ui-timepicker-selected:hover {
- background: #1980ec;
- color: #fff;
-}
-
-li.ui-timepicker-selected .ui-timepicker-duration,
-.ui-timepicker-list li:hover .ui-timepicker-duration {
- color: #ccc;
-}
-
-.ui-timepicker-list li.ui-timepicker-disabled,
-.ui-timepicker-list li.ui-timepicker-disabled:hover,
-.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
- color: #888;
- cursor: default;
-}
-
-.ui-timepicker-list li.ui-timepicker-disabled:hover,
-.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
- background: #f2f2f2;
-}
diff --git a/assets/stylesheets/wizard/custom/locations.scss b/assets/stylesheets/wizard/custom/locations.scss
deleted file mode 100644
index 9a2f74ec..00000000
--- a/assets/stylesheets/wizard/custom/locations.scss
+++ /dev/null
@@ -1,191 +0,0 @@
-.location-form-instructions {
- color: #919191;
- margin: 5px 0;
- font-size: 80%;
- line-height: 1.4em;
-
- a {
- text-decoration: underline;
- }
-}
-
-.location-form {
- display: flex;
- overflow: visible;
-
- .title {
- font-weight: 700;
- }
-
- .address {
- padding-right: 20px;
- }
-
- .coordinates {
- .control-group {
- display: block;
-
- .controls {
- display: flex;
- width: 100%;
-
- input {
- width: 100px;
- }
- }
-
- .icon {
- margin-left: 10px;
- display: inline-block;
- }
- }
-
- .icon img {
- max-width: 30px;
- }
- }
-
- .address + .coordinates {
- border-left: 1px solid var(--primary-low);
- padding-left: 20px;
- }
-
- .control-group {
- display: inline-block;
- vertical-align: top;
- margin-right: 20px;
- margin-top: 10px;
- width: auto;
-
- .instructions {
- @extend .location-form-instructions;
- }
- }
-
- .location-search {
- display: block;
- margin: 15px 0;
- }
-
- .geo-map {
- height: 400px;
- }
-}
-
-input.input-location,
-div.input-location {
- max-height: 150px;
- background-color: var(--secondary);
- box-shadow: none;
- box-sizing: border-box;
- margin: 0;
-}
-
-.input-location .select2-choice {
- padding: 2px 5px;
-}
-
-.input-location.input-small {
- width: 100px;
-}
-
-.location-selector-container {
- position: relative;
-
- .ac-wrap {
- box-sizing: border-box;
-
- .ac-loading {
- position: absolute;
- top: 7px;
- right: 5px;
- }
-
- .item {
- line-height: 1.6;
- }
-
- .autocomplete {
- width: inherit;
- left: 0 !important;
- width: 100%;
- top: 30px !important;
- box-sizing: border-box;
-
- li,
- .no-results {
- padding: 10px;
- }
-
- ul > label {
- @extend .location-form-instructions;
- padding: 0 5px;
- }
- }
- }
-}
-
-.location-form-result {
- cursor: pointer;
- background-color: var(--secondary);
- display: flex;
-
- &:hover,
- &.selected {
- background-color: var(--tertiary);
- color: white;
-
- label {
- color: white;
- }
- }
-
- label {
- flex: 1 1 auto;
- margin-bottom: 0;
- cursor: pointer;
- }
-
- i {
- margin-right: 5px;
- }
-}
-
-.location-results {
- max-width: 550px;
- position: relative;
-
- .spinner {
- position: absolute;
- right: 50%;
- top: 50%;
- }
-
- ul {
- background-color: var(--primary-very-low);
- border: 1px solid #e9e9e9;
- margin: 0;
- padding: 0;
- list-style: none;
- height: 95px;
- overflow: scroll;
- }
-
- li {
- padding: 6px 12px;
- }
-
- .no-results {
- padding: 15px;
- }
-
- .default {
- margin: 0 auto;
- top: 50%;
- transform: translateY(-50%);
- position: absolute;
- width: 100%;
- text-align: center;
- color: #919191;
- }
-}
diff --git a/assets/stylesheets/wizard/custom/mentionables.scss b/assets/stylesheets/wizard/custom/mentionables.scss
deleted file mode 100644
index 6e60f4e7..00000000
--- a/assets/stylesheets/wizard/custom/mentionables.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-span.mentionable-item {
- font-weight: bold;
-}
-
-a.mentionable-item span {
- background-color: $primary-low;
- padding: 3px;
- border-radius: 3px;
- color: $primary;
-}
-
-.ac-mentionable-item ul li a {
- display: flex;
- align-items: center;
-}
-
-.ac-mentionable-item-name {
- padding-left: 0.5em;
-}
-
-.ac-mentionable-item-image {
- width: 25px;
- height: 25px;
- display: flex;
- align-items: center;
- justify-content: center;
-
- img {
- height: 100%;
- object-fit: contain;
- }
-}
diff --git a/assets/stylesheets/wizard/custom/validators.scss b/assets/stylesheets/wizard/custom/validators.scss
deleted file mode 100644
index 93368e70..00000000
--- a/assets/stylesheets/wizard/custom/validators.scss
+++ /dev/null
@@ -1,40 +0,0 @@
-.similar-topics-validator {
- position: relative;
- display: flex;
-
- label {
- min-height: 20px;
- }
-}
-
-.wizard-similar-topics {
- margin-left: 3px;
-
- ul {
- background-color: var(--tertiary-low);
- padding: 5px;
- margin: 0;
- list-style: none;
- position: absolute;
- left: 0;
- top: 25px;
- box-shadow: shadow("dropdown");
- width: 100%;
- box-sizing: border-box;
- z-index: 100;
-
- .title {
- color: var(--primary);
- }
-
- .blurb {
- margin-left: 0.5em;
- color: var(--primary-high);
- font-size: $font-down-1;
- }
- }
-
- .show-topics {
- cursor: pointer;
- }
-}
diff --git a/assets/stylesheets/wizard/custom/wizard.scss b/assets/stylesheets/wizard/custom/wizard.scss
deleted file mode 100644
index e6102ac4..00000000
--- a/assets/stylesheets/wizard/custom/wizard.scss
+++ /dev/null
@@ -1,74 +0,0 @@
-.custom-wizard {
- background-color: var(--secondary);
- color: var(--primary);
- font-size: 1.1em;
-
- .wizard-column {
- background-color: var(--secondary);
-
- .wizard-field .input-area {
- margin: 0.5em 0;
- }
-
- .wizard-column-contents h1 {
- margin: 0;
- }
-
- .wizard-footer {
- background-color: var(--secondary);
- }
- }
-
- .wizard-buttons > a,
- .wizard-buttons > button,
- .spinner {
- display: inline-block;
- vertical-align: middle;
- }
-
- .spinner.small {
- margin-right: 10px;
- }
-
- .wizard-column .wizard-btn {
- color: var(--primary);
- background: var(--primary-low);
- cursor: pointer;
-
- &.primary,
- &.next {
- color: var(--secondary);
- background: var(--tertiary);
- }
- }
-
- .wizard-column .wizard-step-footer button.wizard-btn.done,
- .wizard-column .wizard-step-footer button.wizard-btn.finish {
- color: var(--secondary);
- background-color: var(--success);
- }
-
- .wizard-column .action-link {
- color: var(--tertiary);
- }
-}
-
-.no-access-gutter {
- margin-top: 10px;
- display: flex;
- justify-content: flex-end;
-}
-
-/* IE11 hacks */
-
-@media all and (-ms-high-contrast: none) {
- .custom-wizard {
- div.wizard-step-contents {
- display: block;
- }
-
- div.wizard-progress {
- visibility: hidden;
- }
- }
-}
diff --git a/assets/stylesheets/wizard/wizard_custom.scss b/assets/stylesheets/wizard/wizard_custom.scss
deleted file mode 100644
index 6c91385f..00000000
--- a/assets/stylesheets/wizard/wizard_custom.scss
+++ /dev/null
@@ -1,23 +0,0 @@
-@import "common/foundation/colors";
-@import "common/foundation/variables";
-@import "common/foundation/base";
-@import "common/base/code_highlighting";
-@import "common/base/modal";
-@import "common/base/onebox";
-@import "common/components/buttons";
-@import "common/d-editor";
-@import "desktop/modal";
-@import "common/input_tip";
-
-@import "custom/base";
-@import "custom/wizard";
-@import "custom/step";
-@import "custom/badges";
-@import "custom/field";
-@import "custom/validators";
-@import "custom/mobile";
-@import "custom/autocomplete";
-@import "custom/composer";
-@import "custom/events";
-@import "custom/locations";
-@import "custom/mentionables";
diff --git a/config/locales/client.af.yml b/config/locales/client.af.yml
index 2f399b99..4804ab40 100644
--- a/config/locales/client.af.yml
+++ b/config/locales/client.af.yml
@@ -2,6 +2,72 @@ af:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ af:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ af:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml
index b7253bba..d3697d19 100644
--- a/config/locales/client.ar.yml
+++ b/config/locales/client.ar.yml
@@ -2,6 +2,76 @@ ar:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ zero: "%{count} Characters"
+ one: "%{count} Character"
+ two: "%{count} Characters"
+ few: "%{count} Characters"
+ many: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +249,7 @@ ar:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,86 +529,3 @@ ar:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- zero: "You can only select {{count}} items."
- one: "You can only select {{count}} item."
- two: "You can only select {{count}} items."
- few: "You can only select {{count}} items."
- many: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- zero: "Select at least {{count}} items."
- one: "Select at least {{count}} item."
- two: "Select at least {{count}} items."
- few: "Select at least {{count}} items."
- many: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- zero: "%{count} Characters"
- one: "%{count} Character"
- two: "%{count} Characters"
- few: "%{count} Characters"
- many: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.az.yml b/config/locales/client.az.yml
index 990f6a37..4d64c550 100644
--- a/config/locales/client.az.yml
+++ b/config/locales/client.az.yml
@@ -2,6 +2,72 @@ az:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ az:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ az:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.be.yml b/config/locales/client.be.yml
index f6fd6764..56e1bcef 100644
--- a/config/locales/client.be.yml
+++ b/config/locales/client.be.yml
@@ -2,6 +2,74 @@ be:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ few: "%{count} Characters"
+ many: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +247,7 @@ be:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,80 +527,3 @@ be:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- few: "You can only select {{count}} items."
- many: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- few: "Select at least {{count}} items."
- many: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- few: "%{count} Characters"
- many: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.bg.yml b/config/locales/client.bg.yml
index 058baf4d..310f38ad 100644
--- a/config/locales/client.bg.yml
+++ b/config/locales/client.bg.yml
@@ -2,6 +2,72 @@ bg:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ bg:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ bg:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.bn.yml b/config/locales/client.bn.yml
index ca21e418..0bac0853 100644
--- a/config/locales/client.bn.yml
+++ b/config/locales/client.bn.yml
@@ -2,6 +2,72 @@ bn:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ bn:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ bn:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.bo.yml b/config/locales/client.bo.yml
index cd8c7924..46693e31 100644
--- a/config/locales/client.bo.yml
+++ b/config/locales/client.bo.yml
@@ -2,6 +2,71 @@ bo:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +244,7 @@ bo:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,71 +524,3 @@ bo:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- other: "You can only select {{count}} items."
- min_content_not_reached:
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.bs.yml b/config/locales/client.bs.yml
index e188aece..383eb399 100644
--- a/config/locales/client.bs.yml
+++ b/config/locales/client.bs.yml
@@ -2,6 +2,73 @@ bs:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ few: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +246,7 @@ bs:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,77 +526,3 @@ bs:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- few: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- few: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- few: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.ca.yml b/config/locales/client.ca.yml
index 7d80c17b..9133e0c5 100644
--- a/config/locales/client.ca.yml
+++ b/config/locales/client.ca.yml
@@ -2,6 +2,72 @@ ca:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ ca:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ ca:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.cs.yml b/config/locales/client.cs.yml
index 018e4236..4f189a44 100644
--- a/config/locales/client.cs.yml
+++ b/config/locales/client.cs.yml
@@ -2,6 +2,74 @@ cs:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ few: "%{count} Characters"
+ many: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +247,7 @@ cs:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,80 +527,3 @@ cs:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- few: "You can only select {{count}} items."
- many: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- few: "Select at least {{count}} items."
- many: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- few: "%{count} Characters"
- many: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.cy.yml b/config/locales/client.cy.yml
index 4510470b..17b2cbf6 100644
--- a/config/locales/client.cy.yml
+++ b/config/locales/client.cy.yml
@@ -2,6 +2,76 @@ cy:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ zero: "%{count} Characters"
+ one: "%{count} Character"
+ two: "%{count} Characters"
+ few: "%{count} Characters"
+ many: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +249,7 @@ cy:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,86 +529,3 @@ cy:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- zero: "You can only select {{count}} items."
- one: "You can only select {{count}} item."
- two: "You can only select {{count}} items."
- few: "You can only select {{count}} items."
- many: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- zero: "Select at least {{count}} items."
- one: "Select at least {{count}} item."
- two: "Select at least {{count}} items."
- few: "Select at least {{count}} items."
- many: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- zero: "%{count} Characters"
- one: "%{count} Character"
- two: "%{count} Characters"
- few: "%{count} Characters"
- many: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml
index 4b254517..68bda517 100644
--- a/config/locales/client.da.yml
+++ b/config/locales/client.da.yml
@@ -2,6 +2,72 @@ da:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ da:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ da:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml
index a69bf37f..6fa16a05 100644
--- a/config/locales/client.de.yml
+++ b/config/locales/client.de.yml
@@ -1,224 +1,291 @@
de:
js:
wizard:
- complete_custom: "Complete the {{name}}"
+ complete_custom: "Schließe {{name}} ab"
+ completed: "Du hast diesen Assistenten abgeschlossen."
+ not_permitted: "Du bist nicht berechtigt, auf diesen Assistenten zuzugreifen."
+ none: "Es gibt hier keinen Assistenten."
+ return_to_site: "Zurück zu {{siteName}}"
+ requires_login: "Du musst eingeloggt sein, um auf diesen Assistenten zuzugreifen."
+ reset: "Diesen Assistenten zurücksetzen."
+ step_not_permitted: "Du bist nicht berechtigt, diesen Schritt anzusehen."
+ incomplete_submission:
+ title: "Den gespeicherten Entwurf vom %{date} fortsetzen?"
+ resume: "Weiter"
+ restart: "Neu beginnen"
+ x_characters:
+ one: "%{count} Zeichen"
+ other: "%{count} Zeichen"
+ quit: "Vielleicht später"
+ done_custom: "Fertig"
+ back: "Zurück"
+ next: "Weiter"
+ step: "%{current} von %{total}"
+ upload: "Hochladen"
+ uploading: "Hochladen..."
+ upload_error: "Leider ist ein Fehler beim Hochladen der Datei aufgetreten. Bitte versuche es erneut."
+ wizard_composer:
+ show_preview: "Beitrags-Vorschau"
+ hide_preview: "Beitrag bearbeiten"
+ quote_post_title: "Gesamten Beitrag zitieren"
+ bold_label: "B"
+ bold_title: "Fett"
+ bold_text: "fett gedruckter Text"
+ italic_label: "I"
+ italic_title: "Hervorhebung"
+ italic_text: "hervorgehobener Text"
+ link_title: "Hyperlink"
+ link_description: "hier Linkbeschreibung eingeben"
+ link_dialog_title: "Hyperlink einfügen"
+ link_optional_text: "optionaler Titel"
+ link_url_placeholder: "http://beispiel.com"
+ quote_title: "Blockzitat"
+ quote_text: "Blockzitat"
+ blockquote_text: "Blockzitat"
+ code_title: "Vorformatierter Text"
+ code_text: "vorformatierten Text mit 4 Leerzeichen einrücken"
+ paste_code_text: "tippe oder füge den Code hier ein"
+ upload_title: "Hochladen"
+ upload_description: "gib hier eine Beschreibung des Uploads ein"
+ olist_title: "Nummerierte Liste"
+ ulist_title: "Aufzählung"
+ list_item: "Listen-Element"
+ toggle_direction: "Richtung wechseln"
+ help: "Hilfe zur Markdown-Bearbeitung"
+ collapse: "den Editor minimieren"
+ abandon: "Editor schließen und Entwurf verwerfen"
+ modal_ok: "OK"
+ modal_cancel: "Abbrechen"
+ cant_send_pm: "Sorry, Du kannst keine Nachricht an %{username} senden."
+ yourself_confirm:
+ title: "Hast du vergessen Empfänger hinzuzufügen?"
+ body: "Aktuell wird diese Nachricht nur an dich selber versendet!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Gib mindestens 5 Zeichen ein, um nach ähnlichen Themen zu suchen"
+ insufficient_characters_categories: "Gib mindestens 5 Zeichen ein, um in %{catLinks} nach ähnlichen Themen zu suchen"
+ results: "Dein Thema hat Ähnlichkeit mit..."
+ no_results: "Keine ähnlichen Themen."
+ loading: "Suche nach ähnlichen Themen..."
+ show: "zeigen"
admin_js:
admin:
wizard:
- label: "Wizard"
- nav_label: "Wizards"
- select: "Select a wizard"
- create: "Create Wizard"
+ label: "Assistent"
+ nav_label: "Assistenten"
+ select: "Assistent auswählen"
+ create: "Assistent erstellen"
name: "Name"
- name_placeholder: "wizard name"
- background: "Background"
+ name_placeholder: "Assistenten Name"
+ background: "Hintergrund"
background_placeholder: "#hex"
- save_submissions: "Save"
- save_submissions_label: "Save wizard submissions."
- multiple_submissions: "Multiple"
- multiple_submissions_label: "Users can submit multiple times."
- after_signup: "Signup"
- after_signup_label: "Users directed to wizard after signup."
- after_time: "Time"
- after_time_label: "Users directed to wizard after start time:"
- after_time_time_label: "Start Time"
+ save_submissions: "Speichern"
+ save_submissions_label: "Wizard Einreichungen speichern."
+ multiple_submissions: "Mehrere"
+ multiple_submissions_label: "Benutzer können mehrmals einreichen."
+ after_signup: "Anmelden"
+ after_signup_label: "Benutzer, die nach der Anmeldung an den Assistenten weitergeleitet werden."
+ after_time: "Uhrzeit"
+ after_time_label: "Benutzer, die nach der Startzeit an den Assistenten weitergeleitet werden:"
+ after_time_time_label: "Startzeit"
after_time_modal:
- title: "Wizard Start Time"
- date: "Date"
- time: "Time"
- done: "Set Time"
- clear: "Clear"
- required: "Required"
- required_label: "Users cannot skip the wizard."
- prompt_completion: "Prompt"
- prompt_completion_label: "Prompt user to complete wizard."
- restart_on_revisit: "Restart"
- restart_on_revisit_label: "Clear submissions on each visit."
- resume_on_revisit: "Resume"
- resume_on_revisit_label: "Ask the user if they want to resume on each visit."
+ title: "Assistent Startzeit"
+ date: "Datum"
+ time: "Uhrzeit"
+ done: "Uhrzeit festlegen"
+ clear: "Leeren"
+ required: "Erforderlich"
+ required_label: "Benutzer können den Assistenten nicht überspringen."
+ prompt_completion: "Aufforderung"
+ prompt_completion_label: "Den Benutzer zum Vervollständigen des Assistenten auffordern."
+ restart_on_revisit: "Neustart"
+ restart_on_revisit_label: "Einreichungen bei jedem Besuch löschen."
+ resume_on_revisit: "Fortsetzen"
+ resume_on_revisit_label: "Frage den Benutzer, ob er bei jedem Besuch fortfahren möchte."
theme_id: "Theme"
- no_theme: "Select a Theme (optional)"
- save: "Save Changes"
- remove: "Delete Wizard"
- add: "Add"
+ no_theme: "Wählen Sie ein Theme (optional)"
+ save: "Änderungen speichern"
+ remove: "Assistent löschen"
+ add: "Hinzufügen"
url: "Url"
- key: "Key"
- value: "Value"
- profile: "profile"
- translation: "Translation"
- translation_placeholder: "key"
- type: "Type"
- none: "Make a selection"
- submission_key: 'submission key'
- param_key: 'param'
- group: "Group"
- permitted: "Permitted"
- advanced: "Advanced"
- undo: "Undo"
- clear: "Clear"
- select_type: "Select a type"
- condition: "Condition"
+ key: "Schlüssel"
+ value: "Wert"
+ profile: "Profil"
+ translation: "Übersetzung"
+ translation_placeholder: "Schlüssel"
+ type: "Typ"
+ none: "Wähle aus"
+ submission_key: 'Einreichungsschlüssel'
+ param_key: 'Parameter'
+ group: "Gruppe"
+ permitted: "Zulässig"
+ advanced: "Erweitert"
+ undo: "Rückgängig"
+ clear: "Leeren"
+ select_type: "Wähle einen Typ"
+ condition: "Bedingung"
index: "Index"
category_settings:
custom_wizard:
- title: "Custom Wizard"
- create_topic_wizard: "Select a wizard to replace the new topic composer in this category."
+ title: "Benutzerdefinierter Assistent"
+ create_topic_wizard: "Wähle einen Assistenten, um den neuen Themen-Komponisten in dieser Kategorie zu ersetzen."
message:
wizard:
- select: "Select a wizard, or create a new one"
- edit: "You're editing a wizard"
- create: "You're creating a new wizard"
- documentation: "Check out the wizard documentation"
- contact: "Contact the developer"
+ select: "Wähle einen Assistenten oder erstelle einen neuen"
+ edit: "Du bearbeitest einen Assistenten"
+ create: "Du erstellst einen neuen Assistenten"
+ documentation: "Schau dir die Assistenten-Dokumentation an"
+ contact: "Kontaktiere den Entwickler"
field:
- type: "Select a field type"
- edit: "You're editing a field"
- documentation: "Check out the field documentation"
+ type: "Feldtyp auswählen"
+ edit: "Du bearbeitest ein Feld"
+ documentation: "Sieh Dir die Feld-Dokumentation an"
action:
- type: "Select an action type"
- edit: "You're editing an action"
- documentation: "Check out the action documentation"
+ type: "Wähle einen Aktionstyp"
+ edit: "Du bearbeitest eine Aktion"
+ documentation: "Sieh Dir die Aktions-Dokumentation an"
custom_fields:
- create: "View, create, edit and destroy custom fields"
- saved: "Saved custom field"
- error: "Failed to save: {{messages}}"
- documentation: Check out the custom field documentation
+ create: "Benutzerdefinierte Felder ansehen, erstellen, bearbeiten und löschen"
+ saved: "Benutzerdefiniertes Feld gespeichert"
+ error: "Speichern fehlgeschlagen: {{messages}}"
+ documentation: Sieh Dir die benutzerdefinierte Felddokumentation an
manager:
- info: "Export, import or destroy wizards"
- documentation: Check out the manager documentation
- none_selected: Please select atleast one wizard
- no_file: Please choose a file to import
- file_size_error: The file size must be 512kb or less
- file_format_error: The file must be a .json file
- server_error: "Error: {{message}}"
- importing: Importing wizards...
- destroying: Destroying wizards...
- import_complete: Import complete
- destroy_complete: Destruction complete
+ info: "Assistenten exportieren, importieren oder löschen"
+ documentation: Sieh Dir die Manager-Dokumentation an
+ none_selected: Bitte wählen Sie mindestens einen gültigen Assistenten aus
+ no_file: Bitte wähle eine zu importierende Datei aus
+ file_size_error: Die Dateigröße muss 512kb oder kleiner sein
+ file_format_error: Die Datei muss eine .json Datei sein
+ server_error: "Fehler: {{message}}"
+ importing: Assistenten werden importiert...
+ destroying: Zerstöre Assistenten...
+ import_complete: Import abgeschlossen
+ destroy_complete: Zerstörung abgeschlossen
editor:
- show: "Show"
- hide: "Hide"
- preview: "{{action}} Preview"
- popover: "{{action}} Fields"
+ show: "Zeigen"
+ hide: "Verstecken"
+ preview: "{{action}} Vorschau"
+ popover: "{{action}} Felder"
input:
conditional:
- name: 'if'
- output: 'then'
+ name: 'wenn'
+ output: 'dann'
assignment:
- name: 'set'
+ name: 'setzen'
association:
- name: 'map'
+ name: 'mappen'
validation:
- name: 'ensure'
+ name: 'sicherstellen'
selector:
label:
- text: "text"
- wizard_field: "wizard field"
- wizard_action: "wizard action"
- user_field: "user field"
- user_field_options: "user field options"
- user: "user"
- category: "category"
- tag: "tag"
- group: "group"
- list: "list"
- custom_field: "custom field"
- value: "value"
+ text: "Text"
+ wizard_field: "Assistenten Feld"
+ wizard_action: "Assistenten-Aktion"
+ user_field: "Benutzerfeld"
+ user_field_options: "Benutzerfeld-Optionen"
+ user: "Benutzer"
+ category: "Kategorie"
+ tag: "Tag"
+ group: "Gruppe"
+ list: "Liste"
+ custom_field: "benutzerdefiniertes Feld"
+ value: "Wert"
placeholder:
- text: "Enter text"
- property: "Select property"
- wizard_field: "Select field"
- wizard_action: "Select action"
- user_field: "Select field"
- user_field_options: "Select field"
- user: "Select user"
- category: "Select category"
- tag: "Select tag"
- group: "Select group"
- list: "Enter item"
- custom_field: "Select field"
- value: "Select value"
+ text: "Text eingeben"
+ property: "Eigenschaft auswählen"
+ wizard_field: "Feld auswählen"
+ wizard_action: "Aktion auswählen"
+ user_field: "Feld auswählen"
+ user_field_options: "Feld auswählen"
+ user: "Benutzer auswählen"
+ category: "Kategorie auswählen"
+ tag: "Tag auswählen"
+ group: "Gruppe auswählen"
+ list: "Element eingeben"
+ custom_field: "Feld auswählen"
+ value: "Wert auswählen"
error:
- failed: "failed to save wizard"
- required: "{{type}} requires {{property}}"
- invalid: "{{property}} is invalid"
- dependent: "{{property}} is dependent on {{dependent}}"
- conflict: "{{type}} with {{property}} '{{value}}' already exists"
- after_time: "After time invalid"
+ failed: "konnte den Assistenten nicht speichern"
+ required: "{{type}} benötigt {{property}}"
+ invalid: "{{property}} ist ungültig"
+ dependent: "{{property}} ist abhängig von {{dependent}}"
+ conflict: "{{type}} mit {{property}} '{{value}}' existiert bereits"
+ after_time: "Nach der Zeit ungültig"
step:
- header: "Steps"
- title: "Title"
+ header: "Schritte"
+ title: "Titel"
banner: "Banner"
- description: "Description"
+ description: "Beschreibung"
required_data:
- label: "Required"
- not_permitted_message: "Message shown when required data not present"
+ label: "Erforderlich"
+ not_permitted_message: "Nachricht wird angezeigt, wenn benötigte Daten nicht vorhanden sind"
permitted_params:
- label: "Params"
+ label: "Parameter"
force_final:
- label: "Conditional Final Step"
- description: "Display this step as the final step if conditions on later steps have not passed when the user reaches this step."
+ label: "Bedingter Schlussschritt"
+ description: "Diesen Schritt als letzten Schritt anzeigen, wenn die Bedingungen für spätere Schritte nicht überschritten sind, wenn der Benutzer diesen Schritt erreicht."
field:
- header: "Fields"
- label: "Label"
- description: "Description"
- image: "Image"
- image_placeholder: "Image url"
- required: "Required"
- required_label: "Field is Required"
- min_length: "Min Length"
- min_length_placeholder: "Minimum length in characters"
- max_length: "Max Length"
- max_length_placeholder: "Maximum length in characters"
- char_counter: "Character Counter"
- char_counter_placeholder: "Display Character Counter"
- field_placeholder: "Field Placeholder"
- file_types: "File Types"
- preview_template: "Template"
+ header: "Felder"
+ label: "Bezeichnung"
+ description: "Beschreibung"
+ image: "Bild"
+ image_placeholder: "Bild-URL"
+ required: "Erforderlich"
+ required_label: "Feld ist erforderlich"
+ min_length: "Min. Länge"
+ min_length_placeholder: "Minimale Länge in Zeichen"
+ max_length: "Max. Länge"
+ max_length_placeholder: "Maximale Länge in Zeichen"
+ char_counter: "Zeichenzähler"
+ char_counter_placeholder: "Zeichenzähler anzeigen"
+ field_placeholder: "Feld-Platzhalter"
+ file_types: "Dateitypen"
+ preview_template: "Vorlage"
limit: "Limit"
- property: "Property"
- prefill: "Prefill"
- content: "Content"
+ property: "Eigentum"
+ prefill: "Vorausfüllen"
+ content: "Inhalt"
+ tag_groups: "Tag-Gruppen"
date_time_format:
label: "Format"
instructions: "Moment.js format "
validations:
- header: "Realtime Validations"
- enabled: "Enabled"
- similar_topics: "Similar Topics"
+ header: "Echtzeit-Überprüfungen"
+ enabled: "Aktiviert"
+ similar_topics: "Ähnliche Themen"
position: "Position"
- above: "Above"
- below: "Below"
- categories: "Categories"
- max_topic_age: "Max Topic Age"
+ above: "Oben"
+ below: "Unten"
+ categories: "Kategorien"
+ max_topic_age: "Max. Themen-Alter"
time_units:
- days: "Days"
- weeks: "Weeks"
- months: "Months"
- years: "Years"
+ days: "Tage"
+ weeks: "Wochen"
+ months: "Monate"
+ years: "Jahre"
type:
text: "Text"
- textarea: Textarea
- composer: Composer
- composer_preview: Composer Preview
- text_only: Text Only
- number: Number
+ textarea: Textbereich
+ composer: Editor
+ composer_preview: Editor-Vorschau
+ text_only: Nur Text
+ number: Nummer
checkbox: Checkbox
url: Url
- upload: Upload
+ upload: Hochladen
dropdown: Dropdown
tag: Tag
- category: Category
- group: Group
- user_selector: User Selector
- date: Date
- time: Time
- date_time: Date & Time
+ category: Kategorie
+ group: Gruppe
+ user_selector: Benutzer-Auswahl
+ date: Datum
+ time: Uhrzeit
+ date_time: Datum & Uhrzeit
connector:
- and: "and"
- or: "or"
- then: "then"
- set: "set"
+ and: "und"
+ or: "oder"
+ then: "dann"
+ set: "setzen"
equal: '='
greater: '>'
less: '<'
@@ -226,306 +293,235 @@ de:
less_or_equal: '<='
regex: '=~'
association: '→'
- is: 'is'
+ is: 'ist'
action:
- header: "Actions"
- include: "Include Fields"
- title: "Title"
- post: "Post"
- topic_attr: "Topic Attribute"
- interpolate_fields: "Insert wizard fields using the field_id in w{}. Insert user fields using field key in u{}."
+ header: "Aktionen"
+ include: "Felder einschließen"
+ title: "Titel"
+ post: "Beitrag"
+ topic_attr: "Themen-Attribut"
+ interpolate_fields: "Füge Assistentenfelder mit der field_id in w{} ein. Füge Benutzerfelder mit dem Feldschlüssel in u{} ein."
run_after:
- label: "Run After"
- wizard_completion: "Wizard Completion"
+ label: "Starte nach"
+ wizard_completion: "Assistenten-Fertigstellung"
custom_fields:
- label: "Custom"
- key: "field"
+ label: "Benutzerdefiniert"
+ key: "Feld"
skip_redirect:
- label: "Redirect"
- description: "Don't redirect the user to this {{type}} after the wizard completes"
+ label: "Weiterleitung"
+ description: "Den Benutzer nach Abschluss des Assistenten nicht zu {{type}} weiterleiten"
suppress_notifications:
- label: "Suppress Notifications"
- description: "Suppress normal notifications triggered by post creation"
+ label: "Benachrichtigungen unterdrücken"
+ description: "Normale Benachrichtigungen durch die Erstellung von Beiträgen unterdrücken"
send_message:
- label: "Send Message"
- recipient: "Recipient"
+ label: "Nachricht senden"
+ recipient: "Empfänger"
create_topic:
- label: "Create Topic"
- category: "Category"
+ label: "Thema erstellen"
+ category: "Kategorie"
tags: "Tags"
- visible: "Visible"
+ visible: "Sichtbar"
open_composer:
- label: "Open Composer"
+ label: "Editor öffnen"
update_profile:
- label: "Update Profile"
- setting: "Fields"
- key: "field"
+ label: "Profil aktualisieren"
+ setting: "Felder"
+ key: "Feld"
watch_categories:
- label: "Watch Categories"
- categories: "Categories"
- mute_remainder: "Mute Remainder"
+ label: "Kategorien beobachten"
+ categories: "Kategorien"
+ mute_remainder: "Verbleibende Stummschalten"
notification_level:
- label: "Notification Level"
+ label: "Benachrichtigungsebene"
regular: "Normal"
- watching: "Watching"
- tracking: "Tracking"
- watching_first_post: "Watching First Post"
- muted: "Muted"
- select_a_notification_level: "Select level"
- wizard_user: "Wizard User"
- usernames: "Users"
+ watching: "Beobachten"
+ tracking: "Nachverfolgen"
+ watching_first_post: "Ersten Beitrag anschauen"
+ muted: "Stumm"
+ select_a_notification_level: "Ebene auswählen"
+ wizard_user: "Assistenten Benutzer"
+ usernames: "Benutzer"
post_builder:
- checkbox: "Post Builder"
- label: "Builder"
- user_properties: "User Properties"
- wizard_fields: "Wizard Fields"
- wizard_actions: "Wizard Actions"
- placeholder: "Insert wizard fields using the field_id in w{}. Insert user properties using property in u{}."
+ checkbox: "Beitrags-Ersteller"
+ label: "Ersteller"
+ user_properties: "Benutzereinstellungen"
+ wizard_fields: "Assistenten-Felder"
+ wizard_actions: "Assistenten-Aktionen"
+ placeholder: "Füge Assistentenfelder mit der field_id in w{} ein. Füge Benutzereinstellungen mit der Eigenschaft in u{} ein."
add_to_group:
- label: "Add to Group"
+ label: "Zur Gruppe hinzufügen"
route_to:
- label: "Route To"
+ label: "Weiterleitung an"
url: "Url"
code: "Code"
send_to_api:
- label: "Send to API"
+ label: "An API senden"
api: "API"
- endpoint: "Endpoint"
- select_an_api: "Select an API"
- select_an_endpoint: "Select an endpoint"
+ endpoint: "Endpunkt"
+ select_an_api: "API auswählen"
+ select_an_endpoint: "Endpunkt auswählen"
body: "Body"
body_placeholder: "JSON"
create_category:
- label: "Create Category"
+ label: "Kategorie erstellen"
name: Name
- slug: Slug
- color: Color
- text_color: Text color
- parent_category: Parent Category
- permissions: Permissions
+ slug: Kürzel
+ color: Farbe
+ text_color: Textfarbe
+ parent_category: Übergeordnete Kategorie
+ permissions: Berechtigungen
create_group:
- label: Create Group
+ label: Gruppe erstellen
name: Name
- full_name: Full Name
- title: Title
- bio_raw: About
- owner_usernames: Owners
- usernames: Members
- grant_trust_level: Automatic Trust Level
- mentionable_level: Mentionable Level
- messageable_level: Messageable Level
- visibility_level: Visibility Level
- members_visibility_level: Members Visibility Level
+ full_name: Vollständiger Name
+ title: Titel
+ bio_raw: Über
+ owner_usernames: Besitzer
+ usernames: Mitglieder
+ grant_trust_level: Automatische Vertrauensstufe
+ mentionable_level: Erwähnbare Ebene
+ messageable_level: Nachrichtbare Ebene
+ visibility_level: Sichtbarkeitsstufe
+ members_visibility_level: Sichtbarkeitsstufe der Mitglieder
custom_field:
- nav_label: "Custom Fields"
- add: "Add"
+ nav_label: "Benutzerdefinierte Felder"
+ add: "Hinzufügen"
external:
- label: "from another plugin"
- title: "This custom field has been added by another plugin. You can use it in your wizards but you can't edit the field here."
+ label: "von einem anderen Plugin"
+ title: "Dieses benutzerdefinierte Feld wurde von einem anderen Plugin hinzugefügt. Du kannt es in Deinem Assistenten verwenden, aber Du kannst es hier nicht bearbeiten."
name:
label: "Name"
- select: "underscored_name"
+ select: "unterstrichener_Name"
type:
- label: "Type"
- select: "Select a type"
- string: "String"
- integer: "Integer"
+ label: "Typ"
+ select: "Wähle einen Typ"
+ string: "Zeichenkette"
+ integer: "Ganze Zahl"
boolean: "Boolean"
json: "JSON"
klass:
- label: "Class"
- select: "Select a class"
- post: "Post"
- category: "Category"
- topic: "Topic"
- group: "Group"
- user: "User"
+ label: "Klasse"
+ select: "Klasse auswählen"
+ post: "Beitrag"
+ category: "Kategorie"
+ topic: "Thema"
+ group: "Gruppe"
+ user: "Benutzer"
serializers:
- label: "Serializers"
- select: "Select serializers"
- topic_view: "Topic View"
- topic_list_item: "Topic List Item"
- basic_category: "Category"
- basic_group: "Group"
- post: "Post"
+ label: "Serialisierer"
+ select: "Wähle Serialisierer"
+ topic_view: "Themenansicht"
+ topic_list_item: "Themen-Listenelement"
+ basic_category: "Kategorie"
+ basic_group: "Gruppe"
+ post: "Beitrag"
submissions:
- nav_label: "Submissions"
- title: "{{name}} Submissions"
- download: "Download"
+ nav_label: "Einreichungen"
+ title: "{{name}} Einreichungen"
+ download: "Herunterladen"
api:
label: "API"
nav_label: 'APIs'
- select: "Select API"
- create: "Create API"
- new: 'New API'
- name: "Name (can't be changed)"
- name_placeholder: 'Underscored'
- title: 'Title'
- title_placeholder: 'Display name'
- remove: 'Delete'
- save: "Save"
+ select: "API auswählen"
+ create: "API erstellen"
+ new: 'Neue API'
+ name: "Name (kann nicht geändert werden)"
+ name_placeholder: 'Unterstrichen'
+ title: 'Titel'
+ title_placeholder: 'Anzeigename'
+ remove: 'Löschen'
+ save: "Speichern"
auth:
- label: "Authorization"
- btn: 'Authorize'
- settings: "Settings"
+ label: "Autorisierung"
+ btn: 'Autorisieren'
+ settings: "Einstellungen"
status: "Status"
- redirect_uri: "Redirect url"
- type: 'Type'
- type_none: 'Select a type'
- url: "Authorization url"
- token_url: "Token url"
- client_id: 'Client id'
- client_secret: 'Client secret'
- username: 'username'
- password: 'password'
+ redirect_uri: "Umleitungs-URL"
+ type: 'Typ'
+ type_none: 'Wähle einen Typ'
+ url: "Autorisierungs-URL"
+ token_url: "Token-URL"
+ client_id: 'Client-ID'
+ client_secret: 'Client-Geheimnis'
+ username: 'Benutzername'
+ password: 'Passwort'
params:
- label: 'Params'
- new: 'New param'
+ label: 'Parameter'
+ new: 'Neue Parameter'
status:
label: "Status"
- authorized: 'Authorized'
- not_authorized: "Not authorized"
+ authorized: 'Authorisiert'
+ not_authorized: "Nicht authorisiert"
code: "Code"
- access_token: "Access token"
- refresh_token: "Refresh token"
- expires_at: "Expires at"
- refresh_at: "Refresh at"
+ access_token: "Zugangs-Token"
+ refresh_token: "Token aktualisieren"
+ expires_at: "Ablauf am"
+ refresh_at: "Aktualisieren am"
endpoint:
- label: "Endpoints"
- add: "Add endpoint"
- name: "Endpoint name"
- method: "Select a method"
- url: "Enter a url"
- content_type: "Select a content type"
- success_codes: "Select success codes"
+ label: "Endpunkte"
+ add: "Endpunkt hinzufügen"
+ name: "Endpunkt-Name"
+ method: "Methode auswählen"
+ url: "Eine URL eingeben"
+ content_type: "Inhaltstyp auswählen"
+ success_codes: "Erfolgscodes auswählen"
log:
- label: "Logs"
+ label: "Protokolle"
log:
- nav_label: "Logs"
+ nav_label: "Protokolle"
manager:
nav_label: Manager
- title: Manage Wizards
- export: Export
- import: Import
- imported: imported
- upload: Select wizards.json
- destroy: Destroy
- destroyed: destroyed
+ title: Assistenten verwalten
+ export: Exportieren
+ import: Importieren
+ imported: importiert
+ upload: Wähle wizards.json aus
+ destroy: Zerstören
+ destroyed: zerstört
wizard_js:
group:
- select: "Select a group"
+ select: "Wähle eine Gruppe"
location:
name:
title: "Name (optional)"
- desc: "e.g. P. Sherman Dentist"
+ desc: "z.B. P. Sherman Zahnarzt"
street:
- title: "Number and Street"
- desc: "e.g. 42 Wallaby Way"
+ title: "Nummer und Straße"
+ desc: "z.B. 42 Wallaby Way"
postalcode:
- title: "Postal Code (Zip)"
- desc: "e.g. 2090"
+ title: "Postleitzahl"
+ desc: "z.B. 2090"
neighbourhood:
- title: "Neighbourhood"
- desc: "e.g. Cremorne Point"
+ title: "Nachbarschaft"
+ desc: "z.B. Cremorne Point"
city:
- title: "City, Town or Village"
- desc: "e.g. Sydney"
- coordinates: "Coordinates"
+ title: "Stadt oder Ortschaft"
+ desc: "z.B. Sydney"
+ coordinates: "Koordinaten"
lat:
- title: "Latitude"
- desc: "e.g. -31.9456702"
+ title: "Breitengrad"
+ desc: "z.B. -31.9456702"
lon:
- title: "Longitude"
- desc: "e.g. 115.8626477"
+ title: "Längengrad"
+ desc: "z.B. 115.8626477"
country_code:
- title: "Country"
- placeholder: "Select a Country"
+ title: "Land"
+ placeholder: "Wähle ein Land aus"
query:
- title: "Address"
- desc: "e.g. 42 Wallaby Way, Sydney."
+ title: "Adresse"
+ desc: "z.B. 42 Wallaby Way, Sydney."
geo:
- desc: "Locations provided by {{provider}}"
+ desc: "Standorte bereitgestellt von {{provider}}"
btn:
- label: "Find Location"
- results: "Locations"
- no_results: "No results. Please double check the spelling."
- show_map: "Show Map"
+ label: "Standort finden"
+ results: "Standorte"
+ no_results: "Keine Ergebnisse. Bitte überprüfe die Rechtschreibung."
+ show_map: "Karte anzeigen"
validation:
- neighbourhood: "Please enter a neighbourhood."
- city: "Please enter a city, town or village."
- street: "Please enter a Number and Street."
- postalcode: "Please enter a Postal Code (Zip)."
- countrycode: "Please select a country."
- coordinates: "Please complete the set of coordinates."
- geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
+ neighbourhood: "Bitte gib eine Nachbarschaft ein."
+ city: "Bitte gib eine Stadt,oder Ortschaft ein."
+ street: "Bitte gib eine Hausnummer und Straße ein."
+ postalcode: "Bitte gib eine Postleitzahl ein."
+ countrycode: "Bitte wähle ein Land aus."
+ coordinates: "Bitte vervollständige das Koordinaten-Set."
+ geo_location: "Suche und wähle ein Ergebnis aus."
diff --git a/config/locales/client.el.yml b/config/locales/client.el.yml
index 5a49f0c8..8d0be9e5 100644
--- a/config/locales/client.el.yml
+++ b/config/locales/client.el.yml
@@ -2,6 +2,72 @@ el:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ el:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ el:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index b51421a7..fa5c9deb 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -2,6 +2,74 @@ en:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Exit"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
@@ -46,10 +114,8 @@ en:
key: "Key"
value: "Value"
profile: "profile"
- translation: "Translation"
- translation_placeholder: "key"
type: "Type"
- none: "Make a selection"
+ none: "Make a selection"
submission_key: 'submission key'
param_key: 'param'
group: "Group"
@@ -60,6 +126,9 @@ en:
select_type: "Select a type"
condition: "Condition"
index: "Index"
+ edit_columns: "Edit Columns"
+ expand_text: "Read More"
+ collapse_text: "Show Less"
category_settings:
custom_wizard:
title: "Custom Wizard"
@@ -92,20 +161,39 @@ en:
no_file: Please choose a file to import
file_size_error: The file size must be 512kb or less
file_format_error: The file must be a .json file
- server_error: "Error: {{message}}"
importing: Importing wizards...
destroying: Destroying wizards...
import_complete: Import complete
destroy_complete: Destruction complete
-
+ subscription:
+ documentation: Check out the subscription documentation
+ authorize: "Connect this forum to use your Custom Wizard subscription plan on %{server}."
+ not_subscribed: "You've connected, but are not currently subscribed to a Custom Wizard plan on %{server}."
+ subscription_expiring: "Your subscription is active, but will expire in the next 48 hours."
+ subscription_active: "Your subscription is active."
+ subscription_inactive: "Your subscription is inactive on this forum. Read more in the documentation ."
+ unauthorized: "You're not connected. If you have a subscription, it will become inactive in the next 48 hours."
+ unauthorize_failed: Failed to disconnect.
+ submissions:
+ select: "Select a wizard to see its submissions"
+ viewing: "You're viewing the submissions of the %{wizardName}"
+ documentation: "Check out the submissions documentation"
+ logs:
+ select: "Select a wizard to see its logs"
+ viewing: "View recent logs for wizards on the forum"
+ documentation: "Check out the logs documentation"
+ notices:
+ info: "Plugin status and subscription notices"
+ documentation: Check out the notices documentation
+
editor:
show: "Show"
hide: "Hide"
preview: "{{action}} Preview"
popover: "{{action}} Fields"
-
+
input:
- conditional:
+ conditional:
name: 'if'
output: 'then'
assignment:
@@ -114,7 +202,7 @@ en:
name: 'map'
validation:
name: 'ensure'
-
+
selector:
label:
text: "text"
@@ -129,6 +217,8 @@ en:
list: "list"
custom_field: "custom field"
value: "value"
+ users: "users"
+ guests: "users and guests"
placeholder:
text: "Enter text"
@@ -152,21 +242,21 @@ en:
dependent: "{{property}} is dependent on {{dependent}}"
conflict: "{{type}} with {{property}} '{{value}}' already exists"
after_time: "After time invalid"
-
+
step:
header: "Steps"
title: "Title"
banner: "Banner"
description: "Description"
required_data:
- label: "Required"
+ label: "Required Data"
not_permitted_message: "Message shown when required data not present"
permitted_params:
- label: "Params"
+ label: "Permitted Params"
force_final:
label: "Conditional Final Step"
description: "Display this step as the final step if conditions on later steps have not passed when the user reaches this step."
-
+
field:
header: "Fields"
label: "Label"
@@ -179,9 +269,9 @@ en:
min_length_placeholder: "Minimum length in characters"
max_length: "Max Length"
max_length_placeholder: "Maximum length in characters"
- char_counter: "Character Counter"
+ char_counter: "Counter"
char_counter_placeholder: "Display Character Counter"
- field_placeholder: "Field Placeholder"
+ field_placeholder: "Placeholder"
file_types: "File Types"
preview_template: "Template"
limit: "Limit"
@@ -189,11 +279,12 @@ en:
prefill: "Prefill"
content: "Content"
tag_groups: "Tag Groups"
- date_time_format:
+ can_create_tag: "Can Create Tag"
+ date_time_format:
label: "Format"
instructions: "Moment.js format "
validations:
- header: "Realtime Validations"
+ header: "Validations"
enabled: "Enabled"
similar_topics: "Similar Topics"
position: "Position"
@@ -206,7 +297,7 @@ en:
weeks: "Weeks"
months: "Months"
years: "Years"
-
+
type:
text: "Text"
textarea: Textarea
@@ -225,13 +316,15 @@ en:
date: Date
time: Time
date_time: Date & Time
-
+ event: Event (Events Plugin)
+
connector:
and: "and"
or: "or"
then: "then"
set: "set"
equal: '='
+ not_equal: '!='
greater: '>'
less: '<'
greater_or_equal: '>='
@@ -239,7 +332,7 @@ en:
regex: '=~'
association: '→'
is: 'is'
-
+
action:
header: "Actions"
include: "Include Fields"
@@ -247,8 +340,8 @@ en:
post: "Post"
topic_attr: "Topic Attribute"
interpolate_fields: "Insert wizard fields using the field_id in w{}. Insert user fields using field key in u{}."
-
- run_after:
+
+ run_after:
label: "Run After"
wizard_completion: "Wizard Completion"
custom_fields:
@@ -268,6 +361,8 @@ en:
category: "Category"
tags: "Tags"
visible: "Visible"
+ add_event: "Add Event (Events Plugin)"
+ add_location: "Add Location (Locations Plugin)"
open_composer:
label: "Open Composer"
update_profile:
@@ -278,6 +373,10 @@ en:
label: "Watch Categories"
categories: "Categories"
mute_remainder: "Mute Remainder"
+ watch_tags:
+ label: "Watch Tags"
+ tags: "Tags"
+ watch_x:
notification_level:
label: "Notification Level"
regular: "Normal"
@@ -330,11 +429,11 @@ en:
messageable_level: Messageable Level
visibility_level: Visibility Level
members_visibility_level: Members Visibility Level
-
+
custom_field:
nav_label: "Custom Fields"
add: "Add"
- external:
+ external:
label: "from another plugin"
title: "This custom field has been added by another plugin. You can use it in your wizards but you can't edit the field here."
name:
@@ -363,11 +462,14 @@ en:
basic_category: "Category"
basic_group: "Group"
post: "Post"
-
+
submissions:
nav_label: "Submissions"
title: "{{name}} Submissions"
download: "Download"
+ group_id: "Group ID"
+ category_id: "Category ID"
+ composer_preview: "Composer Preview"
api:
label: "API"
@@ -421,9 +523,15 @@ en:
log:
label: "Logs"
-
+ clear: clear
+
log:
nav_label: "Logs"
+ title: "{{name}} Logs"
+ date: Date
+ action: Action
+ user: User
+ message: Message
manager:
nav_label: Manager
@@ -433,7 +541,39 @@ en:
imported: imported
upload: Select wizards.json
destroy: Destroy
- destroyed: destroyed
+ destroyed: destroyed
+
+ subscription:
+ title: Subscriber Features
+ authorize:
+ label: Connect
+ title: Connect your subscription to this site
+ deauthorize:
+ label: Disconnect
+ title: Disconnect your subscription from this site
+ update:
+ title: "Update subscription status"
+ subscribed:
+ label: Subscribed
+ title: You're subscribed and can use these features
+ selector: subscribed
+ not_subscribed:
+ label: Not Subscribed
+ title: Subscribe to use these features
+ selector: not subscribed
+ type:
+ none:
+ label: Subscribe
+ title: There is no Custom Wizard subscription active on this forum.
+ business:
+ label: Support
+ title: There is a Custom Wizard Business subscription active on this forum.
+ standard:
+ label: Support
+ title: There is a Custom Wizard Standard subscription active on this forum.
+ community:
+ label: Support
+ title: There is a Custom Wizard Community subscription active on this forum.
wizard_js:
group:
@@ -483,78 +623,3 @@ en:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
-
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
-
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
-
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
-
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.eo.yml b/config/locales/client.eo.yml
index ee59949b..6c2e4595 100644
--- a/config/locales/client.eo.yml
+++ b/config/locales/client.eo.yml
@@ -2,6 +2,72 @@ eo:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ eo:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ eo:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml
index b9d08e0b..8d7afcd7 100644
--- a/config/locales/client.es.yml
+++ b/config/locales/client.es.yml
@@ -2,6 +2,72 @@ es:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ es:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ es:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.et.yml b/config/locales/client.et.yml
index 490c3afc..b559d777 100644
--- a/config/locales/client.et.yml
+++ b/config/locales/client.et.yml
@@ -2,6 +2,72 @@ et:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ et:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ et:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.eu.yml b/config/locales/client.eu.yml
index a12a029c..ac412d49 100644
--- a/config/locales/client.eu.yml
+++ b/config/locales/client.eu.yml
@@ -2,6 +2,72 @@ eu:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ eu:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ eu:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.fa.yml b/config/locales/client.fa.yml
index 68f2a0c8..bace6af8 100644
--- a/config/locales/client.fa.yml
+++ b/config/locales/client.fa.yml
@@ -2,6 +2,72 @@ fa:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ fa:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ fa:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml
index 95a82ae9..14a4bc1b 100644
--- a/config/locales/client.fi.yml
+++ b/config/locales/client.fi.yml
@@ -2,6 +2,72 @@ fi:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ fi:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ fi:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml
index 9667ee84..57f8307e 100644
--- a/config/locales/client.fr.yml
+++ b/config/locales/client.fr.yml
@@ -2,6 +2,72 @@ fr:
js:
wizard:
complete_custom: "Bienvenu·e sur %{site_name} ! Commençons avec l'assistant %{wizard_name} ✨"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Retour vers {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continuer"
+ restart: "Recommencer"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Terminé"
+ back: "Précédent"
+ next: "Suivant"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Annuler"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -45,7 +111,7 @@ fr:
key: "Clé"
value: "Valeur"
profile: "profile"
- translation: "Translation"
+ translation: "Traduction"
translation_placeholder: "key"
type: "Type"
none: "Faire une sélection"
@@ -53,10 +119,10 @@ fr:
param_key: 'param'
group: "Group"
permitted: "Permitted"
- advanced: "Advanced"
+ advanced: "Avancés"
undo: "Undo"
clear: "Clear"
- select_type: "Select a type"
+ select_type: "Sélectionnez un type"
condition: "Condition"
index: "Index"
category_settings:
@@ -93,7 +159,7 @@ fr:
server_error: "Error: {{message}}"
importing: Importing wizards...
destroying: Destroying wizards...
- import_complete: Import complete
+ import_complete: Importation terminée
destroy_complete: Destruction complete
editor:
show: "Show"
@@ -123,7 +189,7 @@ fr:
group: "group"
list: "list"
custom_field: "custom field"
- value: "value"
+ value: "valeur"
placeholder:
text: "Enter text"
property: "Select property"
@@ -151,7 +217,7 @@ fr:
banner: "Bannière"
description: "Description"
required_data:
- label: "Required"
+ label: "Requis"
not_permitted_message: "Message shown when required data not present"
permitted_params:
label: "Params"
@@ -176,9 +242,10 @@ fr:
file_types: "File Types"
preview_template: "Template"
limit: "Limit"
- property: "Property"
+ property: "Propriété"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -192,9 +259,9 @@ fr:
categories: "Categories"
max_topic_age: "Max Topic Age"
time_units:
- days: "Days"
- weeks: "Weeks"
- months: "Months"
+ days: "Jours"
+ weeks: "Semaines"
+ months: "Mois"
years: "Years"
type:
text: "Text"
@@ -212,11 +279,11 @@ fr:
group: Group
user_selector: User Selector
date: Date
- time: Time
- date_time: Date & Time
+ time: Heure
+ date_time: Date & Heure
connector:
- and: "and"
- or: "or"
+ and: "et"
+ or: "ou"
then: "then"
set: "set"
equal: '='
@@ -299,7 +366,7 @@ fr:
label: "Create Category"
name: Name
slug: Slug
- color: Color
+ color: Couleur
text_color: Text color
parent_category: Parent Category
permissions: Permissions
@@ -307,10 +374,10 @@ fr:
label: Create Group
name: Name
full_name: Full Name
- title: Title
+ title: Titre
bio_raw: About
owner_usernames: Owners
- usernames: Members
+ usernames: Membres
grant_trust_level: Automatic Trust Level
mentionable_level: Mentionable Level
messageable_level: Messageable Level
@@ -351,7 +418,7 @@ fr:
submissions:
nav_label: "Submissions"
title: "{{name}} Submissions"
- download: "Download"
+ download: "Télécharger"
api:
label: "API"
nav_label: 'APIs'
@@ -405,8 +472,8 @@ fr:
manager:
nav_label: Manager
title: Manage Wizards
- export: Export
- import: Import
+ export: Exporter
+ import: Importer
imported: imported
upload: Select wizards.json
destroy: Destroy
@@ -454,78 +521,7 @@ fr:
neighbourhood: "Merci de saisir un quartier."
city: "Merci de saisir le nom d'une commune."
street: "Please enter a Number and Street."
- postalcode: "Please enter a Postal Code (Zip)."
+ postalcode: "Veuillez saisir un code postal (Zip)."
countrycode: "Merci de choisir un pays."
coordinates: "Please complete the set of coordinates."
geo_location: "Chercher et sélectionner un résultat."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Chercher...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "Vous en avez terminé avec cet assistant."
- not_permitted: "Vous devez obtenir un niveau de confiance à {{level}} ou plus pour accéder à cet assistant."
- none: "Il n'y a pas d'assistant ici."
- return_to_site: "Retourner à {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Prévisualiser le message"
- hide_preview: "Modifier le message"
- quote_post_title: "Citer l'ensemble du message"
- bold_label: "B"
- bold_title: "Gras"
- bold_text: "texte gras"
- italic_label: "I"
- italic_title: "Italique"
- italic_text: "texte en italique"
- link_title: "Hyperlien"
- link_description: "saisir la description du lien ici"
- link_dialog_title: "Insérer un hyperlien"
- link_optional_text: "titre optionnel"
- link_url_placeholder: "http://example.com"
- quote_title: "Citation"
- quote_text: "blockquote"
- blockquote_text: "insérer un bloc de citation"
- code_title: "Texte préformaté"
- code_text: "indenter le texte préformaté de 4 espaces"
- paste_code_text: "taper ou coller du code ici"
- upload_title: "Joindre un fichier"
- upload_description: "saisir la description du téléchargement ici"
- olist_title: "Liste numérotée"
- ulist_title: "Liste de points"
- list_item: "Élément de la liste"
- toggle_direction: "Changer de direction"
- help: "Aide à l'édition en Markdown"
- collapse: "réduire le panneau d'édition"
- abandon: "fermer l'éditeur et abandonner le brouillon"
- modal_ok: "OK"
- modal_cancel: "Annuler"
- cant_send_pm: "Pardon, vous ne pouvez envoyer de message à %{username}."
- yourself_confirm:
- title: "Avez-vous oublié d'ajouter des destinataires ?"
- body: "Pour l'instant ce message n'est envoyé qu'à vous !"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.gl.yml b/config/locales/client.gl.yml
index 0767376d..5949a55c 100644
--- a/config/locales/client.gl.yml
+++ b/config/locales/client.gl.yml
@@ -2,6 +2,72 @@ gl:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ gl:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ gl:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml
index 4fc73f73..a9ac89ad 100644
--- a/config/locales/client.he.yml
+++ b/config/locales/client.he.yml
@@ -2,6 +2,74 @@ he:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ two: "%{count} Characters"
+ many: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +247,7 @@ he:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,80 +527,3 @@ he:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- two: "You can only select {{count}} items."
- many: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- two: "Select at least {{count}} items."
- many: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- two: "%{count} Characters"
- many: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.hi.yml b/config/locales/client.hi.yml
index 0bdd2a8f..e700e820 100644
--- a/config/locales/client.hi.yml
+++ b/config/locales/client.hi.yml
@@ -2,6 +2,72 @@ hi:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ hi:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ hi:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.hr.yml b/config/locales/client.hr.yml
index a9b9e8ff..9e8ac773 100644
--- a/config/locales/client.hr.yml
+++ b/config/locales/client.hr.yml
@@ -2,6 +2,73 @@ hr:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ few: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +246,7 @@ hr:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,77 +526,3 @@ hr:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- few: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- few: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- few: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.hu.yml b/config/locales/client.hu.yml
index a70682f0..a936e286 100644
--- a/config/locales/client.hu.yml
+++ b/config/locales/client.hu.yml
@@ -2,6 +2,72 @@ hu:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ hu:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ hu:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.hy.yml b/config/locales/client.hy.yml
index 028b9f42..af3c23a5 100644
--- a/config/locales/client.hy.yml
+++ b/config/locales/client.hy.yml
@@ -2,6 +2,72 @@ hy:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ hy:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ hy:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.id.yml b/config/locales/client.id.yml
index 5a24a279..9e97a793 100644
--- a/config/locales/client.id.yml
+++ b/config/locales/client.id.yml
@@ -2,6 +2,71 @@ id:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +244,7 @@ id:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,71 +524,3 @@ id:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- other: "You can only select {{count}} items."
- min_content_not_reached:
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.is.yml b/config/locales/client.is.yml
index 383c3f0a..7b9f0d66 100644
--- a/config/locales/client.is.yml
+++ b/config/locales/client.is.yml
@@ -2,6 +2,72 @@ is:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ is:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ is:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml
index 6a4afdec..4c930dc4 100644
--- a/config/locales/client.it.yml
+++ b/config/locales/client.it.yml
@@ -2,6 +2,72 @@ it:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ it:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ it:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml
index 3b18dfe7..43219028 100644
--- a/config/locales/client.ja.yml
+++ b/config/locales/client.ja.yml
@@ -2,6 +2,71 @@ ja:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "キャンセル"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -47,7 +112,7 @@ ja:
profile: "profile"
translation: "Translation"
translation_placeholder: "key"
- type: "Type"
+ type: "タイプ"
none: "Make a selection"
submission_key: 'submission key'
param_key: 'param'
@@ -179,6 +244,7 @@ ja:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,71 +524,3 @@ ja:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- other: "You can only select {{count}} items."
- min_content_not_reached:
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.ka.yml b/config/locales/client.ka.yml
index ee95af36..0e80d2e7 100644
--- a/config/locales/client.ka.yml
+++ b/config/locales/client.ka.yml
@@ -2,6 +2,72 @@ ka:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ ka:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ ka:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.kk.yml b/config/locales/client.kk.yml
index d268cbfd..a192c292 100644
--- a/config/locales/client.kk.yml
+++ b/config/locales/client.kk.yml
@@ -2,6 +2,72 @@ kk:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ kk:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ kk:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.km.yml b/config/locales/client.km.yml
index d64b2d1c..2e3eaca0 100644
--- a/config/locales/client.km.yml
+++ b/config/locales/client.km.yml
@@ -2,6 +2,71 @@ km:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +244,7 @@ km:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,71 +524,3 @@ km:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- other: "You can only select {{count}} items."
- min_content_not_reached:
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.kn.yml b/config/locales/client.kn.yml
index 8950065b..9f612195 100644
--- a/config/locales/client.kn.yml
+++ b/config/locales/client.kn.yml
@@ -2,6 +2,72 @@ kn:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ kn:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ kn:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml
index 4d3edcc8..c494654e 100644
--- a/config/locales/client.ko.yml
+++ b/config/locales/client.ko.yml
@@ -2,6 +2,71 @@ ko:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +244,7 @@ ko:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,71 +524,3 @@ ko:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- other: "You can only select {{count}} items."
- min_content_not_reached:
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.ku.yml b/config/locales/client.ku.yml
index 69694c34..f9d22d28 100644
--- a/config/locales/client.ku.yml
+++ b/config/locales/client.ku.yml
@@ -2,6 +2,72 @@ ku:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ ku:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ ku:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.lo.yml b/config/locales/client.lo.yml
index 56206ebb..d1182f6a 100644
--- a/config/locales/client.lo.yml
+++ b/config/locales/client.lo.yml
@@ -2,6 +2,71 @@ lo:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +244,7 @@ lo:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,71 +524,3 @@ lo:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- other: "You can only select {{count}} items."
- min_content_not_reached:
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.lt.yml b/config/locales/client.lt.yml
index 01de5326..9fb60539 100644
--- a/config/locales/client.lt.yml
+++ b/config/locales/client.lt.yml
@@ -2,6 +2,74 @@ lt:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ few: "%{count} Characters"
+ many: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +247,7 @@ lt:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,80 +527,3 @@ lt:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- few: "You can only select {{count}} items."
- many: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- few: "Select at least {{count}} items."
- many: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- few: "%{count} Characters"
- many: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.lv.yml b/config/locales/client.lv.yml
index eaaf4e35..5312989f 100644
--- a/config/locales/client.lv.yml
+++ b/config/locales/client.lv.yml
@@ -2,6 +2,73 @@ lv:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ zero: "%{count} Characters"
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +246,7 @@ lv:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,77 +526,3 @@ lv:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- zero: "You can only select {{count}} items."
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- zero: "Select at least {{count}} items."
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- zero: "%{count} Characters"
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.mk.yml b/config/locales/client.mk.yml
index aacd434f..0d8228f5 100644
--- a/config/locales/client.mk.yml
+++ b/config/locales/client.mk.yml
@@ -2,6 +2,72 @@ mk:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ mk:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ mk:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.ml.yml b/config/locales/client.ml.yml
index f417dd95..814487a1 100644
--- a/config/locales/client.ml.yml
+++ b/config/locales/client.ml.yml
@@ -2,6 +2,72 @@ ml:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ ml:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ ml:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.mn.yml b/config/locales/client.mn.yml
index f6493025..d6619f44 100644
--- a/config/locales/client.mn.yml
+++ b/config/locales/client.mn.yml
@@ -2,6 +2,72 @@ mn:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ mn:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ mn:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.ms.yml b/config/locales/client.ms.yml
index 4f8c9cad..5890af1c 100644
--- a/config/locales/client.ms.yml
+++ b/config/locales/client.ms.yml
@@ -2,6 +2,71 @@ ms:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +244,7 @@ ms:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,71 +524,3 @@ ms:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- other: "You can only select {{count}} items."
- min_content_not_reached:
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.ne.yml b/config/locales/client.ne.yml
index 33f52ead..0cd9601a 100644
--- a/config/locales/client.ne.yml
+++ b/config/locales/client.ne.yml
@@ -2,6 +2,72 @@ ne:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ ne:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ ne:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml
index 9e8cfabb..b10bf498 100644
--- a/config/locales/client.nl.yml
+++ b/config/locales/client.nl.yml
@@ -2,6 +2,72 @@ nl:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ nl:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ nl:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.no.yml b/config/locales/client.no.yml
index 4e0d5cab..93e37bd9 100644
--- a/config/locales/client.no.yml
+++ b/config/locales/client.no.yml
@@ -2,6 +2,72 @@
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.om.yml b/config/locales/client.om.yml
index 3c7a7e46..855ba06b 100644
--- a/config/locales/client.om.yml
+++ b/config/locales/client.om.yml
@@ -2,6 +2,72 @@ om:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ om:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ om:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.pa.yml b/config/locales/client.pa.yml
index 00236d10..4880a163 100644
--- a/config/locales/client.pa.yml
+++ b/config/locales/client.pa.yml
@@ -2,6 +2,72 @@ pa:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ pa:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ pa:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.pl.yml b/config/locales/client.pl.yml
index b665aaf5..b5f1d5a9 100644
--- a/config/locales/client.pl.yml
+++ b/config/locales/client.pl.yml
@@ -2,6 +2,74 @@ pl:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ few: "%{count} Characters"
+ many: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +247,7 @@ pl:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,80 +527,3 @@ pl:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- few: "You can only select {{count}} items."
- many: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- few: "Select at least {{count}} items."
- many: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- few: "%{count} Characters"
- many: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml
index eba3a5ac..c04217db 100644
--- a/config/locales/client.pt.yml
+++ b/config/locales/client.pt.yml
@@ -2,6 +2,72 @@ pt:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ pt:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ pt:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml
index a5136d01..ec8d99ae 100644
--- a/config/locales/client.ro.yml
+++ b/config/locales/client.ro.yml
@@ -2,6 +2,73 @@ ro:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ few: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +246,7 @@ ro:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,77 +526,3 @@ ro:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- few: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- few: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- few: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml
index 85e8ff50..938ec061 100644
--- a/config/locales/client.ru.yml
+++ b/config/locales/client.ru.yml
@@ -2,6 +2,74 @@ ru:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ few: "%{count} Characters"
+ many: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +247,7 @@ ru:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,80 +527,3 @@ ru:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- few: "You can only select {{count}} items."
- many: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- few: "Select at least {{count}} items."
- many: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- few: "%{count} Characters"
- many: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.sd.yml b/config/locales/client.sd.yml
index add951c7..6a365f65 100644
--- a/config/locales/client.sd.yml
+++ b/config/locales/client.sd.yml
@@ -2,6 +2,72 @@ sd:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ sd:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ sd:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.sk.yml b/config/locales/client.sk.yml
index c762d3bb..8f427a90 100644
--- a/config/locales/client.sk.yml
+++ b/config/locales/client.sk.yml
@@ -2,6 +2,74 @@ sk:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ few: "%{count} Characters"
+ many: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +247,7 @@ sk:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,80 +527,3 @@ sk:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- few: "You can only select {{count}} items."
- many: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- few: "Select at least {{count}} items."
- many: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- few: "%{count} Characters"
- many: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.sl.yml b/config/locales/client.sl.yml
index 80912cb1..c6eefdbd 100644
--- a/config/locales/client.sl.yml
+++ b/config/locales/client.sl.yml
@@ -2,6 +2,74 @@ sl:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ two: "%{count} Characters"
+ few: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +247,7 @@ sl:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,80 +527,3 @@ sl:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- two: "You can only select {{count}} items."
- few: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- two: "Select at least {{count}} items."
- few: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- two: "%{count} Characters"
- few: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.sq.yml b/config/locales/client.sq.yml
index 089e4fce..f858bd31 100644
--- a/config/locales/client.sq.yml
+++ b/config/locales/client.sq.yml
@@ -2,6 +2,72 @@ sq:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ sq:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ sq:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.sr.yml b/config/locales/client.sr.yml
index 5db98108..fa5b4344 100644
--- a/config/locales/client.sr.yml
+++ b/config/locales/client.sr.yml
@@ -2,6 +2,73 @@ sr-Cyrl:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ few: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +246,7 @@ sr-Cyrl:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,77 +526,3 @@ sr-Cyrl:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- few: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- few: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- few: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml
index e19dbb9c..cf00ab9f 100644
--- a/config/locales/client.sv.yml
+++ b/config/locales/client.sv.yml
@@ -2,6 +2,72 @@ sv:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ sv:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ sv:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.sw.yml b/config/locales/client.sw.yml
index 5ebb0624..5265f9f9 100644
--- a/config/locales/client.sw.yml
+++ b/config/locales/client.sw.yml
@@ -2,6 +2,72 @@ sw:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ sw:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ sw:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.ta.yml b/config/locales/client.ta.yml
index 4cfc9a90..adb7b2a3 100644
--- a/config/locales/client.ta.yml
+++ b/config/locales/client.ta.yml
@@ -2,6 +2,72 @@ ta:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ ta:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ ta:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.te.yml b/config/locales/client.te.yml
index a3b7c377..1aa2e426 100644
--- a/config/locales/client.te.yml
+++ b/config/locales/client.te.yml
@@ -2,6 +2,72 @@ te:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ te:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ te:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.th.yml b/config/locales/client.th.yml
index 68b139ee..420625a5 100644
--- a/config/locales/client.th.yml
+++ b/config/locales/client.th.yml
@@ -2,6 +2,71 @@ th:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +244,7 @@ th:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,71 +524,3 @@ th:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- other: "You can only select {{count}} items."
- min_content_not_reached:
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.tl.yml b/config/locales/client.tl.yml
index bc3a2557..a67d0272 100644
--- a/config/locales/client.tl.yml
+++ b/config/locales/client.tl.yml
@@ -2,6 +2,72 @@ tl:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ tl:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ tl:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.tr.yml b/config/locales/client.tr.yml
index b33e9e0b..e22f7db1 100644
--- a/config/locales/client.tr.yml
+++ b/config/locales/client.tr.yml
@@ -2,6 +2,72 @@ tr:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ tr:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ tr:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.tt.yml b/config/locales/client.tt.yml
index a48bac61..d283e6eb 100644
--- a/config/locales/client.tt.yml
+++ b/config/locales/client.tt.yml
@@ -2,6 +2,71 @@ tt:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +244,7 @@ tt:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,71 +524,3 @@ tt:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- other: "You can only select {{count}} items."
- min_content_not_reached:
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.uk.yml b/config/locales/client.uk.yml
index 7c1bf2b1..a8b3fcf0 100644
--- a/config/locales/client.uk.yml
+++ b/config/locales/client.uk.yml
@@ -2,6 +2,74 @@ uk:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ few: "%{count} Characters"
+ many: "%{count} Characters"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +247,7 @@ uk:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,80 +527,3 @@ uk:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- few: "You can only select {{count}} items."
- many: "You can only select {{count}} items."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- few: "Select at least {{count}} items."
- many: "Select at least {{count}} items."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- few: "%{count} Characters"
- many: "%{count} Characters"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.ur.yml b/config/locales/client.ur.yml
index 2469e86c..982d55e0 100644
--- a/config/locales/client.ur.yml
+++ b/config/locales/client.ur.yml
@@ -2,6 +2,72 @@ ur:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ ur:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ ur:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml
index 5dd7ce98..b7ac3025 100644
--- a/config/locales/client.vi.yml
+++ b/config/locales/client.vi.yml
@@ -2,6 +2,71 @@ vi:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +244,7 @@ vi:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,71 +524,3 @@ vi:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- other: "You can only select {{count}} items."
- min_content_not_reached:
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.yi.yml b/config/locales/client.yi.yml
index 94cd0b5d..dbfcf220 100644
--- a/config/locales/client.yi.yml
+++ b/config/locales/client.yi.yml
@@ -2,6 +2,72 @@ yi:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ yi:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ yi:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.zh.yml b/config/locales/client.zh.yml
index a8950f7b..d8306b90 100644
--- a/config/locales/client.zh.yml
+++ b/config/locales/client.zh.yml
@@ -2,6 +2,71 @@ zh-TW:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +244,7 @@ zh-TW:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,71 +524,3 @@ zh-TW:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- other: "You can only select {{count}} items."
- min_content_not_reached:
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/client.zu.yml b/config/locales/client.zu.yml
index b147ac1f..f1f5f54b 100644
--- a/config/locales/client.zu.yml
+++ b/config/locales/client.zu.yml
@@ -2,6 +2,72 @@ zu:
js:
wizard:
complete_custom: "Complete the {{name}}"
+ completed: "You have completed this wizard."
+ not_permitted: "You are not permitted to access this wizard."
+ none: "There is no wizard here."
+ return_to_site: "Return to {{siteName}}"
+ requires_login: "You need to be logged in to access this wizard."
+ reset: "Reset this wizard."
+ step_not_permitted: "You're not permitted to view this step."
+ incomplete_submission:
+ title: "Continue editing your draft submission from %{date}?"
+ resume: "Continue"
+ restart: "Start over"
+ x_characters:
+ one: "%{count} Character"
+ other: "%{count} Characters"
+ quit: "Maybe Later"
+ done_custom: "Done"
+ back: "Back"
+ next: "Next"
+ step: "%{current} of %{total}"
+ upload: "Upload"
+ uploading: "Uploading..."
+ upload_error: "Sorry, there was an error uploading that file. Please try again."
+ wizard_composer:
+ show_preview: "Preview Post"
+ hide_preview: "Edit Post"
+ quote_post_title: "Quote whole post"
+ bold_label: "B"
+ bold_title: "Strong"
+ bold_text: "strong text"
+ italic_label: "I"
+ italic_title: "Emphasis"
+ italic_text: "emphasized text"
+ link_title: "Hyperlink"
+ link_description: "enter link description here"
+ link_dialog_title: "Insert Hyperlink"
+ link_optional_text: "optional title"
+ link_url_placeholder: "http://example.com"
+ quote_title: "Blockquote"
+ quote_text: "Blockquote"
+ blockquote_text: "Blockquote"
+ code_title: "Preformatted text"
+ code_text: "indent preformatted text by 4 spaces"
+ paste_code_text: "type or paste code here"
+ upload_title: "Upload"
+ upload_description: "enter upload description here"
+ olist_title: "Numbered List"
+ ulist_title: "Bulleted List"
+ list_item: "List item"
+ toggle_direction: "Toggle Direction"
+ help: "Markdown Editing Help"
+ collapse: "minimize the composer panel"
+ abandon: "close composer and discard draft"
+ modal_ok: "OK"
+ modal_cancel: "Cancel"
+ cant_send_pm: "Sorry, you can't send a message to %{username}."
+ yourself_confirm:
+ title: "Did you forget to add recipients?"
+ body: "Right now this message is only being sent to yourself!"
+ realtime_validations:
+ similar_topics:
+ insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
+ insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
+ results: "Your topic is similar to..."
+ no_results: "No similar topics."
+ loading: "Looking for similar topics..."
+ show: "show"
admin_js:
admin:
wizard:
@@ -179,6 +245,7 @@ zu:
property: "Property"
prefill: "Prefill"
content: "Content"
+ tag_groups: "Tag Groups"
date_time_format:
label: "Format"
instructions: "Moment.js format "
@@ -458,74 +525,3 @@ zu:
countrycode: "Please select a country."
coordinates: "Please complete the set of coordinates."
geo_location: "Search and select a result."
- select_kit:
- default_header_text: Select...
- no_content: No matches found
- filter_placeholder: Search...
- filter_placeholder_with_any: Search or create...
- create: "Create: '{{content}}'"
- max_content_reached:
- one: "You can only select {{count}} item."
- other: "You can only select {{count}} items."
- min_content_not_reached:
- one: "Select at least {{count}} item."
- other: "Select at least {{count}} items."
- wizard:
- completed: "You have completed this wizard."
- not_permitted: "You are not permitted to access this wizard."
- none: "There is no wizard here."
- return_to_site: "Return to {{siteName}}"
- requires_login: "You need to be logged in to access this wizard."
- reset: "Reset this wizard."
- step_not_permitted: "You're not permitted to view this step."
- incomplete_submission:
- title: "Continue editing your draft submission from %{date}?"
- resume: "Continue"
- restart: "Start over"
- x_characters:
- one: "%{count} Character"
- other: "%{count} Characters"
- wizard_composer:
- show_preview: "Preview Post"
- hide_preview: "Edit Post"
- quote_post_title: "Quote whole post"
- bold_label: "B"
- bold_title: "Strong"
- bold_text: "strong text"
- italic_label: "I"
- italic_title: "Emphasis"
- italic_text: "emphasized text"
- link_title: "Hyperlink"
- link_description: "enter link description here"
- link_dialog_title: "Insert Hyperlink"
- link_optional_text: "optional title"
- link_url_placeholder: "http://example.com"
- quote_title: "Blockquote"
- quote_text: "Blockquote"
- blockquote_text: "Blockquote"
- code_title: "Preformatted text"
- code_text: "indent preformatted text by 4 spaces"
- paste_code_text: "type or paste code here"
- upload_title: "Upload"
- upload_description: "enter upload description here"
- olist_title: "Numbered List"
- ulist_title: "Bulleted List"
- list_item: "List item"
- toggle_direction: "Toggle Direction"
- help: "Markdown Editing Help"
- collapse: "minimize the composer panel"
- abandon: "close composer and discard draft"
- modal_ok: "OK"
- modal_cancel: "Cancel"
- cant_send_pm: "Sorry, you can't send a message to %{username}."
- yourself_confirm:
- title: "Did you forget to add recipients?"
- body: "Right now this message is only being sent to yourself!"
- realtime_validations:
- similar_topics:
- insufficient_characters: "Type a minimum 5 characters to start looking for similar topics"
- insufficient_characters_categories: "Type a minimum 5 characters to start looking for similar topics in %{catLinks}"
- results: "Your topic is similar to..."
- no_results: "No similar topics."
- loading: "Looking for similar topics..."
- show: "show"
diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml
index 798420d4..c5468a75 100644
--- a/config/locales/server.de.yml
+++ b/config/locales/server.de.yml
@@ -2,51 +2,51 @@ de:
admin:
wizard:
submission:
- no_user: "deleted (user_id: %{user_id})"
+ no_user: "gelöscht (user_id: %{user_id})"
wizard:
- custom_title: "Wizard"
+ custom_title: "Assistent"
custom_field:
error:
- required_attribute: "'%{attr}' is a required attribute"
- unsupported_class: "'%{class}' is not a supported class"
- unsupported_serializers: "'%{serializers}' are not supported serializers for '%{class}'"
- unsupported_type: "%{type} is not a supported custom field type"
- name_invalid: "'%{name}' is not a valid custom field name"
- name_too_short: "'%{name}' is too short for a custom field name (min length is #{min_length})"
- name_already_taken: "'%{name}' is already taken as a custom field name"
- save_default: "Failed to save custom field '%{name}'"
+ required_attribute: "'%{attr}' ist ein Pflicht-Attribut"
+ unsupported_class: "'%{class}' ist keine unterstützte Klasse"
+ unsupported_serializers: "'%{serializers}' sind keine unterstützten Serialisierer für '%{class} '"
+ unsupported_type: "%{type} ist kein unterstützter benutzerdefinierter Feldtyp"
+ name_invalid: "'%{name}' ist kein gültiger benutzerdefinierter Feldname"
+ name_too_short: "'%{name}' ist zu kurz für einen benutzerdefinierten Feldnamen (min. Länge ist #{min_length})"
+ name_already_taken: "'%{name}' wird bereits als benutzerdefinierter Feldname benutzt"
+ save_default: "Fehler beim Speichern des benutzerdefinierten Feldes '%{name}'"
field:
- too_short: "%{label} must be at least %{min} characters"
- too_long: "%{label} must not be more than %{max} characters"
- required: "%{label} is required."
- not_url: "%{label} must be a valid url"
- invalid_file: "%{label} must be a %{types}"
- invalid_date: "Invalid date"
- invalid_time: "Invalid time"
- none: "We couldn't find a wizard at that address."
- no_skip: "Wizard can't be skipped"
+ too_short: "%{label} muss mindestens %{min} Zeichen lang sein"
+ too_long: "%{label} darf nicht mehr als %{max} Zeichen lang sein"
+ required: "%{label} ist erforderlich."
+ not_url: "%{label} muss eine gültige URL sein"
+ invalid_file: "%{label} muss ein %{types} sein"
+ invalid_date: "Ungültiges Datum"
+ invalid_time: "Ungültige Uhrzeit"
+ none: "Wir konnten keinen Assistenten an dieser Adresse finden."
+ no_skip: "Assistent kann nicht übersprungen werden"
export:
error:
- select_one: "Please select at least one valid wizard"
- invalid_wizards: "No valid wizards selected"
+ select_one: "Bitte wählen Sie mindestens einen gültigen Assistenten aus"
+ invalid_wizards: "Keine gültigen Wizards ausgewählt"
import:
error:
- no_file: "No file selected"
- file_large: "File too large"
- invalid_json: "File is not a valid json file"
+ no_file: "Keine Datei ausgewählt"
+ file_large: "Datei ist zu groß"
+ invalid_json: "Datei ist keine gültige json Datei"
destroy:
error:
- no_template: No template found
- default: Error destroying wizard
+ no_template: Kein Template gefunden
+ default: Fehler beim Löschen des Wizards
validation:
- required: "%{property} is required"
- conflict: "Wizard with id '%{wizard_id}' already exists"
- after_signup: "You can only have one 'after signup' wizard at a time. %{wizard_id} has 'after signup' enabled."
- after_signup_after_time: "You can't use 'after time' and 'after signup' on the same wizard."
- after_time: "After time setting is invalid."
- liquid_syntax_error: "Liquid syntax error in %{attribute}: %{message}"
+ required: "%{property} ist erforderlich"
+ conflict: "Wizard mit id '%{wizard_id}' existiert bereits"
+ after_signup: "Du kannst nur einen \"Nach der Anmeldung\" Assistenten gleichzeitig haben. %{wizard_id} hat \"nach der Anmeldung\" aktiviert."
+ after_signup_after_time: "Du kannst nicht 'nach Zeit und 'nach Anmeldung' bei dem gleichen Assistenten verwenden."
+ after_time: "Nach Zeit Einstellung ist ungültig."
+ liquid_syntax_error: "Liquid-Syntax-Fehler in %{attribute}: %{message}"
site_settings:
- custom_wizard_enabled: "Enable custom wizards."
- wizard_redirect_exclude_paths: "Routes excluded from wizard redirects."
- wizard_recognised_image_upload_formats: "File types which will result in upload displaying an image preview"
- wizard_apis_enabled: "Enable API features (experimental)."
+ custom_wizard_enabled: "Benutzerdefinierte Assistenten aktivieren."
+ wizard_redirect_exclude_paths: "Routen, die von Assistenten-Weiterleitungen ausgeschlossen sind."
+ wizard_recognised_image_upload_formats: "Dateitypen, die dazu führen, dass der Upload eine Vorschau anzeigen wird"
+ wizard_apis_enabled: "API-Funktionen aktivieren (experimentell)."
diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml
index 81697e43..9fa23d53 100644
--- a/config/locales/server.en.yml
+++ b/config/locales/server.en.yml
@@ -6,7 +6,7 @@ en:
wizard:
custom_title: "Wizard"
-
+
custom_field:
error:
required_attribute: "'%{attr}' is a required attribute"
@@ -17,7 +17,8 @@ en:
name_too_short: "'%{name}' is too short for a custom field name (min length is #{min_length})"
name_already_taken: "'%{name}' is already taken as a custom field name"
save_default: "Failed to save custom field '%{name}'"
-
+ subscription_type: "%{type} custom fields require a subscription"
+
field:
too_short: "%{label} must be at least %{min} characters"
too_long: "%{label} must not be more than %{max} characters"
@@ -26,25 +27,25 @@ en:
invalid_file: "%{label} must be a %{types}"
invalid_date: "Invalid date"
invalid_time: "Invalid time"
-
+
none: "We couldn't find a wizard at that address."
no_skip: "Wizard can't be skipped"
export:
error:
select_one: "Please select at least one valid wizard"
invalid_wizards: "No valid wizards selected"
-
+
import:
error:
no_file: "No file selected"
file_large: "File too large"
invalid_json: "File is not a valid json file"
-
+
destroy:
error:
no_template: No template found
default: Error destroying wizard
-
+
validation:
required: "%{property} is required"
conflict: "Wizard with id '%{wizard_id}' already exists"
@@ -52,9 +53,14 @@ en:
after_signup_after_time: "You can't use 'after time' and 'after signup' on the same wizard."
after_time: "After time setting is invalid."
liquid_syntax_error: "Liquid syntax error in %{attribute}: %{message}"
+ subscription: "%{type} %{property} usage is not supported on your subscription"
+ not_permitted_for_guests: "%{object_id} is not permitted when guests can access the wizard"
+ error_messages:
+ wizard_replacing_composer: "Category not allowed for topic creation."
site_settings:
custom_wizard_enabled: "Enable custom wizards."
wizard_redirect_exclude_paths: "Routes excluded from wizard redirects."
wizard_recognised_image_upload_formats: "File types which will result in upload displaying an image preview"
wizard_apis_enabled: "Enable API features (experimental)."
+ wizard_critical_notices_on_dashboard: "Show critical notices about the custom wizard plugin on the admin dashboard."
diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml
index 1606e062..6f7eca42 100644
--- a/config/locales/server.pt.yml
+++ b/config/locales/server.pt.yml
@@ -2,51 +2,51 @@ pt:
admin:
wizard:
submission:
- no_user: "deleted (user_id: %{user_id})"
+ no_user: "excluído (user_id: %{user_id})"
wizard:
- custom_title: "Wizard"
+ custom_title: "Assistente"
custom_field:
error:
- required_attribute: "'%{attr}' is a required attribute"
- unsupported_class: "'%{class}' is not a supported class"
- unsupported_serializers: "'%{serializers}' are not supported serializers for '%{class}'"
- unsupported_type: "%{type} is not a supported custom field type"
- name_invalid: "'%{name}' is not a valid custom field name"
- name_too_short: "'%{name}' is too short for a custom field name (min length is #{min_length})"
- name_already_taken: "'%{name}' is already taken as a custom field name"
- save_default: "Failed to save custom field '%{name}'"
+ required_attribute: "'%{attr}' é um atributo obrigatório"
+ unsupported_class: "'%{class}' não é uma classe suportada"
+ unsupported_serializers: "'%{serializers}' não é suportado serializadores para '%{class}'"
+ unsupported_type: "%{type} não é um tipo de campo personalizado suportado"
+ name_invalid: "'%{name}' não é um nome de campo personalizado válido"
+ name_too_short: "'%{name}' é muito curto para um nome de campo personalizado (comprimento mínimo é #{min_length})"
+ name_already_taken: "'%{name}' já está tomado como um nome de campo personalizado"
+ save_default: "Falha ao salvar o campo personalizado '%{name}'"
field:
- too_short: "%{label} must be at least %{min} characters"
- too_long: "%{label} must not be more than %{max} characters"
- required: "%{label} is required."
- not_url: "%{label} must be a valid url"
- invalid_file: "%{label} must be a %{types}"
- invalid_date: "Invalid date"
- invalid_time: "Invalid time"
- none: "We couldn't find a wizard at that address."
- no_skip: "Wizard can't be skipped"
+ too_short: "%{label} deve ter pelo menos %{min} caracteres"
+ too_long: "%{label} deve ter pelo menos %{max} caracteres"
+ required: "%{label} é obrigatório."
+ not_url: "%{label} deve ser uma url válida"
+ invalid_file: "%{label} deve ser um %{types}"
+ invalid_date: "Data inválida"
+ invalid_time: "Tempo inválido"
+ none: "Nós não conseguimos encontrar um assistente nesse endereço."
+ no_skip: "Assistente não pode ser ignorado"
export:
error:
- select_one: "Please select at least one valid wizard"
- invalid_wizards: "No valid wizards selected"
+ select_one: "Por favor, selecione pelo menos um assistente válido"
+ invalid_wizards: "Nenhum assistente válido selecionado"
import:
error:
- no_file: "No file selected"
- file_large: "File too large"
- invalid_json: "File is not a valid json file"
+ no_file: "Nenhum arquivo selecionado"
+ file_large: "Arquivo muito grande"
+ invalid_json: "O arquivo não é um arquivo json válido"
destroy:
error:
- no_template: No template found
- default: Error destroying wizard
+ no_template: Nenhum modelo encontrado
+ default: Erro ao destruir assistente
validation:
- required: "%{property} is required"
- conflict: "Wizard with id '%{wizard_id}' already exists"
- after_signup: "You can only have one 'after signup' wizard at a time. %{wizard_id} has 'after signup' enabled."
- after_signup_after_time: "You can't use 'after time' and 'after signup' on the same wizard."
- after_time: "After time setting is invalid."
- liquid_syntax_error: "Liquid syntax error in %{attribute}: %{message}"
+ required: "%{property} é obrigatório"
+ conflict: "Assistente com id '%{wizard_id}' já existe"
+ after_signup: "Você só pode ter um assistente 'após a inscrição' por vez. %{wizard_id} tem 'após a inscrição' habilitado."
+ after_signup_after_time: "Você não pode usar 'após tempo' e 'após a inscrição' no mesmo assistente."
+ after_time: "Após a configuração do tempo é inválido."
+ liquid_syntax_error: "Erro de sintaxe Liquid em %{attribute}: %{message}"
site_settings:
- custom_wizard_enabled: "Enable custom wizards."
- wizard_redirect_exclude_paths: "Routes excluded from wizard redirects."
- wizard_recognised_image_upload_formats: "File types which will result in upload displaying an image preview"
- wizard_apis_enabled: "Enable API features (experimental)."
+ custom_wizard_enabled: "Ativar assistentes personalizados."
+ wizard_redirect_exclude_paths: "Rotas excluídas dos redirecionamentos do assistente."
+ wizard_recognised_image_upload_formats: "Tipos de arquivo que resultarão no upload exibindo uma visualização da imagem"
+ wizard_apis_enabled: "Habilitar recursos API (experimental)."
diff --git a/config/locales/server.zh.yml b/config/locales/server.zh.yml
index ad7eb113..73023604 100644
--- a/config/locales/server.zh.yml
+++ b/config/locales/server.zh.yml
@@ -1,4 +1,4 @@
-zh-TW:
+zh-CN:
admin:
wizard:
submission:
@@ -14,7 +14,7 @@ zh-TW:
name_invalid: "'%{name}' is not a valid custom field name"
name_too_short: "'%{name}' is too short for a custom field name (min length is #{min_length})"
name_already_taken: "'%{name}' is already taken as a custom field name"
- save_default: "Failed to save custom field '%{name}'"
+ save_default: "保存自定义字段“%{name}”失败"
field:
too_short: "%{label} must be at least %{min} characters"
too_long: "%{label} must not be more than %{max} characters"
@@ -27,26 +27,26 @@ zh-TW:
no_skip: "Wizard can't be skipped"
export:
error:
- select_one: "Please select at least one valid wizard"
+ select_one: "请选择至少一个有效向导"
invalid_wizards: "No valid wizards selected"
import:
error:
- no_file: "No file selected"
- file_large: "File too large"
- invalid_json: "File is not a valid json file"
+ no_file: "未选中任何文件"
+ file_large: "文件过大"
+ invalid_json: "文件不是一个有效的 json 文件"
destroy:
error:
- no_template: No template found
- default: Error destroying wizard
+ no_template: 没有找到模板
+ default: 销毁向导时出错
validation:
required: "%{property} is required"
- conflict: "Wizard with id '%{wizard_id}' already exists"
- after_signup: "You can only have one 'after signup' wizard at a time. %{wizard_id} has 'after signup' enabled."
+ conflict: "Id 为 %{wizard_id} 的向导已存在"
+ after_signup: "您只能有一个“注册即导向”型的向导。Id为 %{wizard_id} 的向导已启用该特性。"
after_signup_after_time: "You can't use 'after time' and 'after signup' on the same wizard."
after_time: "After time setting is invalid."
liquid_syntax_error: "Liquid syntax error in %{attribute}: %{message}"
site_settings:
- custom_wizard_enabled: "Enable custom wizards."
+ custom_wizard_enabled: "启用自定义向导。"
wizard_redirect_exclude_paths: "Routes excluded from wizard redirects."
wizard_recognised_image_upload_formats: "File types which will result in upload displaying an image preview"
wizard_apis_enabled: "Enable API features (experimental)."
diff --git a/config/routes.rb b/config/routes.rb
index 1948b799..b611916e 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,10 +1,9 @@
# frozen_string_literal: true
CustomWizard::Engine.routes.draw do
- get 'qunit' => 'wizard#qunit'
- get ':wizard_id' => 'wizard#index'
+ get ':wizard_id' => 'wizard#show'
put ':wizard_id/skip' => 'wizard#skip'
- get ':wizard_id/steps' => 'wizard#index'
- get ':wizard_id/steps/:step_id' => 'wizard#index'
+ get ':wizard_id/steps' => 'wizard#show'
+ get ':wizard_id/steps/:step_id' => 'wizard#show'
put ':wizard_id/steps/:step_id' => 'steps#update'
end
@@ -15,6 +14,7 @@ Discourse::Application.routes.append do
scope module: 'custom_wizard', constraints: AdminConstraint.new do
get 'admin/wizards' => 'admin#index'
+ get 'admin/wizards/subscription' => 'subscription#index'
get 'admin/wizards/wizard' => 'admin_wizard#index'
get 'admin/wizards/wizard/create' => 'admin#index'
@@ -39,6 +39,7 @@ Discourse::Application.routes.append do
get 'admin/wizards/api/:name/authorize' => 'admin_api#authorize'
get 'admin/wizards/logs' => 'admin_logs#index'
+ get 'admin/wizards/logs/:wizard_id' => 'admin_logs#show'
get 'admin/wizards/manager' => 'admin_manager#index'
get 'admin/wizards/manager/export' => 'admin_manager#export'
diff --git a/config/settings.yml b/config/settings.yml
index 0d93524d..514462d5 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -1,5 +1,5 @@
plugins:
- custom_wizard_enabled:
+ custom_wizard_enabled:
default: true
client: true
wizard_redirect_exclude_paths:
@@ -15,6 +15,6 @@ plugins:
refresh: true
type: list
list_type: compact
- wizard_apis_enabled:
+ wizard_important_notices_on_dashboard:
client: true
- default: false
\ No newline at end of file
+ default: true
diff --git a/crowdin.yml b/crowdin.yml
index 9e900364..da755762 100644
--- a/crowdin.yml
+++ b/crowdin.yml
@@ -1,4 +1,4 @@
-pull_request_title: 'I18n: Update translations'
+pull_request_title: "I18n: Update translations"
files:
- source: /config/locales/client.en.yml
translation: /config/locales/client.%two_letters_code%.yml
diff --git a/db/migrate/20210806135416_split_custom_wizard_log_fields.rb b/db/migrate/20210806135416_split_custom_wizard_log_fields.rb
new file mode 100644
index 00000000..8107bc07
--- /dev/null
+++ b/db/migrate/20210806135416_split_custom_wizard_log_fields.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+class SplitCustomWizardLogFields < ActiveRecord::Migration[6.1]
+ KEY_MAP = {
+ wizard: "wizard_id",
+ action: "action",
+ user: "username",
+ date: "date",
+ message: "message"
+ }
+
+ def change
+ reversible do |dir|
+ dir.up do
+ # separate wizard/action/user into their own keys
+
+ wizard_logs = PluginStoreRow.where("plugin_name = 'custom_wizard_log'")
+
+ if wizard_logs.exists?
+ wizard_logs.each do |row|
+ begin
+ log_json = JSON.parse(row.value)
+ rescue TypeError, JSON::ParserError
+ next
+ end
+
+ if log_json.key?('message') && log_json['message'].is_a?(String)
+
+ attr_strs = []
+
+ # assumes no whitespace in the values
+ attr_strs << log_json['message'].slice!(/(wizard: \S*; )/, 1)
+ attr_strs << log_json['message'].slice!(/(action: \S*; )/, 1)
+ attr_strs << log_json['message'].slice!(/(user: \S*; )/, 1)
+
+ attr_strs.each do |attr_str|
+ if attr_str.is_a? String
+ attr_str.gsub!(/[;]/ , "")
+ key, value = attr_str.split(': ')
+ value.strip! if value
+ key = KEY_MAP[key.to_sym] ? KEY_MAP[key.to_sym] : key
+ log_json[key] = value ? value : ''
+ end
+ end
+
+ row.value = log_json.to_json
+ row.save
+ end
+ end
+ end
+ end
+
+ dir.down do
+ wizard_logs = PluginStoreRow.where("plugin_name = 'custom_wizard_log'")
+
+ if wizard_logs.exists?
+ wizard_logs.each do |row|
+ begin
+ log_json = JSON.parse(row.value)
+ rescue TypeError, JSON::ParserError
+ next
+ end
+
+ # concatenate wizard/action/user to start of message
+ prefixes = log_json.extract!('wizard_id', 'action', 'username')
+ message_prefix = ""
+
+ if prefixes.present?
+ message_prefix = prefixes.map do |k, v|
+ key = KEY_MAP.key(k) ? KEY_MAP.key(k) : k
+ "#{key.to_s}: #{v};"
+ end.join(' ')
+ end
+
+ if log_json.key?('message')
+ message = log_json['message']
+ message = "#{message_prefix} #{message}" if message_prefix.present?
+ log_json['message'] = message
+ else
+ log_json['message'] = message_prefix
+ end
+
+ row.value = log_json.to_json
+ row.save
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lefthook.yml b/lefthook.yml
new file mode 100644
index 00000000..91d2ad53
--- /dev/null
+++ b/lefthook.yml
@@ -0,0 +1,35 @@
+skip_output:
+ - meta
+ - success
+
+pre-commit:
+ parallel: true
+ commands:
+ rubocop:
+ glob: "*.rb"
+ run: bundle exec rubocop --parallel --force-exclusion {staged_files}
+ prettier:
+ glob: "*.js"
+ include: "app/assets/javascripts|plugins/.+?/assets/javascripts"
+ run: yarn prettier --list-different {staged_files}
+ prettier-scss:
+ glob: "*.scss"
+ include: "app/assets/stylesheets|plugins/.+?/assets/stylesheets"
+ run: yarn prettier --list-different {staged_files}
+ eslint:
+ glob: "*.js"
+ include: "app/assets/javascripts|plugins/.+?/assets/javascripts"
+ run: yarn eslint -f compact --quiet {staged_files}
+
+lints:
+ parallel: true
+ commands:
+ rubocop:
+ glob: "*.rb"
+ run: bundle exec rubocop --parallel
+ prettier:
+ run: yarn prettier --list-different **/*.js
+ prettier-scss:
+ run: yarn prettier --list-different **/*.scss
+ eslint:
+ run: yarn eslint -f compact --quiet --ext .js .
diff --git a/lib/custom_wizard/action.rb b/lib/custom_wizard/action.rb
index 1e1c410c..ac0799f3 100644
--- a/lib/custom_wizard/action.rb
+++ b/lib/custom_wizard/action.rb
@@ -6,6 +6,14 @@ class CustomWizard::Action
:guardian,
:result
+ REQUIRES_USER = %w[
+ create_topic
+ update_profile
+ open_composer
+ watch_categories
+ add_to_group
+ ]
+
def initialize(opts)
@wizard = opts[:wizard]
@action = opts[:action]
@@ -17,6 +25,12 @@ class CustomWizard::Action
end
def perform
+ if REQUIRES_USER.include?(action['id']) && !@user
+ log_error("action requires user", "id: #{action['id']};")
+ @result.success = false
+ return @result
+ end
+
ActiveRecord::Base.transaction do
self.send(action['type'].to_sym)
end
@@ -43,9 +57,17 @@ class CustomWizard::Action
@mapper ||= CustomWizard::Mapper.new(user: user, data: mapper_data)
end
+ def callbacks_for(action)
+ self.class.callbacks[action] || []
+ end
+
def create_topic
params = basic_topic_params.merge(public_topic_params)
+ callbacks_for(:before_create_topic).each do |acb|
+ params = acb.call(params, @wizard, @action, @submission)
+ end
+
if params[:title].present? && params[:raw].present?
creator = PostCreator.new(user, params)
post = creator.create
@@ -68,7 +90,6 @@ class CustomWizard::Action
end
def send_message
-
if action['required'].present?
required = CustomWizard::Mapper.new(
inputs: action['required'],
@@ -115,13 +136,14 @@ class CustomWizard::Action
params[:archetype] = Archetype.private_message
- creator = PostCreator.new(user, params)
+ poster = user || Discourse.system_user
+ creator = PostCreator.new(poster, params)
post = creator.create
if creator.errors.present?
messages = creator.errors.full_messages.join(" ")
log_error("failed to create message", messages)
- elsif action['skip_redirect'].blank?
+ elsif user && action['skip_redirect'].blank?
@submission.redirect_on_complete = post.topic.url
end
@@ -182,6 +204,52 @@ class CustomWizard::Action
end
end
+ def watch_tags
+ tags = CustomWizard::Mapper.new(
+ inputs: action['tags'],
+ data: mapper_data,
+ user: user
+ ).perform
+
+ tags = [*tags]
+ level = action['notification_level'].to_sym
+
+ if level.blank?
+ log_error("Notifcation Level was not set. Exiting watch tags action")
+ return
+ end
+
+ users = []
+
+ if action['usernames']
+ mapped_users = CustomWizard::Mapper.new(
+ inputs: action['usernames'],
+ data: mapper_data,
+ user: user
+ ).perform
+
+ if mapped_users.present?
+ mapped_users = mapped_users.split(',')
+ .map { |username| User.find_by(username: username) }
+ users.push(*mapped_users)
+ end
+ end
+
+ if ActiveRecord::Type::Boolean.new.cast(action['wizard_user'])
+ users.push(user)
+ end
+
+ users.each do |user|
+ result = TagUser.batch_set(user, level, tags)
+
+ if result
+ log_success("#{user.username} notifications for #{tags} set to #{level}")
+ else
+ log_error("failed to set #{user.username} notifications for #{tags} to #{level}")
+ end
+ end
+ end
+
def watch_categories
watched_categories = CustomWizard::Mapper.new(
inputs: action['categories'],
@@ -388,11 +456,16 @@ class CustomWizard::Action
if new_group_params[:usernames].present?
user_ids = get_user_ids(new_group_params[:usernames])
+ if user_ids.count < new_group_params[:usernames].count
+ log_error("Warning, group creation: some users were not found!")
+ end
user_ids -= owner_ids if owner_ids
user_ids.each { |user_id| group.group_users.build(user_id: user_id) }
end
- log_success("Group created", group.name)
+ if group.save
+ log_success("Group created", group.name)
+ end
result.output = group.name
else
@@ -417,6 +490,15 @@ class CustomWizard::Action
end
end
+ def self.callbacks
+ @callbacks ||= {}
+ end
+
+ def self.register_callback(action, &block)
+ callbacks[action] ||= []
+ callbacks[action] << block
+ end
+
private
def action_category
@@ -481,8 +563,8 @@ class CustomWizard::Action
registered = registered_fields.select { |f| f.name == name }.first
if registered.present?
- klass = registered.klass
- type = registered.type
+ klass = registered.klass.to_sym
+ type = registered.type.to_sym
end
next if type === :json && json_attr.blank?
@@ -746,14 +828,13 @@ class CustomWizard::Action
end
def save_log
- log = "wizard: #{@wizard.id}; action: #{action['type']}; user: #{user.username}"
+ username = user ? user.username : @wizard.actor_id
- if @log.any?
- @log.each do |item|
- log += "; #{item.to_s}"
- end
- end
-
- CustomWizard::Log.create(log)
+ CustomWizard::Log.create(
+ @wizard.id,
+ action['type'],
+ username,
+ @log.join('; ')
+ )
end
end
diff --git a/lib/custom_wizard/api/endpoint.rb b/lib/custom_wizard/api/endpoint.rb
index 9dbbc590..97fc1127 100644
--- a/lib/custom_wizard/api/endpoint.rb
+++ b/lib/custom_wizard/api/endpoint.rb
@@ -74,7 +74,7 @@ class CustomWizard::Api::Endpoint
headers["Authorization"] = auth_string if auth_string
headers["Content-Type"] = content_type if content_type
- connection = Excon.new(UrlHelper.encode_and_parse(endpoint.url), headers: headers)
+ connection = Excon.new(endpoint.url, headers: headers)
params = { method: endpoint.method }
diff --git a/lib/custom_wizard/api/log_entry.rb b/lib/custom_wizard/api/log_entry.rb
index 3fe2969e..f4f0ce69 100644
--- a/lib/custom_wizard/api/log_entry.rb
+++ b/lib/custom_wizard/api/log_entry.rb
@@ -27,7 +27,7 @@ class CustomWizard::Api::LogEntry
log_id = new_data['log_id']
else
data = {}
- log_id = SecureRandom.hex(3)
+ log_id = SecureRandom.hex(8)
end
new_data.each do |k, v|
@@ -65,18 +65,18 @@ class CustomWizard::Api::LogEntry
data = ::JSON.parse(record['value'])
data[:log_id] = record['key'].split('_').last
this_user = User.find_by(id: data['user_id'])
- unless this_user.nil?
- data[:user_id] = this_user.id || nil
- data[:username] = this_user.username || ""
- data[:userpath] = "/u/#{this_user.username_lower}/activity"
- data[:name] = this_user.name || ""
- data[:avatar_template] = "/user_avatar/default/#{this_user.username_lower}/97/#{this_user.uploaded_avatar_id}.png"
- else
+ if this_user.nil?
data[:user_id] = nil
data[:username] = ""
data[:userpath] = ""
data[:name] = ""
data[:avatar_template] = ""
+ else
+ data[:user_id] = this_user.id || nil
+ data[:username] = this_user.username || ""
+ data[:userpath] = "/u/#{this_user.username_lower}/activity"
+ data[:name] = this_user.name || ""
+ data[:avatar_template] = "/user_avatar/default/#{this_user.username_lower}/97/#{this_user.uploaded_avatar_id}.png"
end
self.new(api_name, data)
end
diff --git a/lib/custom_wizard/builder.rb b/lib/custom_wizard/builder.rb
index 8279d070..0d0b689d 100644
--- a/lib/custom_wizard/builder.rb
+++ b/lib/custom_wizard/builder.rb
@@ -2,10 +2,10 @@
class CustomWizard::Builder
attr_accessor :wizard, :updater, :template
- def initialize(wizard_id, user = nil)
+ def initialize(wizard_id, user = nil, guest_id = nil)
@template = CustomWizard::Template.create(wizard_id)
return nil if @template.nil?
- @wizard = CustomWizard::Wizard.new(template.data, user)
+ @wizard = CustomWizard::Wizard.new(template.data, user, guest_id)
end
def self.sorted_handlers
@@ -21,13 +21,6 @@ class CustomWizard::Builder
@sorted_handlers.sort_by! { |h| -h[:priority] }
end
- def mapper
- CustomWizard::Mapper.new(
- user: @wizard.user,
- data: @wizard.current_submission&.fields_and_meta
- )
- end
-
def build(build_opts = {}, params = {})
return nil if !SiteSetting.custom_wizard_enabled || !@wizard
return @wizard if !@wizard.can_access? && !build_opts[:force]
@@ -79,6 +72,32 @@ class CustomWizard::Builder
@wizard
end
+ def check_condition(template)
+ if template['condition'].present?
+ result = CustomWizard::Mapper.new(
+ inputs: template['condition'],
+ user: @wizard.user,
+ data: @wizard.current_submission&.fields_and_meta,
+ opts: {
+ multiple: true
+ }
+ ).perform
+
+ result.any?
+ else
+ true
+ end
+ end
+
+ private
+
+ def mapper
+ CustomWizard::Mapper.new(
+ user: @wizard.user,
+ data: @wizard.current_submission&.fields_and_meta
+ )
+ end
+
def append_field(step, step_template, field_template, build_opts)
params = {
id: field_template['id'],
@@ -116,22 +135,14 @@ class CustomWizard::Builder
params[:limit] = field_template['limit']
end
+ if field_template['type'] === 'tag'
+ params[:can_create_tag] = standardise_boolean(field_template['can_create_tag'])
+ end
+
if field_template['type'] === 'category'
params[:property] = field_template['property']
end
- if field_template['type'] === 'category' || (
- field_template['validations'] &&
- field_template['validations']['similar_topics'] &&
- field_template['validations']['similar_topics']['categories'].present?
- )
- @wizard.needs_categories = true
- end
-
- if field_template['type'] === 'group'
- @wizard.needs_groups = true
- end
-
if (content_inputs = field_template['content']).present?
content = CustomWizard::Mapper.new(
inputs: content_inputs,
@@ -171,7 +182,7 @@ class CustomWizard::Builder
if field_template['description'].present?
params[:description] = mapper.interpolate(
field_template['description'],
- user: true,
+ user: @wizard.user,
value: true,
wizard: true,
template: true
@@ -181,7 +192,7 @@ class CustomWizard::Builder
if field_template['preview_template'].present?
preview_template = mapper.interpolate(
field_template['preview_template'],
- user: true,
+ user: @wizard.user,
value: true,
wizard: true,
template: true
@@ -193,7 +204,7 @@ class CustomWizard::Builder
if field_template['placeholder'].present?
params[:placeholder] = mapper.interpolate(
field_template['placeholder'],
- user: true,
+ user: @wizard.user,
value: true,
wizard: true,
template: true
@@ -213,23 +224,6 @@ class CustomWizard::Builder
end
end
- def check_condition(template)
- if template['condition'].present?
- result = CustomWizard::Mapper.new(
- inputs: template['condition'],
- user: @wizard.user,
- data: @wizard.current_submission&.fields_and_meta,
- opts: {
- multiple: true
- }
- ).perform
-
- result.any?
- else
- true
- end
- end
-
def check_if_permitted(step, step_template)
step.permitted = true
@@ -254,7 +248,7 @@ class CustomWizard::Builder
if step_template['description']
step.description = mapper.interpolate(
step_template['description'],
- user: true,
+ user: @wizard.user,
value: true,
wizard: true,
template: true
diff --git a/lib/custom_wizard/custom_field.rb b/lib/custom_wizard/custom_field.rb
index 9cc185ba..234ef0c7 100644
--- a/lib/custom_wizard/custom_field.rb
+++ b/lib/custom_wizard/custom_field.rb
@@ -17,6 +17,7 @@ class ::CustomWizard::CustomField
category: ["basic_category"],
post: ["post"]
}
+
TYPES ||= ["string", "boolean", "integer", "json"]
LIST_CACHE_KEY ||= 'custom_field_list'
@@ -37,6 +38,8 @@ class ::CustomWizard::CustomField
send("#{attr}=", value)
end
end
+
+ @subscription = CustomWizard::Subscription.new
end
def save
@@ -81,6 +84,10 @@ class ::CustomWizard::CustomField
next
end
+ if attr == 'klass' && !@subscription.includes?(:custom_field, :klass, value)
+ add_error(I18n.t("wizard.custom_field.error.subscription_type", type: value))
+ end
+
if attr == 'serializers' && (unsupported = value - CLASSES[klass.to_sym]).length > 0
add_error(I18n.t("#{i18n_key}.unsupported_serializers",
class: klass,
@@ -92,6 +99,10 @@ class ::CustomWizard::CustomField
add_error(I18n.t("#{i18n_key}.unsupported_type", type: value))
end
+ if attr == 'type' && !@subscription.includes?(:custom_field, :type, value)
+ add_error(I18n.t("wizard.custom_field.error.subscription_type", type: value))
+ end
+
if attr == 'name'
unless value.is_a?(String)
add_error(I18n.t("#{i18n_key}.name_invalid", name: value))
@@ -129,7 +140,7 @@ class ::CustomWizard::CustomField
end
def self.cached_list
- ::CustomWizard::Cache.wrap(LIST_CACHE_KEY) do
+ @custom_wizard_cached_fields ||= ::CustomWizard::Cache.wrap(LIST_CACHE_KEY) do
PluginStoreRow.where(plugin_name: NAMESPACE).map do |record|
create_from_store(record).as_json.with_indifferent_access
end
@@ -205,6 +216,7 @@ class ::CustomWizard::CustomField
end
def self.invalidate_cache
+ @custom_wizard_cached_fields = nil
CustomWizard::Cache.new(LIST_CACHE_KEY).delete
Discourse.clear_readonly!
Discourse.request_refresh!
@@ -222,16 +234,16 @@ class ::CustomWizard::CustomField
external = []
CLASSES.keys.each do |klass|
- field_types = klass.to_s.classify.constantize.custom_field_types
+ meta_data = klass.to_s.classify.constantize.send('custom_field_meta_data')
- if field_types.present?
- field_types.each do |name, type|
+ if meta_data.present?
+ meta_data.each do |name, data|
unless list.any? { |field| field.name === name }
field = new(
'external',
name: name,
klass: klass,
- type: type
+ type: data.type
)
external.push(field)
end
diff --git a/lib/custom_wizard/extensions/discourse_tagging.rb b/lib/custom_wizard/extensions/discourse_tagging.rb
index 3c81bbb3..701158bf 100644
--- a/lib/custom_wizard/extensions/discourse_tagging.rb
+++ b/lib/custom_wizard/extensions/discourse_tagging.rb
@@ -1,10 +1,9 @@
# frozen_string_literal: true
-require 'request_store'
module CustomWizardDiscourseTagging
def filter_allowed_tags(guardian, opts = {})
- if tag_groups = ::RequestStore.store[:tag_groups]
- tag_group_array = tag_groups.split(",")
+ if opts[:for_input].respond_to?(:dig) && (groups = opts.dig(:for_input, :groups)).present?
+ tag_group_array = groups.split(",")
filtered_tags = TagGroup.includes(:tags).where(name: tag_group_array).map do |tag_group|
tag_group.tags.pluck(:name)
end.flatten
diff --git a/lib/custom_wizard/extensions/tags_controller.rb b/lib/custom_wizard/extensions/tags_controller.rb
deleted file mode 100644
index 0ddacb5f..00000000
--- a/lib/custom_wizard/extensions/tags_controller.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# frozen_string_literal: true
-require 'request_store'
-
-module CustomWizardTagsController
- def search
- ::RequestStore.store[:tag_groups] = params[:tag_groups] if params[:tag_groups].present?
- super
- end
-end
diff --git a/lib/custom_wizard/field.rb b/lib/custom_wizard/field.rb
index 65f29504..ec85ff3a 100644
--- a/lib/custom_wizard/field.rb
+++ b/lib/custom_wizard/field.rb
@@ -11,7 +11,7 @@ class CustomWizard::Field
:label,
:description,
:image,
- :key,
+ :image_upload_id,
:validations,
:min_length,
:max_length,
@@ -22,12 +22,18 @@ class CustomWizard::Field
:property,
:content,
:tag_groups,
+ :can_create_tag,
:preview_template,
:placeholder
attr_accessor :index,
:step
+ REQUIRES_USER = %w[
+ composer
+ upload
+ ]
+
def initialize(attrs)
@raw = attrs || {}
@id = attrs[:id]
@@ -37,7 +43,6 @@ class CustomWizard::Field
@value = attrs[:value] || default_value
@description = attrs[:description]
@image = attrs[:image]
- @key = attrs[:key]
@validations = attrs[:validations]
@min_length = attrs[:min_length]
@max_length = attrs[:max_length]
@@ -48,6 +53,7 @@ class CustomWizard::Field
@property = attrs[:property]
@content = attrs[:content]
@tag_groups = attrs[:tag_groups]
+ @can_create_tag = attrs[:can_create_tag]
@preview_template = attrs[:preview_template]
@placeholder = attrs[:placeholder]
end
@@ -114,7 +120,8 @@ class CustomWizard::Field
limit: nil,
prefill: nil,
content: nil,
- tag_groups: nil
+ tag_groups: nil,
+ can_create_tag: false
},
category: {
limit: 1,
@@ -131,17 +138,22 @@ class CustomWizard::Field
end
def self.require_assets
+ Rails.logger.warn("Custom Wizard field regisration no longer requires asset registration. Support will be removed in v2.1.0.")
+
@require_assets ||= {}
end
- def self.register(type, plugin = nil, asset_paths = [], opts = {})
+ def self.register(type, plugin = nil, opts = {}, legacy_opts = {})
+ if opts.is_a?(Array)
+ Rails.logger.warn("Custom Wizard field regisration no longer requires asset registration. Support will be removed in v2.1.0.")
+
+ require_assets[plugin] = opts
+ opts = legacy_opts
+ end
+
if type
types[type.to_sym] ||= {}
types[type.to_sym] = opts[:type_opts] if opts[:type_opts].present?
end
-
- if plugin && asset_paths
- require_assets[plugin] = asset_paths
- end
end
end
diff --git a/lib/custom_wizard/log.rb b/lib/custom_wizard/log.rb
index fc747440..ed9624e1 100644
--- a/lib/custom_wizard/log.rb
+++ b/lib/custom_wizard/log.rb
@@ -2,40 +2,51 @@
class CustomWizard::Log
include ActiveModel::Serialization
- attr_accessor :message, :date
+ attr_reader :date, :wizard_id, :action, :username, :message
+ attr_accessor :user
PAGE_LIMIT = 100
def initialize(attrs)
- @message = attrs['message']
@date = attrs['date']
+ @action = attrs['action']
+ @message = attrs['message']
+ @wizard_id = attrs['wizard_id']
+ @username = attrs['username']
end
- def self.create(message)
+ def self.create(wizard_id, action, username, message, date = Time.now)
log_id = SecureRandom.hex(12)
PluginStore.set('custom_wizard_log',
log_id.to_s,
{
- date: Time.now,
+ date: date,
+ wizard_id: wizard_id,
+ action: action,
+ username: username,
message: message
}
)
end
- def self.list_query
- PluginStoreRow.where("
- plugin_name = 'custom_wizard_log' AND
- (value::json->'date') IS NOT NULL
- ").order("value::json->>'date' DESC")
+ def self.list_query(wizard_id = nil)
+ query = PluginStoreRow.where("plugin_name = 'custom_wizard_log' AND (value::json->'date') IS NOT NULL")
+ query = query.where("(value::json->>'wizard_id') = ?", wizard_id) if wizard_id
+ query.order("value::json->>'date' DESC")
end
- def self.list(page = 0, limit = nil)
+ def self.list(page = 0, limit = nil, wizard_id = nil)
limit = limit.to_i > 0 ? limit.to_i : PAGE_LIMIT
page = page.to_i
+ logs = self.list_query(wizard_id)
- self.list_query.limit(limit)
+ result = OpenStruct.new(logs: [], total: nil)
+ result.total = logs.size
+ result.logs = logs.limit(limit)
.offset(page * limit)
.map { |r| self.new(JSON.parse(r.value)) }
+
+ result
end
end
diff --git a/lib/custom_wizard/mapper.rb b/lib/custom_wizard/mapper.rb
index 0ded76cf..66a10736 100644
--- a/lib/custom_wizard/mapper.rb
+++ b/lib/custom_wizard/mapper.rb
@@ -30,6 +30,7 @@ class CustomWizard::Mapper
OPERATORS = {
equal: '==',
+ not_equal: "!=",
greater: '>',
less: '<',
greater_or_equal: '>=',
@@ -44,7 +45,7 @@ class CustomWizard::Mapper
def initialize(params)
@inputs = params[:inputs] || {}
- @data = params[:data] || {}
+ @data = params[:data] ? params[:data].with_indifferent_access : {}
@user = params[:user]
@opts = params[:opts] || {}
end
@@ -203,6 +204,8 @@ class CustomWizard::Mapper
end
def map_user_field(value)
+ return nil unless user
+
if value.include?(User::USER_FIELD_PREFIX)
user.custom_fields[value]
elsif PROFILE_FIELDS.include?(value)
@@ -211,6 +214,8 @@ class CustomWizard::Mapper
user.send(value)
elsif USER_OPTION_FIELDS.include?(value)
user.user_option.send(value)
+ elsif value.include?('avatar')
+ get_avatar_url(value)
else
nil
end
@@ -227,7 +232,7 @@ class CustomWizard::Mapper
def interpolate(string, opts = { user: true, wizard: true, value: true, template: false })
return string if string.blank? || string.frozen?
- if opts[:user]
+ if opts[:user] && @user.present?
string.gsub!(/u\{(.*?)\}/) { |match| map_user_field($1) || '' }
end
@@ -251,7 +256,7 @@ class CustomWizard::Mapper
end
end
- if opts[:template]
+ if opts[:template] #&& CustomWizard::Subscription.subscribed?
template = Liquid::Template.parse(string)
string = template.render(data)
end
@@ -263,10 +268,30 @@ class CustomWizard::Mapper
return nil if data.nil?
k = keys.shift
result = data[k]
- keys.empty? ? result : self.recurse(result, keys)
+
+ if keys.empty?
+ result.is_a?(Hash) ? "" : result
+ else
+ self.recurse(result, keys)
+ end
end
def bool(value)
ActiveRecord::Type::Boolean.new.cast(value)
end
+
+ def get_avatar_url(value)
+ parts = value.split('.')
+ valid_sizes = Discourse.avatar_sizes.to_a
+
+ if value === 'avatar' || parts.size === 1 || valid_sizes.exclude?(parts.last.to_i)
+ user.small_avatar_url
+ else
+ user.avatar_template_url.gsub("{size}", parts.last)
+ end
+ end
+
+ def self.mapped_value?(value)
+ value.is_a?(Array) && value.all? { |v| v.is_a?(Hash) && v.key?("type") }
+ end
end
diff --git a/lib/custom_wizard/step.rb b/lib/custom_wizard/step.rb
index 5ffd8024..4bc7c68b 100644
--- a/lib/custom_wizard/step.rb
+++ b/lib/custom_wizard/step.rb
@@ -9,13 +9,13 @@ class CustomWizard::Step
attr_accessor :index,
:title,
:description,
- :key,
:permitted,
:permitted_message,
:fields,
:next,
:previous,
:banner,
+ :banner_upload_id,
:disabled,
:description_vars,
:last_step,
diff --git a/lib/custom_wizard/step_updater.rb b/lib/custom_wizard/step_updater.rb
index ab86f3fa..511001c2 100644
--- a/lib/custom_wizard/step_updater.rb
+++ b/lib/custom_wizard/step_updater.rb
@@ -5,8 +5,7 @@ class CustomWizard::StepUpdater
attr_accessor :refresh_required, :result
attr_reader :step, :submission
- def initialize(current_user, wizard, step, submission)
- @current_user = current_user
+ def initialize(wizard, step, submission)
@wizard = wizard
@step = step
@refresh_required = false
@@ -22,9 +21,9 @@ class CustomWizard::StepUpdater
@step.updater.call(self)
- UserHistory.create(
- action: UserHistory.actions[:custom_wizard_step],
- acting_user_id: @current_user.id,
+ CustomWizard::UserHistory.create(
+ action: CustomWizard::UserHistory.actions[:step],
+ actor_id: @wizard.actor_id,
context: @wizard.id,
subject: @step.id
)
diff --git a/lib/custom_wizard/submission.rb b/lib/custom_wizard/submission.rb
index 61bb008a..7387902e 100644
--- a/lib/custom_wizard/submission.rb
+++ b/lib/custom_wizard/submission.rb
@@ -2,12 +2,11 @@
class CustomWizard::Submission
include ActiveModel::SerializerSupport
+ PAGE_LIMIT = 50
KEY ||= "submissions"
META ||= %w(updated_at submitted_at route_to redirect_on_complete redirect_to)
attr_reader :id,
- :user,
- :user_id,
:wizard
attr_accessor :fields,
@@ -17,15 +16,8 @@ class CustomWizard::Submission
class_eval { attr_accessor attr }
end
- def initialize(wizard, data = {}, user_id = nil)
+ def initialize(wizard, data = {})
@wizard = wizard
- @user_id = user_id
-
- if user_id
- @user = User.find_by(id: user_id)
- else
- @user = wizard.user
- end
data = (data || {}).with_indifferent_access
@id = data['id'] || SecureRandom.hex(12)
@@ -43,13 +35,13 @@ class CustomWizard::Submission
return nil unless wizard.save_submissions
validate
- submission_list = self.class.list(wizard, user_id: user.id)
- submissions = submission_list.select { |submission| submission.id != self.id }
+ submission_list = self.class.list(wizard)
+ submissions = submission_list.submissions.select { |submission| submission.id != self.id }
self.updated_at = Time.now.iso8601
submissions.push(self)
submission_data = submissions.map { |submission| data_to_save(submission) }
- PluginStore.set("#{wizard.id}_#{KEY}", user.id, submission_data)
+ PluginStore.set("#{wizard.id}_#{KEY}", wizard.actor_id, submission_data)
end
def validate
@@ -92,26 +84,26 @@ class CustomWizard::Submission
data
end
- def self.get(wizard, user_id)
- data = PluginStore.get("#{wizard.id}_#{KEY}", user_id).first
- new(wizard, data, user_id)
+ def submitted?
+ !!submitted_at
+ end
+
+ def self.get(wizard)
+ data = PluginStore.get("#{wizard.id}_#{KEY}", wizard.actor_id).last
+ new(wizard, data)
end
def remove
if present?
- user_id = @user.id
- wizard_id = @wizard.id
- submission_id = @id
- data = PluginStore.get("#{wizard_id}_#{KEY}", user_id)
- data.delete_if { |sub| sub["id"] == submission_id }
- PluginStore.set("#{wizard_id}_#{KEY}", user_id, data)
+ data = PluginStore.get("#{@wizard.id}_#{KEY}", wizard.actor_id)
+ data.delete_if { |sub| sub["id"] == @id }
+ PluginStore.set("#{@wizard.id}_#{KEY}", wizard.actor_id, data)
end
end
def self.cleanup_incomplete_submissions(wizard)
- user_id = wizard.user.id
- all_submissions = list(wizard, user_id: user_id)
- sorted_submissions = all_submissions.sort_by do |submission|
+ all_submissions = list(wizard)
+ sorted_submissions = all_submissions.submissions.sort_by do |submission|
zero_epoch_time = DateTime.strptime("0", '%s')
[
submission.submitted_at ? Time.iso8601(submission.submitted_at) : zero_epoch_time,
@@ -128,26 +120,47 @@ class CustomWizard::Submission
end
valid_data = valid_submissions.map { |submission| submission.data_to_save(submission) }
- PluginStore.set("#{wizard.id}_#{KEY}", user_id, valid_data)
+ PluginStore.set("#{wizard.id}_#{KEY}", wizard.actor_id, valid_data)
end
- def self.list(wizard, user_id: nil, order_by: nil)
+ def self.list(wizard, order_by: nil, page: nil)
+ list_actor_id = wizard.actor_id
+ list_user = wizard.user if wizard.user.present?
+
params = { plugin_name: "#{wizard.id}_#{KEY}" }
- params[:key] = user_id if user_id.present?
+ params[:key] = list_actor_id if list_actor_id
query = PluginStoreRow.where(params)
- query = query.order("#{order_by} DESC") if order_by.present?
+ query = query.order(order_by) if order_by
- result = []
+ result = OpenStruct.new(submissions: [], total: nil)
query.each do |record|
if (submission_data = ::JSON.parse(record.value)).any?
+ submission_user = list_user || User.find_by(id: record.key.to_i)
+
submission_data.each do |data|
- result.push(new(wizard, data, record.key))
+ _wizard = wizard.clone
+ _wizard.user = submission_user if submission_user.present?
+ result.submissions.push(new(_wizard, data))
end
end
end
+ result.total = result.submissions.size
+ result.submissions.sort_by! { |h| [h.submitted_at ? 1 : 0, h.submitted_at] }.reverse!
+
+ if !page.nil?
+ start = page * PAGE_LIMIT
+ length = PAGE_LIMIT
+
+ if result.submissions.length > start
+ result.submissions = result.submissions[start, length]
+ else
+ result.submissions = []
+ end
+ end
+
result
end
end
diff --git a/lib/custom_wizard/subscription.rb b/lib/custom_wizard/subscription.rb
new file mode 100644
index 00000000..96efe92c
--- /dev/null
+++ b/lib/custom_wizard/subscription.rb
@@ -0,0 +1,228 @@
+# frozen_string_literal: true
+require "discourse_subscription_client"
+
+class CustomWizard::Subscription
+ PRODUCT_HIERARCHY = %w[
+ community
+ standard
+ business
+ ]
+
+ def self.attributes
+ {
+ wizard: {
+ required: {
+ none: [],
+ standard: ['*'],
+ business: ['*'],
+ community: ['*']
+ },
+ permitted: {
+ none: [],
+ standard: ['*'],
+ business: ['*'],
+ community: ['*', "!#{CustomWizard::Wizard::GUEST_GROUP_ID}"]
+ },
+ restart_on_revisit: {
+ none: [],
+ standard: ['*'],
+ business: ['*'],
+ community: ['*']
+ }
+ },
+ step: {
+ condition: {
+ none: [],
+ standard: ['*'],
+ business: ['*'],
+ community: ['*']
+ },
+ required_data: {
+ none: [],
+ standard: ['*'],
+ business: ['*'],
+ community: ['*']
+ },
+ permitted_params: {
+ none: [],
+ standard: ['*'],
+ business: ['*'],
+ community: ['*']
+ }
+ },
+ field: {
+ condition: {
+ none: [],
+ standard: ['*'],
+ business: ['*'],
+ community: ['*']
+ },
+ type: {
+ none: ['text', 'textarea', 'text_only', 'date', 'time', 'date_time', 'number', 'checkbox', 'dropdown', 'upload'],
+ standard: ['*'],
+ business: ['*'],
+ community: ['*']
+ },
+ realtime_validations: {
+ none: [],
+ standard: ['*'],
+ business: ['*'],
+ community: ['*']
+ }
+ },
+ action: {
+ type: {
+ none: ['create_topic', 'update_profile', 'open_composer', 'route_to'],
+ standard: ['create_topic', 'update_profile', 'open_composer', 'route_to', 'send_message', 'watch_categories', 'watch_tags', 'add_to_group'],
+ business: ['*'],
+ community: ['*']
+ }
+ },
+ custom_field: {
+ klass: {
+ none: ['topic', 'post'],
+ standard: ['topic', 'post'],
+ business: ['*'],
+ community: ['*']
+ },
+ type: {
+ none: ['string', 'boolean', 'integer'],
+ standard: ['string', 'boolean', 'integer'],
+ business: ['*'],
+ community: ['*']
+ }
+ },
+ api: {
+ all: {
+ none: [],
+ standard: [],
+ business: ['*'],
+ community: ['*']
+ }
+ }
+ }
+ end
+
+ attr_accessor :product_id,
+ :product_slug
+
+ def initialize(update = false)
+ if update
+ ::DiscourseSubscriptionClient::Subscriptions.update
+ end
+
+ result = ::DiscourseSubscriptionClient.find_subscriptions("discourse-custom-wizard")
+
+ if result&.any?
+ ids_and_slugs = result.subscriptions.map do |subscription|
+ {
+ id: subscription.product_id,
+ slug: result.products[subscription.product_id]
+ }
+ end
+
+ id_and_slug = ids_and_slugs.sort do |a, b|
+ PRODUCT_HIERARCHY.index(b[:slug]) - PRODUCT_HIERARCHY.index(a[:slug])
+ end.first
+
+ @product_id = id_and_slug[:id]
+ @product_slug = id_and_slug[:slug]
+ end
+
+ @product_slug ||= ENV["CUSTOM_WIZARD_PRODUCT_SLUG"]
+ end
+
+ def includes?(feature, attribute, value = nil)
+ attributes = self.class.attributes[feature]
+
+ ## Attribute is not part of a subscription
+ return true unless attributes.present? && attributes.key?(attribute)
+
+ values = attributes[attribute][type]
+
+ ## Subscription type does not support the attribute.
+ return false if values.blank?
+
+ ## Value is an exception for the subscription type
+ if (exceptions = get_exceptions(values)).any?
+ value = mapped_output(value) if CustomWizard::Mapper.mapped_value?(value)
+ value = [*value].map(&:to_s)
+ return false if (exceptions & value).length > 0
+ end
+
+ ## Subscription type supports all values of the attribute.
+ return true if values.include?("*")
+
+ ## Subscription type supports some values of the attributes.
+ values.include?(value)
+ end
+
+ def type
+ return :none unless subscribed?
+ return :business if business?
+ return :standard if standard?
+ :community if community?
+ end
+
+ def subscribed?
+ standard? || business? || community?
+ end
+
+ def standard?
+ product_slug === "standard"
+ end
+
+ def business?
+ product_slug === "business"
+ end
+
+ def community?
+ product_slug === "community"
+ end
+
+ # TODO candidate for removal once code that depends on it externally is no longer used.
+ def self.client_installed?
+ defined?(DiscourseSubscriptionClient) == 'constant' && DiscourseSubscriptionClient.class == Module
+ end
+
+ def self.subscribed?
+ new.subscribed?
+ end
+
+ def self.business?
+ new.business?
+ end
+
+ def self.community?
+ new.community?
+ end
+
+ def self.standard?
+ new.standard?
+ end
+
+ def self.type
+ new.type
+ end
+
+ def self.includes?(feature, attribute, value)
+ new.includes?(feature, attribute, value)
+ end
+
+ protected
+
+ def get_exceptions(values)
+ values.reduce([]) do |result, value|
+ result << value.split("!").last if value.start_with?("!")
+ result
+ end
+ end
+
+ def mapped_output(value)
+ value.reduce([]) do |result, v|
+ ## We can only validate mapped assignment values at the moment
+ result << v["output"] if v.is_a?(Hash) && v["type"] === "assignment"
+ result
+ end.flatten
+ end
+end
diff --git a/lib/custom_wizard/template.rb b/lib/custom_wizard/template.rb
index b57ebbd8..9674f64a 100644
--- a/lib/custom_wizard/template.rb
+++ b/lib/custom_wizard/template.rb
@@ -23,12 +23,12 @@ class CustomWizard::Template
normalize_data
validate_data
prepare_data
-
return false if errors.any?
ActiveRecord::Base.transaction do
schedule_save_jobs unless opts[:skip_jobs]
PluginStore.set(CustomWizard::PLUGIN_NAME, @data[:id], @data)
+ ensure_wizard_upload_references!
end
self.class.clear_cache_keys
@@ -52,13 +52,20 @@ class CustomWizard::Template
PluginStore.get(CustomWizard::PLUGIN_NAME, wizard_id)
end
+ def self.find_record(wizard_id)
+ PluginStoreRow.find_by(plugin_name: CustomWizard::PLUGIN_NAME, key: wizard_id)
+ end
+
def self.remove(wizard_id)
wizard = CustomWizard::Wizard.create(wizard_id)
return false if !wizard
ActiveRecord::Base.transaction do
+ ensure_wizard_upload_references!(wizard_id)
PluginStore.remove(CustomWizard::PLUGIN_NAME, wizard.id)
clear_user_wizard_redirect(wizard_id, after_time: !!wizard.after_time)
+ related_custom_fields = CategoryCustomField.where(name: 'create_topic_wizard', value: wizard.name.parameterize(separator: "_"))
+ related_custom_fields.destroy_all
end
clear_cache_keys
@@ -123,6 +130,18 @@ class CustomWizard::Template
CustomWizard::Cache.new(AFTER_TIME_CACHE_KEY).delete
end
+ def self.ensure_wizard_upload_references!(wizard_id, wizard_upload_ids = [])
+ wizard_record = find_record(wizard_id)
+
+ if wizard_record
+ UploadReference.ensure_exist!(
+ upload_ids: wizard_upload_ids,
+ target_type: "PluginStoreRow",
+ target_id: wizard_record.id
+ )
+ end
+ end
+
private
def normalize_data
@@ -176,4 +195,19 @@ class CustomWizard::Template
object.delete(:index)
end
end
+
+ def ensure_wizard_upload_references!
+ upload_ids = []
+
+ @data[:steps].each do |step|
+ upload_ids << step[:banner_upload_id] if step[:banner_upload_id]
+
+ step[:fields].each do |field|
+ upload_ids << field[:image_upload_id] if field[:image_upload_id]
+ end
+ end
+
+ upload_ids = upload_ids.select { |upload_id| Upload.exists?(upload_id) }
+ self.class.ensure_wizard_upload_references!(@data[:id], upload_ids)
+ end
end
diff --git a/lib/custom_wizard/user_history.rb b/lib/custom_wizard/user_history.rb
new file mode 100644
index 00000000..1d5ee3e1
--- /dev/null
+++ b/lib/custom_wizard/user_history.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+UserHistory.actions[:custom_wizard_step] = 1000
+
+class CustomWizard::UserHistory
+ def self.where(actor_id: nil, action: nil, context: nil, subject: nil)
+ ::UserHistory.where(where_opts(actor_id, action, context, subject))
+ end
+
+ def self.create(actor_id: nil, action: nil, context: nil, subject: nil)
+ ::UserHistory.create(create_opts(actor_id, action, context, subject))
+ end
+
+ def self.create!(actor_id: nil, action: nil, context: nil, subject: nil)
+ ::UserHistory.create!(create_opts(actor_id, action, context, subject))
+ end
+
+ def self.actions
+ @actions ||=
+ Enum.new(
+ step: UserHistory.actions[:custom_wizard_step]
+ )
+ end
+
+ def self.where_opts(actor_id, action, context, subject)
+ opts = {
+ context: context
+ }
+ opts[:action] = action if action
+ opts[:subject] = subject if subject
+ add_actor(opts, actor_id)
+ end
+
+ def self.create_opts(actor_id, action, context, subject)
+ opts = {
+ action: action,
+ context: context
+ }
+ opts[:subject] = subject if subject
+ add_actor(opts, actor_id)
+ end
+
+ def self.add_actor(opts, actor_id)
+ acting_user_id = actor_id
+
+ if actor_id.is_a?(String) && actor_id.include?(CustomWizard::Wizard::GUEST_ID_PREFIX)
+ opts[:acting_user_id] = Discourse.system_user.id
+ opts[:details] = actor_id
+ else
+ opts[:acting_user_id] = actor_id
+ end
+
+ opts
+ end
+end
diff --git a/lib/custom_wizard/validators/template.rb b/lib/custom_wizard/validators/template.rb
index e2820c97..f2a4feb0 100644
--- a/lib/custom_wizard/validators/template.rb
+++ b/lib/custom_wizard/validators/template.rb
@@ -6,6 +6,7 @@ class CustomWizard::TemplateValidator
def initialize(data, opts = {})
@data = data
@opts = opts
+ @subscription = CustomWizard::Subscription.new
end
def perform
@@ -15,25 +16,31 @@ class CustomWizard::TemplateValidator
check_required(data, :wizard)
validate_after_signup
validate_after_time
+ validate_subscription(data, :wizard)
return false if errors.any?
data[:steps].each do |step|
check_required(step, :step)
+ validate_subscription(step, :step)
validate_liquid_template(step, :step)
if step[:fields].present?
step[:fields].each do |field|
+ validate_subscription(field, :field)
check_required(field, :field)
validate_liquid_template(field, :field)
+ validate_guests(field, :field)
end
end
end
if data[:actions].present?
data[:actions].each do |action|
+ validate_subscription(action, :action)
check_required(action, :action)
validate_liquid_template(action, :action)
+ validate_guests(action, :action)
end
end
@@ -52,19 +59,44 @@ class CustomWizard::TemplateValidator
private
def check_required(object, type)
- CustomWizard::TemplateValidator.required[type].each do |property|
+ self.class.required[type].each do |property|
if object[property].blank?
errors.add :base, I18n.t("wizard.validation.required", property: property)
end
end
end
+ def validate_subscription(object, type)
+ object.keys.each do |property|
+ value = object[property]
+
+ if !@subscription.includes?(type, property.to_sym, value)
+ errors.add :base, I18n.t("wizard.validation.subscription", type: type.to_s, property: property)
+ end
+ end
+ end
+
def check_id(object, type)
if type === :wizard && @opts[:create] && CustomWizard::Template.exists?(object[:id])
errors.add :base, I18n.t("wizard.validation.conflict", wizard_id: object[:id])
end
end
+ def validate_guests(object, type)
+ guests_permitted = @data[:permitted] && @data[:permitted].any? do |m|
+ m["output"]&.include?(CustomWizard::Wizard::GUEST_GROUP_ID)
+ end
+ return unless guests_permitted
+
+ if type === :action && CustomWizard::Action::REQUIRES_USER.include?(object[:type])
+ errors.add :base, I18n.t("wizard.validation.not_permitted_for_guests", object_id: object[:id])
+ end
+
+ if type === :field && CustomWizard::Field::REQUIRES_USER.include?(object[:type])
+ errors.add :base, I18n.t("wizard.validation.not_permitted_for_guests", object_id: object[:id])
+ end
+ end
+
def validate_after_signup
return unless ActiveRecord::Type::Boolean.new.cast(@data[:after_signup])
diff --git a/lib/custom_wizard/validators/update.rb b/lib/custom_wizard/validators/update.rb
index d71bded1..869f7dca 100644
--- a/lib/custom_wizard/validators/update.rb
+++ b/lib/custom_wizard/validators/update.rb
@@ -128,7 +128,7 @@ class ::CustomWizard::UpdateValidator
return @ctx if @ctx
@ctx = PrettyText.v8
- PrettyText.ctx_load(@ctx, "#{Rails.root}/vendor/assets/javascripts/moment.js")
+ @ctx.load("#{Rails.root}/vendor/assets/javascripts/moment.js")
@ctx
end
end
diff --git a/lib/custom_wizard/wizard.rb b/lib/custom_wizard/wizard.rb
index 90177b82..bb22f873 100644
--- a/lib/custom_wizard/wizard.rb
+++ b/lib/custom_wizard/wizard.rb
@@ -4,8 +4,6 @@ require_dependency 'wizard/field'
require_dependency 'wizard/step_updater'
require_dependency 'wizard/builder'
-UserHistory.actions[:custom_wizard_step] = 1000
-
class CustomWizard::Wizard
include ActiveModel::SerializerSupport
@@ -23,8 +21,6 @@ class CustomWizard::Wizard
:restart_on_revisit,
:resume_on_revisit,
:permitted,
- :needs_categories,
- :needs_groups,
:steps,
:step_ids,
:field_ids,
@@ -33,12 +29,22 @@ class CustomWizard::Wizard
:actions,
:action_ids,
:user,
- :submissions
+ :guest_id,
+ :submissions,
+ :template
attr_reader :all_step_ids
- def initialize(attrs = {}, user = nil)
- @user = user
+ GUEST_ID_PREFIX ||= "guest"
+ GUEST_GROUP_ID = -1
+
+ def initialize(attrs = {}, user = nil, guest_id = nil)
+ if user
+ @user = user
+ elsif guest_id
+ @guest_id = guest_id
+ end
+
attrs = attrs.with_indifferent_access
@id = attrs['id']
@@ -54,8 +60,6 @@ class CustomWizard::Wizard
@after_time_scheduled = attrs['after_time_scheduled']
@required = cast_bool(attrs['required'])
@permitted = attrs['permitted'] || nil
- @needs_categories = false
- @needs_groups = false
@theme_id = attrs['theme_id']
if attrs['theme'].present?
@@ -81,6 +85,11 @@ class CustomWizard::Wizard
@actions = attrs['actions'] || []
@action_ids = @actions.map { |a| a['id'] }
+ @template = attrs
+ end
+
+ def actor_id
+ user ? user.id : guest_id
end
def cast_bool(val)
@@ -136,24 +145,23 @@ class CustomWizard::Wizard
step.last_step = true
end
- if step.previous && step.previous.id === last_completed_step_id
+ if !@restart_on_revisit && step.previous && step.previous.id === last_completed_step_id
@start = step.id
end
end
end
def last_completed_step_id
- if user && unfinished? && last_completed_step = ::UserHistory.where(
- acting_user_id: user.id,
- action: ::UserHistory.actions[:custom_wizard_step],
- context: id,
- subject: all_step_ids
- ).order("created_at").last
+ return nil unless actor_id && unfinished?
- last_completed_step.subject
- else
- nil
- end
+ last_completed_step = CustomWizard::UserHistory.where(
+ actor_id: actor_id,
+ action: CustomWizard::UserHistory.actions[:step],
+ context: id,
+ subject: all_step_ids
+ ).order("created_at").last
+
+ last_completed_step&.subject
end
def find_step(step_id)
@@ -163,15 +171,16 @@ class CustomWizard::Wizard
def create_updater(step_id, submission)
step = @steps.find { |s| s.id == step_id }
wizard = self
- CustomWizard::StepUpdater.new(user, wizard, step, submission)
+ CustomWizard::StepUpdater.new(wizard, step, submission)
end
def unfinished?
- return nil if !user
+ return nil unless actor_id
+ return false if last_submission&.submitted?
- most_recent = ::UserHistory.where(
- acting_user_id: user.id,
- action: ::UserHistory.actions[:custom_wizard_step],
+ most_recent = CustomWizard::UserHistory.where(
+ actor_id: actor_id,
+ action: CustomWizard::UserHistory.actions[:step],
context: id,
).distinct.order('updated_at DESC').first
@@ -185,11 +194,12 @@ class CustomWizard::Wizard
end
def completed?
- return nil if !user
+ return nil unless actor_id
+ return true if last_submission&.submitted?
- history = ::UserHistory.where(
- acting_user_id: user.id,
- action: ::UserHistory.actions[:custom_wizard_step],
+ history = CustomWizard::UserHistory.where(
+ actor_id: actor_id,
+ action: CustomWizard::UserHistory.actions[:step],
context: id
)
@@ -202,8 +212,9 @@ class CustomWizard::Wizard
end
def permitted?
- return false unless user
- return true if user.admin? || permitted.blank?
+ return nil unless actor_id
+ return true if user && (user.admin? || permitted.blank?)
+ return false if !user && permitted.blank?
mapper = CustomWizard::Mapper.new(
inputs: permitted,
@@ -217,40 +228,37 @@ class CustomWizard::Wizard
return true if mapper.blank?
mapper.all? do |m|
- if m[:type] === 'assignment'
- [*m[:result]].include?(Group::AUTO_GROUPS[:everyone]) ||
- GroupUser.exists?(group_id: m[:result], user_id: user.id)
- elsif m[:type] === 'validation'
- m[:result]
+ if !user
+ m[:type] === 'assignment' && [*m[:result]].include?(GUEST_GROUP_ID)
else
- true
+ if m[:type] === 'assignment'
+ [*m[:result]].include?(GUEST_GROUP_ID) ||
+ [*m[:result]].include?(Group::AUTO_GROUPS[:everyone]) ||
+ GroupUser.exists?(group_id: m[:result], user_id: user.id)
+ elsif m[:type] === 'validation'
+ m[:result]
+ else
+ true
+ end
end
end
end
def can_access?
- return false unless user
- return true if user.admin
- permitted? && (multiple_submissions || !completed?)
+ permitted? && (user&.admin? || (multiple_submissions || !completed?))
end
def reset
- ::UserHistory.create(
- action: ::UserHistory.actions[:custom_wizard_step],
- acting_user_id: user.id,
+ return nil unless actor_id
+
+ CustomWizard::UserHistory.create(
+ action: CustomWizard::UserHistory.actions[:step],
+ actor_id: actor_id,
context: id,
subject: "reset"
)
end
- def categories
- @categories ||= ::Site.new(Guardian.new(user)).categories
- end
-
- def groups
- @groups ||= ::Site.new(Guardian.new(user)).groups
- end
-
def update_step_ids
@step_ids = steps.map(&:id)
end
@@ -273,8 +281,11 @@ class CustomWizard::Wizard
end
def submissions
- return nil unless user.present?
- @submissions ||= CustomWizard::Submission.list(self, user_id: user.id)
+ @submissions ||= CustomWizard::Submission.list(self).submissions
+ end
+
+ def last_submission
+ @last_submission ||= submissions&.last
end
def current_submission
@@ -310,26 +321,28 @@ class CustomWizard::Wizard
end
def remove_user_redirect
+ return unless user.present?
+
if id == user.redirect_to_wizard
user.custom_fields.delete('redirect_to_wizard')
user.save_custom_fields(true)
end
end
- def self.create(wizard_id, user = nil)
+ def self.create(wizard_id, user = nil, guest_id = nil)
if template = CustomWizard::Template.find(wizard_id)
- new(template.to_h, user)
+ new(template.to_h, user, guest_id)
else
false
end
end
- def self.list(user, template_opts: {}, not_completed: false)
+ def self.list(user, template_opts = {}, not_completed = false)
return [] unless user
- CustomWizard::Template.list(template_opts).reduce([]) do |result, template|
+ CustomWizard::Template.list(**template_opts).reduce([]) do |result, template|
wizard = new(template, user)
- result.push(wizard) if wizard.can_access? && (
+ result.push(wizard) if wizard.permitted? && (
!not_completed || !wizard.completed?
)
result
@@ -339,7 +352,7 @@ class CustomWizard::Wizard
def self.after_signup(user)
wizards = list(
user,
- template_opts: {
+ {
setting: 'after_signup',
order: "(value::json ->> 'permitted') IS NOT NULL DESC"
}
@@ -350,11 +363,11 @@ class CustomWizard::Wizard
def self.prompt_completion(user)
wizards = list(
user,
- template_opts: {
+ {
setting: 'prompt_completion',
order: "(value::json ->> 'permitted') IS NOT NULL DESC"
},
- not_completed: true
+ true
)
if wizards.any?
wizards.map do |w|
@@ -390,4 +403,8 @@ class CustomWizard::Wizard
false
end
end
+
+ def self.generate_guest_id
+ "#{self::GUEST_ID_PREFIX}_#{SecureRandom.hex(12)}"
+ end
end
diff --git a/lib/discourse_plugin_statistics/plugin.rb b/lib/discourse_plugin_statistics/plugin.rb
new file mode 100644
index 00000000..70e62889
--- /dev/null
+++ b/lib/discourse_plugin_statistics/plugin.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+module DiscoursePluginStatistics
+ class Plugin
+ def self.discourse_custom_wizard
+ subscription_features = {
+ wizard: {
+ save_submissions: 0,
+ after_signup: 0,
+ prompt_completion: 0,
+ required: 0,
+ permitted: 0,
+ },
+ step: {
+ required_data: 0,
+ permitted_params: 0,
+ force_final: 0
+ },
+ field: {
+ condition: 0,
+ type: {
+ text: 0,
+ textarea: 0,
+ text_only: 0,
+ date: 0,
+ time: 0,
+ date_time: 0,
+ number: 0,
+ checkbox: 0,
+ dropdown: 0,
+ composer: 0,
+ composer_preview: 0,
+ url: 0,
+ upload: 0,
+ tag: 0,
+ category: 0,
+ group: 0,
+ user_selector: 0,
+ },
+ realtime_validations: 0
+ },
+ action: {
+ type: {
+ create_topic: 0,
+ send_message: 0,
+ update_profile: 0,
+ open_composer: 0,
+ route_to: 0,
+ send_to_api: 0,
+ watch_categories: 0,
+ watch_tags: 0,
+ add_to_group: 0,
+ create_group: 0,
+ create_category: 0,
+ }
+ }
+ }
+
+ increment_feature_count = lambda do |type, key, value|
+ if key == 'type'
+ if !subscription_features[type.to_sym][:type][value.to_sym].nil?
+ subscription_features[type.to_sym][:type][value.to_sym] += 1
+ end
+ else
+ if !subscription_features[type.to_sym][key.to_sym].nil?
+ subscription_features[type.to_sym][key.to_sym] += 1
+ end
+ end
+ end
+
+ CustomWizard::Template.list.each do |template|
+ template.each do |key, value|
+ increment_feature_count.call(:wizard, key, value)
+ end
+ template['steps'].each do |step|
+ step.each do |key, value|
+ increment_feature_count.call(:step, key, value)
+ end
+ step['fields'].each do |field|
+ field.each do |key, value|
+ increment_feature_count.call(:field, key, value)
+ end
+ end
+ end
+ template['actions'].each do |action|
+ action.each do |key, value|
+ increment_feature_count.call(:action, key, value)
+ end
+ end
+ end
+
+ {
+ total_wizards: CustomWizard::Template.list.size,
+ subscription_type: CustomWizard::Subscription.type.to_s,
+ subscription_features: subscription_features
+ }
+ end
+ end
+end
diff --git a/package.json b/package.json
index 9a3a09e6..2d3e396c 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
"author": "Pavilion",
"license": "GPL V2",
"devDependencies": {
- "eslint-config-discourse": "^1.1.8",
+ "eslint-config-discourse": "^3.4.0",
"semver": "^7.3.5"
}
}
diff --git a/plugin.rb b/plugin.rb
index bdb86b64..e618128f 100644
--- a/plugin.rb
+++ b/plugin.rb
@@ -1,73 +1,36 @@
# frozen_string_literal: true
# name: discourse-custom-wizard
-# about: Create custom wizards
-# version: 1.19.0
-# authors: Angus McLeod
+# about: Forms for Discourse. Better onboarding, structured posting, data enrichment, automated actions and much more.
+# version: 2.5.2
+# authors: Angus McLeod, Faizaan Gagan, Robert Barrow, Keegan George, Kaitlin Maddever, Juan Marcos Gutierrez Ramos
# url: https://github.com/paviliondev/discourse-custom-wizard
-# contact emails: angus@thepavilion.io
+# contact_emails: development@pavilion.tech
+# subscription_url: https://coop.pavilion.tech
gem 'liquid', '5.0.1', require: true
-
-register_asset 'stylesheets/common/wizard-admin.scss'
-register_asset 'stylesheets/common/wizard-mapper.scss'
+gem "discourse_subscription_client", "0.1.0.pre15", require_name: "discourse_subscription_client"
+gem 'discourse_plugin_statistics', '0.1.0.pre7', require: true
+register_asset 'stylesheets/common/admin.scss'
+register_asset 'stylesheets/common/wizard.scss'
+register_svg_icon 'pavilion-logo'
enabled_site_setting :custom_wizard_enabled
-config = Rails.application.config
-plugin_asset_path = "#{Rails.root}/plugins/discourse-custom-wizard/assets"
-config.assets.paths << "#{plugin_asset_path}/javascripts"
-config.assets.paths << "#{plugin_asset_path}/stylesheets/wizard"
-
-if Rails.env.production?
- config.assets.precompile += %w{
- wizard-custom-guest.js
- wizard-custom-start.js
- wizard-custom.js
- wizard-plugin.js.erb
- wizard-raw-templates.js.erb
- }
-end
-
if respond_to?(:register_svg_icon)
register_svg_icon "far-calendar"
register_svg_icon "chevron-right"
register_svg_icon "chevron-left"
register_svg_icon "save"
+ register_svg_icon "sliders-h"
+ register_svg_icon "calendar"
+ register_svg_icon "check"
+ register_svg_icon "times"
+ register_svg_icon "clock"
+ register_svg_icon "link"
+ register_svg_icon "comment-alt"
+ register_svg_icon "far-life-ring"
register_svg_icon "arrow-right"
-end
-
-class ::Sprockets::DirectiveProcessor
- def process_require_tree_discourse_directive(path = ".")
- raise CustomWizard::SprocketsEmptyPath, "path cannot be empty" if path == "."
-
- discourse_asset_path = "#{Rails.root}/app/assets/javascripts/"
- path = File.expand_path(path, discourse_asset_path)
- stat = @environment.stat(path)
-
- if stat && stat.directory?
- require_paths(*@environment.stat_sorted_tree_with_dependencies(path))
- else
- raise CustomWizard::SprocketsFileNotFound, "#{path} not found in discourse core"
- end
- end
-end
-
-## Override necessary due to 'assets/javascripts/wizard', particularly its tests.
-def each_globbed_asset
- if @path
- root_path = "#{File.dirname(@path)}/assets/javascripts/discourse"
-
- Dir.glob(["#{root_path}/**/*"]).sort.each do |f|
- f_str = f.to_s
- if File.directory?(f)
- yield [f, true]
- elsif f_str.end_with?(".js.es6") || f_str.end_with?(".hbs") || f_str.end_with?(".hbr")
- yield [f, false]
- elsif transpile_js && f_str.end_with?(".js")
- yield [f, false]
- end
- end
- end
+ register_svg_icon "bolt"
end
after_initialize do
@@ -75,17 +38,19 @@ after_initialize do
../lib/custom_wizard/engine.rb
../config/routes.rb
../app/controllers/custom_wizard/admin/admin.rb
+ ../app/controllers/custom_wizard/admin/subscription.rb
../app/controllers/custom_wizard/admin/wizard.rb
../app/controllers/custom_wizard/admin/submissions.rb
../app/controllers/custom_wizard/admin/api.rb
../app/controllers/custom_wizard/admin/logs.rb
../app/controllers/custom_wizard/admin/manager.rb
../app/controllers/custom_wizard/admin/custom_fields.rb
+ ../app/controllers/custom_wizard/wizard_client.rb
../app/controllers/custom_wizard/wizard.rb
../app/controllers/custom_wizard/steps.rb
../app/controllers/custom_wizard/realtime_validations.rb
- ../app/jobs/refresh_api_access_token.rb
- ../app/jobs/set_after_time_wizard.rb
+ ../app/jobs/regular/refresh_api_access_token.rb
+ ../app/jobs/regular/set_after_time_wizard.rb
../lib/custom_wizard/validators/template.rb
../lib/custom_wizard/validators/update.rb
../lib/custom_wizard/action_result.rb
@@ -102,14 +67,17 @@ after_initialize do
../lib/custom_wizard/step_updater.rb
../lib/custom_wizard/step.rb
../lib/custom_wizard/submission.rb
+ ../lib/custom_wizard/subscription.rb
../lib/custom_wizard/template.rb
../lib/custom_wizard/wizard.rb
+ ../lib/custom_wizard/user_history.rb
../lib/custom_wizard/api/api.rb
../lib/custom_wizard/api/authorization.rb
../lib/custom_wizard/api/endpoint.rb
../lib/custom_wizard/api/log_entry.rb
../lib/custom_wizard/liquid_extensions/first_non_empty.rb
../lib/custom_wizard/exceptions/exceptions.rb
+ ../lib/discourse_plugin_statistics/plugin.rb
../app/serializers/custom_wizard/api/authorization_serializer.rb
../app/serializers/custom_wizard/api/basic_endpoint_serializer.rb
../app/serializers/custom_wizard/api/endpoint_serializer.rb
@@ -126,9 +94,8 @@ after_initialize do
../app/serializers/custom_wizard/realtime_validation/similar_topics_serializer.rb
../lib/custom_wizard/extensions/extra_locales_controller.rb
../lib/custom_wizard/extensions/invites_controller.rb
- ../lib/custom_wizard/extensions/guardian.rb
../lib/custom_wizard/extensions/users_controller.rb
- ../lib/custom_wizard/extensions/tags_controller.rb
+ ../lib/custom_wizard/extensions/guardian.rb
../lib/custom_wizard/extensions/custom_field/preloader.rb
../lib/custom_wizard/extensions/custom_field/serializer.rb
../lib/custom_wizard/extensions/custom_field/extension.rb
@@ -270,9 +237,18 @@ after_initialize do
end
reloadable_patch do |plugin|
- ::TagsController.prepend CustomWizardTagsController
::DiscourseTagging.singleton_class.prepend CustomWizardDiscourseTagging
end
DiscourseEvent.trigger(:custom_wizard_ready)
+
+ on(:before_create_topic) do |topic_params, user|
+ category = topic_params.category
+ wizard_submission_id = topic_params.custom_fields&.[]('wizard_submission_id')
+ if category&.custom_fields&.[]('create_topic_wizard').present? && wizard_submission_id.blank?
+ raise Discourse::InvalidParameters.new(
+ I18n.t('wizard.error_messages.wizard_replacing_composer')
+ )
+ end
+ end
end
diff --git a/spec/components/custom_wizard/action_spec.rb b/spec/components/custom_wizard/action_spec.rb
index 248c44a5..fb0a9e51 100644
--- a/spec/components/custom_wizard/action_spec.rb
+++ b/spec/components/custom_wizard/action_spec.rb
@@ -2,29 +2,49 @@
describe CustomWizard::Action do
fab!(:user) { Fabricate(:user, name: "Angus", username: 'angus', email: "angus@email.com", trust_level: TrustLevel[2]) }
+ fab!(:user1) { Fabricate(:user, name: "Angus One", username: 'angus1', email: "angus_one@email.com", trust_level: TrustLevel[2]) }
fab!(:category) { Fabricate(:category, name: 'cat1', slug: 'cat-slug') }
+ fab!(:tag) { Fabricate(:tag, name: 'tag1') }
fab!(:group) { Fabricate(:group) }
- let(:wizard_template) {
+ let(:wizard_template) { get_wizard_fixture("wizard") }
+ let(:open_composer) { get_wizard_fixture("actions/open_composer") }
+ let(:create_category) { get_wizard_fixture("actions/create_category") }
+ let(:watch_categories) { get_wizard_fixture("actions/watch_categories") }
+ let(:watch_tags) { get_wizard_fixture("actions/watch_tags") }
+ let(:create_group) { get_wizard_fixture("actions/create_group") }
+ let(:create_group_with_nonexistent_user) { get_wizard_fixture("actions/create_group_bad_user") }
+ let(:add_to_group) { get_wizard_fixture("actions/add_to_group") }
+ let(:send_message) { get_wizard_fixture("actions/send_message") }
+ let(:send_message_multi) { get_wizard_fixture("actions/send_message_multi") }
+ let(:api_test_endpoint) { get_wizard_fixture("endpoints/test_endpoint") }
+ let(:api_test_endpoint_body) { get_wizard_fixture("endpoints/test_endpoint_body") }
+ let(:api_test_no_authorization) { get_wizard_fixture("api/no_authorization") }
+ let(:guests_permitted) { get_wizard_fixture("wizard/guests_permitted") }
+
+ def update_template(template)
+ CustomWizard::Template.save(template, skip_jobs: true)
+ @template = CustomWizard::Template.find('super_mega_fun_wizard')
+ end
+
+ let(:create_topic) {
JSON.parse(
File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
+ "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/actions/create_topic.json"
).read
)
}
- let(:open_composer) {
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/actions/open_composer.json"
- ).read
- )
+ let(:custom_field_json) {
+ JSON.parse(File.open(
+ "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/custom_field/custom_fields.json"
+ ).read)
}
before do
+ stub_out_subscription_classes
Group.refresh_automatic_group!(:trust_level_2)
- CustomWizard::Template.save(wizard_template, skip_jobs: true)
- @template = CustomWizard::Template.find('super_mega_fun_wizard')
+ update_template(wizard_template)
end
context 'creating a topic' do
@@ -62,8 +82,8 @@ describe CustomWizard::Action do
updater.update
expect(updater.success?).to eq(true)
- expect(UserHistory.where(
- acting_user_id: user.id,
+ expect(CustomWizard::UserHistory.where(
+ actor_id: user.id,
context: "super_mega_fun_wizard",
subject: "step_3"
).exists?).to eq(true)
@@ -107,53 +127,39 @@ describe CustomWizard::Action do
expect(topic_json_custom_field.exists?).to eq(true)
expect(post_custom_field.exists?).to eq(true)
end
- end
- context 'sending a message' do
- it 'works' do
- User.create(username: 'angus1', email: "angus1@email.com")
+ it "adds registered custom fields" do
+ custom_field = custom_field_json['custom_fields'][0]
+ custom_field_name = custom_field["name"]
+ custom_field_value = "Custom value"
- wizard = CustomWizard::Builder.new(@template[:id], user).build
- wizard.create_updater(wizard.steps[0].id, {}).update
- wizard.create_updater(wizard.steps[1].id, {}).update
+ CustomWizard::CustomField.new(nil, custom_field).save
+ create_topic["custom_fields"] = [
+ {
+ "type": "association",
+ "pairs": [
+ {
+ "index": 0,
+ "key": custom_field_name,
+ "key_type": "custom_field",
+ "value": custom_field_value,
+ "value_type": "text",
+ "connector": "association"
+ }
+ ]
+ }
+ ]
- topic = Topic.where(
- archetype: Archetype.private_message,
- title: "Message title"
+ wizard = CustomWizard::Wizard.new(@template, user)
+ action = CustomWizard::Action.new(
+ wizard: wizard,
+ action: create_topic.with_indifferent_access,
+ submission: wizard.current_submission
)
+ action.perform
- post = Post.where(
- topic_id: topic.pluck(:id),
- raw: "I will interpolate some wizard fields"
- )
-
- expect(topic.exists?).to eq(true)
- expect(topic.first.topic_allowed_users.first.user.username).to eq('angus1')
- expect(post.exists?).to eq(true)
- end
-
- it 'allows using multiple PM targets' do
- User.create(username: 'angus1', email: "angus1@email.com")
- User.create(username: 'faiz', email: "faiz@email.com")
- Group.create(name: "cool_group")
- Group.create(name: 'cool_group_1')
- wizard = CustomWizard::Builder.new(@template[:id], user).build
- wizard.create_updater(wizard.steps[0].id, {}).update
- wizard.create_updater(wizard.steps[1].id, {}).update
-
- topic = Topic.where(
- archetype: Archetype.private_message,
- title: "Multiple Recipients title"
- )
-
- post = Post.where(
- topic_id: topic.pluck(:id),
- raw: "I will interpolate some wizard fields"
- )
- expect(topic.exists?).to eq(true)
- expect(topic.first.all_allowed_users.map(&:username)).to include('angus1', 'faiz')
- expect(topic.first.allowed_groups.map(&:name)).to include('cool_group', 'cool_group_1')
- expect(post.exists?).to eq(true)
+ expect(action.result.success?).to eq(true)
+ expect(TopicCustomField.exists?(name: custom_field_name, value: custom_field_value)).to eq(true)
end
end
@@ -181,10 +187,8 @@ describe CustomWizard::Action do
updater = wizard.create_updater(wizard.steps[1].id, {})
updater.update
- category = Category.find_by(id: wizard.current_submission.fields['action_8'])
-
expect(updater.result[:redirect_on_next]).to eq(
- "/new-topic?title=Title%20of%20the%20composer%20topic&body=I%20am%20interpolating%20some%20user%20fields%20Angus%20angus%20angus%40email.com&category_id=#{category.id}&tags=tag1"
+ "/new-topic?title=Title%20of%20the%20composer%20topic&body=I%20am%20interpolating%20some%20user%20fields%20Angus%20angus%20angus%40email.com&tags=tag1"
)
end
@@ -209,45 +213,283 @@ describe CustomWizard::Action do
end
end
- it 'creates a category' do
- wizard = CustomWizard::Builder.new(@template[:id], user).build
- wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update
- wizard.create_updater(wizard.steps[1].id, {}).update
- expect(Category.where(id: wizard.current_submission.fields['action_8']).exists?).to eq(true)
- end
-
- it 'creates a group' do
- wizard = CustomWizard::Builder.new(@template[:id], user).build
- wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update
- expect(Group.where(name: wizard.current_submission.fields['action_9']).exists?).to eq(true)
- end
-
- it 'adds a user to a group' do
- wizard = CustomWizard::Builder.new(@template[:id], user).build
- step_id = wizard.steps[0].id
- updater = wizard.create_updater(step_id, step_1_field_1: "Text input").update
- group = Group.find_by(name: wizard.current_submission.fields['action_9'])
- expect(group.users.first.username).to eq('angus')
- end
-
- it 'watches categories' do
- wizard = CustomWizard::Builder.new(@template[:id], user).build
- wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update
- wizard.create_updater(wizard.steps[1].id, {}).update
- expect(CategoryUser.where(
- category_id: wizard.current_submission.fields['action_8'],
- user_id: user.id
- ).first.notification_level).to eq(2)
- expect(CategoryUser.where(
- category_id: category.id,
- user_id: user.id
- ).first.notification_level).to eq(0)
- end
-
it 're-routes a user' do
wizard = CustomWizard::Builder.new(@template[:id], user).build
updater = wizard.create_updater(wizard.steps.last.id, {})
updater.update
expect(updater.result[:redirect_on_next]).to eq("https://google.com")
end
+
+ context "standard subscription actions" do
+ before do
+ enable_subscription("standard")
+ end
+
+ it 'watches tags' do
+ watch_tags[:tags][0][:output] = tag.name
+ wizard_template[:actions] << watch_tags
+ update_template(wizard_template)
+
+ wizard = CustomWizard::Builder.new(@template[:id], user).build
+ wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update
+
+ expect(TagUser.where(
+ tag_id: tag.id,
+ user_id: user.id
+ ).first.notification_level).to eq(2)
+ end
+
+ it 'watches categories' do
+ watch_categories[:categories][0][:output] = category.id
+ wizard_template[:actions] << watch_categories
+ update_template(wizard_template)
+
+ wizard = CustomWizard::Builder.new(@template[:id], user).build
+ wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update
+
+ expect(CategoryUser.where(
+ category_id: category.id,
+ user_id: user.id
+ ).first.notification_level).to eq(2)
+ end
+
+ it '#send_message' do
+ Jobs.run_immediately!
+
+ target_user = Fabricate(:user)
+
+ send_message['recipient'][0]['output'][0] = target_user.username
+ wizard_template['actions'] << send_message
+ update_template(wizard_template)
+
+ wizard = CustomWizard::Builder.new(@template[:id], user).build
+ wizard.create_updater(wizard.steps[0].id, {}).update
+ wizard.create_updater(wizard.steps[1].id, {}).update
+
+ topic = Topic.where(
+ archetype: Archetype.private_message,
+ title: "Message title"
+ )
+
+ post = Post.where(
+ topic_id: topic.pluck(:id),
+ raw: "I will interpolate some wizard fields"
+ )
+
+ expect(topic.exists?).to eq(true)
+ expect(topic.first.topic_allowed_users.first.user.username).to eq(target_user.username)
+ expect(post.exists?).to eq(true)
+ expect(target_user.reload.notifications.count).to eq(1)
+ end
+
+ it '#send_message allows using multiple targets' do
+ Jobs.run_immediately!
+
+ user1 = Fabricate(:user)
+ user2 = Fabricate(:user)
+ group1 = Fabricate(:group)
+ group2 = Fabricate(:group)
+
+ send_message_multi['recipient'][0]['output'] = [
+ user1.username,
+ user2.username,
+ group1.name,
+ group2.name
+ ]
+ wizard_template['actions'] << send_message_multi
+ update_template(wizard_template)
+ update_template(wizard_template)
+
+ wizard = CustomWizard::Builder.new(@template[:id], user).build
+ wizard.create_updater(wizard.steps[0].id, {}).update
+ wizard.create_updater(wizard.steps[1].id, {}).update
+
+ topic = Topic.where(
+ archetype: Archetype.private_message,
+ title: "Multiple Recipients title"
+ )
+
+ post = Post.where(
+ topic_id: topic.pluck(:id),
+ raw: "I will interpolate some wizard fields"
+ )
+
+ expect(topic.exists?).to eq(true)
+ expect(topic.first.all_allowed_users.map(&:username)).to include(user1.username, user2.username)
+ expect(topic.first.allowed_groups.map(&:name)).to include(group1.name, group2.name)
+ expect(post.exists?).to eq(true)
+ expect(user1.reload.notifications.count).to eq(1)
+ expect(user2.reload.notifications.count).to eq(1)
+ end
+
+ it "send_message works with guests are permitted" do
+ wizard_template["permitted"] = guests_permitted["permitted"]
+ wizard_template.delete("actions")
+ wizard_template['actions'] = [send_message]
+ update_template(wizard_template)
+
+ User.create(username: 'angus1', email: "angus1@email.com")
+
+ wizard = CustomWizard::Builder.new(wizard_template["id"], nil, CustomWizard::Wizard.generate_guest_id).build
+ wizard.create_updater(wizard.steps[0].id, {}).update
+ updater = wizard.create_updater(wizard.steps[1].id, {})
+ updater.update
+
+ topic = Topic.where(archetype: Archetype.private_message, title: "Message title")
+ post = Post.where(topic_id: topic.pluck(:id))
+
+ expect(topic.exists?).to eq(true)
+ expect(topic.first.topic_allowed_users.first.user.username).to eq('angus1')
+ expect(topic.first.topic_allowed_users.second.user.username).to eq(Discourse.system_user.username)
+ expect(post.exists?).to eq(true)
+ end
+ end
+
+ context "business subscription actions" do
+ before do
+ enable_subscription("business")
+ end
+
+ it '#create_category' do
+ wizard_template['actions'] << create_category
+ wizard_template['actions'] << create_group
+ update_template(wizard_template)
+
+ wizard = CustomWizard::Builder.new(@template[:id], user).build
+ wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update
+ wizard.create_updater(wizard.steps[1].id, {}).update
+
+ expect(Category.where(id: wizard.current_submission.fields['action_8']).exists?).to eq(true)
+ end
+
+ it '#create_group' do
+ wizard_template['actions'] << create_group
+ update_template(wizard_template)
+
+ wizard = CustomWizard::Builder.new(@template[:id], user).build
+ wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update
+
+ group_id = Group.where(name: wizard.current_submission.fields['action_9']).first.id
+ user_id = User.find_by(username: wizard_template['actions'][4]['usernames'][0]["output"][0]).id
+
+ expect(Group.where(name: wizard.current_submission.fields['action_9']).exists?).to eq(true)
+ expect(GroupUser.where(group_id: group_id, user_id: user_id).exists?).to eq(true)
+ end
+
+ it '#create_group completes successfully when user included in usernames does not exist but excludes users who do not exist and includes warning in log' do
+ wizard_template['actions'] << create_group_with_nonexistent_user
+ update_template(wizard_template)
+
+ wizard = CustomWizard::Builder.new(@template[:id], user).build
+ wizard.create_updater(wizard.steps[0].id, step_1_field_1: "Text input").update
+
+ group_id = Group.where(name: wizard.current_submission.fields['action_9']).first.id
+
+ expect(CustomWizard::Log.list_query.all.last.value.include? "some users were not found").to eq(true)
+ expect(Group.where(name: wizard.current_submission.fields['action_9']).exists?).to eq(true)
+ expect(GroupUser.where(group_id: group_id).count).to eq(1)
+ end
+
+ it '#add_to_group' do
+ wizard_template['actions'] << create_group
+ wizard_template['actions'] << add_to_group
+ update_template(wizard_template)
+
+ wizard = CustomWizard::Builder.new(@template[:id], user).build
+ step_id = wizard.steps[0].id
+ updater = wizard.create_updater(step_id, step_1_field_1: "Text input").update
+ group = Group.find_by(name: wizard.current_submission.fields['action_9'])
+
+ expect(group.users.first.username).to eq('angus')
+ end
+
+ it '#send_to_api successful' do
+ stub_request(:put, "https://myexternalapi.com/update").
+ with(
+ body: "some_body",
+ headers: {
+ 'Host' => 'myexternalapi.com'
+ }).
+ to_return(status: 200, body: "success", headers: {})
+
+ new_api = CustomWizard::Api.new("my_api")
+ CustomWizard::Api.set("my_api", title: "Mocked external api")
+ CustomWizard::Api::Authorization.set("my_api", api_test_no_authorization)
+ CustomWizard::Api::Endpoint.new("my_api")
+ CustomWizard::Api::Endpoint.set("my_api", api_test_endpoint)
+ endpoint_id = CustomWizard::Api::Endpoint.list("my_api").first.id
+
+ result = CustomWizard::Api::Endpoint.request("my_api", endpoint_id, "some_body")
+ log_entry = CustomWizard::Api::LogEntry.list("my_api").first
+
+ expect(result).to eq('success')
+ expect(log_entry.status).to eq('SUCCESS')
+ end
+
+ it '#send_to_api failure' do
+ stub_request(:put, "https://myexternalapi.com/update").
+ with(
+ body: "some_body",
+ headers: {
+ 'Host' => 'myexternalapi.com'
+ }).
+ to_return(status: 500, body: "failure", headers: {})
+
+ new_api = CustomWizard::Api.new("my_api")
+ CustomWizard::Api.set("my_api", title: "Mocked external api")
+ CustomWizard::Api::Authorization.set("my_api", api_test_no_authorization)
+ CustomWizard::Api::Endpoint.new("my_api")
+ CustomWizard::Api::Endpoint.set("my_api", api_test_endpoint)
+ endpoint_id = CustomWizard::Api::Endpoint.list("my_api").first.id
+
+ result = CustomWizard::Api::Endpoint.request("my_api", endpoint_id, "some_body")
+ log_entry = CustomWizard::Api::LogEntry.list("my_api").first
+
+ expect(result).to eq({ error: "API request failed" })
+ expect(log_entry.status).to eq('FAIL')
+ end
+ end
+
+ it 'registers callbacks' do
+ described_class.register_callback(:before_create_topic) do |params, wizard, action, submission|
+ params[:topic_opts][:custom_fields]["topic_custom_field"] = true
+ params
+ end
+
+ wizard = CustomWizard::Builder.new(@template[:id], user).build
+ action = CustomWizard::Action.new(
+ wizard: wizard,
+ action: create_topic.with_indifferent_access,
+ submission: wizard.current_submission
+ )
+ action.perform
+
+ expect(action.result.success?).to eq(true)
+ expect(Topic.find(action.result.output).custom_fields["topic_custom_field"]).to eq("t")
+ end
+
+ context 'creating a topic when there are multiple actions' do
+ it 'works' do
+ wizard_template['actions'] << create_topic
+ wizard_template['actions'] << send_message
+ update_template(wizard_template)
+ wizard = CustomWizard::Builder.new(@template[:id], user).build
+ wizard.create_updater(
+ wizard.steps.first.id,
+ step_1_field_1: 'Topic Title',
+ step_1_field_2: 'topic body'
+ ).update
+ wizard.create_updater(wizard.steps.second.id, {}).update
+ wizard.create_updater(wizard.steps.last.id, step_3_field_3: category.id)
+ .update
+ User.create(username: 'angus1', email: 'angus1@email.com')
+ wizard.create_updater(wizard.steps[0].id, {}).update
+ wizard.create_updater(wizard.steps[1].id, {}).update
+ topic = Topic.where(title: 'Topic Title', category_id: category.id)
+ expect(topic.exists?).to eq(true)
+ expect(
+ Post.where(topic_id: topic.pluck(:id), raw: 'topic body').exists?
+ ).to eq(true)
+ end
+ end
end
diff --git a/spec/components/custom_wizard/builder_spec.rb b/spec/components/custom_wizard/builder_spec.rb
index e140931c..23db81e5 100644
--- a/spec/components/custom_wizard/builder_spec.rb
+++ b/spec/components/custom_wizard/builder_spec.rb
@@ -14,37 +14,11 @@ describe CustomWizard::Builder do
fab!(:category2) { Fabricate(:category, name: 'cat2') }
fab!(:group) { Fabricate(:group) }
- let(:required_data_json) {
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/step/required_data.json"
- ).read
- )
- }
-
- let(:permitted_json) {
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard/permitted.json"
- ).read
- )
- }
-
- let(:permitted_param_json) {
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/step/permitted_params.json"
- ).read
- )
- }
-
- let(:user_condition_json) {
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/condition/user_condition.json"
- ).read
- )
- }
+ let(:wizard_template) { get_wizard_fixture("wizard") }
+ let(:required_data_json) { get_wizard_fixture("step/required_data") }
+ let(:permitted_json) { get_wizard_fixture("wizard/permitted") }
+ let(:permitted_param_json) { get_wizard_fixture("step/permitted_params") }
+ let(:user_condition_json) { get_wizard_fixture("condition/user_condition") }
let(:boolean_field_condition_json) {
JSON.parse(
@@ -55,12 +29,9 @@ describe CustomWizard::Builder do
}
before do
+ stub_out_subscription_classes
Group.refresh_automatic_group!(:trust_level_3)
- CustomWizard::Template.save(
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read),
- skip_jobs: true)
+ CustomWizard::Template.save(wizard_template, skip_jobs: true)
@template = CustomWizard::Template.find('super_mega_fun_wizard')
end
@@ -110,14 +81,11 @@ describe CustomWizard::Builder do
it 'returns no steps if user has completed it' do
@template[:steps].each do |step|
- UserHistory.create!(
- {
- action: UserHistory.actions[:custom_wizard_step],
- acting_user_id: user.id,
- context: @template[:id]
- }.merge(
- subject: step[:id]
- )
+ CustomWizard::UserHistory.create!(
+ action: CustomWizard::UserHistory.actions[:step],
+ actor_id: user.id,
+ context: @template[:id],
+ subject: step[:id]
)
end
@@ -130,6 +98,7 @@ describe CustomWizard::Builder do
context "with restricted permissions" do
before do
+ enable_subscription("standard")
@template[:permitted] = permitted_json["permitted"]
CustomWizard::Template.save(@template.as_json)
end
@@ -213,6 +182,7 @@ describe CustomWizard::Builder do
context "restart is enabled" do
before do
+ enable_subscription("standard")
@template[:restart_on_revisit] = true
CustomWizard::Template.save(@template.as_json)
end
@@ -241,6 +211,7 @@ describe CustomWizard::Builder do
context 'with required data' do
before do
+ enable_subscription("standard")
@template[:steps][0][:required_data] = required_data_json['required_data']
@template[:steps][0][:required_data_message] = required_data_json['required_data_message']
CustomWizard::Template.save(@template.as_json)
@@ -276,6 +247,7 @@ describe CustomWizard::Builder do
context "with permitted params" do
before do
+ enable_subscription("standard")
@template[:steps][0][:permitted_params] = permitted_param_json['permitted_params']
CustomWizard::Template.save(@template.as_json)
end
@@ -290,6 +262,7 @@ describe CustomWizard::Builder do
context "with condition" do
before do
+ enable_subscription("standard")
@template[:steps][0][:condition] = user_condition_json['condition']
CustomWizard::Template.save(@template.as_json)
end
@@ -328,8 +301,9 @@ describe CustomWizard::Builder do
context "with condition" do
before do
+ enable_subscription("standard")
@template[:steps][0][:fields][0][:condition] = user_condition_json['condition']
- @template[:steps][2][:fields][5][:condition] = boolean_field_condition_json['condition']
+ @template[:steps][2][:fields][0][:condition] = boolean_field_condition_json['condition']
CustomWizard::Template.save(@template.as_json)
end
@@ -350,7 +324,7 @@ describe CustomWizard::Builder do
builder = CustomWizard::Builder.new(@template[:id], user)
wizard = builder.build
- expect(wizard.steps.last.fields.last.id).to eq(@template[:steps][2][:fields][5]['id'])
+ expect(wizard.steps.last.fields.last.id).to eq(@template[:steps][2][:fields][0]['id'])
end
end
end
@@ -370,6 +344,7 @@ describe CustomWizard::Builder do
context 'save submissions disabled' do
before do
+ enable_subscription("standard")
@template[:save_submissions] = false
CustomWizard::Template.save(@template.as_json)
@wizard = CustomWizard::Builder.new(@template[:id], user).build
diff --git a/spec/components/custom_wizard/custom_field_spec.rb b/spec/components/custom_wizard/custom_field_spec.rb
index cd29f081..3edff439 100644
--- a/spec/components/custom_wizard/custom_field_spec.rb
+++ b/spec/components/custom_wizard/custom_field_spec.rb
@@ -1,14 +1,11 @@
# frozen_string_literal: true
describe CustomWizard::CustomField do
-
- let(:custom_field_json) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/custom_field/custom_fields.json"
- ).read)
- }
+ let(:custom_field_json) { get_wizard_fixture("custom_field/custom_fields") }
+ let(:custom_field_subscription_json) { get_wizard_fixture("custom_field/subscription_custom_fields") }
before do
+ stub_out_subscription_classes
CustomWizard::CustomField.invalidate_cache
end
@@ -102,8 +99,8 @@ describe CustomWizard::CustomField do
it "does not save with an unsupported serializer" do
invalid_field_json = custom_field_json['custom_fields'].first
- invalid_field_json['klass'] = 'category'
- invalid_field_json['serializers'] = ['category', 'site_category']
+ invalid_field_json['klass'] = 'post'
+ invalid_field_json['serializers'] = ['post', 'post_revision']
custom_field = CustomWizard::CustomField.new(nil, invalid_field_json)
@@ -111,8 +108,8 @@ describe CustomWizard::CustomField do
expect(custom_field.valid?).to eq(false)
expect(custom_field.errors.full_messages.first).to eq(
I18n.t("wizard.custom_field.error.unsupported_serializers",
- class: "category",
- serializers: "category, site_category"
+ class: "post",
+ serializers: "post_revision"
)
)
expect(
@@ -194,6 +191,50 @@ describe CustomWizard::CustomField do
).exists?
).to eq(false)
end
+
+ it "does not save subscription field types without a subscription" do
+ subscription_field_json = custom_field_subscription_json['custom_fields'].first
+ custom_field = CustomWizard::CustomField.new(nil, subscription_field_json)
+
+ expect(custom_field.save).to eq(false)
+ expect(custom_field.valid?).to eq(false)
+ expect(custom_field.errors.full_messages.first).to eq(
+ I18n.t("wizard.custom_field.error.subscription_type", type: "json")
+ )
+ end
+
+ it "does not save subscription field classes without a subscription" do
+ subscription_field_json = custom_field_subscription_json['custom_fields'].second
+ custom_field = CustomWizard::CustomField.new(nil, subscription_field_json)
+
+ expect(custom_field.save).to eq(false)
+ expect(custom_field.valid?).to eq(false)
+ expect(custom_field.errors.full_messages.first).to eq(
+ I18n.t("wizard.custom_field.error.subscription_type", type: "category")
+ )
+ end
+
+ context "with a subscription" do
+ before do
+ enable_subscription("business")
+ end
+
+ it "saves subscription field types" do
+ subscription_field_json = custom_field_subscription_json['custom_fields'].first
+ custom_field = CustomWizard::CustomField.new(nil, subscription_field_json)
+
+ expect(custom_field.save).to eq(true)
+ expect(custom_field.valid?).to eq(true)
+ end
+
+ it "saves subscription field classes" do
+ subscription_field_json = custom_field_subscription_json['custom_fields'].second
+ custom_field = CustomWizard::CustomField.new(nil, subscription_field_json)
+
+ expect(custom_field.save).to eq(true)
+ expect(custom_field.valid?).to eq(true)
+ end
+ end
end
context "lists" do
@@ -203,15 +244,15 @@ describe CustomWizard::CustomField do
end
end
- it "lists saved custom field records" do
- expect(CustomWizard::CustomField.list.length).to eq(4)
+ it "saved custom field records" do
+ expect(CustomWizard::CustomField.list.length).to eq(2)
end
- it "lists saved custom field records by attribute value" do
+ it "saved custom field records by attribute value" do
expect(CustomWizard::CustomField.list_by(:klass, 'topic').length).to eq(1)
end
- it "lists saved custom field records by optional values" do
+ it "saved custom field records by optional values" do
field_json = custom_field_json['custom_fields'].first
field_json['serializers'] = nil
@@ -219,12 +260,12 @@ describe CustomWizard::CustomField do
expect(CustomWizard::CustomField.list_by(:serializers, ['post']).length).to eq(0)
end
- it "lists custom field records added by other plugins " do
- expect(CustomWizard::CustomField.external_list.length).to eq(8)
+ it "custom field records added by other plugins " do
+ expect(CustomWizard::CustomField.external_list.length).to be > 2
end
- it "lists all custom field records" do
- expect(CustomWizard::CustomField.full_list.length).to eq(12)
+ it "all custom field records" do
+ expect(CustomWizard::CustomField.full_list.length).to be > 2
end
end
diff --git a/spec/components/custom_wizard/field_spec.rb b/spec/components/custom_wizard/field_spec.rb
index 2386a004..1a43e06c 100644
--- a/spec/components/custom_wizard/field_spec.rb
+++ b/spec/components/custom_wizard/field_spec.rb
@@ -1,11 +1,7 @@
# frozen_string_literal: true
describe CustomWizard::Field do
- let(:field_hash) do
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/field/field.json"
- ).read).with_indifferent_access
- end
+ let(:field_hash) { get_wizard_fixture("field/field") }
before do
CustomWizard::Field.register(
@@ -26,7 +22,6 @@ describe CustomWizard::Field do
expect(field.image).to eq("field_image_url.png")
expect(field.description).to eq("Field description")
expect(field.required).to eq(true)
- expect(field.key).to eq("field.locale.key")
expect(field.type).to eq("field_type")
expect(field.content).to eq([])
end
diff --git a/spec/components/custom_wizard/log_spec.rb b/spec/components/custom_wizard/log_spec.rb
index d5c0de5d..c5cafba9 100644
--- a/spec/components/custom_wizard/log_spec.rb
+++ b/spec/components/custom_wizard/log_spec.rb
@@ -2,26 +2,32 @@
describe CustomWizard::Log do
before do
- CustomWizard::Log.create("First log message")
- CustomWizard::Log.create("Second log message")
- CustomWizard::Log.create("Third log message")
+ CustomWizard::Log.create('first-test-wizard', 'perform_first_action', 'first_test_user', 'First log message', 5.minutes.ago)
+ CustomWizard::Log.create('second-test-wizard', 'perform_second_action', 'second_test_user', 'Second log message', 3.minutes.ago)
+ CustomWizard::Log.create('third-test-wizard', 'perform_third_action', 'third_test_user', 'Third log message', 1.minutes.ago)
end
it "creates logs" do
expect(
- CustomWizard::Log.list.length
+ CustomWizard::Log.list.logs.length
).to eq(3)
end
it "lists logs by time created" do
expect(
- CustomWizard::Log.list.first.message
+ CustomWizard::Log.list.logs.first.message
).to eq("Third log message")
end
it "paginates logs" do
expect(
- CustomWizard::Log.list(0, 2).length
+ CustomWizard::Log.list(0, 2).logs.length
).to eq(2)
end
+
+ it "lists logs by wizard" do
+ expect(
+ CustomWizard::Log.list(0, 2, 'third-test-wizard').logs.length
+ ).to eq(1)
+ end
end
diff --git a/spec/components/custom_wizard/mapper_spec.rb b/spec/components/custom_wizard/mapper_spec.rb
index 422ffbf5..2e18cabd 100644
--- a/spec/components/custom_wizard/mapper_spec.rb
+++ b/spec/components/custom_wizard/mapper_spec.rb
@@ -1,4 +1,4 @@
-# frozen_string_literal: true
+# rubocop:disable Style/FrozenStringLiteralComment
describe CustomWizard::Mapper do
fab!(:user1) {
@@ -30,16 +30,8 @@ describe CustomWizard::Mapper do
]
)
}
- let(:inputs) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/mapper/inputs.json"
- ).read)
- }
- let(:data) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/mapper/data.json"
- ).read)
- }
+ let(:inputs) { get_wizard_fixture("mapper/inputs") }
+ let(:data) { get_wizard_fixture("mapper/data") }
let(:template_params) {
{
"step_1_field_1" => "Hello"
@@ -66,6 +58,11 @@ describe CustomWizard::Mapper do
"step_1_field_3" => "Value"
}
}
+ let(:template_params_object) {
+ {
+ "step_1_field_1": get_wizard_fixture("field/upload")
+ }
+ }
def create_template_mapper(data, user)
CustomWizard::Mapper.new(
@@ -262,6 +259,49 @@ describe CustomWizard::Mapper do
user: user1
).perform).to eq("Time: #{Time.now.strftime("%B %-d, %Y")}")
end
+
+ it "avatar" do
+ expect(CustomWizard::Mapper.new(
+ inputs: inputs['interpolate_avatar'],
+ data: data,
+ user: user1
+ ).perform).to eq("Avatar: ![avatar](#{user1.small_avatar_url})")
+ end
+
+ it "avatar with invalid size" do
+ avatar_inputs = inputs['interpolate_avatar'].dup
+ avatar_inputs[0]["output"] = "Avatar: ![avatar](u{avatar.345})"
+
+ expect(CustomWizard::Mapper.new(
+ inputs: avatar_inputs,
+ data: data,
+ user: user1
+ ).perform).to eq("Avatar: ![avatar](#{user1.small_avatar_url})")
+ end
+
+ it "avatar with valid size" do
+ avatar_inputs = inputs['interpolate_avatar'].dup
+ avatar_inputs[0]["output"] = "Avatar: ![avatar](u{avatar.144})"
+
+ expect(CustomWizard::Mapper.new(
+ inputs: avatar_inputs,
+ data: data,
+ user: user1
+ ).perform).to eq("Avatar: ![avatar](#{user1.avatar_template_url.gsub("{size}", "144")})")
+ end
+ end
+
+ it "handles not equal pairs" do
+ expect(CustomWizard::Mapper.new(
+ inputs: inputs['not_equals_pair'],
+ data: data,
+ user: user1
+ ).perform).to eq(true)
+ expect(CustomWizard::Mapper.new(
+ inputs: inputs['not_equals_pair'],
+ data: data,
+ user: user2
+ ).perform).to eq(false)
end
it "handles greater than pairs" do
@@ -351,7 +391,7 @@ describe CustomWizard::Mapper do
expect(result).to eq(template_params["step_1_field_1"])
end
- it "treats replaced values as string literals" do
+ it "does not require a subscription" do
template = '{{ "w{step_1_field_1}" | size }}'
mapper = create_template_mapper(template_params, user1)
result = mapper.interpolate(
@@ -361,60 +401,17 @@ describe CustomWizard::Mapper do
wizard: true,
value: true
)
- expect(result).to eq(template_params["step_1_field_1"].size.to_s)
+ expect(result).to eq("5")
end
- it "allows the wizard values to be used inside conditionals" do
- template = <<-LIQUID
- {%- if "w{step_1_field_1}" contains "ello" -%}
- Correct
- {%- else -%}
- Incorrect
- {%-endif-%}
- LIQUID
- mapper = create_template_mapper(template_params, user1)
- result = mapper.interpolate(
- template.dup,
- template: true,
- user: true,
- wizard: true,
- value: true
- )
- expect(result).to eq("Correct")
- end
+ context "with a subscription" do
+ before do
+ enable_subscription("standard")
+ end
- it "can access data passed to render method as variable" do
- template = "{{step_1_field_1.size}}"
- mapper = create_template_mapper(template_params, user1)
- result = mapper.interpolate(
- template.dup,
- template: true,
- user: true,
- wizard: true,
- value: true
- )
- expect(result).to eq(template_params["step_1_field_1"].size.to_s)
- end
-
- it "doesn't parse the template when template param is false" do
- template = <<-LIQUID.strip
- {{ "w{step_1_field_1}" | size}}
- LIQUID
- mapper = create_template_mapper(template_params, user1)
- result = mapper.interpolate(
- template.dup,
- template: false,
- )
- expect(result).to eq(template)
- end
-
- context "custom filter: 'first_non_empty'" do
- it "gives first non empty element from list" do
- template = <<-LIQUID.strip
- {%- assign entry = "" | first_non_empty: step_1_field_1, step_1_field_2, step_1_field_3 -%}
- {{ entry }}
- LIQUID
- mapper = create_template_mapper(template_params_non_empty, user1)
+ it "treats replaced values as string literals" do
+ template = '{{ "w{step_1_field_1}" | size }}'
+ mapper = create_template_mapper(template_params, user1)
result = mapper.interpolate(
template.dup,
template: true,
@@ -422,15 +419,18 @@ describe CustomWizard::Mapper do
wizard: true,
value: true
)
- expect(result).to eq(template_params_non_empty["step_1_field_3"])
+ expect(result).to eq(template_params["step_1_field_1"].size.to_s)
end
- it "gives first non empty element from list when multiple non empty values present" do
- template = <<-LIQUID.strip
- {%- assign entry = "" | first_non_empty: step_1_field_1, step_1_field_2, step_1_field_3 -%}
- {{ entry }}
+ it "allows the wizard values to be used inside conditionals" do
+ template = <<-LIQUID
+ {%- if "w{step_1_field_1}" contains "ello" -%}
+ Correct
+ {%- else -%}
+ Incorrect
+ {%-endif-%}
LIQUID
- mapper = create_template_mapper(template_params_multiple_non_empty, user1)
+ mapper = create_template_mapper(template_params, user1)
result = mapper.interpolate(
template.dup,
template: true,
@@ -438,25 +438,118 @@ describe CustomWizard::Mapper do
wizard: true,
value: true
)
- expect(result).to eq(template_params_multiple_non_empty["step_1_field_2"])
+ expect(result).to eq("Correct")
end
- it "gives empty if all elements are empty" do
+ it "can access data passed to render method as variable" do
+ template = "{{step_1_field_1.size}}"
+ mapper = create_template_mapper(template_params, user1)
+ result = mapper.interpolate(
+ template.dup,
+ template: true,
+ user: true,
+ wizard: true,
+ value: true
+ )
+ expect(result).to eq(template_params["step_1_field_1"].size.to_s)
+ end
+
+ it "doesn't parse the template when template param is false" do
template = <<-LIQUID.strip
- {%- assign entry = "" | first_non_empty: step_1_field_1, step_1_field_2, step_1_field_3 -%}
- {%- if entry -%}
+ {{ "w{step_1_field_1}" | size}}
+ LIQUID
+ mapper = create_template_mapper(template_params, user1)
+ result = mapper.interpolate(
+ template.dup,
+ template: false,
+ )
+ expect(result).to eq(template)
+ end
+
+ it "handles correct object variable references" do
+ template = <<-LIQUID.strip
+ {%- if "w{step_1_field_1.id}" == "step_2_field_7" -%}
+ Correct
+ {%- else -%}
+ Incorrect
+ {%-endif-%}
+ LIQUID
+ mapper = create_template_mapper(template_params_object, user1)
+ result = mapper.interpolate(
+ template.dup,
+ template: true,
+ wizard: true
+ )
+ expect(result).to eq("Correct")
+ end
+
+ it "handles incorrect object variable references" do
+ template = <<-LIQUID.strip
+ {%- if "w{step_1_field_1}" == "step_2_field_7" -%}
+ Correct
+ {%- else -%}
+ Incorrect
+ {%-endif-%}
+ LIQUID
+ mapper = create_template_mapper(template_params_object, user1)
+ result = mapper.interpolate(
+ template.dup,
+ template: true,
+ wizard: true
+ )
+ expect(result).to eq("Incorrect")
+ end
+
+ context "custom filter: 'first_non_empty'" do
+ it "gives first non empty element from list" do
+ template = <<-LIQUID.strip
+ {%- assign entry = "" | first_non_empty: step_1_field_1, step_1_field_2, step_1_field_3 -%}
{{ entry }}
- {%- endif -%}
- LIQUID
- mapper = create_template_mapper(template_params_empty, user1)
- result = mapper.interpolate(
- template.dup,
- template: true,
- user: true,
- wizard: true,
- value: true
- )
- expect(result).to eq("")
+ LIQUID
+ mapper = create_template_mapper(template_params_non_empty, user1)
+ result = mapper.interpolate(
+ template.dup,
+ template: true,
+ user: true,
+ wizard: true,
+ value: true
+ )
+ expect(result).to eq(template_params_non_empty["step_1_field_3"])
+ end
+
+ it "gives first non empty element from list when multiple non empty values present" do
+ template = <<-LIQUID.strip
+ {%- assign entry = "" | first_non_empty: step_1_field_1, step_1_field_2, step_1_field_3 -%}
+ {{ entry }}
+ LIQUID
+ mapper = create_template_mapper(template_params_multiple_non_empty, user1)
+ result = mapper.interpolate(
+ template.dup,
+ template: true,
+ user: true,
+ wizard: true,
+ value: true
+ )
+ expect(result).to eq(template_params_multiple_non_empty["step_1_field_2"])
+ end
+
+ it "gives empty if all elements are empty" do
+ template = <<-LIQUID.strip
+ {%- assign entry = "" | first_non_empty: step_1_field_1, step_1_field_2, step_1_field_3 -%}
+ {%- if entry -%}
+ {{ entry }}
+ {%- endif -%}
+ LIQUID
+ mapper = create_template_mapper(template_params_empty, user1)
+ result = mapper.interpolate(
+ template.dup,
+ template: true,
+ user: true,
+ wizard: true,
+ value: true
+ )
+ expect(result).to eq("")
+ end
end
end
end
diff --git a/spec/components/custom_wizard/step_spec.rb b/spec/components/custom_wizard/step_spec.rb
index ac0abbb7..fc6f9920 100644
--- a/spec/components/custom_wizard/step_spec.rb
+++ b/spec/components/custom_wizard/step_spec.rb
@@ -1,21 +1,8 @@
# frozen_string_literal: true
describe CustomWizard::Step do
- let(:step_hash) do
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/step/step.json"
- ).read
- ).with_indifferent_access
- end
-
- let(:field_hash) do
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/field/field.json"
- ).read
- ).with_indifferent_access
- end
+ let(:step_hash) { get_wizard_fixture("step/step") }
+ let(:field_hash) { get_wizard_fixture("field/field") }
before do
@step = CustomWizard::Step.new(step_hash[:id])
diff --git a/spec/components/custom_wizard/submission_spec.rb b/spec/components/custom_wizard/submission_spec.rb
index 5a86eca6..54249380 100644
--- a/spec/components/custom_wizard/submission_spec.rb
+++ b/spec/components/custom_wizard/submission_spec.rb
@@ -3,53 +3,81 @@
describe CustomWizard::Submission do
fab!(:user) { Fabricate(:user) }
fab!(:user2) { Fabricate(:user) }
-
- let(:template_json) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read)
- }
+ let(:template_json) { get_wizard_fixture("wizard") }
+ let(:guest_id) { CustomWizard::Wizard.generate_guest_id }
before do
+ stub_out_subscription_classes
CustomWizard::Template.save(template_json, skip_jobs: true)
-
- template_json_2 = template_json.dup
- template_json_2["id"] = "super_mega_fun_wizard_2"
- CustomWizard::Template.save(template_json_2, skip_jobs: true)
-
@wizard = CustomWizard::Wizard.create(template_json["id"], user)
- @wizard2 = CustomWizard::Wizard.create(template_json["id"], user2)
- @wizard3 = CustomWizard::Wizard.create(template_json_2["id"], user)
-
- described_class.new(@wizard, step_1_field_1: "I am a user submission").save
- described_class.new(@wizard2, step_1_field_1: "I am another user's submission").save
- described_class.new(@wizard3, step_1_field_1: "I am a user submission on another wizard").save
+ described_class.new(@wizard, step_1_field_1: "I am user submission").save
end
it "saves a user's submission" do
expect(
- described_class.get(@wizard, user.id).fields["step_1_field_1"]
- ).to eq("I am a user submission")
+ described_class.get(@wizard).fields["step_1_field_1"]
+ ).to eq("I am user submission")
end
- it "list submissions by wizard" do
- expect(described_class.list(@wizard).size).to eq(2)
+ it "saves a guest's submission" do
+ CustomWizard::Template.save(template_json, skip_jobs: true)
+ @wizard = CustomWizard::Wizard.create(template_json["id"], nil, guest_id)
+ described_class.new(@wizard, step_1_field_1: "I am guest submission").save
+
+ expect(
+ described_class.get(@wizard).fields["step_1_field_1"]
+ ).to eq("I am guest submission")
end
- it "list submissions by wizard and user" do
- expect(described_class.list(@wizard, user_id: user.id).size).to eq(1)
+ describe "#list" do
+ before do
+ freeze_time Time.now
+
+ template_json_2 = template_json.dup
+ template_json_2["id"] = "super_mega_fun_wizard_2"
+ CustomWizard::Template.save(template_json_2, skip_jobs: true)
+
+ @wizard2 = CustomWizard::Wizard.create(template_json["id"], user2)
+ @wizard3 = CustomWizard::Wizard.create(template_json_2["id"], user)
+ @count = CustomWizard::Submission::PAGE_LIMIT + 20
+
+ @count.times do |index|
+ described_class.new(@wizard, step_1_field_1: "I am user submission #{index + 1}", submitted_at: Time.now + (index + 1).minutes).save
+ end
+ described_class.new(@wizard2, step_1_field_1: "I am another user's submission").save
+ described_class.new(@wizard3, step_1_field_1: "I am a user submission on another wizard").save
+ end
+
+ it "list submissions by wizard" do
+ @wizard.user = nil
+ expect(described_class.list(@wizard).total).to eq(@count + 2)
+ end
+
+ it "list submissions by wizard and user" do
+ @wizard.user = user
+ expect(described_class.list(@wizard).total).to eq(@count + 1)
+ end
+
+ it "paginates submission lists" do
+ @wizard.user = nil
+ expect(described_class.list(@wizard, page: 1).submissions.size).to eq((@count + 2) - CustomWizard::Submission::PAGE_LIMIT)
+ end
+
+ it "orders submissions by submitted_at" do
+ expect(described_class.list(@wizard).submissions.first.submitted_at.to_datetime.change(usec: 0)).to eq((Time.now + @count.minutes).change(usec: 0))
+ end
end
- context "#cleanup_incomplete_submissions" do
+ describe "#cleanup_incomplete_submissions" do
it "cleans up redundant incomplete submissions on each build" do
freeze_time Time.now + 1
described_class.new(@wizard, step_1_field_1: "I am the second submission").save
builder = CustomWizard::Builder.new(@wizard.id, @wizard.user)
builder.build
- sub_list = described_class.list(@wizard, user_id: @wizard.user.id)
+ submissions = described_class.list(@wizard).submissions
- expect(sub_list.length).to eq(1)
- expect(sub_list.first.fields["step_1_field_1"]).to eq("I am the second submission")
+ expect(submissions.length).to eq(1)
+ expect(submissions.first.fields["step_1_field_1"]).to eq("I am the second submission")
end
it "handles submissions without 'updated_at' field correctly" do
@@ -62,10 +90,10 @@ describe CustomWizard::Submission do
PluginStore.set("#{@wizard.id}_submissions", @wizard.user.id, sub_data)
builder = CustomWizard::Builder.new(@wizard.id, @wizard.user)
builder.build
- sub_list = described_class.list(@wizard, user_id: @wizard.user.id)
+ submissions = described_class.list(@wizard).submissions
- expect(sub_list.length).to eq(1)
- expect(sub_list.first.fields["step_1_field_1"]).to eq("I am the third submission")
+ expect(submissions.length).to eq(1)
+ expect(submissions.first.fields["step_1_field_1"]).to eq("I am the second submission")
end
it "handles submissions with and without 'updated_at' field correctly" do
@@ -79,10 +107,10 @@ describe CustomWizard::Submission do
builder = CustomWizard::Builder.new(@wizard.id, @wizard.user)
builder.build
- sub_list = described_class.list(@wizard, user_id: @wizard.user.id)
+ submissions = described_class.list(@wizard).submissions
- expect(sub_list.length).to eq(1)
- expect(sub_list.first.fields["step_1_field_1"]).to eq("I am the third submission")
+ expect(submissions.length).to eq(1)
+ expect(submissions.first.fields["step_1_field_1"]).to eq("I am the third submission")
end
end
end
diff --git a/spec/components/custom_wizard/subscription_spec.rb b/spec/components/custom_wizard/subscription_spec.rb
new file mode 100644
index 00000000..7272ecf3
--- /dev/null
+++ b/spec/components/custom_wizard/subscription_spec.rb
@@ -0,0 +1,143 @@
+# frozen_string_literal: true
+
+describe CustomWizard::Subscription do
+ let(:guests_permitted) { get_wizard_fixture("wizard/guests_permitted") }
+ let!(:business_product_id) { SecureRandom.hex(8) }
+ let!(:standard_product_id) { SecureRandom.hex(8) }
+ let!(:community_product_id) { SecureRandom.hex(8) }
+ let!(:product_slugs) {
+ {
+ "#{business_product_id}" => "business",
+ "#{standard_product_id}" => "standard",
+ "#{community_product_id}" => "community"
+ }
+ }
+
+ context "with subscription client gem mocked out" do
+ before do
+ stub_out_subscription_classes
+ end
+
+ context "without a subscription" do
+ before do
+ DiscourseSubscriptionClient.stubs(:find_subscriptions).returns(nil)
+ end
+
+ it "has none type" do
+ expect(described_class.type).to eq(:none)
+ end
+
+ it "non subscriber features are included" do
+ expect(described_class.includes?(:wizard, :after_signup, true)).to eq(true)
+ end
+
+ it "subscriber features are not included" do
+ expect(described_class.includes?(:wizard, :permitted, {})).to eq(false)
+ end
+ end
+
+ context "with subscriptions" do
+
+ def get_subscription_result(product_ids)
+ result = DiscourseSubscriptionClient::Subscriptions::Result.new
+ result.supplier = SubscriptionClientSupplier.new(product_slugs)
+ result.resource = SubscriptionClientResource.new
+ result.subscriptions = product_ids.map { |product_id| ::SubscriptionClientSubscription.new(product_id) }
+ result.products = product_slugs
+ result
+ end
+ let!(:business_subscription_result) { get_subscription_result([business_product_id]) }
+ let!(:standard_subscription_result) { get_subscription_result([standard_product_id]) }
+ let!(:community_subscription_result) { get_subscription_result([community_product_id]) }
+ let!(:multiple_subscription_result) { get_subscription_result([community_product_id, business_product_id]) }
+
+ it "handles mapped values" do
+ DiscourseSubscriptionClient.stubs(:find_subscriptions).returns(standard_subscription_result)
+ expect(described_class.includes?(:wizard, :permitted, guests_permitted["permitted"])).to eq(true)
+
+ DiscourseSubscriptionClient.stubs(:find_subscriptions).returns(community_subscription_result)
+ expect(described_class.includes?(:wizard, :permitted, guests_permitted["permitted"])).to eq(false)
+ end
+
+ context "with a standard subscription" do
+ before do
+ DiscourseSubscriptionClient.stubs(:find_subscriptions).returns(standard_subscription_result)
+ end
+
+ it "detects standard type" do
+ expect(described_class.type).to eq(:standard)
+ end
+
+ it "standard features are included" do
+ expect(described_class.includes?(:wizard, :type, 'send_message')).to eq(true)
+ end
+
+ it "business features are not included" do
+ expect(described_class.includes?(:action, :type, 'create_category')).to eq(false)
+ end
+ end
+
+ context "with a business subscription" do
+ before do
+ DiscourseSubscriptionClient.stubs(:find_subscriptions).returns(business_subscription_result)
+ end
+
+ it "detects business type" do
+ expect(described_class.type).to eq(:business)
+ end
+
+ it "business features are included" do
+ expect(described_class.includes?(:action, :type, 'create_category')).to eq(true)
+ end
+ end
+
+ context "with a community subscription" do
+ before do
+ DiscourseSubscriptionClient.stubs(:find_subscriptions).returns(community_subscription_result)
+ end
+
+ it "detects community type" do
+ expect(described_class.type).to eq(:community)
+ end
+
+ it "community features are included" do
+ expect(described_class.includes?(:action, :type, 'create_category')).to eq(true)
+ end
+ end
+
+ context "with multiple subscriptions" do
+ before do
+ DiscourseSubscriptionClient.stubs(:find_subscriptions).returns(multiple_subscription_result)
+ end
+
+ it "detects correct type in hierarchy" do
+ expect(described_class.type).to eq(:business)
+ end
+ end
+ end
+ end
+
+ context "with environment variable" do
+ before do
+ ENV["CUSTOM_WIZARD_PRODUCT_SLUG"] = "standard"
+ end
+
+ after do
+ ENV["CUSTOM_WIZARD_PRODUCT_SLUG"] = nil
+ end
+
+ it "enables the relevant subscription" do
+ expect(described_class.type).to eq(:standard)
+ end
+
+ context "with a subscription" do
+ before do
+ enable_subscription("business")
+ end
+
+ it "respects the subscription" do
+ expect(described_class.type).to eq(:business)
+ end
+ end
+ end
+end
diff --git a/spec/components/custom_wizard/template_spec.rb b/spec/components/custom_wizard/template_spec.rb
index 06a7bcb7..5c16f3fa 100644
--- a/spec/components/custom_wizard/template_spec.rb
+++ b/spec/components/custom_wizard/template_spec.rb
@@ -2,19 +2,12 @@
describe CustomWizard::Template do
fab!(:user) { Fabricate(:user) }
-
- let(:template_json) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read)
- }
- let(:permitted_json) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard/permitted.json"
- ).read)
- }
+ let(:template_json) { get_wizard_fixture("wizard") }
+ let(:permitted_json) { get_wizard_fixture("wizard/permitted") }
+ fab!(:upload) { Fabricate(:upload) }
before do
+ stub_out_subscription_classes
CustomWizard::Template.save(template_json, skip_jobs: true)
end
@@ -54,8 +47,78 @@ describe CustomWizard::Template do
).to eq(true)
end
+ context "upload references" do
+ it "are added if a wizard has a step banner" do
+ template_json['steps'][0]['banner'] = upload.url
+ template_json['steps'][0]['banner_upload_id'] = upload.id
+ CustomWizard::Template.save(template_json, skip_jobs: true)
+ wizard_record = CustomWizard::Template.find_record(template_json["id"])
+ expect(
+ UploadReference.exists?(
+ upload_id: upload.id,
+ target_type: "PluginStoreRow",
+ target_id: wizard_record.id
+ )
+ ).to eq(true)
+ end
+
+ it "are added if a wizard has a field image" do
+ template_json['steps'][0]["fields"][0]['image'] = upload.url
+ template_json['steps'][0]["fields"][0]['image_upload_id'] = upload.id
+ CustomWizard::Template.save(template_json, skip_jobs: true)
+ wizard_record = CustomWizard::Template.find_record(template_json["id"])
+ expect(
+ UploadReference.exists?(
+ upload_id: upload.id,
+ target_type: "PluginStoreRow",
+ target_id: wizard_record.id
+ )
+ ).to eq(true)
+ end
+
+ it "are removed if a wizard step banner is removed" do
+ template_json['steps'][0]['banner'] = upload.url
+ template_json['steps'][0]['banner_upload_id'] = upload.id
+ CustomWizard::Template.save(template_json, skip_jobs: true)
+
+ template_json['steps'][0]['banner'] = nil
+ template_json['steps'][0]['banner_upload_id'] = nil
+ CustomWizard::Template.save(template_json, skip_jobs: true)
+ wizard_record = CustomWizard::Template.find_record(template_json["id"])
+ expect(
+ UploadReference.exists?(target_type: "PluginStoreRow")
+ ).to eq(false)
+ end
+
+ it "are removed if a wizard field image is removed" do
+ template_json['steps'][0]["fields"][0]['image'] = upload.url
+ template_json['steps'][0]["fields"][0]['image_upload_id'] = upload.id
+ CustomWizard::Template.save(template_json, skip_jobs: true)
+
+ template_json['steps'][0]["fields"][0]['image'] = nil
+ template_json['steps'][0]["fields"][0]['image_upload_id'] = nil
+ CustomWizard::Template.save(template_json, skip_jobs: true)
+ wizard_record = CustomWizard::Template.find_record(template_json["id"])
+ expect(
+ UploadReference.exists?(target_type: "PluginStoreRow")
+ ).to eq(false)
+ end
+
+ it "are removed if a wizard is removed" do
+ template_json['steps'][0]["fields"][0]['image'] = upload.url
+ template_json['steps'][0]["fields"][0]['image_upload_id'] = upload.id
+ CustomWizard::Template.save(template_json, skip_jobs: true)
+ CustomWizard::Template.remove(template_json["id"])
+ expect(
+ UploadReference.exists?(target_type: "PluginStoreRow")
+ ).to eq(false)
+ end
+ end
+
context "wizard template list" do
before do
+ enable_subscription('standard')
+
template_json_2 = template_json.dup
template_json_2["id"] = 'super_mega_fun_wizard_2'
template_json_2["permitted"] = permitted_json['permitted']
diff --git a/spec/components/custom_wizard/template_validator_spec.rb b/spec/components/custom_wizard/template_validator_spec.rb
index 8e730140..83170c34 100644
--- a/spec/components/custom_wizard/template_validator_spec.rb
+++ b/spec/components/custom_wizard/template_validator_spec.rb
@@ -2,12 +2,15 @@
describe CustomWizard::TemplateValidator do
fab!(:user) { Fabricate(:user) }
+ let(:template) { get_wizard_fixture("wizard") }
+ let(:create_category) { get_wizard_fixture("actions/create_category") }
+ let(:user_condition) { get_wizard_fixture("condition/user_condition") }
+ let(:permitted_json) { get_wizard_fixture("wizard/permitted") }
+ let(:composer_preview) { get_wizard_fixture("field/composer_preview") }
+ let(:guests_permitted) { get_wizard_fixture("wizard/guests_permitted") }
+ let(:upload_field) { get_wizard_fixture("field/upload") }
+ let(:validation_condition) { get_wizard_fixture("condition/validation_condition") }
- let(:template) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read).with_indifferent_access
- }
let(:valid_liquid_template) {
<<-LIQUID.strip
{%- assign hello = "Topic Form 1" %}
@@ -36,6 +39,10 @@ describe CustomWizard::TemplateValidator do
expect(validator.errors.first.message).to eq("Liquid syntax error in #{object_id}: #{message}")
end
+ before do
+ stub_out_subscription_classes
+ end
+
it "validates valid templates" do
expect(
CustomWizard::TemplateValidator.new(template).perform
@@ -104,6 +111,91 @@ describe CustomWizard::TemplateValidator do
).to eq(false)
end
+ context "without subscription" do
+ it "invalidates subscription wizard attributes" do
+ template[:permitted] = permitted_json['permitted']
+ expect(
+ CustomWizard::TemplateValidator.new(template).perform
+ ).to eq(false)
+ end
+
+ it "invalidates subscription step attributes" do
+ template[:steps][0][:condition] = user_condition['condition']
+ expect(
+ CustomWizard::TemplateValidator.new(template).perform
+ ).to eq(false)
+ end
+
+ it "invalidates subscription field attributes" do
+ template[:steps][0][:fields][0][:condition] = user_condition['condition']
+ expect(
+ CustomWizard::TemplateValidator.new(template).perform
+ ).to eq(false)
+ end
+
+ it "invalidates subscription actions" do
+ template[:actions] << create_category
+ expect(
+ CustomWizard::TemplateValidator.new(template).perform
+ ).to eq(false)
+ end
+ end
+
+ context "with subscription" do
+ before do
+ enable_subscription("business")
+ end
+
+ it "validates wizard attributes" do
+ template[:permitted] = permitted_json['permitted']
+ expect(
+ CustomWizard::TemplateValidator.new(template).perform
+ ).to eq(true)
+ end
+
+ it "validates user-only features" do
+ template[:permitted] = guests_permitted['permitted']
+ template[:steps][0][:fields] << upload_field
+ validator = CustomWizard::TemplateValidator.new(template)
+ expect(validator.perform).to eq(false)
+ errors = validator.errors.to_a
+ expect(errors).to include(
+ I18n.t("wizard.validation.not_permitted_for_guests", object_id: "action_1")
+ )
+ expect(errors).to include(
+ I18n.t("wizard.validation.not_permitted_for_guests", object_id: "step_2_field_7")
+ )
+ end
+
+ it "validates step attributes" do
+ template[:steps][0][:condition] = user_condition['condition']
+ expect(
+ CustomWizard::TemplateValidator.new(template).perform
+ ).to eq(true)
+ end
+
+ it "validates field attributes" do
+ template[:steps][0][:fields][0][:condition] = user_condition['condition']
+ expect(
+ CustomWizard::TemplateValidator.new(template).perform
+ ).to eq(true)
+ end
+
+ it "validates actions" do
+ template[:actions] << create_category
+ expect(
+ CustomWizard::TemplateValidator.new(template).perform
+ ).to eq(true)
+ end
+
+ it "validates settings with validation conditions" do
+ template[:permitted] = validation_condition["condition"]
+ expect(
+ CustomWizard::TemplateValidator.new(template).perform
+ ).to eq(true)
+ end
+ end
+
context "steps" do
CustomWizard::TemplateValidator.required[:step].each do |attribute|
it "invalidates if \"#{attribute.to_s}\" is not present" do
@@ -165,7 +257,9 @@ describe CustomWizard::TemplateValidator do
end
it "validates preview templates" do
- template[:steps][0][:fields][4][:preview_template] = invalid_liquid_template
+ enable_subscription("standard")
+ template[:steps][0][:fields] << composer_preview
+ template[:steps][0][:fields][3][:preview_template] = invalid_liquid_template
expect_validation_failure("step_1_field_5.preview_template", liquid_syntax_error)
end
end
diff --git a/spec/components/custom_wizard/update_validator_spec.rb b/spec/components/custom_wizard/update_validator_spec.rb
index b8aea789..0cfc7e44 100644
--- a/spec/components/custom_wizard/update_validator_spec.rb
+++ b/spec/components/custom_wizard/update_validator_spec.rb
@@ -2,14 +2,11 @@
describe CustomWizard::UpdateValidator do
fab!(:user) { Fabricate(:user) }
-
- let(:template) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read).with_indifferent_access
- }
+ let(:template) { get_wizard_fixture("wizard") }
+ let(:url_field) { get_wizard_fixture("field/url") }
before do
+ stub_out_subscription_classes
CustomWizard::Template.save(template, skip_jobs: true)
@template = CustomWizard::Template.find('super_mega_fun_wizard')
end
@@ -26,7 +23,6 @@ describe CustomWizard::UpdateValidator do
@template[:steps][0][:fields][0][:min_length] = min_length
@template[:steps][0][:fields][1][:min_length] = min_length
- @template[:steps][0][:fields][2][:min_length] = min_length
CustomWizard::Template.save(@template)
@@ -39,11 +35,6 @@ describe CustomWizard::UpdateValidator do
expect(
updater.errors.messages[:step_1_field_2].first
).to eq(I18n.t('wizard.field.too_short', label: 'Textarea', min: min_length))
-
- updater = perform_validation('step_1', step_1_field_3: 'Te')
- expect(
- updater.errors.messages[:step_1_field_3].first
- ).to eq(I18n.t('wizard.field.too_short', label: 'Composer', min: min_length))
end
it 'prevents submission if the length is over the max length' do
@@ -51,7 +42,6 @@ describe CustomWizard::UpdateValidator do
@template[:steps][0][:fields][0][:max_length] = max_length
@template[:steps][0][:fields][1][:max_length] = max_length
- @template[:steps][0][:fields][2][:max_length] = max_length
CustomWizard::Template.save(@template)
long_string = "Our Competitive Capability solution offers platforms a suite of wholesale offerings. In the future, will you be able to effectively revolutionize synergies in your business? In the emerging market space, industry is ethically investing its mission critical executive searches. Key players will take ownership of their capabilities by iteratively right-sizing world-class visibilities. "
@@ -64,11 +54,6 @@ describe CustomWizard::UpdateValidator do
expect(
updater.errors.messages[:step_1_field_2].first
).to eq(I18n.t('wizard.field.too_long', label: 'Textarea', max: max_length))
-
- updater = perform_validation('step_1', step_1_field_3: long_string)
- expect(
- updater.errors.messages[:step_1_field_3].first
- ).to eq(I18n.t('wizard.field.too_long', label: 'Composer', max: max_length))
end
it "allows submission if the length is under or equal to the max length" do
@@ -76,7 +61,6 @@ describe CustomWizard::UpdateValidator do
@template[:steps][0][:fields][0][:max_length] = max_length
@template[:steps][0][:fields][1][:max_length] = max_length
- @template[:steps][0][:fields][2][:max_length] = max_length
CustomWizard::Template.save(@template)
hundred_chars_string = "This is a line, exactly hundred characters long and not more even a single character more than that."
@@ -89,11 +73,6 @@ describe CustomWizard::UpdateValidator do
expect(
updater.errors.messages[:step_1_field_2].first
).to eq(nil)
-
- updater = perform_validation('step_1', step_1_field_3: hundred_chars_string)
- expect(
- updater.errors.messages[:step_1_field_3].first
- ).to eq(nil)
end
it "applies min length only if the input is non-empty" do
@@ -136,25 +115,33 @@ describe CustomWizard::UpdateValidator do
).to eq(I18n.t('wizard.field.required', label: 'Textarea'))
end
- it 'validates url fields' do
- updater = perform_validation('step_2', step_2_field_6: 'https://discourse.com')
- expect(
- updater.errors.messages[:step_2_field_6].first
- ).to eq(nil)
- end
+ context "subscription fields" do
+ before do
+ enable_subscription("standard")
+ end
- it 'does not validate url fields with non-url inputs' do
- updater = perform_validation('step_2', step_2_field_6: 'discourse')
- expect(
- updater.errors.messages[:step_2_field_6].first
- ).to eq(I18n.t('wizard.field.not_url', label: 'Url'))
- end
+ it 'validates url fields' do
+ updater = perform_validation('step_2', step_2_field_6: 'https://discourse.com')
+ expect(
+ updater.errors.messages[:step_2_field_6].first
+ ).to eq(nil)
+ end
- it 'validates empty url fields' do
- updater = perform_validation('step_2', step_2_field_6: '')
- expect(
- updater.errors.messages[:step_2_field_6].first
- ).to eq(nil)
+ it 'does not validate url fields with non-url inputs' do
+ template[:steps][0][:fields] << url_field
+ CustomWizard::Template.save(template)
+ updater = perform_validation('step_1', step_2_field_6: 'discourse')
+ expect(
+ updater.errors.messages[:step_2_field_6].first
+ ).to eq(I18n.t('wizard.field.not_url', label: 'Url'))
+ end
+
+ it 'validates empty url fields' do
+ updater = perform_validation('step_2', step_2_field_6: '')
+ expect(
+ updater.errors.messages[:step_2_field_6].first
+ ).to eq(nil)
+ end
end
it 'validates date fields' do
diff --git a/spec/components/custom_wizard/wizard_spec.rb b/spec/components/custom_wizard/wizard_spec.rb
index a3f86f3e..91eb7424 100644
--- a/spec/components/custom_wizard/wizard_spec.rb
+++ b/spec/components/custom_wizard/wizard_spec.rb
@@ -4,27 +4,18 @@ describe CustomWizard::Wizard do
fab!(:user) { Fabricate(:user) }
fab!(:trusted_user) { Fabricate(:user, trust_level: TrustLevel[3]) }
fab!(:admin_user) { Fabricate(:user, admin: true) }
-
- let(:template_json) {
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read
- )
- }
-
- let(:permitted_json) {
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard/permitted.json"
- ).read
- )
- }
+ let(:template_json) { get_wizard_fixture("wizard") }
+ let(:permitted_json) { get_wizard_fixture("wizard/permitted") }
+ let(:guests_permitted_json) { get_wizard_fixture("wizard/guests_permitted") }
+ let(:step_json) { get_wizard_fixture("step/step") }
before do
+ stub_out_subscription_classes
Group.refresh_automatic_group!(:trust_level_3)
@permitted_template = template_json.dup
@permitted_template["permitted"] = permitted_json["permitted"]
+ @guests_permitted_template = template_json.dup
+ @guests_permitted_template["permitted"] = guests_permitted_json["permitted"]
@wizard = CustomWizard::Wizard.new(template_json, user)
end
@@ -35,10 +26,10 @@ describe CustomWizard::Wizard do
@wizard.update!
end
- def progress_step(step_id, acting_user: user, wizard: @wizard)
- UserHistory.create(
- action: UserHistory.actions[:custom_wizard_step],
- acting_user_id: acting_user.id,
+ def progress_step(step_id, actor_id: user.id, wizard: @wizard)
+ CustomWizard::UserHistory.create(
+ action: CustomWizard::UserHistory.actions[:step],
+ actor_id: actor_id,
context: wizard.id,
subject: step_id
)
@@ -86,6 +77,28 @@ describe CustomWizard::Wizard do
expect(@wizard.start).to eq('step_2')
end
+ it "determines the user's current step if steps are added" do
+ append_steps
+ progress_step('step_1')
+ progress_step('step_2')
+ progress_step("step_3")
+
+ fourth_step = step_json.dup
+ fourth_step['id'] = "step_4"
+ template = template_json.dup
+ template['steps'] << fourth_step
+
+ CustomWizard::Template.save(template, skip_jobs: true)
+
+ wizard = CustomWizard::Wizard.new(template, user)
+ template['steps'].each do |step_template|
+ wizard.append_step(step_template['id'])
+ end
+
+ expect(wizard.steps.size).to eq(4)
+ expect(wizard.start).to eq(nil)
+ end
+
it "creates a step updater" do
expect(
@wizard.create_updater('step_1', step_1_field_1: "Text input")
@@ -127,78 +140,130 @@ describe CustomWizard::Wizard do
expect(wizard.completed?).to eq(false)
end
- it "permits admins" do
- expect(
- CustomWizard::Wizard.new(@permitted_template, admin_user).permitted?
- ).to eq(true)
+ context "with subscription" do
+ before do
+ enable_subscription("standard")
+ end
+
+ it "permits admins" do
+ expect(
+ CustomWizard::Wizard.new(@permitted_template, admin_user).permitted?
+ ).to eq(true)
+ end
+
+ it "permits permitted users" do
+ expect(
+ CustomWizard::Wizard.new(@permitted_template, trusted_user).permitted?
+ ).to eq(true)
+ end
+
+ it "permits everyone if everyone is permitted" do
+ @permitted_template['permitted'][0]['output'] = Group::AUTO_GROUPS[:everyone]
+ expect(
+ CustomWizard::Wizard.new(@permitted_template, user).permitted?
+ ).to eq(true)
+ end
+
+ it "does not permit unpermitted users" do
+ expect(
+ CustomWizard::Wizard.new(@permitted_template, user).permitted?
+ ).to eq(false)
+ end
+
+ it "does not let an unpermitted user access a wizard" do
+ expect(
+ CustomWizard::Wizard.new(@permitted_template, user).can_access?
+ ).to eq(false)
+ end
+
+ it "lets a permitted user access an incomplete wizard" do
+ expect(
+ CustomWizard::Wizard.new(@permitted_template, trusted_user).can_access?
+ ).to eq(true)
+ end
+
+ it "lets a permitted user access a complete wizard with multiple submissions" do
+ append_steps
+
+ progress_step("step_1", actor_id: trusted_user.id)
+ progress_step("step_2", actor_id: trusted_user.id)
+ progress_step("step_3", actor_id: trusted_user.id)
+
+ @permitted_template["multiple_submissions"] = true
+
+ expect(
+ CustomWizard::Wizard.new(@permitted_template, trusted_user).can_access?
+ ).to eq(true)
+ end
+
+ it "does not let an unpermitted user access a complete wizard without multiple submissions" do
+ append_steps
+
+ progress_step("step_1", actor_id: trusted_user.id)
+ progress_step("step_2", actor_id: trusted_user.id)
+ progress_step("step_3", actor_id: trusted_user.id)
+
+ @permitted_template['multiple_submissions'] = false
+
+ expect(
+ CustomWizard::Wizard.new(@permitted_template, trusted_user).can_access?
+ ).to eq(false)
+ end
+
+ it "sets wizard redirects if user is permitted" do
+ CustomWizard::Template.save(@permitted_template, skip_jobs: true)
+ CustomWizard::Wizard.set_user_redirect('super_mega_fun_wizard', trusted_user)
+ expect(
+ trusted_user.custom_fields['redirect_to_wizard']
+ ).to eq("super_mega_fun_wizard")
+ end
+
+ it "does not set a wizard redirect if user is not permitted" do
+ CustomWizard::Template.save(@permitted_template, skip_jobs: true)
+ CustomWizard::Wizard.set_user_redirect('super_mega_fun_wizard', user)
+ expect(
+ trusted_user.custom_fields['redirect_to_wizard']
+ ).to eq(nil)
+ end
end
- it "permits permitted users" do
- expect(
- CustomWizard::Wizard.new(@permitted_template, trusted_user).permitted?
- ).to eq(true)
+ context "with subscription and restart upon revisit" do
+ before do
+ enable_subscription("standard")
+ @wizard.restart_on_revisit = true
+ CustomWizard::Template.save(@wizard.as_json)
+ end
+
+ it "returns to step 1 if option to clear submissions on each visit is set" do
+ append_steps
+ expect(@wizard.unfinished?).to eq(true)
+ progress_step('step_1')
+ expect(@wizard.start).to eq('step_1')
+ end
end
- it "permits everyone if everyone is permitted" do
- @permitted_template['permitted'][0]['output'] = Group::AUTO_GROUPS[:everyone]
- expect(
- CustomWizard::Wizard.new(@permitted_template, user).permitted?
- ).to eq(true)
- end
+ context "with subscription and guest wizard" do
+ before do
+ enable_subscription("standard")
+ end
- it "does not permit unpermitted users" do
- expect(
- CustomWizard::Wizard.new(@permitted_template, user).permitted?
- ).to eq(false)
- end
+ it "permits admins" do
+ expect(
+ CustomWizard::Wizard.new(@guests_permitted_template, admin_user).permitted?
+ ).to eq(true)
+ end
- it "does not let an unpermitted user access a wizard" do
- expect(
- CustomWizard::Wizard.new(@permitted_template, user).can_access?
- ).to eq(false)
- end
+ it "permits regular users" do
+ expect(
+ CustomWizard::Wizard.new(@guests_permitted_template, user).permitted?
+ ).to eq(true)
+ end
- it "lets a permitted user access an incomplete wizard" do
- expect(
- CustomWizard::Wizard.new(@permitted_template, trusted_user).can_access?
- ).to eq(true)
- end
-
- it "lets a permitted user access a complete wizard with multiple submissions" do
- append_steps
-
- progress_step("step_1", acting_user: trusted_user)
- progress_step("step_2", acting_user: trusted_user)
- progress_step("step_3", acting_user: trusted_user)
-
- @permitted_template["multiple_submissions"] = true
-
- expect(
- CustomWizard::Wizard.new(@permitted_template, trusted_user).can_access?
- ).to eq(true)
- end
-
- it "does not let an unpermitted user access a complete wizard without multiple submissions" do
- append_steps
-
- progress_step("step_1", acting_user: trusted_user)
- progress_step("step_2", acting_user: trusted_user)
- progress_step("step_3", acting_user: trusted_user)
-
- @permitted_template['multiple_submissions'] = false
-
- expect(
- CustomWizard::Wizard.new(@permitted_template, trusted_user).can_access?
- ).to eq(false)
- end
-
- it "lists the site groups" do
- expect(@wizard.groups.length).to eq(8)
- end
-
- it "lists the site categories" do
- Site.clear_cache
- expect(@wizard.categories.length).to eq(1)
+ it "permits guests" do
+ expect(
+ CustomWizard::Wizard.new(@guests_permitted_template, nil, "guest123").permitted?
+ ).to eq(true)
+ end
end
context "submissions" do
@@ -217,6 +282,7 @@ describe CustomWizard::Wizard do
context "class methods" do
before do
+ enable_subscription("standard")
CustomWizard::Template.save(@permitted_template, skip_jobs: true)
template_json_2 = template_json.dup
@@ -252,20 +318,4 @@ describe CustomWizard::Wizard do
expect(CustomWizard::Wizard.prompt_completion(user).length).to eq(1)
end
end
-
- it "sets wizard redirects if user is permitted" do
- CustomWizard::Template.save(@permitted_template, skip_jobs: true)
- CustomWizard::Wizard.set_user_redirect('super_mega_fun_wizard', trusted_user)
- expect(
- trusted_user.custom_fields['redirect_to_wizard']
- ).to eq("super_mega_fun_wizard")
- end
-
- it "does not set a wizard redirect if user is not permitted" do
- CustomWizard::Template.save(@permitted_template, skip_jobs: true)
- CustomWizard::Wizard.set_user_redirect('super_mega_fun_wizard', user)
- expect(
- trusted_user.custom_fields['redirect_to_wizard']
- ).to eq(nil)
- end
end
diff --git a/spec/components/discourse_plugin_statistics/plugin_spec.rb b/spec/components/discourse_plugin_statistics/plugin_spec.rb
new file mode 100644
index 00000000..bf3635c2
--- /dev/null
+++ b/spec/components/discourse_plugin_statistics/plugin_spec.rb
@@ -0,0 +1,82 @@
+# frozen_string_literal: true
+
+describe DiscoursePluginStatistics::Plugin do
+ let(:template_json) { get_wizard_fixture("wizard") }
+
+ describe "#discourse_custom_wizard" do
+ before do
+ enable_subscription('standard')
+
+ CustomWizard::Template.save(template_json, skip_jobs: true)
+
+ template_json_2 = template_json.dup
+ template_json_2["id"] = 'super_mega_fun_wizard_2'
+ CustomWizard::Template.save(template_json_2, skip_jobs: true)
+
+ @data = DiscoursePluginStatistics::Plugin.discourse_custom_wizard
+ end
+
+ it "includes a total wizard count" do
+ expect(@data[:total_wizards]).to eq(2)
+ end
+
+ it "includes the subscription type" do
+ expect(@data[:subscription_type]).to eq('standard')
+ end
+
+ it "includes a count of features being used across all wizards" do
+ expect(@data[:subscription_features]).to eq(
+ wizard: {
+ save_submissions: 2,
+ after_signup: 2,
+ prompt_completion: 2,
+ required: 0,
+ permitted: 0,
+ },
+ step: {
+ required_data: 0,
+ permitted_params: 0,
+ force_final: 0
+ },
+ field: {
+ condition: 0,
+ type: {
+ text: 2,
+ textarea: 2,
+ text_only: 2,
+ date: 2,
+ time: 2,
+ date_time: 2,
+ number: 2,
+ checkbox: 2,
+ dropdown: 2,
+ composer: 0,
+ composer_preview: 0,
+ url: 0,
+ upload: 0,
+ tag: 0,
+ category: 0,
+ group: 0,
+ user_selector: 0,
+ },
+ realtime_validations: 0
+ },
+ action: {
+ type: {
+ create_topic: 2,
+ send_message: 0,
+ update_profile: 2,
+ open_composer: 2,
+ route_to: 2,
+ send_to_api: 0,
+ watch_categories: 0,
+ watch_tags: 0,
+ add_to_group: 0,
+ create_group: 0,
+ create_category: 0,
+ }
+ }
+ )
+ end
+ end
+end
diff --git a/spec/extensions/custom_field_extensions_spec.rb b/spec/extensions/custom_field_extensions_spec.rb
index 1b7ec6bf..1e7f1acc 100644
--- a/spec/extensions/custom_field_extensions_spec.rb
+++ b/spec/extensions/custom_field_extensions_spec.rb
@@ -7,13 +7,11 @@ describe "custom field extensions" do
fab!(:group) { Fabricate(:group) }
fab!(:user) { Fabricate(:user) }
- let(:custom_field_json) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/custom_field/custom_fields.json"
- ).read)
- }
+ let(:custom_field_json) { get_wizard_fixture("custom_field/custom_fields") }
+ let(:subscription_custom_field_json) { get_wizard_fixture("custom_field/subscription_custom_fields") }
before do
+ stub_out_subscription_classes
custom_field_json['custom_fields'].each do |field_json|
custom_field = CustomWizard::CustomField.new(nil, field_json)
custom_field.save
@@ -23,7 +21,7 @@ describe "custom field extensions" do
context "topic" do
it "registers topic custom fields" do
topic
- expect(Topic.get_custom_field_type("topic_field_1")).to eq(:boolean)
+ expect(Topic.get_custom_field_descriptor("topic_field_1").type).to eq(:boolean)
end
it "adds topic custom fields to the topic_view serializer" do
@@ -56,7 +54,7 @@ describe "custom field extensions" do
context "post" do
it "registers post custom fields" do
post
- expect(Post.get_custom_field_type("post_field_1")).to eq(:integer)
+ expect(Post.get_custom_field_descriptor("post_field_1").type).to eq(:integer)
end
it "adds post custom fields to the post serializer" do
@@ -73,43 +71,54 @@ describe "custom field extensions" do
end
end
- context "category" do
- it "registers category custom fields" do
- category
- expect(Category.get_custom_field_type("category_field_1")).to eq(:json)
+ context "subscription custom fields" do
+ before do
+ enable_subscription("business")
+
+ subscription_custom_field_json['custom_fields'].each do |field_json|
+ custom_field = CustomWizard::CustomField.new(nil, field_json)
+ custom_field.save
+ end
end
- it "adds category custom fields to the basic category serializer" do
- category.custom_fields["category_field_1"] = { a: 1, b: 2 }.to_json
- category.save_custom_fields(true)
+ context "category" do
+ it "registers" do
+ category
+ expect(Category.get_custom_field_descriptor("category_field_1").type).to eq(:json)
+ end
- serializer = BasicCategorySerializer.new(
- category,
- scope: Guardian.new(user),
- root: false
- ).as_json
+ it "adds custom fields to the basic category serializer" do
+ category.custom_fields["category_field_1"] = { a: 1, b: 2 }.to_json
+ category.save_custom_fields(true)
- expect(serializer[:category_field_1]).to eq({ a: 1, b: 2 }.to_json)
- end
- end
+ serializer = BasicCategorySerializer.new(
+ category,
+ scope: Guardian.new(user),
+ root: false
+ ).as_json
- context "group" do
- it "registers group custom fields" do
- group
- expect(Group.get_custom_field_type("group_field_1")).to eq(:string)
+ expect(serializer[:category_field_1]).to eq({ a: 1, b: 2 }.to_json)
+ end
end
- it "adds group custom fields to the basic group serializer" do
- group.custom_fields["group_field_1"] = "Hello"
- group.save_custom_fields(true)
+ context "group" do
+ it "registers" do
+ group
+ expect(Group.get_custom_field_descriptor("group_field_1").type).to eq(:string)
+ end
- serializer = BasicGroupSerializer.new(
- group,
- scope: Guardian.new(user),
- root: false
- ).as_json
+ it "adds custom fields to the basic group serializer" do
+ group.custom_fields["group_field_1"] = "Hello"
+ group.save_custom_fields(true)
- expect(serializer[:group_field_1]).to eq("Hello")
+ serializer = BasicGroupSerializer.new(
+ group,
+ scope: Guardian.new(user),
+ root: false
+ ).as_json
+
+ expect(serializer[:group_field_1]).to eq("Hello")
+ end
end
end
end
diff --git a/spec/extensions/discourse_tagging_spec.rb b/spec/extensions/discourse_tagging_spec.rb
new file mode 100644
index 00000000..14adaf5b
--- /dev/null
+++ b/spec/extensions/discourse_tagging_spec.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+describe ::DiscourseTagging, type: :request do
+ fab!(:user) { Fabricate(:user) }
+ fab!(:tag_1) { Fabricate(:tag, name: "Angus") }
+ fab!(:tag_2) { Fabricate(:tag, name: "Faizaan") }
+ fab!(:tag_3) { Fabricate(:tag, name: "Robert") }
+ fab!(:tag_4) { Fabricate(:tag, name: "Eli") }
+ fab!(:tag_5) { Fabricate(:tag, name: "Jeff") }
+
+ fab!(:tag_group_1) { Fabricate(:tag_group, tags: [tag_1, tag_2]) }
+ fab!(:tag_group_2) { Fabricate(:tag_group, tags: [tag_3, tag_4]) }
+
+ describe "#filter_allowed_tags" do
+ let(:guardian) { Guardian.new(user) }
+
+ context "for_input is a boolean" do
+ it "works normally" do
+ filter_params = {
+ q: '',
+ for_input: true
+ }
+ tags = DiscourseTagging.filter_allowed_tags(guardian, filter_params)
+ names = tags.map(&:name)
+ all_tag_names = Tag.all.pluck(:name)
+ expect(names).to contain_exactly(*all_tag_names)
+ end
+ end
+
+ context "for_input is an object including a tag group" do
+ it "returns tags only in the tag group" do
+ filter_params = {
+ q: "",
+ for_input: {
+ name: "custom-wizard-tag-chooser",
+ groups: tag_group_1.name
+ }
+ }
+ tags = DiscourseTagging.filter_allowed_tags(guardian, filter_params)
+ names = tags.map(&:name)
+ expected_tag_names = TagGroup
+ .includes(:tags)
+ .where(id: tag_group_1.id)
+ .map { |tag_group| tag_group.tags.pluck(:name) }.flatten
+
+ expect(names).to contain_exactly(*expected_tag_names)
+ end
+ end
+
+ context "for_input is an object including an empty tag group string" do
+ it "returns all tags" do
+ filter_params = {
+ q: "",
+ for_input: {
+ name: "custom-wizard-tag-chooser",
+ groups: ""
+ }
+ }
+ tags = DiscourseTagging.filter_allowed_tags(guardian, filter_params)
+ names = tags.map(&:name)
+
+ all_tag_names = Tag.all.pluck(:name)
+ expect(names).to contain_exactly(*all_tag_names)
+ end
+ end
+ end
+end
diff --git a/spec/extensions/extra_locales_controller_spec.rb b/spec/extensions/extra_locales_controller_spec.rb
index 32d3940c..0590f274 100644
--- a/spec/extensions/extra_locales_controller_spec.rb
+++ b/spec/extensions/extra_locales_controller_spec.rb
@@ -3,20 +3,11 @@
describe ExtraLocalesControllerCustomWizard, type: :request do
let(:new_user) { Fabricate(:user, trust_level: TrustLevel[0]) }
let(:staff_user) { Fabricate(:moderator) }
-
- let(:template) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read)
- }
-
- let(:permitted) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard/permitted.json"
- ).read)
- }
+ let(:template) { get_wizard_fixture("wizard") }
+ let(:permitted) { get_wizard_fixture("wizard/permitted") }
before do
+ stub_out_subscription_classes
CustomWizard::Template.save(template, skip_jobs: true)
end
diff --git a/spec/extensions/guardian_extension_spec.rb b/spec/extensions/guardian_extension_spec.rb
index ddfeb9ef..c35bd04c 100644
--- a/spec/extensions/guardian_extension_spec.rb
+++ b/spec/extensions/guardian_extension_spec.rb
@@ -33,6 +33,7 @@ describe ::Guardian do
end
before do
+ stub_out_subscription_classes
CustomWizard::Template.save(wizard_template, skip_jobs: true)
@template = CustomWizard::Template.find('super_mega_fun_wizard')
end
diff --git a/spec/extensions/invites_controller_spec.rb b/spec/extensions/invites_controller_spec.rb
index 42e0ece7..ff57ae7d 100644
--- a/spec/extensions/invites_controller_spec.rb
+++ b/spec/extensions/invites_controller_spec.rb
@@ -3,14 +3,10 @@
describe InvitesControllerCustomWizard, type: :request do
fab!(:topic) { Fabricate(:topic) }
let(:invite) { Invite.generate(topic.user, email: "angus@mcleod.org", topic: topic) }
-
- let(:template) do
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read)
- end
+ let(:template) { get_wizard_fixture("wizard") }
before do
+ stub_out_subscription_classes
@controller = InvitesController.new
end
diff --git a/spec/extensions/sprockets_directive_spec.rb b/spec/extensions/sprockets_directive_spec.rb
deleted file mode 100644
index db54c5dc..00000000
--- a/spec/extensions/sprockets_directive_spec.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-# frozen_string_literal: true
-
-describe "Sprockets: require_tree_discourse directive" do
- let(:discourse_asset_path) {
- "#{Rails.root}/app/assets/javascripts/"
- }
- let(:fixture_asset_path) {
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/sprockets/"
- }
- let(:test_file_contents) {
- "console.log('hello')"
- }
- let(:resolved_file_contents) {
- File.read(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/sprockets/resolved_js_file_contents.txt"
- )
- }
-
- before do
- @env ||= Sprockets::Environment.new
- discourse_asset_path = "#{Rails.root}/app/assets/javascripts/"
- fixture_asset_path = "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/sprockets/"
- @env.append_path(discourse_asset_path)
- @env.append_path(fixture_asset_path)
- @env.cache = {}
- end
-
- def create_tmp_folder_and_run(path, file_contents, &block)
- dir = File.dirname(path)
- unless File.directory?(dir)
- FileUtils.mkdir_p(dir)
- end
-
- File.new(path, 'w')
- File.write(path, file_contents)
- yield block if block_given?
- FileUtils.rm_r(dir)
- end
-
- it "includes assets from the discourse core" do
- create_tmp_folder_and_run("#{discourse_asset_path}/sptest/test.js", test_file_contents) do
- expect(@env.find_asset("require_tree_discourse_test.js").to_s).to eq(resolved_file_contents)
- end
- end
-
- it "throws ArgumentError if path is empty" do
- expect { @env.find_asset("require_tree_discourse_empty.js") }.to raise_error(CustomWizard::SprocketsEmptyPath).with_message("path cannot be empty")
- end
-
- it "throws ArgumentError if path is non non-existent" do
- expect { @env.find_asset("require_tree_discourse_non_existant.js") }.to raise_error(CustomWizard::SprocketsFileNotFound)
- end
-end
diff --git a/spec/extensions/tags_controller_spec.rb b/spec/extensions/tags_controller_spec.rb
deleted file mode 100644
index b3c1ccc8..00000000
--- a/spec/extensions/tags_controller_spec.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-# frozen_string_literal: true
-
-describe ::TagsController, type: :request do
- fab!(:tag_1) { Fabricate(:tag, name: "Angus") }
- fab!(:tag_2) { Fabricate(:tag, name: "Faizaan") }
- fab!(:tag_3) { Fabricate(:tag, name: "Robert") }
- fab!(:tag_4) { Fabricate(:tag, name: "Eli") }
- fab!(:tag_5) { Fabricate(:tag, name: "Jeff") }
-
- fab!(:tag_group_1) { Fabricate(:tag_group, tags: [tag_1, tag_2]) }
- fab!(:tag_group_2) { Fabricate(:tag_group, tags: [tag_3, tag_4]) }
-
- before do
- ::RequestStore.store[:tag_groups] = nil
- end
-
- describe "#search" do
- context "tag group param present" do
- it "returns tags only in the tag group" do
- get "/tags/filter/search.json", params: { q: '', tag_groups: [tag_group_1.name, tag_group_2.name] }
- expect(response.status).to eq(200)
- results = response.parsed_body['results']
- names = results.map { |result| result['name'] }
-
- expected_tag_names = TagGroup
- .includes(:tags)
- .where(id: [tag_group_1.id, tag_group_2.id])
- .map { |tag_group| tag_group.tags.pluck(:name) }.flatten
-
- expect(names).to contain_exactly(*expected_tag_names)
- end
- end
-
- context "tag group param not present" do
- it "returns all tags" do
- get "/tags/filter/search.json", params: { q: '' }
- expect(response.status).to eq(200)
- results = response.parsed_body['results']
- names = results.map { |result| result['name'] }
-
- all_tag_names = Tag.all.pluck(:name)
- expect(names).to contain_exactly(*all_tag_names)
- end
- end
- end
-end
diff --git a/spec/extensions/topic_extension_spec.rb b/spec/extensions/topic_extension_spec.rb
new file mode 100644
index 00000000..da4f416e
--- /dev/null
+++ b/spec/extensions/topic_extension_spec.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+describe Topic, type: :model do
+ fab!(:category_with_wizard) do
+ Fabricate(:category, custom_fields: { create_topic_wizard: 'true' })
+ end
+ fab!(:category_without_wizard) { Fabricate(:category) }
+ fab!(:user) { Fabricate(:user) }
+ let(:valid_attrs) { Fabricate.attributes_for(:topic) }
+
+ context 'with a create_topic_wizard custom field in the category' do
+ it 'will not allow creating a topic directly' do
+ expect do
+ TopicCreator.create(
+ user,
+ Guardian.new(user),
+ valid_attrs.merge(
+ title: 'A valid and sufficiently long title for testing',
+ category: category_with_wizard.id,
+ raw: 'hello this is a test topic with category with custom fields'
+ )
+ )
+ end.to raise_error(
+ Discourse::InvalidParameters,
+ 'Category not allowed for topic creation.'
+ )
+ end
+ end
+
+ context 'without a create_topic_wizard custom field in the category' do
+ it 'will allow creating a topic directly' do
+ expect do
+ TopicCreator.create(
+ user,
+ Guardian.new(user),
+ valid_attrs.merge(
+ category: category_without_wizard.id,
+ title: 'Another valid and sufficiently long title for testing',
+ raw: 'This is the body of a valid topic'
+ )
+ )
+ end.not_to raise_error
+ end
+ end
+end
diff --git a/spec/extensions/users_controller_spec.rb b/spec/extensions/users_controller_spec.rb
index 0c220a62..6f9185af 100644
--- a/spec/extensions/users_controller_spec.rb
+++ b/spec/extensions/users_controller_spec.rb
@@ -1,13 +1,10 @@
# frozen_string_literal: true
describe CustomWizardUsersController, type: :request do
- let(:template) do
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read)
- end
+ let(:template) { get_wizard_fixture("wizard") }
before do
+ stub_out_subscription_classes
@controller = UsersController.new
end
diff --git a/spec/fixtures/actions/add_to_group.json b/spec/fixtures/actions/add_to_group.json
new file mode 100644
index 00000000..2a5af1c3
--- /dev/null
+++ b/spec/fixtures/actions/add_to_group.json
@@ -0,0 +1,13 @@
+{
+ "id": "action_6",
+ "run_after": "step_1",
+ "type": "add_to_group",
+ "group": [
+ {
+ "type": "assignment",
+ "output": "action_9",
+ "output_type": "wizard_action",
+ "output_connector": "set"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spec/fixtures/actions/create_category.json b/spec/fixtures/actions/create_category.json
new file mode 100644
index 00000000..c5f3d5af
--- /dev/null
+++ b/spec/fixtures/actions/create_category.json
@@ -0,0 +1,51 @@
+{
+ "id": "action_8",
+ "run_after": "step_1",
+ "type": "create_category",
+ "custom_fields": [
+ {
+ "type": "association",
+ "pairs": [
+ {
+ "index": 0,
+ "key": "category_custom_field",
+ "key_type": "text",
+ "value": "CC Val",
+ "value_type": "text",
+ "connector": "association"
+ }
+ ]
+ }
+ ],
+ "name": [
+ {
+ "type": "assignment",
+ "output": "step_1_field_1",
+ "output_type": "wizard_field",
+ "output_connector": "set"
+ }
+ ],
+ "slug": [
+ {
+ "type": "assignment",
+ "output": "step_1_field_1",
+ "output_type": "wizard_field",
+ "output_connector": "set"
+ }
+ ],
+ "permissions": [
+ {
+ "type": "association",
+ "pairs": [
+ {
+ "index": 0,
+ "key": "action_9",
+ "key_type": "wizard_action",
+ "value": "2",
+ "value_type": "text",
+ "connector": "association"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spec/fixtures/actions/create_group.json b/spec/fixtures/actions/create_group.json
new file mode 100644
index 00000000..e2e52ef2
--- /dev/null
+++ b/spec/fixtures/actions/create_group.json
@@ -0,0 +1,104 @@
+{
+ "id": "action_9",
+ "run_after": "step_1",
+ "type": "create_group",
+ "title": [
+ {
+ "type": "assignment",
+ "output": "New Group Member",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "custom_fields": [
+ {
+ "type": "association",
+ "pairs": [
+ {
+ "index": 0,
+ "key": "group_custom_field",
+ "key_type": "text",
+ "value": "step_3_field_1",
+ "value_type": "wizard_field",
+ "connector": "association"
+ }
+ ]
+ }
+ ],
+ "name": [
+ {
+ "type": "assignment",
+ "output": "step_1_field_1",
+ "output_type": "wizard_field",
+ "output_connector": "set"
+ }
+ ],
+ "full_name": [
+ {
+ "type": "assignment",
+ "output": "step_1_field_1",
+ "output_type": "wizard_field",
+ "output_connector": "set"
+ }
+ ],
+ "usernames": [
+ {
+ "type": "assignment",
+ "output_type": "user",
+ "output_connector": "set",
+ "output": [
+ "angus1"
+ ]
+ }
+ ],
+ "owner_usernames": [
+ {
+ "type": "assignment",
+ "output_type": "user",
+ "output_connector": "set",
+ "output": [
+ "angus"
+ ]
+ }
+ ],
+ "grant_trust_level": [
+ {
+ "type": "assignment",
+ "output": "3",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "mentionable_level": [
+ {
+ "type": "assignment",
+ "output": "1",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "messageable_level": [
+ {
+ "type": "assignment",
+ "output": "2",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "visibility_level": [
+ {
+ "type": "assignment",
+ "output": "3",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "members_visibility_level": [
+ {
+ "type": "assignment",
+ "output": "99",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spec/fixtures/actions/create_group_bad_user.json b/spec/fixtures/actions/create_group_bad_user.json
new file mode 100644
index 00000000..96d6796d
--- /dev/null
+++ b/spec/fixtures/actions/create_group_bad_user.json
@@ -0,0 +1,104 @@
+{
+ "id": "action_9",
+ "run_after": "step_1",
+ "type": "create_group",
+ "title": [
+ {
+ "type": "assignment",
+ "output": "New Group Member",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "custom_fields": [
+ {
+ "type": "association",
+ "pairs": [
+ {
+ "index": 0,
+ "key": "group_custom_field",
+ "key_type": "text",
+ "value": "step_3_field_1",
+ "value_type": "wizard_field",
+ "connector": "association"
+ }
+ ]
+ }
+ ],
+ "name": [
+ {
+ "type": "assignment",
+ "output": "step_1_field_1",
+ "output_type": "wizard_field",
+ "output_connector": "set"
+ }
+ ],
+ "full_name": [
+ {
+ "type": "assignment",
+ "output": "step_1_field_1",
+ "output_type": "wizard_field",
+ "output_connector": "set"
+ }
+ ],
+ "usernames": [
+ {
+ "type": "assignment",
+ "output_type": "user",
+ "output_connector": "set",
+ "output": [
+ "angus3"
+ ]
+ }
+ ],
+ "owner_usernames": [
+ {
+ "type": "assignment",
+ "output_type": "user",
+ "output_connector": "set",
+ "output": [
+ "angus"
+ ]
+ }
+ ],
+ "grant_trust_level": [
+ {
+ "type": "assignment",
+ "output": "3",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "mentionable_level": [
+ {
+ "type": "assignment",
+ "output": "1",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "messageable_level": [
+ {
+ "type": "assignment",
+ "output": "2",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "visibility_level": [
+ {
+ "type": "assignment",
+ "output": "3",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "members_visibility_level": [
+ {
+ "type": "assignment",
+ "output": "99",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spec/fixtures/actions/create_topic.json b/spec/fixtures/actions/create_topic.json
new file mode 100644
index 00000000..2f40b217
--- /dev/null
+++ b/spec/fixtures/actions/create_topic.json
@@ -0,0 +1,14 @@
+{
+ "id": "create_topic_1",
+ "type": "create_topic",
+ "post_builder": true,
+ "post_template": "First post in the topic!",
+ "title": [
+ {
+ "type": "assignment",
+ "output_type": "text",
+ "output_connector": "set",
+ "output": "My new topic"
+ }
+ ]
+}
diff --git a/spec/fixtures/actions/route_to.json b/spec/fixtures/actions/route_to.json
new file mode 100644
index 00000000..442b1556
--- /dev/null
+++ b/spec/fixtures/actions/route_to.json
@@ -0,0 +1,12 @@
+{
+ "id": "route_to",
+ "type": "route_to",
+ "url": [
+ {
+ "type": "assignment",
+ "output": "https://google.com",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spec/fixtures/actions/send_message.json b/spec/fixtures/actions/send_message.json
new file mode 100644
index 00000000..ddc9bf10
--- /dev/null
+++ b/spec/fixtures/actions/send_message.json
@@ -0,0 +1,25 @@
+{
+ "id": "action_2",
+ "run_after": "step_2",
+ "type": "send_message",
+ "post_builder": true,
+ "post_template": "I will interpolate some wizard fields w{step_1_field_1} w{step_1_field_2}",
+ "title": [
+ {
+ "type": "assignment",
+ "output": "Message title",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "recipient": [
+ {
+ "type": "assignment",
+ "output_type": "user",
+ "output_connector": "set",
+ "output": [
+ "angus1"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spec/fixtures/actions/send_message_multi.json b/spec/fixtures/actions/send_message_multi.json
new file mode 100644
index 00000000..8ab0fdb7
--- /dev/null
+++ b/spec/fixtures/actions/send_message_multi.json
@@ -0,0 +1,28 @@
+{
+ "id": "action_11",
+ "run_after": "step_2",
+ "type": "send_message",
+ "post_builder": true,
+ "post_template": "I will interpolate some wizard fields w{step_1_field_1} w{step_1_field_2}",
+ "title": [
+ {
+ "type": "assignment",
+ "output": "Multiple Recipients title",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "recipient": [
+ {
+ "type": "assignment",
+ "output_type": "user",
+ "output_connector": "set",
+ "output": [
+ "angus1",
+ "faiz",
+ "cool_group",
+ "cool_group_1"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spec/fixtures/actions/watch_categories.json b/spec/fixtures/actions/watch_categories.json
new file mode 100644
index 00000000..20644f44
--- /dev/null
+++ b/spec/fixtures/actions/watch_categories.json
@@ -0,0 +1,23 @@
+{
+ "id": "action_5",
+ "run_after": "step_1",
+ "type": "watch_categories",
+ "notification_level": "tracking",
+ "wizard_user": true,
+ "categories": [
+ {
+ "type": "assignment",
+ "output": "",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ],
+ "mute_remainder": [
+ {
+ "type": "assignment",
+ "output": "true",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ]
+}
diff --git a/spec/fixtures/actions/watch_tags.json b/spec/fixtures/actions/watch_tags.json
new file mode 100644
index 00000000..29e50207
--- /dev/null
+++ b/spec/fixtures/actions/watch_tags.json
@@ -0,0 +1,15 @@
+{
+ "id": "action_3",
+ "run_after": "step_1",
+ "type": "watch_tags",
+ "notification_level": "tracking",
+ "wizard_user": true,
+ "tags": [
+ {
+ "type": "assignment",
+ "output": "tag1",
+ "output_type": "text",
+ "output_connector": "set"
+ }
+ ]
+}
diff --git a/spec/fixtures/api/api.json b/spec/fixtures/api/api.json
new file mode 100644
index 00000000..5c4e3bc8
--- /dev/null
+++ b/spec/fixtures/api/api.json
@@ -0,0 +1,7 @@
+{
+ "name": "my_api",
+ "title": "My API",
+ "auth_type": "none",
+ "endpoints": "[{\"name\":\"my_endpoint\",\"url\":\"https://endpoint.com\",\"method\":\"POST\",\"content_type\":\"application/json\",\"success_codes\":[200]}]",
+ "new": "true"
+}
diff --git a/spec/fixtures/api/no_authorization.json b/spec/fixtures/api/no_authorization.json
new file mode 100644
index 00000000..b1c6506e
--- /dev/null
+++ b/spec/fixtures/api/no_authorization.json
@@ -0,0 +1,3 @@
+{
+ "auth_type": "none"
+}
\ No newline at end of file
diff --git a/spec/fixtures/condition/validation_condition.json b/spec/fixtures/condition/validation_condition.json
new file mode 100644
index 00000000..695c25c9
--- /dev/null
+++ b/spec/fixtures/condition/validation_condition.json
@@ -0,0 +1,17 @@
+{
+ "condition": [
+ {
+ "type": "validation",
+ "pairs": [
+ {
+ "index": 0,
+ "key": "trust_level",
+ "key_type": "user_field",
+ "value": "2",
+ "value_type": "text",
+ "connector": "greater_or_equal"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spec/fixtures/custom_field/custom_fields.json b/spec/fixtures/custom_field/custom_fields.json
index 0e7741ce..c9b98476 100644
--- a/spec/fixtures/custom_field/custom_fields.json
+++ b/spec/fixtures/custom_field/custom_fields.json
@@ -16,22 +16,6 @@
"serializers": [
"post"
]
- },
- {
- "klass": "category",
- "name": "category_field_1",
- "type": "json",
- "serializers": [
- "basic_category"
- ]
- },
- {
- "klass": "group",
- "name": "group_field_1",
- "type": "string",
- "serializers": [
- "basic_group"
- ]
}
]
}
\ No newline at end of file
diff --git a/spec/fixtures/custom_field/subscription_custom_fields.json b/spec/fixtures/custom_field/subscription_custom_fields.json
new file mode 100644
index 00000000..b7060bdf
--- /dev/null
+++ b/spec/fixtures/custom_field/subscription_custom_fields.json
@@ -0,0 +1,28 @@
+{
+ "custom_fields": [
+ {
+ "klass": "topic",
+ "name": "topic_field_2",
+ "type": "json",
+ "serializers": [
+ "topic_view"
+ ]
+ },
+ {
+ "klass": "category",
+ "name": "category_field_1",
+ "type": "json",
+ "serializers": [
+ "basic_category"
+ ]
+ },
+ {
+ "klass": "group",
+ "name": "group_field_1",
+ "type": "string",
+ "serializers": [
+ "basic_group"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spec/fixtures/endpoints/test_endpoint.json b/spec/fixtures/endpoints/test_endpoint.json
new file mode 100644
index 00000000..ba979064
--- /dev/null
+++ b/spec/fixtures/endpoints/test_endpoint.json
@@ -0,0 +1,5 @@
+{
+ "method": "PUT",
+ "url": "https://myexternalapi.com/update",
+ "success_codes": [200]
+}
\ No newline at end of file
diff --git a/spec/fixtures/endpoints/test_endpoint_body.json b/spec/fixtures/endpoints/test_endpoint_body.json
new file mode 100644
index 00000000..837e7c72
--- /dev/null
+++ b/spec/fixtures/endpoints/test_endpoint_body.json
@@ -0,0 +1,3 @@
+{
+ "data": "some_data"
+}
\ No newline at end of file
diff --git a/spec/fixtures/field/advanced_types.json b/spec/fixtures/field/advanced_types.json
new file mode 100644
index 00000000..63357cdb
--- /dev/null
+++ b/spec/fixtures/field/advanced_types.json
@@ -0,0 +1,27 @@
+{
+ "fields": [
+ {
+ "id": "step_3_field_2",
+ "label": "Tag",
+ "type": "tag"
+ },
+ {
+ "id": "step_3_field_3",
+ "label": "Category",
+ "type": "category",
+ "limit": 1,
+ "property": "id"
+ },
+ {
+ "id": "step_3_field_4",
+ "label": "Group",
+ "type": "group"
+ },
+ {
+ "id": "step_3_field_5",
+ "label": "User Selector",
+ "description": "",
+ "type": "user_selector"
+ }
+ ]
+}
diff --git a/spec/fixtures/field/composer_preview.json b/spec/fixtures/field/composer_preview.json
new file mode 100644
index 00000000..f4bec04a
--- /dev/null
+++ b/spec/fixtures/field/composer_preview.json
@@ -0,0 +1,7 @@
+{
+ "id": "step_1_field_5",
+ "label": "I'm a preview",
+ "description": "",
+ "type": "composer_preview",
+ "preview_template": "w{step_1_field_1}"
+}
diff --git a/spec/fixtures/field/upload.json b/spec/fixtures/field/upload.json
new file mode 100644
index 00000000..ebf6c21d
--- /dev/null
+++ b/spec/fixtures/field/upload.json
@@ -0,0 +1,6 @@
+{
+ "id": "step_2_field_7",
+ "label": "Upload",
+ "type": "upload",
+ "file_types": ".jpg,.jpeg,.png"
+}
\ No newline at end of file
diff --git a/spec/fixtures/field/url.json b/spec/fixtures/field/url.json
new file mode 100644
index 00000000..e3153fe9
--- /dev/null
+++ b/spec/fixtures/field/url.json
@@ -0,0 +1,5 @@
+{
+ "id": "step_2_field_6",
+ "label": "Url",
+ "type": "url"
+}
diff --git a/spec/fixtures/mapper/inputs.json b/spec/fixtures/mapper/inputs.json
index 443f186b..2ef81a28 100644
--- a/spec/fixtures/mapper/inputs.json
+++ b/spec/fixtures/mapper/inputs.json
@@ -89,6 +89,14 @@
"output": "Time: v{time}"
}
],
+ "interpolate_avatar": [
+ {
+ "type": "assignment",
+ "output_type": "text",
+ "output_connector": "set",
+ "output": "Avatar: ![avatar](u{avatar})"
+ }
+ ],
"validation": [
{
"type": "validation",
@@ -187,6 +195,21 @@
]
}
],
+ "not_equals_pair": [
+ {
+ "type": "validation",
+ "pairs": [
+ {
+ "index": 0,
+ "key": "trust_level",
+ "key_type": "user_field",
+ "value": "1",
+ "value_type": "text",
+ "connector": "not_equal"
+ }
+ ]
+ }
+ ],
"greater_than_pair": [
{
"type": "validation",
diff --git a/spec/fixtures/sprockets/require_tree_discourse_empty.js b/spec/fixtures/sprockets/require_tree_discourse_empty.js
index df264ec5..4f034d13 100644
--- a/spec/fixtures/sprockets/require_tree_discourse_empty.js
+++ b/spec/fixtures/sprockets/require_tree_discourse_empty.js
@@ -1 +1 @@
-//= require_tree_discourse
\ No newline at end of file
+//= require_tree_discourse
diff --git a/spec/fixtures/sprockets/require_tree_discourse_non_existant.js b/spec/fixtures/sprockets/require_tree_discourse_non_existant.js
index d9b2be76..fc4752e5 100644
--- a/spec/fixtures/sprockets/require_tree_discourse_non_existant.js
+++ b/spec/fixtures/sprockets/require_tree_discourse_non_existant.js
@@ -1 +1 @@
-//= require_tree_discourse dummy_path
\ No newline at end of file
+//= require_tree_discourse dummy_path
diff --git a/spec/fixtures/sprockets/require_tree_discourse_test.js b/spec/fixtures/sprockets/require_tree_discourse_test.js
index a86aa0d7..56451213 100644
--- a/spec/fixtures/sprockets/require_tree_discourse_test.js
+++ b/spec/fixtures/sprockets/require_tree_discourse_test.js
@@ -1 +1 @@
-//= require_tree_discourse sptest
\ No newline at end of file
+//= require_tree_discourse sptest
diff --git a/spec/fixtures/subscription_client.rb b/spec/fixtures/subscription_client.rb
new file mode 100644
index 00000000..03b88101
--- /dev/null
+++ b/spec/fixtures/subscription_client.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+module DiscourseSubscriptionClient
+ def self.find_subscriptions(resource_name)
+ end
+end
+
+SubscriptionClientSupplier = Class.new Object do
+ attr_reader :product_slugs
+
+ def initialize(product_slugs)
+ @product_slugs = product_slugs
+ end
+end
+
+SubscriptionClientResource = Class.new Object do
+end
+
+SubscriptionClientSubscription = Class.new Object do
+ attr_reader :product_id
+
+ def initialize(product_id)
+ @product_id = product_id
+ end
+end
+
+module DiscourseSubscriptionClient
+ class Subscriptions
+ class Result
+ attr_accessor :supplier,
+ :resource,
+ :subscriptions,
+ :products
+
+ def any?
+ supplier.present? && resource.present? && subscriptions.present? && products.present?
+ end
+ end
+ end
+end
diff --git a/spec/fixtures/wizard.json b/spec/fixtures/wizard.json
index 01421c7f..5868001e 100644
--- a/spec/fixtures/wizard.json
+++ b/spec/fixtures/wizard.json
@@ -33,23 +33,11 @@
"type": "textarea",
"min_length": ""
},
- {
- "id": "step_1_field_3",
- "label": "Composer",
- "type": "composer"
- },
{
"id": "step_1_field_4",
"label": "I'm only text",
"description": "",
"type": "text_only"
- },
- {
- "id": "step_1_field_5",
- "label": "I'm a preview",
- "description": "",
- "type": "composer_preview",
- "preview_template": "w{step_1_field_1}"
}
],
"description": "Text inputs!"
@@ -86,17 +74,6 @@
"id": "step_2_field_5",
"label": "Checkbox",
"type": "checkbox"
- },
- {
- "id": "step_2_field_6",
- "label": "Url",
- "type": "url"
- },
- {
- "id": "step_2_field_7",
- "label": "Upload",
- "type": "upload",
- "file_types": ".jpg,.jpeg,.png"
}
],
"description": "Because I couldn't think of another name for this step :)"
@@ -141,232 +118,12 @@
]
}
]
- },
- {
- "id": "step_3_field_2",
- "label": "Tag",
- "type": "tag"
- },
- {
- "id": "step_3_field_3",
- "label": "Category",
- "type": "category",
- "limit": 1,
- "property": "id"
- },
- {
- "id": "step_3_field_4",
- "label": "Group",
- "type": "group"
- },
- {
- "id": "step_3_field_5",
- "label": "User Selector",
- "description": "",
- "type": "user_selector"
- },
- {
- "id": "step_3_field_6",
- "label": "Conditional User Selector",
- "description": "Shown when checkbox in step_2_field_5 is true",
- "type": "user_selector"
}
],
"description": "Unfortunately not the edible type :sushi: "
}
],
"actions": [
- {
- "id": "action_9",
- "run_after": "step_1",
- "type": "create_group",
- "title": [
- {
- "type": "assignment",
- "output": "New Group Member",
- "output_type": "text",
- "output_connector": "set"
- }
- ],
- "custom_fields": [
- {
- "type": "association",
- "pairs": [
- {
- "index": 0,
- "key": "group_custom_field",
- "key_type": "text",
- "value": "step_3_field_1",
- "value_type": "wizard_field",
- "connector": "association"
- }
- ]
- }
- ],
- "name": [
- {
- "type": "assignment",
- "output": "step_1_field_1",
- "output_type": "wizard_field",
- "output_connector": "set"
- }
- ],
- "full_name": [
- {
- "type": "assignment",
- "output": "step_1_field_1",
- "output_type": "wizard_field",
- "output_connector": "set"
- }
- ],
- "usernames": [
- {
- "type": "assignment",
- "output_type": "user",
- "output_connector": "set",
- "output": [
- "angus1"
- ]
- }
- ],
- "owner_usernames": [
- {
- "type": "assignment",
- "output_type": "user",
- "output_connector": "set",
- "output": [
- "angus"
- ]
- }
- ],
- "grant_trust_level": [
- {
- "type": "assignment",
- "output": "3",
- "output_type": "text",
- "output_connector": "set"
- }
- ],
- "mentionable_level": [
- {
- "type": "assignment",
- "output": "1",
- "output_type": "text",
- "output_connector": "set"
- }
- ],
- "messageable_level": [
- {
- "type": "assignment",
- "output": "2",
- "output_type": "text",
- "output_connector": "set"
- }
- ],
- "visibility_level": [
- {
- "type": "assignment",
- "output": "3",
- "output_type": "text",
- "output_connector": "set"
- }
- ],
- "members_visibility_level": [
- {
- "type": "assignment",
- "output": "99",
- "output_type": "text",
- "output_connector": "set"
- }
- ]
- },
- {
- "id": "action_6",
- "run_after": "step_1",
- "type": "add_to_group",
- "group": [
- {
- "type": "assignment",
- "output": "action_9",
- "output_type": "wizard_action",
- "output_connector": "set"
- }
- ]
- },
- {
- "id": "action_8",
- "run_after": "step_1",
- "type": "create_category",
- "custom_fields": [
- {
- "type": "association",
- "pairs": [
- {
- "index": 0,
- "key": "category_custom_field",
- "key_type": "text",
- "value": "CC Val",
- "value_type": "text",
- "connector": "association"
- }
- ]
- }
- ],
- "name": [
- {
- "type": "assignment",
- "output": "step_1_field_1",
- "output_type": "wizard_field",
- "output_connector": "set"
- }
- ],
- "slug": [
- {
- "type": "assignment",
- "output": "step_1_field_1",
- "output_type": "wizard_field",
- "output_connector": "set"
- }
- ],
- "permissions": [
- {
- "type": "association",
- "pairs": [
- {
- "index": 0,
- "key": "action_9",
- "key_type": "wizard_action",
- "value": "2",
- "value_type": "text",
- "connector": "association"
- }
- ]
- }
- ]
- },
- {
- "id": "action_5",
- "run_after": "step_1",
- "type": "watch_categories",
- "notification_level": "tracking",
- "wizard_user": true,
- "categories": [
- {
- "type": "assignment",
- "output": "action_8",
- "output_type": "wizard_action",
- "output_connector": "set"
- }
- ],
- "mute_remainder": [
- {
- "type": "assignment",
- "output": "true",
- "output_type": "text",
- "output_connector": "set"
- }
- ]
- },
{
"id": "action_1",
"run_after": "step_3",
@@ -475,59 +232,6 @@
}
]
},
- {
- "id": "action_2",
- "run_after": "step_2",
- "type": "send_message",
- "post_builder": true,
- "post_template": "I will interpolate some wizard fields w{step_1_field_1} w{step_1_field_2}",
- "title": [
- {
- "type": "assignment",
- "output": "Message title",
- "output_type": "text",
- "output_connector": "set"
- }
- ],
- "recipient": [
- {
- "type": "assignment",
- "output_type": "user",
- "output_connector": "set",
- "output": [
- "angus1"
- ]
- }
- ]
- },
- {
- "id": "action_11",
- "run_after": "step_2",
- "type": "send_message",
- "post_builder": true,
- "post_template": "I will interpolate some wizard fields w{step_1_field_1} w{step_1_field_2}",
- "title": [
- {
- "type": "assignment",
- "output": "Multiple Recipients title",
- "output_type": "text",
- "output_connector": "set"
- }
- ],
- "recipient": [
- {
- "type": "assignment",
- "output_type": "user",
- "output_connector": "set",
- "output": [
- "angus1",
- "faiz",
- "cool_group",
- "cool_group_1"
- ]
- }
- ]
- },
{
"id": "action_3",
"run_after": "step_2",
@@ -542,24 +246,6 @@
"output_connector": "set"
}
],
- "category": [
- {
- "type": "assignment",
- "output": "action_8",
- "output_type": "wizard_action",
- "output_connector": "set",
- "pairs": [
- {
- "index": 0,
- "key": "step_2_field_5",
- "key_type": "wizard_field",
- "value": "true",
- "value_type": "text",
- "connector": "is"
- }
- ]
- }
- ],
"tags": [
{
"type": "assignment",
diff --git a/spec/fixtures/wizard/guests_permitted.json b/spec/fixtures/wizard/guests_permitted.json
new file mode 100644
index 00000000..3a332f31
--- /dev/null
+++ b/spec/fixtures/wizard/guests_permitted.json
@@ -0,0 +1,12 @@
+{
+ "permitted": [
+ {
+ "type": "assignment",
+ "output_type": "group",
+ "output_connector": "set",
+ "output": [
+ -1
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/spec/jobs/set_after_time_wizard_spec.rb b/spec/jobs/set_after_time_wizard_spec.rb
index 40418d13..8162cfd2 100644
--- a/spec/jobs/set_after_time_wizard_spec.rb
+++ b/spec/jobs/set_after_time_wizard_spec.rb
@@ -5,11 +5,7 @@ describe Jobs::SetAfterTimeWizard do
fab!(:user2) { Fabricate(:user) }
fab!(:user3) { Fabricate(:user) }
- let(:template) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read).with_indifferent_access
- }
+ let(:template) { get_wizard_fixture("wizard") }
it "sets wizard redirect for all users " do
after_time_template = template.dup
diff --git a/spec/plugin_helper.rb b/spec/plugin_helper.rb
new file mode 100644
index 00000000..436fefcd
--- /dev/null
+++ b/spec/plugin_helper.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+def get_wizard_fixture(path)
+ JSON.parse(
+ File.open(
+ "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/#{path}.json"
+ ).read
+ ).with_indifferent_access
+end
+
+def enable_subscription(type)
+ stub_out_subscription_classes
+ CustomWizard::Subscription.stubs("#{type}?".to_sym).returns(true)
+ CustomWizard::Subscription.any_instance.stubs("#{type}?".to_sym).returns(true)
+end
+
+def disable_subscriptions
+ stub_out_subscription_classes
+ %w[
+ standard
+ business
+ community
+ ].each do |type|
+ CustomWizard::Subscription.stubs("#{type}?".to_sym).returns(false)
+ CustomWizard::Subscription.any_instance.stubs("#{type}?".to_sym).returns(false)
+ end
+end
+
+def unstub_out_subscription_classes
+ Object.send(:remove_const, :DiscourseSubscriptionClient) if Object.constants.include?(:DiscourseSubscriptionClient)
+ Object.send(:remove_const, :SubscriptionClientSubscription) if Object.constants.include?(:SubscriptionClientSubscription)
+end
+
+def stub_out_subscription_classes
+ load File.expand_path("#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/subscription_client.rb", __FILE__)
+end
diff --git a/spec/requests/custom_wizard/admin/api_controller_spec.rb b/spec/requests/custom_wizard/admin/api_controller_spec.rb
new file mode 100644
index 00000000..a6e5df7e
--- /dev/null
+++ b/spec/requests/custom_wizard/admin/api_controller_spec.rb
@@ -0,0 +1,22 @@
+# frozen_string_literal: true
+
+describe CustomWizard::AdminApiController do
+ fab!(:admin_user) { Fabricate(:user, admin: true) }
+ let(:api_json) { get_wizard_fixture("api/api") }
+
+ before do
+ stub_out_subscription_classes
+ sign_in(admin_user)
+ end
+
+ it "does not save if user does not have relevant subscription" do
+ put "/admin/wizards/api/:name.json", params: api_json.to_h
+ expect(response.status).to eq(400)
+ end
+
+ it "saves when user does have relevant subscription" do
+ enable_subscription("business")
+ put "/admin/wizards/api/:name.json", params: api_json.to_h
+ expect(response.status).to eq(200)
+ end
+end
diff --git a/spec/requests/custom_wizard/admin/custom_fields_controller_spec.rb b/spec/requests/custom_wizard/admin/custom_fields_controller_spec.rb
index 1690660f..dc6de785 100644
--- a/spec/requests/custom_wizard/admin/custom_fields_controller_spec.rb
+++ b/spec/requests/custom_wizard/admin/custom_fields_controller_spec.rb
@@ -2,14 +2,10 @@
describe CustomWizard::AdminCustomFieldsController do
fab!(:admin_user) { Fabricate(:user, admin: true) }
-
- let(:custom_field_json) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/custom_field/custom_fields.json"
- ).read)
- }
+ let(:custom_field_json) { get_wizard_fixture("custom_field/custom_fields") }
before do
+ stub_out_subscription_classes
custom_field_json['custom_fields'].each do |field_json|
CustomWizard::CustomField.new(nil, field_json).save
end
@@ -18,7 +14,7 @@ describe CustomWizard::AdminCustomFieldsController do
it "returns the full list of custom fields" do
get "/admin/wizards/custom-fields.json"
- expect(response.parsed_body.length).to eq(12)
+ expect(response.parsed_body["custom_fields"].length).to be > 2
end
it "saves custom fields" do
diff --git a/spec/requests/custom_wizard/admin/logs_controller_spec.rb b/spec/requests/custom_wizard/admin/logs_controller_spec.rb
index a2f619e4..91846d7f 100644
--- a/spec/requests/custom_wizard/admin/logs_controller_spec.rb
+++ b/spec/requests/custom_wizard/admin/logs_controller_spec.rb
@@ -2,21 +2,41 @@
describe CustomWizard::AdminLogsController do
fab!(:admin_user) { Fabricate(:user, admin: true) }
+ let(:template) { get_wizard_fixture("wizard") }
before do
- CustomWizard::Log.create("First log message")
- CustomWizard::Log.create("Second log message")
- CustomWizard::Log.create("Third log message")
+ stub_out_subscription_classes
+ ["first", "second", "third"].each_with_index do |key, index|
+ temp = template.dup
+ temp["id"] = "#{key}_test_wizard"
+ CustomWizard::Template.save(temp, skip_jobs: true)
+ CustomWizard::Log.create("#{key}_test_wizard", "perform_#{key}_action", "#{key}_test_user", "#{key} log message")
+ end
sign_in(admin_user)
end
- it "returns a list of logs" do
+ it "returns a list of wizards" do
get "/admin/wizards/logs.json"
expect(response.parsed_body.length).to eq(3)
end
+ it "returns a list of logs for a wizard" do
+ get "/admin/wizards/logs/first_test_wizard.json"
+ expect(response.parsed_body['logs'].length).to eq(1)
+ end
+
it "paginates" do
- get "/admin/wizards/logs.json", params: { page: 1, limit: 2 }
- expect(response.parsed_body.length).to eq(1)
+ get "/admin/wizards/logs/first_test_wizard.json", params: { page: 1 }
+ expect(response.parsed_body['logs'].length).to eq(0)
+ end
+
+ it "returns total logs for a wizard" do
+ get "/admin/wizards/logs/first_test_wizard.json"
+ expect(response.parsed_body['total']).to eq(1)
+ end
+
+ it "returns basic wizard" do
+ get "/admin/wizards/logs/first_test_wizard.json"
+ expect(response.parsed_body['wizard']['id']).to eq("first_test_wizard")
end
end
diff --git a/spec/requests/custom_wizard/admin/manager_controller_spec.rb b/spec/requests/custom_wizard/admin/manager_controller_spec.rb
index 5c7b3ec3..bbbfafb9 100644
--- a/spec/requests/custom_wizard/admin/manager_controller_spec.rb
+++ b/spec/requests/custom_wizard/admin/manager_controller_spec.rb
@@ -2,14 +2,10 @@
describe CustomWizard::AdminManagerController do
fab!(:admin_user) { Fabricate(:user, admin: true) }
-
- let(:template) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read)
- }
+ let(:template) { get_wizard_fixture("wizard") }
before do
+ stub_out_subscription_classes
sign_in(admin_user)
template_2 = template.dup
@@ -18,8 +14,8 @@ describe CustomWizard::AdminManagerController do
template_3["id"] = 'super_mega_fun_wizard_3'
@template_array = [template, template_2, template_3]
- FileUtils.mkdir_p(file_from_fixtures_tmp_folder) unless Dir.exists?(file_from_fixtures_tmp_folder)
- @tmp_file_path = File.join(file_from_fixtures_tmp_folder, SecureRandom.hex << 'wizards.json')
+ FileUtils.mkdir_p(concurrency_safe_tmp_dir) unless Dir.exist?(concurrency_safe_tmp_dir)
+ @tmp_file_path = File.join(concurrency_safe_tmp_dir, SecureRandom.hex << 'wizards.json')
File.write(@tmp_file_path, @template_array.to_json)
end
diff --git a/spec/requests/custom_wizard/admin/submissions_controller_spec.rb b/spec/requests/custom_wizard/admin/submissions_controller_spec.rb
deleted file mode 100644
index c35b5365..00000000
--- a/spec/requests/custom_wizard/admin/submissions_controller_spec.rb
+++ /dev/null
@@ -1,51 +0,0 @@
-# frozen_string_literal: true
-
-describe CustomWizard::AdminSubmissionsController do
- fab!(:admin_user) { Fabricate(:user, admin: true) }
- fab!(:user1) { Fabricate(:user) }
- fab!(:user2) { Fabricate(:user) }
- fab!(:user3) { Fabricate(:user) }
-
- let(:template) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read)
- }
-
- let(:template_2) {
- temp = template.dup
- temp["id"] = "super_mega_fun_wizard_2"
- temp
- }
-
- before do
- CustomWizard::Template.save(template, skip_jobs: true)
- CustomWizard::Template.save(template_2, skip_jobs: true)
-
- wizard1 = CustomWizard::Wizard.create(template["id"], user1)
- wizard2 = CustomWizard::Wizard.create(template["id"], user2)
- wizard3 = CustomWizard::Wizard.create(template_2["id"], user3)
-
- CustomWizard::Submission.new(wizard1, step_1_field_1: "I am a user1's submission").save
- CustomWizard::Submission.new(wizard2, step_1_field_1: "I am a user2's submission").save
- CustomWizard::Submission.new(wizard3, step_1_field_1: "I am a user3's submission").save
-
- sign_in(admin_user)
- end
-
- it "returns a list of wizards" do
- get "/admin/wizards/submissions.json"
- expect(response.parsed_body.length).to eq(2)
- expect(response.parsed_body.first['id']).to eq(template['id'])
- end
-
- it "returns users' submissions for a wizard" do
- get "/admin/wizards/submissions/#{template['id']}.json"
- expect(response.parsed_body['submissions'].length).to eq(2)
- end
-
- it "downloads submissions" do
- get "/admin/wizards/submissions/#{template_2['id']}/download"
- expect(response.parsed_body.length).to eq(1)
- end
-end
diff --git a/spec/requests/custom_wizard/admin/subscription_controller_spec.rb b/spec/requests/custom_wizard/admin/subscription_controller_spec.rb
new file mode 100644
index 00000000..7be33f32
--- /dev/null
+++ b/spec/requests/custom_wizard/admin/subscription_controller_spec.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+describe CustomWizard::SubscriptionController do
+ fab!(:admin_user) { Fabricate(:user, admin: true) }
+
+ it "requires an admin" do
+ get "/admin/wizards.json"
+ expect(response.status).to eq(404)
+ end
+
+ context "with an admin" do
+ before do
+ sign_in(admin_user)
+ end
+
+ context "without a subscription" do
+ before do
+ disable_subscriptions
+ stub_out_subscription_classes
+ end
+
+ it "returns the right subscription details" do
+ get "/admin/wizards/subscription.json"
+ expect(response.parsed_body["subscribed"]).to eq(false)
+ expect(response.parsed_body["subscription_attributes"]).to eq(CustomWizard::Subscription.attributes.as_json)
+ end
+ end
+
+ context "with a subscription" do
+ before do
+ enable_subscription("standard")
+ stub_out_subscription_classes
+ end
+
+ it "returns the right subscription details" do
+ get "/admin/wizards/subscription.json"
+ expect(response.parsed_body["subscribed"]).to eq(true)
+ expect(response.parsed_body["subscription_type"]).to eq("standard")
+ end
+ end
+ end
+end
diff --git a/spec/requests/custom_wizard/admin/wizard_controller_spec.rb b/spec/requests/custom_wizard/admin/wizard_controller_spec.rb
index de287374..9690fbc7 100644
--- a/spec/requests/custom_wizard/admin/wizard_controller_spec.rb
+++ b/spec/requests/custom_wizard/admin/wizard_controller_spec.rb
@@ -4,16 +4,12 @@ describe CustomWizard::AdminWizardController do
fab!(:admin_user) { Fabricate(:user, admin: true) }
fab!(:user1) { Fabricate(:user) }
fab!(:user2) { Fabricate(:user) }
-
- let(:template) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read)
- }
+ let(:template) { get_wizard_fixture("wizard") }
+ let(:category) { Fabricate(:category, custom_fields: { create_topic_wizard: template['name'].parameterize(separator: "_") }) }
before do
+ enable_subscription("standard")
CustomWizard::Template.save(template, skip_jobs: true)
-
template_2 = template.dup
template_2["id"] = 'super_mega_fun_wizard_2'
template_2["permitted"] = template_2['permitted']
@@ -43,10 +39,12 @@ describe CustomWizard::AdminWizardController do
expect(response.parsed_body['steps'].length).to eq(3)
end
- it "removes wizard templates" do
+ it "removes wizard templates whilst making sure create_topic_wizard settings for that wizard are removed from Categories" do
+ expect(CategoryCustomField.find_by(category_id: category.id, name: 'create_topic_wizard', value: template['name'].parameterize(separator: "_"))).not_to eq(nil)
delete "/admin/wizards/wizard/#{template['id']}.json"
expect(response.status).to eq(200)
expect(CustomWizard::Template.exists?(template['id'])).to eq(false)
+ expect(CategoryCustomField.find_by(name: 'create_topic_wizard', value: template['name'].parameterize(separator: "_"))).to eq(nil)
end
it "saves wizard templates" do
diff --git a/spec/requests/custom_wizard/application_controller_spec.rb b/spec/requests/custom_wizard/application_controller_spec.rb
index 23679c39..1df3442b 100644
--- a/spec/requests/custom_wizard/application_controller_spec.rb
+++ b/spec/requests/custom_wizard/application_controller_spec.rb
@@ -1,21 +1,12 @@
# frozen_string_literal: true
describe ApplicationController do
- fab!(:user) {
- Fabricate(
- :user,
- username: 'angus',
- email: "angus@email.com",
- trust_level: TrustLevel[3]
- )
- }
+ fab!(:user) { Fabricate(:user, username: 'angus', email: "angus@email.com", trust_level: TrustLevel[3]) }
+ let(:wizard_template) { get_wizard_fixture("wizard") }
before do
- CustomWizard::Template.save(
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read),
- skip_jobs: true)
+ stub_out_subscription_classes
+ CustomWizard::Template.save(wizard_template, skip_jobs: true)
@template = CustomWizard::Template.find('super_mega_fun_wizard')
end
diff --git a/spec/requests/custom_wizard/custom_field_extensions_spec.rb b/spec/requests/custom_wizard/custom_field_extensions_spec.rb
index 5bb7ffd9..6b8afedb 100644
--- a/spec/requests/custom_wizard/custom_field_extensions_spec.rb
+++ b/spec/requests/custom_wizard/custom_field_extensions_spec.rb
@@ -6,14 +6,11 @@ describe "custom field extensions" do
let!(:category) { Fabricate(:category) }
let!(:user) { Fabricate(:user) }
let!(:group) { Fabricate(:group, users: [user]) }
-
- let(:custom_field_json) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/custom_field/custom_fields.json"
- ).read)
- }
+ let(:custom_field_json) { get_wizard_fixture("custom_field/custom_fields") }
+ let(:subscription_custom_field_json) { get_wizard_fixture("custom_field/subscription_custom_fields") }
before do
+ stub_out_subscription_classes
custom_field_json['custom_fields'].each do |field_json|
custom_field = CustomWizard::CustomField.new(nil, field_json)
custom_field.save
@@ -30,27 +27,6 @@ describe "custom field extensions" do
expect(response.parsed_body["topic_field_1"]).to eq(true)
end
- it "adds category custom fields to the show categories response" do
- category.custom_fields["category_field_1"] = { a: 1, b: 2 }
- category.save_custom_fields(true)
-
- get "/c/#{category.id}/show.json"
-
- expect(response.status).to eq(200)
- expect(response.parsed_body["category"]["category_field_1"]).to eq({ a: 1, b: 2 }.as_json)
- end
-
- it "adds group custom fields to the show group response" do
- group.custom_fields["group_field_1"] = "Group cf entry"
- group.save_custom_fields(true)
-
- sign_in(user)
- get "/groups/#{group.name}.json"
-
- expect(response.status).to eq(200)
- expect(response.parsed_body['group']['group_field_1']).to eq("Group cf entry")
- end
-
it "adds post custom fields to the show post response" do
post.custom_fields["post_field_1"] = 7
post.save_custom_fields(true)
@@ -61,32 +37,63 @@ describe "custom field extensions" do
expect(response.parsed_body['post_field_1']).to eq(7)
end
- context "preloaded" do
- it "preloads category custom fields on site categories" do
- Site.preloaded_category_custom_fields << "other_field"
+ context "with a subscription" do
+ before do
+ enable_subscription("business")
+ subscription_custom_field_json['custom_fields'].each do |field_json|
+ custom_field = CustomWizard::CustomField.new(nil, field_json)
+ custom_field.save
+ end
+ end
+ it "adds category custom fields to the show categories response" do
category.custom_fields["category_field_1"] = { a: 1, b: 2 }
category.save_custom_fields(true)
- get "/site.json"
- expect(response.status).to eq(200)
+ get "/c/#{category.id}/show.json"
- site_category = response.parsed_body['categories'].select { |c| c['id'] == category.id }.first
- expect(site_category["category_field_1"]).to eq({ a: 1, b: 2 }.as_json)
+ expect(response.status).to eq(200)
+ expect(response.parsed_body["category"]["category_field_1"]).to eq({ a: 1, b: 2 }.as_json)
end
- it "preloads group custom fields on group index" do
- Group.preloaded_custom_field_names << "other_field"
-
- group = Fabricate(:group)
+ it "adds group custom fields to the show group response" do
group.custom_fields["group_field_1"] = "Group cf entry"
group.save_custom_fields(true)
- get "/groups.json"
- expect(response.status).to eq(200)
+ sign_in(user)
+ get "/groups/#{group.name}.json"
- group = response.parsed_body['groups'].select { |g| g['id'] == group.id }.first
- expect(group['group_field_1']).to eq("Group cf entry")
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['group']['group_field_1']).to eq("Group cf entry")
+ end
+
+ context "preloaded" do
+ it "preloads category custom fields on site categories" do
+ Site.preloaded_category_custom_fields << "other_field"
+
+ category.custom_fields["category_field_1"] = { a: 1, b: 2 }
+ category.save_custom_fields(true)
+
+ get "/site.json"
+ expect(response.status).to eq(200)
+
+ site_category = response.parsed_body['categories'].select { |c| c['id'] == category.id }.first
+ expect(site_category["category_field_1"]).to eq({ a: 1, b: 2 }.as_json)
+ end
+
+ it "preloads group custom fields on group index" do
+ Group.preloaded_custom_field_names << "other_field"
+
+ group = Fabricate(:group)
+ group.custom_fields["group_field_1"] = "Group cf entry"
+ group.save_custom_fields(true)
+
+ get "/groups.json"
+ expect(response.status).to eq(200)
+
+ group = response.parsed_body['groups'].select { |g| g['id'] == group.id }.first
+ expect(group['group_field_1']).to eq("Group cf entry")
+ end
end
end
end
diff --git a/spec/requests/custom_wizard/realtime_validations_spec.rb b/spec/requests/custom_wizard/realtime_validations_spec.rb
index a57333b8..0fd8829f 100644
--- a/spec/requests/custom_wizard/realtime_validations_spec.rb
+++ b/spec/requests/custom_wizard/realtime_validations_spec.rb
@@ -1,9 +1,9 @@
# frozen_string_literal: true
describe CustomWizard::RealtimeValidationsController do
-
- fab!(:validation_type) { "test_stub" }
- fab!(:validation_type_stub) {
+ fab!(:user) { Fabricate(:user) }
+ let(:validation_type) { "test_stub" }
+ let(:validation_type_stub) {
{
types: [:text],
component: "similar-topics-validator",
@@ -12,9 +12,8 @@ describe CustomWizard::RealtimeValidationsController do
}
}
- before(:all) do
- sign_in(Fabricate(:user))
- CustomWizard::RealtimeValidation.types = { test_stub: validation_type_stub }
+ before do
+ sign_in(user)
class CustomWizard::RealtimeValidation::TestStub
attr_accessor :user
@@ -40,6 +39,7 @@ describe CustomWizard::RealtimeValidationsController do
end
it "gives the correct response for a given type" do
+ CustomWizard::RealtimeValidation.types = { test_stub: validation_type_stub }
get '/realtime-validations.json', params: { type: validation_type }
expect(response.status).to eq(200)
expected_response = [
@@ -50,11 +50,13 @@ describe CustomWizard::RealtimeValidationsController do
end
it "gives 400 error when no type is passed" do
+ CustomWizard::RealtimeValidation.types = { test_stub: validation_type_stub }
get '/realtime-validations.json'
expect(response.status).to eq(400)
end
it "gives 400 error when a required additional param is missing" do
+ CustomWizard::RealtimeValidation.types = { test_stub: validation_type_stub }
CustomWizard::RealtimeValidation.types[:test_stub][:required_params] = [:test1]
get '/realtime-validations.json', params: { type: validation_type }
expect(response.status).to eq(400)
@@ -63,6 +65,7 @@ describe CustomWizard::RealtimeValidationsController do
end
it "gives 500 response code when a non existant type is passed" do
+ CustomWizard::RealtimeValidation.types = { test_stub: validation_type_stub }
get '/realtime-validations.json', params: { type: "random_type" }
expect(response.status).to eq(500)
end
diff --git a/spec/requests/custom_wizard/steps_controller_spec.rb b/spec/requests/custom_wizard/steps_controller_spec.rb
index dc8d0130..953f1149 100644
--- a/spec/requests/custom_wizard/steps_controller_spec.rb
+++ b/spec/requests/custom_wizard/steps_controller_spec.rb
@@ -1,283 +1,373 @@
# frozen_string_literal: true
describe CustomWizard::StepsController do
- fab!(:user) {
- Fabricate(
- :user,
- username: 'angus',
- email: "angus@email.com",
- trust_level: TrustLevel[3]
- )
- }
-
- fab!(:user2) {
- Fabricate(
- :user,
- username: 'bob',
- email: "bob@email.com",
- trust_level: TrustLevel[2]
- )
- }
-
- let(:wizard_template) {
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read
- )
- }
-
- let(:wizard_field_condition_template) {
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/condition/wizard_field_condition.json"
- ).read
- )
- }
-
- let(:user_condition_template) {
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/condition/user_condition.json"
- ).read
- )
- }
-
- let(:permitted_json) {
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard/permitted.json"
- ).read
- )
- }
+ fab!(:user) { Fabricate(:user, username: 'angus', email: "angus@email.com", trust_level: TrustLevel[3]) }
+ fab!(:user2) { Fabricate(:user, username: 'bob', email: "bob@email.com", trust_level: TrustLevel[2]) }
+ let(:wizard_template) { get_wizard_fixture("wizard") }
+ let(:wizard_field_condition_template) { get_wizard_fixture("condition/wizard_field_condition") }
+ let(:user_condition_template) { get_wizard_fixture("condition/user_condition") }
+ let(:permitted_json) { get_wizard_fixture("wizard/permitted") }
+ let(:route_to_template) { get_wizard_fixture("actions/route_to") }
+ let(:guests_permitted) { get_wizard_fixture("wizard/guests_permitted") }
before do
+ stub_out_subscription_classes
CustomWizard::Template.save(wizard_template, skip_jobs: true)
- sign_in(user)
end
- it 'performs a step update' do
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Text input"
+ def guest_template
+ temp = wizard_template.dup
+ temp["permitted"] = guests_permitted["permitted"]
+ temp.delete("actions")
+ temp["actions"] = [route_to_template]
+ temp
+ end
+
+ context "with guest" do
+ it "does not perform a step update" do
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Text input"
+ }
}
- }
- expect(response.status).to eq(200)
- expect(response.parsed_body['wizard']['start']).to eq("step_2")
-
- wizard_id = response.parsed_body['wizard']['id']
- wizard = CustomWizard::Wizard.create(wizard_id, user)
- expect(wizard.current_submission.fields['step_1_field_1']).to eq("Text input")
- end
-
- context "raises an error" do
- it "when the wizard doesnt exist" do
- put '/w/not-super-mega-fun-wizard/steps/step_1.json'
- expect(response.status).to eq(400)
+ expect(response.status).to eq(403)
end
- it "when the user cant access the wizard" do
+ context "with guests permitted" do
+ before do
+ enable_subscription("standard")
+ result = CustomWizard::Template.save(guest_template, skip_jobs: true)
+ end
+
+ it "performs a step update" do
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Text input"
+ }
+ }
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_2")
+
+ wizard_id = response.parsed_body['wizard']['id']
+ wizard = CustomWizard::Wizard.create(wizard_id, nil, cookies[:custom_wizard_guest_id])
+ expect(wizard.current_submission.fields['step_1_field_1']).to eq("Text input")
+ end
+
+ context "raises an error" do
+ it "when the wizard doesnt exist" do
+ put '/w/not-super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(400)
+ end
+
+ it "when the user cant access the wizard" do
+ enable_subscription("standard")
+ new_template = guest_template.dup
+ new_template["permitted"] = permitted_json["permitted"]
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(403)
+ end
+
+ it "when the step doesnt exist" do
+ put '/w/super-mega-fun-wizard/steps/step_10.json'
+ expect(response.status).to eq(400)
+ end
+ end
+
+ it "works if the step has no fields" do
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_2")
+ end
+
+ it "returns an updated wizard when condition passes" do
+ new_template = guest_template.dup
+ new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition will pass"
+ }
+ }
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_2")
+ end
+
+ it "runs completion actions if guest has completed wizard" do
+ new_template = guest_template.dup
+
+ ## route_to action
+ new_template['actions'].last['run_after'] = 'wizard_completion'
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ put '/w/super-mega-fun-wizard/steps/step_2.json'
+ put '/w/super-mega-fun-wizard/steps/step_3.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['redirect_on_complete']).to eq("https://google.com")
+ end
+ end
+ end
+
+ context "with user" do
+ before do
+ sign_in(user)
+ end
+
+ it 'performs a step update' do
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Text input"
+ }
+ }
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_2")
+
+ wizard_id = response.parsed_body['wizard']['id']
+ wizard = CustomWizard::Wizard.create(wizard_id, user)
+ expect(wizard.current_submission.fields['step_1_field_1']).to eq("Text input")
+ end
+
+ context "raises an error" do
+ it "when the wizard doesnt exist" do
+ put '/w/not-super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(400)
+ end
+
+ it "when the user cant access the wizard" do
+ enable_subscription("standard")
+ new_template = wizard_template.dup
+ new_template["permitted"] = permitted_json["permitted"]
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(403)
+ end
+
+ it "when the step doesnt exist" do
+ put '/w/super-mega-fun-wizard/steps/step_10.json'
+ expect(response.status).to eq(400)
+ end
+ end
+
+ it "works if the step has no fields" do
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_2")
+ end
+
+ it "returns an updated wizard when condition passes" do
new_template = wizard_template.dup
- new_template["permitted"] = permitted_json["permitted"]
+ new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition will pass"
+ }
+ }
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_2")
+ end
+
+ it "runs completion actions if user has completed wizard" do
+ new_template = wizard_template.dup
+
+ ## route_to action
+ new_template['actions'].last['run_after'] = 'wizard_completion'
CustomWizard::Template.save(new_template, skip_jobs: true)
put '/w/super-mega-fun-wizard/steps/step_1.json'
- expect(response.status).to eq(403)
+ put '/w/super-mega-fun-wizard/steps/step_2.json'
+ put '/w/super-mega-fun-wizard/steps/step_3.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['redirect_on_complete']).to eq("https://google.com")
end
- it "when the step doesnt exist" do
- put '/w/super-mega-fun-wizard/steps/step_10.json'
- expect(response.status).to eq(400)
+ it "saves results of completion actions if user has completed wizard" do
+ new_template = wizard_template.dup
+ new_template['actions'].first['run_after'] = 'wizard_completion'
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Topic title",
+ step_1_field_2: "Topic post"
+ }
+ }
+ put '/w/super-mega-fun-wizard/steps/step_2.json'
+ put '/w/super-mega-fun-wizard/steps/step_3.json'
+
+ wizard_id = response.parsed_body['wizard']['id']
+ wizard = CustomWizard::Wizard.create(wizard_id, user)
+
+ topic_id = wizard.submissions.first.fields[new_template['actions'].first['id']]
+ topic = Topic.find(topic_id)
+ expect(topic.present?).to eq(true)
end
- it "when user cant see the step due to conditions" do
- sign_in(user2)
-
- new_wizard_template = wizard_template.dup
- new_wizard_template['steps'][0]['condition'] = user_condition_template['condition']
- CustomWizard::Template.save(new_wizard_template, skip_jobs: true)
-
+ it "returns a final step without conditions" do
put '/w/super-mega-fun-wizard/steps/step_1.json'
- expect(response.status).to eq(403)
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(false)
+
+ put '/w/super-mega-fun-wizard/steps/step_2.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(false)
+
+ put '/w/super-mega-fun-wizard/steps/step_3.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(true)
end
- end
- it "works if the step has no fields" do
- put '/w/super-mega-fun-wizard/steps/step_1.json'
- expect(response.status).to eq(200)
- expect(response.parsed_body['wizard']['start']).to eq("step_2")
- end
+ context "subscription" do
+ before do
+ enable_subscription("standard")
+ end
- it "returns an updated wizard when condition passes" do
- new_template = wizard_template.dup
- new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
+ it "raises an error when user cant see the step due to conditions" do
+ sign_in(user2)
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Condition will pass"
- }
- }
- expect(response.status).to eq(200)
- expect(response.parsed_body['wizard']['start']).to eq("step_2")
- end
+ new_wizard_template = wizard_template.dup
+ new_wizard_template['steps'][0]['condition'] = user_condition_template['condition']
+ CustomWizard::Template.save(new_wizard_template, skip_jobs: true)
- it "returns an updated wizard when condition doesnt pass" do
- new_template = wizard_template.dup
- new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(403)
+ end
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Condition wont pass"
- }
- }
- expect(response.status).to eq(200)
- expect(response.parsed_body['wizard']['start']).to eq("step_3")
- end
+ it "returns an updated wizard when condition doesnt pass" do
+ new_template = wizard_template.dup
+ new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
- it "runs completion actions if user has completed wizard" do
- new_template = wizard_template.dup
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition wont pass"
+ }
+ }
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_3")
+ end
- ## route_to action
- new_template['actions'].last['run_after'] = 'wizard_completion'
- new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
- new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
+ it "returns the correct final step when the conditional final step and last step are the same" do
+ new_template = wizard_template.dup
+ new_template['steps'][0]['condition'] = user_condition_template['condition']
+ new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
+ end
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Condition wont pass"
- }
- }
- expect(response.status).to eq(200)
- expect(response.parsed_body['redirect_on_complete']).to eq("https://google.com")
- end
+ it "raises an error when user cant see the step due to conditions" do
+ sign_in(user2)
- it "saves results of completion actions if user has completed wizard" do
- new_template = wizard_template.dup
+ new_wizard_template = wizard_template.dup
+ new_wizard_template['steps'][0]['condition'] = user_condition_template['condition']
+ CustomWizard::Template.save(new_wizard_template, skip_jobs: true)
- ## Create group action
- new_template['actions'].first['run_after'] = 'wizard_completion'
- new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
+ put '/w/super-mega-fun-wizard/steps/step_1.json'
+ expect(response.status).to eq(403)
+ end
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "My cool group"
- }
- }
- expect(response.status).to eq(200)
+ it "returns an updated wizard when condition doesnt pass" do
+ new_template = wizard_template.dup
+ new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
- put '/w/super-mega-fun-wizard/steps/step_3.json'
- expect(response.status).to eq(200)
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition wont pass"
+ }
+ }
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['wizard']['start']).to eq("step_3")
+ end
- wizard_id = response.parsed_body['wizard']['id']
- wizard = CustomWizard::Wizard.create(wizard_id, user)
+ it "returns the correct final step when the conditional final step and last step are the same" do
+ new_template = wizard_template.dup
+ new_template['steps'][0]['condition'] = user_condition_template['condition']
+ new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
- group_name = wizard.submissions.first.fields['action_9']
- group = Group.find_by(name: group_name)
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition will pass"
+ }
+ }
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(false)
- expect(group.present?).to eq(true)
- expect(group.full_name).to eq("My cool group")
- end
+ put '/w/super-mega-fun-wizard/steps/step_2.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(false)
- it "returns a final step without conditions" do
- put '/w/super-mega-fun-wizard/steps/step_1.json'
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(false)
+ put '/w/super-mega-fun-wizard/steps/step_3.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(true)
+ end
- put '/w/super-mega-fun-wizard/steps/step_2.json'
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(false)
+ it "returns the correct final step when the conditional final step and last step are different" do
+ new_template = wizard_template.dup
+ new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
- put '/w/super-mega-fun-wizard/steps/step_3.json'
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(true)
- end
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition will not pass"
+ }
+ }
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(false)
- it "returns the correct final step when the conditional final step and last step are the same" do
- new_template = wizard_template.dup
- new_template['steps'][0]['condition'] = user_condition_template['condition']
- new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
+ put '/w/super-mega-fun-wizard/steps/step_2.json'
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(true)
+ end
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Condition will pass"
- }
- }
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(false)
+ it "returns the correct final step when the conditional final step is determined in the same action" do
+ new_template = wizard_template.dup
+ new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
+ new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
- put '/w/super-mega-fun-wizard/steps/step_2.json'
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(false)
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition will not pass"
+ }
+ }
+ expect(response.status).to eq(200)
+ expect(response.parsed_body['final']).to eq(true)
+ end
- put '/w/super-mega-fun-wizard/steps/step_3.json'
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(true)
- end
+ it "excludes the non-included conditional fields from the submissions" do
+ new_template = wizard_template.dup
+ new_template['steps'][1]['fields'][0]['condition'] = wizard_field_condition_template['condition']
+ CustomWizard::Template.save(new_template, skip_jobs: true)
- it "returns the correct final step when the conditional final step and last step are different" do
- new_template = wizard_template.dup
- new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition will pass"
+ }
+ }
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Condition will not pass"
- }
- }
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(false)
+ put '/w/super-mega-fun-wizard/steps/step_2.json', params: {
+ fields: {
+ step_2_field_1: "1995-04-23"
+ }
+ }
- put '/w/super-mega-fun-wizard/steps/step_2.json'
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(true)
- end
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Condition will not pass"
+ }
+ }
- it "returns the correct final step when the conditional final step is determined in the same action" do
- new_template = wizard_template.dup
- new_template['steps'][1]['condition'] = wizard_field_condition_template['condition']
- new_template['steps'][2]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
-
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Condition will not pass"
- }
- }
- expect(response.status).to eq(200)
- expect(response.parsed_body['final']).to eq(true)
- end
-
- it "excludes the non-included conditional fields from the submissions" do
- new_template = wizard_template.dup
- new_template['steps'][1]['fields'][0]['condition'] = wizard_field_condition_template['condition']
- CustomWizard::Template.save(new_template, skip_jobs: true)
-
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Condition will pass"
- }
- }
-
- put '/w/super-mega-fun-wizard/steps/step_2.json', params: {
- fields: {
- step_2_field_1: "1995-04-23"
- }
- }
-
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Condition will not pass"
- }
- }
-
- wizard_id = response.parsed_body['wizard']['id']
- wizard = CustomWizard::Wizard.create(wizard_id, user)
- submission = wizard.current_submission
- expect(submission.fields.keys).not_to include("step_2_field_1")
+ wizard_id = response.parsed_body['wizard']['id']
+ wizard = CustomWizard::Wizard.create(wizard_id, user)
+ submission = wizard.current_submission
+ expect(submission.fields.keys).not_to include("step_2_field_1")
+ end
+ end
end
end
diff --git a/spec/requests/custom_wizard/wizard_controller_spec.rb b/spec/requests/custom_wizard/wizard_controller_spec.rb
index 44e48ed7..5a073e7d 100644
--- a/spec/requests/custom_wizard/wizard_controller_spec.rb
+++ b/spec/requests/custom_wizard/wizard_controller_spec.rb
@@ -1,31 +1,14 @@
# frozen_string_literal: true
describe CustomWizard::WizardController do
- fab!(:user) {
- Fabricate(
- :user,
- username: 'angus',
- email: "angus@email.com",
- trust_level: TrustLevel[3]
- )
- }
-
- let(:permitted_json) {
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard/permitted.json"
- ).read
- )
- }
+ fab!(:user) { Fabricate(:user, username: 'angus', email: "angus@email.com", trust_level: TrustLevel[3]) }
+ let(:wizard_template) { get_wizard_fixture("wizard") }
+ let(:permitted_json) { get_wizard_fixture("wizard/permitted") }
before do
- CustomWizard::Template.save(
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read),
- skip_jobs: true)
+ stub_out_subscription_classes
+ CustomWizard::Template.save(wizard_template, skip_jobs: true)
@template = CustomWizard::Template.find("super_mega_fun_wizard")
- sign_in(user)
end
context 'plugin disabled' do
@@ -49,64 +32,70 @@ describe CustomWizard::WizardController do
expect(response.parsed_body["error"]).to eq("We couldn't find a wizard at that address.")
end
- context 'when user skips the wizard' do
-
- it 'skips a wizard if user is allowed to skip' do
- put '/w/super-mega-fun-wizard/skip.json'
- expect(response.status).to eq(200)
+ context "with user" do
+ before do
+ sign_in(user)
end
- it 'lets user skip if user cant access wizard' do
- @template["permitted"] = permitted_json["permitted"]
- CustomWizard::Template.save(@template, skip_jobs: true)
+ context 'when user skips' do
+ it 'skips a wizard if user is allowed to skip' do
+ put '/w/super-mega-fun-wizard/skip.json'
+ expect(response.status).to eq(200)
+ end
- put '/w/super-mega-fun-wizard/skip.json'
- expect(response.status).to eq(200)
- end
+ it 'lets user skip if user cant access wizard' do
+ enable_subscription("standard")
+ @template["permitted"] = permitted_json["permitted"]
+ CustomWizard::Template.save(@template, skip_jobs: true)
+ put '/w/super-mega-fun-wizard/skip.json'
+ expect(response.status).to eq(200)
+ end
- it 'returns a no skip message if user is not allowed to skip' do
- @template['required'] = 'true'
- CustomWizard::Template.save(@template)
- put '/w/super-mega-fun-wizard/skip.json'
- expect(response.parsed_body['error']).to eq("Wizard can't be skipped")
- end
+ it 'returns a no skip message if user is not allowed to skip' do
+ enable_subscription("standard")
+ @template['required'] = 'true'
+ CustomWizard::Template.save(@template)
+ put '/w/super-mega-fun-wizard/skip.json'
+ expect(response.parsed_body['error']).to eq("Wizard can't be skipped")
+ end
- it 'skip response contains a redirect_to if in users submissions' do
- @wizard = CustomWizard::Wizard.create(@template["id"], user)
- CustomWizard::Submission.new(@wizard, redirect_to: "/t/2").save
- put '/w/super-mega-fun-wizard/skip.json'
- expect(response.parsed_body['redirect_to']).to eq('/t/2')
- end
+ it 'skip response contains a redirect_to if in users submissions' do
+ @wizard = CustomWizard::Wizard.create(@template["id"], user)
+ CustomWizard::Submission.new(@wizard, redirect_to: "/t/2").save
+ put '/w/super-mega-fun-wizard/skip.json'
+ expect(response.parsed_body['redirect_to']).to eq('/t/2')
+ end
- it 'deletes the users redirect_to_wizard if present' do
- user.custom_fields['redirect_to_wizard'] = @template["id"]
- user.save_custom_fields(true)
- @wizard = CustomWizard::Wizard.create(@template["id"], user)
- put '/w/super-mega-fun-wizard/skip.json'
- expect(response.status).to eq(200)
- expect(user.reload.redirect_to_wizard).to eq(nil)
- end
+ it 'deletes the users redirect_to_wizard if present' do
+ user.custom_fields['redirect_to_wizard'] = @template["id"]
+ user.save_custom_fields(true)
+ @wizard = CustomWizard::Wizard.create(@template["id"], user)
+ put '/w/super-mega-fun-wizard/skip.json'
+ expect(response.status).to eq(200)
+ expect(user.reload.redirect_to_wizard).to eq(nil)
+ end
- it "deletes the submission if user has filled up some data" do
- @wizard = CustomWizard::Wizard.create(@template["id"], user)
- CustomWizard::Submission.new(@wizard, step_1_field_1: "Hello World").save
- current_submission = @wizard.current_submission
- put '/w/super-mega-fun-wizard/skip.json'
- list = CustomWizard::Submission.list(@wizard)
+ it "deletes the submission if user has filled up some data" do
+ @wizard = CustomWizard::Wizard.create(@template["id"], user)
+ CustomWizard::Submission.new(@wizard, step_1_field_1: "Hello World").save
+ current_submission = @wizard.current_submission
+ put '/w/super-mega-fun-wizard/skip.json'
+ submissions = CustomWizard::Submission.list(@wizard).submissions
- expect(list.any? { |submission| submission.id == current_submission.id }).to eq(false)
- end
+ expect(submissions.any? { |submission| submission.id == current_submission.id }).to eq(false)
+ end
- it "starts from the first step if user visits after skipping the wizard" do
- put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
- fields: {
- step_1_field_1: "Text input"
+ it "starts from the first step if user visits after skipping the wizard" do
+ put '/w/super-mega-fun-wizard/steps/step_1.json', params: {
+ fields: {
+ step_1_field_1: "Text input"
+ }
}
- }
- put '/w/super-mega-fun-wizard/skip.json'
- get '/w/super-mega-fun-wizard.json'
+ put '/w/super-mega-fun-wizard/skip.json'
+ get '/w/super-mega-fun-wizard.json'
- expect(response.parsed_body["start"]).to eq('step_1')
+ expect(response.parsed_body["start"]).to eq('step_1')
+ end
end
end
end
diff --git a/spec/serializers/custom_wizard/basic_wizard_serializer_spec.rb b/spec/serializers/custom_wizard/basic_wizard_serializer_spec.rb
index 59647477..ea4e4568 100644
--- a/spec/serializers/custom_wizard/basic_wizard_serializer_spec.rb
+++ b/spec/serializers/custom_wizard/basic_wizard_serializer_spec.rb
@@ -2,13 +2,14 @@
describe CustomWizard::BasicWizardSerializer do
fab!(:user) { Fabricate(:user) }
+ let(:template) { get_wizard_fixture("wizard") }
+
+ before do
+ stub_out_subscription_classes
+ end
it 'should return basic wizard attributes' do
- CustomWizard::Template.save(
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read),
- skip_jobs: true)
+ CustomWizard::Template.save(template, skip_jobs: true)
json = CustomWizard::BasicWizardSerializer.new(
CustomWizard::Builder.new("super_mega_fun_wizard", user).build,
scope: Guardian.new(user)
diff --git a/spec/serializers/custom_wizard/custom_field_serializer_spec.rb b/spec/serializers/custom_wizard/custom_field_serializer_spec.rb
index 0f6f5564..490b4775 100644
--- a/spec/serializers/custom_wizard/custom_field_serializer_spec.rb
+++ b/spec/serializers/custom_wizard/custom_field_serializer_spec.rb
@@ -2,12 +2,11 @@
describe CustomWizard::CustomFieldSerializer do
fab!(:user) { Fabricate(:user) }
+ let(:custom_field_json) { get_wizard_fixture("custom_field/custom_fields") }
- let(:custom_field_json) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/custom_field/custom_fields.json"
- ).read)
- }
+ before do
+ stub_out_subscription_classes
+ end
it 'should return custom field attributes' do
custom_field_json['custom_fields'].each do |field_json|
diff --git a/spec/serializers/custom_wizard/log_serializer_spec.rb b/spec/serializers/custom_wizard/log_serializer_spec.rb
index 895cab54..cad4a85b 100644
--- a/spec/serializers/custom_wizard/log_serializer_spec.rb
+++ b/spec/serializers/custom_wizard/log_serializer_spec.rb
@@ -4,14 +4,16 @@ describe CustomWizard::LogSerializer do
fab!(:user) { Fabricate(:user) }
it 'should return log attributes' do
- CustomWizard::Log.create("First log message")
- CustomWizard::Log.create("Second log message")
+ CustomWizard::Log.create('first-test-wizard', 'perform_first_action', 'first_test_user', 'First log message', 1.day.ago)
+ CustomWizard::Log.create('second-test-wizard', 'perform_second_action', 'second_test_user', 'Second log message')
json_array = ActiveModel::ArraySerializer.new(
- CustomWizard::Log.list(0),
+ CustomWizard::Log.list(0).logs,
each_serializer: CustomWizard::LogSerializer
).as_json
expect(json_array.length).to eq(2)
+ expect(json_array[0][:action]).to eq("perform_second_action")
+ expect(json_array[0][:username]).to eq('second_test_user')
expect(json_array[0][:message]).to eq("Second log message")
end
end
diff --git a/spec/serializers/custom_wizard/submission_serializer_spec.rb b/spec/serializers/custom_wizard/submission_serializer_spec.rb
new file mode 100644
index 00000000..0548f381
--- /dev/null
+++ b/spec/serializers/custom_wizard/submission_serializer_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require_relative '../../plugin_helper'
+
+describe CustomWizard::SubmissionSerializer do
+ fab!(:user1) { Fabricate(:user) }
+ fab!(:user2) { Fabricate(:user) }
+
+ let(:template_json) {
+ JSON.parse(File.open(
+ "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
+ ).read)
+ }
+
+ before do
+ stub_out_subscription_classes
+ CustomWizard::Template.save(template_json, skip_jobs: true)
+
+ wizard = CustomWizard::Wizard.create(template_json["id"], user1)
+ CustomWizard::Submission.new(wizard, step_1_field_1: "I am user1 submission", submitted_at: Time.now.iso8601).save
+
+ wizard = CustomWizard::Wizard.create(template_json["id"], user2)
+ CustomWizard::Submission.new(wizard, step_1_field_1: "I am user2 submission", submitted_at: Time.now.iso8601).save
+ end
+
+ it 'should return submission attributes' do
+ wizard = CustomWizard::Wizard.create(template_json["id"])
+ list = CustomWizard::Submission.list(wizard, page: 0, order_by: 'id')
+
+ json_array = ActiveModel::ArraySerializer.new(
+ list.submissions,
+ each_serializer: described_class
+ ).as_json
+
+ expect(json_array.length).to eq(2)
+ expect(json_array[0][:id].present?).to eq(true)
+ expect(json_array[0][:submitted_at].present?).to eq(true)
+ expect(json_array[0][:user]).to eq(BasicUserSerializer.new(user2, root: false).as_json)
+ expect(json_array[1][:user]).to eq(BasicUserSerializer.new(user1, root: false).as_json)
+ end
+
+ it "should return field values, types and labels" do
+ wizard = CustomWizard::Wizard.create(template_json["id"])
+ list = CustomWizard::Submission.list(wizard, page: 0, order_by: 'id')
+
+ json_array = ActiveModel::ArraySerializer.new(
+ list.submissions,
+ each_serializer: described_class
+ ).as_json
+
+ expect(json_array.length).to eq(2)
+ expect(json_array[0][:fields].as_json).to eq({
+ "step_1_field_1": {
+ "value": "I am user2 submission",
+ "type": "text",
+ "label": "Text"
+ }
+ }.as_json)
+ end
+end
diff --git a/spec/serializers/custom_wizard/wizard_field_serializer_spec.rb b/spec/serializers/custom_wizard/wizard_field_serializer_spec.rb
index 5f225f44..be883e6b 100644
--- a/spec/serializers/custom_wizard/wizard_field_serializer_spec.rb
+++ b/spec/serializers/custom_wizard/wizard_field_serializer_spec.rb
@@ -2,13 +2,11 @@
describe CustomWizard::FieldSerializer do
fab!(:user) { Fabricate(:user) }
+ let(:template) { get_wizard_fixture("wizard") }
before do
- CustomWizard::Template.save(
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read),
- skip_jobs: true)
+ stub_out_subscription_classes
+ CustomWizard::Template.save(template, skip_jobs: true)
@wizard = CustomWizard::Builder.new("super_mega_fun_wizard", user).build
end
@@ -22,7 +20,7 @@ describe CustomWizard::FieldSerializer do
expect(json_array.size).to eq(@wizard.steps.first.fields.size)
expect(json_array[0][:label]).to eq("Text
")
expect(json_array[0][:description]).to eq("Text field description.")
- expect(json_array[3][:index]).to eq(3)
+ expect(json_array[2][:index]).to eq(2)
end
it "should return optional field attributes" do
@@ -32,6 +30,5 @@ describe CustomWizard::FieldSerializer do
scope: Guardian.new(user)
).as_json
expect(json_array[0][:format]).to eq("YYYY-MM-DD")
- expect(json_array[6][:file_types]).to eq(".jpg,.jpeg,.png")
end
end
diff --git a/spec/serializers/custom_wizard/wizard_serializer_spec.rb b/spec/serializers/custom_wizard/wizard_serializer_spec.rb
index 1b26ce24..3a39827c 100644
--- a/spec/serializers/custom_wizard/wizard_serializer_spec.rb
+++ b/spec/serializers/custom_wizard/wizard_serializer_spec.rb
@@ -3,19 +3,13 @@
describe CustomWizard::WizardSerializer do
fab!(:user) { Fabricate(:user) }
fab!(:category) { Fabricate(:category) }
-
- let(:similar_topics_validation) {
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/field/validation/similar_topics.json"
- ).read)
- }
+ let(:template) { get_wizard_fixture("wizard") }
+ let(:similar_topics_validation) { get_wizard_fixture("field/validation/similar_topics") }
+ let(:advanced_fields) { get_wizard_fixture("field/advanced_types") }
before do
- CustomWizard::Template.save(
- JSON.parse(File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read),
- skip_jobs: true)
+ stub_out_subscription_classes
+ CustomWizard::Template.save(template, skip_jobs: true)
@template = CustomWizard::Template.find('super_mega_fun_wizard')
end
@@ -47,56 +41,4 @@ describe CustomWizard::WizardSerializer do
json[:wizard][:user]
).to eq(BasicUserSerializer.new(user, root: false).as_json)
end
-
- it "should not return categories if there are no category fields" do
- @template[:steps][2][:fields].delete_at(2)
- CustomWizard::Template.save(@template)
-
- json = CustomWizard::WizardSerializer.new(
- CustomWizard::Builder.new(@template[:id], user).build,
- scope: Guardian.new(user)
- ).as_json
- expect(json[:wizard][:categories].present?).to eq(false)
- expect(json[:wizard][:uncategorized_category_id].present?).to eq(false)
- end
-
- it "should return categories if there is a category selector field" do
- json = CustomWizard::WizardSerializer.new(
- CustomWizard::Builder.new(@template[:id], user).build,
- scope: Guardian.new(user)
- ).as_json
- expect(json[:wizard][:categories].present?).to eq(true)
- expect(json[:wizard][:uncategorized_category_id].present?).to eq(true)
- end
-
- it "should return categories if there is a similar topics validation scoped to category(s)" do
- @template[:steps][0][:fields][0][:validations] = similar_topics_validation[:validations]
- CustomWizard::Template.save(@template)
-
- json = CustomWizard::WizardSerializer.new(
- CustomWizard::Builder.new(@template[:id], user).build,
- scope: Guardian.new(user)
- ).as_json
- expect(json[:wizard][:categories].present?).to eq(true)
- expect(json[:wizard][:uncategorized_category_id].present?).to eq(true)
- end
-
- it 'should return groups if there is a group selector field' do
- json = CustomWizard::WizardSerializer.new(
- CustomWizard::Builder.new(@template[:id], user).build,
- scope: Guardian.new(user)
- ).as_json
- expect(json[:wizard][:groups].length).to eq(8)
- end
-
- it 'should not return groups if there is not a group selector field' do
- @template[:steps][2][:fields].delete_at(3)
- CustomWizard::Template.save(@template)
-
- json = CustomWizard::WizardSerializer.new(
- CustomWizard::Builder.new(@template[:id], user).build,
- scope: Guardian.new(user)
- ).as_json
- expect(json[:wizard][:groups].present?).to eq(false)
- end
end
diff --git a/spec/serializers/custom_wizard/wizard_step_serializer_spec.rb b/spec/serializers/custom_wizard/wizard_step_serializer_spec.rb
index 0df76baf..4bcc6718 100644
--- a/spec/serializers/custom_wizard/wizard_step_serializer_spec.rb
+++ b/spec/serializers/custom_wizard/wizard_step_serializer_spec.rb
@@ -2,24 +2,11 @@
describe CustomWizard::StepSerializer do
fab!(:user) { Fabricate(:user) }
-
- let(:wizard_template) {
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/wizard.json"
- ).read
- )
- }
-
- let(:required_data_json) {
- JSON.parse(
- File.open(
- "#{Rails.root}/plugins/discourse-custom-wizard/spec/fixtures/step/required_data.json"
- ).read
- )
- }
+ let(:wizard_template) { get_wizard_fixture("wizard") }
+ let(:required_data_json) { get_wizard_fixture("step/required_data") }
before do
+ stub_out_subscription_classes
CustomWizard::Template.save(wizard_template, skip_jobs: true)
@wizard = CustomWizard::Builder.new("super_mega_fun_wizard", user).build
end
@@ -30,7 +17,7 @@ describe CustomWizard::StepSerializer do
each_serializer: described_class,
scope: Guardian.new(user)
).as_json
- expect(json_array[0][:title]).to eq("Text
")
+ expect(json_array[0][:title]).to eq("Text")
expect(json_array[0][:description]).to eq("Text inputs!
")
expect(json_array[1][:index]).to eq(1)
end
@@ -47,6 +34,7 @@ describe CustomWizard::StepSerializer do
context 'with required data' do
before do
+ enable_subscription("standard")
wizard_template['steps'][0]['required_data'] = required_data_json['required_data']
wizard_template['steps'][0]['required_data_message'] = required_data_json['required_data_message']
CustomWizard::Template.save(wizard_template)
diff --git a/svg-icons/plugin-icons.svg b/svg-icons/plugin-icons.svg
new file mode 100644
index 00000000..f456dbca
--- /dev/null
+++ b/svg-icons/plugin-icons.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/javascripts/acceptance/admin-custom-fields-unsubscribed-test.js b/test/javascripts/acceptance/admin-custom-fields-unsubscribed-test.js
new file mode 100644
index 00000000..80e80773
--- /dev/null
+++ b/test/javascripts/acceptance/admin-custom-fields-unsubscribed-test.js
@@ -0,0 +1,362 @@
+import {
+ acceptance,
+ query,
+ visible,
+} from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, fillIn, findAll, visit, waitUntil } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import {
+ getCustomFields,
+ getSuppliers,
+ getUnsubscribedAdminWizards,
+ getWizard,
+} from "../helpers/admin-wizard";
+import { Promise } from "rsvp";
+
+acceptance("Admin | Custom Fields Unsubscribed", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ server.get("/admin/wizards/subscription", () => {
+ return helper.response(getUnsubscribedAdminWizards);
+ });
+ server.get("/admin/wizards/custom-fields", () => {
+ return helper.response(getCustomFields);
+ });
+ server.put("/admin/wizards/custom-fields", () => {
+ return helper.response({ success: "OK" });
+ });
+ server.delete("/admin/wizards/custom-fields/topic_custom_field", () => {
+ return helper.response({ success: "OK" });
+ });
+ server.get("/admin/plugins/subscription-client/suppliers", () => {
+ return helper.response(getSuppliers);
+ });
+ });
+
+ async function selectTypeAndSerializerAndFillInName(
+ type,
+ serializer,
+ name,
+ summaryName
+ ) {
+ const typeDropdown = selectKit(
+ `.admin-wizard-container details:has(summary[name="${summaryName}"])`
+ );
+ await typeDropdown.expand();
+ await click(
+ `.select-kit-collection li[data-value="${type.toLowerCase()}"]`
+ );
+
+ const serializerDropdown = selectKit(
+ ".admin-wizard-container details.multi-select"
+ );
+ await serializerDropdown.expand();
+ await click(
+ `.select-kit-collection li[data-value="${serializer
+ .toLowerCase()
+ .replace(/ /g, "_")}"]`
+ );
+
+ await fillIn(
+ ".admin-wizard-container input",
+ name.toLowerCase().replace(/ /g, "_")
+ );
+ }
+
+ async function waitForSaveMessage() {
+ // Wait for the "Saved custom field" message to appear
+ await waitUntil(
+ () =>
+ document.querySelector(".message-content")?.innerText ===
+ "Saved custom field",
+ { timeout: 5000 }
+ );
+
+ // Wait for the message to change back to the original text
+ await waitUntil(
+ () =>
+ document.querySelector(".message-content")?.innerText ===
+ "View, create, edit and destroy custom fields",
+ { timeout: 15000 }
+ );
+ await new Promise((resolve) => setTimeout(resolve, 1000));
+ }
+
+ test("Navigate to custom fields tab", async (assert) => {
+ await visit("/admin/wizards/custom-fields");
+ assert.ok(find("table"));
+ assert.ok(
+ findAll("table tbody tr").length === 4,
+ "Display loaded custom fields"
+ );
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "View, create, edit and destroy custom fields"
+ ),
+ "it displays wizard message"
+ );
+ });
+ test("view available custom fields for unsubscribed plan", async (assert) => {
+ await visit("/admin/wizards/custom-fields");
+ await click(".admin-wizard-controls .btn-icon-text");
+ assert.ok(
+ visible(".wizard-subscription-selector"),
+ "custom field class is present"
+ );
+ assert.ok(
+ visible(".wizard-subscription-selector-header"),
+ "custom field type is present"
+ );
+ assert.ok(visible(".input"), "custom field name is present");
+ assert.ok(visible(".multi-select"), "custom field serializer is present");
+ assert.ok(visible(".actions"), "custom field action buttons are present");
+
+ const dropdown1 = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"])'
+ );
+ await dropdown1.expand();
+ let enabledOptions1 = findAll(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"]) ul li:not(.disabled)'
+ );
+ let disabledOptions1 = findAll(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"]) ul li.disabled'
+ );
+ assert.equal(
+ enabledOptions1.length,
+ 2,
+ "There are two enabled options for class fields"
+ );
+ assert.equal(
+ disabledOptions1.length,
+ 2,
+ "There are two disabled options for class fields"
+ );
+ const dropdown2 = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a type"])'
+ );
+ await dropdown2.expand();
+ let enabledOptions2 = findAll(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a type"]) ul li:not(.disabled)'
+ );
+ let disabledOptions2 = findAll(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a type"]) ul li.disabled'
+ );
+ assert.equal(
+ enabledOptions2.length,
+ 3,
+ "There are three enabled options for type"
+ );
+ assert.equal(
+ disabledOptions2.length,
+ 1,
+ "There is one disabled option for type"
+ );
+ });
+ test("change custom fields for unsubscribed plan", async (assert) => {
+ await visit("/admin/wizards/custom-fields");
+ await click(".admin-wizard-controls .btn-icon-text");
+
+ const dropdown1 = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"])'
+ );
+ await dropdown1.expand();
+ await click('.select-kit-collection li[data-value="topic"]');
+ const serializerDropdown = selectKit(
+ ".admin-wizard-container details.multi-select"
+ );
+ await serializerDropdown.expand();
+ let enabledOptions1 = findAll(
+ ".admin-wizard-container details.multi-select ul li"
+ );
+ assert.equal(
+ enabledOptions1.length,
+ 2,
+ "There are two enabled options in the serializer dropdown for Topic"
+ );
+ await serializerDropdown.collapse();
+ const dropdown2 = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Topic"])'
+ );
+ await dropdown2.expand();
+ await click('.select-kit-collection li[data-value="post"]');
+ await serializerDropdown.expand();
+ let enabledOptions2 = findAll(
+ ".admin-wizard-container details.multi-select ul li"
+ );
+ assert.equal(
+ enabledOptions2.length,
+ 1,
+ "There is one enabled option in the serializer dropdown for Post"
+ );
+ });
+
+ test("Create Topic and Post custom fields", async (assert) => {
+ await visit("/admin/wizards/custom-fields");
+ assert.ok(
+ findAll("table tbody tr").length === 4,
+ "Display loaded custom fields"
+ );
+ await click(".admin-wizard-controls .btn-icon-text");
+
+ const dropdownTopic = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"])'
+ );
+ await dropdownTopic.expand();
+ await click('.select-kit-collection li[data-value="topic"]');
+
+ await selectTypeAndSerializerAndFillInName(
+ "String",
+ "Topic View",
+ "Topic Custom Field",
+ "Filter by: Select a type"
+ );
+
+ await click(".actions .save");
+ // Wait for the "Saved custom field" message to appear
+ await waitForSaveMessage();
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(1) label"
+ ).innerText.includes("topic"),
+ "Topic custom field is displayed"
+ );
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(3) label"
+ ).innerText.includes("topic_custom_field"),
+ "Topic custom field name is displayed"
+ );
+
+ await click(".admin-wizard-controls .btn-icon-text");
+
+ const dropdownPost = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"])'
+ );
+ await dropdownPost.expand();
+ await click('.select-kit-collection li[data-value="post"]');
+
+ await selectTypeAndSerializerAndFillInName(
+ "Boolean",
+ "Post",
+ "Post Custom Field",
+ "Filter by: Select a type"
+ );
+
+ await click(".actions .save");
+ // Wait for the "Saved custom field" message to appear
+ await waitForSaveMessage();
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(1) label"
+ ).innerText.includes("post"),
+ "Post custom field is displayed"
+ );
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(3) label"
+ ).innerText.includes("post_custom_field"),
+ "Post custom field name is displayed"
+ );
+ assert.ok(
+ findAll("table tbody tr").length === 6,
+ "Display added custom fields"
+ );
+ });
+ test("Update Topic custom field", async (assert) => {
+ await visit("/admin/wizards/custom-fields");
+ await click(".admin-wizard-controls .btn-icon-text");
+ const dropdownTopic = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"])'
+ );
+ await dropdownTopic.expand();
+ await click('.select-kit-collection li[data-value="topic"]');
+ await selectTypeAndSerializerAndFillInName(
+ "String",
+ "Topic View",
+ "Topic Custom Field",
+ "Filter by: Select a type"
+ );
+ await click(".actions .save");
+ await waitForSaveMessage();
+ await click(".admin-wizard-container tbody tr:first-child button");
+ await selectTypeAndSerializerAndFillInName(
+ "Boolean",
+ "Topic List Item",
+ "Updated Topic Custom Field",
+ "Filter by: String"
+ );
+ await click(".admin-wizard-container tbody tr:first-child .save");
+ await waitForSaveMessage();
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(1) label"
+ ).innerText.includes("topic"),
+ "Topic custom field is displayed"
+ );
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(2) label"
+ ).innerText.includes("boolean"),
+ "Updated Type is displayed"
+ );
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(3) label"
+ ).innerText.includes("updated_topic_custom_field"),
+ "Updated Topic custom field name is displayed"
+ );
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(4)"
+ ).innerText.includes("topic_view"),
+ "Original Serializer is displayed"
+ );
+ assert.ok(
+ query(
+ ".admin-wizard-container tbody tr:first-child td:nth-child(4)"
+ ).innerText.includes("topic_list_item"),
+ "Updated Serializer is displayed"
+ );
+ });
+ test("Delete Topic custom field", async (assert) => {
+ await visit("/admin/wizards/custom-fields");
+ assert.ok(
+ findAll("table tbody tr").length === 4,
+ "Display loaded custom fields"
+ );
+ await click(".admin-wizard-controls .btn-icon-text");
+
+ const dropdownTopic = selectKit(
+ '.admin-wizard-container details:has(summary[name="Filter by: Select a class"])'
+ );
+ await dropdownTopic.expand();
+ await click('.select-kit-collection li[data-value="topic"]');
+ await selectTypeAndSerializerAndFillInName(
+ "String",
+ "Topic View",
+ "Topic Custom Field",
+ "Filter by: Select a type"
+ );
+ await click(".actions .save");
+ await waitForSaveMessage();
+ assert.ok(
+ findAll("table tbody tr").length === 5,
+ "Display added custom fields"
+ );
+ await click(".admin-wizard-container tbody tr:first-child button");
+ await click(".actions .destroy");
+ assert.ok(
+ findAll("table tbody tr").length === 4,
+ "Display custom fields without deleted fields"
+ );
+ });
+});
diff --git a/test/javascripts/acceptance/admin-logs-test.js b/test/javascripts/acceptance/admin-logs-test.js
new file mode 100644
index 00000000..0b82e93a
--- /dev/null
+++ b/test/javascripts/acceptance/admin-logs-test.js
@@ -0,0 +1,73 @@
+import { acceptance, query } from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, findAll, visit } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import {
+ getSuppliers,
+ getUnsubscribedAdminWizards,
+ getWizard,
+ getWizardTestingLog,
+} from "../helpers/admin-wizard";
+
+acceptance("Admin | Logs", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/logs", () => {
+ return helper.response([
+ { id: "this_is_testing_wizard", name: "This is testing wizard" },
+ ]);
+ });
+ server.get("/admin/wizards/logs/this_is_testing_wizard", () => {
+ return helper.response(getWizardTestingLog);
+ });
+ server.get("/admin/wizards/subscription", () => {
+ return helper.response(getUnsubscribedAdminWizards);
+ });
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ server.get("/admin/plugins/subscription-client/suppliers", () => {
+ return helper.response(getSuppliers);
+ });
+ });
+ test("viewing logs fields tab", async (assert) => {
+ await visit("/admin/wizards/logs");
+ const wizards = selectKit(".select-kit");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "Select a wizard to see its logs"
+ ),
+ "it displays logs message"
+ );
+ assert.ok(
+ query(".message-content").innerText.includes("Select a wizard"),
+ "it displays list of logs"
+ );
+ await wizards.expand();
+ await wizards.selectRowByValue("this_is_testing_wizard");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "View recent logs for wizards on the forum"
+ ),
+ "it displays logs for a selected wizard"
+ );
+ assert.ok(find("table"));
+ assert.ok(findAll("table tbody tr").length === 2, "Displays logs list");
+
+ await click(".refresh.btn");
+ assert.ok(find("table"));
+ assert.ok(
+ findAll("table tbody tr").length === 2,
+ "Refresh button works correctly"
+ );
+
+ await wizards.expand();
+ await click('[data-name="Select a wizard"]');
+ const wizardContainerDiv = find(".admin-wizard-container");
+ assert.ok(wizardContainerDiv.children().length === 0, "the div is empty");
+ });
+});
diff --git a/test/javascripts/acceptance/admin-manager-test.js b/test/javascripts/acceptance/admin-manager-test.js
new file mode 100644
index 00000000..a50c9820
--- /dev/null
+++ b/test/javascripts/acceptance/admin-manager-test.js
@@ -0,0 +1,116 @@
+import { acceptance, query } from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, find, findAll, visit, waitUntil } from "@ember/test-helpers";
+import {
+ getSuppliers,
+ getUnsubscribedAdminWizards,
+ getWizard,
+ getWizardTestingLog,
+} from "../helpers/admin-wizard";
+import { Promise } from "rsvp";
+
+acceptance("Admin | Manager", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/manager/this_is_testing_wizard", () => {
+ return helper.response(getWizardTestingLog);
+ });
+ server.get("/admin/wizards/subscription", () => {
+ return helper.response(getUnsubscribedAdminWizards);
+ });
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ server.delete("/admin/wizards/manager/destroy", () => {
+ return helper.response({
+ success: "OK",
+ destroyed: [
+ { id: "this_is_testing_wizard", name: "This is testing wizard" },
+ ],
+ failures: [],
+ });
+ });
+ server.get("/admin/plugins/subscription-client/suppliers", () => {
+ return helper.response(getSuppliers);
+ });
+ });
+ async function waitForDestructionAndResetMessage() {
+ await waitUntil(
+ () =>
+ document.querySelector(".message-content")?.innerText ===
+ "Destruction complete",
+ { timeout: 5000 }
+ );
+
+ await waitUntil(
+ () =>
+ document.querySelector(".message-content")?.innerText ===
+ "Export, import or destroy wizards" &&
+ !document.querySelector(".message-block.primary ul") &&
+ !find(".message-block.primary svg").classList.contains(
+ "d-icon-check-circle"
+ ),
+ { timeout: 15000 }
+ );
+ // Wait an additional second after the conditions are met
+ await new Promise((resolve) => setTimeout(resolve, 1000));
+ }
+
+ test("viewing manager fields content", async (assert) => {
+ await visit("/admin/wizards/manager");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "Export, import or destroy wizards"
+ ),
+ "it displays manager message"
+ );
+ assert.ok(
+ find('table tr[data-wizard-id="this-is-testing-wizard"]'),
+ "table shows the wizard content list"
+ );
+
+ const checkbox = findAll(
+ 'table tr[data-wizard-id="this-is-testing-wizard"] input[type="checkbox"]'
+ );
+ const exportCheck = checkbox[0];
+ const destroyCheck = checkbox[1];
+
+ const exportButton = find("#export-button");
+ assert.ok(
+ exportButton.hasAttribute("disabled"),
+ "the export button is disabled when export checkbox is unchecked"
+ );
+
+ await click(exportCheck);
+ assert.ok(
+ !exportButton.hasAttribute("disabled"),
+ "the export button is enabled when export checkbox is clicked"
+ );
+ await click(exportCheck);
+ assert.ok(
+ exportButton.hasAttribute("disabled"),
+ "the export button is disabled when export checkbox is unchecked"
+ );
+ const destroyButton = find("#destroy-button");
+ assert.ok(
+ destroyButton.hasAttribute("disabled"),
+ "the destroy button is disabled when destroy checkbox is unchecked"
+ );
+ await click(destroyCheck);
+ assert.ok(
+ !destroyButton.hasAttribute("disabled"),
+ "the destroy button is enabled when destroy checkbox is clicked"
+ );
+ await click("#destroy-button");
+
+ assert.notOk(
+ find('table tr[data-wizard-id="this-is-testing-wizard"]'),
+ "the wizard row is removed after destroy button is clicked"
+ );
+ await waitForDestructionAndResetMessage();
+ });
+});
diff --git a/test/javascripts/acceptance/admin-submissions-test.js b/test/javascripts/acceptance/admin-submissions-test.js
new file mode 100644
index 00000000..828decb7
--- /dev/null
+++ b/test/javascripts/acceptance/admin-submissions-test.js
@@ -0,0 +1,233 @@
+import { acceptance, query } from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, findAll, visit } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import {
+ getAnotherWizardSubmission,
+ getSuppliers,
+ getUnsubscribedAdminWizards,
+ getWizard,
+ getWizardSubmissions,
+} from "../helpers/admin-wizard";
+
+acceptance("Admin | Submissions", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/submissions", () => {
+ return helper.response([
+ { id: "this_is_testing_wizard", name: "This is testing wizard" },
+ { id: "another_wizard", name: "another wizard" },
+ ]);
+ });
+ server.get("/admin/wizards/submissions/this_is_testing_wizard", () => {
+ return helper.response(getWizardSubmissions);
+ });
+ server.get("/admin/wizards/submissions/another_wizard", () => {
+ return helper.response(getAnotherWizardSubmission);
+ });
+ server.get("/admin/wizards/subscription", () => {
+ return helper.response(getUnsubscribedAdminWizards);
+ });
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ server.get("/admin/plugins/subscription-client/suppliers", () => {
+ return helper.response(getSuppliers);
+ });
+ });
+ test("View submissions fields tab and content", async (assert) => {
+ await visit("/admin/wizards/submissions");
+ const wizards = selectKit(".select-kit");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "Select a wizard to see its submissions"
+ ),
+ "it displays submissions message"
+ );
+ assert.ok(
+ query(".message-content").innerText.includes("Select a wizard"),
+ "it displays list of wizards"
+ );
+ await wizards.expand();
+ await wizards.selectRowByValue("this_is_testing_wizard");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "You're viewing the submissions of the This is testing wizard"
+ ),
+ "it displays submissions for a selected wizard"
+ );
+ const submissions = getWizardSubmissions.submissions; // Get submissions data from your JSON file
+ const rows = findAll("table tbody tr");
+
+ for (let i = 0; i < submissions.length; i++) {
+ const dateCell = rows[i].querySelector("td:nth-child(1)");
+ const userCell = rows[i].querySelector("td:nth-child(2)");
+ const stepCell = rows[i].querySelector("td:nth-child(3)");
+ const expectedDate = moment(submissions[i].submitted_at).format(
+ "MMM D, YYYY h:mm a"
+ );
+
+ assert.equal(
+ dateCell.innerText,
+ expectedDate,
+ `Date is displayed correctly for submission ${i + 1}`
+ );
+ assert.equal(
+ userCell.innerText.trim(),
+ submissions[i].user.username,
+ `User is displayed correctly for submission ${i + 1}`
+ );
+ assert.equal(
+ stepCell.innerText.trim().split("\n")[0],
+ submissions[i].fields.step_1_field_1.value,
+ `Step is displayed correctly for submission ${i + 1}`
+ );
+ }
+ assert.ok(
+ findAll("table tbody tr").length >= 1,
+ "Displays submissions list"
+ );
+
+ await wizards.expand();
+ await click('[data-name="Select a wizard"]');
+ const wizardContainerDiv = find(".admin-wizard-container");
+ assert.ok(wizardContainerDiv.children().length === 0, "the div is empty");
+ });
+ test("View submissions tab for another wizard with more steps", async (assert) => {
+ await visit("/admin/wizards/submissions");
+ const wizards = selectKit(".select-kit");
+
+ await wizards.expand();
+ await wizards.selectRowByValue("another_wizard");
+
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "You're viewing the submissions of the another wizard"
+ ),
+ "it displays submissions for another wizard"
+ );
+
+ const submissions = getAnotherWizardSubmission.submissions; // Get submissions data from your JSON file
+ const rows = findAll("table tbody tr");
+
+ for (let i = 0; i < submissions.length; i++) {
+ const dateCell = rows[i].querySelector("td:nth-child(1)");
+ const userCell = rows[i].querySelector("td:nth-child(2)");
+ const step1Cell = rows[i].querySelector("td:nth-child(3)");
+ const step2Cell = rows[i].querySelector("td:nth-child(4)");
+ const submission = submissions[i];
+ const expectedDate = moment(submission.submitted_at).format(
+ "MMM D, YYYY h:mm a"
+ );
+
+ assert.equal(
+ dateCell.innerText,
+ expectedDate,
+ `Date is displayed correctly for submission ${i + 1}`
+ );
+ assert.equal(
+ userCell.innerText.trim(),
+ submissions[i].user.username,
+ `User is displayed correctly for submission ${i + 1}`
+ );
+ assert.equal(
+ step1Cell.innerText.trim().split("\n")[0],
+ submissions[i].fields.step_1_field_1.value,
+ `Step 1 is displayed correctly for submission ${i + 1}`
+ );
+ assert.equal(
+ step2Cell.innerText.trim().split("\n")[0],
+ submissions[i].fields.step_2_field_1.value,
+ `Step 2 is displayed correctly for submission ${i + 1}`
+ );
+ }
+
+ assert.ok(
+ findAll("table tbody tr").length >= 1,
+ "Displays submissions list for another wizard"
+ );
+ });
+ test("Modal actions for submissions", async (assert) => {
+ await visit("/admin/wizards/submissions");
+ const wizards = await selectKit(".select-kit");
+ await wizards.expand();
+ await wizards.selectRowByValue("this_is_testing_wizard");
+
+ await click(".open-edit-columns-btn");
+ assert.dom(".modal-inner-container").exists("Modal is displayed");
+
+ const userCheckbox = find(
+ ".edit-directory-columns-container .edit-directory-column:nth-child(2) .left-content .column-name input"
+ );
+ assert.ok(userCheckbox, "User checkbox is present");
+ assert.ok(userCheckbox[0].checked, "User checkbox is checked by default");
+ await click(userCheckbox[0]);
+ assert.notOk(
+ userCheckbox[0].checked,
+ "User checkbox is unchecked after clicking"
+ );
+
+ await click(".modal-footer .btn-primary");
+ assert
+ .dom("table thead th")
+ .doesNotIncludeText("User", "User column is not displayed");
+
+ await click(".open-edit-columns-btn");
+ const submittedAtCheckbox = find(
+ ".edit-directory-columns-container .edit-directory-column:nth-child(1) .left-content .column-name input"
+ );
+ assert.ok(submittedAtCheckbox, "Submitted At checkbox is present");
+ assert.ok(
+ submittedAtCheckbox[0].checked,
+ "Submitted At checkbox is checked by default"
+ );
+ await click(submittedAtCheckbox[0]);
+
+ await click(".modal-footer .btn-primary");
+ assert.notOk(
+ submittedAtCheckbox[0].checked,
+ "Submitted At checkbox is unchecked after clicking"
+ );
+ assert
+ .dom("table thead th")
+ .doesNotIncludeText(
+ "Submitted At",
+ "Submitted At column is not displayed"
+ );
+
+ await click(".open-edit-columns-btn");
+ await click(".modal-footer .btn-secondary");
+
+ assert
+ .dom("table thead th:nth-child(1)")
+ .hasText("Submitted At", "Submitted At column is displayed after reset");
+ assert
+ .dom("table thead th:nth-child(2)")
+ .hasText("User", "User column is displayed after reset");
+ });
+ test("Download submissions", async (assert) => {
+ await visit("/admin/wizards/submissions");
+ const wizards = await selectKit(".select-kit");
+ await wizards.expand();
+ await wizards.selectRowByValue("this_is_testing_wizard");
+
+ const downloadLinks = findAll(".download-link");
+ assert.ok(downloadLinks.length > 1, "Download links are present");
+
+ const downloadLink = downloadLinks[1];
+ await click(downloadLink);
+
+ const expectedURL =
+ "/admin/wizards/submissions/this_is_testing_wizard/download";
+ const actualURL = new URL(downloadLink.href);
+ assert.equal(
+ actualURL.pathname,
+ expectedURL,
+ "Download link has correct URL"
+ );
+ });
+});
diff --git a/test/javascripts/acceptance/admin-wizards-api-test.js b/test/javascripts/acceptance/admin-wizards-api-test.js
new file mode 100644
index 00000000..d3afc1f8
--- /dev/null
+++ b/test/javascripts/acceptance/admin-wizards-api-test.js
@@ -0,0 +1,127 @@
+import { acceptance, query } from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, currentURL, fillIn, visit } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import {
+ getBusinessAdminWizard,
+ getCustomFields,
+ getNewApi,
+ getSuppliers,
+ getWizard,
+ putNewApi,
+} from "../helpers/admin-wizard";
+
+acceptance("Admin | API tab", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ server.get("/admin/wizards/subscription", () => {
+ return helper.response(getBusinessAdminWizard);
+ });
+ server.get("/admin/wizards/custom-fields", () => {
+ return helper.response(getCustomFields);
+ });
+ server.get("/admin/wizards/api", () => {
+ return helper.response([
+ {
+ name: "new_api",
+ title: "new API",
+ endpoints: [{ id: "59e3b6", name: "ag" }],
+ },
+ ]);
+ });
+ server.get("/admin/customize/user_fields", () => {
+ return helper.response({ user_fields: [] });
+ });
+ server.put("/admin/wizards/api/new_api", () => {
+ return helper.response(putNewApi);
+ });
+ server.get("/admin/wizards/api/new_api", () => {
+ return helper.response(getNewApi);
+ });
+ server.get("/admin/plugins/subscription-client/suppliers", () => {
+ return helper.response(getSuppliers);
+ });
+ });
+
+ test("Visit API tab and fill data", async function (assert) {
+ await visit("/admin/wizards/api");
+ const list = find(".admin-controls li");
+ const count = list.length;
+ assert.equal(count, 6, "There should be 6 admin tabs");
+
+ // create new api
+ await click(".admin-wizard-controls button");
+ assert.ok(
+ query(".wizard-header.large").innerText.includes("New API"),
+ "it displays API creation message"
+ );
+ assert.equal(
+ currentURL(),
+ "/admin/wizards/api/create",
+ "clicking the button navigates to the correct URL"
+ );
+ // fill data
+ await fillIn('.metadata input[placeholder="Display name"]', "new API");
+ await fillIn('.metadata input[placeholder="Underscored"]', "new_api");
+ const fieldTypeDropdown = selectKit(
+ ".wizard-api-authentication .settings .control-group.auth-type .select-kit"
+ );
+ await fieldTypeDropdown.expand();
+ await fieldTypeDropdown.selectRowByValue("basic");
+ await fillIn(
+ ".wizard-api-authentication .settings .control-group:nth-child(3) .controls input",
+ "some_username"
+ );
+ await fillIn(
+ ".wizard-api-authentication .settings .control-group:nth-child(4) .controls input",
+ "some_password"
+ );
+ await click(".wizard-api-endpoints button");
+ await fillIn(
+ '.wizard-api-endpoints .endpoint .top input[placeholder="Endpoint name"]',
+ "endpoint_name"
+ );
+ await fillIn(
+ '.wizard-api-endpoints .endpoint .top input[placeholder="Enter a url"]',
+ "https://test.api.com"
+ );
+ const endpointMethodDropdown = await selectKit(
+ '.wizard-api-endpoints .endpoint .bottom details:has(summary[name="Filter by: Select a method"])'
+ );
+ await endpointMethodDropdown.expand();
+ await endpointMethodDropdown.selectRowByValue("POST");
+
+ const contentTypeDropdown = await selectKit(
+ '.wizard-api-endpoints .endpoint .bottom details:has(summary[name="Filter by: Select a content type"])'
+ );
+ await contentTypeDropdown.expand();
+ await contentTypeDropdown.selectRowByValue("application/json");
+
+ const successCodesDropdown = await selectKit(
+ ".wizard-api-endpoints .endpoint .bottom details.multi-select"
+ );
+ await successCodesDropdown.expand();
+ await successCodesDropdown.selectRowByValue(200);
+ await successCodesDropdown.selectRowByValue(100);
+
+ assert.strictEqual(
+ successCodesDropdown.header().value(),
+ "200,100",
+ "group should be set"
+ );
+ await click(".wizard-api-header.page button.btn-primary");
+ assert.equal(
+ currentURL(),
+ "/admin/wizards/api/new_api",
+ "clicking the button navigates to the correct URL"
+ );
+ });
+});
diff --git a/test/javascripts/acceptance/admin-wizards-business-subscription-test.js b/test/javascripts/acceptance/admin-wizards-business-subscription-test.js
new file mode 100644
index 00000000..5a17a023
--- /dev/null
+++ b/test/javascripts/acceptance/admin-wizards-business-subscription-test.js
@@ -0,0 +1,269 @@
+import {
+ acceptance,
+ exists,
+ query,
+ visible,
+} from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, currentURL, fillIn, findAll, visit } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import {
+ getAdminTestingWizard,
+ getBusinessAdminWizard,
+ getCreatedWizard,
+ getCustomFields,
+ getSuppliersAuthorized,
+ getWizard,
+} from "../helpers/admin-wizard";
+
+acceptance("Admin | Custom Wizard Business Subscription", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ server.get("/admin/wizards/custom-fields", () => {
+ return helper.response(getCustomFields);
+ });
+ server.get("/admin/wizards/subscription", () => {
+ return helper.response(getBusinessAdminWizard);
+ });
+ server.get("/admin/wizards/api", () => {
+ return helper.response([]);
+ });
+ server.get("/admin/customize/user_fields", () => {
+ return helper.response({ user_fields: [] });
+ });
+ server.get("/admin/wizards/wizard/this_is_testing_wizard", () => {
+ return helper.response(getAdminTestingWizard);
+ });
+ server.put("/admin/wizards/wizard/new_wizard_for_testing", () => {
+ return helper.response({
+ success: "OK",
+ wizard_id: "new_wizard_for_testing",
+ });
+ });
+ server.get("/admin/wizards/wizard/new_wizard_for_testing", () => {
+ return helper.response(getCreatedWizard);
+ });
+ server.get("/admin/plugins/subscription-client/suppliers", () => {
+ return helper.response(getSuppliersAuthorized);
+ });
+ });
+
+ test("Displaying all tabs including API", async (assert) => {
+ await visit("/admin/wizards");
+ const list = find(".admin-controls li");
+ const count = list.length;
+ assert.equal(count, 6, "There should be 6 admin tabs");
+ });
+
+ test("shows authorized and subscribed", async (assert) => {
+ await visit("/admin/wizards");
+ assert.notOk(
+ exists(".supplier-authorize .btn-primary:not(.update)"),
+ "the authorize button is shown."
+ );
+ assert.strictEqual(
+ query("button.wizard-subscription-badge span").innerText.trim(),
+ "Support"
+ );
+ });
+
+ test("creating a new wizard", async (assert) => {
+ await visit("/admin/wizards/wizard");
+ await click(".admin-wizard-controls button");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "You're creating a new wizard"
+ ),
+ "it displays wizard creation message"
+ );
+ // "Step 1: Inserting a title
+ const wizardTitle = "New wizard for testing";
+ await fillIn(".wizard-header input", wizardTitle);
+ assert.equal(
+ $(".wizard-header input").val(),
+ wizardTitle,
+ "The title input is inserted"
+ );
+ const wizardLink = find("div.wizard-url a");
+ assert.equal(wizardLink.length, 1, "Wizard link was created");
+ assert.equal(
+ find(".wizard-subscription-container a:contains('Subscribed')").length,
+ 1,
+ "Wizard subscription features are accesible"
+ );
+ await click(
+ '.wizard-subscription-container .subscription-settings .setting-value input[type="checkbox"]'
+ );
+ assert.ok(
+ find(
+ '.wizard-subscription-container .subscription-settings .setting-value input[type="checkbox"]'
+ ).is(":checked"),
+ "subscription feature available"
+ );
+
+ // Step 2: Creating a step section
+ await click(".step .link-list button");
+ const stepOneText = "step_1 (step_1)";
+ const stepOneBtn = find(`.step button:contains(${stepOneText})`);
+ assert.equal(stepOneBtn.length, 1, "Creating a step");
+ const stepTitle = "step title";
+ await fillIn(".wizard-custom-step input[name='title']", stepTitle);
+ const stepButtonText = $.trim(
+ $(".step div[data-id='step_1'] button").text()
+ );
+ assert.ok(
+ stepButtonText.includes(stepTitle),
+ "The step button changes according to title"
+ );
+ assert.equal(
+ find(".wizard-subscription-container a:contains('Subscribed')").length,
+ 2,
+ "Steps subscription features are accesible"
+ );
+ // Step 3: Creating a field section
+ await click(".field .link-list button");
+
+ assert.ok(
+ !visible(".wizard-custom-field button.undo-changes"),
+ "clear button is not rendered"
+ );
+ const fieldOneText = "step_1_field_1 (step_1_field_1)";
+ const fieldOneBtn = find(`.field button:contains(${fieldOneText})`);
+ assert.equal(fieldOneBtn.length, 1, "Creating a field");
+ const fieldTitle = "field title";
+ await fillIn(".wizard-custom-field input[name='label']", fieldTitle);
+ assert.ok(
+ visible(".wizard-custom-field button.undo-changes"),
+ "clear button is rendered after filling content"
+ );
+ let fieldButtonText = $.trim(
+ $(".field div[data-id='step_1_field_1'] button").text()
+ );
+ assert.ok(
+ fieldButtonText.includes(fieldTitle),
+ "The step button changes according to title"
+ );
+ await click(`.wizard-custom-field button.undo-changes`);
+ fieldButtonText = $(".field div[data-id='step_1_field_1'] button")
+ .text()
+ .trim();
+ assert.ok(
+ fieldButtonText.includes("step_1_field_1 (step_1_field_1)"),
+ "The field button changes to default title after clear button is clicked"
+ );
+ const fieldTypeDropdown = selectKit(
+ ".wizard-custom-field .setting-value .select-kit"
+ );
+ await fieldTypeDropdown.expand();
+ await fieldTypeDropdown.selectRowByValue("text");
+ assert.ok(
+ query(".wizard-custom-field .message-content").innerText.includes(
+ "You're editing a field"
+ ),
+ "Text tipe for field correctly selected"
+ );
+ assert.equal(
+ find(".wizard-subscription-container a:contains('Subscribed')").length,
+ 3,
+ "Field subscription features are accesible"
+ );
+
+ // Step 4: Creating a action section
+ await click(".action .link-list button");
+
+ const actionOneText = "action_1 (action_1)";
+ const actionOneBtn = find(`.action button:contains(${actionOneText})`);
+ assert.equal(actionOneBtn.length, 1, "Creating an action");
+ assert.ok(
+ query(
+ ".wizard-custom-action .wizard-message .message-content"
+ ).innerText.includes("Select an action type"),
+ "it displays wizard select action message"
+ );
+ const actionTypeDropdown = selectKit(
+ ".wizard-custom-action .setting-value .select-kit"
+ );
+ await actionTypeDropdown.expand();
+ const listEnabled = findAll(
+ ".wizard-custom-action .setting .setting-value ul li:not(.disabled)"
+ );
+ const listDisabled = findAll(
+ ".wizard-custom-action .setting .setting-value ul li.disabled"
+ );
+ assert.ok(
+ listDisabled.length === 0,
+ "Disabled items displayed correctly in action dropdown"
+ );
+ assert.ok(
+ listEnabled.length === 11,
+ "Enabled items displayed correctly in action dropdown"
+ );
+ await actionTypeDropdown.selectRowByValue("create_topic");
+ assert.ok(
+ query(".wizard-custom-action .message-content").innerText.includes(
+ "You're editing an action"
+ ),
+ "Create type action correctly selected"
+ );
+ let listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 10,
+ "Display all settings of create topic"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("send_to_api");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 5,
+ "Display all settings of send to api"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("create_category");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 9,
+ "Display all settings of create categories"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("create_group");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 14,
+ "Display all settings of create group"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("create_topic");
+ assert.ok(
+ !visible('.admin-wizard-buttons button:contains("Delete Wizard")'),
+ "delete wizard button not displayed"
+ );
+ //Step 5: Save wizard
+ await click(".admin-wizard-buttons button");
+
+ assert.equal(
+ currentURL(),
+ "/admin/wizards/wizard/new_wizard_for_testing",
+ "clicking the button navigates to the correct URL"
+ );
+ assert.ok(
+ visible('.admin-wizard-buttons button:contains("Delete Wizard")'),
+ "delete wizard button visible"
+ );
+ });
+});
diff --git a/test/javascripts/acceptance/admin-wizards-standard-subscription-test.js b/test/javascripts/acceptance/admin-wizards-standard-subscription-test.js
new file mode 100644
index 00000000..ffed5287
--- /dev/null
+++ b/test/javascripts/acceptance/admin-wizards-standard-subscription-test.js
@@ -0,0 +1,262 @@
+import {
+ acceptance,
+ exists,
+ query,
+ visible,
+} from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, currentURL, fillIn, findAll, visit } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import {
+ getAdminTestingWizard,
+ getCreatedWizard,
+ getCustomFields,
+ getStandardAdminWizard,
+ getSuppliersAuthorized,
+ getWizard,
+} from "../helpers/admin-wizard";
+
+acceptance("Admin | Custom Wizard Standard Subscription", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ server.get("/admin/wizards/custom-fields", () => {
+ return helper.response(getCustomFields);
+ });
+ server.get("/admin/wizards/subscription", () => {
+ return helper.response(getStandardAdminWizard);
+ });
+ server.get("/admin/wizards/api", () => {
+ return helper.response({ success: "OK" });
+ });
+ server.get("/admin/customize/user_fields", () => {
+ return helper.response({ user_fields: [] });
+ });
+ server.get("/admin/wizards/wizard/this_is_testing_wizard", () => {
+ return helper.response(getAdminTestingWizard);
+ });
+ server.put("/admin/wizards/wizard/new_wizard_for_testing", () => {
+ return helper.response({
+ success: "OK",
+ wizard_id: "new_wizard_for_testing",
+ });
+ });
+ server.get("/admin/wizards/wizard/new_wizard_for_testing", () => {
+ return helper.response(getCreatedWizard);
+ });
+ server.get("/admin/plugins/subscription-client/suppliers", () => {
+ return helper.response(getSuppliersAuthorized);
+ });
+ });
+
+ test("Displaying all tabs except API", async (assert) => {
+ await visit("/admin/wizards");
+ const list = find(".admin-controls li");
+ const count = list.length;
+ assert.equal(count, 5, "There should be 5 admin tabs");
+ });
+
+ test("shows authorized and subscribed", async (assert) => {
+ await visit("/admin/wizards");
+ assert.notOk(
+ exists(".supplier-authorize .btn-primary:not(.update)"),
+ "the authorize button not shown."
+ );
+ assert.strictEqual(
+ query("button.wizard-subscription-badge span").innerText.trim(),
+ "Support"
+ );
+ });
+
+ test("creating a new wizard", async (assert) => {
+ await visit("/admin/wizards/wizard");
+ await click(".admin-wizard-controls button");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "You're creating a new wizard"
+ ),
+ "it displays wizard creation message"
+ );
+ // ("Step 1: Inserting a title")
+ const wizardTitle = "New wizard for testing";
+ await fillIn(".wizard-header input", wizardTitle);
+ assert.equal(
+ $(".wizard-header input").val(),
+ wizardTitle,
+ "The title input is inserted"
+ );
+ const wizardLink = find("div.wizard-url a");
+ assert.equal(wizardLink.length, 1, "Wizard link was created");
+ assert.equal(
+ find(".wizard-subscription-container a:contains('Subscribed')").length,
+ 1,
+ "Wizard subscription features are accesible"
+ );
+ const subsFeature = find(
+ ".wizard-subscription-container .subscription-settings .setting-value input"
+ );
+ await click(
+ ".wizard-subscription-container .subscription-settings .setting-value input"
+ );
+ assert.ok(subsFeature.is(":checked"), "subscription feature available");
+ // ("Step 2: Creating a step section")
+ await click(".step .link-list button");
+ const stepOneText = "step_1 (step_1)";
+ const stepOneBtn = find(`.step button:contains(${stepOneText})`);
+ assert.equal(stepOneBtn.length, 1, "Creating a step");
+ const stepTitle = "step title";
+ await fillIn(".wizard-custom-step input[name='title']", stepTitle);
+ const stepButtonText = $.trim(
+ $(".step div[data-id='step_1'] button").text()
+ );
+ assert.ok(
+ stepButtonText.includes(stepTitle),
+ "The step button changes according to title"
+ );
+ assert.equal(
+ find(".wizard-subscription-container a:contains('Subscribed')").length,
+ 2,
+ "Steps subscription features are accesible"
+ );
+ // step("Step 3: Creating a field section")
+ await click(".field .link-list button");
+ assert.ok(
+ !visible(".wizard-custom-field button.undo-changes"),
+ "clear button is not rendered"
+ );
+ const fieldOneText = "step_1_field_1 (step_1_field_1)";
+ const fieldOneBtn = find(`.field button:contains(${fieldOneText})`);
+ assert.equal(fieldOneBtn.length, 1, "Creating a field");
+ const fieldTitle = "field title";
+ await fillIn(".wizard-custom-field input[name='label']", fieldTitle);
+ assert.ok(
+ visible(".wizard-custom-field button.undo-changes"),
+ "clear button is rendered after filling content"
+ );
+ let fieldButtonText = $.trim(
+ $(".field div[data-id='step_1_field_1'] button").text()
+ );
+ assert.ok(
+ fieldButtonText.includes(fieldTitle),
+ "The step button changes according to title"
+ );
+ await click(`.wizard-custom-field button.undo-changes`);
+ fieldButtonText = $(".field div[data-id='step_1_field_1'] button")
+ .text()
+ .trim();
+ assert.ok(
+ fieldButtonText.includes("step_1_field_1 (step_1_field_1)"),
+ "The field button changes to default title after clear button is clicked"
+ );
+ const fieldTypeDropdown = selectKit(
+ ".wizard-custom-field .setting-value .select-kit"
+ );
+ await fieldTypeDropdown.expand();
+ await fieldTypeDropdown.selectRowByValue("text");
+ assert.ok(
+ query(".wizard-custom-field .message-content").innerText.includes(
+ "You're editing a field"
+ ),
+ "Text tipe for field correctly selected"
+ );
+ assert.equal(
+ find(".wizard-subscription-container a:contains('Subscribed')").length,
+ 3,
+ "Field subscription features are accesible"
+ );
+ // ("Step 4: Creating a action section")
+ await click(".action .link-list button");
+ const actionOneText = "action_1 (action_1)";
+ const actionOneBtn = find(`.action button:contains(${actionOneText})`);
+ assert.equal(actionOneBtn.length, 1, "Creating an action");
+ assert.ok(
+ query(
+ ".wizard-custom-action .wizard-message .message-content"
+ ).innerText.includes("Select an action type"),
+ "it displays wizard select action message"
+ );
+ const actionTypeDropdown = selectKit(
+ ".wizard-custom-action .setting-value .select-kit"
+ );
+ await actionTypeDropdown.expand();
+ const listEnabled = findAll(
+ ".wizard-custom-action .setting .setting-value ul li:not(.disabled)"
+ );
+ const listDisabled = findAll(
+ ".wizard-custom-action .setting .setting-value ul li.disabled"
+ );
+ assert.ok(
+ listDisabled.length === 4,
+ "Disabled items displayed correctly in action dropdown"
+ );
+ assert.ok(
+ listEnabled.length === 7,
+ "Enabled items displayed correctly in action dropdown"
+ );
+ await actionTypeDropdown.selectRowByValue("create_topic");
+ assert.ok(
+ query(".wizard-custom-action .message-content").innerText.includes(
+ "You're editing an action"
+ ),
+ "Create type action correctly selected"
+ );
+ let listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 10,
+ "Display all settings of create topic"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("send_message");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 9,
+ "Display all settings of send message"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("watch_categories");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 7,
+ "Display all settings of watch categories"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("add_to_group");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 3,
+ "Display all settings of add to group"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("create_topic");
+ // step("Step 5: Save wizard");
+ assert.ok(
+ !visible('.admin-wizard-buttons button:contains("Delete Wizard")'),
+ "delete wizard button not displayed"
+ );
+ await click(".admin-wizard-buttons button");
+ assert.equal(
+ currentURL(),
+ "/admin/wizards/wizard/new_wizard_for_testing",
+ "clicking the button navigates to the correct URL"
+ );
+ assert.ok(
+ visible('.admin-wizard-buttons button:contains("Delete Wizard")'),
+ "delete wizard button visible"
+ );
+ });
+});
diff --git a/test/javascripts/acceptance/admin-wizards-unsubscribed-test.js b/test/javascripts/acceptance/admin-wizards-unsubscribed-test.js
new file mode 100644
index 00000000..6c34a935
--- /dev/null
+++ b/test/javascripts/acceptance/admin-wizards-unsubscribed-test.js
@@ -0,0 +1,587 @@
+import {
+ acceptance,
+ exists,
+ query,
+ visible,
+} from "discourse/tests/helpers/qunit-helpers";
+import { test } from "qunit";
+import { click, currentURL, fillIn, findAll, visit } from "@ember/test-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import {
+ getAdminTestingWizard,
+ getCreatedWizard,
+ getCustomFields,
+ getSuppliers,
+ getUniqueWizard,
+ getUnsubscribedAdminWizards,
+ getWizard,
+} from "../helpers/admin-wizard";
+
+acceptance("Admin | Custom Wizard Unsubscribed", function (needs) {
+ needs.user();
+ needs.settings({
+ custom_wizard_enabled: true,
+ available_locales: JSON.stringify([{ name: "English", value: "en" }]),
+ });
+
+ needs.pretender((server, helper) => {
+ server.get("/admin/wizards/wizard", () => {
+ return helper.response(getWizard);
+ });
+ server.get("/admin/wizards/custom-fields", () => {
+ return helper.response(getCustomFields);
+ });
+ server.get("/admin/wizards/subscription", () => {
+ return helper.response(getUnsubscribedAdminWizards);
+ });
+ server.get("/admin/wizards/api", () => {
+ return helper.response({ success: "OK" });
+ });
+ server.get("/admin/customize/user_fields", () => {
+ return helper.response({ user_fields: [] });
+ });
+ server.get("/admin/wizards/wizard/this_is_testing_wizard", () => {
+ return helper.response(getAdminTestingWizard);
+ });
+ server.put("/admin/wizards/wizard/new_wizard_for_testing", () => {
+ return helper.response({
+ success: "OK",
+ wizard_id: "new_wizard_for_testing",
+ });
+ });
+ server.get("/admin/wizards/wizard/new_wizard_for_testing", () => {
+ return helper.response(getCreatedWizard);
+ });
+ server.get("/admin/wizards/wizard/unique_wizard", () => {
+ return helper.response(getUniqueWizard);
+ });
+ server.get("/admin/plugins/subscription-client/suppliers", () => {
+ return helper.response(getSuppliers);
+ });
+ });
+
+ async function appendText(selector, text) {
+ let element = document.querySelector(selector);
+ if (element) {
+ let currentValue = element.value;
+ let newValue = currentValue + text;
+ await fillIn(selector, newValue);
+ }
+ }
+
+ test("Displaying all tabs except API", async (assert) => {
+ await visit("/admin/wizards");
+ const list = find(".admin-controls li");
+ const count = list.length;
+ assert.equal(count, 5, "There should be 5 admin tabs");
+ });
+
+ test("shows unauthorized and unsubscribed", async (assert) => {
+ await visit("/admin/wizards");
+ assert.ok(
+ exists(".supplier-authorize .btn-primary"),
+ "the authorize button is shown."
+ );
+ assert.strictEqual(
+ query("button.wizard-subscription-badge span").innerText.trim(),
+ "Subscribe"
+ );
+ });
+
+ test("creating a new wizard", async (assert) => {
+ await visit("/admin/wizards/wizard");
+ await click(".admin-wizard-controls button");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "You're creating a new wizard"
+ ),
+ "it displays wizard creation message"
+ );
+ const wizardTitle = "New wizard for testing";
+ await fillIn(".wizard-header input", wizardTitle);
+ assert.equal(
+ $(".wizard-header input").val(),
+ wizardTitle,
+ "The title input is inserted"
+ );
+ const wizardLink = find("div.wizard-url a");
+ assert.equal(wizardLink.length, 1, "Wizard link was created");
+ await click(".btn-after-time");
+ assert.ok(
+ exists(".d-date-time-input .d-time-input span.name"),
+ "a time selector is shown"
+ );
+ let timeText = query(
+ ".d-date-time-input .d-time-input span.name"
+ ).innerText;
+ const regex = /\d\d\:\d\d/;
+ assert.ok(regex.test(timeText));
+ assert.equal(
+ $.trim($("a[title='Subscribe to use these features']").text()),
+ "Not Subscribed",
+ "Show messsage and link of user not subscribed"
+ );
+ assert.equal(
+ find(".wizard-subscription-container").length,
+ 1,
+ "Wizard subscription features are not accesible"
+ );
+ await click(".step .link-list button");
+ const stepOneText = "step_1 (step_1)";
+ const stepOneBtn = find(`.step button:contains(${stepOneText})`);
+ assert.equal(stepOneBtn.length, 1, "Creating a step");
+ const stepTitle = "step title";
+ await fillIn(".wizard-custom-step input[name='title']", stepTitle);
+ const stepButtonText = $.trim(
+ $(".step div[data-id='step_1'] button").text()
+ );
+ assert.ok(
+ stepButtonText.includes(stepTitle),
+ "The step button changes according to title"
+ );
+ assert.equal(
+ find(".wizard-subscription-container").length,
+ 2,
+ "Steps subscription features are not accesible"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ "Input in step description composer"
+ );
+ await click(".wizard-custom-step .wizard-editor-gutter button:first-child");
+ assert.strictEqual(
+ query(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper p"
+ ).textContent.trim(),
+ "Input in step description composer"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ "\n\n**Bold text**"
+ );
+ let boldText = await query(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper strong"
+ ).innerHTML.trim();
+ assert.strictEqual(
+ boldText,
+ "Bold text",
+ "The bold text in the preview wrapper should be 'Bold Text'"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ "\n\n*emphasized text*"
+ );
+ let empText = await query(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper em"
+ ).innerHTML.trim();
+ assert.strictEqual(
+ empText,
+ "emphasized text",
+ "The emphasized text in the preview wrapper should be 'emphasized text'"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ "\n\n> Blockqoute text"
+ );
+ let blockquoteText = await query(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper blockquote p"
+ ).innerHTML.trim();
+ assert.strictEqual(
+ blockquoteText,
+ "Blockqoute text",
+ "The emphasized text in the preview wrapper should be 'Blockqoute text'"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ `\n\n\`\`\`
+ \code text
+ \n\`\`\``
+ );
+ let codeText = await query(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper code"
+ ).innerHTML.trim();
+ assert.strictEqual(
+ codeText,
+ "code text",
+ "The emphasized text in the preview wrapper should be 'code text'"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ `\n\n* List item\n* List item`
+ );
+ let listItems = findAll(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper ul li"
+ );
+ assert.strictEqual(
+ listItems.length,
+ 2,
+ "There should be two list items in the unordered list in the preview wrapper"
+ );
+ assert.strictEqual(
+ listItems[0].textContent.trim(),
+ "List item",
+ "The first list item should be 'List item'"
+ );
+ assert.strictEqual(
+ listItems[1].textContent.trim(),
+ "List item",
+ "The second list item should be 'List item'"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ `\n\n1. List item\n1. List item`
+ );
+ let orderedListItems = findAll(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper ol li"
+ );
+ assert.strictEqual(
+ orderedListItems.length,
+ 2,
+ "There should be two list items in the ordered list in the preview wrapper"
+ );
+ assert.strictEqual(
+ orderedListItems[0].textContent.trim(),
+ "List item",
+ "The first list item should be 'List item'"
+ );
+ assert.strictEqual(
+ orderedListItems[1].textContent.trim(),
+ "List item",
+ "The second list item should be 'List item'"
+ );
+ await appendText(
+ ".wizard-custom-step .wizard-text-editor textarea",
+ `\n\n`
+ );
+ await click(
+ ".wizard-custom-step .wizard-text-editor .d-editor button.link"
+ );
+ assert.ok(
+ exists(".d-modal.insert-hyperlink-modal"),
+ "hyperlink modal visible"
+ );
+
+ await fillIn(".d-modal__body.insert-link .inputs .link-url", "google.com");
+ await fillIn(".d-modal__body.insert-link .inputs .link-text", "Google");
+ await click(".d-modal__footer button.btn-primary");
+ let urlText = await query(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper a"
+ ).innerHTML.trim();
+ assert.strictEqual(
+ urlText,
+ "Google",
+ "The link text in the preview wrapper should be 'Google'"
+ );
+ await click(
+ ".wizard-custom-step .wizard-text-editor .d-editor button.local-dates"
+ );
+
+ assert.ok(
+ exists(".d-modal.discourse-local-dates-create-modal"),
+ "Insert date-time modal visible"
+ );
+
+ assert.ok(
+ !exists(
+ ".discourse-local-dates-create-modal .d-modal__body .advanced-options"
+ ),
+ "Advanced mode not visible"
+ );
+ await click(".d-modal__footer button.advanced-mode-btn");
+ assert.ok(
+ exists(
+ ".discourse-local-dates-create-modal .d-modal__body .advanced-options"
+ ),
+ "Advanced mode is visible"
+ );
+ await click(".d-modal__footer button.btn-primary");
+ assert.ok(
+ exists(
+ ".wizard-custom-step .wizard-text-editor .d-editor-preview-wrapper span.discourse-local-date"
+ ),
+ "Date inserted"
+ );
+
+ await click(".field .link-list button");
+ assert.ok(
+ !visible(".wizard-custom-field button.undo-changes"),
+ "clear button is not rendered"
+ );
+ const fieldOneText = "step_1_field_1 (step_1_field_1)";
+ const fieldOneBtn = find(`.field button:contains(${fieldOneText})`);
+ assert.equal(fieldOneBtn.length, 1, "Creating a field");
+ const fieldTitle = "field title";
+ await fillIn(".wizard-custom-field input[name='label']", fieldTitle);
+ assert.ok(
+ visible(".wizard-custom-field button.undo-changes"),
+ "clear button is rendered after filling content"
+ );
+ let fieldButtonText = $.trim(
+ $(".field div[data-id='step_1_field_1'] button").text()
+ );
+ assert.ok(
+ fieldButtonText.includes(fieldTitle),
+ "The step button changes according to title"
+ );
+ await fillIn(
+ ".wizard-custom-field textarea[name='description']",
+ "First step field description"
+ );
+ await click(`.wizard-custom-field button.undo-changes`);
+ fieldButtonText = $(".field div[data-id='step_1_field_1'] button")
+ .text()
+ .trim();
+ assert.ok(
+ fieldButtonText.includes("step_1_field_1 (step_1_field_1)"),
+ "The field button changes to default title after clear button is clicked"
+ );
+ await fillIn(".wizard-custom-field input[name='label']", fieldTitle);
+ await fillIn(
+ ".wizard-custom-field textarea[name='description']",
+ "First step field description"
+ );
+ const fieldTypeDropdown = selectKit(
+ ".wizard-custom-field .setting-value .select-kit"
+ );
+ await fieldTypeDropdown.expand();
+ await fieldTypeDropdown.selectRowByValue("text");
+ assert.ok(
+ query(".wizard-custom-field .message-content").innerText.includes(
+ "You're editing a field"
+ ),
+ "Text tipe for field correctly selected"
+ );
+ assert.equal(
+ find(".wizard-subscription-container").length,
+ 3,
+ "Field subscription features are not accesible"
+ );
+ await click(".action .link-list button");
+ const actionOneText = "action_1 (action_1)";
+ const actionOneBtn = find(`.action button:contains(${actionOneText})`);
+ assert.equal(actionOneBtn.length, 1, "Creating an action");
+ assert.ok(
+ query(
+ ".wizard-custom-action .wizard-message .message-content"
+ ).innerText.includes("Select an action type"),
+ "it displays wizard select action message"
+ );
+ const actionTypeDropdown = selectKit(
+ ".wizard-custom-action .setting-value .select-kit"
+ );
+ await actionTypeDropdown.expand();
+ const listEnabled = findAll(
+ ".wizard-custom-action .setting .setting-value ul li:not(.disabled)"
+ );
+ const listDisabled = findAll(
+ ".wizard-custom-action .setting .setting-value ul li.disabled"
+ );
+ assert.ok(
+ listDisabled.length === 7,
+ "disabled items displayed correctly in action dropdown"
+ );
+ assert.ok(
+ listEnabled.length === 4,
+ "Enabled items displayed correctly in action dropdown"
+ );
+ await actionTypeDropdown.selectRowByValue("create_topic");
+ assert.ok(
+ query(".wizard-custom-action .message-content").innerText.includes(
+ "You're editing an action"
+ ),
+ "Create type action correctly selected"
+ );
+ let listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 10,
+ "Display all settings of create topic"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("open_composer");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 8,
+ "Display all settings of open composer"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("update_profile");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 4,
+ "Display all settings of update profile"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("route_to");
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 4,
+ "Display all settings of route to"
+ );
+ await actionTypeDropdown.expand();
+ await click('[data-name="Select a type"]');
+ listTopicSettings = findAll(
+ ".admin-wizard-container .wizard-custom-action .setting"
+ );
+ assert.ok(
+ listTopicSettings.length === 2,
+ "the settings options is empty when no action is selected"
+ );
+ await actionTypeDropdown.expand();
+ await actionTypeDropdown.selectRowByValue("create_topic");
+ const fieldsContentIf = [4, 8];
+ for (let i = 0; i < fieldsContentIf.length; i++) {
+ await click(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) button`
+ );
+ let selectKitInsideThirdSetting = await selectKit(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) .select-kit`
+ );
+ await selectKitInsideThirdSetting.expand();
+ await selectKitInsideThirdSetting.selectRowByIndex(1);
+ await fillIn(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) .key input`,
+ "Action title"
+ );
+ await fillIn(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) .value input`,
+ "Some value"
+ );
+ await fillIn(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) .output input`,
+ "Result text"
+ );
+ const actualTitle = query(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) .key input`
+ ).value;
+ const actualValue = query(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) .value input`
+ ).value;
+ const actualResultText = query(
+ `.admin-wizard-container .wizard-custom-action .setting:nth-of-type(${fieldsContentIf[i]}) .output input`
+ ).value;
+
+ assert.strictEqual(actualTitle, "Action title", "Title is correct");
+ assert.strictEqual(actualValue, "Some value", "Value is correct");
+ assert.strictEqual(actualResultText, "Result text", "Text is correct");
+ }
+ assert.ok(
+ !visible('.admin-wizard-buttons button:contains("Delete Wizard")'),
+ "delete wizard button not displayed"
+ );
+ await click(".admin-wizard-buttons button");
+ assert.equal(
+ currentURL(),
+ "/admin/wizards/wizard/new_wizard_for_testing",
+ "Wizard saved successfully"
+ );
+ assert.ok(
+ visible('.admin-wizard-buttons button:contains("Delete Wizard")'),
+ "delete wizard button visible"
+ );
+ });
+ test("viewing content for a selected wizard", async (assert) => {
+ await visit("/admin/wizards/wizard");
+ assert.ok(
+ query(".message-content").innerText.includes(
+ "Select a wizard, or create a new one"
+ ),
+ "it displays wizard message"
+ );
+ const wizards = selectKit(".select-kit");
+ await wizards.expand();
+
+ await wizards.selectRowByValue("unique_wizard");
+ assert.ok(
+ query(".message-content").innerText.includes("You're editing a wizard"),
+ "it displays wizard message for a selected wizard"
+ );
+ assert.equal(
+ query(".admin-wizard-container .wizard-header input").value,
+ getUniqueWizard.name,
+ "The wizard name is correctly displayed"
+ );
+ // Save wizard Submissions
+ assert.equal(
+ query(".wizard-settings .setting:nth-of-type(1) input").checked,
+ getUniqueWizard.save_submissions,
+ "The save submissions flag is correctly set"
+ );
+
+ // Multiple Submissions
+ assert.equal(
+ query(".wizard-settings .setting:nth-of-type(2) input").checked,
+ getUniqueWizard.multiple_submissions,
+ "The multiple submissions flag is correctly set"
+ );
+
+ // After Signup
+ assert.equal(
+ query(".wizard-settings .setting:nth-of-type(3) input").checked,
+ getUniqueWizard.after_signup,
+ "The after signup flag is correctly set"
+ );
+
+ // Prompt Completion
+ assert.equal(
+ query(".wizard-settings .setting:nth-of-type(4) input").checked,
+ getUniqueWizard.prompt_completion,
+ "The prompt completion flag is correctly set"
+ );
+ // step content
+ for (let i = 0; i < getUniqueWizard.steps.length; i++) {
+ // click on the step that is needed
+ await click(
+ `.wizard-links.step .link-list div:nth-of-type(${
+ i + 1
+ }) button.btn-text`
+ );
+ assert.equal(
+ query(".wizard-custom-step input[name='title']").value,
+ getUniqueWizard.steps[i].title,
+ "Step title is correct"
+ );
+ assert.equal(
+ query(".wizard-custom-step .wizard-text-editor textarea").value,
+ getUniqueWizard.steps[i].description,
+ "Step description is correct"
+ );
+ // field content
+ for (let j = 0; j < getUniqueWizard.steps[i].fields.length; j++) {
+ await click(
+ `.wizard-links.field .link-list div:nth-of-type(${
+ j + 1
+ }) button.btn-text`
+ );
+ assert.equal(
+ query(".wizard-custom-field.visible .setting:nth-of-type(1) input")
+ .value,
+ getUniqueWizard.steps[i].fields[j].label,
+ "Field title is correct"
+ );
+ assert.equal(
+ query(".wizard-custom-field.visible .setting:nth-of-type(3) textarea")
+ .value,
+ getUniqueWizard.steps[i].fields[j].description,
+ "Field description is correct"
+ );
+ let selectTypeElement = document.querySelector(
+ `.admin-wizard-container .wizard-custom-field.visible .setting:nth-of-type(5) .select-kit`
+ );
+ let summaryElement = selectTypeElement.querySelector("summary");
+ assert.equal(
+ summaryElement.getAttribute("data-value"),
+ getUniqueWizard.steps[i].fields[j].type,
+ "The correct data-value is selected"
+ );
+ }
+ }
+ });
+});
diff --git a/test/javascripts/acceptance/category-chooser-initializer-test.js b/test/javascripts/acceptance/category-chooser-initializer-test.js
new file mode 100644
index 00000000..0348e5bb
--- /dev/null
+++ b/test/javascripts/acceptance/category-chooser-initializer-test.js
@@ -0,0 +1,226 @@
+import { click, visit } from "@ember/test-helpers";
+import { acceptance } from "discourse/tests/helpers/qunit-helpers";
+import selectKit from "discourse/tests/helpers/select-kit-helper";
+import { test } from "qunit";
+
+acceptance("Category Chooser Initializer for regular users", function (needs) {
+ needs.user({ admin: false, moderator: false });
+ needs.settings({
+ allow_uncategorized_topics: false,
+ });
+ needs.site({
+ can_tag_topics: true,
+ categories: [
+ {
+ id: 1,
+ name: "General",
+ slug: "general",
+ permission: 1,
+ topic_template: null,
+ },
+ {
+ id: 2,
+ name: "Category with custom field",
+ slug: "category-custom-field",
+ permission: 1,
+ topic_template: "",
+ custom_fields: {
+ create_topic_wizard: "21",
+ },
+ },
+ {
+ id: 3,
+ name: "Category 1",
+ slug: "category-1",
+ permission: 1,
+ topic_template: "",
+ },
+ {
+ id: 4,
+ name: "Category 2",
+ slug: "category-2",
+ permission: 1,
+ topic_template: "",
+ },
+ ],
+ });
+
+ test("does not display category with create_topic_wizard for regular users", async function (assert) {
+ const categoryChooser = selectKit(".category-chooser");
+ await visit("/");
+ await click("#create-topic");
+ await categoryChooser.expand();
+ let categories = Array.from(
+ document.querySelectorAll(".category-chooser .category-row")
+ ).filter((category) => category.getAttribute("data-name")); // Filter elements with a data-name attribute
+ assert.equal(
+ categories.length,
+ 3,
+ "Correct number of categories are displayed"
+ );
+ const categoryNames = ["General", "Category 1", "Category 2"];
+
+ categoryNames.forEach((categoryName) => {
+ assert.ok(
+ categories.some(
+ (category) => category.getAttribute("data-name") === categoryName
+ ),
+ `Category '${categoryName}' is displayed`
+ );
+ });
+
+ const categoryNameWithCustomField = "Category with custom field";
+ assert.notOk(
+ categories.some(
+ (category) =>
+ category.getAttribute("data-name") === categoryNameWithCustomField
+ ),
+ `Category '${categoryNameWithCustomField}' is not displayed`
+ );
+ });
+});
+
+acceptance("Category Chooser Initializer for Admins", function (needs) {
+ needs.user({ admin: true });
+ needs.settings({
+ allow_uncategorized_topics: false,
+ });
+ needs.site({
+ can_tag_topics: true,
+ categories: [
+ {
+ id: 1,
+ name: "General",
+ slug: "general",
+ permission: 1,
+ topic_template: null,
+ },
+ {
+ id: 2,
+ name: "Category with custom field",
+ slug: "category-custom-field",
+ permission: 1,
+ topic_template: "",
+ custom_fields: {
+ create_topic_wizard: "21",
+ },
+ },
+ {
+ id: 3,
+ name: "Category 1",
+ slug: "category-1",
+ permission: 1,
+ topic_template: "",
+ },
+ {
+ id: 4,
+ name: "Category 2",
+ slug: "category-2",
+ permission: 1,
+ topic_template: "",
+ },
+ ],
+ });
+
+ test("displays all categories", async function (assert) {
+ const categoryChooser = selectKit(".category-chooser");
+ await visit("/");
+ await click("#create-topic");
+ await categoryChooser.expand();
+ let categories = Array.from(
+ document.querySelectorAll(".category-chooser .category-row")
+ ).filter((category) => category.getAttribute("data-name")); // Filter elements with a data-name attribute
+ assert.equal(
+ categories.length,
+ 4,
+ "Correct number of categories are displayed"
+ );
+ const categoryNames = [
+ "General",
+ "Category 1",
+ "Category 2",
+ "Category with custom field",
+ ];
+
+ categoryNames.forEach((categoryName) => {
+ assert.ok(
+ categories.some(
+ (category) => category.getAttribute("data-name") === categoryName
+ ),
+ `Category '${categoryName}' is displayed`
+ );
+ });
+ });
+});
+acceptance("Category Chooser Initializer for Staff", function (needs) {
+ needs.user({ staff: true });
+ needs.settings({
+ allow_uncategorized_topics: false,
+ });
+ needs.site({
+ can_tag_topics: true,
+ categories: [
+ {
+ id: 1,
+ name: "General",
+ slug: "general",
+ permission: 1,
+ topic_template: null,
+ },
+ {
+ id: 2,
+ name: "Category with custom field",
+ slug: "category-custom-field",
+ permission: 1,
+ topic_template: "",
+ custom_fields: {
+ create_topic_wizard: "21",
+ },
+ },
+ {
+ id: 3,
+ name: "Category 1",
+ slug: "category-1",
+ permission: 1,
+ topic_template: "",
+ },
+ {
+ id: 4,
+ name: "Category 2",
+ slug: "category-2",
+ permission: 1,
+ topic_template: "",
+ },
+ ],
+ });
+
+ test("displays all categories", async function (assert) {
+ const categoryChooser = selectKit(".category-chooser");
+ await visit("/");
+ await click("#create-topic");
+ await categoryChooser.expand();
+ let categories = Array.from(
+ document.querySelectorAll(".category-chooser .category-row")
+ ).filter((category) => category.getAttribute("data-name")); // Filter elements with a data-name attribute
+ assert.equal(
+ categories.length,
+ 4,
+ "Correct number of categories are displayed"
+ );
+ const categoryNames = [
+ "General",
+ "Category 1",
+ "Category 2",
+ "Category with custom field",
+ ];
+
+ categoryNames.forEach((categoryName) => {
+ assert.ok(
+ categories.some(
+ (category) => category.getAttribute("data-name") === categoryName
+ ),
+ `Category '${categoryName}' is displayed`
+ );
+ });
+ });
+});
diff --git a/assets/javascripts/wizard/tests/acceptance/field-test.js.es6 b/test/javascripts/acceptance/field-test.js
similarity index 58%
rename from assets/javascripts/wizard/tests/acceptance/field-test.js.es6
rename to test/javascripts/acceptance/field-test.js
index 9300fc09..67ef8c38 100644
--- a/assets/javascripts/wizard/tests/acceptance/field-test.js.es6
+++ b/test/javascripts/acceptance/field-test.js
@@ -1,38 +1,44 @@
import { click, fillIn, triggerKeyEvent, visit } from "@ember/test-helpers";
import { test } from "qunit";
-import { exists } from "../helpers/test";
-import acceptance, {
+import {
+ acceptance,
count,
+ exists,
query,
- server,
visible,
-} from "../helpers/acceptance";
-import { allFieldsWizard, getWizard } from "../helpers/wizard";
+} from "discourse/tests/helpers/qunit-helpers";
+import { allFieldsWizard } from "../helpers/wizard";
import tagsJson from "../fixtures/tags";
import usersJson from "../fixtures/users";
-import { response } from "../pretender";
-acceptance("Field | Fields", [getWizard(allFieldsWizard)], function () {
+acceptance("Field | Fields", function (needs) {
+ needs.pretender((server, helper) => {
+ server.get("/w/wizard.json", () => helper.response(allFieldsWizard));
+ server.get("/tags/filter/search", () =>
+ helper.response({ results: tagsJson["tags"] })
+ );
+ server.get("/u/search/users", () => helper.response(usersJson));
+ });
+
test("Text", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(exists(".wizard-field.text-field input.wizard-focusable"));
});
test("Textarea", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(
visible(".wizard-field.textarea-field textarea.wizard-focusable")
);
});
test("Composer", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(
visible(".wizard-field.composer-field .wizard-field-composer textarea")
);
- assert.strictEqual(
- count(".wizard-field.composer-field .d-editor-button-bar button"),
- 8
+ assert.ok(
+ exists(".wizard-field.composer-field .d-editor-button-bar button")
);
assert.ok(visible(".wizard-btn.toggle-preview"));
@@ -48,21 +54,88 @@ acceptance("Field | Fields", [getWizard(allFieldsWizard)], function () {
"Input in composer"
);
});
+ test("Composer - Hyperlink", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok(
+ visible(".wizard-field.composer-field .wizard-field-composer textarea")
+ );
+ assert.ok(
+ exists(".wizard-field.composer-field .d-editor-button-bar button")
+ );
+ assert.ok(visible(".wizard-btn.toggle-preview"));
+ await fillIn(
+ ".wizard-field.composer-field .wizard-field-composer textarea",
+ "This is a link to "
+ );
+ assert.ok(
+ !exists(".d-modal.insert-hyperlink-modal"),
+ "no hyperlink modal by default"
+ );
+ await click(
+ ".wizard-field.composer-field .wizard-field-composer .d-editor button.link"
+ );
+ assert.ok(
+ exists(".d-modal.insert-hyperlink-modal"),
+ "hyperlink modal visible"
+ );
+
+ await fillIn(".d-modal__body.insert-link .inputs .link-url", "google.com");
+ await fillIn(".d-modal__body.insert-link .inputs .link-text", "Google");
+ await click(".d-modal__footer button.btn-primary");
+
+ assert.strictEqual(
+ query(".wizard-field.composer-field .wizard-field-composer textarea")
+ .value,
+ "This is a link to [Google](https://google.com)",
+ "adds link with url and text, prepends 'https://'"
+ );
+
+ assert.ok(
+ !exists(
+ ".wizard-field.composer-field .wizard-field-composer .insert-link.modal-body"
+ ),
+ "modal dismissed after submitting link"
+ );
+
+ await fillIn(
+ ".wizard-field.composer-field .wizard-field-composer textarea",
+ "Reset textarea contents."
+ );
+
+ await click(
+ ".wizard-field.composer-field .wizard-field-composer .d-editor button.link"
+ );
+ await fillIn(".d-modal__body.insert-link .inputs .link-url", "google.com");
+ await fillIn(".d-modal__body.insert-link .inputs .link-text", "Google");
+ await click(".d-modal__footer button.btn-danger");
+
+ assert.strictEqual(
+ query(".wizard-field.composer-field .wizard-field-composer textarea")
+ .value,
+ "Reset textarea contents.",
+ "does not insert anything after cancelling"
+ );
+
+ assert.ok(
+ !exists(".insert-link.modal-body"),
+ "modal dismissed after cancelling"
+ );
+ });
test("Text Only", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(visible(".wizard-field.text-only-field label.field-label"));
});
test("Date", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(visible(".wizard-field.date-field input.date-picker"));
await click(".wizard-field.date-field input.date-picker");
assert.ok(visible(".wizard-field.date-field .pika-single"));
});
test("Time", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(visible(".wizard-field.time-field .d-time-input .select-kit"));
await click(
".wizard-field.time-field .d-time-input .select-kit .select-kit-header"
@@ -71,7 +144,7 @@ acceptance("Field | Fields", [getWizard(allFieldsWizard)], function () {
});
test("Date Time", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(
visible(".wizard-field.date-time-field .d-date-time-input .select-kit")
);
@@ -88,22 +161,22 @@ acceptance("Field | Fields", [getWizard(allFieldsWizard)], function () {
});
test("Number", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(visible(".wizard-field.number-field input[type='number']"));
});
test("Checkbox", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(visible(".wizard-field.checkbox-field input[type='checkbox']"));
});
test("Url", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(visible(".wizard-field.url-field input[type='text']"));
});
test("Upload", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(
visible(".wizard-field.upload-field label.wizard-btn-upload-file")
);
@@ -111,7 +184,7 @@ acceptance("Field | Fields", [getWizard(allFieldsWizard)], function () {
});
test("Dropdown", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(visible(".wizard-field.dropdown-field .single-select-header"));
await click(".wizard-field.dropdown-field .select-kit-header");
assert.strictEqual(
@@ -121,10 +194,7 @@ acceptance("Field | Fields", [getWizard(allFieldsWizard)], function () {
});
test("Tag", async function (assert) {
- server.get("/tags/filter/search", () =>
- response(200, { results: tagsJson["tags"] })
- );
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(visible(".wizard-field.tag-field .multi-select-header"));
await click(".wizard-field.tag-field .select-kit-header");
assert.strictEqual(
@@ -134,17 +204,14 @@ acceptance("Field | Fields", [getWizard(allFieldsWizard)], function () {
});
test("Category", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(visible(".wizard-field.category-field .multi-select-header"));
await click(".wizard-field.category-field .select-kit-header");
- assert.strictEqual(
- count(".wizard-field.category-field .select-kit-collection li"),
- 5
- );
+ assert.ok(exists(".wizard-field.category-field .select-kit-collection li"));
});
test("Group", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(visible(".wizard-field.group-field .single-select-header"));
await click(".wizard-field.group-field .select-kit-header");
assert.strictEqual(
@@ -154,9 +221,7 @@ acceptance("Field | Fields", [getWizard(allFieldsWizard)], function () {
});
test("User", async function (assert) {
- server.get("/u/search/users", () => response(200, usersJson));
-
- await visit("/wizard");
+ await visit("/w/wizard");
await fillIn(
".wizard-field.user-selector-field input.ember-text-field",
"a"
diff --git a/assets/javascripts/wizard/tests/acceptance/step-test.js.es6 b/test/javascripts/acceptance/step-test.js
similarity index 59%
rename from assets/javascripts/wizard/tests/acceptance/step-test.js.es6
rename to test/javascripts/acceptance/step-test.js
index 1537f1c7..cfa0f37a 100644
--- a/assets/javascripts/wizard/tests/acceptance/step-test.js.es6
+++ b/test/javascripts/acceptance/step-test.js
@@ -1,20 +1,34 @@
import { click, visit } from "@ember/test-helpers";
import { test } from "qunit";
-import { exists } from "../helpers/test";
-import acceptance, { count, query, visible } from "../helpers/acceptance";
-import { getWizard, stepNotPermitted, wizard } from "../helpers/wizard";
-import { saveStep, update } from "../helpers/step";
+import {
+ acceptance,
+ count,
+ exists,
+ query,
+ visible,
+} from "discourse/tests/helpers/qunit-helpers";
+import { stepNotPermitted, update, wizard } from "../helpers/wizard";
+
+acceptance("Step | Not permitted", function (needs) {
+ needs.pretender((server, helper) => {
+ server.get("/w/wizard.json", () => helper.response(stepNotPermitted));
+ });
-acceptance("Step | Not permitted", [getWizard(stepNotPermitted)], function () {
test("Shows not permitted message", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(exists(".step-message.not-permitted"));
});
});
-acceptance("Step | Step", [getWizard(wizard), saveStep(update)], function () {
+acceptance("Step | Step", function (needs) {
+ needs.user();
+ needs.pretender((server, helper) => {
+ server.get("/w/wizard.json", () => helper.response(wizard));
+ server.put("/w/wizard/steps/:step_id", () => helper.response(update));
+ });
+
test("Renders the step", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.strictEqual(
query(".wizard-step-title p").textContent.trim(),
"Text"
@@ -33,7 +47,7 @@ acceptance("Step | Step", [getWizard(wizard), saveStep(update)], function () {
});
test("Goes to the next step", async function (assert) {
- await visit("/wizard");
+ await visit("/w/wizard");
assert.ok(visible(".wizard-step.step_1"), true);
await click(".wizard-btn.next");
assert.ok(visible(".wizard-step.step_2"), true);
diff --git a/test/javascripts/acceptance/wizard-test.js b/test/javascripts/acceptance/wizard-test.js
new file mode 100644
index 00000000..0527cf0f
--- /dev/null
+++ b/test/javascripts/acceptance/wizard-test.js
@@ -0,0 +1,196 @@
+import { visit } from "@ember/test-helpers";
+import { test } from "qunit";
+import {
+ acceptance,
+ count,
+ exists,
+ query,
+} from "discourse/tests/helpers/qunit-helpers";
+import {
+ wizard,
+ wizardCompleted,
+ wizardGuest,
+ wizardNoUser,
+ wizardNotPermitted,
+} from "../helpers/wizard";
+import DiscourseURL from "discourse/lib/url";
+import sinon from "sinon";
+
+acceptance("Wizard | Not logged in", function (needs) {
+ needs.pretender((server, helper) => {
+ server.get("/w/wizard.json", () => helper.response(wizardNoUser));
+ });
+
+ test("Requires login", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok(exists(".wizard-no-access.requires-login"));
+ });
+
+ test("Requires login if a step path is used", async function (assert) {
+ await visit("/w/wizard/steps/1");
+ assert.ok(exists(".wizard-no-access.requires-login"));
+ });
+});
+
+acceptance("Wizard | Not permitted", function (needs) {
+ needs.user();
+ needs.pretender((server, helper) => {
+ server.get("/w/wizard.json", () => helper.response(wizardNotPermitted));
+ });
+
+ test("Wizard no access not permitted", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok(exists(".wizard-no-access.not-permitted"));
+ });
+});
+
+acceptance("Wizard | Completed", function (needs) {
+ needs.user();
+ needs.pretender((server, helper) => {
+ server.get("/w/wizard.json", () => helper.response(wizardCompleted));
+ });
+
+ test("Wizard no access completed", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok(exists(".wizard-no-access.completed"));
+ });
+});
+
+acceptance("Wizard | Redirect", function (needs) {
+ needs.user({
+ redirect_to_wizard: "wizard",
+ });
+ needs.pretender((server, helper) => {
+ server.get("/w/wizard.json", () => {
+ return helper.response(wizard);
+ });
+ });
+
+ test("Redirect to pending Wizard", async function (assert) {
+ sinon.stub(DiscourseURL, "routeTo");
+ await visit("/latest");
+ assert.ok(
+ DiscourseURL.routeTo.calledWith("/w/wizard"),
+ "pending wizard routing works"
+ );
+ });
+
+ test("Don't redirect to pending Wizard when ingore redirect param is supplied", async function (assert) {
+ sinon.stub(DiscourseURL, "routeTo");
+ await visit("/latest?ignore_redirect=1");
+ assert.notOk(
+ DiscourseURL.routeTo.calledWith("/w/wizard"),
+ "pending wizard routing blocked"
+ );
+ });
+});
+
+acceptance("Wizard | Wizard", function (needs) {
+ needs.user();
+ needs.pretender((server, helper) => {
+ server.get("/w/wizard.json", () => {
+ return helper.response(wizard);
+ });
+ });
+
+ test("Starts", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok(query(".wizard-column"), true);
+ });
+
+ test("Applies the wizard body class", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok($("body.custom-wizard").length);
+ });
+
+ test("Applies the body background color", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok($("body")[0].style.background);
+ });
+
+ test("Renders the wizard form", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok(exists(".wizard-column-contents .wizard-step"), true);
+ assert.ok(exists(".wizard-footer img"), true);
+ });
+
+ test("Renders the first step", async function (assert) {
+ await visit("/w/wizard");
+ assert.strictEqual(
+ query(".wizard-step-title p").textContent.trim(),
+ "Text"
+ );
+ assert.strictEqual(
+ query(".wizard-step-description p").textContent.trim(),
+ "Text inputs!"
+ );
+ assert.strictEqual(
+ query(".wizard-step-description p").textContent.trim(),
+ "Text inputs!"
+ );
+ assert.strictEqual(count(".wizard-step-form .wizard-field"), 6);
+ assert.ok(exists(".wizard-step-footer .wizard-progress"), true);
+ assert.ok(exists(".wizard-step-footer .wizard-buttons"), true);
+ });
+
+ test("Removes the wizard body class when navigating away", async function (assert) {
+ await visit("/");
+ assert.strictEqual($("body.custom-wizard").length, 0);
+ });
+});
+
+acceptance("Wizard | Guest access", function (needs) {
+ needs.pretender((server, helper) => {
+ server.get("/w/wizard.json", () => helper.response(wizardGuest));
+ });
+
+ test("Does not require login", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok(!exists(".wizard-no-access.requires-login"));
+ });
+
+ test("Starts", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok(query(".wizard-column"), true);
+ });
+
+ test("Applies the wizard body class", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok($("body.custom-wizard").length);
+ });
+
+ test("Applies the body background color", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok($("body")[0].style.background);
+ });
+
+ test("Renders the wizard form", async function (assert) {
+ await visit("/w/wizard");
+ assert.ok(exists(".wizard-column-contents .wizard-step"), true);
+ assert.ok(exists(".wizard-footer img"), true);
+ });
+
+ test("Renders the first step", async function (assert) {
+ await visit("/w/wizard");
+ assert.strictEqual(
+ query(".wizard-step-title p").textContent.trim(),
+ "Text"
+ );
+ assert.strictEqual(
+ query(".wizard-step-description p").textContent.trim(),
+ "Text inputs!"
+ );
+ assert.strictEqual(
+ query(".wizard-step-description p").textContent.trim(),
+ "Text inputs!"
+ );
+ assert.strictEqual(count(".wizard-step-form .wizard-field"), 6);
+ assert.ok(exists(".wizard-step-footer .wizard-progress"), true);
+ assert.ok(exists(".wizard-step-footer .wizard-buttons"), true);
+ });
+
+ test("Removes the wizard body class when navigating away", async function (assert) {
+ await visit("/");
+ assert.strictEqual($("body.custom-wizard").length, 0);
+ });
+});
diff --git a/assets/javascripts/wizard/tests/fixtures/categories.js.es6 b/test/javascripts/fixtures/categories.js.es6
similarity index 100%
rename from assets/javascripts/wizard/tests/fixtures/categories.js.es6
rename to test/javascripts/fixtures/categories.js.es6
diff --git a/assets/javascripts/wizard/tests/fixtures/groups.js.es6 b/test/javascripts/fixtures/groups.js.es6
similarity index 100%
rename from assets/javascripts/wizard/tests/fixtures/groups.js.es6
rename to test/javascripts/fixtures/groups.js.es6
diff --git a/assets/javascripts/wizard/tests/fixtures/site-settings.js.es6 b/test/javascripts/fixtures/site-settings.js.es6
similarity index 100%
rename from assets/javascripts/wizard/tests/fixtures/site-settings.js.es6
rename to test/javascripts/fixtures/site-settings.js.es6
diff --git a/assets/javascripts/wizard/tests/fixtures/tags.js.es6 b/test/javascripts/fixtures/tags.js.es6
similarity index 100%
rename from assets/javascripts/wizard/tests/fixtures/tags.js.es6
rename to test/javascripts/fixtures/tags.js.es6
diff --git a/assets/javascripts/wizard/tests/fixtures/update.js.es6 b/test/javascripts/fixtures/update.js.es6
similarity index 100%
rename from assets/javascripts/wizard/tests/fixtures/update.js.es6
rename to test/javascripts/fixtures/update.js.es6
diff --git a/assets/javascripts/wizard/tests/fixtures/user.js.es6 b/test/javascripts/fixtures/user.js.es6
similarity index 100%
rename from assets/javascripts/wizard/tests/fixtures/user.js.es6
rename to test/javascripts/fixtures/user.js.es6
diff --git a/assets/javascripts/wizard/tests/fixtures/users.js.es6 b/test/javascripts/fixtures/users.js.es6
similarity index 100%
rename from assets/javascripts/wizard/tests/fixtures/users.js.es6
rename to test/javascripts/fixtures/users.js.es6
diff --git a/assets/javascripts/wizard/tests/fixtures/wizard.js.es6 b/test/javascripts/fixtures/wizard.js.es6
similarity index 99%
rename from assets/javascripts/wizard/tests/fixtures/wizard.js.es6
rename to test/javascripts/fixtures/wizard.js.es6
index 73fe45c1..a3b83063 100644
--- a/assets/javascripts/wizard/tests/fixtures/wizard.js.es6
+++ b/test/javascripts/fixtures/wizard.js.es6
@@ -6,7 +6,7 @@ export default {
submission_last_updated_at: "2022-03-15T21:11:01+01:00",
theme_id: 2,
required: false,
- permitted: true,
+ permitted: false,
uncategorized_category_id: 1,
categories: [],
subscribed: false,
diff --git a/test/javascripts/helpers/admin-wizard.js b/test/javascripts/helpers/admin-wizard.js
new file mode 100644
index 00000000..79eba3b7
--- /dev/null
+++ b/test/javascripts/helpers/admin-wizard.js
@@ -0,0 +1,958 @@
+const getWizard = {
+ wizard_list: [
+ { id: "this_is_testing_wizard", name: "This is testing wizard" },
+ { id: "another_wizard", name: "another wizard" },
+ { id: "unique_wizard", name: "Unique wizard for testing" },
+ ],
+ field_types: {
+ text: {
+ min_length: null,
+ max_length: null,
+ prefill: null,
+ char_counter: null,
+ validations: null,
+ placeholder: null,
+ },
+ textarea: {
+ min_length: null,
+ max_length: null,
+ prefill: null,
+ char_counter: null,
+ placeholder: null,
+ },
+ composer: {
+ min_length: null,
+ max_length: null,
+ char_counter: null,
+ placeholder: null,
+ },
+ text_only: {},
+ composer_preview: { preview_template: null },
+ date: { format: "YYYY-MM-DD" },
+ time: { format: "HH:mm" },
+ date_time: { format: "" },
+ number: {},
+ checkbox: {},
+ url: { min_length: null },
+ upload: { file_types: ".jpg,.jpeg,.png" },
+ dropdown: { prefill: null, content: null },
+ tag: { limit: null, prefill: null, content: null, tag_groups: null },
+ category: { limit: 1, property: "id", prefill: null, content: null },
+ group: { prefill: null, content: null },
+ user_selector: {},
+ },
+ realtime_validations: {
+ similar_topics: {
+ types: ["text"],
+ component: "similar-topics-validator",
+ backend: true,
+ required_params: [],
+ },
+ },
+ custom_fields: [
+ {
+ id: "external",
+ klass: "category",
+ name: "require_topic_approval",
+ type: "boolean",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "category",
+ name: "require_reply_approval",
+ type: "boolean",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "category",
+ name: "num_auto_bump_daily",
+ type: "integer",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "category",
+ name: "has_chat_enabled",
+ type: "boolean",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "post",
+ name: "missing uploads",
+ type: "json",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "post",
+ name: "missing uploads ignored",
+ type: "boolean",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "post",
+ name: "notice",
+ type: "json",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "post",
+ name: "local_dates",
+ type: "json",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "post",
+ name: "has_polls",
+ type: "boolean",
+ serializers: null,
+ },
+ ],
+};
+const getUnsubscribedAdminWizards = {
+ subscribed: false,
+ subscription_type: "none",
+ subscription_attributes: {
+ wizard: {
+ required: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ permitted: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ restart_on_revisit: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ step: {
+ condition: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ required_data: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ permitted_params: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ field: {
+ condition: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ type: {
+ none: [
+ "text",
+ "textarea",
+ "text_only",
+ "date",
+ "time",
+ "date_time",
+ "number",
+ "checkbox",
+ "dropdown",
+ "upload",
+ ],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ realtime_validations: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ action: {
+ type: {
+ none: ["create_topic", "update_profile", "open_composer", "route_to"],
+ standard: [
+ "create_topic",
+ "update_profile",
+ "open_composer",
+ "route_to",
+ "send_message",
+ "watch_categories",
+ "add_to_group",
+ ],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ custom_field: {
+ klass: {
+ none: ["topic", "post"],
+ standard: ["topic", "post"],
+ business: ["*"],
+ community: ["*"],
+ },
+ type: {
+ none: ["string", "boolean", "integer"],
+ standard: ["string", "boolean", "integer"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ api: {
+ all: { none: [], standard: [], business: ["*"], community: ["*"] },
+ },
+ },
+};
+const getCustomFields = {
+ custom_fields: [
+ {
+ id: "external",
+ klass: "category",
+ name: "require_topic_approval",
+ type: "boolean",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "category",
+ name: "require_reply_approval",
+ type: "boolean",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "category",
+ name: "num_auto_bump_daily",
+ type: "integer",
+ serializers: null,
+ },
+ {
+ id: "external",
+ klass: "category",
+ name: "has_chat_enabled",
+ type: "boolean",
+ serializers: null,
+ },
+ ],
+};
+const getWizardTestingLog = {
+ wizard: {
+ id: "this_is_testing_wizard",
+ name: "This is testing wizard",
+ },
+ logs: [
+ {
+ date: "2022-12-13T05:32:38.906-04:00",
+ action: "create_topic",
+ username: "christin",
+ message: "success: created topic - id: 119",
+ user: {
+ id: 55,
+ username: "christin",
+ name: "Sybil Ratke",
+ avatar_template: "",
+ },
+ },
+ {
+ date: "2022-12-12T09:41:57.888-04:00",
+ action: "create_topic",
+ username: "someuser",
+ message:
+ "error: invalid topic params - title: ; post: creating a text for this text area that is being displayed here.",
+ user: {
+ id: 1,
+ username: "someuser",
+ name: null,
+ avatar_template: "",
+ },
+ },
+ ],
+ total: 2,
+};
+const getWizardSubmissions = {
+ wizard: {
+ id: "this_is_testing_wizard",
+ name: "This is testing wizard",
+ },
+ submissions: [
+ {
+ id: "1",
+ fields: {
+ step_1_field_1: {
+ value:
+ "creating a text for this text area that is being displayed here.",
+ type: "textarea",
+ label: "label field",
+ },
+ },
+ submitted_at: "2022-12-12T09:41:57-04:00",
+ user: {
+ id: 1,
+ username: "someuser",
+ name: null,
+ avatar_template: "",
+ },
+ },
+ ],
+ total: 1,
+};
+const getAnotherWizardSubmission = {
+ wizard: { id: "another_wizard", name: "another wizard" },
+ submissions: [
+ {
+ id: "00925bcd58366d07fb698dc5",
+ fields: {
+ step_1_field_1: {
+ value: "More content here by user",
+ type: "text",
+ label: "Content to be inserted",
+ },
+ step_2_field_1: {
+ value: "body of the content created by the user",
+ type: "textarea",
+ label: "Step 2 content",
+ },
+ },
+ submitted_at: "2023-05-10T20:58:11-04:00",
+ user: {
+ id: 29,
+ username: "anotheruser",
+ name: null,
+ avatar_template: "",
+ },
+ },
+ {
+ id: "dc094efcd4873d6da4666c1a",
+ fields: {
+ step_1_field_1: {
+ value: "Title for the content being created",
+ type: "text",
+ label: "Content to be inserted",
+ },
+ step_2_field_1: {
+ value: "THis is the body of the content that will be created",
+ type: "textarea",
+ label: "Step 2 content",
+ },
+ },
+ submitted_at: "2023-05-10T20:56:14-04:00",
+ user: {
+ id: 1,
+ username: "someuser",
+ name: null,
+ avatar_template: "",
+ },
+ },
+ ],
+ total: 2,
+};
+const getBusinessAdminWizard = {
+ subscribed: true,
+ subscription_type: "business",
+ subscription_attributes: {
+ wizard: {
+ required: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ permitted: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ restart_on_revisit: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ step: {
+ condition: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ required_data: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ permitted_params: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ field: {
+ condition: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ type: {
+ none: [
+ "text",
+ "textarea",
+ "text_only",
+ "date",
+ "time",
+ "date_time",
+ "number",
+ "checkbox",
+ "dropdown",
+ "upload",
+ ],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ realtime_validations: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ action: {
+ type: {
+ none: ["create_topic", "update_profile", "open_composer", "route_to"],
+ standard: [
+ "create_topic",
+ "update_profile",
+ "open_composer",
+ "route_to",
+ "send_message",
+ "watch_categories",
+ "add_to_group",
+ ],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ custom_field: {
+ klass: {
+ none: ["topic", "post"],
+ standard: ["topic", "post"],
+ business: ["*"],
+ community: ["*"],
+ },
+ type: {
+ none: ["string", "boolean", "integer"],
+ standard: ["string", "boolean", "integer"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ api: {
+ all: { none: [], standard: [], business: ["*"], community: ["*"] },
+ },
+ },
+};
+const getStandardAdminWizard = {
+ subscribed: true,
+ subscription_type: "standard",
+ subscription_attributes: {
+ wizard: {
+ required: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ permitted: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ restart_on_revisit: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ step: {
+ condition: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ required_data: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ permitted_params: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ field: {
+ condition: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ type: {
+ none: [
+ "text",
+ "textarea",
+ "text_only",
+ "date",
+ "time",
+ "date_time",
+ "number",
+ "checkbox",
+ "dropdown",
+ "upload",
+ ],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ realtime_validations: {
+ none: [],
+ standard: ["*"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ action: {
+ type: {
+ none: ["create_topic", "update_profile", "open_composer", "route_to"],
+ standard: [
+ "create_topic",
+ "update_profile",
+ "open_composer",
+ "route_to",
+ "send_message",
+ "watch_categories",
+ "add_to_group",
+ ],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ custom_field: {
+ klass: {
+ none: ["topic", "post"],
+ standard: ["topic", "post"],
+ business: ["*"],
+ community: ["*"],
+ },
+ type: {
+ none: ["string", "boolean", "integer"],
+ standard: ["string", "boolean", "integer"],
+ business: ["*"],
+ community: ["*"],
+ },
+ },
+ api: {
+ all: { none: [], standard: [], business: ["*"], community: ["*"] },
+ },
+ },
+};
+const getAdminTestingWizard = {
+ id: "this_is_testing_wizard",
+ name: "This is testing wizard",
+ save_submissions: true,
+ after_time: false,
+ after_time_scheduled: "2022-12-12T13:45:00.000Z",
+ prompt_completion: true,
+ steps: [
+ {
+ id: "step_1",
+ title: "step 1",
+ raw_description: "This is a description for step 1 sads",
+ fields: [
+ {
+ id: "step_1_field_1",
+ label: "label field",
+ description: "this is the label description",
+ type: "textarea",
+ placeholder: "insert a textarea text here.",
+ },
+ ],
+ description: "This is a description for step 1 sads",
+ },
+ ],
+ actions: [
+ {
+ id: "action_1",
+ run_after: "wizard_completion",
+ type: "create_topic",
+ skip_redirect: false,
+ post: "step_1_field_1",
+ post_builder: false,
+ title: [
+ {
+ type: "assignment",
+ output: "Testing title",
+ output_type: "text",
+ output_connector: "set",
+ pairs: [],
+ },
+ ],
+ category: [
+ {
+ type: "assignment",
+ output_type: "category",
+ output_connector: "set",
+ output: [30],
+ },
+ ],
+ },
+ ],
+};
+const getCreatedWizard = {
+ id: "new_wizard_for_testing",
+ name: "New wizard for testing",
+ save_submissions: true,
+ multiple_submissions: false,
+ after_signup: false,
+ prompt_completion: false,
+ steps: [
+ {
+ id: "step_1",
+ title: "step title",
+ raw_description:
+ 'Input in step description composer\n\n**Bold text**\n\n*emphasized text*\n\n\u003e Blockqoute text\n\n```\n code text\n \n```\n\n* List item\n* List item\n\n1. List item\n1. List item\n\n[Google](https://google.com)[date=2023-05-25 timezone="America/La_Paz"]',
+ fields: [
+ {
+ id: "step_1_field_1",
+ label: "field title",
+ description: "First step field description",
+ type: "text",
+ min_length: "1",
+ placeholder: "Insert text here",
+ validations: { similar_topics: {} },
+ },
+ ],
+ description:
+ 'Input in step description composer\n\n**Bold text**\n\n*emphasized text*\n\n\u003e Blockqoute text\n\n```\n code text\n \n```\n\n* List item\n* List item\n\n1. List item\n1. List item\n\n[Google](https://google.com)[date=2023-05-25 timezone="America/La_Paz"]',
+ },
+ ],
+ actions: [
+ {
+ id: "action_1",
+ run_after: "wizard_completion",
+ type: "create_topic",
+ post_builder: false,
+ post_template: "Wizard Fields w{step_1_field_1}",
+ title: [
+ {
+ type: "conditional",
+ output: "Result text",
+ output_type: "text",
+ output_connector: "then",
+ pairs: [
+ {
+ index: 0,
+ key: "Action title",
+ key_type: "text",
+ value: "Some value",
+ value_type: "text",
+ connector: "equal",
+ },
+ ],
+ },
+ ],
+ category: [
+ {
+ type: "assignment",
+ output_type: "category",
+ output_connector: "set",
+ output: [10],
+ },
+ ],
+ tags: [
+ {
+ type: "assignment",
+ output_type: "tag",
+ output_connector: "set",
+ pairs: [],
+ output: ["gazelle"],
+ },
+ ],
+ visible: [
+ {
+ type: "conditional",
+ output: "Result text",
+ output_type: "text",
+ output_connector: "then",
+ pairs: [
+ {
+ index: 0,
+ key: "Action title",
+ key_type: "text",
+ value: "Some value",
+ value_type: "text",
+ connector: "equal",
+ },
+ ],
+ },
+ ],
+ },
+ ],
+};
+const getUniqueWizard = {
+ id: "unique_wizard",
+ name: "Unique wizard for testing",
+ save_submissions: true,
+ multiple_submissions: false,
+ after_signup: false,
+ prompt_completion: false,
+ steps: [
+ {
+ id: "step_1",
+ title: "step title",
+ raw_description:
+ 'Input in step description composer\n\n**Bold text**\n\n*emphasized text*\n\n\u003e Blockqoute text\n\n```\n code text\n \n```\n\n* List item\n* List item\n\n1. List item\n1. List item\n\n[Google](https://google.com)[date=2023-05-25 timezone="America/La_Paz"]',
+ fields: [
+ {
+ id: "step_1_field_1",
+ label: "field title",
+ description: "First step field description",
+ type: "text",
+ min_length: "1",
+ placeholder: "Insert text here",
+ validations: { similar_topics: {} },
+ },
+ ],
+ description:
+ 'Input in step description composer\n\n**Bold text**\n\n*emphasized text*\n\n\u003e Blockqoute text\n\n```\n code text\n \n```\n\n* List item\n* List item\n\n1. List item\n1. List item\n\n[Google](https://google.com)[date=2023-05-25 timezone="America/La_Paz"]',
+ },
+ {
+ id: "step_2",
+ title: "step title two",
+ raw_description: "Input in step description composer",
+ fields: [
+ {
+ id: "step_2_field_1",
+ label: "step 2 field title",
+ description: "First step field description",
+ type: "textarea",
+ min_length: "1",
+ placeholder: "Insert text here",
+ validations: { similar_topics: {} },
+ },
+ {
+ id: "step_2_field_2",
+ label: "step 2 field two title",
+ description: "Second Step field two field description",
+ type: "text",
+ min_length: "1",
+ placeholder: "Insert more text here",
+ validations: { similar_topics: {} },
+ },
+ ],
+ description: "Input in step description composer",
+ },
+ ],
+ actions: [
+ {
+ id: "action_1",
+ run_after: "wizard_completion",
+ type: "create_topic",
+ post_builder: false,
+ post_template: "Wizard Fields w{step_1_field_1}",
+ title: [
+ {
+ type: "conditional",
+ output: "Result text",
+ output_type: "text",
+ output_connector: "then",
+ pairs: [
+ {
+ index: 0,
+ key: "Action title",
+ key_type: "text",
+ value: "Some value",
+ value_type: "text",
+ connector: "equal",
+ },
+ ],
+ },
+ ],
+ category: [
+ {
+ type: "assignment",
+ output_type: "category",
+ output_connector: "set",
+ output: [10],
+ },
+ ],
+ tags: [
+ {
+ type: "assignment",
+ output_type: "tag",
+ output_connector: "set",
+ pairs: [],
+ output: ["gazelle"],
+ },
+ ],
+ visible: [
+ {
+ type: "conditional",
+ output: "Result text",
+ output_type: "text",
+ output_connector: "then",
+ pairs: [
+ {
+ index: 0,
+ key: "Action title",
+ key_type: "text",
+ value: "Some value",
+ value_type: "text",
+ connector: "equal",
+ },
+ ],
+ },
+ ],
+ },
+ ],
+};
+
+const getNewApi = {
+ name: "new_api",
+ title: "new API",
+ authorization: {
+ auth_type: "basic",
+ auth_url: null,
+ token_url: null,
+ client_id: null,
+ client_secret: null,
+ authorized: null,
+ auth_params: [],
+ access_token: null,
+ refresh_token: null,
+ token_expires_at: null,
+ token_refresh_at: null,
+ code: null,
+ username: "some_username",
+ password: "some_password",
+ },
+ endpoints: [
+ {
+ id: "8371de",
+ name: "endpoint_name",
+ method: "POST",
+ url: "https://test.api.com",
+ content_type: "application/json",
+ success_codes: [200, 100],
+ },
+ ],
+ log: [],
+};
+const putNewApi = {
+ success: "OK",
+ api: {
+ name: "new_api",
+ title: "new API",
+ authorization: {
+ auth_type: "basic",
+ auth_url: null,
+ token_url: null,
+ client_id: null,
+ client_secret: null,
+ authorized: null,
+ auth_params: [],
+ access_token: null,
+ refresh_token: null,
+ token_expires_at: null,
+ token_refresh_at: null,
+ code: null,
+ username: "some_username",
+ password: "some_password",
+ },
+ endpoints: [
+ {
+ id: "8371de",
+ name: "endpoint_name",
+ method: "POST",
+ url: "https://test.api.com",
+ content_type: "application/json",
+ success_codes: [200, 100],
+ },
+ ],
+ log: [],
+ },
+};
+
+const getSuppliers = {
+ suppliers: [
+ {
+ id: 1,
+ name: "Pavilion",
+ authorized: false,
+ authorized_at: null,
+ user: null,
+ },
+ ],
+};
+
+const getSuppliersAuthorized = {
+ suppliers: [
+ {
+ id: 1,
+ name: "Pavilion",
+ authorized: true,
+ authorized_at: null,
+ user: null,
+ },
+ ],
+};
+
+export {
+ getWizard,
+ getUnsubscribedAdminWizards,
+ getCustomFields,
+ getWizardTestingLog,
+ getWizardSubmissions,
+ getBusinessAdminWizard,
+ getStandardAdminWizard,
+ getAdminTestingWizard,
+ getCreatedWizard,
+ getNewApi,
+ putNewApi,
+ getAnotherWizardSubmission,
+ getUniqueWizard,
+ getSuppliers,
+ getSuppliersAuthorized,
+};
diff --git a/assets/javascripts/wizard/tests/helpers/wizard.js.es6 b/test/javascripts/helpers/wizard.js
similarity index 84%
rename from assets/javascripts/wizard/tests/helpers/wizard.js.es6
rename to test/javascripts/helpers/wizard.js
index 4cd2e003..e02e2e99 100644
--- a/assets/javascripts/wizard/tests/helpers/wizard.js.es6
+++ b/test/javascripts/helpers/wizard.js
@@ -2,11 +2,15 @@ import wizardJson from "../fixtures/wizard";
import userJson from "../fixtures/user";
import categoriesJson from "../fixtures/categories";
import groupsJson from "../fixtures/groups";
+import updateJson from "../fixtures/update";
import { cloneJSON } from "discourse-common/lib/object";
const wizardNoUser = cloneJSON(wizardJson);
+const wizardGuest = cloneJSON(wizardJson);
+wizardGuest.permitted = true;
const wizard = cloneJSON(wizardJson);
wizard.user = cloneJSON(userJson);
+wizard.permitted = true;
const wizardNotPermitted = cloneJSON(wizard);
wizardNotPermitted.permitted = false;
@@ -32,21 +36,16 @@ allFieldsWizard.steps = [cloneJSON(allFieldsWizard.steps[0])];
allFieldsWizard.categories = cloneJSON(categoriesJson["categories"]);
allFieldsWizard.groups = cloneJSON(groupsJson["groups"]);
-const getWizard = function (response) {
- return {
- verb: "get",
- path: "/w/wizard",
- status: 200,
- response,
- };
-};
+const update = cloneJSON(updateJson);
+update.wizard = cloneJSON(wizard);
export {
- getWizard,
wizardNoUser,
wizardNotPermitted,
wizardCompleted,
+ wizardGuest,
stepNotPermitted,
allFieldsWizard,
wizard,
+ update,
};
diff --git a/yarn.lock b/yarn.lock
index 955f0c18..5f265f17 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,101 +2,292 @@
# yarn lockfile v1
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
- integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==
- dependencies:
- "@babel/highlight" "^7.16.7"
+"@aashutoshrathi/word-wrap@^1.2.3":
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
+ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
-"@babel/generator@^7.17.9":
- version "7.17.9"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc"
- integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==
+"@ampproject/remapping@^2.2.0":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
+ integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==
dependencies:
- "@babel/types" "^7.17.0"
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@babel/code-frame@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658"
+ integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==
+ dependencies:
+ "@babel/highlight" "^7.22.5"
+
+"@babel/compat-data@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544"
+ integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==
+
+"@babel/core@^7.22.5":
+ version "7.22.8"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.8.tgz#386470abe884302db9c82e8e5e87be9e46c86785"
+ integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.22.5"
+ "@babel/generator" "^7.22.7"
+ "@babel/helper-compilation-targets" "^7.22.6"
+ "@babel/helper-module-transforms" "^7.22.5"
+ "@babel/helpers" "^7.22.6"
+ "@babel/parser" "^7.22.7"
+ "@babel/template" "^7.22.5"
+ "@babel/traverse" "^7.22.8"
+ "@babel/types" "^7.22.5"
+ "@nicolo-ribaudo/semver-v6" "^6.3.3"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.2"
+
+"@babel/eslint-parser@^7.22.5":
+ version "7.22.7"
+ resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.7.tgz#d2807fbd1fa4376162716da63dfd3c69a2249fed"
+ integrity sha512-LH6HJqjOyu/Qtp7LuSycZXK/CYXQ4ohdkliEaL1QTdtOXVdOVpTBKVxAo/+eeyt+x/2SRzB+zUPduVl+xiEvdg==
+ dependencies:
+ "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1"
+ "@nicolo-ribaudo/semver-v6" "^6.3.3"
+ eslint-visitor-keys "^2.1.0"
+
+"@babel/generator@^7.22.7":
+ version "7.22.7"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5"
+ integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==
+ dependencies:
+ "@babel/types" "^7.22.5"
+ "@jridgewell/gen-mapping" "^0.3.2"
+ "@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
- source-map "^0.5.0"
-"@babel/helper-environment-visitor@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7"
- integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==
+"@babel/helper-annotate-as-pure@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
+ integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==
dependencies:
- "@babel/types" "^7.16.7"
+ "@babel/types" "^7.22.5"
-"@babel/helper-function-name@^7.17.9":
- version "7.17.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12"
- integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==
+"@babel/helper-compilation-targets@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52"
+ integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==
dependencies:
- "@babel/template" "^7.16.7"
- "@babel/types" "^7.17.0"
+ "@babel/compat-data" "^7.22.6"
+ "@babel/helper-validator-option" "^7.22.5"
+ "@nicolo-ribaudo/semver-v6" "^6.3.3"
+ browserslist "^4.21.9"
+ lru-cache "^5.1.1"
-"@babel/helper-hoist-variables@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246"
- integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==
+"@babel/helper-create-class-features-plugin@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz#58564873c889a6fea05a538e23f9f6d201f10950"
+ integrity sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ==
dependencies:
- "@babel/types" "^7.16.7"
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-function-name" "^7.22.5"
+ "@babel/helper-member-expression-to-functions" "^7.22.5"
+ "@babel/helper-optimise-call-expression" "^7.22.5"
+ "@babel/helper-replace-supers" "^7.22.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@nicolo-ribaudo/semver-v6" "^6.3.3"
-"@babel/helper-split-export-declaration@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b"
- integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==
+"@babel/helper-environment-visitor@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98"
+ integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==
+
+"@babel/helper-function-name@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be"
+ integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==
dependencies:
- "@babel/types" "^7.16.7"
+ "@babel/template" "^7.22.5"
+ "@babel/types" "^7.22.5"
-"@babel/helper-validator-identifier@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad"
- integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
-
-"@babel/highlight@^7.16.7":
- version "7.17.9"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3"
- integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==
+"@babel/helper-hoist-variables@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
+ integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
dependencies:
- "@babel/helper-validator-identifier" "^7.16.7"
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-member-expression-to-functions@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2"
+ integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-module-imports@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c"
+ integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-module-transforms@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef"
+ integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-module-imports" "^7.22.5"
+ "@babel/helper-simple-access" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.5"
+ "@babel/helper-validator-identifier" "^7.22.5"
+ "@babel/template" "^7.22.5"
+ "@babel/traverse" "^7.22.5"
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-optimise-call-expression@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e"
+ integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-plugin-utils@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295"
+ integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==
+
+"@babel/helper-replace-supers@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz#71bc5fb348856dea9fdc4eafd7e2e49f585145dc"
+ integrity sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-member-expression-to-functions" "^7.22.5"
+ "@babel/helper-optimise-call-expression" "^7.22.5"
+ "@babel/template" "^7.22.5"
+ "@babel/traverse" "^7.22.5"
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-simple-access@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
+ integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847"
+ integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
+ integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-string-parser@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
+ integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
+
+"@babel/helper-validator-identifier@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193"
+ integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==
+
+"@babel/helper-validator-option@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac"
+ integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==
+
+"@babel/helpers@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd"
+ integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==
+ dependencies:
+ "@babel/template" "^7.22.5"
+ "@babel/traverse" "^7.22.6"
+ "@babel/types" "^7.22.5"
+
+"@babel/highlight@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031"
+ integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.22.5"
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.16.7", "@babel/parser@^7.17.9", "@babel/parser@^7.7.0":
- version "7.17.9"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef"
- integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==
+"@babel/parser@^7.22.5", "@babel/parser@^7.22.7":
+ version "7.22.7"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae"
+ integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==
-"@babel/template@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155"
- integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==
+"@babel/plugin-proposal-decorators@^7.22.5":
+ version "7.22.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz#9b5b73c2e404f0869ef8a8a53765f8203c5467a7"
+ integrity sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ==
dependencies:
- "@babel/code-frame" "^7.16.7"
- "@babel/parser" "^7.16.7"
- "@babel/types" "^7.16.7"
+ "@babel/helper-create-class-features-plugin" "^7.22.6"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-replace-supers" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/plugin-syntax-decorators" "^7.22.5"
-"@babel/traverse@^7.7.0":
- version "7.17.9"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d"
- integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==
+"@babel/plugin-syntax-decorators@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz#329fe2907c73de184033775637dbbc507f09116a"
+ integrity sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==
dependencies:
- "@babel/code-frame" "^7.16.7"
- "@babel/generator" "^7.17.9"
- "@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-function-name" "^7.17.9"
- "@babel/helper-hoist-variables" "^7.16.7"
- "@babel/helper-split-export-declaration" "^7.16.7"
- "@babel/parser" "^7.17.9"
- "@babel/types" "^7.17.0"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/runtime@^7.21.0":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438"
+ integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==
+ dependencies:
+ regenerator-runtime "^0.13.11"
+
+"@babel/template@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec"
+ integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==
+ dependencies:
+ "@babel/code-frame" "^7.22.5"
+ "@babel/parser" "^7.22.5"
+ "@babel/types" "^7.22.5"
+
+"@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8":
+ version "7.22.8"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e"
+ integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==
+ dependencies:
+ "@babel/code-frame" "^7.22.5"
+ "@babel/generator" "^7.22.7"
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-function-name" "^7.22.5"
+ "@babel/helper-hoist-variables" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/parser" "^7.22.7"
+ "@babel/types" "^7.22.5"
debug "^4.1.0"
globals "^11.1.0"
-"@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.7.0":
- version "7.17.0"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b"
- integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==
+"@babel/types@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe"
+ integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==
dependencies:
- "@babel/helper-validator-identifier" "^7.16.7"
+ "@babel/helper-string-parser" "^7.22.5"
+ "@babel/helper-validator-identifier" "^7.22.5"
to-fast-properties "^2.0.0"
"@ember-data/rfc395-data@^0.0.4":
@@ -104,67 +295,180 @@
resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843"
integrity sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ==
+"@eslint-community/eslint-utils@^4.2.0":
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
+ integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+ dependencies:
+ eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.4.0":
+ version "4.5.1"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884"
+ integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==
+
+"@eslint/eslintrc@^2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz#82256f164cc9e0b59669efc19d57f8092706841d"
+ integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^9.6.0"
+ globals "^13.19.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
+ strip-json-comments "^3.1.1"
+
+"@eslint/js@8.44.0":
+ version "8.44.0"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af"
+ integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==
+
"@glimmer/env@0.1.7", "@glimmer/env@^0.1.7":
version "0.1.7"
resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07"
integrity sha1-/S0rVakCnGs3psk16MiHGucN+gc=
-"@glimmer/global-context@0.65.4":
- version "0.65.4"
- resolved "https://registry.yarnpkg.com/@glimmer/global-context/-/global-context-0.65.4.tgz#1da1d59dd4260ce912c40e474cd39c2e82de51b8"
- integrity sha512-RSYCPG/uVR5XCDcPREBclncU7R0zkjACbADP+n3FWAH1TfWbXRMDIkvO/ZlwHkjHoCZf6tIM6p5S/MoFzfJEJA==
+"@glimmer/global-context@0.84.3":
+ version "0.84.3"
+ resolved "https://registry.yarnpkg.com/@glimmer/global-context/-/global-context-0.84.3.tgz#f8bf2cda9562716f2ddf3f96837e7559600635c4"
+ integrity sha512-8Oy9Wg5IZxMEeAnVmzD2NkObf89BeHoFSzJgJROE/deutd3rxg83mvlOez4zBBGYwnTb+VGU2LYRpet92egJjA==
dependencies:
"@glimmer/env" "^0.1.7"
-"@glimmer/interfaces@0.65.4":
- version "0.65.4"
- resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.65.4.tgz#d298cc2b12b8ebcf269f39246ca7ab92816f6680"
- integrity sha512-R0kby79tGNKZOojVJa/7y0JH9Eq4SV+L1s6GcZy30QUZ1g1AAGS5XwCIXc9Sc09coGcv//q+6NLeSw7nlx1y4A==
+"@glimmer/interfaces@0.84.3":
+ version "0.84.3"
+ resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.84.3.tgz#629777a4abe373b0785656f6c8d08989f5784805"
+ integrity sha512-dk32ykoNojt0mvEaIW6Vli5MGTbQo58uy3Epj7ahCgTHmWOKuw/0G83f2UmFprRwFx689YTXG38I/vbpltEjzg==
dependencies:
"@simple-dom/interface" "^1.4.0"
-"@glimmer/reference@^0.65.0":
- version "0.65.4"
- resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.65.4.tgz#bbc8becd6a1bf01fc189b6489e27446437194711"
- integrity sha512-yuRVE4qyqrlCndDMrHKDWUbDmGDCjPzsFtlTmxxnhDMJAdQsnr2cRLITHvQRDm1tXfigVvyKnomeuYhRRbBqYQ==
+"@glimmer/reference@^0.84.3":
+ version "0.84.3"
+ resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.84.3.tgz#6420ad9c102633ac83939fd1b2457269d21fb632"
+ integrity sha512-lV+p/aWPVC8vUjmlvYVU7WQJsLh319SdXuAWoX/SE3pq340BJlAJiEcAc6q52y9JNhT57gMwtjMX96W5Xcx/qw==
dependencies:
"@glimmer/env" "^0.1.7"
- "@glimmer/global-context" "0.65.4"
- "@glimmer/interfaces" "0.65.4"
- "@glimmer/util" "0.65.4"
- "@glimmer/validator" "0.65.4"
+ "@glimmer/global-context" "0.84.3"
+ "@glimmer/interfaces" "0.84.3"
+ "@glimmer/util" "0.84.3"
+ "@glimmer/validator" "0.84.3"
-"@glimmer/syntax@^0.65.0":
- version "0.65.4"
- resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.65.4.tgz#49164de5dc9e8b67084ec009bdd865e379d8a971"
- integrity sha512-y+/C3e8w96efk3a/Z5If9o4ztKJwrr8RtDpbhV2J8X+DUsn5ic2N3IIdlThbt/Zn6tkP1K3dY6uaFUx3pGTvVQ==
+"@glimmer/syntax@^0.84.2", "@glimmer/syntax@^0.84.3":
+ version "0.84.3"
+ resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.84.3.tgz#4045a1708cef7fd810cff42fe6deeba40c7286d0"
+ integrity sha512-ioVbTic6ZisLxqTgRBL2PCjYZTFIwobifCustrozRU2xGDiYvVIL0vt25h2c1ioDsX59UgVlDkIK4YTAQQSd2A==
dependencies:
- "@glimmer/interfaces" "0.65.4"
- "@glimmer/util" "0.65.4"
- "@handlebars/parser" "^1.1.0"
- simple-html-tokenizer "^0.5.10"
+ "@glimmer/interfaces" "0.84.3"
+ "@glimmer/util" "0.84.3"
+ "@handlebars/parser" "~2.0.0"
+ simple-html-tokenizer "^0.5.11"
-"@glimmer/util@0.65.4":
- version "0.65.4"
- resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.65.4.tgz#e464145078f3f40da9013ff2590a6016515455d2"
- integrity sha512-aofe+rdBhkREKP2GZta6jy1UcbRRMfWx7M18zxGxspPoeD08NscD04Kx+WiOKXmC1TcrfITr8jvqMfrKrMzYWQ==
+"@glimmer/util@0.84.3":
+ version "0.84.3"
+ resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.84.3.tgz#9ae0166982c0b48aa94b02d6ba8c2c81976ade4b"
+ integrity sha512-qFkh6s16ZSRuu2rfz3T4Wp0fylFj3HBsONGXQcrAdZjdUaIS6v3pNj6mecJ71qRgcym9Hbaq/7/fefIwECUiKw==
dependencies:
"@glimmer/env" "0.1.7"
- "@glimmer/interfaces" "0.65.4"
+ "@glimmer/interfaces" "0.84.3"
"@simple-dom/interface" "^1.4.0"
-"@glimmer/validator@0.65.4", "@glimmer/validator@^0.65.0":
- version "0.65.4"
- resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.65.4.tgz#12c27a9a63706c60e6499fd687940e9d1affb32c"
- integrity sha512-0YUjAyo45DF5JkQxdv5kHn96nMNhvZiEwsAD4Jme0kk5Q9MQcPOUtN76pQAS4f+C6GdF9DeUr2yGXZLFMmb+LA==
+"@glimmer/validator@0.84.3", "@glimmer/validator@^0.84.3":
+ version "0.84.3"
+ resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.84.3.tgz#cd83b7f9ab78953f23cc11a32d83d7f729c54df2"
+ integrity sha512-RTBV4TokUB0vI31UC7ikpV7lOYpWUlyqaKV//pRC4pexYMlmqnVhkFrdiimB/R1XyNdUOQUmnIAcdic39NkbhQ==
dependencies:
"@glimmer/env" "^0.1.7"
- "@glimmer/global-context" "0.65.4"
+ "@glimmer/global-context" "0.84.3"
-"@handlebars/parser@^1.1.0":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-1.1.0.tgz#d6dbc7574774b238114582410e8fee0dc3532bdf"
- integrity sha512-rR7tJoSwJ2eooOpYGxGGW95sLq6GXUaS1UtWvN7pei6n2/okYvCGld9vsUTvkl2migxbkszsycwtMf/GEc1k1A==
+"@handlebars/parser@~2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-2.0.0.tgz#5e8b7298f31ff8f7b260e6b7363c7e9ceed7d9c5"
+ integrity sha512-EP9uEDZv/L5Qh9IWuMUGJRfwhXJ4h1dqKTT4/3+tY0eu7sPis7xh23j61SYUnNF4vqCQvvUXpDo9Bh/+q1zASA==
+
+"@humanwhocodes/config-array@^0.11.10":
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2"
+ integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==
+ dependencies:
+ "@humanwhocodes/object-schema" "^1.2.1"
+ debug "^4.1.1"
+ minimatch "^3.0.5"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/object-schema@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
+ integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
+ integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@3.1.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
+ integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+
+"@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/sourcemap-codec@1.4.14":
+ version "1.4.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
+ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.15":
+ version "1.4.15"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
+"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.18"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6"
+ integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==
+ dependencies:
+ "@jridgewell/resolve-uri" "3.1.0"
+ "@jridgewell/sourcemap-codec" "1.4.14"
+
+"@lint-todo/utils@^13.0.3":
+ version "13.1.0"
+ resolved "https://registry.yarnpkg.com/@lint-todo/utils/-/utils-13.1.0.tgz#bb99b479e357f20fbf5fa200c59cafda2a02f849"
+ integrity sha512-uzcZPIPH7hcs+hKMiHfp58MosJpI9sTTgl1pGYau4zq34q1ppswJ6nLeohv/cDhqEBrHjtvldt8zDnVJXRvBlA==
+ dependencies:
+ "@types/eslint" "^7.2.13"
+ find-up "^5.0.0"
+ fs-extra "^9.1.0"
+ proper-lockfile "^4.1.2"
+ slash "^3.0.0"
+ tslib "^2.4.0"
+ upath "^2.0.1"
+
+"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1":
+ version "5.1.1-v1"
+ resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129"
+ integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==
+ dependencies:
+ eslint-scope "5.1.1"
+
+"@nicolo-ribaudo/semver-v6@^6.3.3":
+ version "6.3.3"
+ resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29"
+ integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@@ -179,7 +483,7 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
-"@nodelib/fs.walk@^1.2.3":
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
version "1.2.8"
resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
@@ -192,17 +496,45 @@
resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f"
integrity sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA==
-acorn-jsx@^5.2.0:
+"@types/eslint@^7.2.13":
+ version "7.29.0"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78"
+ integrity sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==
+ dependencies:
+ "@types/estree" "*"
+ "@types/json-schema" "*"
+
+"@types/estree@*":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194"
+ integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==
+
+"@types/json-schema@*":
+ version "7.0.12"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb"
+ integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
+
+"@types/minimatch@^3.0.3":
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
+ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
+
+"@types/symlink-or-copy@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@types/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#4151a81b4052c80bc2becbae09f3a9ec010a9c7a"
+ integrity sha512-Lja2xYuuf2B3knEsga8ShbOdsfNOtzT73GyJmZyY7eGl2+ajOqrs8yM5ze0fsSoYwvA6bw7/Qr7OZ7PEEmYwWg==
+
+acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-acorn@^7.1.1:
- version "7.4.1"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
- integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+acorn@^8.9.0:
+ version "8.10.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5"
+ integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
-ajv@^6.10.0, ajv@^6.10.2:
+ajv@^6.10.0, ajv@^6.12.4:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -212,24 +544,12 @@ ajv@^6.10.0, ajv@^6.10.2:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-ansi-escapes@^4.2.1:
- version "4.3.2"
- resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
- integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
- dependencies:
- type-fest "^0.21.3"
-
-ansi-regex@^4.1.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed"
- integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==
-
ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
-ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
@@ -243,24 +563,50 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
dependencies:
color-convert "^2.0.1"
-argparse@^1.0.7:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
- integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+aria-query@^5.0.2:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e"
+ integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==
dependencies:
- sprintf-js "~1.0.2"
+ dequal "^2.0.3"
+
+array-buffer-byte-length@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead"
+ integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==
+ dependencies:
+ call-bind "^1.0.2"
+ is-array-buffer "^3.0.1"
+
+array-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+ integrity sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==
array-union@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-astral-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
- integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+async-disk-cache@^1.2.1:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/async-disk-cache/-/async-disk-cache-1.3.5.tgz#cc6206ed79bb6982b878fc52e0505e4f52b62a02"
+ integrity sha512-VZpqfR0R7CEOJZ/0FOTgWq70lCrZyS1rkI8PXugDUkTKyyAUgZ2zQ09gLhMkEn+wN8LYeUTPxZdXtlX/kmbXKQ==
+ dependencies:
+ debug "^2.1.3"
+ heimdalljs "^0.2.3"
+ istextorbinary "2.1.0"
+ mkdirp "^0.5.0"
+ rimraf "^2.5.3"
+ rsvp "^3.0.18"
+ username-sync "^1.0.2"
-async-promise-queue@^1.0.5:
+async-promise-queue@^1.0.3, async-promise-queue@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.5.tgz#cb23bce9fce903a133946a700cc85f27f09ea49d"
integrity sha512-xi0aQ1rrjPWYmqbwr18rrSKbSaXIeIwSd1J4KAgVfkq8utNbdZoht7GfvfY6swFUAMJ9obkc4WPJmtGwl+B8dw==
@@ -275,17 +621,20 @@ async@^2.4.1:
dependencies:
lodash "^4.17.14"
-babel-eslint@^10.1.0:
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
- integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- "@babel/parser" "^7.7.0"
- "@babel/traverse" "^7.7.0"
- "@babel/types" "^7.7.0"
- eslint-visitor-keys "^1.0.0"
- resolve "^1.12.0"
+at-least-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+ integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
+available-typed-arrays@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
+ integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
+
+babel-import-util@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-0.2.0.tgz#b468bb679919601a3570f9e317536c54f2862e23"
+ integrity sha512-CtWYYHU/MgK88rxMrLfkD356dApswtR/kWZ/c6JifG1m10e7tBBrs/366dFzWMAoqYmG5/JSh+94tUSpIwh+ag==
balanced-match@^1.0.0:
version "1.0.2"
@@ -297,6 +646,11 @@ base64-js@^1.3.1:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+"binaryextensions@1 || 2":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.3.0.tgz#1d269cbf7e6243ea886aa41453c3651ccbe13c22"
+ integrity sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==
+
bl@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
@@ -306,6 +660,11 @@ bl@^4.1.0:
inherits "^2.0.4"
readable-stream "^3.4.0"
+blank-object@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/blank-object/-/blank-object-1.0.2.tgz#f990793fbe9a8c8dd013fb3219420bec81d5f4b9"
+ integrity sha512-kXQ19Xhoghiyw66CUiGypnuRpWlbHAzY/+NyvqTEdTfhfQGH1/dbEMYiXju7fYKIFePpzp/y9dsu5Cu/PkmawQ==
+
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -321,6 +680,123 @@ braces@^3.0.2:
dependencies:
fill-range "^7.0.1"
+broccoli-debug@^0.6.5:
+ version "0.6.5"
+ resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.5.tgz#164a5cdafd8936e525e702bf8f91f39d758e2e78"
+ integrity sha512-RIVjHvNar9EMCLDW/FggxFRXqpjhncM/3qq87bn/y+/zR9tqEkHvTqbyOc4QnB97NO2m6342w4wGkemkaeOuWg==
+ dependencies:
+ broccoli-plugin "^1.2.1"
+ fs-tree-diff "^0.5.2"
+ heimdalljs "^0.2.1"
+ heimdalljs-logger "^0.1.7"
+ symlink-or-copy "^1.1.8"
+ tree-sync "^1.2.2"
+
+broccoli-funnel@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz#0edf629569bc10bd02cc525f74b9a38e71366a75"
+ integrity sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ==
+ dependencies:
+ array-equal "^1.0.0"
+ blank-object "^1.0.1"
+ broccoli-plugin "^1.3.0"
+ debug "^2.2.0"
+ fast-ordered-set "^1.0.0"
+ fs-tree-diff "^0.5.3"
+ heimdalljs "^0.2.0"
+ minimatch "^3.0.0"
+ mkdirp "^0.5.0"
+ path-posix "^1.0.0"
+ rimraf "^2.4.3"
+ symlink-or-copy "^1.0.0"
+ walk-sync "^0.3.1"
+
+broccoli-kitchen-sink-helpers@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz#77c7c18194b9664163ec4fcee2793444926e0c06"
+ integrity sha512-gqYnKSJxBSjj/uJqeuRAzYVbmjWhG0mOZ8jrp6+fnUIOgLN6MvI7XxBECDHkYMIFPJ8Smf4xaI066Q2FqQDnXg==
+ dependencies:
+ glob "^5.0.10"
+ mkdirp "^0.5.1"
+
+broccoli-merge-trees@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.2.tgz#f33b451994225522b5c9bcf27d59decfd8ba537d"
+ integrity sha512-ZyPAwrOdlCddduFbsMyyFzJUrvW6b04pMvDiAQZrCwghlvgowJDY+EfoXn+eR1RRA5nmGHJ+B68T63VnpRiT1A==
+ dependencies:
+ broccoli-plugin "^1.3.0"
+ merge-trees "^2.0.0"
+
+broccoli-persistent-filter@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz#4a052e0e0868b344c3a2977e35a3d497aa9eca72"
+ integrity sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g==
+ dependencies:
+ async-disk-cache "^1.2.1"
+ async-promise-queue "^1.0.3"
+ broccoli-plugin "^1.0.0"
+ fs-tree-diff "^2.0.0"
+ hash-for-dep "^1.5.0"
+ heimdalljs "^0.2.1"
+ heimdalljs-logger "^0.1.7"
+ mkdirp "^0.5.1"
+ promise-map-series "^0.2.1"
+ rimraf "^2.6.1"
+ rsvp "^4.7.0"
+ symlink-or-copy "^1.0.1"
+ sync-disk-cache "^1.3.3"
+ walk-sync "^1.0.0"
+
+broccoli-plugin@^1.0.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd"
+ integrity sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ==
+ dependencies:
+ promise-map-series "^0.2.1"
+ quick-temp "^0.1.3"
+ rimraf "^2.3.4"
+ symlink-or-copy "^1.1.8"
+
+broccoli-plugin@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-2.1.0.tgz#2fab6c578219cfcc64f773e9616073313fc8b334"
+ integrity sha512-ElE4caljW4slapyEhSD9jU9Uayc8SoSABWdmY9SqbV8DHNxU6xg1jJsPcMm+cXOvggR3+G+OXAYQeFjWVnznaw==
+ dependencies:
+ promise-map-series "^0.2.1"
+ quick-temp "^0.1.3"
+ rimraf "^2.3.4"
+ symlink-or-copy "^1.1.8"
+
+broccoli-stew@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-3.0.0.tgz#fd1d19d162ad9490b42e5c563b78c26eb1e80b95"
+ integrity sha512-NXfi+Vas24n3Ivo21GvENTI55qxKu7OwKRnCLWXld8MiLiQKQlWIq28eoARaFj0lTUFwUa4jKZeA7fW9PiWQeg==
+ dependencies:
+ broccoli-debug "^0.6.5"
+ broccoli-funnel "^2.0.0"
+ broccoli-merge-trees "^3.0.1"
+ broccoli-persistent-filter "^2.3.0"
+ broccoli-plugin "^2.1.0"
+ chalk "^2.4.1"
+ debug "^4.1.1"
+ ensure-posix-path "^1.0.1"
+ fs-extra "^8.0.1"
+ minimatch "^3.0.4"
+ resolve "^1.11.1"
+ rsvp "^4.8.5"
+ symlink-or-copy "^1.2.0"
+ walk-sync "^1.1.3"
+
+browserslist@^4.21.9:
+ version "4.21.9"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635"
+ integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==
+ dependencies:
+ caniuse-lite "^1.0.30001503"
+ electron-to-chromium "^1.4.431"
+ node-releases "^2.0.12"
+ update-browserslist-db "^1.0.11"
+
buffer@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
@@ -329,12 +805,32 @@ buffer@^5.5.0:
base64-js "^1.3.1"
ieee754 "^1.1.13"
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
callsites@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
-chalk@^2.0.0, chalk@^2.1.0:
+can-symlink@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219"
+ integrity sha512-RbsNrFyhwkx+6psk/0fK/Q9orOUr9VMxohGd8vTa4djf4TGLfblBgUfqZChrZuW0Q+mz2eBPFLusw9Jfukzmhg==
+ dependencies:
+ tmp "0.0.28"
+
+caniuse-lite@^1.0.30001503:
+ version "1.0.30001514"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz#e2a7e184a23affc9367b7c8d734e7ec4628c1309"
+ integrity sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==
+
+chalk@^2.0.0, chalk@^2.4.1:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -351,10 +847,20 @@ chalk@^4.0.0, chalk@^4.1.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-chardet@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
- integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+chalk@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385"
+ integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==
+
+ci-info@^3.8.0:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91"
+ integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==
+
+clean-up-path@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clean-up-path/-/clean-up-path-1.0.0.tgz#de9e8196519912e749c9eaf67c13d64fac72a3e5"
+ integrity sha512-PHGlEF0Z6976qQyN6gM7kKH6EH0RdfZcc8V+QhFe36eRxV0SMH5OUBZG7Bxa9YcreNzyNbK63cGiZxdSZgosRw==
cli-cursor@^3.1.0:
version "3.1.0"
@@ -368,18 +874,13 @@ cli-spinners@^2.5.0:
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d"
integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==
-cli-width@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
- integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
-
-cliui@^7.0.2:
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
- integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
dependencies:
string-width "^4.2.0"
- strip-ansi "^6.0.0"
+ strip-ansi "^6.0.1"
wrap-ansi "^7.0.0"
clone@^1.0.2:
@@ -416,42 +917,60 @@ colors@^1.4.0:
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
-commander@^6.2.1:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
- integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
+commander@^8.3.0:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
+ integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
-cross-spawn@^6.0.5:
- version "6.0.5"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
- integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
- dependencies:
- nice-try "^1.0.4"
- path-key "^2.0.1"
- semver "^5.5.0"
- shebang-command "^1.2.0"
- which "^1.2.9"
+convert-source-map@^1.7.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
+ integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
-debug@^2.6.8:
+cross-spawn@^7.0.2:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+css-tree@^2.0.4:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20"
+ integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==
+ dependencies:
+ mdn-data "2.0.30"
+ source-map-js "^1.0.1"
+
+date-fns@^2.30.0:
+ version "2.30.0"
+ resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0"
+ integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==
+ dependencies:
+ "@babel/runtime" "^7.21.0"
+
+debug@^2.1.3, debug@^2.2.0, debug@^2.6.8:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
-debug@^4.0.1, debug@^4.1.0:
+debug@^4.1.0, debug@^4.1.1, debug@^4.3.2:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
-deep-is@~0.1.3:
+deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
@@ -463,6 +982,19 @@ defaults@^1.0.3:
dependencies:
clone "^1.0.2"
+define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5"
+ integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==
+ dependencies:
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+dequal@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
+ integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
+
dir-glob@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@@ -477,60 +1009,172 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
-ember-rfc176-data@^0.3.11:
- version "0.3.17"
- resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.17.tgz#d4fc6c33abd6ef7b3440c107a28e04417b49860a"
- integrity sha512-EVzTTKqxv9FZbEh6Ktw56YyWRAA0MijKvl7H8C06wVF+8f/cRRz3dXxa4nkwjzyVwx4rzKGuIGq77hxJAQhWWw==
-
-ember-template-lint-plugin-discourse@latest:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ember-template-lint-plugin-discourse/-/ember-template-lint-plugin-discourse-2.0.0.tgz#9805dff60763fae68b5df82b92fb431eb739c13e"
- integrity sha512-2bPz/47OfuYGj4w2RNyDcXCYA/4JtRAXRIsaA6PTm4Uc44exK/GBd4RfT2ywmq0CImvj2kGkqpuUgkAtVf6aZQ==
-
-ember-template-lint@^2.11.0:
- version "2.21.0"
- resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-2.21.0.tgz#7e120abf309a8810eeed26c52377943faf15a95b"
- integrity sha512-19QbEqJQdMfcRS7PsQsubflRowEtnkbD0tpYR4q/xq4lodmhU7hhOFvlTQgbxD/jwW5Ur+tkOwH4KFy9JwOyXA==
+dot-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751"
+ integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==
dependencies:
- chalk "^4.0.0"
- ember-template-recast "^5.0.1"
- find-up "^5.0.0"
- fuse.js "^6.4.6"
- get-stdin "^8.0.0"
- globby "^11.0.2"
- is-glob "^4.0.1"
- micromatch "^4.0.2"
- resolve "^1.20.0"
- v8-compile-cache "^2.2.0"
- yargs "^16.2.0"
+ no-case "^3.0.4"
+ tslib "^2.0.3"
-ember-template-recast@^5.0.1:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/ember-template-recast/-/ember-template-recast-5.0.3.tgz#79df27a70bdce7be17f14db13886afde1e9d02d6"
- integrity sha512-qsJYQhf29Dk6QMfviXhUPE+byMOs6iRQxUDHgkj8yqjeppvjHaFG96hZi/NAXJTm/M7o3PpfF5YlmeaKtI9UeQ==
+editions@^1.1.1:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b"
+ integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==
+
+electron-to-chromium@^1.4.431:
+ version "1.4.454"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz#774dc7cb5e58576d0125939ec34a4182f3ccc87d"
+ integrity sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==
+
+ember-cli-babel-plugin-helpers@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879"
+ integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw==
+
+ember-cli-version-checker@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-5.1.2.tgz#649c7b6404902e3b3d69c396e054cea964911ab0"
+ integrity sha512-rk7GY+FmLn/2e22HsZs0Ycrz8HQ1W3Fv+2TFOuEFW9optnDXDgkntPBIl6gact/LHsfBM5RKbM3dHsIIeLgl0Q==
dependencies:
- "@glimmer/reference" "^0.65.0"
- "@glimmer/syntax" "^0.65.0"
- "@glimmer/validator" "^0.65.0"
+ resolve-package-path "^3.1.0"
+ semver "^7.3.4"
+ silent-error "^1.1.1"
+
+ember-rfc176-data@^0.3.15:
+ version "0.3.18"
+ resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.18.tgz#bb6fdcef49999981317ea81b6cc9210fb4108d65"
+ integrity sha512-JtuLoYGSjay1W3MQAxt3eINWXNYYQliK90tLwtb8aeCuQK8zKGCRbBodVIrkcTqshULMnRuTOS6t1P7oQk3g6Q==
+
+ember-template-imports@^3.4.1, ember-template-imports@^3.4.2:
+ version "3.4.2"
+ resolved "https://registry.yarnpkg.com/ember-template-imports/-/ember-template-imports-3.4.2.tgz#6cf7de7d4b8348a0fddf3aaec4947aa1211289e6"
+ integrity sha512-OS8TUVG2kQYYwP3netunLVfeijPoOKIs1SvPQRTNOQX4Pu8xGGBEZmrv0U1YTnQn12Eg+p6w/0UdGbUnITjyzw==
+ dependencies:
+ babel-import-util "^0.2.0"
+ broccoli-stew "^3.0.0"
+ ember-cli-babel-plugin-helpers "^1.1.1"
+ ember-cli-version-checker "^5.1.2"
+ line-column "^1.0.2"
+ magic-string "^0.25.7"
+ parse-static-imports "^1.1.0"
+ string.prototype.matchall "^4.0.6"
+ validate-peer-dependencies "^1.1.0"
+
+ember-template-lint-plugin-discourse@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ember-template-lint-plugin-discourse/-/ember-template-lint-plugin-discourse-3.0.0.tgz#9212226e4d2f6dce2e35b480aaf240067d736246"
+ integrity sha512-4zi/qN+vXs0ZpJZrwdMfZ5hMThJbeVCFdof6iek4PmgIJhnlA0lzqIa1BrKpSKhr3ckd5K0rUMNcCAm0uKNOtg==
+
+ember-template-lint@^5.10.3:
+ version "5.11.0"
+ resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-5.11.0.tgz#539ed054a9040066fd2ad2a81ffb391e8b96ce71"
+ integrity sha512-uoVz4IAFRyg3JnMTL+SDtZkHPZM6O1qhvvgcb7LD6325W6asjPZGF1YHDyxnssEOnCSVsu1S5bk77tqE5NnyNg==
+ dependencies:
+ "@lint-todo/utils" "^13.0.3"
+ aria-query "^5.0.2"
+ chalk "^5.2.0"
+ ci-info "^3.8.0"
+ date-fns "^2.30.0"
+ ember-template-imports "^3.4.2"
+ ember-template-recast "^6.1.4"
+ eslint-formatter-kakoune "^1.0.0"
+ find-up "^6.3.0"
+ fuse.js "^6.5.3"
+ get-stdin "^9.0.0"
+ globby "^13.2.0"
+ is-glob "^4.0.3"
+ language-tags "^1.0.8"
+ micromatch "^4.0.5"
+ resolve "^1.22.3"
+ v8-compile-cache "^2.3.0"
+ yargs "^17.7.2"
+
+ember-template-recast@^6.1.4:
+ version "6.1.4"
+ resolved "https://registry.yarnpkg.com/ember-template-recast/-/ember-template-recast-6.1.4.tgz#e964c184adfd876878009f8aa0b84c95633fce20"
+ integrity sha512-fCh+rOK6z+/tsdkTbOE+e7f84P6ObnIRQrCCrnu21E4X05hPeradikIkRMhJdxn4NWrxitfZskQDd37TR/lsNQ==
+ dependencies:
+ "@glimmer/reference" "^0.84.3"
+ "@glimmer/syntax" "^0.84.3"
+ "@glimmer/validator" "^0.84.3"
async-promise-queue "^1.0.5"
colors "^1.4.0"
- commander "^6.2.1"
+ commander "^8.3.0"
globby "^11.0.3"
ora "^5.4.0"
slash "^3.0.0"
tmp "^0.2.1"
- workerpool "^6.1.4"
-
-emoji-regex@^7.0.1:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
- integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+ workerpool "^6.4.0"
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+ensure-posix-path@^1.0.0, ensure-posix-path@^1.0.1, ensure-posix-path@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz#3c62bdb19fa4681544289edb2b382adc029179ce"
+ integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==
+
+es-abstract@^1.19.0, es-abstract@^1.20.4:
+ version "1.21.2"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff"
+ integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==
+ dependencies:
+ array-buffer-byte-length "^1.0.0"
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ es-set-tostringtag "^2.0.1"
+ es-to-primitive "^1.2.1"
+ function.prototype.name "^1.1.5"
+ get-intrinsic "^1.2.0"
+ get-symbol-description "^1.0.0"
+ globalthis "^1.0.3"
+ gopd "^1.0.1"
+ has "^1.0.3"
+ has-property-descriptors "^1.0.0"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.5"
+ is-array-buffer "^3.0.2"
+ is-callable "^1.2.7"
+ is-negative-zero "^2.0.2"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.2"
+ is-string "^1.0.7"
+ is-typed-array "^1.1.10"
+ is-weakref "^1.0.2"
+ object-inspect "^1.12.3"
+ object-keys "^1.1.1"
+ object.assign "^4.1.4"
+ regexp.prototype.flags "^1.4.3"
+ safe-regex-test "^1.0.0"
+ string.prototype.trim "^1.2.7"
+ string.prototype.trimend "^1.0.6"
+ string.prototype.trimstart "^1.0.6"
+ typed-array-length "^1.0.4"
+ unbox-primitive "^1.0.2"
+ which-typed-array "^1.1.9"
+
+es-set-tostringtag@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8"
+ integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==
+ dependencies:
+ get-intrinsic "^1.1.3"
+ has "^1.0.3"
+ has-tostringtag "^1.0.0"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
@@ -541,20 +1185,34 @@ escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
-eslint-config-discourse@^1.1.8:
- version "1.1.9"
- resolved "https://registry.yarnpkg.com/eslint-config-discourse/-/eslint-config-discourse-1.1.9.tgz#9a5ee6b3a4b986e5243f517e7945d1709c4e22df"
- integrity sha512-a4KG+/9/7ZhYVV0URGK70K7QtxlydYKjie0ZssHEGxl2auOUTDcdRMBfZQBtIxQr9X8TF0+eeUUsScBXNU6xZw==
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-config-discourse@^3.4.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-discourse/-/eslint-config-discourse-3.5.0.tgz#528db8a5b64e5d0aa96d958a50f9d75456c91e4e"
+ integrity sha512-IwxNmfyomRKrMCP3dsgxEepKYv/QW5tcLi/NRv7hl06uRK5o+a8QvrFjFiC+KfYcNRQhTQA4So+YwXSrVpCk0A==
dependencies:
- babel-eslint "^10.1.0"
- ember-template-lint "^2.11.0"
- ember-template-lint-plugin-discourse latest
- eslint "^6.8.0"
+ "@babel/core" "^7.22.5"
+ "@babel/eslint-parser" "^7.22.5"
+ "@babel/plugin-proposal-decorators" "^7.22.5"
+ ember-template-imports "^3.4.1"
+ ember-template-lint "^5.10.3"
+ ember-template-lint-plugin-discourse "^3.0.0"
+ eslint "^8.43.0"
eslint-plugin-discourse-ember latest
- eslint-plugin-ember "^6.10.0"
+ eslint-plugin-ember "^11.8.0"
eslint-plugin-lodash "^7.1.0"
- eslint-plugin-node "^8.0.0"
- prettier "2.2.1"
+ eslint-plugin-node "^11.1.0"
+ eslint-plugin-sort-class-members "^1.18.0"
+ prettier "2.8.8"
+
+eslint-formatter-kakoune@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-formatter-kakoune/-/eslint-formatter-kakoune-1.0.0.tgz#a95cc4fe1fbc06b84e0f2397e83f5f0b68340125"
+ integrity sha512-Uk/TVLt6Nf6Xoz7C1iYuZjOSdJxe5aaauGRke8JhKeJwD66Y61/pY2FjtLP04Ooq9PwV34bzrkKkU2UZ5FtDRA==
eslint-plugin-discourse-ember@latest:
version "0.0.3"
@@ -563,22 +1221,32 @@ eslint-plugin-discourse-ember@latest:
dependencies:
requireindex "~1.1.0"
-eslint-plugin-ember@^6.10.0:
- version "6.10.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-6.10.1.tgz#ca7a5cc28b91a247c31b1686421a66281467f238"
- integrity sha512-RZI0+UoR4xeD6UE3KQCUwbN2nZOIIPaFCCXqBIRXDr0rFuwvknAHqYtDPJVZicvTzNHa4TEZvAKqfbE8t7SztQ==
+eslint-plugin-ember@^11.8.0:
+ version "11.10.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-11.10.0.tgz#46a696ebabcfefcf8212eb0eb2b11d61360c70fc"
+ integrity sha512-/5VanfpfzIdmWgXWyQ6ylAJWITu8mXivRce06h0uoifVpUoGaBdAkwuto/PLGfDxWdi43xWUFLb5Tpkhx2MoFg==
dependencies:
"@ember-data/rfc395-data" "^0.0.4"
- ember-rfc176-data "^0.3.11"
- snake-case "^2.1.0"
+ "@glimmer/syntax" "^0.84.2"
+ css-tree "^2.0.4"
+ ember-rfc176-data "^0.3.15"
+ ember-template-imports "^3.4.2"
+ ember-template-recast "^6.1.4"
+ eslint-utils "^3.0.0"
+ estraverse "^5.2.0"
+ lodash.camelcase "^4.1.1"
+ lodash.kebabcase "^4.1.1"
+ magic-string "^0.30.0"
+ requireindex "^1.2.0"
+ snake-case "^3.0.3"
-eslint-plugin-es@^1.3.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz#12acae0f4953e76ba444bfd1b2271081ac620998"
- integrity sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==
+eslint-plugin-es@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893"
+ integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==
dependencies:
- eslint-utils "^1.4.2"
- regexpp "^2.0.1"
+ eslint-utils "^2.0.0"
+ regexpp "^3.0.0"
eslint-plugin-lodash@^7.1.0:
version "7.4.0"
@@ -587,19 +1255,24 @@ eslint-plugin-lodash@^7.1.0:
dependencies:
lodash "^4.17.21"
-eslint-plugin-node@^8.0.0:
- version "8.0.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz#55ae3560022863d141fa7a11799532340a685964"
- integrity sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w==
+eslint-plugin-node@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d"
+ integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==
dependencies:
- eslint-plugin-es "^1.3.1"
- eslint-utils "^1.3.1"
- ignore "^5.0.2"
+ eslint-plugin-es "^3.0.0"
+ eslint-utils "^2.0.0"
+ ignore "^5.1.1"
minimatch "^3.0.4"
- resolve "^1.8.1"
- semver "^5.5.0"
+ resolve "^1.10.1"
+ semver "^6.1.0"
-eslint-scope@^5.0.0:
+eslint-plugin-sort-class-members@^1.18.0:
+ version "1.18.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-sort-class-members/-/eslint-plugin-sort-class-members-1.18.0.tgz#561746eb30abc4e8bb8d582d359c652299e450d8"
+ integrity sha512-y4r5OC3LJNHJZCWfVwFnnRiNrQ/LRf7Pb1wD6/CP8Y4qmUvjtmkwrLvyY755p8SFTOOXVd33HgFuF3XxVW1xbg==
+
+eslint-scope@5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@@ -607,79 +1280,101 @@ eslint-scope@^5.0.0:
esrecurse "^4.3.0"
estraverse "^4.1.1"
-eslint-utils@^1.3.1, eslint-utils@^1.4.2, eslint-utils@^1.4.3:
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
- integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
+eslint-scope@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b"
+ integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-utils@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
+ integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
dependencies:
eslint-visitor-keys "^1.1.0"
-eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
+eslint-utils@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
+ integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
+ dependencies:
+ eslint-visitor-keys "^2.0.0"
+
+eslint-visitor-keys@^1.1.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
-eslint@^6.8.0:
- version "6.8.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb"
- integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==
+eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
+ integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
+
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994"
+ integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==
+
+eslint@^8.43.0:
+ version "8.44.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.44.0.tgz#51246e3889b259bbcd1d7d736a0c10add4f0e500"
+ integrity sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==
dependencies:
- "@babel/code-frame" "^7.0.0"
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.4.0"
+ "@eslint/eslintrc" "^2.1.0"
+ "@eslint/js" "8.44.0"
+ "@humanwhocodes/config-array" "^0.11.10"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@nodelib/fs.walk" "^1.2.8"
ajv "^6.10.0"
- chalk "^2.1.0"
- cross-spawn "^6.0.5"
- debug "^4.0.1"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
doctrine "^3.0.0"
- eslint-scope "^5.0.0"
- eslint-utils "^1.4.3"
- eslint-visitor-keys "^1.1.0"
- espree "^6.1.2"
- esquery "^1.0.1"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^7.2.0"
+ eslint-visitor-keys "^3.4.1"
+ espree "^9.6.0"
+ esquery "^1.4.2"
esutils "^2.0.2"
- file-entry-cache "^5.0.1"
- functional-red-black-tree "^1.0.1"
- glob-parent "^5.0.0"
- globals "^12.1.0"
- ignore "^4.0.6"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^6.0.1"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ globals "^13.19.0"
+ graphemer "^1.4.0"
+ ignore "^5.2.0"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
- inquirer "^7.0.0"
is-glob "^4.0.0"
- js-yaml "^3.13.1"
+ is-path-inside "^3.0.3"
+ js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.3.0"
- lodash "^4.17.14"
- minimatch "^3.0.4"
- mkdirp "^0.5.1"
+ levn "^0.4.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
natural-compare "^1.4.0"
- optionator "^0.8.3"
- progress "^2.0.0"
- regexpp "^2.0.1"
- semver "^6.1.2"
- strip-ansi "^5.2.0"
- strip-json-comments "^3.0.1"
- table "^5.2.3"
+ optionator "^0.9.3"
+ strip-ansi "^6.0.1"
+ strip-json-comments "^3.1.0"
text-table "^0.2.0"
- v8-compile-cache "^2.0.3"
-espree@^6.1.2:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a"
- integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==
+espree@^9.6.0:
+ version "9.6.0"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.0.tgz#80869754b1c6560f32e3b6929194a3fe07c5b82f"
+ integrity sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==
dependencies:
- acorn "^7.1.1"
- acorn-jsx "^5.2.0"
- eslint-visitor-keys "^1.1.0"
+ acorn "^8.9.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.4.1"
-esprima@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
- integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-
-esquery@^1.0.1:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
- integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
+esquery@^1.4.2:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
+ integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
dependencies:
estraverse "^5.1.0"
@@ -705,16 +1400,7 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
-external-editor@^3.0.3:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
- integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
- dependencies:
- chardet "^0.7.0"
- iconv-lite "^0.4.24"
- tmp "^0.0.33"
-
-fast-deep-equal@^3.1.1:
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
@@ -730,15 +1416,33 @@ fast-glob@^3.2.9:
merge2 "^1.3.0"
micromatch "^4.0.4"
+fast-glob@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0"
+ integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
-fast-levenshtein@~2.0.6:
+fast-levenshtein@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
- integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fast-ordered-set@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/fast-ordered-set/-/fast-ordered-set-1.0.3.tgz#3fbb36634f7be79e4f7edbdb4a357dee25d184eb"
+ integrity sha512-MxBW4URybFszOx1YlACEoK52P6lE3xiFcPaGCUZ7QQOZ6uJXKo++Se8wa31SjcZ+NC/fdAWX7UtKEfaGgHS2Vg==
+ dependencies:
+ blank-object "^1.0.1"
fastq@^1.6.0:
version "1.13.0"
@@ -747,19 +1451,12 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
-figures@^3.0.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
- integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
+file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
dependencies:
- escape-string-regexp "^1.0.5"
-
-file-entry-cache@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
- integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
- dependencies:
- flat-cache "^2.0.1"
+ flat-cache "^3.0.4"
fill-range@^7.0.1:
version "7.0.1"
@@ -776,19 +1473,84 @@ find-up@^5.0.0:
locate-path "^6.0.0"
path-exists "^4.0.0"
-flat-cache@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
- integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
+find-up@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790"
+ integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==
dependencies:
- flatted "^2.0.0"
- rimraf "2.6.3"
- write "1.0.3"
+ locate-path "^7.1.0"
+ path-exists "^5.0.0"
-flatted@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
- integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
+flat-cache@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
+ integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+ dependencies:
+ flatted "^3.1.0"
+ rimraf "^3.0.2"
+
+flatted@^3.1.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
+ integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+fs-extra@^8.0.1:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+ integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
+ integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
+ dependencies:
+ at-least-node "^1.0.0"
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.6:
+ version "0.5.9"
+ resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946"
+ integrity sha512-872G8ax0kHh01m9n/2KDzgYwouKza0Ad9iFltBpNykvROvf2AGtoOzPJgGx125aolGPER3JuC7uZFrQ7bG1AZw==
+ dependencies:
+ heimdalljs-logger "^0.1.7"
+ object-assign "^4.1.0"
+ path-posix "^1.0.0"
+ symlink-or-copy "^1.1.8"
+
+fs-tree-diff@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-2.0.1.tgz#343e4745ab435ec39ebac5f9059ad919cd034afa"
+ integrity sha512-x+CfAZ/lJHQqwlD64pYM5QxWjzWhSjroaVsr8PW831zOApL55qPibed0c+xebaLWVr2BnHFoHdrwOv8pzt8R5A==
+ dependencies:
+ "@types/symlink-or-copy" "^1.2.0"
+ heimdalljs-logger "^0.1.7"
+ object-assign "^4.1.0"
+ path-posix "^1.0.0"
+ symlink-or-copy "^1.1.8"
+
+fs-updater@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/fs-updater/-/fs-updater-1.0.4.tgz#2329980f99ae9176e9a0e84f7637538a182ce63b"
+ integrity sha512-0pJX4mJF/qLsNEwTct8CdnnRdagfb+LmjRPJ8sO+nCnAZLW0cTmz4rTgU25n+RvTuWSITiLKrGVJceJPBIPlKg==
+ dependencies:
+ can-symlink "^1.0.0"
+ clean-up-path "^1.0.0"
+ heimdalljs "^0.2.5"
+ heimdalljs-logger "^0.1.9"
+ rimraf "^2.6.2"
fs.realpath@^1.0.0:
version "1.0.0"
@@ -800,33 +1562,84 @@ function-bind@^1.1.1:
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
-functional-red-black-tree@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
- integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+function.prototype.name@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621"
+ integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.0"
+ functions-have-names "^1.2.2"
-fuse.js@^6.4.6:
- version "6.5.3"
- resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.5.3.tgz#7446c0acbc4ab0ab36fa602e97499bdb69452b93"
- integrity sha512-sA5etGE7yD/pOqivZRBvUBd/NaL2sjAu6QuSaFoe1H2BrJSkH/T/UXAJ8CdXdw7DvY3Hs8CXKYkDWX7RiP5KOg==
+functions-have-names@^1.2.2, functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+fuse.js@^6.5.3:
+ version "6.6.2"
+ resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.6.2.tgz#fe463fed4b98c0226ac3da2856a415576dc9a111"
+ integrity sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
get-caller-file@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-get-stdin@^8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53"
- integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82"
+ integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
-glob-parent@^5.0.0, glob-parent@^5.1.2:
+get-stdin@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575"
+ integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==
+
+get-symbol-description@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
+ integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+glob-parent@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob@^5.0.10:
+ version "5.0.15"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+ integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==
+ dependencies:
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "2 || 3"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
glob@^7.1.3:
version "7.2.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
@@ -844,14 +1657,21 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-globals@^12.1.0:
- version "12.4.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
- integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
+globals@^13.19.0:
+ version "13.20.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82"
+ integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==
dependencies:
- type-fest "^0.8.1"
+ type-fest "^0.20.2"
-globby@^11.0.2, globby@^11.0.3:
+globalthis@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf"
+ integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
+ dependencies:
+ define-properties "^1.1.3"
+
+globby@^11.0.3:
version "11.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
@@ -863,6 +1683,39 @@ globby@^11.0.2, globby@^11.0.3:
merge2 "^1.4.1"
slash "^3.0.0"
+globby@^13.2.0:
+ version "13.2.2"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592"
+ integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==
+ dependencies:
+ dir-glob "^3.0.1"
+ fast-glob "^3.3.0"
+ ignore "^5.2.4"
+ merge2 "^1.4.1"
+ slash "^4.0.0"
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+graphemer@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
+ integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@@ -873,6 +1726,30 @@ has-flag@^4.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+has-property-descriptors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
+ integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+ dependencies:
+ get-intrinsic "^1.1.1"
+
+has-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
+ integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
has@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
@@ -880,29 +1757,49 @@ has@^1.0.3:
dependencies:
function-bind "^1.1.1"
-iconv-lite@^0.4.24:
- version "0.4.24"
- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
- integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+hash-for-dep@^1.5.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.5.1.tgz#497754b39bee2f1c4ade4521bfd2af0a7c1196e3"
+ integrity sha512-/dQ/A2cl7FBPI2pO0CANkvuuVi/IFS5oTyJ0PsOb6jW6WbVW1js5qJXMJTNbWHXBIPdFTWFbabjB+mE0d+gelw==
dependencies:
- safer-buffer ">= 2.1.2 < 3"
+ broccoli-kitchen-sink-helpers "^0.3.1"
+ heimdalljs "^0.2.3"
+ heimdalljs-logger "^0.1.7"
+ path-root "^0.1.1"
+ resolve "^1.10.0"
+ resolve-package-path "^1.0.11"
+
+heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9:
+ version "0.1.10"
+ resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.10.tgz#90cad58aabb1590a3c7e640ddc6a4cd3a43faaf7"
+ integrity sha512-pO++cJbhIufVI/fmB/u2Yty3KJD0TqNPecehFae0/eps0hkZ3b4Zc/PezUMOpYuHFQbA7FxHZxa305EhmjLj4g==
+ dependencies:
+ debug "^2.2.0"
+ heimdalljs "^0.2.6"
+
+heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3, heimdalljs@^0.2.5, heimdalljs@^0.2.6:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.2.6.tgz#b0eebabc412813aeb9542f9cc622cb58dbdcd9fe"
+ integrity sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA==
+ dependencies:
+ rsvp "~3.2.1"
ieee754@^1.1.13:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
-ignore@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
- integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+ignore@^5.1.1, ignore@^5.2.4:
+ version "5.2.4"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
+ integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
-ignore@^5.0.2, ignore@^5.2.0:
+ignore@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
-import-fresh@^3.0.0:
+import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
@@ -928,48 +1825,69 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-inquirer@^7.0.0:
- version "7.3.3"
- resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003"
- integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==
+internal-slot@^1.0.3, internal-slot@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986"
+ integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==
dependencies:
- ansi-escapes "^4.2.1"
- chalk "^4.1.0"
- cli-cursor "^3.1.0"
- cli-width "^3.0.0"
- external-editor "^3.0.3"
- figures "^3.0.0"
- lodash "^4.17.19"
- mute-stream "0.0.8"
- run-async "^2.4.0"
- rxjs "^6.6.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
- through "^2.3.6"
+ get-intrinsic "^1.2.0"
+ has "^1.0.3"
+ side-channel "^1.0.4"
-is-core-module@^2.8.1:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
- integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
+is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe"
+ integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.0"
+ is-typed-array "^1.1.10"
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-core-module@^2.11.0, is-core-module@^2.12.0:
+ version "2.12.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd"
+ integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==
dependencies:
has "^1.0.3"
+is-date-object@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
-is-fullwidth-code-point@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
- integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
-
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-is-glob@^4.0.0, is-glob@^4.0.1:
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
@@ -981,33 +1899,117 @@ is-interactive@^1.0.0:
resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
+is-negative-zero@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
+ integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+is-path-inside@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-shared-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
+ integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.10, is-typed-array@^1.1.9:
+ version "1.1.10"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f"
+ integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+
is-unicode-supported@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+is-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+isarray@1.0.0, isarray@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==
+ dependencies:
+ isarray "1.0.0"
+
+istextorbinary@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.1.0.tgz#dbed2a6f51be2f7475b68f89465811141b758874"
+ integrity sha512-kT1g2zxZ5Tdabtpp9VSdOzW9lb6LXImyWbzbQeTxoRtHhurC9Ej9Wckngr2+uepPL09ky/mJHmN9jeJPML5t6A==
+ dependencies:
+ binaryextensions "1 || 2"
+ editions "^1.1.1"
+ textextensions "1 || 2"
+
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-js-yaml@^3.13.1:
- version "3.14.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
- integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
dependencies:
- argparse "^1.0.7"
- esprima "^4.0.0"
+ argparse "^2.0.1"
jsesc@^2.5.1:
version "2.5.2"
@@ -1024,13 +2026,54 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
-levn@^0.3.0, levn@~0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
- integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
+json5@^2.2.2:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
dependencies:
- prelude-ls "~1.1.2"
- type-check "~0.3.2"
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+language-subtag-registry@^0.3.20:
+ version "0.3.22"
+ resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d"
+ integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==
+
+language-tags@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.8.tgz#042b4bdb0d4e771a9f8cc2fdc9bb26a52a367312"
+ integrity sha512-aWAZwgPLS8hJ20lNPm9HNVs4inexz6S2sQa3wx/+ycuutMNE5/IfYxiWYBbi+9UWCQVaXYCOPUl6gFrPR7+jGg==
+ dependencies:
+ language-subtag-registry "^0.3.20"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+line-column@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2"
+ integrity sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww==
+ dependencies:
+ isarray "^1.0.0"
+ isobject "^2.0.0"
locate-path@^6.0.0:
version "6.0.0"
@@ -1039,7 +2082,29 @@ locate-path@^6.0.0:
dependencies:
p-locate "^5.0.0"
-lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21:
+locate-path@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a"
+ integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==
+ dependencies:
+ p-locate "^6.0.0"
+
+lodash.camelcase@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+ integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
+
+lodash.kebabcase@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
+ integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash@^4.17.14, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -1052,22 +2117,72 @@ log-symbols@^4.1.0:
chalk "^4.1.0"
is-unicode-supported "^0.1.0"
-lower-case@^1.1.1:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
- integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
+lower-case@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28"
+ integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==
+ dependencies:
+ tslib "^2.0.3"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
lru-cache@^7.4.0:
version "7.8.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.8.1.tgz#68ee3f4807a57d2ba185b7fd90827d5c21ce82bb"
integrity sha512-E1v547OCgJvbvevfjgK9sNKIVXO96NnsTsFPBlg4ZxjhsJSODoH9lk8Bm0OxvHNm6Vm5Yqkl/1fErDxhYL8Skg==
+magic-string@^0.25.7:
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c"
+ integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==
+ dependencies:
+ sourcemap-codec "^1.4.8"
+
+magic-string@^0.30.0:
+ version "0.30.1"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.1.tgz#ce5cd4b0a81a5d032bd69aab4522299b2166284d"
+ integrity sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.4.15"
+
+matcher-collection@^1.0.0, matcher-collection@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.1.2.tgz#1076f506f10ca85897b53d14ef54f90a5c426838"
+ integrity sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g==
+ dependencies:
+ minimatch "^3.0.2"
+
+mdn-data@2.0.30:
+ version "2.0.30"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc"
+ integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==
+
+merge-trees@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-trees/-/merge-trees-2.0.0.tgz#a560d796e566c5d9b2c40472a2967cca48d85161"
+ integrity sha512-5xBbmqYBalWqmhYm51XlohhkmVOua3VAUrrWh8t9iOkaLpS6ifqm/UVuUjQCeDVJ9Vx3g2l6ihfkbLSTeKsHbw==
+ dependencies:
+ fs-updater "^1.0.4"
+ heimdalljs "^0.2.5"
+
merge2@^1.3.0, merge2@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-micromatch@^4.0.2, micromatch@^4.0.4:
+micromatch@^4.0.4, micromatch@^4.0.5:
version "4.0.5"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
@@ -1080,7 +2195,7 @@ mimic-fn@^2.1.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-minimatch@^3.0.4:
+"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@@ -1092,13 +2207,18 @@ minimist@^1.2.6:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
-mkdirp@^0.5.1:
+mkdirp@^0.5.0, mkdirp@^0.5.1:
version "0.5.6"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
dependencies:
minimist "^1.2.6"
+mktemp@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b"
+ integrity sha512-IXnMcJ6ZyTuhRmJSjzvHSRhlVPiN9Jwc6e59V0bEJ0ba6OBeX2L0E+mRN1QseeOF4mM+F1Rit6Nh7o+rl2Yn/A==
+
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -1109,27 +2229,48 @@ ms@2.1.2:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-mute-stream@0.0.8:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
- integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
-
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
-nice-try@^1.0.4:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
- integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
-
-no-case@^2.2.0:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
- integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==
+no-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d"
+ integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==
dependencies:
- lower-case "^1.1.1"
+ lower-case "^2.0.2"
+ tslib "^2.0.3"
+
+node-releases@^2.0.12:
+ version "2.0.13"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d"
+ integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==
+
+object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.12.3, object-inspect@^1.9.0:
+ version "1.12.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
+ integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.4:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f"
+ integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
once@^1.3.0:
version "1.4.0"
@@ -1145,17 +2286,17 @@ onetime@^5.1.0:
dependencies:
mimic-fn "^2.1.0"
-optionator@^0.8.3:
- version "0.8.3"
- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
- integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+optionator@^0.9.3:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
+ integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
dependencies:
- deep-is "~0.1.3"
- fast-levenshtein "~2.0.6"
- levn "~0.3.0"
- prelude-ls "~1.1.2"
- type-check "~0.3.2"
- word-wrap "~1.2.3"
+ "@aashutoshrathi/word-wrap" "^1.2.3"
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
ora@^5.4.0:
version "5.4.1"
@@ -1172,10 +2313,10 @@ ora@^5.4.0:
strip-ansi "^6.0.0"
wcwidth "^1.0.1"
-os-tmpdir@~1.0.2:
+os-tmpdir@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
- integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+ integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
p-limit@^3.0.2:
version "3.1.0"
@@ -1184,6 +2325,13 @@ p-limit@^3.0.2:
dependencies:
yocto-queue "^0.1.0"
+p-limit@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644"
+ integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==
+ dependencies:
+ yocto-queue "^1.0.0"
+
p-locate@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
@@ -1191,6 +2339,13 @@ p-locate@^5.0.0:
dependencies:
p-limit "^3.0.2"
+p-locate@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f"
+ integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==
+ dependencies:
+ p-limit "^4.0.0"
+
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -1198,50 +2353,93 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
+parse-static-imports@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/parse-static-imports/-/parse-static-imports-1.1.0.tgz#ae2f18f18da1a993080ae406a5219455c0bbad5d"
+ integrity sha512-HlxrZcISCblEV0lzXmAHheH/8qEkKgmqkdxyHTPbSqsTUV8GzqmN1L+SSti+VbNPfbBO3bYLPHDiUs2avbAdbA==
+
path-exists@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+path-exists@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7"
+ integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==
+
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
-path-key@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
- integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+path-posix@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f"
+ integrity sha512-1gJ0WpNIiYcQydgg3Ed8KzvIqTsDpNwq+cjBCssvBtuTWjEqY1AW+i+OepiEMqDCzyro9B2sLAe4RBPajMYFiA==
+
+path-root-regex@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
+ integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==
+
+path-root@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
+ integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==
+ dependencies:
+ path-root-regex "^0.1.0"
+
path-type@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-prelude-ls@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
- integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
-prettier@2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5"
- integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==
+prettier@2.8.8:
+ version "2.8.8"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
+ integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
-progress@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+promise-map-series@^0.2.1:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.2.3.tgz#c2d377afc93253f6bd03dbb77755eb88ab20a847"
+ integrity sha512-wx9Chrutvqu1N/NHzTayZjE1BgIwt6SJykQoCOic4IZ9yUDjKyVYrpLa/4YCNsV61eRENfs29hrEquVuB13Zlw==
+ dependencies:
+ rsvp "^3.0.14"
+
+proper-lockfile@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f"
+ integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==
+ dependencies:
+ graceful-fs "^4.2.4"
+ retry "^0.12.0"
+ signal-exit "^3.0.2"
punycode@^2.1.0:
version "2.1.1"
@@ -1253,6 +2451,15 @@ queue-microtask@^1.2.2:
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+quick-temp@^0.1.3, quick-temp@^0.1.5:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/quick-temp/-/quick-temp-0.1.8.tgz#bab02a242ab8fb0dd758a3c9776b32f9a5d94408"
+ integrity sha512-YsmIFfD9j2zaFwJkzI6eMG7y0lQP7YeWzgtFgNl38pGWZBSXJooZbOWwkcRot7Vt0Fg9L23pX0tqWU3VvLDsiA==
+ dependencies:
+ mktemp "~0.4.0"
+ rimraf "^2.5.4"
+ underscore.string "~3.3.4"
+
readable-stream@^3.4.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
@@ -1262,16 +2469,35 @@ readable-stream@^3.4.0:
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
-regexpp@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
- integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
+regenerator-runtime@^0.13.11:
+ version "0.13.11"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
+ integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
+
+regexp.prototype.flags@^1.4.3:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb"
+ integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ functions-have-names "^1.2.3"
+
+regexpp@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
+ integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+requireindex@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef"
+ integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==
+
requireindex@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162"
@@ -1282,12 +2508,37 @@ resolve-from@^4.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
-resolve@^1.12.0, resolve@^1.20.0, resolve@^1.8.1:
- version "1.22.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
- integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
+resolve-package-path@^1.0.11:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.7.tgz#2a7bc37ad96865e239330e3102c31322847e652e"
+ integrity sha512-fVEKHGeK85bGbVFuwO9o1aU0n3vqQGrezPc51JGu9UTXpFQfWq5qCeKxyaRUSvephs+06c5j5rPq/dzHGEo8+Q==
dependencies:
- is-core-module "^2.8.1"
+ path-root "^0.1.1"
+ resolve "^1.10.0"
+
+resolve-package-path@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-3.1.0.tgz#35faaa5d54a9c7dd481eb7c4b2a44410c9c763d8"
+ integrity sha512-2oC2EjWbMJwvSN6Z7DbDfJMnD8MYEouaLn5eIX0j8XwPsYCVIyY9bbnX88YHVkbr8XHqvZrYbxaLPibfTYKZMA==
+ dependencies:
+ path-root "^0.1.1"
+ resolve "^1.17.0"
+
+resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.17.0:
+ version "1.22.2"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f"
+ integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==
+ dependencies:
+ is-core-module "^2.11.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+resolve@^1.22.3:
+ version "1.22.3"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.3.tgz#4b4055349ffb962600972da1fdc33c46a4eb3283"
+ integrity sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==
+ dependencies:
+ is-core-module "^2.12.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
@@ -1299,29 +2550,44 @@ restore-cursor@^3.1.0:
onetime "^5.1.0"
signal-exit "^3.0.2"
+retry@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
+ integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==
+
reusify@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
-rimraf@2.6.3:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
- integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
+rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
dependencies:
glob "^7.1.3"
-rimraf@^3.0.0:
+rimraf@^3.0.0, rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
dependencies:
glob "^7.1.3"
-run-async@^2.4.0:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
- integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
+rsvp@^3.0.14, rsvp@^3.0.18:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a"
+ integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==
+
+rsvp@^4.7.0, rsvp@^4.8.5:
+ version "4.8.5"
+ resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
+ integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
+
+rsvp@~3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a"
+ integrity sha512-Rf4YVNYpKjZ6ASAmibcwTNciQ5Co5Ztq6iZPEykHpkoflnD/K5ryE/rHehFsTm4NJj8nKDhbi3eKBWGogmNnkg==
run-parallel@^1.1.9:
version "1.2.0"
@@ -1330,33 +2596,32 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
-rxjs@^6.6.0:
- version "6.6.7"
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
- integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
- dependencies:
- tslib "^1.9.0"
-
safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-"safer-buffer@>= 2.1.2 < 3":
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
- integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+safe-regex-test@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295"
+ integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.3"
+ is-regex "^1.1.4"
-semver@^5.5.0:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
- integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-
-semver@^6.1.2:
+semver@^6.1.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+semver@^7.3.2, semver@^7.3.4:
+ version "7.5.4"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
+ integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
+ dependencies:
+ lru-cache "^6.0.0"
+
semver@^7.3.5:
version "7.3.6"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.6.tgz#5d73886fb9c0c6602e79440b97165c29581cbb2b"
@@ -1364,24 +2629,40 @@ semver@^7.3.5:
dependencies:
lru-cache "^7.4.0"
-shebang-command@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
- integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
dependencies:
- shebang-regex "^1.0.0"
+ shebang-regex "^3.0.0"
-shebang-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
- integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
signal-exit@^3.0.2:
version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
-simple-html-tokenizer@^0.5.10:
+silent-error@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.1.tgz#f72af5b0d73682a2ba1778b7e32cd8aa7c2d8662"
+ integrity sha512-n4iEKyNcg4v6/jpb3c0/iyH2G1nzUNl7Gpqtn/mHIJK9S/q/7MCfoO4rwVOoO59qPFIc0hVHvMbiOJ0NdtxKKw==
+ dependencies:
+ debug "^2.2.0"
+
+simple-html-tokenizer@^0.5.11:
version "0.5.11"
resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz#4c5186083c164ba22a7b477b7687ac056ad6b1d9"
integrity sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og==
@@ -1391,42 +2672,35 @@ slash@^3.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-slice-ansi@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
- integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
+slash@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
+ integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
+
+snake-case@^3.0.3:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c"
+ integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==
dependencies:
- ansi-styles "^3.2.0"
- astral-regex "^1.0.0"
- is-fullwidth-code-point "^2.0.0"
+ dot-case "^3.0.4"
+ tslib "^2.0.3"
-snake-case@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f"
- integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=
- dependencies:
- no-case "^2.2.0"
+source-map-js@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
-source-map@^0.5.0:
- version "0.5.7"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
- integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+sourcemap-codec@^1.4.8:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
+ integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
-sprintf-js@~1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
- integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+sprintf-js@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
+ integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
-string-width@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
- integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
- dependencies:
- emoji-regex "^7.0.1"
- is-fullwidth-code-point "^2.0.0"
- strip-ansi "^5.1.0"
-
-string-width@^4.1.0, string-width@^4.2.0:
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -1435,6 +2709,47 @@ string-width@^4.1.0, string-width@^4.2.0:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
+string.prototype.matchall@^4.0.6:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3"
+ integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+ get-intrinsic "^1.1.3"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.3"
+ regexp.prototype.flags "^1.4.3"
+ side-channel "^1.0.4"
+
+string.prototype.trim@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533"
+ integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+string.prototype.trimend@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533"
+ integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
+string.prototype.trimstart@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4"
+ integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.20.4"
+
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
@@ -1442,13 +2757,6 @@ string_decoder@^1.1.1:
dependencies:
safe-buffer "~5.2.0"
-strip-ansi@^5.1.0, strip-ansi@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
- integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
- dependencies:
- ansi-regex "^4.1.0"
-
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@@ -1456,7 +2764,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
dependencies:
ansi-regex "^5.0.1"
-strip-json-comments@^3.0.1:
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
@@ -1480,32 +2788,38 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
-table@^5.2.3:
- version "5.4.6"
- resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
- integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
+symlink-or-copy@^1.0.0, symlink-or-copy@^1.0.1, symlink-or-copy@^1.1.8, symlink-or-copy@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz#9506dd64d8e98fa21dcbf4018d1eab23e77f71fe"
+ integrity sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA==
+
+sync-disk-cache@^1.3.3:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/sync-disk-cache/-/sync-disk-cache-1.3.4.tgz#53a2c5a09d8f4bb53160bce182a456ad71574024"
+ integrity sha512-GlkGeM81GPPEKz/lH7QUTbvqLq7K/IUTuaKDSMulP9XQ42glqNJIN/RKgSOw4y8vxL1gOVvj+W7ruEO4s36eCw==
dependencies:
- ajv "^6.10.2"
- lodash "^4.17.14"
- slice-ansi "^2.1.0"
- string-width "^3.0.0"
+ debug "^2.1.3"
+ heimdalljs "^0.2.3"
+ mkdirp "^0.5.0"
+ rimraf "^2.2.8"
+ username-sync "^1.0.2"
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
-through@^2.3.6:
- version "2.3.8"
- resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
- integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+"textextensions@1 || 2":
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4"
+ integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==
-tmp@^0.0.33:
- version "0.0.33"
- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
- integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+tmp@0.0.28:
+ version "0.0.28"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120"
+ integrity sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==
dependencies:
- os-tmpdir "~1.0.2"
+ os-tmpdir "~1.0.1"
tmp@^0.2.1:
version "0.2.1"
@@ -1526,27 +2840,83 @@ to-regex-range@^5.0.1:
dependencies:
is-number "^7.0.0"
-tslib@^1.9.0:
- version "1.14.1"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
- integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-
-type-check@~0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
- integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
+tree-sync@^1.2.2:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.4.0.tgz#314598d13abaf752547d9335b8f95d9a137100d6"
+ integrity sha512-YvYllqh3qrR5TAYZZTXdspnIhlKAYezPYw11ntmweoceu4VK+keN356phHRIIo1d+RDmLpHZrUlmxga2gc9kSQ==
dependencies:
- prelude-ls "~1.1.2"
+ debug "^2.2.0"
+ fs-tree-diff "^0.5.6"
+ mkdirp "^0.5.1"
+ quick-temp "^0.1.5"
+ walk-sync "^0.3.3"
-type-fest@^0.21.3:
- version "0.21.3"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
- integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+tslib@^2.0.3, tslib@^2.4.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3"
+ integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==
-type-fest@^0.8.1:
- version "0.8.1"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
- integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-fest@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+typed-array-length@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb"
+ integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==
+ dependencies:
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ is-typed-array "^1.1.9"
+
+unbox-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
+ integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+ dependencies:
+ call-bind "^1.0.2"
+ has-bigints "^1.0.2"
+ has-symbols "^1.0.3"
+ which-boxed-primitive "^1.0.2"
+
+underscore.string@~3.3.4:
+ version "3.3.6"
+ resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.6.tgz#ad8cf23d7423cb3b53b898476117588f4e2f9159"
+ integrity sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==
+ dependencies:
+ sprintf-js "^1.1.1"
+ util-deprecate "^1.0.2"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+universalify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+ integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
+upath@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b"
+ integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==
+
+update-browserslist-db@^1.0.11:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940"
+ integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==
+ dependencies:
+ escalade "^3.1.1"
+ picocolors "^1.0.0"
uri-js@^4.2.2:
version "4.4.1"
@@ -1555,16 +2925,46 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
-util-deprecate@^1.0.1:
+username-sync@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.3.tgz#ae41c5c8a4c8c2ecc1443a7d0742742bd7e36732"
+ integrity sha512-m/7/FSqjJNAzF2La448c/aEom0gJy7HY7Y509h6l0ePvEkFictAGptwWaj1msWJ38JbfEDOUoE8kqFee9EHKdA==
+
+util-deprecate@^1.0.1, util-deprecate@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
-v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0:
+v8-compile-cache@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
+validate-peer-dependencies@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/validate-peer-dependencies/-/validate-peer-dependencies-1.2.0.tgz#22aab93c514f4fda457d36c80685e8b1160d2036"
+ integrity sha512-nd2HUpKc6RWblPZQ2GDuI65sxJ2n/UqZwSBVtj64xlWjMx0m7ZB2m9b2JS3v1f+n9VWH/dd1CMhkHfP6pIdckA==
+ dependencies:
+ resolve-package-path "^3.1.0"
+ semver "^7.3.2"
+
+walk-sync@^0.3.1, walk-sync@^0.3.3:
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.4.tgz#cf78486cc567d3a96b5b2237c6108017a5ffb9a4"
+ integrity sha512-ttGcuHA/OBnN2pcM6johpYlEms7XpO5/fyKIr48541xXedan4roO8cS1Q2S/zbbjGH/BarYDAMeS2Mi9HE5Tig==
+ dependencies:
+ ensure-posix-path "^1.0.0"
+ matcher-collection "^1.0.0"
+
+walk-sync@^1.0.0, walk-sync@^1.1.3:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.1.4.tgz#81049f3d8095479b49574cfa5f558d7a252b127d"
+ integrity sha512-nowc9thB/Jg0KW4TgxoRjLLYRPvl3DB/98S89r4ZcJqq2B0alNcKDh6pzLkBSkPMzRSMsJghJHQi79qw0YWEkA==
+ dependencies:
+ "@types/minimatch" "^3.0.3"
+ ensure-posix-path "^1.1.0"
+ matcher-collection "^1.1.1"
+
wcwidth@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
@@ -1572,22 +2972,40 @@ wcwidth@^1.0.1:
dependencies:
defaults "^1.0.3"
-which@^1.2.9:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
- integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-typed-array@^1.1.9:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6"
+ integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+ is-typed-array "^1.1.10"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
-word-wrap@~1.2.3:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
- integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
-
-workerpool@^6.1.4:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b"
- integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==
+workerpool@^6.4.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.4.0.tgz#f8d5cfb45fde32fa3b7af72ad617c3369567a462"
+ integrity sha512-i3KR1mQMNwY2wx20ozq2EjISGtQWDIfV56We+yGJ5yDs8jTwQiLLaqHlkBHITlCuJnYlVRmXegxFxZg7gqI++A==
wrap-ansi@^7.0.0:
version "7.0.0"
@@ -1603,37 +3021,45 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-write@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
- integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
- dependencies:
- mkdirp "^0.5.1"
-
y18n@^5.0.5:
version "5.0.8"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
-yargs-parser@^20.2.2:
- version "20.2.9"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
- integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
-yargs@^16.2.0:
- version "16.2.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
- integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@^17.7.2:
+ version "17.7.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
dependencies:
- cliui "^7.0.2"
+ cliui "^8.0.1"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
- string-width "^4.2.0"
+ string-width "^4.2.3"
y18n "^5.0.5"
- yargs-parser "^20.2.2"
+ yargs-parser "^21.1.1"
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+yocto-queue@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251"
+ integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==