Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions admin-tools/README.md.liquid
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# {{ name }}

{{ description }}

---

## Get started with this extension

This extension provides search functionality for the Shopify Admin. After installation, your app's search results will appear in Admin search.

### Key files

- `src/index.{{ srcFileExtension }}` - Main extension code that registers the search tool
- `tools.json` - Schema definition for the search tool inputs and outputs

### How it works

1. The extension registers a `search` tool using `shopify.tools.register()`
2. When a user searches in the Admin, your search function is called with the query
3. Your function returns results matching the schema defined in `tools.json`

### Customizing the search

Edit `src/index.{{ srcFileExtension }}` to implement your search logic:

1. Fetch data from your app's backend or API
2. Filter/search the data based on the `query` input
3. Return results in the expected format with pagination info

### Testing locally

Run `shopify app dev` to test your extension in development mode.
4 changes: 4 additions & 0 deletions admin-tools/locales/en.default.json.liquid
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"name": "{{ name }}",
"description": "Search extension for your app"
}
4 changes: 4 additions & 0 deletions admin-tools/locales/fr.json.liquid
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"name": "{{ name }}",
"description": "Extension de recherche pour votre application"
}
9 changes: 9 additions & 0 deletions admin-tools/package.json.liquid
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "{{ handle }}",
"private": true,
"version": "1.0.0",
"license": "UNLICENSED",
"dependencies": {
"@shopify/ui-extensions": "0.0.0-snapshot-20260114193753"
}
}
14 changes: 14 additions & 0 deletions admin-tools/shopify.extension.toml.liquid
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
api_version = "2025-10"

[[extensions]]
# Change the merchant-facing name of the extension in locales/en.default.json
name = "t:name"
handle = "{{ handle }}"
type = "ui_extension"
{% if uid %}uid = "{{ uid }}"{% endif %}
description = "t:description"

[[extensions.targeting]]
module = "./src/index.{{ srcFileExtension }}"
target = "admin.app.tools.data"
tools = "./tools.json"
17 changes: 17 additions & 0 deletions admin-tools/src/index.liquid
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
export default async function extension() {
shopify.tools.register('search', (input) => {
const {query = '', first = 10, after} = input;

// TODO: Implement your search logic here

return {
results: [],
pageInfo: {
hasNextPage: false,
hasPreviousPage: false,
startCursor: null,
endCursor: null,
},
};
});
}
77 changes: 77 additions & 0 deletions admin-tools/tools.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
[
{
"name": "search",
"description": "Search for resources",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Search query string"
},
"after": {
"type": "string",
"description": "Cursor for pagination - returns elements after this cursor"
},
"first": {
"type": "integer",
"description": "Number of results to return (default: 10)"
}
},
"required": []
},
"outputSchema": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique identifier for the result"
},
"type": {
"type": "string",
"description": "The type/category of the result"
},
"url": {
"type": "string",
"description": "URL to view or edit the resource"
},
"title": {
"type": "string",
"description": "Display title for the result"
}
},
"required": ["id", "type"]
}
},
"pageInfo": {
"type": "object",
"properties": {
"hasNextPage": {
"type": "boolean",
"description": "Whether there are more results available"
},
"hasPreviousPage": {
"type": "boolean",
"description": "Whether there are previous results available"
},
"startCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the first item in results"
},
"endCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the last item in results"
}
}
}
}
}
}
]
10 changes: 10 additions & 0 deletions admin-tools/tsconfig.json.liquid
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"compilerOptions": {
"target": "ES2020",
"checkJs": true,
"allowJs": true,
"moduleResolution": "node",
"esModuleInterop": true,
"noEmit": true
}
}
19 changes: 19 additions & 0 deletions templates.json
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,25 @@
],
"minimumCliVersion": "3.85.3"
},
{
"identifier": "app_tools",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you make a PR to update the dev docs to match. The convention is to use _ so this is correct but the docs have admin-tools instead

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"name": "Admin app tools",
"defaultName": "app-tools",
"group": "UI extensions",
"supportLinks": [],
"url": "https://github.com/Shopify/extensions-templates#bf/add-admin-tools-data-template",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is the test link which needs to be updated

Suggested change
"url": "https://github.com/Shopify/extensions-templates#bf/add-admin-tools-data-template",
"url": "https://github.com/Shopify/extensions-templates",

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, I'm leaving this here for removing yet-another-tophatting-step but will remove prior to merge

"type": "ui_extension",
"extensionPoints": [],
"supportedFlavors": [
{
"name": "JavaScript",
"value": "vanilla-js",
"path": "admin-tools"
}
],
"organizationExpFlags": ["d7c1b4ad"],
"minimumCliVersion": "3.85.3"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving as 3.85.3 for tophatting ease, but note that this will not work without CLI 0.0.0-nightly-20260122060923, or 3.90.0 (not yet released).

},
{
"identifier": "admin_print_legacy",
"name": "Admin print action",
Expand Down