Skip to content

Commit 6f8eb62

Browse files
committed
docs(iot-hub): write related items at the contributor's level
Rewrite the Related Items section so it describes what a creator does and sees rather than how the scanner works, and fix three reader-facing errors. - Missing widgets on a package replace render as the same red error, not a warning; only the title changes. "Warning" names a different state in the same panel (package unreadable / marketplace unreachable). - The pre-upload checklist told contributors to search the dashboard export for typeFullFqn, contradicting the scan's actual scope; it now says every .json file in the package. - Standardise on Published for the live version status, matching the Status column in the Creator Portal. Corrects the status tables in all six contribution guides, which called it Approved. Also drop implementation detail with no reader consequence (request batching, what is retained when a scan fails), rewrite the system. prefix aside as an instruction not to hand-edit typeFullFqn, replace internal component names (version drawer, stepper) with the labels shown on screen, un-wrap the platform's scan steps from <Steps> which elsewhere marks reader actions, and reduce the "widgets are derived automatically" fact from four restatements to one canonical section plus cross-references.
1 parent 9308591 commit 6f8eb62

6 files changed

Lines changed: 18 additions & 22 deletions

File tree

src/content/docs/docs/iot-hub/contribution-guides/alarm-rule.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ To see the current status of your submission, open the Creator Portal and go to
320320
| Status | Meaning |
321321
|---|---|
322322
| **Pending Review** | Your version is in the review queue and has not been evaluated yet |
323-
| **Approved** | Your version passed review and is now live on IoT Hub |
323+
| **Published** | Your version passed review and is now live on IoT Hub |
324324
| **Rejected** | Your version did not pass review — see the reviewer comment for details |
325325

326326
### What Reviewers Check

src/content/docs/docs/iot-hub/contribution-guides/calculated-field.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ To see the current status of your submission, open the Creator Portal and go to
282282
| Status | Meaning |
283283
|---|---|
284284
| **Pending Review** | Your version is in the review queue and has not been evaluated yet |
285-
| **Approved** | Your version passed review and is now live on IoT Hub |
285+
| **Published** | Your version passed review and is now live on IoT Hub |
286286
| **Rejected** | Your version did not pass review — see the reviewer comment for details |
287287

288288
### What Reviewers Check

src/content/docs/docs/iot-hub/contribution-guides/device.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1212,7 +1212,7 @@ To see the current status of your submission, open the Creator Portal and go to
12121212
| Status | Meaning |
12131213
|---|---|
12141214
| **Pending Review** | Your version is in the review queue and has not been evaluated yet |
1215-
| **Approved** | Your version passed review and is now live on IoT Hub |
1215+
| **Published** | Your version passed review and is now live on IoT Hub |
12161216
| **Rejected** | Your version did not pass review — see the reviewer comment for details |
12171217

12181218
### What Reviewers Check

src/content/docs/docs/iot-hub/contribution-guides/rule-chain.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ To see the current status of your submission, open the Creator Portal and go to
436436
| Status | Meaning |
437437
|---|---|
438438
| **Pending Review** | Your version is in the review queue and has not been evaluated yet |
439-
| **Approved** | Your version passed review and is now live on IoT Hub |
439+
| **Published** | Your version passed review and is now live on IoT Hub |
440440
| **Rejected** | Your version did not pass review — see the reviewer comment for details |
441441

442442
### What Reviewers Check

src/content/docs/docs/iot-hub/contribution-guides/solution-template.mdx

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,13 @@ Create a free **Creator account** on the <a href="https://iot-hub.thingsboard.io
2424
When a user clicks **Install** on your solution template in IoT Hub:
2525

