FEATURE: Add group and category restrictions to house ads (#205)
# Description
This PR adds the ability to apply **group** and **category** restrictions to a **house ad**.
# What is included
- In order to get the group and category selectors to work within `admin/assets/javascripts/discourse/controllers/admin-plugins-house-ads-show.js` I needed to modernize the file.
- I dropped the `bufferedProperty` implementation in favor of a vanilla ember approach
- I added `category_ids` and `group_ids` to our house ads model
- I added tests for group / category restrictions
- I added a preview button to display the house ad
- `/site.json` would return a object called `house_creatives` and a list of key value pairs that matched the ad name with the html, like so:
```js
{ AD_KEY: ad.html }
```
I need access to the category ids on the client to conditionally render the house ads so the new format will be:
```js
{ AD_KEY: { html: ad.html, category_ids: ad.category_ids } }
```
# Screenshots
<img width="658" alt="Screenshot 2024-04-08 at 2 39 22 PM" src="https://github.com/discourse/discourse-adplugin/assets/50783505/b44b386d-65a1-4a2a-a487-d735b13357dd">
# Preview Video
https://github.com/discourse/discourse-adplugin/assets/50783505/6d0d8253-afef-4e15-b6fc-c6f696efd169
This commit is contained in:
@@ -25,14 +25,26 @@ acceptance("House Ads", function (needs) {
|
||||
after_nth_topic: 6,
|
||||
},
|
||||
creatives: {
|
||||
"Topic List Top": "<div class='h-topic-list'>TOPIC LIST TOP</div>",
|
||||
"Above Post Stream":
|
||||
"<div class='h-above-post-stream'>ABOVE POST STREAM</div>",
|
||||
"Above Suggested":
|
||||
"<div class='h-above-suggested'>ABOVE SUGGESTED</div>",
|
||||
Post: "<div class='h-post'>BELOW POST</div>",
|
||||
"Between Topic List":
|
||||
"<div class='h-between-topic-list'>BETWEEN TOPIC LIST</div>",
|
||||
"Topic List Top": {
|
||||
html: "<div class='h-topic-list'>TOPIC LIST TOP</div>",
|
||||
category_ids: [],
|
||||
},
|
||||
"Above Post Stream": {
|
||||
html: "<div class='h-above-post-stream'>ABOVE POST STREAM</div>",
|
||||
category_ids: [],
|
||||
},
|
||||
"Above Suggested": {
|
||||
html: "<div class='h-above-suggested'>ABOVE SUGGESTED</div>",
|
||||
category_ids: [],
|
||||
},
|
||||
Post: {
|
||||
html: "<div class='h-post'>BELOW POST</div>",
|
||||
category_ids: [],
|
||||
},
|
||||
"Between Topic List": {
|
||||
html: "<div class='h-between-topic-list'>BETWEEN TOPIC LIST</div>",
|
||||
category_ids: [],
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -114,3 +126,175 @@ acceptance("House Ads", function (needs) {
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
acceptance(
|
||||
"House Ads | Category and Group Permissions | Authenticated | Display Ad",
|
||||
function (needs) {
|
||||
needs.user();
|
||||
needs.settings({
|
||||
no_ads_for_categories: "",
|
||||
});
|
||||
needs.site({
|
||||
house_creatives: {
|
||||
settings: {
|
||||
topic_list_top: "Topic List Top",
|
||||
},
|
||||
creatives: {
|
||||
"Topic List Top": {
|
||||
html: "<div class='h-topic-list'>TOPIC LIST TOP</div>",
|
||||
// match /c/bug/1
|
||||
category_ids: [1],
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
test("displays ad to users when current category id is included in ad category_ids", async (assert) => {
|
||||
updateCurrentUser({
|
||||
staff: false,
|
||||
trust_level: 1,
|
||||
show_to_groups: true,
|
||||
});
|
||||
await visit("/c/bug/1");
|
||||
assert
|
||||
.dom(".h-topic-list")
|
||||
.exists(
|
||||
"ad is displayed above the topic list because the current category id is included in the ad category_ids"
|
||||
);
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
acceptance(
|
||||
"House Ads | Category and Group Permissions | Authenticated | Hide Ad",
|
||||
function (needs) {
|
||||
needs.user();
|
||||
needs.settings({
|
||||
no_ads_for_categories: "",
|
||||
});
|
||||
needs.site({
|
||||
house_creatives: {
|
||||
settings: {
|
||||
topic_list_top: "Topic List Top",
|
||||
},
|
||||
creatives: {
|
||||
"Topic List Top": {
|
||||
html: "<div class='h-topic-list'>TOPIC LIST TOP</div>",
|
||||
// restrict ad to a different category than /c/bug/1
|
||||
category_ids: [2],
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
test("hides ad to users when current category id is not included in ad category_ids", async (assert) => {
|
||||
updateCurrentUser({
|
||||
staff: false,
|
||||
trust_level: 1,
|
||||
show_to_groups: true,
|
||||
});
|
||||
await visit("/c/bug/1");
|
||||
assert
|
||||
.dom(".h-topic-list")
|
||||
.doesNotExist(
|
||||
"ad is not displayed because the current category id is included in the ad category_ids"
|
||||
);
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
acceptance(
|
||||
"House Ads | Category and Group Permissions | Anonymous | Hide Ad",
|
||||
function (needs) {
|
||||
needs.settings({
|
||||
no_ads_for_categories: "",
|
||||
});
|
||||
needs.site({
|
||||
house_creatives: {
|
||||
settings: {
|
||||
topic_list_top: "Topic List Top",
|
||||
},
|
||||
creatives: {
|
||||
"Topic List Top": {
|
||||
html: "<div class='h-topic-list'>TOPIC LIST TOP</div>",
|
||||
// restrict ad to a different category than /c/bug/1
|
||||
category_ids: [2],
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
test("hides ad to anon users when current category id is not included in ad category_ids", async (assert) => {
|
||||
await visit("/c/bug/1");
|
||||
assert
|
||||
.dom(".h-topic-list")
|
||||
.doesNotExist(
|
||||
"ad is not displayed because the current category id is included in the ad category_ids"
|
||||
);
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
acceptance(
|
||||
"House Ads | Category and Group Permissions | Anonymous | Hide Ad",
|
||||
function (needs) {
|
||||
needs.settings({
|
||||
no_ads_for_categories: "",
|
||||
});
|
||||
needs.site({
|
||||
house_creatives: {
|
||||
settings: {
|
||||
topic_list_top: "Topic List Top",
|
||||
},
|
||||
creatives: {
|
||||
"Topic List Top": {
|
||||
html: "<div class='h-topic-list'>TOPIC LIST TOP</div>",
|
||||
// restrict ad to a different category than /c/bug/1
|
||||
category_ids: [2],
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
test("hides ad to anon users when current category id is not included in ad category_ids", async (assert) => {
|
||||
await visit("/c/bug/1");
|
||||
assert
|
||||
.dom(".h-topic-list")
|
||||
.doesNotExist(
|
||||
"ad is not displayed because the current category id is included in the ad category_ids"
|
||||
);
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
acceptance(
|
||||
"House Ads | Category and Group Permissions | Anonymous | Show Ad",
|
||||
function (needs) {
|
||||
needs.settings({
|
||||
no_ads_for_categories: "",
|
||||
});
|
||||
needs.site({
|
||||
house_creatives: {
|
||||
settings: {
|
||||
topic_list_top: "Topic List Top",
|
||||
},
|
||||
creatives: {
|
||||
"Topic List Top": {
|
||||
html: "<div class='h-topic-list'>TOPIC LIST TOP</div>",
|
||||
// match /c/bug/1
|
||||
category_ids: [1],
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
test("hides ad to anon users when current category id is not included in ad category_ids", async (assert) => {
|
||||
await visit("/c/bug/1");
|
||||
assert
|
||||
.dom(".h-topic-list")
|
||||
.exists(
|
||||
"ad is displayed because the current category id is included in the ad category_ids"
|
||||
);
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user