Skip to content

Commit a19a1fa

Browse files
committed
Refactor wizard client and add tests
1 parent 969fff1 commit a19a1fa

File tree

94 files changed

+2887
-674
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

94 files changed

+2887
-674
lines changed

app/controllers/custom_wizard/wizard.rb

Lines changed: 80 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,39 @@
11
# frozen_string_literal: true
2-
class CustomWizard::WizardController < ::ApplicationController
3-
include ApplicationHelper
4-
prepend_view_path(Rails.root.join('plugins', 'discourse-custom-wizard', 'app', 'views'))
5-
layout 'wizard'
2+
class CustomWizard::WizardController < ::ActionController::Base
3+
helper ApplicationHelper
64

5+
include CurrentUser
6+
include CanonicalURL::ControllerExtensions
7+
include GlobalPath
8+
9+
prepend_view_path(Rails.root.join('plugins', 'discourse-custom-wizard', 'views'))
10+
layout :set_wizard_layout
11+
12+
before_action :preload_wizard_json
713
before_action :ensure_plugin_enabled
814
before_action :ensure_logged_in, only: [:skip]
15+
916
helper_method :wizard_page_title
1017
helper_method :wizard_theme_id
1118
helper_method :wizard_theme_lookup
1219
helper_method :wizard_theme_translations_lookup
1320

14-
def wizard
15-
@builder = CustomWizard::Builder.new(params[:wizard_id].underscore, current_user)
16-
@wizard ||= @builder.build
17-
@wizard
18-
end
19-
20-
def wizard_page_title
21-
wizard ? (wizard.name || wizard.id) : I18n.t('wizard.custom_title')
22-
end
23-
24-
def wizard_theme_id
25-
wizard ? wizard.theme_id : nil
26-
end
27-
28-
def wizard_theme_lookup(name)
29-
Theme.lookup_field(wizard_theme_id, mobile_view? ? :mobile : :desktop, name)
30-
end
31-
32-
def wizard_theme_translations_lookup
33-
Theme.lookup_field(wizard_theme_id, :translations, I18n.locale)
21+
def set_wizard_layout
22+
action_name === 'qunit' ? 'qunit' : 'wizard'
3423
end
3524

3625
def index
3726
respond_to do |format|
3827
format.json do
39-
builder = CustomWizard::Builder.new(params[:wizard_id].underscore, current_user)
40-
41-
if builder.wizard.present?
42-
builder_opts = {}
43-
builder_opts[:reset] = params[:reset]
44-
built_wizard = builder.build(builder_opts, params)
45-
46-
render_serialized(built_wizard, ::CustomWizard::WizardSerializer, root: false)
28+
if wizard.present?
29+
render json: CustomWizard::WizardSerializer.new(wizard, scope: guardian, root: false).as_json, status: 200
4730
else
4831
render json: { error: I18n.t('wizard.none') }
4932
end
5033
end
51-
format.html {}
34+
format.html do
35+
render "default/empty"
36+
end
5237
end
5338
end
5439

@@ -62,8 +47,10 @@ def skip
6247
result = success_json
6348

6449
if current_user && wizard.can_access?
65-
if redirect_to = wizard.current_submission&.redirect_to
66-
result.merge!(redirect_to: redirect_to)
50+
submission = wizard.current_submission
51+
52+
if submission.present? && submission.redirect_to
53+
result.merge!(redirect_to: submission.redirect_to)
6754
end
6855

6956
wizard.cleanup_on_skip!
@@ -72,6 +59,64 @@ def skip
7259
render json: result
7360
end
7461