2626
1. They review the **description** (from `description.md`) and preview gallery (from `imageUrls` in `solution.json`).
27-
2. They confirm installation — the platform atomically provisions every entity in your template:
27+
2. They confirm installation — the platform atomically provisions every entity in your template, along with any IoT Hub widget the dashboards use (see **[Related items](#related-items)**), in this order:
2828
- Device profiles, asset profiles, rule chains, calculated fields (first, so references resolve)
2929
- Devices, assets, customers, dashboards (next, referencing the profiles)
3030
- Device emulators (last, seeded with telemetry)
3131
3. They are redirected to the **main dashboard** with live data already flowing.
3232
4. The **post-install instructions** (from `instructions.md`) are shown alongside the dashboard — telling them how to inspect the setup, connect real hardware, customize widgets, and so on.
3333

34-
Any IoT Hub widget your dashboards use is installed along with the template — see **[Related items](#related-items)**.
35-
3634
Your job as a creator is to describe the complete solution declaratively in the archive so that a single installation produces a working end-to-end demo.
3735

3836
## Quick Start
@@ -433,17 +431,15 @@ The `entityNameFilter` must exactly match a device `name` from `entities/devices
433431

434432
Dashboards in a solution template often use widgets that do not ship with ThingsBoard — **IoT Hub widgets** published by you or by another contributor. IoT Hub derives those dependencies from your package and stores them on the version as **related items**, so they install together with the template.
435433

436-
In the upload wizard and in the version drawer, this step (and the corresponding tab) is called **Required items**.
434+
In the upload wizard and on the **Versions** page, this step (and the corresponding tab) is called **Required items**.
437435

438436
### How the Check Works
439437

440438
When you upload the ZIP, IoT Hub scans the archive:
441439

442-
<Steps>
443440
1. It collects every `typeFullFqn` value found in **any** `.json` file in the package — not only the files under `dashboards/`. `typeFullFqn` is the key a ThingsBoard export writes a widget type reference under, so a reference sitting in a rule chain export or in `entities/dashboards.json` is picked up the same way.
444441
2. It drops every FQN starting with `system.` — those widgets ship with ThingsBoard, exist on every instance, and are never a marketplace dependency.
445-
3. It looks the remaining FQNs up in the IoT Hub catalog in a single request. A dashboard export scopes a widget type by its owner (`tenant.john_doe.air_quality_card`) while IoT Hub stores the bare FQN (`john_doe.air_quality_card`), so both readings are tried.
446-
</Steps>
442+
3. It looks the remaining FQNs up in the IoT Hub catalog. A dashboard export scopes a widget type by its owner (`tenant.john_doe.air_quality_card`) while IoT Hub stores the bare FQN (`john_doe.air_quality_card`), so both readings are tried.
447443

448444
Every FQN that resolves to a published IoT Hub widget is recorded as a related item of this template version. Every FQN that does not resolve is reported as a missing widget.
449445

@@ -452,7 +448,7 @@ You never declare related items yourself. There is no field for them in `solutio
452448
</Aside>
453449

454450
<Aside type="caution">
455-
The system-widget test is a spelling test on the FQN, not a lookup against the widget bundles. An FQN hand-edited to start with `system.` is accepted silently and installs as a broken widget.
451+
When you rewrite a dashboard export, leave every `typeFullFqn` value exactly as ThingsBoard wrote it. IoT Hub treats any FQN beginning with `system.` as a widget that ships with ThingsBoard without checking further, so a hand-edited value is accepted silently and installs as a broken widget.
456452
</Aside>
457453

458454
### If an FQN Does Not Resolve
@@ -461,18 +457,18 @@ The **Required items** step lists the unresolved FQNs and explains that the dash
461457

462458
| Where | Behavior |
463459
|---|---|
464-
| Create item / add version wizard | The step is invalid: the stepper will not advance and the version cannot be created until every FQN resolves |
465-
| Replacing the package on an existing version | The new package is saved with the dependencies actually detected and the missing widgets show up as a warning — **submitting for review is not blocked** |
460+
| Create item / add version wizard | The step is invalid: the wizard will not let you continue, and the version cannot be created until every FQN resolves |
461+
| Replacing the package on an existing version | The new package is saved with the dependencies actually detected, and the missing widgets show up as the same red error — reworded from **cannot continue** to **publish these before submitting**. Submitting for review is not blocked |
466462

467-
Treat the wizard as a guard rather than a guarantee: a version whose package was replaced can reach review with unresolved widgets, so fix them before you submit. A scan that fails outright — an unreadable archive, or the catalog not answering — does not block anything either; IoT Hub says which of the two happened and keeps the previous dependency list instead of replacing it with an empty one.
463+
Treat the wizard as a guard rather than a guarantee: a version whose package was replaced can reach review with unresolved widgets, so fix them before you submit. And if IoT Hub reports **Could not read the package** or **Could not check the marketplace**, the check did not run at all — that does not block you either, so upload the package again and confirm the widget list before you submit.
468464

469465
There are three ways to resolve a missing widget:
470466

471-
- **Publish the widget to IoT Hub first.** Upload it as a separate IoT Hub item and wait for its version to be **approved** a version still pending review does not resolve the FQN. See the <a href="/docs/iot-hub/contribution-guides/widget/" target="_blank" rel="noopener noreferrer"><strong>IoT Widget Contribution Guide</strong></a>. Then re-upload the template ZIP.
467+
- **Publish the widget to IoT Hub first.** Upload it as a separate IoT Hub item and wait for review to complete — its version must reach **Published**; a version still pending review does not resolve the FQN. See the <a href="/docs/iot-hub/contribution-guides/widget/" target="_blank" rel="noopener noreferrer"><strong>IoT Widget Contribution Guide</strong></a>. Then re-upload the template ZIP.
472468
- **Swap it for a system widget.** Rebuild that part of the dashboard with a widget bundled with ThingsBoard and re-export the dashboard.
473469
- **Remove the widget from the dashboard** and re-export the dashboard.
474470

475-
Any published IoT Hub widget resolves — it does not have to be one of your own. The one exception is a widget whose creator has since been suspended: it stops resolving even though its version is still approved.
471+
Any published IoT Hub widget resolves — it does not have to be one of your own.
476472

477473
### What Gets Installed
478474

@@ -652,7 +648,7 @@ These placeholders are resolved at install time:
652648
| `${MAIN_DASHBOARD_URL}` | Deep link to the solution's main dashboard |
653649
| `${DOCKER_CONFIG}` | Full `docker-compose.yml` content for the gateway, pre-filled with host, port, and token. Usually wrapped in a `bash` code block |
654650
| `${DOCS_BASE_URL}` | Base URL of the ThingsBoard documentation — use for links that should work on both ThingsBoard Cloud and on-prem |
655-
| `${item-link:<item-uuid>}` | Renders a link card pointing at another IoT Hub item the user can install in one click. Use for dependencies the platform cannot derive from your package — widgets are handled automatically, see **[Related items](#related-items)** |
651+
| `${item-link:<item-uuid>}` | Renders a link card pointing at another IoT Hub item. Use for dependencies IoT Hub cannot derive from your package — see **[Related items](#related-items)** |
656652

657653
### Code Block Tags
658654

@@ -679,7 +675,7 @@ A good `instructions.md` follows this flow:
679675
${item-link:d93b9a1a-1c07-408c-bb86-743bbcb36832}
680676
```
681677

682-
Widgets are the exception: the widgets your dashboards use are detected and installed automatically as **[related items](#related-items)**, so they need no `${item-link}` card.
678+
Widgets are the exception — they need no `${item-link}` card. See **[Related items](#related-items)**.
683679

684680
3. **Launch the emulator** — copy-paste Docker commands.
685681
4. **Launch the gateway** — use `${DOCKER_CONFIG}` to give them a ready-to-run config.
@@ -768,7 +764,7 @@ Every upload creates a new version of your template. Bump the version in the upl
768764
- [ ] No hardcoded UUIDs remain in any `singleEntity.id` or similar references
769765
- [ ] Dashboard titles match the names in `entities/dashboards.json`
770766
- [ ] Every widget displays data from a telemetry key that an emulator actually produces — nothing should be empty after installation
771-
- [ ] Every widget that does not ship with ThingsBoard is already published to IoT Hub with an **approved** version, so its `typeFullFqn` resolves as a **[related item](#related-items)** — search the dashboard export for `typeFullFqn` to enumerate them
767+
- [ ] Every widget that does not ship with ThingsBoard is already uploaded to IoT Hub with a **Published** version, so its `typeFullFqn` resolves as a **[related item](#related-items)** — search every `.json` file in the package for `typeFullFqn` to enumerate them
772768

773769
### Device Profiles and Asset Profiles
774770

@@ -802,7 +798,7 @@ To see the current status of your submission, open the Creator Portal and go to
802798
| Status | Meaning |
803799
|---|---|
804800
| **Pending Review** | Your version is in the review queue and has not been evaluated yet |
805-
| **Approved** | Your version passed review and is now live on IoT Hub |
801+
| **Published** | Your version passed review and is now live on IoT Hub |
806802
| **Rejected** | Your version did not pass review — see the reviewer comment for details |
807803

808804
### What Reviewers Check

src/content/docs/docs/iot-hub/contribution-guides/widget.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ To see the current status of your submission, open the Creator Portal and go to
310310
| Status | Meaning |
311311
|---|---|
312312
| **Pending Review** | Your version is in the review queue and has not been evaluated yet |
313-
| **Approved** | Your version passed review and is now live on IoT Hub |
313+
| **Published** | Your version passed review and is now live on IoT Hub |
314314
| **Rejected** | Your version did not pass review — see the reviewer comment for details |
315315

316316
### What Reviewers Check

0 commit comments

Comments
 (0)