mirror of
https://github.com/flarum/core.git
synced 2025-07-19 07:41:22 +02:00
Add badges API + styles for discussions and users
This commit is contained in:
@@ -8,5 +8,5 @@ var precompileTemplate = Ember.Handlebars.compile;
|
|||||||
export default Ember.Component.extend({
|
export default Ember.Component.extend({
|
||||||
tagName: 'h3',
|
tagName: 'h3',
|
||||||
classNames: ['post-user'],
|
classNames: ['post-user'],
|
||||||
layout: precompileTemplate('{{#if post.user}}{{#link-to "user" post.user}}{{user-avatar post.user}} {{user-name post.user}}{{/link-to}}{{else}}{{user-avatar post.user}} {{user-name post.user}}{{/if}}')
|
layout: precompileTemplate('{{#if post.user}}{{#link-to "user" post.user}}{{user-avatar post.user}} {{user-name post.user}}{{/link-to}}{{else}}{{user-avatar post.user}} {{user-name post.user}}{{/if}}{{ui/item-list items=post.user.badges class="badges"}}')
|
||||||
});
|
});
|
||||||
|
11
framework/core/ember/app/components/ui/badge-button.js
Normal file
11
framework/core/ember/app/components/ui/badge-button.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import ActionButton from 'flarum/components/ui/action-button';
|
||||||
|
|
||||||
|
export default ActionButton.extend({
|
||||||
|
tagName: 'span',
|
||||||
|
classNames: ['badge'],
|
||||||
|
title: Ember.computed.alias('label'),
|
||||||
|
|
||||||
|
didInsertElement: function() {
|
||||||
|
this.$().tooltip();
|
||||||
|
}
|
||||||
|
});
|
@@ -1,7 +1,25 @@
|
|||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
import DS from 'ember-data';
|
import DS from 'ember-data';
|
||||||
|
|
||||||
export default DS.Model.extend({
|
import HasItemLists from 'flarum/mixins/has-item-lists';
|
||||||
|
|
||||||
|
export default DS.Model.extend(HasItemLists, {
|
||||||
|
/**
|
||||||
|
Define a "badges" item list. Example usage:
|
||||||
|
```
|
||||||
|
populateBadges: function(items) {
|
||||||
|
items.pushObjectWithTag(BadgeButton.extend({
|
||||||
|
label: 'Sticky',
|
||||||
|
icon: 'thumb-tack',
|
||||||
|
className: 'badge-sticky',
|
||||||
|
discussion: this,
|
||||||
|
isHiddenInList: Ember.computed.not('discussion.sticky')
|
||||||
|
}), 'sticky');
|
||||||
|
}
|
||||||
|
```
|
||||||
|
*/
|
||||||
|
itemLists: ['badges'],
|
||||||
|
|
||||||
title: DS.attr('string'),
|
title: DS.attr('string'),
|
||||||
slug: Ember.computed('title', function() {
|
slug: Ember.computed('title', function() {
|
||||||
return this.get('title').toLowerCase().replace(/[^a-z0-9]/gi, '-').replace(/-+/g, '-');
|
return this.get('title').toLowerCase().replace(/[^a-z0-9]/gi, '-').replace(/-+/g, '-');
|
||||||
|
@@ -1,8 +1,11 @@
|
|||||||
import DS from 'ember-data';
|
import DS from 'ember-data';
|
||||||
|
|
||||||
|
import HasItemLists from 'flarum/mixins/has-item-lists';
|
||||||
import stringToColor from 'flarum/utils/string-to-color';
|
import stringToColor from 'flarum/utils/string-to-color';
|
||||||
|
|
||||||
export default DS.Model.extend({
|
export default DS.Model.extend(HasItemLists, {
|
||||||
|
itemLists: ['badges'],
|
||||||
|
|
||||||
username: DS.attr('string'),
|
username: DS.attr('string'),
|
||||||
email: DS.attr('string'),
|
email: DS.attr('string'),
|
||||||
password: DS.attr('string'),
|
password: DS.attr('string'),
|
||||||
|
@@ -21,6 +21,7 @@
|
|||||||
// Finally, with our vendor CSS loaded, we can import Flarum-specific stuff.
|
// Finally, with our vendor CSS loaded, we can import Flarum-specific stuff.
|
||||||
@import "@{flarum-base}components.less";
|
@import "@{flarum-base}components.less";
|
||||||
@import "@{flarum-base}buttons.less";
|
@import "@{flarum-base}buttons.less";
|
||||||
|
@import "@{flarum-base}badges.less";
|
||||||
@import "@{flarum-base}dropdowns.less";
|
@import "@{flarum-base}dropdowns.less";
|
||||||
@import "@{flarum-base}avatars.less";
|
@import "@{flarum-base}avatars.less";
|
||||||
@import "@{flarum-base}forms.less";
|
@import "@{flarum-base}forms.less";
|
||||||
|
31
framework/core/ember/app/styles/flarum/badges.less
Normal file
31
framework/core/ember/app/styles/flarum/badges.less
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
.badges {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
|
||||||
|
&, & > li {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.badge-size(@size) {
|
||||||
|
width: @size;
|
||||||
|
height: @size;
|
||||||
|
border-radius: @size / 2;
|
||||||
|
line-height: @size - 4px;
|
||||||
|
&, & .fa {
|
||||||
|
font-size: 0.6 * @size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.badge {
|
||||||
|
.badge-size(24px);
|
||||||
|
border: 2px solid @fl-body-bg;
|
||||||
|
background: @fl-body-secondary-color;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
& .label {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
@@ -1,3 +1,16 @@
|
|||||||
|
// ------------------------------------
|
||||||
|
// Hero
|
||||||
|
|
||||||
|
.discussion-hero {
|
||||||
|
& .badges {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.discussion-title {
|
||||||
|
display: inline;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
// Sidebar
|
// Sidebar
|
||||||
|
|
||||||
@@ -159,6 +172,16 @@
|
|||||||
&, & a {
|
&, & a {
|
||||||
color: @fl-body-heading-color;
|
color: @fl-body-heading-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
& .badges {
|
||||||
|
text-align: right;
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
& .badge {
|
||||||
|
margin-left: -15px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.post-body {
|
.post-body {
|
||||||
@@ -273,6 +296,21 @@
|
|||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.post-user {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
& .badges {
|
||||||
|
position: absolute;
|
||||||
|
top: -7px;
|
||||||
|
left: 5px;
|
||||||
|
width: 32px;
|
||||||
|
|
||||||
|
& .badge {
|
||||||
|
.badge-size(20px);
|
||||||
|
margin-left: -13px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
.post-activity {
|
.post-activity {
|
||||||
padding-left: 30px;
|
padding-left: 30px;
|
||||||
}
|
}
|
||||||
@@ -304,6 +342,14 @@
|
|||||||
.avatar-size(64px);
|
.avatar-size(64px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.post-user {
|
||||||
|
& .badges {
|
||||||
|
float: left;
|
||||||
|
margin-left: -85px;
|
||||||
|
margin-top: -3px;
|
||||||
|
width: 64px;
|
||||||
|
}
|
||||||
|
}
|
||||||
.post-icon {
|
.post-icon {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
margin-left: -90px;
|
margin-left: -90px;
|
||||||
|
@@ -262,13 +262,24 @@
|
|||||||
.discussion-summary {
|
.discussion-summary {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
&, & a {
|
&, & .main {
|
||||||
color: @fl-body-muted-color;
|
color: @fl-body-muted-color;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
& .author {
|
& .author {
|
||||||
float: left;
|
float: left;
|
||||||
margin-top: 18px;
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
& .badges {
|
||||||
|
float: left;
|
||||||
|
margin-top: 17px;
|
||||||
|
text-align: right;
|
||||||
|
white-space: nowrap;
|
||||||
|
|
||||||
|
& .badge {
|
||||||
|
margin-left: -15px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
& .main {
|
& .main {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
@@ -324,6 +335,15 @@
|
|||||||
& .author {
|
& .author {
|
||||||
margin-left: -45px;
|
margin-left: -45px;
|
||||||
}
|
}
|
||||||
|
& .badges {
|
||||||
|
margin-left: -45px;
|
||||||
|
width: 38px;
|
||||||
|
|
||||||
|
& .badge {
|
||||||
|
.badge-size(20px);
|
||||||
|
margin-left: -13px;
|
||||||
|
}
|
||||||
|
}
|
||||||
& .avatar {
|
& .avatar {
|
||||||
.avatar-size(32px);
|
.avatar-size(32px);
|
||||||
}
|
}
|
||||||
@@ -362,6 +382,10 @@
|
|||||||
& .author {
|
& .author {
|
||||||
margin-left: -65px;
|
margin-left: -65px;
|
||||||
}
|
}
|
||||||
|
& .badges {
|
||||||
|
margin-left: -65px;
|
||||||
|
width: 58px;
|
||||||
|
}
|
||||||
& .main {
|
& .main {
|
||||||
margin-right: -65px;
|
margin-right: -65px;
|
||||||
}
|
}
|
||||||
|
@@ -9,11 +9,7 @@
|
|||||||
|
|
||||||
{{#link-to "user" discussion.startUser class="author"}}{{user-avatar discussion.startUser}}{{/link-to}}
|
{{#link-to "user" discussion.startUser class="author"}}{{user-avatar discussion.startUser}}{{/link-to}}
|
||||||
|
|
||||||
<div class="badges">
|
{{ui/item-list items=discussion.badges class="badges"}}
|
||||||
{{#each badge in badges}}
|
|
||||||
{{fl-badge badge}}
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{#link-to "discussion" discussion.content (query-params start=start) current-when="discussion" class="main"}}
|
{{#link-to "discussion" discussion.content (query-params start=start) current-when="discussion" class="main"}}
|
||||||
<h3 class="title">{{highlight-words discussion.title searchQuery}}</h3>
|
<h3 class="title">{{highlight-words discussion.title searchQuery}}</h3>
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
<header class="hero discussion-hero">
|
<header class="hero discussion-hero">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
{{ui/item-list items=model.badges class="badges"}}
|
||||||
<h2 class="discussion-title">{{model.title}}</h2>
|
<h2 class="discussion-title">{{model.title}}</h2>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
Reference in New Issue
Block a user