62+
def qunit
63+
raise Discourse::InvalidAccess.new if Rails.env.production?
64+
65+
respond_to do |format|
66+
format.html do
67+
render "default/empty"
68+
end
69+
end
70+
end
71+
72+
protected
73+
74+
def ensure_logged_in
75+
raise Discourse::NotLoggedIn.new unless current_user.present?
76+
end
77+
78+
def guardian
79+
@guardian ||= Guardian.new(current_user, request)
80+
end
81+
82+
def wizard
83+
@wizard ||= begin
84+
builder = CustomWizard::Builder.new(params[:wizard_id].underscore, current_user)
85+
return nil unless builder.present?
86+
opts = {}
87+
opts[:reset] = params[:reset]
88+
builder.build(opts, params)
89+
end
90+
end
91+
92+
def wizard_page_title
93+
wizard ? (wizard.name || wizard.id) : I18n.t('wizard.custom_title')
94+
end
95+
96+
def wizard_theme_id
97+
wizard ? wizard.theme_id : nil
98+
end
99+
100+
def wizard_theme_lookup(name)
101+
Theme.lookup_field(wizard_theme_id, view_context.mobile_view? ? :mobile : :desktop, name)
102+
end
103+
104+
def wizard_theme_translations_lookup
105+
Theme.lookup_field(wizard_theme_id, :translations, I18n.locale)
106+
end
107+
108+
def preload_wizard_json
109+
return if request.xhr? || request.format.json?
110+
return if request.method != "GET"
111+
112+
store_preloaded("siteSettings", SiteSetting.client_settings_json)
113+
end
114+
115+
def store_preloaded(key, json)
116+
@preloaded ||= {}
117+
@preloaded[key] = json.gsub("</", "<\\/")
118+
end
119+
75120
private
76121

77122
def ensure_plugin_enabled

app/views/layouts/qunit.html.erb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Custom Wizard QUnit Test Runner</title>
5+
<%= discourse_stylesheet_link_tag(:test_helper, theme_id: nil) %>
6+
<%= discourse_stylesheet_link_tag :wizard, theme_id: nil %>
7+
<%= discourse_stylesheet_link_tag :wizard_custom %>
8+
<%= preload_script "locales/en" %>
9+
<%= preload_script "ember_jquery" %>
10+
<%= preload_script "wizard-vendor" %>
11+
<%= preload_script "wizard-custom" %>
12+
<%= preload_script "wizard-raw-templates" %>
13+
<%= preload_script "wizard-plugin" %>
14+
<%= preload_script "pretty-text-bundle" %>
15+
<%= preload_script "wizard-qunit" %>
16+
<%= csrf_meta_tags %>
17+
18+
<script src="<%= ExtraLocalesController.url("wizard") %>"></script>
19+
20+
<%= tag.meta id: 'data-discourse-setup', data: client_side_setup_data %>
21+
<meta name="discourse_theme_id" content="">
22+
<meta name="discourse-base-uri" content="<%= Discourse.base_path %>">
23+
</head>
24+
<body class="custom-wizard">
25+
<div id="qunit"></div>
26+
<div id="qunit-fixture"></div>
27+
</body>
28+
</html>

app/views/layouts/wizard.html.erb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,8 @@
1111
<%= preload_script "locales/#{I18n.locale}" %>
1212
<%= preload_script "ember_jquery" %>
1313
<%= preload_script "wizard-vendor" %>
14-
<%= preload_script "wizard-application" %>
15-
<%= preload_script "wizard-custom-globals" %>
16-
<%= preload_script "wizard-raw-templates" %>
1714
<%= preload_script "wizard-custom" %>
15+
<%= preload_script "wizard-raw-templates" %>
1816
<%= preload_script "wizard-plugin" %>
1917
<%= preload_script "pretty-text-bundle" %>
2018
<script src="<%= ExtraLocalesController.url("wizard") %>"></script>
@@ -58,5 +56,7 @@
5856
<%= raw SvgSprite.bundle %>
5957
</div>
6058
</div>
59+
60+
<div class="hidden" id="data-preloaded-wizard" data-preloaded-wizard="<%= preloaded_json %>"></div>
6161
</body>
6262
</html>

assets/javascripts/wizard-custom-globals.js

Lines changed: 0 additions & 6 deletions
This file was deleted.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
(function () {
2-
let wizard = require("discourse/plugins/discourse-custom-wizard/wizard/custom-wizard").default.create();
2+
let wizard = require("discourse/plugins/discourse-custom-wizard/wizard/application").default.create();
33
wizard.start();
44
})();

assets/javascripts/wizard-custom.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
1+
//= require_tree_discourse truth-helpers/addon
2+
//= require_tree_discourse discourse-common/addon
3+
//= require_tree_discourse select-kit/addon
4+
//= require_tree_discourse wizard/lib
5+
//= require_tree_discourse wizard/mixins
16
//= require_tree_discourse discourse/app/lib
27
//= require_tree_discourse discourse/app/mixins
38

