Spiegel von
https://github.com/paviliondev/discourse-custom-wizard.git
synchronisiert 2024-11-25 02:30:28 +01:00
Merge pull request #286 from paviliondev/remove_bootbox
Remove bootbox
Dieser Commit ist enthalten in:
Commit
895ee9dd96
8 geänderte Dateien mit 70 neuen und 42 gelöschten Zeilen
|
@ -1,6 +1,5 @@
|
||||||
import discourseComputed, { observes } from "discourse-common/utils/decorators";
|
import discourseComputed, { observes } from "discourse-common/utils/decorators";
|
||||||
import Component from "@ember/component";
|
import Component from "@ember/component";
|
||||||
import I18n from "I18n";
|
|
||||||
import getUrl from "discourse-common/lib/get-url";
|
import getUrl from "discourse-common/lib/get-url";
|
||||||
import { htmlSafe } from "@ember/template";
|
import { htmlSafe } from "@ember/template";
|
||||||
import { schedule } from "@ember/runloop";
|
import { schedule } from "@ember/runloop";
|
||||||
|
@ -11,8 +10,6 @@ import CustomWizard, {
|
||||||
import { alias, not } from "@ember/object/computed";
|
import { alias, not } from "@ember/object/computed";
|
||||||
import discourseLater from "discourse-common/lib/later";
|
import discourseLater from "discourse-common/lib/later";
|
||||||
|
|
||||||
const alreadyWarned = {};
|
|
||||||
|
|
||||||
export default Component.extend({
|
export default Component.extend({
|
||||||
classNameBindings: [":wizard-step", "step.id"],
|
classNameBindings: [":wizard-step", "step.id"],
|
||||||
saving: null,
|
saving: null,
|
||||||
|
@ -197,27 +194,9 @@ export default Component.extend({
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const step = this.step;
|
this.step.validate();
|
||||||
const result = step.validate();
|
|
||||||
|
|
||||||
if (result.warnings.length) {
|
if (this.step.get("valid")) {
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (step.get("valid")) {
|
|
||||||
this.advance();
|
this.advance();
|
||||||
} else {
|
} else {
|
||||||
this.autoFocus();
|
this.autoFocus();
|
||||||
|
|
|
@ -25,7 +25,6 @@ export default EmberObject.extend(ValidState, {
|
||||||
type: null,
|
type: null,
|
||||||
value: null,
|
value: null,
|
||||||
required: null,
|
required: null,
|
||||||
warning: null,
|
|
||||||
|
|
||||||
@discourseComputed("wizardId", "stepId", "id")
|
@discourseComputed("wizardId", "stepId", "id")
|
||||||
i18nKey(wizardId, stepId, id) {
|
i18nKey(wizardId, stepId, id) {
|
||||||
|
|
|
@ -35,19 +35,12 @@ export default EmberObject.extend(ValidState, {
|
||||||
|
|
||||||
validate() {
|
validate() {
|
||||||
let allValid = true;
|
let allValid = true;
|
||||||
const result = { warnings: [] };
|
|
||||||
|
|
||||||
this.fields.forEach((field) => {
|
this.fields.forEach((field) => {
|
||||||
allValid = allValid && field.check();
|
allValid = allValid && field.check();
|
||||||
const warning = field.get("warning");
|
|
||||||
if (warning) {
|
|
||||||
result.warnings.push(warning);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this.setValid(allValid);
|
this.setValid(allValid);
|
||||||
|
|
||||||
return result;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
fieldError(id, description) {
|
fieldError(id, description) {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import discourseComputed from "discourse-common/utils/decorators";
|
||||||
import getUrl from "discourse-common/lib/get-url";
|
import getUrl from "discourse-common/lib/get-url";
|
||||||
import CustomWizardField from "./custom-wizard-field";
|
import CustomWizardField from "./custom-wizard-field";
|
||||||
import CustomWizardStep from "./custom-wizard-step";
|
import CustomWizardStep from "./custom-wizard-step";
|
||||||
|
import DiscourseURL from "discourse/lib/url";
|
||||||
|
|
||||||
const CustomWizard = EmberObject.extend({
|
const CustomWizard = EmberObject.extend({
|
||||||
@discourseComputed("steps.length")
|
@discourseComputed("steps.length")
|
||||||
|
@ -34,7 +35,7 @@ CustomWizard.reopenClass({
|
||||||
restart(wizardId) {
|
restart(wizardId) {
|
||||||
ajax({ url: `/w/${wizardId}/skip`, type: "PUT" })
|
ajax({ url: `/w/${wizardId}/skip`, type: "PUT" })
|
||||||
.then(() => {
|
.then(() => {
|
||||||
window.location.href = `/w/${wizardId}`;
|
DiscourseURL.redirectTo(getUrl(`/w/${wizardId}`));
|
||||||
})
|
})
|
||||||
.catch(popupAjaxError);
|
.catch(popupAjaxError);
|
||||||
},
|
},
|
||||||
|
@ -44,7 +45,7 @@ CustomWizard.reopenClass({
|
||||||
if (result.redirect_on_complete) {
|
if (result.redirect_on_complete) {
|
||||||
url = result.redirect_on_complete;
|
url = result.redirect_on_complete;
|
||||||
}
|
}
|
||||||
window.location.href = getUrl(url);
|
DiscourseURL.redirectTo(getUrl(url));
|
||||||
},
|
},
|
||||||
|
|
||||||
build(wizardJson) {
|
build(wizardJson) {
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
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";
|
import { inject as service } from "@ember/service";
|
||||||
|
|
||||||
export default DiscourseRoute.extend({
|
export default DiscourseRoute.extend({
|
||||||
|
dialog: service(),
|
||||||
|
|
||||||
titleToken() {
|
titleToken() {
|
||||||
const wizard = this.modelFor("custom-wizard");
|
const wizard = this.modelFor("custom-wizard");
|
||||||
return wizard ? wizard.name || wizard.id : I18n.t("wizard.custom_title");
|
return wizard ? wizard.name || wizard.id : I18n.t("wizard.custom_title");
|
||||||
|
@ -30,7 +32,7 @@ export default DiscourseRoute.extend({
|
||||||
{
|
{
|
||||||
label: I18n.t("wizard.incomplete_submission.restart"),
|
label: I18n.t("wizard.incomplete_submission.restart"),
|
||||||
class: "btn btn-default",
|
class: "btn btn-default",
|
||||||
callback: () => {
|
action: () => {
|
||||||
wizardModel.restart();
|
wizardModel.restart();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -40,11 +42,7 @@ export default DiscourseRoute.extend({
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const options = {
|
this.dialog.dialog({ title, buttons, type: "confirm" });
|
||||||
onEscape: false,
|
|
||||||
};
|
|
||||||
|
|
||||||
bootbox.dialog(title, buttons, options);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
afterModel(model) {
|
afterModel(model) {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
# name: discourse-custom-wizard
|
# name: discourse-custom-wizard
|
||||||
# about: Forms for Discourse. Better onboarding, structured posting, data enrichment, automated actions and much more.
|
# 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
|
# authors: Angus McLeod, Faizaan Gagan, Robert Barrow, Keegan George, Kaitlin Maddever, Juan Marcos Gutierrez Ramos
|
||||||
# url: https://github.com/paviliondev/discourse-custom-wizard
|
# url: https://github.com/paviliondev/discourse-custom-wizard
|
||||||
# contact_emails: development@pavilion.tech
|
# contact_emails: development@pavilion.tech
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { visit } from "@ember/test-helpers";
|
import { click, visit } from "@ember/test-helpers";
|
||||||
import { test } from "qunit";
|
import { test } from "qunit";
|
||||||
import {
|
import {
|
||||||
acceptance,
|
acceptance,
|
||||||
|
@ -12,9 +12,12 @@ import {
|
||||||
wizardGuest,
|
wizardGuest,
|
||||||
wizardNoUser,
|
wizardNoUser,
|
||||||
wizardNotPermitted,
|
wizardNotPermitted,
|
||||||
|
wizardResumeOnRevisit,
|
||||||
} from "../helpers/wizard";
|
} from "../helpers/wizard";
|
||||||
import DiscourseURL from "discourse/lib/url";
|
import DiscourseURL from "discourse/lib/url";
|
||||||
import sinon from "sinon";
|
import sinon from "sinon";
|
||||||
|
import pretender, { response } from "discourse/tests/helpers/create-pretender";
|
||||||
|
import I18n from "I18n";
|
||||||
|
|
||||||
acceptance("Wizard | Not logged in", function (needs) {
|
acceptance("Wizard | Not logged in", function (needs) {
|
||||||
needs.pretender((server, helper) => {
|
needs.pretender((server, helper) => {
|
||||||
|
@ -194,3 +197,53 @@ acceptance("Wizard | Guest access", function (needs) {
|
||||||
assert.strictEqual($("body.custom-wizard").length, 0);
|
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"
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
|
@ -23,6 +23,10 @@ wizard.resume_on_revisit = false;
|
||||||
wizard.submission_last_updated_at = "2022-03-11T20:00:18+01:00";
|
wizard.submission_last_updated_at = "2022-03-11T20:00:18+01:00";
|
||||||
wizard.subscribed = false;
|
wizard.subscribed = false;
|
||||||
|
|
||||||
|
const wizardResumeOnRevisit = cloneJSON(wizard);
|
||||||
|
wizardResumeOnRevisit.start = "step_2";
|
||||||
|
wizardResumeOnRevisit.resume_on_revisit = true;
|
||||||
|
|
||||||
const stepNotPermitted = cloneJSON(wizard);
|
const stepNotPermitted = cloneJSON(wizard);
|
||||||
stepNotPermitted.steps[0].permitted = false;
|
stepNotPermitted.steps[0].permitted = false;
|
||||||
|
|
||||||
|
@ -44,6 +48,7 @@ export {
|
||||||
wizardNotPermitted,
|
wizardNotPermitted,
|
||||||
wizardCompleted,
|
wizardCompleted,
|
||||||
wizardGuest,
|
wizardGuest,
|
||||||
|
wizardResumeOnRevisit,
|
||||||
stepNotPermitted,
|
stepNotPermitted,
|
||||||
allFieldsWizard,
|
allFieldsWizard,
|
||||||
wizard,
|
wizard,
|
||||||
|
|
Laden …
In neuem Issue referenzieren