# Widget attribute clarifications

**URL:** <https://meta.discourse.org/t/widget-attribute-clarifications/82870>\
**Category:** Development\
**Created:** [March 13, 2018, 3:55am UTC](https://meta.discourse.org/t/widget-attribute-clarifications/82870 "2018-03-13T03:55:21Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![tshenry](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tshenry/32/119495_2.png) [@tshenry](https://meta.discourse.org/u/tshenry)\
**Post date:** [March 13, 2018, 3:55am UTC](https://meta.discourse.org/t/widget-attribute-clarifications/82870/1 "2018-03-13T03:55:21Z")

</div>

As I have been continuing down the rabbit-hole that is Discourse dev, I came to something that I could use some clarification on if possible. I could be missing something extremely obvious, but here’s where I need some help:

If I print out `Object.keys(attrs)` in a `createWidget()`, I get a list like:

`id,username,avatar_template,post_count,primary_group_name,primary_group_flair_url,primary_group_flair_color,primary_group_flair_bg_color,topic`

I have a few questions:

1. **How are widget attributes established?** It seems like each `createWidget()` has its own set of attributes and I’m having trouble tracking down where they come from and how they are determined.

2. **How do I get an attribute that isn’t a part of a widget’s `attrs` by default?** For example, in the above list, how would I add `trust_level` to that attribute object?

3. **Can the addition of an attribute be done in the context of a theme component or would it require a proper plugin or modifying core Discourse?**

I can provide more details on the exact scenario that prompted these questions if that helps. I just wanted to keep it brief if I can.

Also worth mentioning, I’ve read the “Rendering Attributes” section of [A tour of how the Widget (Virtual DOM) code in Discourse works](https://meta.discourse.org/t/a-tour-of-how-the-widget-virtual-dom-code-in-discourse-works/40347) and still haven’t quite found the answers for my specific scenario.

---

<div class="post-metadata">

**Author:** ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)\
**Post date:** [March 13, 2018, 4:27am UTC](https://meta.discourse.org/t/widget-attribute-clarifications/82870/2 "2018-03-13T04:27:00Z")

</div>

Sure @eviltrout can assist on this perhaps tomorrow?

---

<div class="post-metadata">

**Author:** ![eviltrout](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/eviltrout/32/5275_2.png) [@eviltrout](https://meta.discourse.org/u/eviltrout)\
**Post date:** [March 13, 2018, 6:32pm UTC](https://meta.discourse.org/t/widget-attribute-clarifications/82870/3 "2018-03-13T18:32:08Z")

</div>

> [@tshenry](#):
>
> How are widget attributes established? It seems like each createWidget() has its own set of attributes and I’m having trouble tracking down where they come from and how they are determined.

There is no standard set of attributes because each widget is different. You’re most likely looking at the topic rendering, where each post receives a series of attributes. The basic post attributes are [created here](https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/lib/transform-post.js.es6#L24).

In some sub-widgets, you’ll find fewer or different attributes are passed in. You have to review the widget code to see what attributes are passed.

> [@tshenry](#):
>
> How do I get an attribute that isn’t a part of a widget’s attrs by default? For example, in the above list, how would I add trust\_level to that attribute object?

Your plugin would have to add that attribute to one of the serializers used to generate attributes. It’s probably going to go into the [post serializer](https://github.com/discourse/discourse/blob/master/app/serializers/post_serializer.rb). You should have access to it via `attrs.post.get('trust_level')` at that point.

> [@tshenry](#):
>
> Can the addition of an attribute be done in the context of a theme component or would it require a proper plugin or modifying core Discourse?

You need to a proper plugin to add an attribute to a serializer.

---

<div class="post-metadata">

**Author:** ![tshenry](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tshenry/32/119495_2.png) [@tshenry](https://meta.discourse.org/u/tshenry)\
**Post date:** [March 13, 2018, 7:09pm UTC](https://meta.discourse.org/t/widget-attribute-clarifications/82870/4 "2018-03-13T19:09:04Z")

</div>

Thanks @eviltrout! That was exactly the info I was looking for. I really appreciate you taking the time to explain.