49
//= require discourse/app/adapters/rest
5-
610
//= require message-bus
7-
811
//= require_tree_discourse discourse/app/models
912

1013
//= require discourse/app/helpers/category-link
1114
//= require discourse/app/helpers/user-avatar
1215
//= require discourse/app/helpers/format-username
1316
//= require discourse/app/helpers/share-url
1417
//= require discourse/app/helpers/decorate-username-selector
15-
//= require discourse-common/addon/helpers/component-for-collection
16-
//= require discourse-common/addon/helpers/component-for-row
17-
//= require discourse-common/addon/lib/raw-templates
1818
//= require discourse/app/helpers/discourse-tag
1919

2020
//= require discourse/app/services/app-events
@@ -70,11 +70,11 @@
7070
//= require bootbox.js
7171
//= require discourse-shims
7272

73-
//= require ./wizard/custom-wizard
73+
//= require ./wizard/application
74+
//= require ./wizard/router
7475
//= require_tree ./wizard/components
7576
//= require_tree ./wizard/controllers
7677
//= require_tree ./wizard/helpers
77-
//= require_tree ./wizard/initializers
7878
//= require_tree ./wizard/lib
7979
//= require_tree ./wizard/models
8080
//= require_tree ./wizard/routes

assets/javascripts/wizard-qunit.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//= require route-recognizer
2+
//= require fake_xml_http_request
3+
//= require pretender
4+
//= require qunit
5+
//= require ember-qunit
6+
//= require test-shims
7+
//= require jquery.debug
8+
//= require ember.debug
9+
//= require ember-template-compiler
10+
11+
//= require_tree ./wizard/tests/fixtures
12+
//= require ./wizard/tests/pretender
13+
//= require_tree ./wizard/tests/helpers
14+
//= require_tree ./wizard/tests/acceptance
15+
16+
//= require ./wizard/tests/bootstrap
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { buildResolver } from "discourse-common/resolver";
2+
import Application from "@ember/application";
3+
import WizardInitializer from "./lib/initialize/wizard";
4+
import { isTesting } from "discourse-common/config/environment";
5+
6+
export default Application.extend({
7+
rootElement: "#custom-wizard-main",
8+
Resolver: buildResolver("discourse/plugins/discourse-custom-wizard/wizard"),
9+
10+
customEvents: {
11+
paste: "paste",
12+
},
13+
14+
start() {
15+
if (!isTesting()) {
16+
this.initializer(WizardInitializer);
17+
}
18+
},
19+
});

assets/javascripts/wizard/components/custom-user-selector.js.es6

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {
22
default as computed,
3-
observes,
3+
observes
44
} from "discourse-common/utils/decorators";
55
import { renderAvatar } from "discourse/helpers/user-avatar";
66
import userSearch from "../lib/user-search";
@@ -55,7 +55,6 @@ export default Ember.TextField.extend({
5555
let self = this,
5656
selected = [],
5757
groups = [],
58-
currentUser = this.currentUser,
5958
includeMentionableGroups =
6059
this.get("includeMentionableGroups") === "true",
6160
includeMessageableGroups =
@@ -66,13 +65,8 @@ export default Ember.TextField.extend({
6665
function excludedUsernames() {
6766
// hack works around some issues with allowAny eventing
6867
const usernames = self.get("single") ? [] : selected;
69-
70-
if (currentUser && self.get("excludeCurrentUser")) {
71-
return usernames.concat([currentUser.get("username")]);
72-
}
7368
return usernames;
7469
}
75-
7670
$(this.element)
7771
.val(this.get("usernames"))
7872
.autocomplete({
@@ -84,7 +78,6 @@ export default Ember.TextField.extend({
8478

8579
dataSource(term) {
8680
const termRegex = /[^a-zA-Z0-9_\-\.@\+]/;
87-
8881
let results = userSearch({
8982
term: term.replace(termRegex, ""),
9083
topicId: self.get("topicId"),

assets/javascripts/wizard/components/field-validators.js.es6

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import Component from "@ember/component";
2+
23
export default Component.extend({
4+
layoutName: 'wizard/templates/components/field-validators',
5+
36
actions: {
47
perform() {
58
this.appEvents.trigger("custom-wizard:validate");

0 commit comments

Comments
 (0)