MetaEdit for Obsidian
Features
- Add or update Yaml properties and Dataview fields easily
- Ignore properties to hide them from the menu
- Auto Properties that have customizable, pre-defined values selectable through a suggester
- Multi-Value Mode that allows you to detect and vectorize/create arrays from your values
- Progress Properties that automatically update properties/fields
- Works with total task, completed task, and incomplete task counts. Mark a task as completed (from anywhere), and the file will be updated with the new count.
- Transform properties between YAML and Dataview
- Delete properties easily
- Auto update properties in files linked to from Kanban boards on lane change
- Edit metadata through a filemenu
- Edit last value in tags - works with Obsidian Tracker, too.
- API to use in other plugins and Templater templates.
Installation
This plugin is in the community plugin browser in Obsidian. Search for MetaEdit and you can install it from there.
Manual Installation
- Go to Releases and download the ZIP file from the latest release.
- This ZIP file should be extracted in your Obsidian plugins folder. If you don't know where that is, you can go to
Community Plugins
inside Obsidian. There is a folder icon on the right ofInstalled Plugins
. Click that and it opens your plugins folder. - Extract the contents of the ZIP file there.
- Now you should have a folder in plugins called 'metaedit' containing a
main.js
file,manifest.json
file, and astyles.css
file.
LQtNcywPB3.mp4
Guides
Kanban Helper Guide
omBaAmeyJQ.mp4
API
You can access the API by using app.plugins.plugins["metaedit"].api
.
I recommend destructuring the API, like so:
const {autoprop} = this.app.plugins.plugins["metaedit"].api;
autoprop(propertyName: string)
Takes a string containing a property name. Looks for the property in user settings and will open a suggester with possible values for that property.
Returns the selected value. If no value was selected, or if the property was not found in settings, it returns null
.
This is an asynchronous function, so you should await
it.
update(propertyName: string, propertyValue: string, file: TFile | string)
Updates a property with the given name to the given value in the given file.
If the file is a string, it should be the file path. Otherwise, a TFile
is fine.
This is an asynchronous function, so you should await
it.
getPropertyValue(propertyName: string, file: TFile | string)
Gets the value of the given property in the given file.
If the file is a string, it should be the file path. Otherwise, a TFile
is fine.
This is an asynchronous function, so you should await
it.
API Examples
Templater)
New Task template (requires<%*
const {autoprop} = this.app.plugins.plugins["metaedit"].api;
_%>
#tasks
Complete:: 0
Project::
Status:: <% await autoprop("Status") %>
Priority:: <% await autoprop("Priority") %>
Due Date::
Complete:: 0
Energy::
Estimated Time::
Total:: 1
Complete:: 0
Incomplete:: 1
---
- [ ] <% tp.file.cursor() %>
Complete Task in Dataview Table (Buttons version)
Requires Dataview and Buttons.
```dataviewjs
const {update} = this.app.plugins.plugins["metaedit"].api
const {createButton} = app.plugins.plugins["buttons"]
dv.table(["Name", "Status", "Project", "Due Date", ""], dv.pages("#tasks")
.sort(t => t["due-date"], 'desc')
.where(t => t.status != "Completed")
.map(t => [t.file.link, t.status, t.project, t["due-date"],
createButton({app, el: this.container, args: {name: "Done!"}, clickOverride: {click: update, params: ['Status', 'Completed', t.file.path]}})])
)
```
Complete Task in Dataview Table (HTML buttons version)
Requires Dataview.
```dataviewjs
const {update} = this.app.plugins.plugins["metaedit"].api;
const buttonMaker = (pn, pv, fpath) => {
const btn = this.container.createEl('button', {"text": "Done!"});
const file = this.app.vault.getAbstractFileByPath(fpath)
btn.addEventListener('click', async (evt) => {
evt.preventDefault();
await update(pn, pv, file);
});
return btn;
}
dv.table(["Name", "Status", "Project", "Due Date", ""], dv.pages("#tasks")
.sort(t => t["due-date"], 'desc')
.where(t => t.status != "Completed")
.map(t => [t.file.link, t.status, t.project, t["due-date"],
buttonMaker('Status', 'Completed', t.file.path)])
)
```
Dev Info
Made by Christian B. B. Houmann Discord: Chhrriissyy#6548 Twitter: https://twitter.com/chrisbbh Feel free to @ me if you have any questions.
Also from dev: NoteTweet: Post tweets directly from Obsidian.