From 203c067d8d8570727af4b09d698b39e98376a944 Mon Sep 17 00:00:00 2001 From: Lost Paul <70213368+LostPaul@users.noreply.github.com> Date: Wed, 28 Jun 2023 23:01:13 +0200 Subject: [PATCH] Folder overview list --- package-lock.json | 423 ++++++++++----------- src/commands.ts | 7 +- src/events/handleClick.ts | 2 +- src/events/handleRename.ts | 2 +- src/folderOverview.ts | 142 ++++--- src/functions/ListComponent.ts | 77 ++++ src/{ => functions}/folderNoteFunctions.ts | 12 +- src/globals.d.ts | 17 +- src/main.ts | 22 +- src/modals/confirmCreation.ts | 2 +- src/modals/deleteConfirmation.ts | 2 +- src/modals/existingNote.ts | 2 +- src/modals/folderOverview.ts | 171 +++++++++ src/settings.ts | 12 +- styles.css | 17 +- 15 files changed, 607 insertions(+), 303 deletions(-) create mode 100644 src/functions/ListComponent.ts rename src/{ => functions}/folderNoteFunctions.ts (95%) create mode 100644 src/modals/folderOverview.ts diff --git a/package-lock.json b/package-lock.json index 65452c5..fe61971 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "1.0.1", "license": "GPL-3.0-or-later", "dependencies": { - "@popperjs/core": "^2.11.6" + "@popperjs/core": "^2.11.6", + "front-matter-plugin-api-provider": "^0.1.3-alpha" }, "devDependencies": { "@types/node": "^16.11.6", @@ -23,17 +24,15 @@ } }, "node_modules/@codemirror/state": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.0.tgz", - "integrity": "sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA==", - "dev": true, + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.1.tgz", + "integrity": "sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==", "peer": true }, "node_modules/@codemirror/view": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.9.2.tgz", - "integrity": "sha512-ci0r/v6aKOSlzOs7/STMTYP3jX/+YMq2dAfAJcLIB6uom4ThtrUlzeuS7GTRGNqJJ+qAJR1vGWfXgu4CO/0myQ==", - "dev": true, + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.14.0.tgz", + "integrity": "sha512-I263FPs4In42MNmrdwN2DfmYPFMVMXgT7o/mxdGp4jv5LPs8i0FOxzmxF5yeeQdYSTztb2ZhmPIu0ahveInVTg==", "peer": true, "dependencies": { "@codemirror/state": "^6.1.4", @@ -42,9 +41,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", - "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "peer": true, "dependencies": { @@ -58,9 +57,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", - "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", "dev": true, "peer": true, "engines": { @@ -68,15 +67,15 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", - "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.0", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -92,9 +91,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", + "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", "dev": true, "peer": true, "engines": { @@ -102,9 +101,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "peer": true, "dependencies": { @@ -173,9 +172,9 @@ } }, "node_modules/@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -185,34 +184,31 @@ "version": "0.0.108", "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.108.tgz", "integrity": "sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==", - "dev": true, "dependencies": { "@types/tern": "*" } }, "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/node": { - "version": "16.18.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", - "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==", + "version": "16.18.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.37.tgz", + "integrity": "sha512-ql+4dw4PlPFBP495k8JzUX/oMNRI2Ei4PrMHgj8oT4VhGlYUzF4EYr0qk2fW+XBVGIrq8Zzk13m4cvyXZuv4pA==", "dev": true }, "node_modules/@types/tern": { "version": "0.23.4", "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", - "dev": true, "dependencies": { "@types/estree": "*" } @@ -402,9 +398,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", "dev": true, "peer": true, "bin": { @@ -1012,17 +1008,17 @@ } }, "node_modules/eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", + "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", "dev": true, "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.43.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -1031,9 +1027,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1041,13 +1037,12 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -1110,18 +1105,21 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "peer": true, "dependencies": { @@ -1130,6 +1128,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { @@ -1142,29 +1143,16 @@ "node": ">=4.0" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "peer": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "peer": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1259,6 +1247,18 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -1345,6 +1345,14 @@ "dev": true, "peer": true }, + "node_modules/front-matter-plugin-api-provider": { + "version": "0.1.3-alpha", + "resolved": "https://registry.npmjs.org/front-matter-plugin-api-provider/-/front-matter-plugin-api-provider-0.1.3-alpha.tgz", + "integrity": "sha512-N7pd25mNfDWCFqV4fqy3vaGK8+oUQEH84Yq7VWbX8zj1YQSLMjZDGw6rWaB3HZe29q+RKfkm3tTIka8GHmqJ4A==", + "dependencies": { + "obsidian": "^1.2.8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1380,15 +1388,16 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "peer": true, "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/globals": { @@ -1427,10 +1436,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "peer": true }, @@ -1545,17 +1554,6 @@ "dev": true, "peer": true }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1671,7 +1669,6 @@ "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "dev": true, "engines": { "node": "*" } @@ -1690,10 +1687,9 @@ "peer": true }, "node_modules/obsidian": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.1.1.tgz", - "integrity": "sha512-GcxhsHNkPEkwHEjeyitfYNBcQuYGeAHFs1pEpZIv0CnzSfui8p8bPLm2YKLgcg20B764770B1sYGtxCvk9ptxg==", - "dev": true, + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.2.8.tgz", + "integrity": "sha512-HrC+feA8o0tXspj4lEAqxb1btwLwHD2oHXSwbbN+CdRHURqbCkuIDLld+nkuyJ1w1c9uvVDRVk8BoeOnWheOrQ==", "dependencies": { "@types/codemirror": "0.0.108", "moment": "2.29.4" @@ -1939,9 +1935,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2012,10 +2008,9 @@ } }, "node_modules/style-mod": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", - "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==", - "dev": true, + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.3.tgz", + "integrity": "sha512-78Jv8kYJdjbvRwwijtCevYADfsI0lGzYJe4mMFdceO8l75DFFDoqBhR1jVDicDRRaX4//g1u9wKeo+ztc2h1Rw==", "peer": true }, "node_modules/supports-color": { @@ -2127,10 +2122,9 @@ } }, "node_modules/w3c-keyname": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", - "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==", - "dev": true, + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "peer": true }, "node_modules/which": { @@ -2188,17 +2182,15 @@ }, "dependencies": { "@codemirror/state": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.0.tgz", - "integrity": "sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA==", - "dev": true, + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.1.tgz", + "integrity": "sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==", "peer": true }, "@codemirror/view": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.9.2.tgz", - "integrity": "sha512-ci0r/v6aKOSlzOs7/STMTYP3jX/+YMq2dAfAJcLIB6uom4ThtrUlzeuS7GTRGNqJJ+qAJR1vGWfXgu4CO/0myQ==", - "dev": true, + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.14.0.tgz", + "integrity": "sha512-I263FPs4In42MNmrdwN2DfmYPFMVMXgT7o/mxdGp4jv5LPs8i0FOxzmxF5yeeQdYSTztb2ZhmPIu0ahveInVTg==", "peer": true, "requires": { "@codemirror/state": "^6.1.4", @@ -2207,9 +2199,9 @@ } }, "@eslint-community/eslint-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", - "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "peer": true, "requires": { @@ -2217,22 +2209,22 @@ } }, "@eslint-community/regexpp": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", - "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", "dev": true, "peer": true }, "@eslint/eslintrc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", - "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "peer": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.0", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -2242,16 +2234,16 @@ } }, "@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", + "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", "dev": true, "peer": true }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "peer": true, "requires": { @@ -2301,42 +2293,39 @@ } }, "@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" }, "@types/codemirror": { "version": "0.0.108", "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.108.tgz", "integrity": "sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==", - "dev": true, "requires": { "@types/tern": "*" } }, "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "@types/node": { - "version": "16.18.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", - "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==", + "version": "16.18.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.37.tgz", + "integrity": "sha512-ql+4dw4PlPFBP495k8JzUX/oMNRI2Ei4PrMHgj8oT4VhGlYUzF4EYr0qk2fW+XBVGIrq8Zzk13m4cvyXZuv4pA==", "dev": true }, "@types/tern": { "version": "0.23.4", "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", - "dev": true, "requires": { "@types/estree": "*" } @@ -2437,9 +2426,9 @@ } }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", "dev": true, "peer": true }, @@ -2792,17 +2781,17 @@ "peer": true }, "eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", + "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", "dev": true, "peer": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.43.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -2811,9 +2800,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2821,13 +2810,12 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -2841,9 +2829,9 @@ }, "dependencies": { "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "peer": true, "requires": { @@ -2857,16 +2845,6 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "peer": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "peer": true, - "requires": { - "is-glob": "^4.0.3" - } } } }, @@ -2898,21 +2876,21 @@ } }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true }, "espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "peer": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" } }, "esquery": { @@ -2982,6 +2960,17 @@ "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } } }, "fast-json-stable-stringify": { @@ -3055,6 +3044,14 @@ "dev": true, "peer": true }, + "front-matter-plugin-api-provider": { + "version": "0.1.3-alpha", + "resolved": "https://registry.npmjs.org/front-matter-plugin-api-provider/-/front-matter-plugin-api-provider-0.1.3-alpha.tgz", + "integrity": "sha512-N7pd25mNfDWCFqV4fqy3vaGK8+oUQEH84Yq7VWbX8zj1YQSLMjZDGw6rWaB3HZe29q+RKfkm3tTIka8GHmqJ4A==", + "requires": { + "obsidian": "^1.2.8" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3084,12 +3081,13 @@ } }, "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "peer": true, "requires": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" } }, "globals": { @@ -3116,10 +3114,10 @@ "slash": "^3.0.0" } }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "peer": true }, @@ -3207,13 +3205,6 @@ "dev": true, "peer": true }, - "js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true, - "peer": true - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -3304,8 +3295,7 @@ "moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "dev": true + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "ms": { "version": "2.1.2", @@ -3321,10 +3311,9 @@ "peer": true }, "obsidian": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.1.1.tgz", - "integrity": "sha512-GcxhsHNkPEkwHEjeyitfYNBcQuYGeAHFs1pEpZIv0CnzSfui8p8bPLm2YKLgcg20B764770B1sYGtxCvk9ptxg==", - "dev": true, + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.2.8.tgz", + "integrity": "sha512-HrC+feA8o0tXspj4lEAqxb1btwLwHD2oHXSwbbN+CdRHURqbCkuIDLld+nkuyJ1w1c9uvVDRVk8BoeOnWheOrQ==", "requires": { "@types/codemirror": "0.0.108", "moment": "2.29.4" @@ -3477,9 +3466,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -3526,10 +3515,9 @@ "peer": true }, "style-mod": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", - "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==", - "dev": true, + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.3.tgz", + "integrity": "sha512-78Jv8kYJdjbvRwwijtCevYADfsI0lGzYJe4mMFdceO8l75DFFDoqBhR1jVDicDRRaX4//g1u9wKeo+ztc2h1Rw==", "peer": true }, "supports-color": { @@ -3615,10 +3603,9 @@ } }, "w3c-keyname": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", - "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==", - "dev": true, + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "peer": true }, "which": { diff --git a/src/commands.ts b/src/commands.ts index c912294..c7fd834 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -1,6 +1,6 @@ import { App, TFolder, Menu, TAbstractFile, Notice, TFile, Editor, MarkdownView } from 'obsidian'; import FolderNotesPlugin from './main'; -import { getFolderNote, createFolderNote, deleteFolderNote, turnIntoFolderNote, openFolderNote } from './folderNoteFunctions'; +import { getFolderNote, createFolderNote, deleteFolderNote, turnIntoFolderNote, openFolderNote } from './functions/folderNoteFunctions'; import { ExcludedFolder } from './excludedFolder'; export class Commands { plugin: FolderNotesPlugin; @@ -65,14 +65,15 @@ export class Commands { this.plugin.registerEvent(this.app.workspace.on('file-menu', (menu: Menu, file: TAbstractFile) => { if (file instanceof TFile) { const folder = file.parent; + if (folder === null) return; const folderNote = getFolderNote(this.plugin, folder.path); if (folderNote?.path === file.path) { return; } menu.addItem((item) => { item.setTitle('Create folder note') .setIcon('edit') .onClick(async () => { - let newPath = file.parent.path + '/' + file.basename; - if (file.parent.path === '' || file.parent.path === '/') { + let newPath = file.parent?.path + '/' + file.basename; + if (!(file.parent instanceof TFolder) || file.parent.path === '' || file.parent.path === '/') { newPath = file.basename; } if (this.plugin.app.vault.getAbstractFileByPath(newPath)) { diff --git a/src/events/handleClick.ts b/src/events/handleClick.ts index 6f47539..31b640e 100644 --- a/src/events/handleClick.ts +++ b/src/events/handleClick.ts @@ -1,6 +1,6 @@ import { Keymap } from 'obsidian'; import FolderNotesPlugin from 'src/main'; -import { openFolderNote, createFolderNote, getFolderNote } from 'src/folderNoteFunctions'; +import { openFolderNote, createFolderNote, getFolderNote } from 'src/functions/folderNoteFunctions'; import { getExcludedFolder } from 'src/excludedFolder'; export async function handleViewHeaderClick(event: MouseEvent, plugin: FolderNotesPlugin) { if (!(event.target instanceof HTMLElement)) return; diff --git a/src/events/handleRename.ts b/src/events/handleRename.ts index ab4769c..f613c53 100644 --- a/src/events/handleRename.ts +++ b/src/events/handleRename.ts @@ -1,6 +1,6 @@ import { TFile, TFolder, TAbstractFile, Notice } from 'obsidian'; import FolderNotesPlugin from 'src/main'; -import { extractFolderName, getFolderNote } from '../folderNoteFunctions'; +import { extractFolderName, getFolderNote } from '../functions/folderNoteFunctions'; import { getExcludedFolder } from '../excludedFolder'; export function handleFolderRename(file: TFolder, oldPath: string, plugin: FolderNotesPlugin) { const fileName = plugin.settings.folderNoteName.replace('{{folder_name}}', file.name); diff --git a/src/folderOverview.ts b/src/folderOverview.ts index 6d1d78b..fa5a8c3 100644 --- a/src/folderOverview.ts +++ b/src/folderOverview.ts @@ -1,6 +1,16 @@ import { MarkdownPostProcessorContext, parseYaml, TAbstractFile, TFolder, TFile } from 'obsidian'; -import { getFolderNote } from './folderNoteFunctions'; +import { getFolderNote } from './functions/folderNoteFunctions'; import FolderNotesPlugin from './main'; +export type yamlSettings = { + title?: string; + disableTitle?: boolean; + depth?: number; + type?: 'folder' | 'markdown' | 'canvas'; + includeTypes?: string[]; + style?: 'list' | 'grid'; + disableCanvasTag?: boolean; +}; + export function createCanvasOverview() { // console.log('test'); } @@ -9,9 +19,20 @@ export function createOverview(plugin: FolderNotesPlugin, source: string, el: HT // parse source to yaml const yaml = parseYaml(source); const depth = yaml?.depth || 1; - const title = yaml?.title || 'Overview'; - const type: 'folder' | 'markdown' | 'canvas' = yaml?.type.trim() || 'markdown'; - const style: 'list' | 'grid' = yaml?.style || 'grid'; + const title = yaml?.title || plugin.settings.defaultOverview.title || 'Folder overview'; + const disableTitle = yaml?.disableTitle || plugin.settings.defaultOverview.disableTitle || false; + let includeTypes: string[] = yaml?.includeTypes || plugin.settings.defaultOverview.includeTypes || ['folder', 'markdown']; + includeTypes = includeTypes.map((type) => type.toLowerCase()); + const style: 'list' | 'grid' = yaml?.style || 'list'; + const disableCanvasTag = yaml?.disableCanvasTag || plugin.settings.defaultOverview.disableCanvasTag || false; + + const root = el.createEl('div', { cls: 'folder-overview' }); + const titleEl = root.createEl('h1', { cls: 'folder-overview-title' }); + const ul = root.createEl('ul', { cls: 'folder-overview-list' }); + if (!disableTitle) { + titleEl.innerText = title; + } + if (includeTypes.length === 0) { return; } let files: TAbstractFile[] = []; const sourceFile = plugin.app.vault.getAbstractFileByPath(ctx.sourcePath); if (!sourceFile) return; @@ -25,13 +46,6 @@ export function createOverview(plugin: FolderNotesPlugin, source: string, el: HT } files = sourceFolder.children; - if (type === 'folder') { - files = files.filter((file) => file instanceof TFolder); - } else if (type === 'canvas') { - files = files.filter((file) => file instanceof TFolder || file.name.endsWith('.canvas')); - } else if (type === 'markdown') { - files = files.filter((file) => file instanceof TFolder || file.name.endsWith('.md')); - } files = files.filter((file) => { const folderPath = plugin.getFolderPathFromString(file.path); @@ -41,13 +55,11 @@ export function createOverview(plugin: FolderNotesPlugin, source: string, el: HT return true; } }); + if (!includeTypes.includes('folder')) { + files = getAllFiles(files, sourceFolderPath, depth); + } files = sortFiles(files); - - const root = el.createEl('div', { cls: 'folder-overview' }); - const titleEl = root.createEl('h1', { cls: 'folder-overview-title' }); - const ul = root.createEl('ul', { cls: 'folder-overview-list' }); - titleEl.innerText = title; if (style === 'grid') { const grid = root.createEl('div', { cls: 'folder-overview-grid' }); files.forEach((file) => { @@ -61,23 +73,10 @@ export function createOverview(plugin: FolderNotesPlugin, source: string, el: HT const pathBlacklist: string[] = []; files.forEach((file) => { if (file instanceof TFolder) { - const folderItem = ul.createEl('li', { cls: 'folder-overview-list folder-list' }); - const folderNote = getFolderNote(plugin, file.path); - if (folderNote instanceof TFile) { - const folderNoteLink = folderItem.createEl('a', { cls: 'folder-overview-list-item folder-name-item internal-link', href: folderNote.path }); - folderNoteLink.innerText = file.name; - pathBlacklist.push(folderNote.path); - } else { - const folderName = folderItem.createEl('span', { cls: 'folder-overview-list-item folder-name-item' }); - folderName.innerText = file.name; - } - goThroughFolders(plugin, folderItem, file, depth, sourceFolderPath, ctx, yaml, pathBlacklist); + const folderItem = addFolderList(plugin, ul, pathBlacklist, file); + goThroughFolders(plugin, folderItem, file, depth, sourceFolderPath, ctx, yaml, pathBlacklist, includeTypes, disableCanvasTag); } else if (file instanceof TFile) { - if (type === 'canvas' && !file.name.endsWith('.canvas')) return; - if (pathBlacklist.includes(file.path)) return; - const listItem = root.createEl('li', { cls: 'folder-overview-list' }); - const link = listItem.createEl('a', { cls: 'internal-link', href: file.path }); - link.innerText = file.name.replace('.md', '').replace('.canvas', ''); + addFileList(plugin, ul, pathBlacklist, file, includeTypes, disableCanvasTag); } }); } else if (style === 'explorer') { @@ -93,11 +92,13 @@ export function createOverview(plugin: FolderNotesPlugin, source: string, el: HT root.appendChild(folderElement); */ } - removeEmptyFolders(ul); + if (includeTypes.length > 1) { + removeEmptyFolders(ul); + } } -function goThroughFolders(plugin: FolderNotesPlugin, list: HTMLLIElement, folder: TFolder, - depth: number, sourceFolderPath: string, ctx: MarkdownPostProcessorContext, yaml: any = {}, pathBlacklist: string[]) { +function goThroughFolders(plugin: FolderNotesPlugin, list: HTMLLIElement | HTMLUListElement, folder: TFolder, + depth: number, sourceFolderPath: string, ctx: MarkdownPostProcessorContext, yaml: yamlSettings, pathBlacklist: string[], includeTypes: string[], disableCanvasTag: boolean) { let files = folder.children.filter((file) => { const folderPath = plugin.getFolderPathFromString(file.path); if (!folderPath.startsWith(sourceFolderPath)) { return false; } @@ -105,36 +106,14 @@ function goThroughFolders(plugin: FolderNotesPlugin, list: HTMLLIElement, folder return true; } }); - - const type: 'folder' | 'markdown' | 'canvas' = yaml?.type || 'markdown'; - if (type === 'folder') { - files = files.filter((file) => file instanceof TFolder); - } else if (type === 'canvas') { - files = files.filter((file) => file instanceof TFolder || file.name.endsWith('.canvas')); - } else if (type === 'markdown') { - files = files.filter((file) => file instanceof TFolder || file.name.endsWith('.md')); - } files = sortFiles(files); const ul = list.createEl('ul', { cls: 'folder-overview-list' }); files.forEach((file) => { if (file instanceof TFolder) { - const folderItem = ul.createEl('li', { cls: 'folder-overview-list folder-list' }); - const folderNote = getFolderNote(plugin, file.path); - if (folderNote instanceof TFile) { - const folderNoteLink = folderItem.createEl('a', { cls: 'folder-overview-list-item folder-name-item internal-link', href: folderNote.path }); - folderNoteLink.innerText = file.name; - pathBlacklist.push(folderNote.path); - } else { - const folderName = folderItem.createEl('span', { cls: 'folder-overview-list-item folder-name-item' }); - folderName.innerText = file.name; - } - goThroughFolders(plugin, folderItem, file, depth, sourceFolderPath, ctx, yaml, pathBlacklist); + const folderItem = addFolderList(plugin, ul, pathBlacklist, file); + goThroughFolders(plugin, folderItem, file, depth, sourceFolderPath, ctx, yaml, pathBlacklist, includeTypes, disableCanvasTag); } else if (file instanceof TFile) { - if (type === 'canvas' && !file.name.endsWith('.canvas')) return; - if (pathBlacklist.includes(file.path)) return; - const listItem = ul.createEl('li', { cls: 'folder-overview-list' }); - const link = listItem.createEl('a', { cls: 'internal-link', href: file.path }); - link.innerText = file.name.replace('.md', '').replace('.canvas', ''); + addFileList(plugin, ul, pathBlacklist, file, includeTypes, disableCanvasTag); } }); } @@ -174,3 +153,46 @@ function removeEmptyFolders(ul: HTMLUListElement | HTMLLIElement) { el.remove(); }); } + +function addFolderList(plugin: FolderNotesPlugin, list: HTMLUListElement | HTMLLIElement, pathBlacklist: string[], folder: TFolder) { + const folderItem = list.createEl('li', { cls: 'folder-overview-list folder-list' }); + const folderNote = getFolderNote(plugin, folder.path); + if (folderNote instanceof TFile) { + const folderNoteLink = folderItem.createEl('a', { cls: 'folder-overview-list-item folder-name-item internal-link', href: folderNote.path }); + folderNoteLink.innerText = folder.name; + pathBlacklist.push(folderNote.path); + } else { + const folderName = folderItem.createEl('span', { cls: 'folder-overview-list-item folder-name-item' }); + folderName.innerText = folder.name; + } + return folderItem; +} + +function addFileList(plugin: FolderNotesPlugin, list: HTMLUListElement | HTMLLIElement, pathBlacklist: string[], file: TFile, includeTypes: string[], disableCanvasTag: boolean) { + if (includeTypes.length > 0) { + if (file.extension === 'md' && !includeTypes.includes('markdown')) return; + if (file.extension === 'canvas' && !includeTypes.includes('canvas')) return; + } + if (pathBlacklist.includes(file.path)) return; + const listItem = list.createEl('li', { cls: 'folder-overview-list file-link' }); + const nameItem = listItem.createEl('div', { cls: 'folder-overview-list-item' }); + const link = nameItem.createEl('a', { cls: 'internal-link', href: file.path }); + link.innerText = file.name.replace('.md', '').replace('.canvas', ''); + if (file.extension === 'canvas' && !disableCanvasTag) { + nameItem.createDiv({ cls: 'nav-file-tag' }).innerText = 'canvas'; + } +} + +function getAllFiles(files: TAbstractFile[], sourceFolderPath: string, depth: number) { + const allFiles: TAbstractFile[] = []; + files.forEach((file) => { + if (file instanceof TFolder) { + if ((file.path.split('/').length - sourceFolderPath.split('/').length) - 1 < depth -1) { + allFiles.push(...getAllFiles(file.children, sourceFolderPath, depth)); + } + } else { + allFiles.push(file); + } + }); + return allFiles; +} diff --git a/src/functions/ListComponent.ts b/src/functions/ListComponent.ts new file mode 100644 index 0000000..07799a0 --- /dev/null +++ b/src/functions/ListComponent.ts @@ -0,0 +1,77 @@ +import { Setting } from 'obsidian'; +import { FolderOverviewSettings } from '../modals/folderOverview'; +export default class ListComponent { + containerEl: HTMLElement; + controlEl: HTMLElement; + emptyStateEl: HTMLElement; + listEl: HTMLElement; + values: string[]; + modal: FolderOverviewSettings; + constructor(containerEl: HTMLElement) { + this.containerEl = containerEl; + this.controlEl = containerEl.querySelector('.setting-item-control') || containerEl; + this.listEl = this.controlEl.createDiv('setting-command-hotkeys'); + } + addModal(modal: FolderOverviewSettings) { + this.modal = modal; + this.values = modal.yaml.includeTypes || []; + return this; + } + setValues(values: string[]) { + this.listEl.empty(); + this.values = values; + this.modal.yaml.includeTypes = values; + if (values.length !== 0) { + values.forEach((value) => { + this.addElement(value); + }); + } + this.modal.updateYaml(); + return this; + } + addElement(value: string) { + this.listEl.createSpan('setting-hotkey', (span) => { + span.innerText = value; + const removeSpan = span.createEl('span', { cls: 'ofn-list-item-remove setting-hotkey-icon' }); + // add svg icon + const svg = ''; + const svgElement = removeSpan.createEl('span', { cls: 'ofn-list-item-remove-icon' }); + svgElement.innerHTML = svg; + removeSpan.onClickEvent((e) => { + this.removeValue(value); + span.remove(); + }); + }); + } + async addValue(value: string) { + this.values.push(value); + this.addElement(value); + this.modal.yaml.includeTypes = this.values; + return this; + } + addResetButton() { + const resetButton = this.controlEl.createEl('span', { cls: 'clickable-icon setting-restore-hotkey-button' }); + const svg = ''; + resetButton.innerHTML = svg; + resetButton.onClickEvent((e) => { + this.modal.plugin.loadSettings(); + this.setValues(this.modal.plugin.settings.defaultOverview.includeTypes || []); + this.modal.display(); + }); + return this; + } + removeValue(value: string) { + this.values = this.values.filter((v) => v !== value); + this.setValues(this.values); + this.modal.display(); + } +} + +function createList(this: Setting, cb: (list: ListComponent) => ListComponent) { + const list = new ListComponent(this.settingEl); + cb(list); + return list; +} + +// ListComponent.prototype.setValues = setValues; +(Setting as any).prototype.createList = createList; diff --git a/src/folderNoteFunctions.ts b/src/functions/folderNoteFunctions.ts similarity index 95% rename from src/folderNoteFunctions.ts rename to src/functions/folderNoteFunctions.ts index e3d7579..c270da3 100644 --- a/src/folderNoteFunctions.ts +++ b/src/functions/folderNoteFunctions.ts @@ -1,10 +1,10 @@ -import FolderNotesPlugin from './main'; -import FolderNameModal from './modals/folderName'; -import ExistingFolderNoteModal from './modals/existingNote'; -import { applyTemplate } from './template'; +import FolderNotesPlugin from '../main'; +import FolderNameModal from '../modals/folderName'; +import ExistingFolderNoteModal from '../modals/existingNote'; +import { applyTemplate } from '../template'; import { TFolder, TFile, TAbstractFile, Keymap } from 'obsidian'; -import DeleteConfirmationModal from './modals/deleteConfirmation'; -import { addExcludedFolder, deleteExcludedFolder, getExcludedFolder, ExcludedFolder, updateExcludedFolder } from './excludedFolder'; +import DeleteConfirmationModal from '../modals/deleteConfirmation'; +import { addExcludedFolder, deleteExcludedFolder, getExcludedFolder, ExcludedFolder, updateExcludedFolder } from '../excludedFolder'; export async function createFolderNote(plugin: FolderNotesPlugin, folderPath: string, openFile: boolean, useModal?: boolean, existingNote?: TFile) { const leaf = plugin.app.workspace.getLeaf(false); diff --git a/src/globals.d.ts b/src/globals.d.ts index 3b90d46..762ff2a 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -15,11 +15,22 @@ declare module 'obsidian' { interface Vault { getConfig: (config: string) => unknown; } + interface Setting { + createList: (list: ListComponent | ((list: ListComponent) => void)) => ListComponent; + } + + class ListComponent { + containerEl: HTMLElement; + emptyStateEl: HTMLElement; + listEl: HTMLElement; + values: string[]; + constructor(containerEl: HTMLElement); + } } interface FileExplorerWorkspaceLeaf extends WorkspaceLeaf { - containerEl: HTMLElement; - view: FileExplorerView; + containerEl: HTMLElement; + view: FileExplorerView; } interface FileExplorerViewFileItem extends TAbstractFile { @@ -28,5 +39,5 @@ interface FileExplorerViewFileItem extends TAbstractFile { } interface FileExplorerView extends View { - fileItems: { [path: string]: FileExplorerViewFileItem }; + fileItems: { [path: string]: FileExplorerViewFileItem }; } diff --git a/src/main.ts b/src/main.ts index f475994..a778ed2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,13 +1,15 @@ -import { Plugin, TFile, TFolder, TAbstractFile, MarkdownPostProcessorContext } from 'obsidian'; +import { Plugin, TFile, TFolder, TAbstractFile, MarkdownPostProcessorContext, parseYaml } from 'obsidian'; import { DEFAULT_SETTINGS, FolderNotesSettings, SettingsTab } from './settings'; import { Commands } from './commands'; import { FileExplorerWorkspaceLeaf } from './globals'; import { handleViewHeaderClick, handleFolderClick } from './events/handleClick'; import { handleFileRename, handleFolderRename } from './events/handleRename'; -import { createFolderNote, extractFolderName, getFolderNote, getFolder } from './folderNoteFunctions'; +import { createFolderNote, extractFolderName, getFolderNote, getFolder } from './functions/folderNoteFunctions'; import { getExcludedFolder } from './excludedFolder'; // import { FrontMatterTitlePluginHandler } from './events/frontMatterTitle'; import { createOverview as createFolderOverview } from './folderOverview'; +import { FolderOverviewSettings } from './modals/folderOverview'; +import './functions/ListComponent'; export default class FolderNotesPlugin extends Plugin { observer: MutationObserver; settings: FolderNotesSettings; @@ -143,8 +145,22 @@ export default class FolderNotesPlugin extends Plugin { if (!this.settings.syncDelete) { return; } this.app.vault.delete(folderNote); })); - this.registerMarkdownCodeBlockProcessor('folder-overview', (source: string, el: HTMLElement, ctx: MarkdownPostProcessorContext) => { + const observer = new MutationObserver(() => { + const editButton = el.parentElement?.childNodes.item(1); + if (editButton) { + editButton.addEventListener('click', (e) => { + e.stopImmediatePropagation(); + e.preventDefault(); + e.stopPropagation(); + new FolderOverviewSettings(this.app, this, parseYaml(source), ctx, el).open(); + }, { capture: true }); + } + }); + observer.observe(el, { + childList: true, + subtree: true, + }); createFolderOverview(this, source, el, ctx); }); if (this.app.workspace.layoutReady) { diff --git a/src/modals/confirmCreation.ts b/src/modals/confirmCreation.ts index 08ae1b6..5180abc 100644 --- a/src/modals/confirmCreation.ts +++ b/src/modals/confirmCreation.ts @@ -1,6 +1,6 @@ import { App, Modal, Setting, TFolder } from 'obsidian'; import FolderNotesPlugin from '../main'; -import { createFolderNote } from 'src/folderNoteFunctions'; +import { createFolderNote } from 'src/functions/folderNoteFunctions'; export default class ConfirmationModal extends Modal { plugin: FolderNotesPlugin; app: App; diff --git a/src/modals/deleteConfirmation.ts b/src/modals/deleteConfirmation.ts index c76feed..18b427c 100644 --- a/src/modals/deleteConfirmation.ts +++ b/src/modals/deleteConfirmation.ts @@ -1,6 +1,6 @@ import { App, Modal, Setting, TFile, Platform } from 'obsidian'; import FolderNotesPlugin from '../main'; -import { getFolder } from 'src/folderNoteFunctions'; +import { getFolder } from 'src/functions/folderNoteFunctions'; export default class DeleteConfirmationModal extends Modal { plugin: FolderNotesPlugin; app: App; diff --git a/src/modals/existingNote.ts b/src/modals/existingNote.ts index a572c9b..0babd5e 100644 --- a/src/modals/existingNote.ts +++ b/src/modals/existingNote.ts @@ -1,6 +1,6 @@ import { App, Modal, Setting, TFile, Platform, TFolder, TAbstractFile } from 'obsidian'; import FolderNotesPlugin from '../main'; -import { turnIntoFolderNote } from 'src/folderNoteFunctions'; +import { turnIntoFolderNote } from 'src/functions/folderNoteFunctions'; export default class ExistingFolderNoteModal extends Modal { plugin: FolderNotesPlugin; app: App; diff --git a/src/modals/folderOverview.ts b/src/modals/folderOverview.ts new file mode 100644 index 0000000..a7e50af --- /dev/null +++ b/src/modals/folderOverview.ts @@ -0,0 +1,171 @@ +import { App, Modal, Setting, MarkdownPostProcessorContext, stringifyYaml, TFile } from 'obsidian'; +import { yamlSettings } from 'src/folderOverview'; +import FolderNotesPlugin from '../main'; +import ListComponent from 'src/functions/ListComponent'; +export class FolderOverviewSettings extends Modal { + plugin: FolderNotesPlugin; + app: App; + yaml: yamlSettings; + ctx: MarkdownPostProcessorContext; + el: HTMLElement; + constructor(app: App, plugin: FolderNotesPlugin, yaml: yamlSettings, ctx: MarkdownPostProcessorContext, el: HTMLElement) { + super(app); + this.plugin = plugin; + this.app = app; + this.yaml = yaml; + this.ctx = ctx; + this.el = el; + } + onOpen() { + this.display(); + } + display() { + const { contentEl } = this; + contentEl.empty(); + // close when user presses enter + contentEl.addEventListener('keydown', (e) => { + if (e.key === 'Enter') { + this.close(); + } + }); + contentEl.createEl('h2', { text: 'Folder overview settings' }); + new Setting(contentEl) + .setName('Disable the title') + .setDesc('Choose if the title should be shown') + .addToggle((toggle) => + toggle + .setValue(this.yaml.disableTitle || false) + .onChange(async (value) => { + this.yaml.disableTitle = value; + this.display(); + await this.updateYaml(); + }) + ); + if (!this.yaml.disableTitle) { + new Setting(contentEl) + .setName('Title') + .setDesc('Choose the title of the folder overview') + .addText((text) => + text + .setValue(this.yaml?.title || 'Folder overview') + .onChange(async (value) => { + this.yaml.title = value; + await this.updateYaml(); + }) + ); + } + const setting = new Setting(contentEl); + setting.setName('Include types'); + const list = setting.createList((list: ListComponent) => + list + .addModal(this) + .setValues(this.yaml?.includeTypes || this.plugin.settings.defaultOverview.includeTypes || []) + .addResetButton() + ); + if ((this.yaml?.includeTypes?.length || 0) < 3) { + setting.addDropdown((dropdown) => { + if (!this.yaml.includeTypes) this.yaml.includeTypes = this.plugin.settings.defaultOverview.includeTypes || []; + this.yaml.includeTypes = this.yaml.includeTypes.map((type: string) => type.toLowerCase()); + if (!this.yaml.includeTypes.includes('markdown')) { + dropdown.addOption('Markdown', 'Markdown'); + } + if (!this.yaml.includeTypes.includes('folder')) { + dropdown.addOption('Folder', 'Folder'); + } + if (!this.yaml.includeTypes.includes('canvas')) { + dropdown.addOption('Canvas', 'Canvas'); + } + dropdown.addOption('+', '+'); + dropdown.setValue('+'); + dropdown.onChange(async (value) => { + // @ts-ignore + await list.addValue(value.toLowerCase()); + await this.updateYaml(); + this.display(); + }); + }); + } + if (this.yaml.includeTypes?.includes('canvas')) { + new Setting(contentEl) + .setName('Disable canvas tag') + .setDesc('Choose if the canvas tag should be shown') + .addToggle((toggle) => { + toggle + .setValue(this.yaml.disableCanvasTag || this.plugin.settings.defaultOverview.disableCanvasTag || false) + .onChange(async (value) => { + this.yaml.disableCanvasTag = value; + await this.updateYaml(); + }); + }); + } + + new Setting(contentEl) + .setName('File depth') + .setDesc('File & folder = +1 depth') + .addSlider((slider) => + slider + .setValue(this.yaml?.depth || 1) + .setLimits(1, 10, 1) + .onChange(async (value) => { + this.yaml.depth = value; + await this.updateYaml(); + }) + ); + + new Setting(contentEl) + .setName('Overview style') + .setDesc('Choose the style of the overview (grid style soon)') + .addDropdown((dropdown) => + dropdown + .addOption('list', 'List') + .addOption('grid', 'Grid') + .setValue(this.yaml?.style || 'list') + .onChange(async (value: 'list') => { + this.yaml.style = value; + await this.updateYaml(); + }) + ); + + + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } + async updateYaml() { + const file = this.plugin.app.vault.getAbstractFileByPath(this.ctx.sourcePath); + if (!(file instanceof TFile)) return; + let stringYaml = stringifyYaml(this.yaml); + await this.plugin.app.vault.process(file, (text) => { + const info = this.ctx.getSectionInfo(this.el); + // check if stringYaml ends with a newline + if (stringYaml[stringYaml.length - 1] !== '\n') { + stringYaml += '\n'; + } + if (info) { + const { lineStart } = info; + const lineEnd = this.getCodeBlockEndLine(text, lineStart); + if (lineEnd === -1 || !lineEnd) return text; + const lineLength = lineEnd - lineStart; + const lines = text.split('\n'); + lines.splice(lineStart, lineLength + 1, `\`\`\`folder-overview\n${stringYaml}\`\`\``); + return lines.join('\n'); + } + return `\`\`\`folder-overview\n${stringYaml}\`\`\``; + }); + } + getCodeBlockEndLine(text: string, startLine: number, count = 1) { + let line = startLine + 1; + const lines = text.split('\n'); + while (line < lines.length) { + if (count > 20) { return -1; } + if (lines[line].startsWith('```')) { + return line; + } + line++; + count++; + } + return line; + } +} + diff --git a/src/settings.ts b/src/settings.ts index af1d774..4164d04 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,9 +1,10 @@ import { App, Notice, Platform, PluginSettingTab, Setting, TFile, TFolder } from 'obsidian'; import FolderNotesPlugin from './main'; import { TemplateSuggest } from './suggesters/templateSuggester'; -import { extractFolderName, getFolderNote } from './folderNoteFunctions'; +import { extractFolderName, getFolderNote } from './functions/folderNoteFunctions'; import { addExcludeFolderListItem, ExcludedFolder, addExcludedFolder, ExcludePattern, addExcludePatternListItem } from './excludedFolder'; // import ConfirmationModal from "./modals/confirmCreation"; +import { yamlSettings } from './folderOverview'; export interface FolderNotesSettings { syncFolderName: boolean; ctrlKey: boolean; @@ -26,6 +27,7 @@ export interface FolderNotesSettings { disableFolderHighlighting: boolean; storageLocation: 'insideFolder' | 'parentFolder' | 'vaultFolder'; syncDelete: boolean; + defaultOverview: yamlSettings; } export const DEFAULT_SETTINGS: FolderNotesSettings = { @@ -50,6 +52,14 @@ export const DEFAULT_SETTINGS: FolderNotesSettings = { storageLocation: 'insideFolder', syncDelete: false, showRenameConfirmation: true, + defaultOverview: { + title: 'Folder overview', + disableTitle: false, + depth: 3, + includeTypes: ['folder', 'markdown'], + style: 'list', + disableCanvasTag: false, + }, }; export class SettingsTab extends PluginSettingTab { plugin: FolderNotesPlugin; diff --git a/styles.css b/styles.css index be3a885..6e2ef56 100644 --- a/styles.css +++ b/styles.css @@ -40,6 +40,10 @@ display: none; } +.hide-folder .folder-name { + display: none; +} + .nav-folder-collapse-indicator:hover { cursor: pointer; } @@ -106,12 +110,17 @@ } .folder-overview-list { - margin-top : 0; - margin-bottom: 0; - padding-bottom: 1.200; - padding-top: 1.200; + margin-top : 0 !important; + margin-bottom: 0 !important; + padding-bottom: 1.200 !important; + padding-top: 1.200 !important; } +.folder-overview-list-item { + display: flex; +} + + .folder-overview-list::marker { color: var(--text-faint); }