Skip to content

Commit 10c30a0

Browse files
authored
Merge pull request #296 from paviliondev/add_after_time_targets
FEATURE: Add after time groups
2 parents 95aba3c + 4fdb430 commit 10c30a0

File tree

21 files changed

+259
-15
lines changed

21 files changed

+259
-15
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# frozen_string_literal: true
2+
class CustomWizard::UserController < ::Admin::AdminController
3+
before_action :ensure_admin
4+
requires_plugin "discourse-custom-wizard"
5+
6+
def clear_redirect
7+
user = User.find_by(id: params[:id])
8+
9+
if user
10+
user.custom_fields["redirect_to_wizard"] = nil
11+
user.save_custom_fields(true)
12+
render json: success_json
13+
else
14+
render json: failed_json
15+
end
16+
end
17+
end

app/controllers/custom_wizard/admin/wizard.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ def save_wizard_params
7878
:resume_on_revisit,
7979
:theme_id,
8080
permitted: mapped_params,
81+
after_time_groups: [],
8182
steps: [
8283
:id,
8384
:index,

app/jobs/regular/set_after_time_wizard.rb

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,32 @@ module Jobs
33
class SetAfterTimeWizard < ::Jobs::Base
44
def execute(args)
55
if SiteSetting.custom_wizard_enabled
6-
wizard = CustomWizard::Wizard.create(args[:wizard_id])
6+
@wizard = CustomWizard::Wizard.create(args[:wizard_id])
77

8-
if wizard && wizard.after_time
8+
if @wizard && @wizard.after_time
99
user_ids = []
1010

11-
User.human_users.each do |user|
12-
user_ids.push(user.id) if CustomWizard::Wizard.set_user_redirect(wizard.id, user)
11+
target_users.each do |user|
12+
user_ids.push(user.id) if CustomWizard::Wizard.set_after_time_redirect(@wizard.id, user)
1313
end
1414

1515
CustomWizard::Template.clear_cache_keys
1616

17-
MessageBus.publish "/redirect_to_wizard", wizard.id, user_ids: user_ids
17+
MessageBus.publish "/redirect_to_wizard", @wizard.id, user_ids: user_ids
1818
end
1919
end
2020
end
21+
22+
def target_users
23+
users = []
24+
25+
if @wizard.after_time_groups.exists?
26+
@wizard.after_time_groups.each { |group| users += group.users }
27+
else
28+
users = User.human_users
29+
end
30+
31+
users
32+
end
2133
end
2234
end
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<section class="details">
2+
<h1>{{i18n "admin.wizard.user.label"}}</h1>
3+
4+
<div class="display-row">
5+
<div class="field">{{i18n "admin.wizard.user.redirect.label"}}</div>
6+
<div class="value">
7+
{{#if model.redirect_to_wizard}}
8+
<LinkTo
9+
@route="adminWizardsWizardShow"
10+
@model={{dasherize model.redirect_to_wizard}}
11+
>
12+
{{model.redirect_to_wizard}}
13+
</LinkTo>
14+
{{else}}
15+
&mdash;
16+
{{/if}}
17+
</div>
18+
<div class="controls">
19+
{{#if model.redirect_to_wizard}}
20+
<DButton
21+
@action={{fn model.clearWizardRedirect model}}
22+
@label="admin.wizard.user.redirect.remove_label"
23+
@title="admin.wizard.user.redirect.remove_title"
24+
/>
25+
{{/if}}
26+
</div>
27+
</div>
28+
</section>

assets/javascripts/discourse/controllers/admin-wizards-wizard-show.js.es6

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ import Controller from "@ember/controller";
1212
import copyText from "discourse/lib/copy-text";
1313
import I18n from "I18n";
1414
import { filterValues } from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard-schema";
15+
import { action } from "@ember/object";
1516

1617
export default Controller.extend({
1718
modal: service(),
19+
site: service(),
1820
hasName: notEmpty("wizard.name"),
1921

2022
@observes("currentStep")
@@ -91,6 +93,24 @@ export default Controller.extend({
9193
return I18n.t(`admin.wizard.error.${errorType}`, errorParams);
9294
},
9395

96+
setAfterTimeGroupIds() {
97+
const groups = this.site.groups.filter((g) =>
98+
this.wizard.after_time_groups.includes(g.name)
99+
);
100+
this.setProperties({
101+
afterTimeGroupIds: groups.map((g) => g.id),
102+
});
103+
},
104+
105+
@action
106+
setAfterTimeGroups(groupIds) {
107+
const groups = this.site.groups.filter((g) => groupIds.includes(g.id));
108+
this.setProperties({
109+
afterTimeGroupIds: groups.map((g) => g.id),
110+
"wizard.after_time_groups": groups.map((g) => g.name),
111+
});
112+
},
113+
94114
actions: {
95115
save() {
96116
this.setProperties({

assets/javascripts/discourse/initializers/custom-wizard-edits.js.es6

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import DiscourseURL from "discourse/lib/url";
22
import { withPluginApi } from "discourse/lib/plugin-api";
33
import getUrl from "discourse-common/lib/get-url";
44
import { observes } from "discourse-common/utils/decorators";
5+
import { popupAjaxError } from "discourse/lib/ajax-error";
6+
import { ajax } from "discourse/lib/ajax";
57

68
export default {
79
name: "custom-wizard-edits",
@@ -105,6 +107,24 @@ export default {
105107
route: "adminWizardsWizard",
106108
icon: "hat-wizard",
107109
});
110+
111+
if (api.getCurrentUser()?.admin) {
112+
api.modifyClass("model:admin-user", {
113+
pluginId: "custom-wizard",
114+
115+
clearWizardRedirect(user) {
116+
return ajax(`/admin/users/${user.id}/wizards/clear_redirect`, {
117+
type: "PUT",
118+
})
119+
.then(() => {
120+
user.setProperties({
121+
redirect_to_wizard: null,
122+
});
123+
})
124+
.catch(popupAjaxError);
125+
},
126+
});
127+
}
108128
});
109129
},
110130
};

assets/javascripts/discourse/lib/wizard-schema.js.es6

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ const wizard = {
1717
resume_on_revisit: null,
1818
theme_id: null,
1919
permitted: null,
20+
after_time_groups: null,
2021
},
2122
mapped: ["permitted"],
2223
required: ["id"],
2324
dependent: {
2425
after_time: "after_time_scheduled",
26+
after_time: "after_time_groups",
2527
},
2628
objectArrays: {
2729
step: {

assets/javascripts/discourse/routes/admin-wizards-wizard-show.js.es6

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,6 @@ export default DiscourseRoute.extend({
4747
};
4848

4949
controller.setProperties(props);
50+
controller.setAfterTimeGroupIds();
5051
},
5152
});

assets/javascripts/discourse/templates/admin-wizards-wizard-show.hbs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,22 @@
162162
}}
163163
</div>
164164
</div>
165+
166+
<div class="setting full">
167+
<div class="setting-label">
168+
<label>{{i18n "admin.wizard.after_time_groups.label"}}</label>
169+
</div>
170+
<div class="setting-value">
171+
<GroupChooser
172+
@content={{this.site.groups}}
173+
@value={{this.afterTimeGroupIds}}
174+
@onChange={{this.setAfterTimeGroups}}
175+
/>
176+
<div class="setting-gutter">
177+
{{i18n "admin.wizard.after_time_groups.description"}}
178+
</div>
179+
</div>
180+
</div>
165181
{{/wizard-subscription-container}}
166182
</div>
167183

assets/stylesheets/common/admin.scss

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,11 +373,16 @@ $error: #ef1700;
373373
}
374374

375375
.input .select-kit,
376-
> .select-kit {
376+
> .select-kit:not(.group-chooser) {
377377
max-width: 250px !important;
378378
min-width: 250px !important;
379379
}
380380

381+
.group-chooser {
382+
max-width: 400px !important;
383+
min-width: 400px !important;
384+
}
385+
381386
&.force-final {
382387
padding: 1em;
383388
background-color: var(--primary-very-low);

0 commit comments

Comments
 (0)