Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 2 additions & 23 deletions assets/javascripts/discourse/components/custom-wizard-step.js.es6
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import discourseComputed, { observes } from "discourse-common/utils/decorators";
import Component from "@ember/component";
import I18n from "I18n";
import getUrl from "discourse-common/lib/get-url";
import { htmlSafe } from "@ember/template";
import { schedule } from "@ember/runloop";
Expand All @@ -11,8 +10,6 @@ import CustomWizard, {
import { alias, not } from "@ember/object/computed";
import discourseLater from "discourse-common/lib/later";

const alreadyWarned = {};

export default Component.extend({
classNameBindings: [":wizard-step", "step.id"],
saving: null,
Expand Down Expand Up @@ -197,27 +194,9 @@ export default Component.extend({
return;
}

const step = this.step;
const result = step.validate();

if (result.warnings.length) {
const unwarned = result.warnings.filter((w) => !alreadyWarned[w]);
if (unwarned.length) {
unwarned.forEach((w) => (alreadyWarned[w] = true));
return window.bootbox.confirm(
unwarned.map((w) => I18n.t(`wizard.${w}`)).join("\n"),
I18n.t("no_value"),
I18n.t("yes_value"),
(confirmed) => {
if (confirmed) {
this.advance();
}
}
);
}
}
this.step.validate();

if (step.get("valid")) {
if (this.step.get("valid")) {
this.advance();
} else {
this.autoFocus();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ export default EmberObject.extend(ValidState, {
type: null,
value: null,
required: null,
warning: null,

@discourseComputed("wizardId", "stepId", "id")
i18nKey(wizardId, stepId, id) {
Expand Down
7 changes: 0 additions & 7 deletions assets/javascripts/discourse/models/custom-wizard-step.js.es6
Original file line number Diff line number Diff line change
Expand Up @@ -35,19 +35,12 @@ export default EmberObject.extend(ValidState, {

validate() {
let allValid = true;
const result = { warnings: [] };

this.fields.forEach((field) => {
allValid = allValid && field.check();
const warning = field.get("warning");
if (warning) {
result.warnings.push(warning);
}
});

this.setValid(allValid);

return result;
},

fieldError(id, description) {
Expand Down
5 changes: 3 additions & 2 deletions assets/javascripts/discourse/models/custom-wizard.js.es6
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import discourseComputed from "discourse-common/utils/decorators";
import getUrl from "discourse-common/lib/get-url";
import CustomWizardField from "./custom-wizard-field";
import CustomWizardStep from "./custom-wizard-step";
import DiscourseURL from "discourse/lib/url";

const CustomWizard = EmberObject.extend({
@discourseComputed("steps.length")
Expand Down Expand Up @@ -34,7 +35,7 @@ CustomWizard.reopenClass({
restart(wizardId) {
ajax({ url: `/w/${wizardId}/skip`, type: "PUT" })
.then(() => {
window.location.href = `/w/${wizardId}`;
DiscourseURL.redirectTo(getUrl(`/w/${wizardId}`));
})
.catch(popupAjaxError);
},
Expand All @@ -44,7 +45,7 @@ CustomWizard.reopenClass({
if (result.redirect_on_complete) {
url = result.redirect_on_complete;
}
window.location.href = getUrl(url);
DiscourseURL.redirectTo(getUrl(url));
},

build(wizardJson) {
Expand Down
12 changes: 5 additions & 7 deletions assets/javascripts/discourse/routes/custom-wizard.js.es6
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { findCustomWizard, updateCachedWizard } from "../models/custom-wizard";
import I18n from "I18n";
import DiscourseRoute from "discourse/routes/discourse";
import bootbox from "bootbox";
import { inject as service } from "@ember/service";

export default DiscourseRoute.extend({
dialog: service(),

titleToken() {
const wizard = this.modelFor("custom-wizard");
return wizard ? wizard.name || wizard.id : I18n.t("wizard.custom_title");
Expand All @@ -30,7 +32,7 @@ export default DiscourseRoute.extend({
{
label: I18n.t("wizard.incomplete_submission.restart"),
class: "btn btn-default",
callback: () => {
action: () => {
wizardModel.restart();
},
},
Expand All @@ -40,11 +42,7 @@ export default DiscourseRoute.extend({
},
];

const options = {
onEscape: false,
};

bootbox.dialog(title, buttons, options);
this.dialog.dialog({ title, buttons, type: "confirm" });
},

afterModel(model) {
Expand Down
2 changes: 1 addition & 1 deletion plugin.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# frozen_string_literal: true
# name: discourse-custom-wizard
# about: Forms for Discourse. Better onboarding, structured posting, data enrichment, automated actions and much more.
# version: 2.6.2
# version: 2.6.3
# authors: Angus McLeod, Faizaan Gagan, Robert Barrow, Keegan George, Kaitlin Maddever, Juan Marcos Gutierrez Ramos
# url: https://github.com/paviliondev/discourse-custom-wizard
# contact_emails: development@pavilion.tech
Expand Down
55 changes: 54 additions & 1 deletion test/javascripts/acceptance/wizard-test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { visit } from "@ember/test-helpers";
import { click, visit } from "@ember/test-helpers";
import { test } from "qunit";
import {
acceptance,
Expand All @@ -12,9 +12,12 @@ import {
wizardGuest,
wizardNoUser,
wizardNotPermitted,
wizardResumeOnRevisit,
} from "../helpers/wizard";
import DiscourseURL from "discourse/lib/url";
import sinon from "sinon";
import pretender, { response } from "discourse/tests/helpers/create-pretender";
import I18n from "I18n";

acceptance("Wizard | Not logged in", function (needs) {
needs.pretender((server, helper) => {
Expand Down Expand Up @@ -194,3 +197,53 @@ acceptance("Wizard | Guest access", function (needs) {
assert.strictEqual($("body.custom-wizard").length, 0);
});
});

acceptance("Wizard | Resume on revisit", function (needs) {
needs.user();

test("Shows dialog", async function (assert) {
pretender.get("/w/wizard.json", () => {
return response(wizardResumeOnRevisit);
});

await visit("/w/wizard");

assert.strictEqual(count(".dialog-content:visible"), 1);
assert.strictEqual(
query(".dialog-header h3").textContent.trim(),
I18n.t("wizard.incomplete_submission.title", {
date: moment(wizardResumeOnRevisit.submission_last_updated_at).format(
"MMMM Do YYYY"
),
})
);
});

test("Resumes when resumed", async function (assert) {
pretender.get("/w/wizard.json", () => {
return response(wizardResumeOnRevisit);
});
await visit("/w/wizard");
await click(".dialog-footer .btn-primary");
assert.strictEqual(count(".dialog-content:visible"), 0);
});

test("Restarts when restarted", async function (assert) {
sinon.stub(DiscourseURL, "redirectTo");
let skips = 0;
pretender.get("/w/wizard.json", () => {
return response(wizardResumeOnRevisit);
});
pretender.put("/w/wizard/skip", () => {
skips++;
return response({});
});
await visit("/w/wizard");
await click(".dialog-footer .btn-default");
assert.strictEqual(skips, 1);
assert.ok(
DiscourseURL.redirectTo.calledWith("/w/wizard"),
"resuming wizard works"
);
});
});
5 changes: 5 additions & 0 deletions test/javascripts/helpers/wizard.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ wizard.resume_on_revisit = false;
wizard.submission_last_updated_at = "2022-03-11T20:00:18+01:00";
wizard.subscribed = false;

const wizardResumeOnRevisit = cloneJSON(wizard);
wizardResumeOnRevisit.start = "step_2";
wizardResumeOnRevisit.resume_on_revisit = true;

const stepNotPermitted = cloneJSON(wizard);
stepNotPermitted.steps[0].permitted = false;

Expand All @@ -44,6 +48,7 @@ export {
wizardNotPermitted,
wizardCompleted,
wizardGuest,
wizardResumeOnRevisit,
stepNotPermitted,
allFieldsWizard,
wizard,
Expand Down