diff --git a/docs/configuring.md b/docs/configuring.md index 62b876f7ab..a9d388cf37 100644 --- a/docs/configuring.md +++ b/docs/configuring.md @@ -254,6 +254,7 @@ For more info, see the **[Authentication Docs](/docs/authentication.md)** **`description`** | `string` | _Optional_ | Additional info about an item, which is shown in the tooltip on hover, or visible on large tiles **`url`** | `string` | Required | The URL / location of web address for when the item is clicked **`icon`** | `string` | _Optional_ | The icon for a given item. Can be a font-awesome icon, favicon, remote URL or local URL. See [`item.icon`](#sectionicon-and-sectionitemicon) +**`hidden`** | `boolean` | _Optional_ | If set to `true`, this item will be hidden from the default homepage view. It will still appear in search results, and will remain visible while using the Interactive Edit Mode. Defaults to `false`. **`target`** | `string` | _Optional_ | The opening method for when the item is clicked, either `newtab`, `sametab`, `modal`, `workspace`, `clipboard`, `top` or `parent`. Where `newtab` will open the link in a new tab, `sametab` will open it in the current tab, and `modal` will open a pop-up modal, `workspace` will open in the Workspace view and `clipboard` will copy the URL to system clipboard (but not launch app). Defaults to `newtab` **`hotkey`** | `number` | _Optional_ | Give frequently opened applications a numeric hotkey, between `0 - 9`. You can then just press that key to launch that application. **`tags`** | `string[]` | _Optional_ | A list of tags, which can be used for improved search @@ -283,6 +284,22 @@ For more info, see the **[Authentication Docs](/docs/authentication.md)** **[⬆️ Back to Top](#configuring)** +### Example: Hiding an item from the homepage + +```yaml +sections: +- name: Media + items: + - title: Admin Panel + url: https://example.local/admin + icon: fa fa-tools + hidden: true # hidden from the default homepage, but still searchable + - title: Plex + url: https://plex.local + icon: favicon +``` + + ## `section.widgets` _(optional)_ **Field** | **Type** | **Required**| **Description** diff --git a/docs/development-guides.md b/docs/development-guides.md index ffc6bd75e3..8f506bac4e 100644 --- a/docs/development-guides.md +++ b/docs/development-guides.md @@ -159,6 +159,7 @@ Checklist: - [ ] Update the [Schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.js) with the parameters for your new option - [ ] If required, set a default or fallback value (usually in [`defaults.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/defaults.js)) - [ ] Document the new value in [`configuring.md`](./configuring.md), and if required under the relevant section in the docs + - For example, if adding an item-level flag like `hidden: true`, document its purpose, default, and behavior (e.g., hidden on homepage but still searchable) - [ ] Ensure your changes are backwards compatible, and that nothing breaks if the attribute isn't specified --- diff --git a/docs/searching.md b/docs/searching.md index 6595950cda..7dc4c8844f 100644 --- a/docs/searching.md +++ b/docs/searching.md @@ -4,6 +4,9 @@ One of the primary purposes of Dashy is to allow you to quickly find and launch a given app. To make this as quick as possible, there is no need to touch the mouse, or press a certain key to begin searching - just start typing. Results will be filtered in real-time. No need to worry about case, special characters or small typos, these are taken care of, and your results should appear. +> Note +> Items marked as hidden in your configuration (using `hidden: true`) will not be shown on the homepage by default, but they will still appear in search results. + ## Navigating You can navigate through your items or search results using the keyboard. You can use Tab to cycle through results, and Shift + Tab to go backwards. Or use the arrow keys, , , and . diff --git a/src/components/InteractiveEditor/EditItem.vue b/src/components/InteractiveEditor/EditItem.vue index d8c0be0a70..edd908eb0a 100644 --- a/src/components/InteractiveEditor/EditItem.vue +++ b/src/components/InteractiveEditor/EditItem.vue @@ -240,6 +240,7 @@ export default { return str === 'true'; }; if (newItem.tags) newItem.tags = strToTags(newItem.tags); + if (newItem.hidden !== undefined) newItem.hidden = strToBool(newItem.hidden); if (newItem.statusCheck) newItem.statusCheck = strToBool(newItem.statusCheck); if (newItem.statusCheckAllowInsecure) { newItem.statusCheckAllowInsecure = strToBool(newItem.statusCheckAllowInsecure); diff --git a/src/components/LinkItems/Section.vue b/src/components/LinkItems/Section.vue index f1659ed582..55cafc9945 100644 --- a/src/components/LinkItems/Section.vue +++ b/src/components/LinkItems/Section.vue @@ -128,6 +128,7 @@ export default { widgets: Array, index: Number, isWide: Boolean, + searchTerm: String, }, components: { Collapsable, @@ -178,7 +179,14 @@ export default { }, /* If the sortBy attribute is specified, then return sorted data */ sortedItems() { - const items = [...this.items]; + // Filter out items with hidden: true, unless in edit mode or searching + let items = [...this.items]; + if (!this.isEditMode) { + // Include hidden items only when there's an active search term + if (!this.searchTerm || this.searchTerm.trim() === '') { + items = items.filter(item => !item.hidden); + } + } if (this.appConfig.disableSmartSort) return items; if (this.sortOrder === 'alphabetical') { return this.sortAlphabetically(items); diff --git a/src/utils/ConfigSchema.json b/src/utils/ConfigSchema.json index 92039798ab..e7edd4a0e5 100644 --- a/src/utils/ConfigSchema.json +++ b/src/utils/ConfigSchema.json @@ -955,6 +955,12 @@ "nullable": true, "description": "An icon, either as a font-awesome, simple-icon, selfh.st, or mdi identifier, emoji, favicon, generative or the URL/path to a local or remote icon asset" }, + "hidden": { + "title": "Hidden from Homepage", + "type": "boolean", + "default": false, + "description": "If true, this item will be hidden from the homepage/dashboard but still searchable." + }, "url": { "title": "Service URL", "type": "string",