Initial commit
This commit is contained in:
commit
ab0078aded
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 tshenry
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
5
README.md
Normal file
5
README.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Category Previews
|
||||
|
||||
This Discourse theme component will allow you to expose restricted categories without allowing access. The "previews" can link anywhere on or off-site.
|
||||
|
||||
More information here:
|
7
about.json
Normal file
7
about.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"name": "Category Previews",
|
||||
"about_url": null,
|
||||
"license_url": null,
|
||||
"component": true,
|
||||
"minimum_discourse_version": "2.5.0.beta7"
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
import Component from "@ember/component";
|
||||
import { equal } from "@ember/object/computed";
|
||||
import discourseComputed from "discourse-common/utils/decorators";
|
||||
|
||||
const rawCategoryPreviews = settings.category_previews.split("|");
|
||||
|
||||
export default Component.extend({
|
||||
noCategoryStyle: equal("siteSettings.category_style", "none"),
|
||||
|
||||
@discourseComputed()
|
||||
preview() {
|
||||
const previewData = [];
|
||||
const loggedInUser = this.currentUser;
|
||||
const loggedInUserGroup = loggedInUser ? loggedInUser.groups.map(g => g.name) : [];
|
||||
const isStaff = loggedInUser ? loggedInUser.staff : false;
|
||||
const categorySlug = this.args.category.slug;
|
||||
|
||||
rawCategoryPreviews.forEach(rawPreview => {
|
||||
const previewPart = rawPreview.split("~");
|
||||
const permittedGroup = previewPart[4] ? previewPart[4].split(",") : [];
|
||||
const hasCategoryAccess = loggedInUserGroup.some(g => permittedGroup.indexOf(g) > -1);
|
||||
const shouldRender = !loggedInUser || isStaff || !hasCategoryAccess;
|
||||
|
||||
if (shouldRender && categorySlug === previewPart[0]) {
|
||||
previewData.push({
|
||||
title: previewPart[1],
|
||||
description: previewPart[2],
|
||||
href: previewPart[3],
|
||||
className: `above-${categorySlug}`,
|
||||
color: settings.border_color
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return previewData;
|
||||
}
|
||||
});
|
@ -0,0 +1 @@
|
||||
{{category-preview tagName="" args=(hash category=category)}}
|
@ -0,0 +1,67 @@
|
||||
{{#if preview}}
|
||||
{{#each preview as |p|}}
|
||||
{{#if site.mobileView}}
|
||||
<div style={{border-color p.color}} class="category-list-item category {{p.className}}">
|
||||
<table class="topic-list">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th class="main-link">
|
||||
<h3>
|
||||
{{#if p.href}}
|
||||
<a class="category-title-link" href={{p.href}}>
|
||||
<div class="category-text-title">
|
||||
{{#if (theme-setting 'locked_icon')}}
|
||||
{{d-icon (theme-setting 'locked_icon')}}
|
||||
{{/if}}
|
||||
<span class="category-name">{{p.title}}</span>
|
||||
</div>
|
||||
</a>
|
||||
{{else}}
|
||||
<div class="category-text-title">
|
||||
{{#if (theme-setting 'locked_icon')}}
|
||||
{{d-icon (theme-setting 'locked_icon')}}
|
||||
{{/if}}
|
||||
<span class="category-name">{{p.title}}</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
</h3>
|
||||
</th>
|
||||
</tr>
|
||||
<tr class="category-description">
|
||||
<td colspan="3">
|
||||
<div class="category-description">{{html-safe p.description}}</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{else}}
|
||||
<tr class={{p.className}}>
|
||||
<td colspan=2 class="category {{if noCategoryStyle "no-category-style"}}" style={{unless noCategoryStyle (border-color p.color)}}>
|
||||
<h3>
|
||||
{{#if p.href}}
|
||||
<a class="category-title-link" href={{p.href}}>
|
||||
<div class="category-text-title">
|
||||
{{#if (theme-setting 'locked_icon')}}
|
||||
{{d-icon (theme-setting 'locked_icon')}}
|
||||
{{/if}}
|
||||
<span class="category-name">{{p.title}}</span>
|
||||
</div>
|
||||
</a>
|
||||
{{else}}
|
||||
<div class="category-text-title">
|
||||
{{#if (theme-setting 'locked_icon')}}
|
||||
{{d-icon (theme-setting 'locked_icon')}}
|
||||
{{/if}}
|
||||
<span class="category-name">{{p.title}}</span>
|
||||
</div>
|
||||
{{/if}}
|
||||
</h3>
|
||||
{{#if p.description}}
|
||||
<div class="category-description">{{p.description}}</div>
|
||||
{{/if}}
|
||||
</td>
|
||||
</tr>
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
{{/if}}
|
11
mobile/mobile.scss
Normal file
11
mobile/mobile.scss
Normal file
@ -0,0 +1,11 @@
|
||||
.category-list.with-topics {
|
||||
.category-list-item[class*="above-"] {
|
||||
tr.category-description {
|
||||
display: table-row;
|
||||
border-bottom: none;
|
||||
}
|
||||
div.category-description {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
43
settings.yml
Normal file
43
settings.yml
Normal file
@ -0,0 +1,43 @@
|
||||
---
|
||||
category_previews:
|
||||
type: list
|
||||
list_type: simple
|
||||
default: ''
|
||||
description:
|
||||
en: 'Each entry should be ~ delimited using the following format:
|
||||
<br><br>
|
||||
<small><b>category-slug~Preview Name~Preview Description~https://example.com~group</b></small>
|
||||
<br><br>
|
||||
<ul>
|
||||
<li>
|
||||
category-slug - the preview will display above this category in the category list. The slug can be found by looking at a category URL: https://example.com/c/<b>category-slug</b>/12
|
||||
<br>
|
||||
<b>IMPORTANT:</b> The category-slug chosen must be from a category that is visible to everyone.
|
||||
</li>
|
||||
<li> Preview Name - the bold, hyperlinked part of the preview</li>
|
||||
<li>
|
||||
Preview Description - displayed under the Preview Name
|
||||
</li>
|
||||
<li>
|
||||
https://example.com - the link that will be attached to the Preview Name
|
||||
</li>
|
||||
<li>
|
||||
group - a comma-separated list of group names. Members of these groups will <b>not</b> see the preview. This should align with the category permission settings of the category being previewed.
|
||||
<br>
|
||||
<b>IMPORTANT:</b> The groups chosen must configured so that the "Who can see this group?" visibility setting is set to "Group owners, member" or less restrictive.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
There should always be 4 "~" in the entry, but you can choose to exclude values after each "~" to omit one of the above sections
|
||||
<br><br>
|
||||
You can use the same category slug multiple times. When this is done, the previews will display in the order they appear in the setting.'
|
||||
locked_icon:
|
||||
type: string
|
||||
default: 'lock'
|
||||
description:
|
||||
en: 'The name of a Font Awesome icon to display before the Preview Name. Leave blank if no icon is need.'
|
||||
border_color:
|
||||
type: string
|
||||
default: '0088CC'
|
||||
description:
|
||||
en: 'The hex color associated with all category previews when the <code>category style</code> site setting is not set to "none."'
|
Loading…
Reference in New Issue
Block a user