diff --git a/README.md b/README.md index 12b3ae42..745232f2 100644 --- a/README.md +++ b/README.md @@ -205,6 +205,23 @@ const editor = new JSONEditor({ - `onChangeMode(mode: string)`. Invoked when the mode is changed. - `onClassName(path: Path, value: any): string | undefined`. Add a custom class name to specific nodes, based on their path and/or value. +- `onRenderValue(props: RenderValueProps) : RenderValueConstructor[]` + + _EXPERIMENTAL! This API will most likely change in future versions._ + + Customize rendering of the values. By default, `renderValue` is used, which renders a value as an editable div and depending on the value can also render a boolean toggle, a color picker, and a timestamp tag. Multiple components can be rendered alongside each other, like the boolean toggle and color picker being rendered left from the editable div. Built in value renderer components: `EditableValue`, `ReadonlyValue`, `BooleanToggle`, `ColorPicker`, `TimestampTag`, `EnumValue`. + + For JSON Schema enums, there is a value renderer `renderJSONSchemaEnum` which renders enums using the `EnumValue` component. This can be used like: + + ```js + import { renderJSONSchemaEnum, renderValue } from 'svelte-jsoneditor' + + function onRenderValue(props) { + // use the enum renderer, and fallback on the default renderer + return renderJSONSchemaEnum(props, schema, schemaRefs) || renderValue(props) + } + ``` + - `onRenderMenu(mode: string, items: Array) : Array | undefined`. Callback which can be used to make changes to the menu items. New items can be added, or existing items can be removed or reorganized. When the function @@ -341,6 +358,24 @@ type QueryLanguageOptions = { paths?: string[][] } } + +type RenderValueProps = { + path: Path + value: JSON + readOnly: boolean + selection?: Selection + isSelected: boolean + isEditing: boolean + searchResult?: SearchResultItem + onPatch: (patch: JSONPatchDocument, newSelection: Selection | null) => void + onPasteJson: (pastedJson: { path: Path; contents: JSON }) => void + onSelect: (selection: Selection) => void +} + +type RenderValueConstructor = { + component: SvelteComponentConstructor + props: Object +} ``` ## Develop diff --git a/package-lock.json b/package-lock.json index 92bb2a28..705b4587 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,16 +14,16 @@ "ace-builds": "^1.4.13", "ajv": "^8.8.2", "classnames": "^2.3.1", - "diff-sequences": "^27.0.6", + "diff-sequences": "^27.4.0", "immutable-json-patch": "^1.1.2", "jmespath": "^0.15.0", "json-source-map": "^0.6.1", "jsonrepair": "^2.2.1", "lodash-es": "^4.17.21", "natural-compare-lite": "^1.4.0", - "sass": "^1.43.4", + "sass": "^1.44.0", "svelte-awesome": "^2.4.2", - "svelte-select": "^4.4.5", + "svelte-select": "^4.4.6", "svelte-simple-modal": "^1.1.1", "vanilla-picker": "^2.12.1" }, @@ -34,20 +34,20 @@ "@rollup/plugin-json": "4.1.0", "@rollup/plugin-node-resolve": "13.0.6", "@rollup/plugin-typescript": "8.3.0", - "@sveltejs/kit": "1.0.0-next.199", + "@sveltejs/kit": "1.0.0-next.201", "@types/cookie": "0.4.1", "@types/lodash-es": "4.17.5", "@types/mocha": "9.0.0", - "@typescript-eslint/eslint-plugin": "5.4.0", - "@typescript-eslint/parser": "5.4.0", + "@typescript-eslint/eslint-plugin": "5.5.0", + "@typescript-eslint/parser": "5.5.0", "eslint": "8.3.0", "eslint-config-prettier": "8.3.0", "eslint-plugin-svelte3": "3.2.1", "husky": "7.0.4", "mocha": "9.1.3", - "prettier": "2.4.1", + "prettier": "2.5.0", "prettier-plugin-svelte": "2.5.0", - "rollup": "2.59.0", + "rollup": "2.60.2", "rollup-plugin-svelte": "7.1.0", "rollup-plugin-terser": "7.0.2", "standard-version": "9.3.2", @@ -705,9 +705,9 @@ "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==" }, "node_modules/@sveltejs/kit": { - "version": "1.0.0-next.199", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.199.tgz", - "integrity": "sha512-dJGmXUf5zchMvwrCfQfHOwxXOruMQHlL4DhXU5ZtB5ccZtU9OlQBcJU0xoa/mDrF5zndPRJUuVjz2ivdD+1cPw==", + "version": "1.0.0-next.201", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.201.tgz", + "integrity": "sha512-WcYexOEPWgDWOk0oOteTU5QwWykdIcOFJig+akeHqwE/jVtPURLZFtTNx0ymUWXN4S+dUXf60KF6HEMv74FHpA==", "dev": true, "dependencies": { "@sveltejs/vite-plugin-svelte": "^1.0.0-next.30", @@ -877,13 +877,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.4.0.tgz", - "integrity": "sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.5.0.tgz", + "integrity": "sha512-4bV6fulqbuaO9UMXU0Ia0o6z6if+kmMRW8rMRyfqXj/eGrZZRGedS4n0adeGNnjr8LKAM495hrQ7Tea52UWmQA==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "5.4.0", - "@typescript-eslint/scope-manager": "5.4.0", + "@typescript-eslint/experimental-utils": "5.5.0", + "@typescript-eslint/scope-manager": "5.5.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -909,15 +909,15 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.4.0.tgz", - "integrity": "sha512-Nz2JDIQUdmIGd6p33A+naQmwfkU5KVTLb/5lTk+tLVTDacZKoGQisj8UCxk7onJcrgjIvr8xWqkYI+DbI3TfXg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.5.0.tgz", + "integrity": "sha512-kjWeeVU+4lQ1SLYErRKV5yDXbWDPkpbzTUUlfAUifPYvpX0qZlrcCZ96/6oWxt3QxtK5WVhXz+KsnwW9cIW+3A==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.4.0", - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/typescript-estree": "5.4.0", + "@typescript-eslint/scope-manager": "5.5.0", + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/typescript-estree": "5.5.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -933,14 +933,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.4.0.tgz", - "integrity": "sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.5.0.tgz", + "integrity": "sha512-JsXBU+kgQOAgzUn2jPrLA+Rd0Y1dswOlX3hp8MuRO1hQDs6xgHtbCXEiAu7bz5hyVURxbXcA2draasMbNqrhmg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.4.0", - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/typescript-estree": "5.4.0", + "@typescript-eslint/scope-manager": "5.5.0", + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/typescript-estree": "5.5.0", "debug": "^4.3.2" }, "engines": { @@ -960,13 +960,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.4.0.tgz", - "integrity": "sha512-pRxFjYwoi8R+n+sibjgF9iUiAELU9ihPBtHzocyW8v8D8G8KeQvXTsW7+CBYIyTYsmhtNk50QPGLE3vrvhM5KA==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.5.0.tgz", + "integrity": "sha512-0/r656RmRLo7CbN4Mdd+xZyPJ/fPCKhYdU6mnZx+8msAD8nJSP8EyCFkzbd6vNVZzZvWlMYrSNekqGrCBqFQhg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/visitor-keys": "5.4.0" + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/visitor-keys": "5.5.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -977,9 +977,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.4.0.tgz", - "integrity": "sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.5.0.tgz", + "integrity": "sha512-OaYTqkW3GnuHxqsxxJ6KypIKd5Uw7bFiQJZRyNi1jbMJnK3Hc/DR4KwB6KJj6PBRkJJoaNwzMNv9vtTk87JhOg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -990,13 +990,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.4.0.tgz", - "integrity": "sha512-nhlNoBdhKuwiLMx6GrybPT3SFILm5Gij2YBdPEPFlYNFAXUJWX6QRgvi/lwVoadaQEFsizohs6aFRMqsXI2ewA==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.5.0.tgz", + "integrity": "sha512-pVn8btYUiYrjonhMAO0yG8lm7RApzy2L4RC7Td/mC/qFkyf6vRbGyZozoA94+w6D2Y2GRqpMoCWcwx/EUOzyoQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/visitor-keys": "5.4.0", + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/visitor-keys": "5.5.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -1017,12 +1017,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.4.0.tgz", - "integrity": "sha512-PVbax7MeE7tdLfW5SA0fs8NGVVr+buMPrcj+CWYWPXsZCH8qZ1THufDzbXm1xrZ2b2PA1iENJ0sRq5fuUtvsJg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.5.0.tgz", + "integrity": "sha512-4GzJ1kRtsWzHhdM40tv0ZKHNSbkDhF0Woi/TDwVJX6UICwJItvP7ZTXbjTkCdrors7ww0sYe0t+cIKDAJwZ7Kw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/types": "5.5.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -1952,9 +1952,9 @@ } }, "node_modules/diff-sequences": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", - "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", + "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -3289,6 +3289,11 @@ "node": ">= 4" } }, + "node_modules/immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==" + }, "node_modules/immutable-json-patch": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/immutable-json-patch/-/immutable-json-patch-1.1.2.tgz", @@ -4359,9 +4364,9 @@ } }, "node_modules/prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", + "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -4722,9 +4727,9 @@ } }, "node_modules/rollup": { - "version": "2.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.59.0.tgz", - "integrity": "sha512-l7s90JQhCQ6JyZjKgo7Lq1dKh2RxatOM+Jr6a9F7WbS9WgKbocyUSeLmZl8evAse7y96Ae98L2k1cBOwWD8nHw==", + "version": "2.60.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.2.tgz", + "integrity": "sha512-1Bgjpq61sPjgoZzuiDSGvbI1tD91giZABgjCQBKM5aYLnzjq52GoDuWVwT/cm/MCxCMPU8gqQvkj8doQ5C8Oqw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -4872,11 +4877,12 @@ } }, "node_modules/sass": { - "version": "1.43.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.4.tgz", - "integrity": "sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.44.0.tgz", + "integrity": "sha512-0hLREbHFXGQqls/K8X+koeP+ogFRPF4ZqetVB19b7Cst9Er8cOR0rc6RU7MaI4W1JmUShd1BPgPoeqmmgMMYFw==", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0" }, "bin": { "sass": "sass.js" @@ -5384,9 +5390,9 @@ } }, "node_modules/svelte-select": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/svelte-select/-/svelte-select-4.4.5.tgz", - "integrity": "sha512-TvBA5ZHY8ULaiwCgXGpslf/3iSfGOsyGEFDjIUefSnwD6I+rKwoBKfMRAN34G1oaLD/vUHV1lhUWDhMlomTHjQ==" + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/svelte-select/-/svelte-select-4.4.6.tgz", + "integrity": "sha512-AcWNfakmr8dBFH77MSlTskfrYGYP6BRBv/QpPb+59Tag8OQ6/JBXf0r0S0+U18/1JNXtXHJUMaQqRSLfaOtyIA==" }, "node_modules/svelte-simple-modal": { "version": "1.1.1", @@ -6381,9 +6387,9 @@ "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==" }, "@sveltejs/kit": { - "version": "1.0.0-next.199", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.199.tgz", - "integrity": "sha512-dJGmXUf5zchMvwrCfQfHOwxXOruMQHlL4DhXU5ZtB5ccZtU9OlQBcJU0xoa/mDrF5zndPRJUuVjz2ivdD+1cPw==", + "version": "1.0.0-next.201", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.201.tgz", + "integrity": "sha512-WcYexOEPWgDWOk0oOteTU5QwWykdIcOFJig+akeHqwE/jVtPURLZFtTNx0ymUWXN4S+dUXf60KF6HEMv74FHpA==", "dev": true, "requires": { "@sveltejs/vite-plugin-svelte": "^1.0.0-next.30", @@ -6530,13 +6536,13 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.4.0.tgz", - "integrity": "sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.5.0.tgz", + "integrity": "sha512-4bV6fulqbuaO9UMXU0Ia0o6z6if+kmMRW8rMRyfqXj/eGrZZRGedS4n0adeGNnjr8LKAM495hrQ7Tea52UWmQA==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.4.0", - "@typescript-eslint/scope-manager": "5.4.0", + "@typescript-eslint/experimental-utils": "5.5.0", + "@typescript-eslint/scope-manager": "5.5.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -6546,55 +6552,55 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.4.0.tgz", - "integrity": "sha512-Nz2JDIQUdmIGd6p33A+naQmwfkU5KVTLb/5lTk+tLVTDacZKoGQisj8UCxk7onJcrgjIvr8xWqkYI+DbI3TfXg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.5.0.tgz", + "integrity": "sha512-kjWeeVU+4lQ1SLYErRKV5yDXbWDPkpbzTUUlfAUifPYvpX0qZlrcCZ96/6oWxt3QxtK5WVhXz+KsnwW9cIW+3A==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.4.0", - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/typescript-estree": "5.4.0", + "@typescript-eslint/scope-manager": "5.5.0", + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/typescript-estree": "5.5.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.4.0.tgz", - "integrity": "sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.5.0.tgz", + "integrity": "sha512-JsXBU+kgQOAgzUn2jPrLA+Rd0Y1dswOlX3hp8MuRO1hQDs6xgHtbCXEiAu7bz5hyVURxbXcA2draasMbNqrhmg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.4.0", - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/typescript-estree": "5.4.0", + "@typescript-eslint/scope-manager": "5.5.0", + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/typescript-estree": "5.5.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.4.0.tgz", - "integrity": "sha512-pRxFjYwoi8R+n+sibjgF9iUiAELU9ihPBtHzocyW8v8D8G8KeQvXTsW7+CBYIyTYsmhtNk50QPGLE3vrvhM5KA==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.5.0.tgz", + "integrity": "sha512-0/r656RmRLo7CbN4Mdd+xZyPJ/fPCKhYdU6mnZx+8msAD8nJSP8EyCFkzbd6vNVZzZvWlMYrSNekqGrCBqFQhg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/visitor-keys": "5.4.0" + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/visitor-keys": "5.5.0" } }, "@typescript-eslint/types": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.4.0.tgz", - "integrity": "sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.5.0.tgz", + "integrity": "sha512-OaYTqkW3GnuHxqsxxJ6KypIKd5Uw7bFiQJZRyNi1jbMJnK3Hc/DR4KwB6KJj6PBRkJJoaNwzMNv9vtTk87JhOg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.4.0.tgz", - "integrity": "sha512-nhlNoBdhKuwiLMx6GrybPT3SFILm5Gij2YBdPEPFlYNFAXUJWX6QRgvi/lwVoadaQEFsizohs6aFRMqsXI2ewA==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.5.0.tgz", + "integrity": "sha512-pVn8btYUiYrjonhMAO0yG8lm7RApzy2L4RC7Td/mC/qFkyf6vRbGyZozoA94+w6D2Y2GRqpMoCWcwx/EUOzyoQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/visitor-keys": "5.4.0", + "@typescript-eslint/types": "5.5.0", + "@typescript-eslint/visitor-keys": "5.5.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -6603,12 +6609,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.4.0.tgz", - "integrity": "sha512-PVbax7MeE7tdLfW5SA0fs8NGVVr+buMPrcj+CWYWPXsZCH8qZ1THufDzbXm1xrZ2b2PA1iENJ0sRq5fuUtvsJg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.5.0.tgz", + "integrity": "sha512-4GzJ1kRtsWzHhdM40tv0ZKHNSbkDhF0Woi/TDwVJX6UICwJItvP7ZTXbjTkCdrors7ww0sYe0t+cIKDAJwZ7Kw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/types": "5.5.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -7325,9 +7331,9 @@ "dev": true }, "diff-sequences": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", - "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==" + "version": "27.4.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz", + "integrity": "sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==" }, "dir-glob": { "version": "3.0.1", @@ -8286,6 +8292,11 @@ "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", "dev": true }, + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==" + }, "immutable-json-patch": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/immutable-json-patch/-/immutable-json-patch-1.1.2.tgz", @@ -9100,9 +9111,9 @@ "dev": true }, "prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", + "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", "dev": true }, "prettier-plugin-svelte": { @@ -9355,9 +9366,9 @@ } }, "rollup": { - "version": "2.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.59.0.tgz", - "integrity": "sha512-l7s90JQhCQ6JyZjKgo7Lq1dKh2RxatOM+Jr6a9F7WbS9WgKbocyUSeLmZl8evAse7y96Ae98L2k1cBOwWD8nHw==", + "version": "2.60.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.2.tgz", + "integrity": "sha512-1Bgjpq61sPjgoZzuiDSGvbI1tD91giZABgjCQBKM5aYLnzjq52GoDuWVwT/cm/MCxCMPU8gqQvkj8doQ5C8Oqw==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -9461,11 +9472,12 @@ } }, "sass": { - "version": "1.43.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.4.tgz", - "integrity": "sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.44.0.tgz", + "integrity": "sha512-0hLREbHFXGQqls/K8X+koeP+ogFRPF4ZqetVB19b7Cst9Er8cOR0rc6RU7MaI4W1JmUShd1BPgPoeqmmgMMYFw==", "requires": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0" } }, "semver": { @@ -9828,9 +9840,9 @@ } }, "svelte-select": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/svelte-select/-/svelte-select-4.4.5.tgz", - "integrity": "sha512-TvBA5ZHY8ULaiwCgXGpslf/3iSfGOsyGEFDjIUefSnwD6I+rKwoBKfMRAN34G1oaLD/vUHV1lhUWDhMlomTHjQ==" + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/svelte-select/-/svelte-select-4.4.6.tgz", + "integrity": "sha512-AcWNfakmr8dBFH77MSlTskfrYGYP6BRBv/QpPb+59Tag8OQ6/JBXf0r0S0+U18/1JNXtXHJUMaQqRSLfaOtyIA==" }, "svelte-simple-modal": { "version": "1.1.1", diff --git a/package.json b/package.json index f8d9e972..1644056d 100644 --- a/package.json +++ b/package.json @@ -32,16 +32,16 @@ "ace-builds": "^1.4.13", "ajv": "^8.8.2", "classnames": "^2.3.1", - "diff-sequences": "^27.0.6", + "diff-sequences": "^27.4.0", "immutable-json-patch": "^1.1.2", "jmespath": "^0.15.0", "json-source-map": "^0.6.1", "jsonrepair": "^2.2.1", "lodash-es": "^4.17.21", "natural-compare-lite": "^1.4.0", - "sass": "^1.43.4", + "sass": "^1.44.0", "svelte-awesome": "^2.4.2", - "svelte-select": "^4.4.5", + "svelte-select": "^4.4.6", "svelte-simple-modal": "^1.1.1", "vanilla-picker": "^2.12.1" }, @@ -52,20 +52,20 @@ "@rollup/plugin-json": "4.1.0", "@rollup/plugin-node-resolve": "13.0.6", "@rollup/plugin-typescript": "8.3.0", - "@sveltejs/kit": "1.0.0-next.199", + "@sveltejs/kit": "1.0.0-next.201", "@types/cookie": "0.4.1", "@types/lodash-es": "4.17.5", "@types/mocha": "9.0.0", - "@typescript-eslint/eslint-plugin": "5.4.0", - "@typescript-eslint/parser": "5.4.0", + "@typescript-eslint/eslint-plugin": "5.5.0", + "@typescript-eslint/parser": "5.5.0", "eslint": "8.3.0", "eslint-config-prettier": "8.3.0", "eslint-plugin-svelte3": "3.2.1", "husky": "7.0.4", "mocha": "9.1.3", - "prettier": "2.4.1", + "prettier": "2.5.0", "prettier-plugin-svelte": "2.5.0", - "rollup": "2.59.0", + "rollup": "2.60.2", "rollup-plugin-svelte": "7.1.0", "rollup-plugin-terser": "7.0.2", "standard-version": "9.3.2", diff --git a/src/lib/components/JSONEditor.svelte b/src/lib/components/JSONEditor.svelte index b4f1e866..d573a47e 100644 --- a/src/lib/components/JSONEditor.svelte +++ b/src/lib/components/JSONEditor.svelte @@ -11,6 +11,7 @@ import CodeMode from './modes/codemode/CodeMode.svelte' import TreeMode from './modes/treemode/TreeMode.svelte' import { javascriptQueryLanguage } from '../plugins/query/javascriptQueryLanguage.js' + import { renderValue } from '$lib/plugins/value/renderValue' // TODO: document how to enable debugging in the readme: localStorage.debug="jsoneditor:*", then reload const debug = createDebug('jsoneditor:Main') @@ -46,6 +47,9 @@ /** @type {((content: Content, previousContent: Content, patchResult: JSONPatchResult | null) => void) | null} */ export let onChange = null + /** @type {(props: RenderValueProps) => RenderValueConstructor[]} */ + export let onRenderValue = renderValue + export let onClassName = () => { // no op by default } @@ -297,7 +301,6 @@ {readOnly} {indentation} {mainMenuBar} - {navigationBar} {validator} {queryLanguages} {queryLanguageId} @@ -325,6 +328,7 @@ {onError} onChange={handleChange} onRequestRepair={handleRequestRepair} + {onRenderValue} {onClassName} onFocus={handleFocus} onBlur={handleBlur} diff --git a/src/lib/components/modes/treemode/value/EditableDiv.scss b/src/lib/components/controls/EditableDiv.scss similarity index 89% rename from src/lib/components/modes/treemode/value/EditableDiv.scss rename to src/lib/components/controls/EditableDiv.scss index 1ee3070b..381e4fdd 100644 --- a/src/lib/components/modes/treemode/value/EditableDiv.scss +++ b/src/lib/components/controls/EditableDiv.scss @@ -1,5 +1,5 @@ -@import '../../../../styles'; -@import '../shared.scss'; +@import '../../styles'; +@import './EditableDivShared'; // for key and value div.jse-editable-div { @@ -11,6 +11,7 @@ div.jse-editable-div { outline: none; border-radius: 1px; vertical-align: top; + overflow-wrap: anywhere; &[contenteditable='true'] { outline: 2px solid $edit-border-color; diff --git a/src/lib/components/modes/treemode/value/EditableDiv.svelte b/src/lib/components/controls/EditableDiv.svelte similarity index 94% rename from src/lib/components/modes/treemode/value/EditableDiv.svelte rename to src/lib/components/controls/EditableDiv.svelte index dba57b38..ff3f718b 100644 --- a/src/lib/components/modes/treemode/value/EditableDiv.svelte +++ b/src/lib/components/controls/EditableDiv.svelte @@ -4,10 +4,10 @@ import { onDestroy, onMount } from 'svelte' import { getPlainText, setCursorToEnd, setPlainText } from '$lib/utils/domUtils' import { keyComboFromEvent } from '$lib/utils/keyBindings' - import { createDebug } from '../../../../utils/debug' + import { createDebug } from '$lib/utils/debug' import { noop } from 'lodash-es' - const debug = createDebug('jsoneditor:ValueEditor') + const debug = createDebug('jsoneditor:EditableDiv') export let value export let onChange diff --git a/src/lib/components/modes/treemode/shared.scss b/src/lib/components/controls/EditableDivShared.scss similarity index 93% rename from src/lib/components/modes/treemode/shared.scss rename to src/lib/components/controls/EditableDivShared.scss index 982f96f2..f4141f7b 100644 --- a/src/lib/components/modes/treemode/shared.scss +++ b/src/lib/components/controls/EditableDivShared.scss @@ -1,4 +1,4 @@ -@import '../../../styles'; +@import '../../styles'; .value { &.string { diff --git a/src/lib/components/modals/Header.scss b/src/lib/components/modals/Header.scss index 537cd3de..5dd81129 100644 --- a/src/lib/components/modals/Header.scss +++ b/src/lib/components/modals/Header.scss @@ -11,8 +11,7 @@ vertical-align: middle; } - button.config, - button.close { + button { border: none; background: transparent; min-width: 32px; diff --git a/src/lib/components/modes/treemode/JSONKey.scss b/src/lib/components/modes/treemode/JSONKey.scss index abd91072..b4d2fc97 100644 --- a/src/lib/components/modes/treemode/JSONKey.scss +++ b/src/lib/components/modes/treemode/JSONKey.scss @@ -1,5 +1,4 @@ @import '../../../styles'; -@import 'shared'; .key { display: inline-block; diff --git a/src/lib/components/modes/treemode/JSONKey.svelte b/src/lib/components/modes/treemode/JSONKey.svelte index 1e1922d9..6f930ccf 100644 --- a/src/lib/components/modes/treemode/JSONKey.svelte +++ b/src/lib/components/modes/treemode/JSONKey.svelte @@ -2,10 +2,10 @@ -{#if editValue} - -{:else} - - - {#if isBoolean(value)} - - {/if} - {#if isColor(value)} - - {/if} - -
- {#if searchResult} - - {:else} - {escapeHTML(value)} - {/if} -
- - - {#if isTimestamp(value)} - - {/if} -{/if} - - +{#each renderers as renderer} + +{/each} diff --git a/src/lib/components/modes/treemode/TreeMode.svelte b/src/lib/components/modes/treemode/TreeMode.svelte index 5c203bfb..f958b36e 100644 --- a/src/lib/components/modes/treemode/TreeMode.svelte +++ b/src/lib/components/modes/treemode/TreeMode.svelte @@ -52,6 +52,7 @@ updateSearchResult } from '$lib/logic/search' import { + createRecursiveSelection, createSelection, createSelectionFromOperations, findRootPath, @@ -130,6 +131,9 @@ /** @type {(content: Content, previousContent: Content, patchResult: JSONPatchResult | null) => void} */ export let onChange + + /** @type {(props: RenderValueProps) => RenderValueConstructor[]} */ + export let onRenderValue export let onRequestRepair = () => {} export let onRenderMenu = () => {} @@ -169,6 +173,8 @@ let selection = null + $: recursiveSelection = createRecursiveSelection(json, selection) + let pastedJson function defaultExpand(path) { @@ -1918,20 +1924,21 @@ value={json} path={[]} {state} - {readOnly} + selection={recursiveSelection} searchResult={searchResult && searchResult.itemsWithActive} {validationErrors} + {readOnly} onPatch={handlePatch} onInsert={handleInsert} onExpand={handleExpand} onSelect={handleSelect} onPasteJson={handlePasteJson} onExpandSection={handleExpandSection} + {onRenderValue} onContextMenu={openContextMenu} onClassName={onClassName || noop} onDrag={autoScrollHandler.onDrag} onDragEnd={autoScrollHandler.onDragEnd} - {selection} /> diff --git a/src/lib/constants.js b/src/lib/constants.js index c5849fda..3b06dc49 100644 --- a/src/lib/constants.js +++ b/src/lib/constants.js @@ -9,6 +9,7 @@ export const STATE_VISIBLE_SECTIONS = Symbol('visible sections') export const STATE_KEYS = Symbol('keys') export const STATE_SEARCH_PROPERTY = Symbol('search:property') export const STATE_SEARCH_VALUE = Symbol('search:value') +export const STATE_SELECTION = Symbol('selection') export const VALIDATION_ERROR = Symbol('validation:error') export const SCROLL_DURATION = 300 // ms diff --git a/src/lib/index.js b/src/lib/index.js index d11ed906..2ebb6228 100644 --- a/src/lib/index.js +++ b/src/lib/index.js @@ -1,11 +1,29 @@ import _JSONEditor from './components/JSONEditor.svelte' import _SortModal from './components/modals/SortModal.svelte' import _TransformModal from './components/modals/TransformModal.svelte' +import _BooleanToggle from './plugins/value/components/BooleanToggle.svelte' +import _ColorPicker from './plugins/value/components/ColorPicker.svelte' +import _EditableValue from './plugins/value/components/EditableValue.svelte' +import _EnumValue from './plugins/value/components/EnumValue.svelte' +import _ReadonlyValue from './plugins/value/components/ReadonlyValue.svelte' +import _TimestampTag from './plugins/value/components/TimestampTag.svelte' export const JSONEditor = _JSONEditor -// plugins -export { createAjvValidator } from './plugins/createAjvValidator.js' +// value plugins +export { renderValue } from './plugins/value/renderValue.js' +export { renderJSONSchemaEnum } from './plugins/value/renderJSONSchemaEnum.js' +export const BooleanToggle = _BooleanToggle +export const ColorPicker = _ColorPicker +export const EditableValue = _EditableValue +export const EnumValue = _EnumValue +export const ReadonlyValue = _ReadonlyValue +export const TimestampTag = _TimestampTag + +// validator plugins +export { createAjvValidator } from './plugins/validator/createAjvValidator.js' + +// query plugins export { lodashQueryLanguage } from './plugins/query/lodashQueryLanguage.js' export { javascriptQueryLanguage } from './plugins/query/javascriptQueryLanguage.js' export { jmespathQueryLanguage } from './plugins/query/jmespathQueryLanguage.js' @@ -13,6 +31,7 @@ export { jmespathQueryLanguage } from './plugins/query/jmespathQueryLanguage.js' // utils export const SortModal = _SortModal export const TransformModal = _TransformModal +export { getJSONSchemaOptions, findSchema, findEnum } from './utils/jsonSchemaUtils.js' export { parseJSONPointerWithArrayIndices } from './utils/jsonPointer.js' export { parseJSONPointer, diff --git a/src/lib/logic/selection.js b/src/lib/logic/selection.js index 6806cf03..6f255b33 100644 --- a/src/lib/logic/selection.js +++ b/src/lib/logic/selection.js @@ -1,6 +1,6 @@ -import { compileJSONPointer, getIn, setIn } from 'immutable-json-patch' +import { compileJSONPointer, existsIn, getIn, setIn } from 'immutable-json-patch' import { first, initial, isEmpty, isEqual, last } from 'lodash-es' -import { STATE_EXPANDED, STATE_KEYS } from '../constants.js' +import { STATE_EXPANDED, STATE_KEYS, STATE_SELECTION } from '../constants.js' import { parseJSONPointerWithArrayIndices } from '../utils/jsonPointer.js' import { isObject, isObjectOrArray } from '../utils/typeUtils.js' import { @@ -793,6 +793,38 @@ export function selectionToPartialJson(json, selection, indentation = 2) { return null } +/** + * @param {JSON} referenceJson + * @param {Selection} selection + * @returns {{} | null} + */ +// TODO: write unit tests +export function createRecursiveSelection(referenceJson, selection) { + if (!selection) { + return null + } + + let result = {} + + const paths = selection.type === SELECTION_TYPE.MULTI ? selection.paths : [selection.focusPath] + + paths.forEach((path) => { + const selectionPath = path.concat(STATE_SELECTION) + + // when the path is an array, we'll add a symbol on the array, but then + // setIn has no information to determine whether to create an array or an + // object, so we do that here explicitly based on referenceJson + if (!existsIn(result, selectionPath)) { + const item = getIn(referenceJson, selectionPath) + result = setIn(result, selectionPath, Array.isArray(item) ? [] : {}, true) + } + + result = setIn(result, selectionPath, selection, true) + }) + + return result +} + /** * Create a selection which selects the whole document * @returns {Selection} diff --git a/src/lib/plugins/createAjvValidator.js b/src/lib/plugins/validator/createAjvValidator.js similarity index 91% rename from src/lib/plugins/createAjvValidator.js rename to src/lib/plugins/validator/createAjvValidator.js index 1be8d5ff..879ae953 100644 --- a/src/lib/plugins/createAjvValidator.js +++ b/src/lib/plugins/validator/createAjvValidator.js @@ -1,10 +1,10 @@ import Ajv from 'ajv' -import { parseJSONPointerWithArrayIndices } from '../utils/jsonPointer.js' +import { parseJSONPointerWithArrayIndices } from '../../utils/jsonPointer.js' /** * Create a JSON Schema validator powered by Ajv. * @param {JSON} schema - * @param {Object} [schemaRefs=undefined] An object containing JSON Schema references + * @param {JSON} [schemaRefs=undefined] An object containing JSON Schema references * @return {function (json: JSON) : Array} Returns a valiation function */ export function createAjvValidator(schema, schemaRefs) { diff --git a/src/lib/plugins/createAjvValidator.test.js b/src/lib/plugins/validator/createAjvValidator.test.js similarity index 100% rename from src/lib/plugins/createAjvValidator.test.js rename to src/lib/plugins/validator/createAjvValidator.test.js diff --git a/src/lib/components/modes/treemode/value/BooleanToggle.scss b/src/lib/plugins/value/components/BooleanToggle.scss similarity index 79% rename from src/lib/components/modes/treemode/value/BooleanToggle.scss rename to src/lib/plugins/value/components/BooleanToggle.scss index be59414f..34bc342a 100644 --- a/src/lib/components/modes/treemode/value/BooleanToggle.scss +++ b/src/lib/plugins/value/components/BooleanToggle.scss @@ -1,4 +1,4 @@ -@import '../../../../styles'; +@import '../../../styles'; .boolean-toggle { color: $value-color-boolean; diff --git a/src/lib/components/modes/treemode/value/BooleanToggle.svelte b/src/lib/plugins/value/components/BooleanToggle.svelte similarity index 92% rename from src/lib/components/modes/treemode/value/BooleanToggle.svelte rename to src/lib/plugins/value/components/BooleanToggle.svelte index 74d89287..74a5b6be 100644 --- a/src/lib/components/modes/treemode/value/BooleanToggle.svelte +++ b/src/lib/plugins/value/components/BooleanToggle.svelte @@ -5,13 +5,18 @@ import { compileJSONPointer } from 'immutable-json-patch' import Icon from 'svelte-awesome' - export let onPatch export let path export let value + export let readOnly + export let onPatch function toggleBooleanValue(event) { event.stopPropagation() + if (readOnly) { + return + } + onPatch( [ { diff --git a/src/lib/components/modes/treemode/value/Color.scss b/src/lib/plugins/value/components/ColorPicker.scss similarity index 90% rename from src/lib/components/modes/treemode/value/Color.scss rename to src/lib/plugins/value/components/ColorPicker.scss index 07db5e48..0db74bb7 100644 --- a/src/lib/components/modes/treemode/value/Color.scss +++ b/src/lib/plugins/value/components/ColorPicker.scss @@ -1,4 +1,4 @@ -@import '../../../../styles'; +@import '../../../styles'; .jse-color { $margin: 2px; diff --git a/src/lib/components/modes/treemode/value/Color.svelte b/src/lib/plugins/value/components/ColorPicker.svelte similarity index 89% rename from src/lib/components/modes/treemode/value/Color.svelte rename to src/lib/plugins/value/components/ColorPicker.svelte index 867dec0c..2e786aaf 100644 --- a/src/lib/components/modes/treemode/value/Color.svelte +++ b/src/lib/plugins/value/components/ColorPicker.svelte @@ -1,16 +1,18 @@ + + + + diff --git a/src/lib/plugins/value/components/EnumValue.scss b/src/lib/plugins/value/components/EnumValue.scss new file mode 100644 index 00000000..8c83247d --- /dev/null +++ b/src/lib/plugins/value/components/EnumValue.scss @@ -0,0 +1,30 @@ +@import '../../../styles'; +@import '../../../components/controls/EditableDivShared'; + +.jse-enum-value { + background: $hovered-background-transparent; + border: none; + padding: 0; + + font-family: $font-family-mono; + font-size: $font-size-mono; + + cursor: pointer; + outline: none; + + &.selected { + background: $selection-background; + color: $selection-color; + } + + &.value:focus { + // override the color to black when editing + color: $black; + } +} + +:global(.json-node.selected) { + .jse-enum-value { + background: transparent; + } +} diff --git a/src/lib/plugins/value/components/EnumValue.svelte b/src/lib/plugins/value/components/EnumValue.svelte new file mode 100644 index 00000000..bfed0b53 --- /dev/null +++ b/src/lib/plugins/value/components/EnumValue.svelte @@ -0,0 +1,70 @@ + + + + + + + diff --git a/src/lib/components/modes/treemode/JSONValue.scss b/src/lib/plugins/value/components/ReadonlyValue.scss similarity index 81% rename from src/lib/components/modes/treemode/JSONValue.scss rename to src/lib/plugins/value/components/ReadonlyValue.scss index 1901f7b3..7507ae2f 100644 --- a/src/lib/components/modes/treemode/JSONValue.scss +++ b/src/lib/plugins/value/components/ReadonlyValue.scss @@ -1,6 +1,7 @@ @import '../../../styles'; -@import 'shared.scss'; +@import '../../../components/controls/EditableDivShared'; +// TODO: also share most of the following styling with EditableDiv .value { line-height: $line-height; min-width: 16px; diff --git a/src/lib/plugins/value/components/ReadonlyValue.svelte b/src/lib/plugins/value/components/ReadonlyValue.svelte new file mode 100644 index 00000000..dbfd711d --- /dev/null +++ b/src/lib/plugins/value/components/ReadonlyValue.svelte @@ -0,0 +1,51 @@ + + + + +
+ {#if searchResult} + + {:else} + {escapeHTML(value)} + {/if} +
+ + diff --git a/src/lib/components/modes/treemode/value/Timestamp.scss b/src/lib/plugins/value/components/TimestampTag.scss similarity index 87% rename from src/lib/components/modes/treemode/value/Timestamp.scss rename to src/lib/plugins/value/components/TimestampTag.scss index 240121cd..16209d9e 100644 --- a/src/lib/components/modes/treemode/value/Timestamp.scss +++ b/src/lib/plugins/value/components/TimestampTag.scss @@ -1,4 +1,4 @@ -@import '../../../../styles'; +@import '../../../styles'; .jse-timestamp { font-family: $font-family; diff --git a/src/lib/components/modes/treemode/value/Timestamp.svelte b/src/lib/plugins/value/components/TimestampTag.svelte similarity index 72% rename from src/lib/components/modes/treemode/value/Timestamp.svelte rename to src/lib/plugins/value/components/TimestampTag.svelte index 3f5d2212..2280b338 100644 --- a/src/lib/components/modes/treemode/value/Timestamp.svelte +++ b/src/lib/plugins/value/components/TimestampTag.svelte @@ -1,8 +1,10 @@ + + + +
+ + {hiddenValue} +
+ + diff --git a/src/routes/examples/custom_dynamic_styling.svelte b/src/routes/examples/custom_dynamic_styling.svelte index 3da2b58f..c5c8b820 100644 --- a/src/routes/examples/custom_dynamic_styling.svelte +++ b/src/routes/examples/custom_dynamic_styling.svelte @@ -1,5 +1,5 @@ + + + Custom value renderer (password, enum) | svelte-jsoneditor + + +

Custom value renderer (password, enum)

+ +

+ Provide a custom onRenderValue method, which hides the value of all fields with the name + "password", and creates an enum for the fields with name "gender". +

+

+ EXPERIMENTAL! This API will most likely change in future versions. +

+ +
+ +
+ + diff --git a/src/routes/examples/json_schema_validation.svelte b/src/routes/examples/json_schema_validation.svelte index 58c0dc42..1096380c 100644 --- a/src/routes/examples/json_schema_validation.svelte +++ b/src/routes/examples/json_schema_validation.svelte @@ -1,5 +1,10 @@