Commits vergleichen
4 Commits
main
...
itsbhanush
Autor | SHA1 | Datum | |
---|---|---|---|
|
1fea823c5f | ||
|
91370437b4 | ||
|
d12ac90fab | ||
|
d829d46550 |
197 geänderte Dateien mit 2687 neuen und 8320 gelöschten Zeilen
|
@ -1,3 +1,2 @@
|
||||||
3.1.999: 1f35b80f85e5fd1efb7f4851f0845700432febdc
|
|
||||||
2.7.99: e07a57e398b6b1676ab42a7e34467556fca5416b
|
2.7.99: e07a57e398b6b1676ab42a7e34467556fca5416b
|
||||||
2.5.1: bb85b3a0d2c0ab6b59bcb405731c39089ec6731c
|
2.5.1: bb85b3a0d2c0ab6b59bcb405731c39089ec6731c
|
||||||
|
|
13
.github/workflows/discourse-plugin.yml
gevendort
13
.github/workflows/discourse-plugin.yml
gevendort
|
@ -1,13 +0,0 @@
|
||||||
name: Discourse Plugin
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
pull_request:
|
|
||||||
schedule:
|
|
||||||
- cron: "0 0 * * *"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
ci:
|
|
||||||
uses: discourse/.github/.github/workflows/discourse-plugin.yml@v1
|
|
54
.github/workflows/plugin-linting.yml
gevendort
Normale Datei
54
.github/workflows/plugin-linting.yml
gevendort
Normale Datei
|
@ -0,0 +1,54 @@
|
||||||
|
name: Linting
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- stable
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: plugin-linting-${{ format('{0}-{1}', github.head_ref || github.run_number, github.job) }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 16
|
||||||
|
cache: yarn
|
||||||
|
|
||||||
|
- name: Yarn install
|
||||||
|
run: yarn install
|
||||||
|
|
||||||
|
- name: Set up ruby
|
||||||
|
uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: 2.7
|
||||||
|
bundler-cache: true
|
||||||
|
|
||||||
|
- name: ESLint
|
||||||
|
if: ${{ always() }}
|
||||||
|
run: yarn eslint --ext .js,.js.es6 --no-error-on-unmatched-pattern {test,assets}/javascripts
|
||||||
|
|
||||||
|
- name: Prettier
|
||||||
|
if: ${{ always() }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
yarn prettier -v
|
||||||
|
if [ 0 -lt $(find assets -type f \( -name "*.scss" -or -name "*.js" -or -name "*.es6" \) 2> /dev/null | wc -l) ]; then
|
||||||
|
yarn prettier --list-different "assets/**/*.{scss,js,es6}"
|
||||||
|
fi
|
||||||
|
if [ 0 -lt $(find test -type f \( -name "*.js" -or -name "*.es6" \) 2> /dev/null | wc -l) ]; then
|
||||||
|
yarn prettier --list-different "test/**/*.{js,es6}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Rubocop
|
||||||
|
if: ${{ always() }}
|
||||||
|
run: bundle exec rubocop .
|
136
.github/workflows/plugin-tests.yml
gevendort
Normale Datei
136
.github/workflows/plugin-tests.yml
gevendort
Normale Datei
|
@ -0,0 +1,136 @@
|
||||||
|
name: Plugin Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- stable
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: tests-${{ format('{0}-{1}', github.head_ref || github.run_number, github.job) }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: ${{ matrix.build_type }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: discourse/discourse_test:slim${{ startsWith(matrix.build_type, 'frontend') && '-browsers' || '' }}
|
||||||
|
timeout-minutes: 30
|
||||||
|
|
||||||
|
env:
|
||||||
|
DISCOURSE_HOSTNAME: www.example.com
|
||||||
|
RUBY_GLOBAL_METHOD_CACHE_SIZE: 131072
|
||||||
|
RAILS_ENV: test
|
||||||
|
PGUSER: discourse
|
||||||
|
PGPASSWORD: discourse
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
build_type: ["backend", "frontend"]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
repository: discourse/discourse
|
||||||
|
fetch-depth: 1
|
||||||
|
|
||||||
|
- name: Install plugin
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
path: plugins/${{ github.event.repository.name }}
|
||||||
|
fetch-depth: 1
|
||||||
|
|
||||||
|
- name: Setup Git
|
||||||
|
run: |
|
||||||
|
git config --global user.email "ci@ci.invalid"
|
||||||
|
git config --global user.name "Discourse CI"
|
||||||
|
|
||||||
|
- name: Start redis
|
||||||
|
run: |
|
||||||
|
redis-server /etc/redis/redis.conf &
|
||||||
|
|
||||||
|
- name: Start Postgres
|
||||||
|
run: |
|
||||||
|
chown -R postgres /var/run/postgresql
|
||||||
|
sudo -E -u postgres script/start_test_db.rb
|
||||||
|
sudo -u postgres psql -c "CREATE ROLE $PGUSER LOGIN SUPERUSER PASSWORD '$PGPASSWORD';"
|
||||||
|
|
||||||
|
- name: Bundler cache
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: vendor/bundle
|
||||||
|
key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-gem-
|
||||||
|
|
||||||
|
- name: Setup gems
|
||||||
|
run: |
|
||||||
|
gem install bundler --conservative -v $(awk '/BUNDLED WITH/ { getline; gsub(/ /,""); print $0 }' Gemfile.lock)
|
||||||
|
bundle config --local path vendor/bundle
|
||||||
|
bundle config --local deployment true
|
||||||
|
bundle config --local without development
|
||||||
|
bundle install --jobs 4
|
||||||
|
bundle clean
|
||||||
|
|
||||||
|
- name: Lint English locale
|
||||||
|
if: matrix.build_type == 'backend'
|
||||||
|
run: bundle exec ruby script/i18n_lint.rb "plugins/${{ github.event.repository.name }}/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@v3
|
||||||
|
id: yarn-cache
|
||||||
|
with:
|
||||||
|
path: ${{ steps.yarn-cache-dir.outputs.dir }}
|
||||||
|
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-yarn-
|
||||||
|
|
||||||
|
- name: Yarn install
|
||||||
|
run: yarn install
|
||||||
|
|
||||||
|
- name: Fetch app state cache
|
||||||
|
uses: actions/cache@v3
|
||||||
|
id: app-cache
|
||||||
|
with:
|
||||||
|
path: tmp/app-cache
|
||||||
|
key: >-
|
||||||
|
${{ hashFiles('.github/workflows/tests.yml') }}-
|
||||||
|
${{ hashFiles('db/**/*', 'plugins/**/db/**/*') }}-
|
||||||
|
|
||||||
|
- name: Restore database from cache
|
||||||
|
if: steps.app-cache.outputs.cache-hit == 'true'
|
||||||
|
run: psql -f tmp/app-cache/cache.sql postgres
|
||||||
|
|
||||||
|
- name: Restore uploads from cache
|
||||||
|
if: steps.app-cache.outputs.cache-hit == 'true'
|
||||||
|
run: rm -rf public/uploads && cp -r tmp/app-cache/uploads public/uploads
|
||||||
|
|
||||||
|
- name: Create and migrate database
|
||||||
|
if: steps.app-cache.outputs.cache-hit != 'true'
|
||||||
|
run: |
|
||||||
|
bin/rake db:create
|
||||||
|
bin/rake db:migrate
|
||||||
|
|
||||||
|
- name: Dump database for cache
|
||||||
|
if: steps.app-cache.outputs.cache-hit != 'true'
|
||||||
|
run: mkdir -p tmp/app-cache && pg_dumpall > tmp/app-cache/cache.sql
|
||||||
|
|
||||||
|
- name: Dump uploads for cache
|
||||||
|
if: steps.app-cache.outputs.cache-hit != 'true'
|
||||||
|
run: rm -rf tmp/app-cache/uploads && cp -r public/uploads tmp/app-cache/uploads
|
||||||
|
|
||||||
|
- name: Plugin RSpec
|
||||||
|
if: matrix.build_type == 'backend'
|
||||||
|
run: bin/rake plugin:spec[${{ github.event.repository.name }}]
|
||||||
|
|
||||||
|
- name: Plugin QUnit
|
||||||
|
if: matrix.build_type == 'frontend'
|
||||||
|
run: QUNIT_EMBER_CLI=1 bundle exec rake plugin:qunit['${{ github.event.repository.name }}','1200000']
|
||||||
|
timeout-minutes: 10
|
|
@ -1,4 +1,4 @@
|
||||||
All code in this repository is Copyright 2023 by Angus McLeod.
|
All code in this repository is Copyright 2018 by Angus McLeod.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|
20
README.md
20
README.md
|
@ -4,24 +4,22 @@ The Custom Wizard Plugin lets you make forms for your Discourse forum. Better us
|
||||||
|
|
||||||
<img src="https://camo.githubusercontent.com/593432f1fc9658ffca104065668cc88fa21dffcd3002cb78ffd50c71f33a2523/68747470733a2f2f706176696c696f6e2d6173736574732e6e7963332e63646e2e6469676974616c6f6365616e7370616365732e636f6d2f706c7567696e732f77697a6172642d7265706f7369746f72792d62616e6e65722e706e67" alt="" data-canonical-src="https://pavilion-assets.nyc3.cdn.digitaloceanspaces.com/plugins/wizard-repository-banner.png" style="max-width: 100%;" width="400">
|
<img src="https://camo.githubusercontent.com/593432f1fc9658ffca104065668cc88fa21dffcd3002cb78ffd50c71f33a2523/68747470733a2f2f706176696c696f6e2d6173736574732e6e7963332e63646e2e6469676974616c6f6365616e7370616365732e636f6d2f706c7567696e732f77697a6172642d7265706f7369746f72792d62616e6e65722e706e67" alt="" data-canonical-src="https://pavilion-assets.nyc3.cdn.digitaloceanspaces.com/plugins/wizard-repository-banner.png" style="max-width: 100%;" width="400">
|
||||||
|
|
||||||
👋 Looking to report an issue? We're managing issues for this plugin using our [bug report wizard](https://coop.pavilion.tech/w/bug-report).
|
|
||||||
|
|
||||||
## Install
|
## 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.
|
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
|
## Documentation
|
||||||
|
|
||||||
[Read the full documentation here](https://coop.pavilion.tech/c/82), or go directly to the relevant section
|
[Read the full documentation here](https://discourse.pluginmanager.org/c/discourse-custom-wizard/documentation), or go directly to the relevant section
|
||||||
|
|
||||||
- [Wizard Administration](https://coop.pavilion.tech/t/1602)
|
- [Wizard Administration](https://discourse.pluginmanager.org/t/wizard-administration)
|
||||||
- [Wizard Settings](https://coop.pavilion.tech/t/1614)
|
- [Wizard Settings](https://discourse.pluginmanager.org/t/wizard-settings)
|
||||||
- [Step Settings](https://coop.pavilion.tech/t/1735)
|
- [Step Settings](https://discourse.pluginmanager.org/t/step-settings)
|
||||||
- [Field Settings](https://coop.pavilion.tech/t/1580)
|
- [Field Settings](https://discourse.pluginmanager.org/t/field-settings)
|
||||||
- [Conditional Settings](https://coop.pavilion.tech/t/1673)
|
- [Conditional Settings](https://discourse.pluginmanager.org/t/conditional-settings)
|
||||||
- [Field Interpolation](https://coop.pavilion.tech/t/1557)
|
- [Field Interpolation](https://discourse.pluginmanager.org/t/field-interpolation)
|
||||||
- [Handling Dates and Times](https://coop.pavilion.tech/t/1708)
|
- [Wizard Examples and Templates](https://discourse.pluginmanager.org/t/wizard-examples-and-templates)
|
||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
- [Report an issue](https://coop.pavilion.tech/w/bug-report)
|
- [Report a bug](https://discourse.pluginmanager.org/w/bug-report)
|
||||||
|
|
|
@ -8,7 +8,7 @@ class CustomWizard::AdminController < ::Admin::AdminController
|
||||||
subscribed: subcription.subscribed?,
|
subscribed: subcription.subscribed?,
|
||||||
subscription_type: subcription.type,
|
subscription_type: subcription.type,
|
||||||
subscription_attributes: CustomWizard::Subscription.attributes,
|
subscription_attributes: CustomWizard::Subscription.attributes,
|
||||||
subscription_client_installed: CustomWizard::Subscription.client_installed?
|
subscription_client_installed: subcription.client_installed?
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -22,12 +22,7 @@ class CustomWizard::AdminSubmissionsController < CustomWizard::AdminController
|
||||||
end
|
end
|
||||||
|
|
||||||
def download
|
def download
|
||||||
content = ActiveModel::ArraySerializer.new(
|
send_data submission_list.submissions.to_json,
|
||||||
CustomWizard::Submission.list(@wizard).submissions,
|
|
||||||
each_serializer: CustomWizard::SubmissionSerializer
|
|
||||||
)
|
|
||||||
|
|
||||||
send_data content.to_json,
|
|
||||||
filename: "#{Discourse.current_hostname}-wizard-submissions-#{@wizard.name}.json",
|
filename: "#{Discourse.current_hostname}-wizard-submissions-#{@wizard.name}.json",
|
||||||
content_type: "application/json",
|
content_type: "application/json",
|
||||||
disposition: "attachment"
|
disposition: "attachment"
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
class CustomWizard::StepsController < ::CustomWizard::WizardClientController
|
class CustomWizard::StepsController < ::ApplicationController
|
||||||
|
before_action :ensure_logged_in
|
||||||
before_action :ensure_can_update
|
before_action :ensure_can_update
|
||||||
|
|
||||||
def update
|
def update
|
||||||
|
@ -21,7 +22,7 @@ class CustomWizard::StepsController < ::CustomWizard::WizardClientController
|
||||||
|
|
||||||
if updater.success?
|
if updater.success?
|
||||||
wizard_id = update_params[:wizard_id]
|
wizard_id = update_params[:wizard_id]
|
||||||
builder = CustomWizard::Builder.new(wizard_id, current_user, guest_id)
|
builder = CustomWizard::Builder.new(wizard_id, current_user)
|
||||||
@wizard = builder.build(force: true)
|
@wizard = builder.build(force: true)
|
||||||
|
|
||||||
current_step = @wizard.find_step(update[:step_id])
|
current_step = @wizard.find_step(update[:step_id])
|
||||||
|
@ -84,6 +85,7 @@ class CustomWizard::StepsController < ::CustomWizard::WizardClientController
|
||||||
private
|
private
|
||||||
|
|
||||||
def ensure_can_update
|
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::InvalidParameters.new(:wizard_id) if @builder.template.nil?
|
||||||
raise Discourse::InvalidAccess.new if !@builder.wizard || !@builder.wizard.can_access?
|
raise Discourse::InvalidAccess.new if !@builder.wizard || !@builder.wizard.can_access?
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
class CustomWizard::WizardController < ::CustomWizard::WizardClientController
|
class CustomWizard::WizardController < ::ApplicationController
|
||||||
|
before_action :ensure_plugin_enabled
|
||||||
|
before_action :ensure_logged_in, only: [:skip]
|
||||||
|
|
||||||
def show
|
def show
|
||||||
if wizard.present?
|
if wizard.present?
|
||||||
render json: CustomWizard::WizardSerializer.new(wizard, scope: guardian, root: false).as_json, status: 200
|
render json: CustomWizard::WizardSerializer.new(wizard, scope: guardian, root: false).as_json, status: 200
|
||||||
|
@ -32,8 +35,19 @@ class CustomWizard::WizardController < ::CustomWizard::WizardClientController
|
||||||
|
|
||||||
def wizard
|
def wizard
|
||||||
@wizard ||= begin
|
@wizard ||= begin
|
||||||
return nil unless @builder.present?
|
builder = CustomWizard::Builder.new(params[:wizard_id].underscore, current_user)
|
||||||
@builder.build({ reset: params[:reset] }, params)
|
return nil unless builder.present?
|
||||||
|
opts = {}
|
||||||
|
opts[:reset] = params[:reset]
|
||||||
|
builder.build(opts, params)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def ensure_plugin_enabled
|
||||||
|
unless SiteSetting.custom_wizard_enabled
|
||||||
|
redirect_to path("/")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
# 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
|
|
|
@ -2,15 +2,12 @@
|
||||||
class CustomWizard::SubmissionSerializer < ApplicationSerializer
|
class CustomWizard::SubmissionSerializer < ApplicationSerializer
|
||||||
attributes :id,
|
attributes :id,
|
||||||
:fields,
|
:fields,
|
||||||
:submitted_at,
|
:submitted_at
|
||||||
:user
|
|
||||||
|
has_one :user, serializer: ::BasicUserSerializer, embed: :objects
|
||||||
|
|
||||||
def include_user?
|
def include_user?
|
||||||
object.wizard.user.present?
|
object.user.present?
|
||||||
end
|
|
||||||
|
|
||||||
def user
|
|
||||||
::BasicUserSerializer.new(object.wizard.user, root: false).as_json
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def fields
|
def fields
|
||||||
|
|
|
@ -7,7 +7,7 @@ import userSearch from "discourse/lib/user-search";
|
||||||
import I18n from "I18n";
|
import I18n from "I18n";
|
||||||
import Handlebars from "handlebars";
|
import Handlebars from "handlebars";
|
||||||
import { isEmpty } from "@ember/utils";
|
import { isEmpty } from "@ember/utils";
|
||||||
import TextField from "discourse/components/text-field";
|
import TextField from "@ember/component/text-field";
|
||||||
|
|
||||||
const template = function (params) {
|
const template = function (params) {
|
||||||
const options = params.options;
|
const options = params.options;
|
||||||
|
|
|
@ -12,18 +12,14 @@ import { alias } from "@ember/object/computed";
|
||||||
import Site from "discourse/models/site";
|
import Site from "discourse/models/site";
|
||||||
import { uploadIcon } from "discourse/lib/uploads";
|
import { uploadIcon } from "discourse/lib/uploads";
|
||||||
import { dasherize } from "@ember/string";
|
import { dasherize } from "@ember/string";
|
||||||
import InsertHyperlink from "discourse/components/modal/insert-hyperlink";
|
|
||||||
import { inject as service } from "@ember/service";
|
|
||||||
|
|
||||||
const IMAGE_MARKDOWN_REGEX =
|
const IMAGE_MARKDOWN_REGEX = /!\[(.*?)\|(\d{1,4}x\d{1,4})(,\s*\d{1,3}%)?(.*?)\]\((upload:\/\/.*?)\)(?!(.*`))/g;
|
||||||
/!\[(.*?)\|(\d{1,4}x\d{1,4})(,\s*\d{1,3}%)?(.*?)\]\((upload:\/\/.*?)\)(?!(.*`))/g;
|
|
||||||
|
|
||||||
export default ComposerEditor.extend({
|
export default ComposerEditor.extend({
|
||||||
modal: service(),
|
|
||||||
|
|
||||||
classNameBindings: ["fieldClass"],
|
classNameBindings: ["fieldClass"],
|
||||||
allowUpload: true,
|
allowUpload: true,
|
||||||
showLink: false,
|
showLink: false,
|
||||||
|
showHyperlinkBox: false,
|
||||||
topic: null,
|
topic: null,
|
||||||
showToolbar: true,
|
showToolbar: true,
|
||||||
focusTarget: "reply",
|
focusTarget: "reply",
|
||||||
|
@ -33,7 +29,6 @@ export default ComposerEditor.extend({
|
||||||
draftStatus: "null",
|
draftStatus: "null",
|
||||||
replyPlaceholder: alias("field.translatedPlaceholder"),
|
replyPlaceholder: alias("field.translatedPlaceholder"),
|
||||||
wizardEventFieldId: null,
|
wizardEventFieldId: null,
|
||||||
composerEventPrefix: "wizard-editor",
|
|
||||||
|
|
||||||
@on("didInsertElement")
|
@on("didInsertElement")
|
||||||
_composerEditorInit() {
|
_composerEditorInit() {
|
||||||
|
@ -82,13 +77,24 @@ export default ComposerEditor.extend({
|
||||||
$input.on("scroll", this._throttledSyncEditorAndPreviewScroll);
|
$input.on("scroll", this._throttledSyncEditorAndPreviewScroll);
|
||||||
this._bindUploadTarget();
|
this._bindUploadTarget();
|
||||||
|
|
||||||
const field = this.field;
|
const wizardEventNames = ["insert-text", "replace-text"];
|
||||||
this.editorInputClass = `.${dasherize(field.type)}-${dasherize(
|
const eventPrefix = this.eventPrefix;
|
||||||
field.id
|
this.appEvents.reopen({
|
||||||
)} .d-editor-input`;
|
trigger(name, ...args) {
|
||||||
|
let eventParts = name.split(":");
|
||||||
|
let currentEventPrefix = eventParts[0];
|
||||||
|
let currentEventName = eventParts[1];
|
||||||
|
|
||||||
this._uppyInstance.on("file-added", () => {
|
if (
|
||||||
this.session.set("wizardEventFieldId", field.id);
|
currentEventPrefix !== "wizard-editor" &&
|
||||||
|
wizardEventNames.some((wen) => wen === currentEventName)
|
||||||
|
) {
|
||||||
|
let wizardEventName = name.replace(eventPrefix, "wizard-editor");
|
||||||
|
return this._super(wizardEventName, ...args);
|
||||||
|
} else {
|
||||||
|
return this._super(name, ...args);
|
||||||
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -110,6 +116,12 @@ export default ComposerEditor.extend({
|
||||||
return uploadIcon(false, this.siteSettings);
|
return uploadIcon(false, this.siteSettings);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
click(e) {
|
||||||
|
if ($(e.target).hasClass("wizard-composer-hyperlink")) {
|
||||||
|
this.set("showHyperlinkBox", false);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
@bind
|
@bind
|
||||||
_handleImageDeleteButtonClick(event) {
|
_handleImageDeleteButtonClick(event) {
|
||||||
if (!event.target.classList.contains("delete-image-button")) {
|
if (!event.target.classList.contains("delete-image-button")) {
|
||||||
|
@ -120,8 +132,9 @@ export default ComposerEditor.extend({
|
||||||
event.target.closest(".button-wrapper").dataset.imageIndex,
|
event.target.closest(".button-wrapper").dataset.imageIndex,
|
||||||
10
|
10
|
||||||
);
|
);
|
||||||
const matchingPlaceholder =
|
const matchingPlaceholder = this.get("composer.reply").match(
|
||||||
this.get("composer.reply").match(IMAGE_MARKDOWN_REGEX);
|
IMAGE_MARKDOWN_REGEX
|
||||||
|
);
|
||||||
|
|
||||||
this.session.set("wizardEventFieldId", this.field.id);
|
this.session.set("wizardEventFieldId", this.field.id);
|
||||||
this.appEvents.trigger(
|
this.appEvents.trigger(
|
||||||
|
@ -152,7 +165,7 @@ export default ComposerEditor.extend({
|
||||||
shortcut: "K",
|
shortcut: "K",
|
||||||
trimLeading: true,
|
trimLeading: true,
|
||||||
unshift: true,
|
unshift: true,
|
||||||
sendAction: (event) => component.send("showLinkModal", event),
|
sendAction: () => component.set("showHyperlinkBox", true),
|
||||||
});
|
});
|
||||||
|
|
||||||
if (this.siteSettings.mentionables_enabled) {
|
if (this.siteSettings.mentionables_enabled) {
|
||||||
|
@ -193,16 +206,17 @@ export default ComposerEditor.extend({
|
||||||
this._super(...arguments);
|
this._super(...arguments);
|
||||||
},
|
},
|
||||||
|
|
||||||
showLinkModal(toolbarEvent) {
|
addLink(linkName, linkUrl) {
|
||||||
let linkText = "";
|
let link = `[${linkName}](${linkUrl})`;
|
||||||
this._lastSel = toolbarEvent.selected;
|
this.appEvents.trigger("wizard-editor:insert-text", {
|
||||||
|
fieldId: this.field.id,
|
||||||
if (this._lastSel) {
|
text: link,
|
||||||
linkText = this._lastSel.value;
|
|
||||||
}
|
|
||||||
this.modal.show(InsertHyperlink, {
|
|
||||||
model: { linkText, toolbarEvent },
|
|
||||||
});
|
});
|
||||||
|
this.set("showHyperlinkBox", false);
|
||||||
|
},
|
||||||
|
|
||||||
|
hideBox() {
|
||||||
|
this.set("showHyperlinkBox", false);
|
||||||
},
|
},
|
||||||
|
|
||||||
showUploadModal() {
|
showUploadModal() {
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
import Component from "@ember/component";
|
||||||
|
|
||||||
|
export default Component.extend({
|
||||||
|
classNames: ["wizard-composer-hyperlink"],
|
||||||
|
|
||||||
|
actions: {
|
||||||
|
addLink() {
|
||||||
|
this.addLink(this.linkName, this.linkUrl);
|
||||||
|
},
|
||||||
|
|
||||||
|
hideBox() {
|
||||||
|
this.hideBox();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
|
@ -3,7 +3,6 @@ import discourseComputed from "discourse-common/utils/decorators";
|
||||||
|
|
||||||
export default DateInput.extend({
|
export default DateInput.extend({
|
||||||
useNativePicker: false,
|
useNativePicker: false,
|
||||||
classNameBindings: ["fieldClass"],
|
|
||||||
|
|
||||||
@discourseComputed()
|
@discourseComputed()
|
||||||
placeholder() {
|
placeholder() {
|
||||||
|
|
|
@ -2,8 +2,6 @@ import DateTimeInput from "discourse/components/date-time-input";
|
||||||
import discourseComputed from "discourse-common/utils/decorators";
|
import discourseComputed from "discourse-common/utils/decorators";
|
||||||
|
|
||||||
export default DateTimeInput.extend({
|
export default DateTimeInput.extend({
|
||||||
classNameBindings: ["fieldClass"],
|
|
||||||
|
|
||||||
@discourseComputed("timeFirst", "tabindex")
|
@discourseComputed("timeFirst", "tabindex")
|
||||||
timeTabindex(timeFirst, tabindex) {
|
timeTabindex(timeFirst, tabindex) {
|
||||||
return timeFirst ? tabindex : tabindex + 1;
|
return timeFirst ? tabindex : tabindex + 1;
|
||||||
|
|
|
@ -2,8 +2,6 @@ import Component from "@ember/component";
|
||||||
import { observes } from "discourse-common/utils/decorators";
|
import { observes } from "discourse-common/utils/decorators";
|
||||||
|
|
||||||
export default Component.extend({
|
export default Component.extend({
|
||||||
classNameBindings: ["fieldClass"],
|
|
||||||
|
|
||||||
@observes("time")
|
@observes("time")
|
||||||
setValue() {
|
setValue() {
|
||||||
this.set("field.value", this.time.format(this.field.format));
|
this.set("field.value", this.time.format(this.field.format));
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { computed } from "@ember/object";
|
||||||
|
|
||||||
export default Component.extend(UppyUploadMixin, {
|
export default Component.extend(UppyUploadMixin, {
|
||||||
classNames: ["wizard-field-upload"],
|
classNames: ["wizard-field-upload"],
|
||||||
classNameBindings: ["isImage", "fieldClass"],
|
classNameBindings: ["isImage"],
|
||||||
uploading: false,
|
uploading: false,
|
||||||
type: computed(function () {
|
type: computed(function () {
|
||||||
return `wizard_${this.field.id}`;
|
return `wizard_${this.field.id}`;
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
import Component from "@ember/component";
|
import Component from "@ember/component";
|
||||||
|
|
||||||
export default Component.extend({
|
export default Component.extend({});
|
||||||
classNameBindings: ["fieldClass"],
|
|
||||||
});
|
|
||||||
|
|
|
@ -9,7 +9,6 @@ import CustomWizard, {
|
||||||
updateCachedWizard,
|
updateCachedWizard,
|
||||||
} from "discourse/plugins/discourse-custom-wizard/discourse/models/custom-wizard";
|
} from "discourse/plugins/discourse-custom-wizard/discourse/models/custom-wizard";
|
||||||
import { alias, not } from "@ember/object/computed";
|
import { alias, not } from "@ember/object/computed";
|
||||||
import discourseLater from "discourse-common/lib/later";
|
|
||||||
|
|
||||||
const alreadyWarned = {};
|
const alreadyWarned = {};
|
||||||
|
|
||||||
|
@ -111,22 +110,29 @@ export default Component.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
autoFocus() {
|
autoFocus() {
|
||||||
discourseLater(() => {
|
schedule("afterRender", () => {
|
||||||
schedule("afterRender", () => {
|
const $invalid = $(
|
||||||
if ($(".invalid .wizard-focusable").length) {
|
".wizard-field.invalid:nth-of-type(1) .wizard-focusable"
|
||||||
this.animateInvalidFields();
|
);
|
||||||
}
|
|
||||||
});
|
if ($invalid.length) {
|
||||||
|
return $invalid.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
$(".wizard-focusable:first").focus();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
animateInvalidFields() {
|
animateInvalidFields() {
|
||||||
schedule("afterRender", () => {
|
schedule("afterRender", () => {
|
||||||
let $invalid = $(".invalid .wizard-focusable");
|
let $element = $(
|
||||||
if ($invalid.length) {
|
".invalid input[type=text],.invalid textarea,.invalid input[type=checkbox],.invalid .select-kit"
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($element.length) {
|
||||||
$([document.documentElement, document.body]).animate(
|
$([document.documentElement, document.body]).animate(
|
||||||
{
|
{
|
||||||
scrollTop: $invalid.offset().top - 200,
|
scrollTop: $element.offset().top - 200,
|
||||||
},
|
},
|
||||||
400
|
400
|
||||||
);
|
);
|
||||||
|
|
|
@ -4,10 +4,7 @@ export default TagChooser.extend({
|
||||||
searchTags(url, data, callback) {
|
searchTags(url, data, callback) {
|
||||||
if (this.tagGroups) {
|
if (this.tagGroups) {
|
||||||
let tagGroupsString = this.tagGroups.join(",");
|
let tagGroupsString = this.tagGroups.join(",");
|
||||||
data.filterForInput = {
|
data.tag_groups = tagGroupsString;
|
||||||
name: "custom-wizard-tag-chooser",
|
|
||||||
groups: tagGroupsString,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._super(url, data, callback);
|
return this._super(url, data, callback);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import computed from "discourse-common/utils/decorators";
|
import computed from "discourse-common/utils/decorators";
|
||||||
import { isLTR, isRTL, siteDir } from "discourse/lib/text-direction";
|
import { isLTR, isRTL, siteDir } from "discourse/lib/text-direction";
|
||||||
import I18n from "I18n";
|
import I18n from "I18n";
|
||||||
import TextField from "discourse/components/text-field";
|
import TextField from "@ember/component/text-field";
|
||||||
|
|
||||||
export default TextField.extend({
|
export default TextField.extend({
|
||||||
attributeBindings: [
|
attributeBindings: [
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
<DModal @closeModal={{@closeModal}} @title={{this.title}}>
|
|
||||||
{{#if loading}}
|
|
||||||
<LoadingSpinner size="large" />
|
|
||||||
{{else}}
|
|
||||||
<div class="edit-directory-columns-container">
|
|
||||||
{{#each @model.columns as |column|}}
|
|
||||||
<div class="edit-directory-column">
|
|
||||||
<div class="left-content">
|
|
||||||
<label class="column-name">
|
|
||||||
<Input @type="checkbox" @checked={{column.enabled}} />
|
|
||||||
{{directory-table-header-title
|
|
||||||
field=column.label
|
|
||||||
translated=true
|
|
||||||
}}
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
||||||
<div class="modal-footer">
|
|
||||||
<DButton
|
|
||||||
class="btn-primary"
|
|
||||||
@label="directory.edit_columns.save"
|
|
||||||
@action={{action "save"}}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<DButton
|
|
||||||
class="btn-secondary reset-to-default"
|
|
||||||
@label="directory.edit_columns.reset_to_default"
|
|
||||||
@action={{action "resetToDefault"}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</DModal>
|
|
|
@ -1,15 +0,0 @@
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
<DModal
|
|
||||||
@closeModal={{@closeModal}}
|
|
||||||
class="next-session-time-modal"
|
|
||||||
@title={{this.title}}
|
|
||||||
>
|
|
||||||
<DateTimeInput
|
|
||||||
@date={{this.bufferedDateTime}}
|
|
||||||
@onChange={{action "dateTimeChanged"}}
|
|
||||||
@showTime="true"
|
|
||||||
@clearable="true"
|
|
||||||
/>
|
|
||||||
<div class="modal-footer">
|
|
||||||
<DButton
|
|
||||||
@action={{action "submit"}}
|
|
||||||
class="btn-primary"
|
|
||||||
@label="admin.wizard.after_time_modal.done"
|
|
||||||
@disabled={{this.submitDisabled}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</DModal>
|
|
|
@ -1,30 +0,0 @@
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -15,7 +15,6 @@ import {
|
||||||
import Component from "@ember/component";
|
import Component from "@ember/component";
|
||||||
import { bind, later } from "@ember/runloop";
|
import { bind, later } from "@ember/runloop";
|
||||||
import I18n from "I18n";
|
import I18n from "I18n";
|
||||||
import Subscription from "../mixins/subscription";
|
|
||||||
|
|
||||||
const customFieldActionMap = {
|
const customFieldActionMap = {
|
||||||
topic: ["create_topic", "send_message"],
|
topic: ["create_topic", "send_message"],
|
||||||
|
@ -27,7 +26,7 @@ const customFieldActionMap = {
|
||||||
|
|
||||||
const values = ["present", "true", "false"];
|
const values = ["present", "true", "false"];
|
||||||
|
|
||||||
export default Component.extend(Subscription, {
|
export default Component.extend({
|
||||||
classNameBindings: [":mapper-selector", "activeType"],
|
classNameBindings: [":mapper-selector", "activeType"],
|
||||||
|
|
||||||
showText: computed("activeType", function () {
|
showText: computed("activeType", function () {
|
||||||
|
@ -117,9 +116,6 @@ export default Component.extend(Subscription, {
|
||||||
groupEnabled: computed("options.groupSelection", "inputType", function () {
|
groupEnabled: computed("options.groupSelection", "inputType", function () {
|
||||||
return this.optionEnabled("groupSelection");
|
return this.optionEnabled("groupSelection");
|
||||||
}),
|
}),
|
||||||
guestGroup: computed("options.guestGroup", "inputType", function () {
|
|
||||||
return this.optionEnabled("guestGroup");
|
|
||||||
}),
|
|
||||||
userEnabled: computed("options.userSelection", "inputType", function () {
|
userEnabled: computed("options.userSelection", "inputType", function () {
|
||||||
return this.optionEnabled("userSelection");
|
return this.optionEnabled("userSelection");
|
||||||
}),
|
}),
|
||||||
|
@ -130,29 +126,7 @@ export default Component.extend(Subscription, {
|
||||||
return this.connector === "is";
|
return this.connector === "is";
|
||||||
}),
|
}),
|
||||||
|
|
||||||
@discourseComputed("site.groups", "guestGroup", "subscriptionType")
|
groups: alias("site.groups"),
|
||||||
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"),
|
categories: alias("site.categories"),
|
||||||
showComboBox: or(
|
showComboBox: or(
|
||||||
"showWizardField",
|
"showWizardField",
|
||||||
|
|
|
@ -32,7 +32,6 @@ export default Component.extend({
|
||||||
pairConnector: options.pairConnector || null,
|
pairConnector: options.pairConnector || null,
|
||||||
outputConnector: options.outputConnector || null,
|
outputConnector: options.outputConnector || null,
|
||||||
context: options.context || null,
|
context: options.context || null,
|
||||||
guestGroup: options.guestGroup || false,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let inputTypes = ["key", "value", "output"];
|
let inputTypes = ["key", "value", "output"];
|
||||||
|
|
|
@ -7,7 +7,7 @@ export default Component.extend(Subscription, {
|
||||||
|
|
||||||
@discourseComputed("subscribed")
|
@discourseComputed("subscribed")
|
||||||
subscribedIcon(subscribed) {
|
subscribedIcon(subscribed) {
|
||||||
return subscribed ? "check" : "times";
|
return subscribed ? "check" : "dash";
|
||||||
},
|
},
|
||||||
|
|
||||||
@discourseComputed("subscribed")
|
@discourseComputed("subscribed")
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import SingleSelectComponent from "select-kit/components/single-select";
|
import SingleSelectComponent from "select-kit/components/single-select";
|
||||||
import Subscription from "../mixins/subscription";
|
import Subscription from "../mixins/subscription";
|
||||||
import { filterValues } from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard-schema";
|
import wizardSchema from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard-schema";
|
||||||
import discourseComputed from "discourse-common/utils/decorators";
|
import discourseComputed from "discourse-common/utils/decorators";
|
||||||
import I18n from "I18n";
|
import I18n from "I18n";
|
||||||
|
|
||||||
|
@ -40,9 +40,9 @@ export default SingleSelectComponent.extend(Subscription, {
|
||||||
return allowedTypes;
|
return allowedTypes;
|
||||||
},
|
},
|
||||||
|
|
||||||
@discourseComputed("feature", "attribute", "wizard.allowGuests")
|
@discourseComputed("feature", "attribute")
|
||||||
content(feature, attribute) {
|
content(feature, attribute) {
|
||||||
return filterValues(this.wizard, feature, attribute)
|
return wizardSchema[feature][attribute]
|
||||||
.map((value) => {
|
.map((value) => {
|
||||||
let allowedSubscriptionTypes = this.allowedSubscriptionTypes(
|
let allowedSubscriptionTypes = this.allowedSubscriptionTypes(
|
||||||
feature,
|
feature,
|
||||||
|
|
|
@ -4,4 +4,4 @@
|
||||||
{{#if wizardErrorNotice}}
|
{{#if wizardErrorNotice}}
|
||||||
{{d-icon "exclaimation-circle"}}
|
{{d-icon "exclaimation-circle"}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
@ -9,7 +9,8 @@
|
||||||
value=wizardListVal
|
value=wizardListVal
|
||||||
content=wizardList
|
content=wizardList
|
||||||
onChange=(action "changeWizard")
|
onChange=(action "changeWizard")
|
||||||
options=(hash none="admin.wizard.select")
|
options=(hash
|
||||||
}}
|
none="admin.wizard.select"
|
||||||
|
)}}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
{{#each site.complete_custom_wizard as |wizard|}}
|
{{#each site.complete_custom_wizard as |wizard|}}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="alert alert-info alert-wizard">
|
<div class="alert alert-info alert-wizard">
|
||||||
<a href={{wizard.url}}>{{i18n
|
<a href={{wizard.url}}>{{i18n "wizard.complete_custom" name=wizard.name}}</a>
|
||||||
"wizard.complete_custom"
|
|
||||||
name=wizard.name
|
|
||||||
}}</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
|
|
@ -4,14 +4,10 @@ import CustomWizardApi from "../models/custom-wizard-api";
|
||||||
import { default as discourseComputed } from "discourse-common/utils/decorators";
|
import { default as discourseComputed } from "discourse-common/utils/decorators";
|
||||||
import { and, equal, not } from "@ember/object/computed";
|
import { and, equal, not } from "@ember/object/computed";
|
||||||
import { selectKitContent } from "../lib/wizard";
|
import { selectKitContent } from "../lib/wizard";
|
||||||
import { underscore } from "@ember/string";
|
|
||||||
import Controller from "@ember/controller";
|
import Controller from "@ember/controller";
|
||||||
import I18n from "I18n";
|
import I18n from "I18n";
|
||||||
import { inject as service } from "@ember/service";
|
|
||||||
|
|
||||||
export default Controller.extend({
|
export default Controller.extend({
|
||||||
router: service(),
|
|
||||||
|
|
||||||
queryParams: ["refresh_list"],
|
queryParams: ["refresh_list"],
|
||||||
loadingSubscriptions: false,
|
loadingSubscriptions: false,
|
||||||
notAuthorized: not("api.authorized"),
|
notAuthorized: not("api.authorized"),
|
||||||
|
@ -24,8 +20,29 @@ export default Controller.extend({
|
||||||
"application/x-www-form-urlencoded",
|
"application/x-www-form-urlencoded",
|
||||||
]),
|
]),
|
||||||
successCodes: selectKitContent([
|
successCodes: selectKitContent([
|
||||||
100, 101, 102, 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301,
|
100,
|
||||||
302, 303, 303, 304, 305, 306, 307, 308,
|
101,
|
||||||
|
102,
|
||||||
|
200,
|
||||||
|
201,
|
||||||
|
202,
|
||||||
|
203,
|
||||||
|
204,
|
||||||
|
205,
|
||||||
|
206,
|
||||||
|
207,
|
||||||
|
208,
|
||||||
|
226,
|
||||||
|
300,
|
||||||
|
301,
|
||||||
|
302,
|
||||||
|
303,
|
||||||
|
303,
|
||||||
|
304,
|
||||||
|
305,
|
||||||
|
306,
|
||||||
|
307,
|
||||||
|
308,
|
||||||
]),
|
]),
|
||||||
|
|
||||||
@discourseComputed(
|
@discourseComputed(
|
||||||
|
@ -101,7 +118,7 @@ export default Controller.extend({
|
||||||
|
|
||||||
if (authType === "oauth_2") {
|
if (authType === "oauth_2") {
|
||||||
this.set("authorizing", true);
|
this.set("authorizing", true);
|
||||||
ajax(`/admin/wizards/apis/${underscore(name)}/authorize`)
|
ajax(`/admin/wizards/apis/${name.underscore()}/authorize`)
|
||||||
.catch(popupAjaxError)
|
.catch(popupAjaxError)
|
||||||
.then((result) => {
|
.then((result) => {
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
|
@ -170,11 +187,11 @@ export default Controller.extend({
|
||||||
if (!api[rp]) {
|
if (!api[rp]) {
|
||||||
let key = rp.replace("auth", "");
|
let key = rp.replace("auth", "");
|
||||||
error = `${I18n.t(
|
error = `${I18n.t(
|
||||||
`admin.wizard.api.auth.${underscore(key)}`
|
`admin.wizard.api.auth.${key.underscore()}`
|
||||||
)} is required for ${authType}`;
|
)} is required for ${authType}`;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
data[underscore(rp)] = api[rp];
|
data[rp.underscore()] = api[rp];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,7 +221,7 @@ export default Controller.extend({
|
||||||
|
|
||||||
this.set("updating", true);
|
this.set("updating", true);
|
||||||
|
|
||||||
ajax(`/admin/wizards/api/${underscore(name)}`, {
|
ajax(`/admin/wizards/api/${name.underscore()}`, {
|
||||||
type: "PUT",
|
type: "PUT",
|
||||||
data,
|
data,
|
||||||
})
|
})
|
||||||
|
@ -227,7 +244,7 @@ export default Controller.extend({
|
||||||
|
|
||||||
this.set("updating", true);
|
this.set("updating", true);
|
||||||
|
|
||||||
ajax(`/admin/wizards/api/${underscore(name)}`, {
|
ajax(`/admin/wizards/api/${name.underscore()}`, {
|
||||||
type: "DELETE",
|
type: "DELETE",
|
||||||
})
|
})
|
||||||
.catch(popupAjaxError)
|
.catch(popupAjaxError)
|
||||||
|
@ -245,13 +262,13 @@ export default Controller.extend({
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ajax(`/admin/wizards/api/${underscore(name)}/logs`, {
|
ajax(`/admin/wizards/api/${name.underscore()}/logs`, {
|
||||||
type: "DELETE",
|
type: "DELETE",
|
||||||
})
|
})
|
||||||
.catch(popupAjaxError)
|
.catch(popupAjaxError)
|
||||||
.then((result) => {
|
.then((result) => {
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
this.router.transitionTo("adminWizardsApis").then(() => {
|
this.transitionToRoute("adminWizardsApis").then(() => {
|
||||||
this.send("refreshModel");
|
this.send("refreshModel");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
import Controller from "@ember/controller";
|
||||||
|
import ModalFunctionality from "discourse/mixins/modal-functionality";
|
||||||
|
|
||||||
|
export default Controller.extend(ModalFunctionality, {
|
||||||
|
actions: {
|
||||||
|
save() {
|
||||||
|
this.send("closeModal");
|
||||||
|
},
|
||||||
|
|
||||||
|
resetToDefault() {
|
||||||
|
this.get("model.reset")();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
|
@ -2,13 +2,11 @@ import Controller from "@ember/controller";
|
||||||
import { empty } from "@ember/object/computed";
|
import { empty } from "@ember/object/computed";
|
||||||
import discourseComputed from "discourse-common/utils/decorators";
|
import discourseComputed from "discourse-common/utils/decorators";
|
||||||
import { fmt } from "discourse/lib/computed";
|
import { fmt } from "discourse/lib/computed";
|
||||||
import { inject as service } from "@ember/service";
|
import showModal from "discourse/lib/show-modal";
|
||||||
import AdminWizardsColumnsModal from "../components/modal/admin-wizards-columns";
|
|
||||||
import CustomWizardAdmin from "../models/custom-wizard-admin";
|
import CustomWizardAdmin from "../models/custom-wizard-admin";
|
||||||
import { formatModel } from "../lib/wizard-submission";
|
import { formatModel } from "../lib/wizard-submission";
|
||||||
|
|
||||||
export default Controller.extend({
|
export default Controller.extend({
|
||||||
modal: service(),
|
|
||||||
downloadUrl: fmt("wizard.id", "/admin/wizards/submissions/%@/download"),
|
downloadUrl: fmt("wizard.id", "/admin/wizards/submissions/%@/download"),
|
||||||
noResults: empty("submissions"),
|
noResults: empty("submissions"),
|
||||||
page: 0,
|
page: 0,
|
||||||
|
@ -59,7 +57,7 @@ export default Controller.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
showEditColumnsModal() {
|
showEditColumnsModal() {
|
||||||
return this.modal.show(AdminWizardsColumnsModal, {
|
return showModal("admin-wizards-columns", {
|
||||||
model: {
|
model: {
|
||||||
columns: this.get("fields"),
|
columns: this.get("fields"),
|
||||||
reset: () => {
|
reset: () => {
|
||||||
|
|
|
@ -3,18 +3,15 @@ import {
|
||||||
observes,
|
observes,
|
||||||
} from "discourse-common/utils/decorators";
|
} from "discourse-common/utils/decorators";
|
||||||
import { notEmpty } from "@ember/object/computed";
|
import { notEmpty } from "@ember/object/computed";
|
||||||
import { inject as service } from "@ember/service";
|
import showModal from "discourse/lib/show-modal";
|
||||||
import NextSessionScheduledModal from "../components/modal/next-session-scheduled";
|
|
||||||
import { generateId, wizardFieldList } from "../lib/wizard";
|
import { generateId, wizardFieldList } from "../lib/wizard";
|
||||||
import { dasherize } from "@ember/string";
|
import { dasherize } from "@ember/string";
|
||||||
import { later, scheduleOnce } from "@ember/runloop";
|
import { later, scheduleOnce } from "@ember/runloop";
|
||||||
import Controller from "@ember/controller";
|
import Controller from "@ember/controller";
|
||||||
import copyText from "discourse/lib/copy-text";
|
import copyText from "discourse/lib/copy-text";
|
||||||
import I18n from "I18n";
|
import I18n from "I18n";
|
||||||
import { filterValues } from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard-schema";
|
|
||||||
|
|
||||||
export default Controller.extend({
|
export default Controller.extend({
|
||||||
modal: service(),
|
|
||||||
hasName: notEmpty("wizard.name"),
|
hasName: notEmpty("wizard.name"),
|
||||||
|
|
||||||
@observes("currentStep")
|
@observes("currentStep")
|
||||||
|
@ -62,19 +59,6 @@ export default Controller.extend({
|
||||||
}
|
}
|
||||||
return wizardFieldList(steps);
|
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) {
|
getErrorMessage(result) {
|
||||||
if (result.backend_validation_error) {
|
if (result.backend_validation_error) {
|
||||||
return result.backend_validation_error;
|
return result.backend_validation_error;
|
||||||
|
@ -128,13 +112,15 @@ export default Controller.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
setNextSessionScheduled() {
|
setNextSessionScheduled() {
|
||||||
this.modal.show(NextSessionScheduledModal, {
|
let controller = showModal("next-session-scheduled", {
|
||||||
model: {
|
model: {
|
||||||
dateTime: this.wizard.after_time_scheduled,
|
dateTime: this.wizard.after_time_scheduled,
|
||||||
update: (dateTime) =>
|
update: (dateTime) =>
|
||||||
this.set("wizard.after_time_scheduled", dateTime),
|
this.set("wizard.after_time_scheduled", dateTime),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
controller.setup();
|
||||||
},
|
},
|
||||||
|
|
||||||
copyUrl() {
|
copyUrl() {
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
import Controller from "@ember/controller";
|
import Controller from "@ember/controller";
|
||||||
import getUrl from "discourse-common/lib/get-url";
|
import getUrl from "discourse-common/lib/get-url";
|
||||||
import { inject as service } from "@ember/service";
|
|
||||||
|
|
||||||
export default Controller.extend({
|
export default Controller.extend({
|
||||||
router: service(),
|
|
||||||
wizard: null,
|
wizard: null,
|
||||||
step: null,
|
step: null,
|
||||||
|
|
||||||
|
@ -17,12 +15,12 @@ export default Controller.extend({
|
||||||
const wizardId = this.get("wizard.id");
|
const wizardId = this.get("wizard.id");
|
||||||
window.location.href = getUrl(`/w/${wizardId}/steps/${nextStepId}`);
|
window.location.href = getUrl(`/w/${wizardId}/steps/${nextStepId}`);
|
||||||
} else {
|
} else {
|
||||||
this.router.transitionTo("customWizardStep", nextStepId);
|
this.transitionToRoute("customWizardStep", nextStepId);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
goBack() {
|
goBack() {
|
||||||
this.router.transitionTo("customWizardStep", this.get("step.previous"));
|
this.transitionToRoute("customWizardStep", this.get("step.previous"));
|
||||||
},
|
},
|
||||||
|
|
||||||
showMessage(message) {
|
showMessage(message) {
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
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);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
22
assets/javascripts/discourse/helpers/char-counter.js.es6
Normale Datei
22
assets/javascripts/discourse/helpers/char-counter.js.es6
Normale Datei
|
@ -0,0 +1,22 @@
|
||||||
|
import { registerUnbound } from "discourse-common/lib/helpers";
|
||||||
|
import I18n from "I18n";
|
||||||
|
import Handlebars from "handlebars";
|
||||||
|
|
||||||
|
export default registerUnbound("char-counter", function (body, maxLength) {
|
||||||
|
let bodyLength = body ? body.length : 0;
|
||||||
|
let finalString;
|
||||||
|
|
||||||
|
if (maxLength) {
|
||||||
|
let isOverMax = bodyLength > maxLength ? "true" : "false";
|
||||||
|
finalString = `<div class="body-length" data-length=${bodyLength} data-over-max=${isOverMax}>${bodyLength} / ${I18n.t(
|
||||||
|
"wizard.x_characters",
|
||||||
|
{ count: parseInt(maxLength, 10) }
|
||||||
|
)}</div>`;
|
||||||
|
} else {
|
||||||
|
finalString = `<div class="body-length">${I18n.t("wizard.x_characters", {
|
||||||
|
count: parseInt(bodyLength, 10),
|
||||||
|
})}</div>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Handlebars.SafeString(finalString);
|
||||||
|
});
|
|
@ -1,25 +0,0 @@
|
||||||
import { registerUnbound } from "discourse-common/lib/helpers";
|
|
||||||
import I18n from "I18n";
|
|
||||||
import Handlebars from "handlebars";
|
|
||||||
|
|
||||||
export default registerUnbound(
|
|
||||||
"wizard-char-counter",
|
|
||||||
function (body, maxLength) {
|
|
||||||
let bodyLength = body ? body.length : 0;
|
|
||||||
let finalString;
|
|
||||||
|
|
||||||
if (maxLength) {
|
|
||||||
let isOverMax = bodyLength > maxLength ? "true" : "false";
|
|
||||||
finalString = `<div class="body-length" data-length=${bodyLength} data-over-max=${isOverMax}>${bodyLength} / ${I18n.t(
|
|
||||||
"wizard.x_characters",
|
|
||||||
{ count: parseInt(maxLength, 10) }
|
|
||||||
)}</div>`;
|
|
||||||
} else {
|
|
||||||
finalString = `<div class="body-length">${I18n.t("wizard.x_characters", {
|
|
||||||
count: parseInt(bodyLength, 10),
|
|
||||||
})}</div>`;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Handlebars.SafeString(finalString);
|
|
||||||
}
|
|
||||||
);
|
|
|
@ -69,10 +69,7 @@ export default {
|
||||||
},
|
},
|
||||||
|
|
||||||
_wizardInsertText(text, options) {
|
_wizardInsertText(text, options) {
|
||||||
if (
|
if (this.session.wizardEventFieldId === this.fieldId) {
|
||||||
this.session.wizardEventFieldId === this.fieldId &&
|
|
||||||
this.element
|
|
||||||
) {
|
|
||||||
this.insertText(text, options);
|
this.insertText(text, options);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -83,16 +80,6 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
api.modifyClass("component:category-chooser", {
|
|
||||||
categoriesByScope(options = {}) {
|
|
||||||
let categories = this._super(options);
|
|
||||||
|
|
||||||
return categories.filter((category) => {
|
|
||||||
return !category.custom_fields?.create_topic_wizard;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,16 +1,14 @@
|
||||||
import DiscourseURL from "discourse/lib/url";
|
import ApplicationRoute from "discourse/routes/application";
|
||||||
import { withPluginApi } from "discourse/lib/plugin-api";
|
|
||||||
import { dasherize } from "@ember/string";
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "custom-wizard-redirect",
|
name: "custom-wizard-redirect",
|
||||||
after: "message-bus",
|
after: "message-bus",
|
||||||
|
|
||||||
initialize(container) {
|
initialize: function (container) {
|
||||||
const messageBus = container.lookup("service:message-bus");
|
const messageBus = container.lookup("service:message-bus");
|
||||||
const siteSettings = container.lookup("service:site-settings");
|
const siteSettings = container.lookup("service:site-settings");
|
||||||
|
|
||||||
if (!siteSettings.custom_wizard_enabled) {
|
if (!siteSettings.custom_wizard_enabled || !messageBus) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,27 +17,28 @@ export default {
|
||||||
window.location.href = wizardUrl;
|
window.location.href = wizardUrl;
|
||||||
});
|
});
|
||||||
|
|
||||||
withPluginApi("0.8.36", (api) => {
|
ApplicationRoute.reopen({
|
||||||
api.onAppEvent("page:changed", (data) => {
|
actions: {
|
||||||
const currentUser = api.getCurrentUser();
|
willTransition(transition) {
|
||||||
|
const redirectToWizard = this.get("currentUser.redirect_to_wizard");
|
||||||
if (currentUser) {
|
const excludedPaths = this.siteSettings.wizard_redirect_exclude_paths
|
||||||
const redirectToWizard = currentUser.redirect_to_wizard;
|
|
||||||
const excludedPaths = siteSettings.wizard_redirect_exclude_paths
|
|
||||||
.split("|")
|
.split("|")
|
||||||
.concat(["loading"]);
|
.concat(["loading"]);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
redirectToWizard &&
|
redirectToWizard &&
|
||||||
!data.url.includes("ignore_redirect") &&
|
(!transition.intent.name ||
|
||||||
data.currentRouteName !== "customWizardStep" &&
|
!excludedPaths.find((p) => {
|
||||||
!excludedPaths.find((p) => {
|
return transition.intent.name.indexOf(p) > -1;
|
||||||
return data.currentRouteName.indexOf(p) > -1;
|
}))
|
||||||
})
|
|
||||||
) {
|
) {
|
||||||
DiscourseURL.routeTo(`/w/${dasherize(redirectToWizard)}`);
|
transition.abort();
|
||||||
|
window.location = "/w/" + redirectToWizard.dasherize();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
return this._super(transition);
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -35,7 +35,6 @@ function inputTypesContent(options = {}) {
|
||||||
const connectors = {
|
const connectors = {
|
||||||
pair: [
|
pair: [
|
||||||
"equal",
|
"equal",
|
||||||
"not_equal",
|
|
||||||
"greater",
|
"greater",
|
||||||
"less",
|
"less",
|
||||||
"greater_or_equal",
|
"greater_or_equal",
|
||||||
|
|
|
@ -72,7 +72,6 @@ const field = {
|
||||||
required: null,
|
required: null,
|
||||||
type: null,
|
type: null,
|
||||||
condition: null,
|
condition: null,
|
||||||
tag_groups: null,
|
|
||||||
},
|
},
|
||||||
types: {},
|
types: {},
|
||||||
mapped: ["prefill", "content", "condition", "index"],
|
mapped: ["prefill", "content", "condition", "index"],
|
||||||
|
@ -211,42 +210,11 @@ const action = {
|
||||||
objectArrays: {},
|
objectArrays: {},
|
||||||
};
|
};
|
||||||
|
|
||||||
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 = {
|
const custom_field = {
|
||||||
klass: ["topic", "post", "group", "category"],
|
klass: ["topic", "post", "group", "category"],
|
||||||
type: ["string", "boolean", "integer", "json"],
|
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);
|
field.type = Object.keys(field.types);
|
||||||
action.type = Object.keys(action.types);
|
action.type = Object.keys(action.types);
|
||||||
|
|
||||||
|
@ -256,29 +224,16 @@ const wizardSchema = {
|
||||||
field,
|
field,
|
||||||
custom_field,
|
custom_field,
|
||||||
action,
|
action,
|
||||||
filters,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export function buildFieldTypes(types) {
|
||||||
|
wizardSchema.field.types = types;
|
||||||
|
}
|
||||||
|
|
||||||
export function buildFieldValidations(validations) {
|
export function buildFieldValidations(validations) {
|
||||||
wizardSchema.field.validations = validations;
|
wizardSchema.field.validations = validations;
|
||||||
}
|
}
|
||||||
|
|
||||||
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 = getOwner(this).lookup("service:site-settings");
|
const siteSettings = getOwner(this).lookup("service:site-settings");
|
||||||
if (siteSettings.wizard_apis_enabled) {
|
if (siteSettings.wizard_apis_enabled) {
|
||||||
wizardSchema.action.types.send_to_api = {
|
wizardSchema.action.types.send_to_api = {
|
||||||
|
|
|
@ -4,8 +4,6 @@ import { get, set } from "@ember/object";
|
||||||
import Mixin from "@ember/object/mixin";
|
import Mixin from "@ember/object/mixin";
|
||||||
import { deepEqual } from "discourse-common/lib/object";
|
import { deepEqual } from "discourse-common/lib/object";
|
||||||
|
|
||||||
const observedCache = [];
|
|
||||||
|
|
||||||
export default Mixin.create({
|
export default Mixin.create({
|
||||||
didInsertElement() {
|
didInsertElement() {
|
||||||
this._super(...arguments);
|
this._super(...arguments);
|
||||||
|
@ -34,13 +32,7 @@ export default Mixin.create({
|
||||||
};
|
};
|
||||||
|
|
||||||
listProperties(componentType, opts).forEach((property) => {
|
listProperties(componentType, opts).forEach((property) => {
|
||||||
if (observedCache.includes(property)) {
|
obj.removeObserver(property, this, this.toggleUndo);
|
||||||
obj.removeObserver(property, this, this.toggleUndo);
|
|
||||||
let index = observedCache.indexOf(property);
|
|
||||||
if (index !== -1) {
|
|
||||||
observedCache.splice(index, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -53,9 +45,6 @@ export default Mixin.create({
|
||||||
};
|
};
|
||||||
|
|
||||||
listProperties(componentType, opts).forEach((property) => {
|
listProperties(componentType, opts).forEach((property) => {
|
||||||
if (observedCache.indexOf(property) === -1) {
|
|
||||||
observedCache.push(property);
|
|
||||||
}
|
|
||||||
obj.addObserver(property, this, this.toggleUndo);
|
obj.addObserver(property, this, this.toggleUndo);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
|
@ -5,20 +5,8 @@ import wizardSchema from "../lib/wizard-schema";
|
||||||
import { Promise } from "rsvp";
|
import { Promise } from "rsvp";
|
||||||
import { ajax } from "discourse/lib/ajax";
|
import { ajax } from "discourse/lib/ajax";
|
||||||
import { popupAjaxError } from "discourse/lib/ajax-error";
|
import { popupAjaxError } from "discourse/lib/ajax-error";
|
||||||
import discourseComputed from "discourse-common/utils/decorators";
|
|
||||||
|
|
||||||
const GUEST_GROUP_ID = -1;
|
|
||||||
|
|
||||||
const CustomWizardAdmin = EmberObject.extend({
|
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) {
|
save(opts) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
let wizard = this.buildJson(this, "wizard");
|
let wizard = this.buildJson(this, "wizard");
|
||||||
|
|
|
@ -72,7 +72,7 @@ export default EmberObject.extend(ValidState, {
|
||||||
valid = true;
|
valid = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setValid(Boolean(valid));
|
this.setValid(valid);
|
||||||
|
|
||||||
return valid;
|
return valid;
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
import CustomWizardApi from "../models/custom-wizard-api";
|
import CustomWizardApi from "../models/custom-wizard-api";
|
||||||
import DiscourseRoute from "discourse/routes/discourse";
|
import DiscourseRoute from "discourse/routes/discourse";
|
||||||
import { inject as service } from "@ember/service";
|
|
||||||
|
|
||||||
export default DiscourseRoute.extend({
|
export default DiscourseRoute.extend({
|
||||||
router: service(),
|
|
||||||
|
|
||||||
model(params) {
|
model(params) {
|
||||||
if (params.name === "create") {
|
if (params.name === "create") {
|
||||||
return CustomWizardApi.create({ isNew: true });
|
return CustomWizardApi.create({ isNew: true });
|
||||||
|
@ -13,12 +10,6 @@ export default DiscourseRoute.extend({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
afterModel(model) {
|
|
||||||
if (model === null) {
|
|
||||||
return this.router.transitionTo("adminWizardsApi");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
setupController(controller, model) {
|
setupController(controller, model) {
|
||||||
controller.set("api", model);
|
controller.set("api", model);
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
import DiscourseRoute from "discourse/routes/discourse";
|
import DiscourseRoute from "discourse/routes/discourse";
|
||||||
import CustomWizardApi from "../models/custom-wizard-api";
|
import CustomWizardApi from "../models/custom-wizard-api";
|
||||||
import { inject as service } from "@ember/service";
|
|
||||||
|
|
||||||
export default DiscourseRoute.extend({
|
export default DiscourseRoute.extend({
|
||||||
router: service(),
|
|
||||||
|
|
||||||
model() {
|
model() {
|
||||||
return CustomWizardApi.list();
|
return CustomWizardApi.list();
|
||||||
},
|
},
|
||||||
|
@ -28,11 +25,11 @@ export default DiscourseRoute.extend({
|
||||||
actions: {
|
actions: {
|
||||||
changeApi(apiName) {
|
changeApi(apiName) {
|
||||||
this.controllerFor("adminWizardsApi").set("apiName", apiName);
|
this.controllerFor("adminWizardsApi").set("apiName", apiName);
|
||||||
this.router.transitionTo("adminWizardsApiShow", apiName);
|
this.transitionTo("adminWizardsApiShow", apiName);
|
||||||
},
|
},
|
||||||
|
|
||||||
afterDestroy() {
|
afterDestroy() {
|
||||||
this.router.transitionTo("adminWizardsApi").then(() => this.refresh());
|
this.transitionTo("adminWizardsApi").then(() => this.refresh());
|
||||||
},
|
},
|
||||||
|
|
||||||
afterSave(apiName) {
|
afterSave(apiName) {
|
||||||
|
@ -41,7 +38,7 @@ export default DiscourseRoute.extend({
|
||||||
|
|
||||||
createApi() {
|
createApi() {
|
||||||
this.controllerFor("adminWizardsApi").set("apiName", "create");
|
this.controllerFor("adminWizardsApi").set("apiName", "create");
|
||||||
this.router.transitionTo("adminWizardsApiShow", "create");
|
this.transitionTo("adminWizardsApiShow", "create");
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,21 +1,12 @@
|
||||||
import CustomWizardLogs from "../models/custom-wizard-logs";
|
import CustomWizardLogs from "../models/custom-wizard-logs";
|
||||||
import DiscourseRoute from "discourse/routes/discourse";
|
import DiscourseRoute from "discourse/routes/discourse";
|
||||||
import { A } from "@ember/array";
|
import { A } from "@ember/array";
|
||||||
import { inject as service } from "@ember/service";
|
|
||||||
|
|
||||||
export default DiscourseRoute.extend({
|
export default DiscourseRoute.extend({
|
||||||
router: service(),
|
|
||||||
|
|
||||||
model(params) {
|
model(params) {
|
||||||
return CustomWizardLogs.list(params.wizardId);
|
return CustomWizardLogs.list(params.wizardId);
|
||||||
},
|
},
|
||||||
|
|
||||||
afterModel(model) {
|
|
||||||
if (model === null) {
|
|
||||||
return this.router.transitionTo("adminWizardsLogs");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
setupController(controller, model) {
|
setupController(controller, model) {
|
||||||
controller.setProperties({
|
controller.setProperties({
|
||||||
wizard: model.wizard,
|
wizard: model.wizard,
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
import DiscourseRoute from "discourse/routes/discourse";
|
import DiscourseRoute from "discourse/routes/discourse";
|
||||||
import { ajax } from "discourse/lib/ajax";
|
import { ajax } from "discourse/lib/ajax";
|
||||||
import { inject as service } from "@ember/service";
|
|
||||||
|
|
||||||
export default DiscourseRoute.extend({
|
export default DiscourseRoute.extend({
|
||||||
router: service(),
|
|
||||||
|
|
||||||
model() {
|
model() {
|
||||||
return ajax(`/admin/wizards/wizard`);
|
return ajax(`/admin/wizards/wizard`);
|
||||||
},
|
},
|
||||||
|
@ -21,7 +18,7 @@ export default DiscourseRoute.extend({
|
||||||
actions: {
|
actions: {
|
||||||
changeWizard(wizardId) {
|
changeWizard(wizardId) {
|
||||||
this.controllerFor("adminWizardsLogs").set("wizardId", wizardId);
|
this.controllerFor("adminWizardsLogs").set("wizardId", wizardId);
|
||||||
this.router.transitionTo("adminWizardsLogsShow", wizardId);
|
this.transitionTo("adminWizardsLogsShow", wizardId);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -2,21 +2,12 @@ import { A } from "@ember/array";
|
||||||
import CustomWizardAdmin from "../models/custom-wizard-admin";
|
import CustomWizardAdmin from "../models/custom-wizard-admin";
|
||||||
import DiscourseRoute from "discourse/routes/discourse";
|
import DiscourseRoute from "discourse/routes/discourse";
|
||||||
import { formatModel } from "../lib/wizard-submission";
|
import { formatModel } from "../lib/wizard-submission";
|
||||||
import { inject as service } from "@ember/service";
|
|
||||||
|
|
||||||
export default DiscourseRoute.extend({
|
export default DiscourseRoute.extend({
|
||||||
router: service(),
|
|
||||||
|
|
||||||
model(params) {
|
model(params) {
|
||||||
return CustomWizardAdmin.submissions(params.wizardId);
|
return CustomWizardAdmin.submissions(params.wizardId);
|
||||||
},
|
},
|
||||||
|
|
||||||
afterModel(model) {
|
|
||||||
if (model === null) {
|
|
||||||
return this.router.transitionTo("adminWizardsSubmissions");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
setupController(controller, model) {
|
setupController(controller, model) {
|
||||||
const { fields, submissions } = formatModel(model);
|
const { fields, submissions } = formatModel(model);
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
import DiscourseRoute from "discourse/routes/discourse";
|
import DiscourseRoute from "discourse/routes/discourse";
|
||||||
import { ajax } from "discourse/lib/ajax";
|
import { ajax } from "discourse/lib/ajax";
|
||||||
import { inject as service } from "@ember/service";
|
|
||||||
|
|
||||||
export default DiscourseRoute.extend({
|
export default DiscourseRoute.extend({
|
||||||
router: service(),
|
|
||||||
|
|
||||||
model() {
|
model() {
|
||||||
return ajax(`/admin/wizards/wizard`);
|
return ajax(`/admin/wizards/wizard`);
|
||||||
},
|
},
|
||||||
|
@ -21,7 +18,7 @@ export default DiscourseRoute.extend({
|
||||||
actions: {
|
actions: {
|
||||||
changeWizard(wizardId) {
|
changeWizard(wizardId) {
|
||||||
this.controllerFor("adminWizardsSubmissions").set("wizardId", wizardId);
|
this.controllerFor("adminWizardsSubmissions").set("wizardId", wizardId);
|
||||||
this.router.transitionTo("adminWizardsSubmissionsShow", wizardId);
|
this.transitionTo("adminWizardsSubmissionsShow", wizardId);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -2,11 +2,8 @@ import CustomWizardAdmin from "../models/custom-wizard-admin";
|
||||||
import { ajax } from "discourse/lib/ajax";
|
import { ajax } from "discourse/lib/ajax";
|
||||||
import DiscourseRoute from "discourse/routes/discourse";
|
import DiscourseRoute from "discourse/routes/discourse";
|
||||||
import I18n from "I18n";
|
import I18n from "I18n";
|
||||||
import { inject as service } from "@ember/service";
|
|
||||||
|
|
||||||
export default DiscourseRoute.extend({
|
export default DiscourseRoute.extend({
|
||||||
router: service(),
|
|
||||||
|
|
||||||
model(params) {
|
model(params) {
|
||||||
if (params.wizardId === "create") {
|
if (params.wizardId === "create") {
|
||||||
return { create: true };
|
return { create: true };
|
||||||
|
@ -17,7 +14,7 @@ export default DiscourseRoute.extend({
|
||||||
|
|
||||||
afterModel(model) {
|
afterModel(model) {
|
||||||
if (model.none) {
|
if (model.none) {
|
||||||
return this.router.transitionTo("adminWizardsWizard");
|
return this.transitionTo("adminWizardsWizard");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -4,11 +4,8 @@ import EmberObject, { set } from "@ember/object";
|
||||||
import { A } from "@ember/array";
|
import { A } from "@ember/array";
|
||||||
import { all } from "rsvp";
|
import { all } from "rsvp";
|
||||||
import { ajax } from "discourse/lib/ajax";
|
import { ajax } from "discourse/lib/ajax";
|
||||||
import { inject as service } from "@ember/service";
|
|
||||||
|
|
||||||
export default DiscourseRoute.extend({
|
export default DiscourseRoute.extend({
|
||||||
router: service(),
|
|
||||||
|
|
||||||
model() {
|
model() {
|
||||||
return ajax("/admin/wizards/wizard");
|
return ajax("/admin/wizards/wizard");
|
||||||
},
|
},
|
||||||
|
@ -83,14 +80,14 @@ export default DiscourseRoute.extend({
|
||||||
this.controllerFor("adminWizardsWizard").set("wizardId", wizardId);
|
this.controllerFor("adminWizardsWizard").set("wizardId", wizardId);
|
||||||
|
|
||||||
if (wizardId) {
|
if (wizardId) {
|
||||||
this.router.transitionTo("adminWizardsWizardShow", wizardId);
|
this.transitionTo("adminWizardsWizardShow", wizardId);
|
||||||
} else {
|
} else {
|
||||||
this.router.transitionTo("adminWizardsWizard");
|
this.transitionTo("adminWizardsWizard");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
afterDestroy() {
|
afterDestroy() {
|
||||||
this.router.transitionTo("adminWizardsWizard").then(() => this.refresh());
|
this.transitionTo("adminWizardsWizard").then(() => this.refresh());
|
||||||
},
|
},
|
||||||
|
|
||||||
afterSave(wizardId) {
|
afterSave(wizardId) {
|
||||||
|
@ -99,7 +96,7 @@ export default DiscourseRoute.extend({
|
||||||
|
|
||||||
createWizard() {
|
createWizard() {
|
||||||
this.controllerFor("adminWizardsWizard").set("wizardId", "create");
|
this.controllerFor("adminWizardsWizard").set("wizardId", "create");
|
||||||
this.router.transitionTo("adminWizardsWizardShow", "create");
|
this.transitionTo("adminWizardsWizardShow", "create");
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
import DiscourseRoute from "discourse/routes/discourse";
|
import DiscourseRoute from "discourse/routes/discourse";
|
||||||
import { ajax } from "discourse/lib/ajax";
|
import { ajax } from "discourse/lib/ajax";
|
||||||
import { inject as service } from "@ember/service";
|
|
||||||
|
|
||||||
export default DiscourseRoute.extend({
|
export default DiscourseRoute.extend({
|
||||||
router: service(),
|
|
||||||
|
|
||||||
model() {
|
model() {
|
||||||
return ajax("/admin/wizards");
|
return ajax("/admin/wizards");
|
||||||
},
|
},
|
||||||
|
@ -20,7 +17,7 @@ export default DiscourseRoute.extend({
|
||||||
|
|
||||||
afterModel(model, transition) {
|
afterModel(model, transition) {
|
||||||
if (transition.targetName === "adminWizards.index") {
|
if (transition.targetName === "adminWizards.index") {
|
||||||
this.router.transitionTo("adminWizardsWizard");
|
this.transitionTo("adminWizardsWizard");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,14 +1,17 @@
|
||||||
import { getCachedWizard } from "../models/custom-wizard";
|
import { getCachedWizard } from "../models/custom-wizard";
|
||||||
import Route from "@ember/routing/route";
|
import Route from "@ember/routing/route";
|
||||||
import { inject as service } from "@ember/service";
|
|
||||||
|
|
||||||
export default Route.extend({
|
export default Route.extend({
|
||||||
router: service(),
|
|
||||||
|
|
||||||
beforeModel() {
|
beforeModel() {
|
||||||
const wizard = getCachedWizard();
|
const wizard = getCachedWizard();
|
||||||
if (wizard && wizard.permitted && !wizard.completed && wizard.start) {
|
if (
|
||||||
this.router.replaceWith("customWizardStep", wizard.start);
|
wizard &&
|
||||||
|
wizard.user &&
|
||||||
|
wizard.permitted &&
|
||||||
|
!wizard.completed &&
|
||||||
|
wizard.start
|
||||||
|
) {
|
||||||
|
this.replaceWith("customWizardStep", wizard.start);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -23,7 +26,7 @@ export default Route.extend({
|
||||||
const wizardId = model.get("id");
|
const wizardId = model.get("id");
|
||||||
const user = model.get("user");
|
const user = model.get("user");
|
||||||
const name = model.get("name");
|
const name = model.get("name");
|
||||||
const requiresLogin = !user && !permitted;
|
const requiresLogin = !user;
|
||||||
const notPermitted = !permitted;
|
const notPermitted = !permitted;
|
||||||
|
|
||||||
const props = {
|
const props = {
|
||||||
|
|
|
@ -1,19 +1,14 @@
|
||||||
import I18n from "I18n";
|
import I18n from "I18n";
|
||||||
import { getCachedWizard } from "../models/custom-wizard";
|
import { getCachedWizard } from "../models/custom-wizard";
|
||||||
import Route from "@ember/routing/route";
|
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({
|
export default Route.extend({
|
||||||
router: service(),
|
|
||||||
|
|
||||||
beforeModel() {
|
beforeModel() {
|
||||||
const wizard = getCachedWizard();
|
const wizard = getCachedWizard();
|
||||||
this.set("wizard", wizard);
|
this.set("wizard", wizard);
|
||||||
|
|
||||||
if (!wizard || !wizard.permitted || wizard.completed) {
|
if (!wizard || !wizard.user || !wizard.permitted || wizard.completed) {
|
||||||
this.router.replaceWith("customWizard");
|
this.replaceWith("customWizard");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -30,7 +25,7 @@ export default Route.extend({
|
||||||
|
|
||||||
afterModel(model) {
|
afterModel(model) {
|
||||||
if (model.completed) {
|
if (model.completed) {
|
||||||
return this.router.transitionTo("wizard.index");
|
return this.transitionTo("wizard.index");
|
||||||
}
|
}
|
||||||
return model.set("wizardId", this.wizard.id);
|
return model.set("wizardId", this.wizard.id);
|
||||||
},
|
},
|
||||||
|
@ -53,10 +48,4 @@ export default Route.extend({
|
||||||
|
|
||||||
controller.setProperties(props);
|
controller.setProperties(props);
|
||||||
},
|
},
|
||||||
|
|
||||||
@action
|
|
||||||
didTransition() {
|
|
||||||
scrollTop();
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import { findCustomWizard, updateCachedWizard } from "../models/custom-wizard";
|
import { findCustomWizard, updateCachedWizard } from "../models/custom-wizard";
|
||||||
import I18n from "I18n";
|
import I18n from "I18n";
|
||||||
import DiscourseRoute from "discourse/routes/discourse";
|
import DiscourseRoute from "discourse/routes/discourse";
|
||||||
import bootbox from "bootbox";
|
|
||||||
|
|
||||||
export default DiscourseRoute.extend({
|
export default DiscourseRoute.extend({
|
||||||
titleToken() {
|
titleToken() {
|
||||||
|
|
|
@ -8,12 +8,7 @@
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{d-button
|
{{d-button label="admin.wizard.api.save" action=(action "save") class="btn-primary" disabled=saveDisabled}}
|
||||||
label="admin.wizard.api.save"
|
|
||||||
action=(action "save")
|
|
||||||
class="btn-primary"
|
|
||||||
disabled=saveDisabled
|
|
||||||
}}
|
|
||||||
|
|
||||||
{{#if showRemove}}
|
{{#if showRemove}}
|
||||||
{{d-button action=(action "remove") label="admin.wizard.api.remove"}}
|
{{d-button action=(action "remove") label="admin.wizard.api.remove"}}
|
||||||
|
@ -37,19 +32,13 @@
|
||||||
<div class="metadata">
|
<div class="metadata">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<label>{{i18n "admin.wizard.api.title"}}</label>
|
<label>{{i18n "admin.wizard.api.title"}}</label>
|
||||||
<Input
|
{{input value=api.title placeholder=(i18n "admin.wizard.api.title_placeholder")}}
|
||||||
@value={{this.api.title}}
|
|
||||||
placeholder={{i18n "admin.wizard.api.title_placeholder"}}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="name {{nameClass}}">
|
<div class="name {{nameClass}}">
|
||||||
<label>{{i18n "admin.wizard.api.name"}}</label>
|
<label>{{i18n "admin.wizard.api.name"}}</label>
|
||||||
{{#if api.isNew}}
|
{{#if api.isNew}}
|
||||||
<Input
|
{{input value=api.name placeholder=(i18n "admin.wizard.api.name_placeholder")}}
|
||||||
@value={{this.api.name}}
|
|
||||||
placeholder={{i18n "admin.wizard.api.name_placeholder"}}
|
|
||||||
/>
|
|
||||||
{{else}}
|
{{else}}
|
||||||
<span>{{api.name}}</span>
|
<span>{{api.name}}</span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
@ -67,12 +56,10 @@
|
||||||
<span>{{authErrorMessage}}</span>
|
<span>{{authErrorMessage}}</span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{d-button
|
{{d-button label="admin.wizard.api.auth.btn"
|
||||||
label="admin.wizard.api.auth.btn"
|
action=(action "authorize")
|
||||||
action=(action "authorize")
|
disabled=authDisabled
|
||||||
disabled=authDisabled
|
class="btn-primary"}}
|
||||||
class="btn-primary"
|
|
||||||
}}
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -106,8 +93,9 @@
|
||||||
value=api.authType
|
value=api.authType
|
||||||
content=authorizationTypes
|
content=authorizationTypes
|
||||||
onChange=(action (mut api.authType))
|
onChange=(action (mut api.authType))
|
||||||
options=(hash none="admin.wizard.api.auth.type_none")
|
options=(hash
|
||||||
}}
|
none="admin.wizard.api.auth.type_none"
|
||||||
|
)}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -116,7 +104,7 @@
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label>{{i18n "admin.wizard.api.auth.url"}}</label>
|
<label>{{i18n "admin.wizard.api.auth.url"}}</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<Input @value={{this.api.authUrl}} />
|
{{input value=api.authUrl}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
@ -124,21 +112,21 @@
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label>{{i18n "admin.wizard.api.auth.token_url"}}</label>
|
<label>{{i18n "admin.wizard.api.auth.token_url"}}</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<Input @value={{this.api.tokenUrl}} />
|
{{input value=api.tokenUrl}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label>{{i18n "admin.wizard.api.auth.client_id"}}</label>
|
<label>{{i18n "admin.wizard.api.auth.client_id"}}</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<Input @value={{this.api.clientId}} />
|
{{input value=api.clientId}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label>{{i18n "admin.wizard.api.auth.client_secret"}}</label>
|
<label>{{i18n "admin.wizard.api.auth.client_secret"}}</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<Input @value={{this.api.clientSecret}} />
|
{{input value=api.clientSecret}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -147,26 +135,12 @@
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
{{#each api.authParams as |param|}}
|
{{#each api.authParams as |param|}}
|
||||||
<div class="param">
|
<div class="param">
|
||||||
<Input
|
{{input value=param.key placeholder=(i18n "admin.wizard.key")}}
|
||||||
@value={{this.param.key}}
|
{{input value=param.value placeholder=(i18n "admin.wizard.value")}}
|
||||||
placeholder={{i18n "admin.wizard.key"}}
|
{{d-button action=(action "removeParam") actionParam=param icon="times"}}
|
||||||
/>
|
|
||||||
<Input
|
|
||||||
@value={{this.param.value}}
|
|
||||||
placeholder={{i18n "admin.wizard.value"}}
|
|
||||||
/>
|
|
||||||
{{d-button
|
|
||||||
action=(action "removeParam")
|
|
||||||
actionParam=param
|
|
||||||
icon="times"
|
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{d-button
|
{{d-button label="admin.wizard.api.auth.params.new" icon="plus" action=(action "addParam")}}
|
||||||
label="admin.wizard.api.auth.params.new"
|
|
||||||
icon="plus"
|
|
||||||
action=(action "addParam")
|
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
@ -175,14 +149,14 @@
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label>{{i18n "admin.wizard.api.auth.username"}}</label>
|
<label>{{i18n "admin.wizard.api.auth.username"}}</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<Input @value={{this.api.username}} />
|
{{input value=api.username}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label>{{i18n "admin.wizard.api.auth.password"}}</label>
|
<label>{{i18n "admin.wizard.api.auth.password"}}</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<Input @value={{this.api.password}} />
|
{{input value=api.password}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
@ -251,11 +225,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="wizard-api-endpoints">
|
<div class="wizard-api-endpoints">
|
||||||
{{d-button
|
{{d-button action=(action "addEndpoint") label="admin.wizard.api.endpoint.add" icon="plus"}}
|
||||||
action=(action "addEndpoint")
|
|
||||||
label="admin.wizard.api.endpoint.add"
|
|
||||||
icon="plus"
|
|
||||||
}}
|
|
||||||
|
|
||||||
{{#if api.endpoints}}
|
{{#if api.endpoints}}
|
||||||
<div class="endpoint-list">
|
<div class="endpoint-list">
|
||||||
|
@ -265,43 +235,38 @@
|
||||||
<div class="endpoint">
|
<div class="endpoint">
|
||||||
<div class="endpoint-">
|
<div class="endpoint-">
|
||||||
<div class="top">
|
<div class="top">
|
||||||
<Input
|
{{input value=endpoint.name
|
||||||
@value={{endpoint.name}}
|
placeholder=(i18n "admin.wizard.api.endpoint.name")}}
|
||||||
placeholder={{i18n "admin.wizard.api.endpoint.name"}}
|
{{input value=endpoint.url
|
||||||
/>
|
placeholder=(i18n "admin.wizard.api.endpoint.url")
|
||||||
<Input
|
class="endpoint-url"}}
|
||||||
@value={{endpoint.url}}
|
{{d-button action=(action "removeEndpoint")
|
||||||
placeholder={{i18n "admin.wizard.api.endpoint.url"}}
|
actionParam=endpoint
|
||||||
class="endpoint-url"
|
icon="times"
|
||||||
/>
|
class="remove-endpoint"}}
|
||||||
{{d-button
|
|
||||||
action=(action "removeEndpoint")
|
|
||||||
actionParam=endpoint
|
|
||||||
icon="times"
|
|
||||||
class="remove-endpoint"
|
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
<div class="bottom">
|
<div class="bottom">
|
||||||
{{combo-box
|
{{combo-box
|
||||||
content=endpointMethods
|
content=endpointMethods
|
||||||
value=endpoint.method
|
value=endpoint.method
|
||||||
onChange=(action (mut endpoint.method))
|
onChange=(action (mut endpoint.method))
|
||||||
options=(hash none="admin.wizard.api.endpoint.method")
|
options=(hash
|
||||||
}}
|
none="admin.wizard.api.endpoint.method"
|
||||||
|
)}}
|
||||||
{{combo-box
|
{{combo-box
|
||||||
content=contentTypes
|
content=contentTypes
|
||||||
value=endpoint.content_type
|
value=endpoint.content_type
|
||||||
onChange=(action (mut endpoint.content_type))
|
onChange=(action (mut endpoint.content_type))
|
||||||
options=(hash none="admin.wizard.api.endpoint.content_type")
|
options=(hash
|
||||||
}}
|
none="admin.wizard.api.endpoint.content_type"
|
||||||
|
)}}
|
||||||
{{multi-select
|
{{multi-select
|
||||||
value=endpoint.success_codes
|
value=endpoint.success_codes
|
||||||
content=successCodes
|
content=successCodes
|
||||||
onChange=(action (mut endpoint.success_codes))
|
onChange=(action (mut endpoint.success_codes))
|
||||||
options=(hash
|
options=(hash
|
||||||
none="admin.wizard.api.endpoint.success_codes"
|
none="admin.wizard.api.endpoint.success_codes"
|
||||||
)
|
)}}
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -319,8 +284,7 @@
|
||||||
{{d-button
|
{{d-button
|
||||||
action=(action "clearLogs")
|
action=(action "clearLogs")
|
||||||
class="clear-logs"
|
class="clear-logs"
|
||||||
label="admin.wizard.api.log.clear"
|
label="admin.wizard.api.log.clear"}}
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -340,10 +304,7 @@
|
||||||
<td>{{logentry.time}}</td>
|
<td>{{logentry.time}}</td>
|
||||||
<td class="user-image">
|
<td class="user-image">
|
||||||
<div class="user-image-inner">
|
<div class="user-image-inner">
|
||||||
<a
|
<a href={{logentry.userpath}} data-user-card={{logentry.username}}>{{avatar logentry imageSize="medium"}}</a>
|
||||||
href={{logentry.userpath}}
|
|
||||||
data-user-card={{logentry.username}}
|
|
||||||
>{{avatar logentry imageSize="medium"}}</a>
|
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td>{{logentry.status}}</td>
|
<td>{{logentry.status}}</td>
|
||||||
|
@ -354,4 +315,4 @@
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -3,16 +3,16 @@
|
||||||
value=apiName
|
value=apiName
|
||||||
content=apiList
|
content=apiList
|
||||||
onChange=(route-action "changeApi")
|
onChange=(route-action "changeApi")
|
||||||
options=(hash none="admin.wizard.api.select")
|
options=(hash
|
||||||
}}
|
none="admin.wizard.api.select"
|
||||||
|
)}}
|
||||||
|
|
||||||
{{d-button
|
{{d-button
|
||||||
action=(route-action "createApi")
|
action=(route-action "createApi")
|
||||||
label="admin.wizard.api.create"
|
label="admin.wizard.api.create"
|
||||||
icon="plus"
|
icon="plus"}}
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="admin-wizard-container">
|
<div class="admin-wizard-container">
|
||||||
{{outlet}}
|
{{outlet}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -5,8 +5,7 @@
|
||||||
{{d-button
|
{{d-button
|
||||||
label="admin.wizard.custom_field.add"
|
label="admin.wizard.custom_field.add"
|
||||||
icon="plus"
|
icon="plus"
|
||||||
action=(action "addField")
|
action=(action "addField")}}
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -15,8 +14,7 @@
|
||||||
opts=messageOpts
|
opts=messageOpts
|
||||||
type=messageType
|
type=messageType
|
||||||
url=documentationUrl
|
url=documentationUrl
|
||||||
component="custom_fields"
|
component="custom_fields"}}
|
||||||
}}
|
|
||||||
|
|
||||||
<div class="admin-wizard-container">
|
<div class="admin-wizard-container">
|
||||||
{{#if customFields}}
|
{{#if customFields}}
|
||||||
|
@ -34,10 +32,9 @@
|
||||||
{{custom-field-input
|
{{custom-field-input
|
||||||
field=field
|
field=field
|
||||||
removeField=(action "removeField")
|
removeField=(action "removeField")
|
||||||
saveField=(action "saveField")
|
saveField=(action "saveField")}}
|
||||||
}}
|
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -9,8 +9,7 @@
|
||||||
label="refresh"
|
label="refresh"
|
||||||
icon="sync"
|
icon="sync"
|
||||||
action=(action "refresh")
|
action=(action "refresh")
|
||||||
class="refresh"
|
class="refresh"}}
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -32,10 +31,7 @@
|
||||||
{{#each logs as |log|}}
|
{{#each logs as |log|}}
|
||||||
<tr>
|
<tr>
|
||||||
{{#each-in log as |field value|}}
|
{{#each-in log as |field value|}}
|
||||||
<td class="small">{{wizard-table-field
|
<td class="small">{{wizard-table-field field=field value=value}}</td>
|
||||||
field=field
|
|
||||||
value=value
|
|
||||||
}}</td>
|
|
||||||
{{/each-in}}
|
{{/each-in}}
|
||||||
</tr>
|
</tr>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
@ -46,4 +42,4 @@
|
||||||
{{conditional-loading-spinner condition=refreshing}}
|
{{conditional-loading-spinner condition=refreshing}}
|
||||||
{{/load-more}}
|
{{/load-more}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
@ -3,17 +3,17 @@
|
||||||
value=wizardId
|
value=wizardId
|
||||||
content=wizardList
|
content=wizardList
|
||||||
onChange=(route-action "changeWizard")
|
onChange=(route-action "changeWizard")
|
||||||
options=(hash none="admin.wizard.select")
|
options=(hash
|
||||||
}}
|
none="admin.wizard.select"
|
||||||
|
)}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{wizard-message
|
{{wizard-message
|
||||||
key=messageKey
|
key=messageKey
|
||||||
opts=messageOpts
|
opts=messageOpts
|
||||||
url=documentationUrl
|
url=documentationUrl
|
||||||
component="logs"
|
component="logs"}}
|
||||||
}}
|
|
||||||
|
|
||||||
<div class="admin-wizard-container">
|
<div class="admin-wizard-container">
|
||||||
{{outlet}}
|
{{outlet}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,35 +11,30 @@
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
<Input
|
{{input
|
||||||
id="custom-wizard-file-upload"
|
id="custom-wizard-file-upload"
|
||||||
@type="file"
|
type="file"
|
||||||
accept="application/json"
|
accept="application/json"
|
||||||
{{on "input" (action "setFile")}}
|
input=(action "setFile")}}
|
||||||
/>
|
|
||||||
{{d-button
|
{{d-button
|
||||||
id="upload-button"
|
id="upload-button"
|
||||||
label="admin.wizard.manager.upload"
|
label="admin.wizard.manager.upload"
|
||||||
action=(action "upload")
|
action=(action "upload")}}
|
||||||
}}
|
|
||||||
{{d-button
|
{{d-button
|
||||||
id="import-button"
|
id="import-button"
|
||||||
label="admin.wizard.manager.import"
|
label="admin.wizard.manager.import"
|
||||||
action=(action "import")
|
action=(action "import")
|
||||||
disabled=importDisabled
|
disabled=importDisabled}}
|
||||||
}}
|
|
||||||
{{d-button
|
{{d-button
|
||||||
id="export-button"
|
id="export-button"
|
||||||
label="admin.wizard.manager.export"
|
label="admin.wizard.manager.export"
|
||||||
action=(action "export")
|
action=(action "export")
|
||||||
disabled=exportDisabled
|
disabled=exportDisabled}}
|
||||||
}}
|
|
||||||
{{d-button
|
{{d-button
|
||||||
id="destroy-button"
|
id="destroy-button"
|
||||||
label="admin.wizard.manager.destroy"
|
label="admin.wizard.manager.destroy"
|
||||||
action=(action "destroy")
|
action=(action "destroy")
|
||||||
disabled=destoryDisabled
|
disabled=destoryDisabled}}
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -50,8 +45,7 @@
|
||||||
opts=messageOpts
|
opts=messageOpts
|
||||||
items=messageItems
|
items=messageItems
|
||||||
loading=loading
|
loading=loading
|
||||||
component="manager"
|
component="manager"}}
|
||||||
}}
|
|
||||||
|
|
||||||
<div class="admin-wizard-container">
|
<div class="admin-wizard-container">
|
||||||
<table class="table grid">
|
<table class="table grid">
|
||||||
|
@ -71,21 +65,19 @@
|
||||||
{{/link-to}}
|
{{/link-to}}
|
||||||
</td>
|
</td>
|
||||||
<td class="control-column">
|
<td class="control-column">
|
||||||
<Input
|
{{input
|
||||||
@type="checkbox"
|
type="checkbox"
|
||||||
class="export"
|
class="export"
|
||||||
{{on "change" (action "selectWizard")}}
|
change=(action "selectWizard")}}
|
||||||
/>
|
|
||||||
</td>
|
</td>
|
||||||
<td class="control-column">
|
<td class="control-column">
|
||||||
<Input
|
{{input
|
||||||
@type="checkbox"
|
type="checkbox"
|
||||||
class="destroy"
|
class="destroy"
|
||||||
{{on "change" (action "selectWizard")}}
|
change=(action "selectWizard")}}
|
||||||
/>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -58,4 +58,4 @@
|
||||||
{{conditional-loading-spinner condition=loadingMore}}
|
{{conditional-loading-spinner condition=loadingMore}}
|
||||||
{{/load-more}}
|
{{/load-more}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
@ -3,17 +3,17 @@
|
||||||
value=wizardId
|
value=wizardId
|
||||||
content=wizardList
|
content=wizardList
|
||||||
onChange=(route-action "changeWizard")
|
onChange=(route-action "changeWizard")
|
||||||
options=(hash none="admin.wizard.select")
|
options=(hash
|
||||||
}}
|
none="admin.wizard.select"
|
||||||
|
)}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{wizard-message
|
{{wizard-message
|
||||||
key=messageKey
|
key=messageKey
|
||||||
opts=messageOpts
|
opts=messageOpts
|
||||||
url=documentationUrl
|
url=documentationUrl
|
||||||
component="submissions"
|
component="submissions"}}
|
||||||
}}
|
|
||||||
|
|
||||||
<div class="admin-wizard-container">
|
<div class="admin-wizard-container">
|
||||||
{{outlet}}
|
{{outlet}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,31 +1,18 @@
|
||||||
{{#if wizard}}
|
{{#if wizard}}
|
||||||
<div class="wizard-header large">
|
<div class="wizard-header large">
|
||||||
<Input
|
{{input
|
||||||
@value={{this.wizard.name}}
|
|
||||||
name="name"
|
name="name"
|
||||||
placeholder={{i18n "admin.wizard.name_placeholder"}}
|
value=wizard.name
|
||||||
/>
|
placeholderKey="admin.wizard.name_placeholder"}}
|
||||||
|
|
||||||
<div class="wizard-url">
|
<div class="wizard-url">
|
||||||
{{#if wizard.name}}
|
{{#if wizard.name}}
|
||||||
{{#if copiedUrl}}
|
{{#if copiedUrl}}
|
||||||
{{d-button
|
{{d-button class="btn-hover pull-right" icon="copy" label="ip_lookup.copied"}}
|
||||||
class="btn-hover pull-right"
|
|
||||||
icon="copy"
|
|
||||||
label="ip_lookup.copied"
|
|
||||||
}}
|
|
||||||
{{else}}
|
{{else}}
|
||||||
{{d-button
|
{{d-button action=(action "copyUrl") class="pull-right no-text" icon="copy"}}
|
||||||
action=(action "copyUrl")
|
|
||||||
class="pull-right no-text"
|
|
||||||
icon="copy"
|
|
||||||
}}
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<a
|
<a href={{wizardUrl}} target="_blank" rel="noopener noreferrer">{{wizardUrl}}</a>
|
||||||
href={{wizardUrl}}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
>{{wizardUrl}}</a>
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -36,12 +23,11 @@
|
||||||
<label>{{i18n "admin.wizard.background"}}</label>
|
<label>{{i18n "admin.wizard.background"}}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
<Input
|
{{input
|
||||||
@value={{this.wizard.background}}
|
|
||||||
name="background"
|
name="background"
|
||||||
placeholder={{i18n "admin.wizard.background_placeholder"}}
|
value=wizard.background
|
||||||
class="small"
|
placeholderKey="admin.wizard.background_placeholder"
|
||||||
/>
|
class="small"}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -55,8 +41,9 @@
|
||||||
valueProperty="id"
|
valueProperty="id"
|
||||||
value=wizard.theme_id
|
value=wizard.theme_id
|
||||||
onChange=(action (mut wizard.theme_id))
|
onChange=(action (mut wizard.theme_id))
|
||||||
options=(hash none="admin.wizard.no_theme")
|
options=(hash
|
||||||
}}
|
none="admin.wizard.no_theme"
|
||||||
|
)}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -71,7 +58,7 @@
|
||||||
<label>{{i18n "admin.wizard.save_submissions"}}</label>
|
<label>{{i18n "admin.wizard.save_submissions"}}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
<Input @type="checkbox" @checked={{this.wizard.save_submissions}} />
|
{{input type="checkbox" checked=wizard.save_submissions}}
|
||||||
<span>{{i18n "admin.wizard.save_submissions_label"}}</span>
|
<span>{{i18n "admin.wizard.save_submissions_label"}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -81,7 +68,7 @@
|
||||||
<label>{{i18n "admin.wizard.multiple_submissions"}}</label>
|
<label>{{i18n "admin.wizard.multiple_submissions"}}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
<Input @type="checkbox" @checked={{this.wizard.multiple_submissions}} />
|
{{input type="checkbox" checked=wizard.multiple_submissions}}
|
||||||
<span>{{i18n "admin.wizard.multiple_submissions_label"}}</span>
|
<span>{{i18n "admin.wizard.multiple_submissions_label"}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -91,7 +78,7 @@
|
||||||
<label>{{i18n "admin.wizard.after_signup"}}</label>
|
<label>{{i18n "admin.wizard.after_signup"}}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
<Input @type="checkbox" @checked={{this.wizard.after_signup}} />
|
{{input type="checkbox" checked=wizard.after_signup}}
|
||||||
<span>{{i18n "admin.wizard.after_signup_label"}}</span>
|
<span>{{i18n "admin.wizard.after_signup_label"}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -101,7 +88,7 @@
|
||||||
<label>{{i18n "admin.wizard.prompt_completion"}}</label>
|
<label>{{i18n "admin.wizard.prompt_completion"}}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
<Input @type="checkbox" @checked={{this.wizard.prompt_completion}} />
|
{{input type="checkbox" checked=wizard.prompt_completion}}
|
||||||
<span>{{i18n "admin.wizard.prompt_completion_label"}}</span>
|
<span>{{i18n "admin.wizard.prompt_completion_label"}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -111,14 +98,13 @@
|
||||||
<label>{{i18n "admin.wizard.after_time"}}</label>
|
<label>{{i18n "admin.wizard.after_time"}}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
<Input @type="checkbox" @checked={{this.wizard.after_time}} />
|
{{input type="checkbox" checked=wizard.after_time}}
|
||||||
<span>{{i18n "admin.wizard.after_time_label"}}</span>
|
<span>{{i18n "admin.wizard.after_time_label"}}</span>
|
||||||
{{d-button
|
{{d-button
|
||||||
action=(action "setNextSessionScheduled")
|
action=(action "setNextSessionScheduled")
|
||||||
translatedLabel=nextSessionScheduledLabel
|
translatedLabel=nextSessionScheduledLabel
|
||||||
class="btn-after-time"
|
class="btn-after-time"
|
||||||
icon="far-calendar"
|
icon="far-calendar"}}
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -128,7 +114,7 @@
|
||||||
<label>{{i18n "admin.wizard.required"}}</label>
|
<label>{{i18n "admin.wizard.required"}}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
<Input @type="checkbox" @checked={{this.wizard.required}} />
|
{{input type="checkbox" checked=wizard.required}}
|
||||||
<span>{{i18n "admin.wizard.required_label"}}</span>
|
<span>{{i18n "admin.wizard.required_label"}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -138,7 +124,7 @@
|
||||||
<label>{{i18n "admin.wizard.restart_on_revisit"}}</label>
|
<label>{{i18n "admin.wizard.restart_on_revisit"}}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
<Input @type="checkbox" @checked={{this.wizard.restart_on_revisit}} />
|
{{input type="checkbox" checked=wizard.restart_on_revisit}}
|
||||||
<span>{{i18n "admin.wizard.restart_on_revisit_label"}}</span>
|
<span>{{i18n "admin.wizard.restart_on_revisit_label"}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -154,18 +140,19 @@
|
||||||
context="wizard"
|
context="wizard"
|
||||||
inputTypes="assignment,validation"
|
inputTypes="assignment,validation"
|
||||||
groupSelection="output"
|
groupSelection="output"
|
||||||
guestGroup=true
|
|
||||||
userFieldSelection="key"
|
userFieldSelection="key"
|
||||||
textSelection="value"
|
textSelection="value"
|
||||||
inputConnector="and"
|
inputConnector="and"
|
||||||
)
|
)}}
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/wizard-subscription-container}}
|
{{/wizard-subscription-container}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{wizard-links itemType="step" current=currentStep items=wizard.steps}}
|
{{wizard-links
|
||||||
|
itemType="step"
|
||||||
|
current=currentStep
|
||||||
|
items=wizard.steps}}
|
||||||
|
|
||||||
{{#if currentStep}}
|
{{#if currentStep}}
|
||||||
{{wizard-custom-step
|
{{wizard-custom-step
|
||||||
|
@ -173,17 +160,15 @@
|
||||||
wizard=wizard
|
wizard=wizard
|
||||||
currentField=currentField
|
currentField=currentField
|
||||||
wizardFields=wizardFields
|
wizardFields=wizardFields
|
||||||
fieldTypes=filteredFieldTypes
|
fieldTypes=fieldTypes
|
||||||
subscribed=subscribed
|
subscribed=subscribed}}
|
||||||
}}
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{wizard-links
|
{{wizard-links
|
||||||
itemType="action"
|
itemType="action"
|
||||||
current=currentAction
|
current=currentAction
|
||||||
items=wizard.actions
|
items=wizard.actions
|
||||||
generateLabels=true
|
generateLabels=true}}
|
||||||
}}
|
|
||||||
|
|
||||||
{{#each wizard.actions as |wizardAction|}}
|
{{#each wizard.actions as |wizardAction|}}
|
||||||
{{wizard-custom-action
|
{{wizard-custom-action
|
||||||
|
@ -193,17 +178,11 @@
|
||||||
apis=apis
|
apis=apis
|
||||||
removeAction="removeAction"
|
removeAction="removeAction"
|
||||||
wizardFields=wizardFields
|
wizardFields=wizardFields
|
||||||
fieldTypes=filteredFieldTypes
|
fieldTypes=fieldTypes}}
|
||||||
}}
|
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
|
||||||
<div class="admin-wizard-buttons">
|
<div class="admin-wizard-buttons">
|
||||||
<button
|
<button {{action "save"}} disabled={{disableSave}} class="btn btn-primary" type="button">
|
||||||
{{action "save"}}
|
|
||||||
disabled={{disableSave}}
|
|
||||||
class="btn btn-primary"
|
|
||||||
type="button"
|
|
||||||
>
|
|
||||||
{{i18n "admin.wizard.save"}}
|
{{i18n "admin.wizard.save"}}
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
@ -219,4 +198,4 @@
|
||||||
<span class="error">{{d-icon "times"}}{{error}}</span>
|
<span class="error">{{d-icon "times"}}{{error}}</span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
@ -3,18 +3,21 @@
|
||||||
value=wizardListVal
|
value=wizardListVal
|
||||||
content=wizardList
|
content=wizardList
|
||||||
onChange=(route-action "changeWizard")
|
onChange=(route-action "changeWizard")
|
||||||
options=(hash none="admin.wizard.select")
|
options=(hash
|
||||||
}}
|
none="admin.wizard.select"
|
||||||
|
)}}
|
||||||
|
|
||||||
{{d-button
|
{{d-button
|
||||||
action=(route-action "createWizard")
|
action=(route-action "createWizard")
|
||||||
label="admin.wizard.create"
|
label="admin.wizard.create"
|
||||||
icon="plus"
|
icon="plus"}}
|
||||||
}}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{wizard-message key=messageKey url=messageUrl component="wizard"}}
|
{{wizard-message
|
||||||
|
key=messageKey
|
||||||
|
url=messageUrl
|
||||||
|
component="wizard"}}
|
||||||
|
|
||||||
<div class="admin-wizard-container settings">
|
<div class="admin-wizard-container settings">
|
||||||
{{outlet}}
|
{{outlet}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,21 +1,12 @@
|
||||||
{{#admin-nav}}
|
{{#admin-nav}}
|
||||||
{{nav-item route="adminWizardsWizard" label="admin.wizard.nav_label"}}
|
{{nav-item route="adminWizardsWizard" label="admin.wizard.nav_label"}}
|
||||||
{{nav-item
|
{{nav-item route="adminWizardsCustomFields" label="admin.wizard.custom_field.nav_label"}}
|
||||||
route="adminWizardsCustomFields"
|
{{nav-item route="adminWizardsSubmissions" label="admin.wizard.submissions.nav_label"}}
|
||||||
label="admin.wizard.custom_field.nav_label"
|
|
||||||
}}
|
|
||||||
{{nav-item
|
|
||||||
route="adminWizardsSubmissions"
|
|
||||||
label="admin.wizard.submissions.nav_label"
|
|
||||||
}}
|
|
||||||
{{#if showApi}}
|
{{#if showApi}}
|
||||||
{{nav-item route="adminWizardsApi" label="admin.wizard.api.nav_label"}}
|
{{nav-item route="adminWizardsApi" label="admin.wizard.api.nav_label"}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{nav-item route="adminWizardsLogs" label="admin.wizard.log.nav_label"}}
|
{{nav-item route="adminWizardsLogs" label="admin.wizard.log.nav_label"}}
|
||||||
{{nav-item
|
{{nav-item route="adminWizardsManager" label="admin.wizard.manager.nav_label"}}
|
||||||
route="adminWizardsManager"
|
|
||||||
label="admin.wizard.manager.nav_label"
|
|
||||||
}}
|
|
||||||
|
|
||||||
<div class="admin-actions">
|
<div class="admin-actions">
|
||||||
{{wizard-subscription-badge}}
|
{{wizard-subscription-badge}}
|
||||||
|
@ -25,4 +16,4 @@
|
||||||
|
|
||||||
<div class="admin-container">
|
<div class="admin-container">
|
||||||
{{outlet}}
|
{{outlet}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -5,8 +5,9 @@
|
||||||
feature="custom_field"
|
feature="custom_field"
|
||||||
attribute="klass"
|
attribute="klass"
|
||||||
onChange=(action (mut field.klass))
|
onChange=(action (mut field.klass))
|
||||||
options=(hash none="admin.wizard.custom_field.klass.select")
|
options=(hash
|
||||||
}}
|
none="admin.wizard.custom_field.klass.select"
|
||||||
|
)}}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
{{wizard-subscription-selector
|
{{wizard-subscription-selector
|
||||||
|
@ -14,22 +15,23 @@
|
||||||
feature="custom_field"
|
feature="custom_field"
|
||||||
attribute="type"
|
attribute="type"
|
||||||
onChange=(action (mut field.type))
|
onChange=(action (mut field.type))
|
||||||
options=(hash none="admin.wizard.custom_field.type.select")
|
options=(hash
|
||||||
}}
|
none="admin.wizard.custom_field.type.select"
|
||||||
|
)}}
|
||||||
</td>
|
</td>
|
||||||
<td class="input">
|
<td class="input">
|
||||||
<Input
|
{{input
|
||||||
@value={{this.field.name}}
|
value=field.name
|
||||||
placeholder={{i18n "admin.wizard.custom_field.name.select"}}
|
placeholder=(i18n "admin.wizard.custom_field.name.select")}}
|
||||||
/>
|
|
||||||
</td>
|
</td>
|
||||||
<td class="multi-select">
|
<td class="multi-select">
|
||||||
{{multi-select
|
{{multi-select
|
||||||
value=field.serializers
|
value=field.serializers
|
||||||
content=serializerContent
|
content=serializerContent
|
||||||
onChange=(action (mut field.serializers))
|
onChange=(action (mut field.serializers))
|
||||||
options=(hash none="admin.wizard.custom_field.serializers.select")
|
options=(hash
|
||||||
}}
|
none="admin.wizard.custom_field.serializers.select"
|
||||||
|
)}}
|
||||||
</td>
|
</td>
|
||||||
<td class="actions">
|
<td class="actions">
|
||||||
{{#if loading}}
|
{{#if loading}}
|
||||||
|
@ -43,15 +45,16 @@
|
||||||
action=(action "destroy")
|
action=(action "destroy")
|
||||||
icon="trash-alt"
|
icon="trash-alt"
|
||||||
class="destroy"
|
class="destroy"
|
||||||
disabled=destroyDisabled
|
disabled=destroyDisabled}}
|
||||||
}}
|
|
||||||
{{d-button
|
{{d-button
|
||||||
icon="save"
|
icon="save"
|
||||||
action=(action "save")
|
action=(action "save")
|
||||||
disabled=saveDisabled
|
disabled=saveDisabled
|
||||||
class="save"
|
class="save"}}
|
||||||
}}
|
{{d-button
|
||||||
{{d-button action=(action "close") icon="times" disabled=closeDisabled}}
|
action=(action "close")
|
||||||
|
icon="times"
|
||||||
|
disabled=closeDisabled}}
|
||||||
</td>
|
</td>
|
||||||
{{else}}
|
{{else}}
|
||||||
<td><label>{{field.klass}}</label></td>
|
<td><label>{{field.klass}}</label></td>
|
||||||
|
@ -77,4 +80,4 @@
|
||||||
{{d-button action=(action "edit") icon="pencil-alt"}}
|
{{d-button action=(action "edit") icon="pencil-alt"}}
|
||||||
</td>
|
</td>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
@ -14,8 +14,7 @@
|
||||||
wizardComposer=true
|
wizardComposer=true
|
||||||
fieldId=field.id
|
fieldId=field.id
|
||||||
disabled=disableTextarea
|
disabled=disableTextarea
|
||||||
outletArgs=(hash composer=composer editorType="composer")
|
outletArgs=(hash composer=composer editorType="composer")}}
|
||||||
}}
|
|
||||||
|
|
||||||
<input
|
<input
|
||||||
type="file"
|
type="file"
|
||||||
|
@ -23,4 +22,4 @@
|
||||||
class="wizard-composer-upload"
|
class="wizard-composer-upload"
|
||||||
accept={{allowedFileTypes}}
|
accept={{allowedFileTypes}}
|
||||||
multiple
|
multiple
|
||||||
/>
|
>
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
<div class="wizard-composer-hyperlink-contents">
|
||||||
|
<h3>{{i18n "composer.link_dialog_title"}}</h3>
|
||||||
|
{{input
|
||||||
|
class="composer-link-name"
|
||||||
|
placeholder=(i18n "composer.link_optional_text")
|
||||||
|
type="text"
|
||||||
|
value=linkName}}
|
||||||
|
{{input
|
||||||
|
class="composer-link-url"
|
||||||
|
placeholder=(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")}}
|
||||||
|
</div>
|
|
@ -1,11 +1,11 @@
|
||||||
<Input
|
{{input
|
||||||
@type={{this.inputType}}
|
type=inputType
|
||||||
@value={{readonly this.value}}
|
|
||||||
class="date-picker"
|
class="date-picker"
|
||||||
placeholder={{this.placeholder}}
|
placeholder=placeholder
|
||||||
tabindex={{this.tabindex}}
|
value=(readonly value)
|
||||||
{{on "input" (action "onChangeDate")}}
|
input=(action "onChangeDate")
|
||||||
|
tabindex=tabindex
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
/>
|
}}
|
||||||
|
|
||||||
<div class="picker-container"></div>
|
<div class="picker-container"></div>
|
||||||
|
|
|
@ -26,5 +26,9 @@
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{#if clearable}}
|
{{#if clearable}}
|
||||||
{{d-button class="clear-date-time" icon="times" action=(action "onClear")}}
|
{{d-button
|
||||||
{{/if}}
|
class="clear-date-time"
|
||||||
|
icon="times"
|
||||||
|
action=(action "onClear")
|
||||||
|
}}
|
||||||
|
{{/if}}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
<div class="d-editor-container">
|
<div class="d-editor-container">
|
||||||
{{#if showPreview}}
|
{{#if showPreview}}
|
||||||
<div class="d-editor-preview-wrapper {{if forcePreview 'force-preview'}}">
|
<div class="d-editor-preview-wrapper {{if forcePreview "force-preview"}}">
|
||||||
<div class="d-editor-preview">
|
<div class="d-editor-preview">
|
||||||
{{html-safe preview}}
|
{{html-safe preview}}
|
||||||
</div>
|
</div>
|
||||||
|
@ -18,16 +18,13 @@
|
||||||
onExpand=(action b.action b)
|
onExpand=(action b.action b)
|
||||||
class=b.className
|
class=b.className
|
||||||
content=popupMenuOptions
|
content=popupMenuOptions
|
||||||
options=(hash popupTitle=b.title icon=b.icon)
|
options=(hash
|
||||||
}}
|
popupTitle=b.title
|
||||||
|
icon=b.icon
|
||||||
|
)}}
|
||||||
{{else}}
|
{{else}}
|
||||||
<div>{{d.icon}}</div>
|
<div>{{d.icon}}</div>
|
||||||
<button
|
<button class="wizard-btn {{b.className}}" {{action b.action b}} title={{b.title}} type="button">
|
||||||
class="wizard-btn {{b.className}}"
|
|
||||||
{{action b.action b}}
|
|
||||||
title={{b.title}}
|
|
||||||
type="button"
|
|
||||||
>
|
|
||||||
{{d-icon b.icon}}
|
{{d-icon b.icon}}
|
||||||
{{#if b.label}}
|
{{#if b.label}}
|
||||||
<span class="d-button-label">{{i18n b.label}}</span>
|
<span class="d-button-label">{{i18n b.label}}</span>
|
||||||
|
@ -43,12 +40,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{conditional-loading-spinner condition=loading}}
|
{{conditional-loading-spinner condition=loading}}
|
||||||
<Textarea
|
{{textarea tabindex=tabindex value=value class="d-editor-input" placeholder=placeholder}}
|
||||||
tabindex={{this.tabindex}}
|
|
||||||
@value={{this.value}}
|
|
||||||
class="d-editor-input"
|
|
||||||
placeholder={{this.placeholder}}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
{{custom-wizard-category-selector
|
{{custom-wizard-category-selector
|
||||||
categories=categories
|
categories=categories
|
||||||
class=fieldClass
|
|
||||||
whitelist=field.content
|
whitelist=field.content
|
||||||
onChange=(action (mut categories))
|
onChange=(action (mut categories))
|
||||||
tabindex=field.tabindex
|
tabindex=field.tabindex
|
||||||
options=(hash maximum=field.limit)
|
options=(hash
|
||||||
}}
|
maximum=field.limit
|
||||||
|
)}}
|
||||||
|
|
|
@ -1,7 +1 @@
|
||||||
<Input
|
{{input type="checkbox" id=field.id checked=field.value tabindex=field.tabindex}}
|
||||||
id={{this.field.id}}
|
|
||||||
@type="checkbox"
|
|
||||||
@checked={{this.field.value}}
|
|
||||||
tabindex={{this.field.tabindex}}
|
|
||||||
class={{this.fieldClass}}
|
|
||||||
/>
|
|
||||||
|
|
|
@ -2,4 +2,4 @@
|
||||||
<div class="d-editor-preview">
|
<div class="d-editor-preview">
|
||||||
{{html-safe field.preview_template}}
|
{{html-safe field.preview_template}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -2,24 +2,18 @@
|
||||||
field=field
|
field=field
|
||||||
composer=composer
|
composer=composer
|
||||||
wizard=wizard
|
wizard=wizard
|
||||||
fieldClass=fieldClass
|
|
||||||
groupsMentioned=(action "groupsMentioned")
|
groupsMentioned=(action "groupsMentioned")
|
||||||
cannotSeeMention=(action "cannotSeeMention")
|
cannotSeeMention=(action "cannotSeeMention")
|
||||||
importQuote=(action "importQuote")
|
importQuote=(action "importQuote")
|
||||||
togglePreview=(action "togglePreview")
|
togglePreview=(action "togglePreview")
|
||||||
afterRefresh=(action "afterRefresh")
|
afterRefresh=(action "afterRefresh")}}
|
||||||
}}
|
|
||||||
|
|
||||||
<div class="bottom-bar">
|
<div class="bottom-bar">
|
||||||
<button
|
<button class="wizard-btn toggle-preview" {{action "togglePreview"}} type="button">
|
||||||
class="wizard-btn toggle-preview"
|
|
||||||
{{action "togglePreview"}}
|
|
||||||
type="button"
|
|
||||||
>
|
|
||||||
<span class="d-button-label">{{i18n togglePreviewLabel}}</span>
|
<span class="d-button-label">{{i18n togglePreviewLabel}}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
{{#if field.char_counter}}
|
{{#if field.char_counter}}
|
||||||
{{wizard-char-counter field.value field.max_length}}
|
{{char-counter field.value field.max_length}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -2,4 +2,4 @@
|
||||||
date=dateTime
|
date=dateTime
|
||||||
onChange=(action "onChange")
|
onChange=(action "onChange")
|
||||||
tabindex=field.tabindex
|
tabindex=field.tabindex
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -3,4 +3,4 @@
|
||||||
onChange=(action "onChange")
|
onChange=(action "onChange")
|
||||||
tabindex=field.tabindex
|
tabindex=field.tabindex
|
||||||
format=field.format
|
format=field.format
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -4,5 +4,6 @@
|
||||||
content=field.content
|
content=field.content
|
||||||
tabindex=field.tabindex
|
tabindex=field.tabindex
|
||||||
onChange=(action "onChangeValue")
|
onChange=(action "onChangeValue")
|
||||||
options=(hash none="select_kit.default_header_text")
|
options=(hash
|
||||||
}}
|
none="select_kit.default_header_text"
|
||||||
|
)}}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
{{custom-wizard-group-selector
|
{{custom-wizard-group-selector
|
||||||
groups=site.groups
|
groups=site.groups
|
||||||
class=fieldClass
|
|
||||||
field=field
|
field=field
|
||||||
whitelist=field.content
|
whitelist=field.content
|
||||||
value=field.value
|
value=field.value
|
||||||
tabindex=field.tabindex
|
tabindex=field.tabindex
|
||||||
onChange=(action (mut field.value))
|
onChange=(action (mut field.value))
|
||||||
options=(hash none="select_kit.default_header_text")
|
options=(hash
|
||||||
}}
|
none="select_kit.default_header_text"
|
||||||
|
)}}
|
||||||
|
|
|
@ -1,8 +1 @@
|
||||||
<Input
|
{{input type="number" step="0.01" id=field.id value=field.value tabindex=field.tabindex}}
|
||||||
id={{this.field.id}}
|
|
||||||
step="0.01"
|
|
||||||
@type="number"
|
|
||||||
@value={{this.field.value}}
|
|
||||||
tabindex={{this.field.tabindex}}
|
|
||||||
class={{this.fieldClass}}
|
|
||||||
/>
|
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
{{custom-wizard-tag-chooser
|
{{custom-wizard-tag-chooser
|
||||||
tags=field.value
|
tags=field.value
|
||||||
class=fieldClass
|
|
||||||
tabindex=field.tabindex
|
tabindex=field.tabindex
|
||||||
tagGroups=field.tag_groups
|
tagGroups=field.tag_groups
|
||||||
everyTag=true
|
everyTag=true
|
||||||
options=(hash maximum=field.limit allowAny=field.can_create_tag)
|
options=(hash
|
||||||
}}
|
maximum=field.limit
|
||||||
|
allowAny=field.can_create_tag
|
||||||
|
)}}
|
||||||
|
|
|
@ -1,8 +1 @@
|
||||||
<Input
|
{{input id=field.id value=field.value class=fieldClass placeholder=field.translatedPlaceholder tabindex=field.tabindex autocomplete=autocomplete}}
|
||||||
id={{this.field.id}}
|
|
||||||
@value={{this.field.value}}
|
|
||||||
tabindex={{this.field.tabindex}}
|
|
||||||
class={{this.fieldClass}}
|
|
||||||
placeholder={{this.field.translatedPlaceholder}}
|
|
||||||
autocomplete={{this.autocomplete}}
|
|
||||||
/>
|
|
||||||
|
|
|
@ -1,7 +1 @@
|
||||||
<Textarea
|
{{textarea id=field.id value=field.value class=fieldClass placeholder=field.translatedPlaceholder tabindex=field.tabindex}}
|
||||||
id={{this.field.id}}
|
|
||||||
@value={{this.field.value}}
|
|
||||||
tabindex={{this.field.tabindex}}
|
|
||||||
class={{this.fieldClass}}
|
|
||||||
placeholder={{this.field.translatedPlaceholder}}
|
|
||||||
/>
|
|
||||||
|
|
|
@ -2,4 +2,4 @@
|
||||||
date=time
|
date=time
|
||||||
onChange=(action "onChange")
|
onChange=(action "onChange")
|
||||||
tabindex=field.tabindex
|
tabindex=field.tabindex
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
<label
|
<label class="wizard-btn wizard-btn-upload-file {{if uploading "disabled"}}" tabindex={{field.tabindex}}>
|
||||||
class="wizard-btn wizard-btn-upload-file {{if uploading 'disabled'}}"
|
|
||||||
tabindex={{field.tabindex}}
|
|
||||||
>
|
|
||||||
{{#if uploading}}
|
{{#if uploading}}
|
||||||
{{i18n "wizard.uploading"}}
|
{{i18n "wizard.uploading"}}
|
||||||
{{else}}
|
{{else}}
|
||||||
|
@ -9,19 +6,13 @@
|
||||||
{{d-icon "upload"}}
|
{{d-icon "upload"}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
<input
|
<input disabled={{uploading}} class="hidden-upload-field" type="file" accept={{field.file_types}} style="visibility: hidden; position: absolute;" >
|
||||||
disabled={{uploading}}
|
|
||||||
class="hidden-upload-field"
|
|
||||||
type="file"
|
|
||||||
accept={{field.file_types}}
|
|
||||||
style="visibility: hidden; position: absolute;"
|
|
||||||
/>
|
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
{{#if field.value}}
|
{{#if field.value}}
|
||||||
{{#if isImage}}
|
{{#if isImage}}
|
||||||
<img src={{field.value.url}} class="wizard-image-preview" />
|
<img src={{field.value.url}} class="wizard-image-preview">
|
||||||
{{else}}
|
{{else}}
|
||||||
{{field.value.original_filename}}
|
{{field.value.original_filename}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
@ -1,6 +1 @@
|
||||||
<Input
|
{{input type="text" id=field.id value=field.value tabindex=field.tabindex}}
|
||||||
id={{this.field.id}}
|
|
||||||
@value={{this.field.value}}
|
|
||||||
tabindex={{this.field.tabindex}}
|
|
||||||
class={{this.fieldClass}}
|
|
||||||
/>
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
{{custom-user-selector
|
{{custom-user-selector
|
||||||
usernames=field.value
|
usernames=field.value
|
||||||
placeholderKey=field.placeholder
|
placeholderKey=field.placeholder
|
||||||
tabindex=field.tabindex
|
tabindex=field.tabindex}}
|
||||||
}}
|
|
||||||
|
|
|
@ -1,38 +1,29 @@
|
||||||
<label for={{field.id}} class="field-label">
|
<label for={{field.id}} class="field-label">
|
||||||
{{html-safe field.translatedLabel}}
|
{{html-safe field.translatedLabel}}
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
{{#if field.image}}
|
{{#if field.image}}
|
||||||
<div class="field-image"><img src={{field.image}} /></div>
|
<div class="field-image"><img src={{field.image}}></div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{#if field.description}}
|
{{#if field.description}}
|
||||||
<div class="field-description">{{cookedDescription}}</div>
|
<div class="field-description">{{cookedDescription}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{#field-validators field=field as |validators|}}
|
{{#field-validators field=field as |validators|}}
|
||||||
{{#if inputComponentName}}
|
{{#if inputComponentName}}
|
||||||
<div class="input-area">
|
<div class="input-area">
|
||||||
{{component
|
{{component inputComponentName field=field step=step fieldClass=fieldClass wizard=wizard autocomplete=validators.autocomplete}}
|
||||||
inputComponentName
|
</div>
|
||||||
field=field
|
{{/if}}
|
||||||
step=step
|
{{/field-validators}}
|
||||||
fieldClass=fieldClass
|
|
||||||
wizard=wizard
|
{{#if field.char_counter}}
|
||||||
autocomplete=validators.autocomplete
|
{{#if textType}}
|
||||||
}}
|
{{char-counter field.value field.max_length}}
|
||||||
</div>
|
{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/field-validators}}
|
|
||||||
|
{{#if field.errorDescription}}
|
||||||
{{#if field.char_counter}}
|
<div class="field-error-description">{{html-safe field.errorDescription}}</div>
|
||||||
{{#if textType}}
|
{{/if}}
|
||||||
{{wizard-char-counter field.value field.max_length}}
|
|
||||||
{{/if}}
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
{{#if field.errorDescription}}
|
|
||||||
<div class="field-error-description">{{html-safe
|
|
||||||
field.errorDescription
|
|
||||||
}}</div>
|
|
||||||
{{/if}}
|
|
||||||
|
|
|
@ -1,11 +1,7 @@
|
||||||
<div>{{text}}</div>
|
<div>{{text}}</div>
|
||||||
<div class="no-access-gutter">
|
<div class="no-access-gutter">
|
||||||
<button
|
<button class="wizard-btn primary return-to-site" {{action "skip"}} type="button">
|
||||||
class="wizard-btn primary return-to-site"
|
|
||||||
{{action "skip"}}
|
|
||||||
type="button"
|
|
||||||
>
|
|
||||||
{{i18n "wizard.return_to_site" siteName=siteName}}
|
{{i18n "wizard.return_to_site" siteName=siteName}}
|
||||||
{{d-icon "sign-out-alt"}}
|
{{d-icon "sign-out-alt"}}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
<a href={{topic.url}} target="_blank" rel="noopener noreferrer">
|
<a href={{topic.url}} target="_blank" rel="noopener noreferrer">
|
||||||
<span class="title">{{html-safe topic.fancy_title}}</span>
|
<span class="title">{{html-safe topic.fancy_title}}</span>
|
||||||
<div class="blurb">{{date-node topic.created_at}}
|
<div class="blurb">{{date-node topic.created_at}} - {{html-safe topic.blurb}}</div>
|
||||||
-
|
</a>
|
||||||
{{html-safe topic.blurb}}</div>
|
|
||||||
</a>
|
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
{{#if showTopics}}
|
{{#if showTopics}}
|
||||||
<ul>
|
<ul>
|
||||||
{{#each topics as |topic|}}
|
{{#each topics as |topic|}}
|
||||||
<li>{{custom-wizard-similar-topic topic=topic}}</li>
|
<li>{{custom-wizard-similar-topic topic=topic}}</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ul>
|
</ul>
|
||||||
{{else}}
|
{{else}}
|
||||||
<a role="button" class="show-topics" {{action "toggleShowTopics"}}>
|
<a role="button" class="show-topics" {{action "toggleShowTopics"}}>
|
||||||
{{i18n "realtime_validations.similar_topics.show"}}
|
{{i18n "realtime_validations.similar_topics.show"}}
|
||||||
</a>
|
</a>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
{{#if bannerImage}}
|
{{#if bannerImage}}
|
||||||
<div class="wizard-step-banner">
|
<div class="wizard-step-banner">
|
||||||
<img src={{bannerImage}} />
|
<img src={{bannerImage}}>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
|
@ -26,11 +26,7 @@
|
||||||
<div class="white"></div>
|
<div class="white"></div>
|
||||||
<div class="black" style={{barStyle}}></div>
|
<div class="black" style={{barStyle}}></div>
|
||||||
<div class="screen"></div>
|
<div class="screen"></div>
|
||||||
<span>{{i18n
|
<span>{{i18n "wizard.step" current=step.displayIndex total=wizard.totalSteps}}</span>
|
||||||
"wizard.step"
|
|
||||||
current=step.displayIndex
|
|
||||||
total=wizard.totalSteps
|
|
||||||
}}</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="wizard-buttons">
|
<div class="wizard-buttons">
|
||||||
|
@ -38,47 +34,25 @@
|
||||||
{{loading-spinner size="small"}}
|
{{loading-spinner size="small"}}
|
||||||
{{else}}
|
{{else}}
|
||||||
{{#if showQuitButton}}
|
{{#if showQuitButton}}
|
||||||
<a
|
<a href {{action "quit"}} class="action-link quit" tabindex={{secondaryButtonIndex}}>{{i18n "wizard.quit"}}</a>
|
||||||
href
|
|
||||||
{{action "quit"}}
|
|
||||||
class="action-link quit"
|
|
||||||
tabindex={{secondaryButtonIndex}}
|
|
||||||
>{{i18n "wizard.quit"}}</a>
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if showBackButton}}
|
{{#if showBackButton}}
|
||||||
<a
|
<a href {{action "backStep"}} class="action-link back" tabindex={{secondaryButtonIndex}}>{{i18n "wizard.back"}}</a>
|
||||||
href
|
|
||||||
{{action "backStep"}}
|
|
||||||
class="action-link back"
|
|
||||||
tabindex={{secondaryButtonIndex}}
|
|
||||||
>{{i18n "wizard.back"}}</a>
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{#if showNextButton}}
|
{{#if showNextButton}}
|
||||||
<button
|
<button type="button" class="wizard-btn next primary" {{action "nextStep"}} disabled={{saving}} tabindex={{primaryButtonIndex}}>
|
||||||
type="button"
|
|
||||||
class="wizard-btn next primary"
|
|
||||||
{{action "nextStep"}}
|
|
||||||
disabled={{saving}}
|
|
||||||
tabindex={{primaryButtonIndex}}
|
|
||||||
>
|
|
||||||
{{i18n "wizard.next"}}
|
{{i18n "wizard.next"}}
|
||||||
{{d-icon "chevron-right"}}
|
{{d-icon "chevron-right"}}
|
||||||
</button>
|
</button>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{#if showDoneButton}}
|
{{#if showDoneButton}}
|
||||||
<button
|
<button type="button" class="wizard-btn done" {{action "done"}} disabled={{saving}} tabindex={{primaryButtonIndex}}>
|
||||||
type="button"
|
|
||||||
class="wizard-btn done"
|
|
||||||
{{action "done"}}
|
|
||||||
disabled={{saving}}
|
|
||||||
tabindex={{primaryButtonIndex}}
|
|
||||||
>
|
|
||||||
{{i18n "wizard.done_custom"}}
|
{{i18n "wizard.done_custom"}}
|
||||||
</button>
|
</button>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -10,4 +10,4 @@
|
||||||
autoInsertNoneItem=false
|
autoInsertNoneItem=false
|
||||||
translatedFilterPlaceholder="--:--"
|
translatedFilterPlaceholder="--:--"
|
||||||
)
|
)
|
||||||
}}
|
}}
|
||||||
|
|
Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden Mehr anzeigen
Laden …
In neuem Issue referenzieren