DEV: Convert raw-hbs to view only components (#222)
- Convert raw.hbs files to co-located view only components
This commit is contained in:
parent
332ae394e8
commit
29cfa6383c
|
@ -68,7 +68,7 @@
|
||||||
{{#each this.rows as |row|}}
|
{{#each this.rows as |row|}}
|
||||||
<QueryRowContent
|
<QueryRowContent
|
||||||
@row={{row}}
|
@row={{row}}
|
||||||
@columnTemplates={{this.columnTemplates}}
|
@columnComponents={{this.columnComponents}}
|
||||||
@lookupUser={{this.lookupUser}}
|
@lookupUser={{this.lookupUser}}
|
||||||
@lookupBadge={{this.lookupBadge}}
|
@lookupBadge={{this.lookupBadge}}
|
||||||
@lookupPost={{this.lookupPost}}
|
@lookupPost={{this.lookupPost}}
|
||||||
|
|
|
@ -8,7 +8,29 @@ import { schedule } from "@ember/runloop";
|
||||||
import { action } from "@ember/object";
|
import { action } from "@ember/object";
|
||||||
import { tracked } from "@glimmer/tracking";
|
import { tracked } from "@glimmer/tracking";
|
||||||
import { inject as service } from "@ember/service";
|
import { inject as service } from "@ember/service";
|
||||||
import { findRawTemplate } from "discourse-common/lib/raw-templates";
|
import TopicViewComponent from "./result-types/topic";
|
||||||
|
import TextViewComponent from "./result-types/text";
|
||||||
|
import PostViewComponent from "./result-types/post";
|
||||||
|
import ReltimeViewComponent from "./result-types/reltime";
|
||||||
|
import BadgeViewComponent from "./result-types/badge";
|
||||||
|
import UrlViewComponent from "./result-types/url";
|
||||||
|
import UserViewComponent from "./result-types/user";
|
||||||
|
import GroupViewComponent from "./result-types/group";
|
||||||
|
import HtmlViewComponent from "./result-types/html";
|
||||||
|
import CategoryViewComponent from "./result-types/category";
|
||||||
|
|
||||||
|
const VIEW_COMPONENTS = {
|
||||||
|
topic: TopicViewComponent,
|
||||||
|
text: TextViewComponent,
|
||||||
|
post: PostViewComponent,
|
||||||
|
reltime: ReltimeViewComponent,
|
||||||
|
badge: BadgeViewComponent,
|
||||||
|
url: UrlViewComponent,
|
||||||
|
user: UserViewComponent,
|
||||||
|
group: GroupViewComponent,
|
||||||
|
html: HtmlViewComponent,
|
||||||
|
category: CategoryViewComponent,
|
||||||
|
};
|
||||||
|
|
||||||
export default class QueryResult extends Component {
|
export default class QueryResult extends Component {
|
||||||
@service site;
|
@service site;
|
||||||
|
@ -54,18 +76,16 @@ export default class QueryResult extends Component {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
get columnTemplates() {
|
get columnComponents() {
|
||||||
if (!this.columns) {
|
if (!this.columns) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
return this.columns.map((_, idx) => {
|
return this.columns.map((_, idx) => {
|
||||||
let viewName = "text";
|
let type = "text";
|
||||||
if (this.colRender[idx]) {
|
if (this.colRender[idx]) {
|
||||||
viewName = this.colRender[idx];
|
type = this.colRender[idx];
|
||||||
}
|
}
|
||||||
|
return { name: type, component: VIEW_COMPONENTS[type] };
|
||||||
const template = findRawTemplate(`javascripts/explorer/${viewName}`);
|
|
||||||
return { name: viewName, template };
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
<tr>
|
<tr>
|
||||||
{{#each this.results as |result|}}
|
{{#each this.results as |result|}}
|
||||||
<td>{{result}}</td>
|
<td>
|
||||||
|
<result.component
|
||||||
|
@ctx={{result.ctx}}
|
||||||
|
@params={{result.params}}
|
||||||
|
@textValue={{result.textValue}}
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</tr>
|
</tr>
|
|
@ -9,7 +9,7 @@ import { get } from "@ember/object";
|
||||||
import { isEmpty } from "@ember/utils";
|
import { isEmpty } from "@ember/utils";
|
||||||
import { escapeExpression } from "discourse/lib/utilities";
|
import { escapeExpression } from "discourse/lib/utilities";
|
||||||
import { cached } from "@glimmer/tracking";
|
import { cached } from "@glimmer/tracking";
|
||||||
import { findRawTemplate } from "discourse-common/lib/raw-templates";
|
import TextViewComponent from "./result-types/text";
|
||||||
|
|
||||||
export default class QueryRowContent extends Component {
|
export default class QueryRowContent extends Component {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
@ -24,7 +24,8 @@ export default class QueryRowContent extends Component {
|
||||||
|
|
||||||
@cached
|
@cached
|
||||||
get results() {
|
get results() {
|
||||||
return this.args.columnTemplates.map((t, idx) => {
|
return this.args.columnComponents.map((t, idx) => {
|
||||||
|
const params = {};
|
||||||
const value = this.args.row[idx],
|
const value = this.args.row[idx],
|
||||||
id = parseInt(value, 10);
|
id = parseInt(value, 10);
|
||||||
|
|
||||||
|
@ -33,13 +34,19 @@ export default class QueryRowContent extends Component {
|
||||||
id,
|
id,
|
||||||
baseuri: getURL(""),
|
baseuri: getURL(""),
|
||||||
};
|
};
|
||||||
const params = {};
|
|
||||||
|
|
||||||
if (this.args.row[idx] === null) {
|
if (this.args.row[idx] === null) {
|
||||||
return "NULL";
|
return {
|
||||||
|
component: TextViewComponent,
|
||||||
|
textValue: "NULL",
|
||||||
|
};
|
||||||
} else if (t.name === "text") {
|
} else if (t.name === "text") {
|
||||||
return escapeExpression(this.args.row[idx]);
|
return {
|
||||||
|
component: TextViewComponent,
|
||||||
|
textValue: escapeExpression(this.args.row[idx]),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const lookupFunc = this.args[`lookup${capitalize(t.name)}`];
|
const lookupFunc = this.args[`lookup${capitalize(t.name)}`];
|
||||||
if (lookupFunc) {
|
if (lookupFunc) {
|
||||||
ctx[t.name] = lookupFunc.call(this.args, id);
|
ctx[t.name] = lookupFunc.call(this.args, id);
|
||||||
|
@ -57,16 +64,16 @@ export default class QueryRowContent extends Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return htmlSafe((t.template || this.fallbackTemplate)(ctx, params));
|
return {
|
||||||
|
component: t.component || TextViewComponent,
|
||||||
|
ctx,
|
||||||
|
params,
|
||||||
|
};
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return "error";
|
return "error";
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fallbackTemplate() {
|
|
||||||
return findRawTemplate("javascripts/explorer/text");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function icon_or_image_replacement(str, ctx) {
|
function icon_or_image_replacement(str, ctx) {
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
<a
|
||||||
|
href="{{@ctx.baseuri}}/badges/{{@ctx.badge.id}}/{{@ctx.badge.name}}"
|
||||||
|
class="user-badge {{@ctx.badge.badgeTypeClassName}}"
|
||||||
|
title={{@ctx.badge.display_name}}
|
||||||
|
data-badge-name={{@ctx.badge.name}}
|
||||||
|
>
|
||||||
|
{{icon-or-image @ctx.badge.icon}}
|
||||||
|
<span class="badge-display-name">{{@ctx.badge.display_name}}</span>
|
||||||
|
</a>
|
|
@ -0,0 +1,5 @@
|
||||||
|
{{#if @ctx.category}}
|
||||||
|
{{category-link @ctx.category}}
|
||||||
|
{{else}}
|
||||||
|
<a href="{{@ctx.baseuri}}/t/{{@ctx.id}}">{{@ctx.id}}</a>
|
||||||
|
{{/if}}
|
|
@ -0,0 +1,5 @@
|
||||||
|
{{#if @ctx.group}}
|
||||||
|
<a href="{{@ctx.baseuri}}/groups/{{@ctx.group.name}}">{{@ctx.group.name}}</a>
|
||||||
|
{{else}}
|
||||||
|
{{@ctx.id}}
|
||||||
|
{{/if}}
|
|
@ -0,0 +1 @@
|
||||||
|
{{html-safe @textValue}}
|
|
@ -1,14 +1,14 @@
|
||||||
{{#if post}}
|
{{#if @ctx.post}}
|
||||||
<aside
|
<aside
|
||||||
class="quote"
|
class="quote"
|
||||||
data-post={{post.post_number}}
|
data-post={{@ctx.post.post_number}}
|
||||||
data-topic={{post.topic_id}}
|
data-topic={{@ctx.post.topic_id}}
|
||||||
>
|
>
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<div class="quote-controls">
|
<div class="quote-controls">
|
||||||
{{! template-lint-disable no-invalid-link-text }}
|
{{! template-lint-disable no-invalid-link-text }}
|
||||||
<a
|
<a
|
||||||
href="/t/via-quote/{{post.topic_id}}/{{post.post_number}}"
|
href="/t/via-quote/{{@ctx.post.topic_id}}/{{@ctx.post.post_number}}"
|
||||||
title="go to the quoted post"
|
title="go to the quoted post"
|
||||||
class="quote-other-topic"
|
class="quote-other-topic"
|
||||||
>
|
>
|
||||||
|
@ -17,18 +17,18 @@
|
||||||
|
|
||||||
<a
|
<a
|
||||||
class="result-post-link"
|
class="result-post-link"
|
||||||
href="/t/{{post.topic_id}}/{{post.post_number}}"
|
href="/t/{{@ctx.post.topic_id}}/{{@ctx.post.post_number}}"
|
||||||
>
|
>
|
||||||
{{avatar post imageSize="tiny"}}{{post.username}}:
|
{{avatar @ctx.post imageSize="tiny"}}{{@ctx.post.username}}:
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>
|
<p>
|
||||||
{{html-safe post.excerpt}}
|
{{html-safe @ctx.post.excerpt}}
|
||||||
</p>
|
</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
</aside>
|
</aside>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{id}}
|
{{@ctx.id}}
|
||||||
{{/if}}
|
{{/if}}
|
|
@ -0,0 +1 @@
|
||||||
|
{{reltime @textValue}}
|
|
@ -0,0 +1 @@
|
||||||
|
{{@textValue}}
|
|
@ -0,0 +1,8 @@
|
||||||
|
{{#if @ctx.topic}}
|
||||||
|
<a href="{{@ctx.baseuri}}/t/{{@ctx.topic.slug}}/{{@ctx.topic.id}}">
|
||||||
|
{{html-safe @ctx.topic.fancy_title}}
|
||||||
|
</a>
|
||||||
|
({{@ctx.topic.posts_count}})
|
||||||
|
{{else}}
|
||||||
|
<a href="{{@ctx.baseuri}}/t/{{@ctx.id}}">{{@ctx.id}}</a>
|
||||||
|
{{/if}}
|
|
@ -0,0 +1 @@
|
||||||
|
<a href={{@ctx.href}}>{{@ctx.target}}</a>
|
|
@ -0,0 +1,11 @@
|
||||||
|
{{#if @ctx.user}}
|
||||||
|
<a
|
||||||
|
href="{{@ctx.baseuri}}/u/{{@ctx.user.username}}/activity"
|
||||||
|
data-user-card={{@ctx.user.username}}
|
||||||
|
>
|
||||||
|
{{avatar @ctx.user imageSize="tiny"}}
|
||||||
|
{{@ctx.user.username}}
|
||||||
|
</a>
|
||||||
|
{{else}}
|
||||||
|
{{@ctx.id}}
|
||||||
|
{{/if}}
|
|
@ -1,10 +0,0 @@
|
||||||
{{! source: badge-button component }}
|
|
||||||
<a
|
|
||||||
href="{{baseuri}}/badges/{{badge.id}}/{{badge.name}}"
|
|
||||||
class="user-badge {{badge.badgeTypeClassName}}"
|
|
||||||
title={{badge.display_name}}
|
|
||||||
data-badge-name={{badge.name}}
|
|
||||||
>
|
|
||||||
{{icon-or-image badge.icon}}
|
|
||||||
<span class="badge-display-name">{{badge.display_name}}</span>
|
|
||||||
</a>
|
|
|
@ -1,5 +0,0 @@
|
||||||
{{#if category}}
|
|
||||||
{{category-link category}}
|
|
||||||
{{else}}
|
|
||||||
<a href="{{baseuri}}/t/{{id}}">{{id}}</a>
|
|
||||||
{{/if}}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{{#if group}}
|
|
||||||
<a href="{{baseuri}}/groups/{{group.name}}">{{group.name}}</a>
|
|
||||||
{{else}}
|
|
||||||
{{id}}
|
|
||||||
{{/if}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{html-safe value}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{reltime value}}
|
|
|
@ -1 +0,0 @@
|
||||||
{{value}}
|
|
|
@ -1,8 +0,0 @@
|
||||||
{{#if topic}}
|
|
||||||
<a href="{{baseuri}}/t/{{topic.slug}}/{{topic.id}}">
|
|
||||||
{{html-safe topic.fancy_title}}
|
|
||||||
</a>
|
|
||||||
({{topic.posts_count}})
|
|
||||||
{{else}}
|
|
||||||
<a href="{{baseuri}}/t/{{id}}">{{id}}</a>
|
|
||||||
{{/if}}
|
|
|
@ -1 +0,0 @@
|
||||||
<a href={{href}}>{{target}}</a>
|
|
|
@ -1,11 +0,0 @@
|
||||||
{{#if user}}
|
|
||||||
<a
|
|
||||||
href="{{baseuri}}/u/{{user.username}}/activity"
|
|
||||||
data-user-card={{user.username}}
|
|
||||||
>
|
|
||||||
{{avatar user imageSize="tiny"}}
|
|
||||||
{{user.username}}
|
|
||||||
</a>
|
|
||||||
{{else}}
|
|
||||||
{{id}}
|
|
||||||
{{/if}}
|
|
Loading…
Reference in New Issue