mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 18:36:30 +01:00 
			
		
		
		
	feat(admonitions): convert to split and get last type
This commit is contained in:
		| @@ -20,6 +20,18 @@ import type { DocumentFragment, Element, Position, Range, Schema, Writer } from | |||||||
| // TODO: Change me. | // TODO: Change me. | ||||||
| type AdmonitionType = string; | type AdmonitionType = string; | ||||||
|  |  | ||||||
|  | interface ExecuteOpts { | ||||||
|  | 	/** | ||||||
|  | 	 * If set, it will force the command behavior. If `true`, the command will apply a block quote, | ||||||
|  | 	 * otherwise the command will remove the block quote. If not set, the command will act basing on its current value. | ||||||
|  | 	 */ | ||||||
|  | 	forceValue?: AdmonitionType; | ||||||
|  | 	/** | ||||||
|  | 	 * If set to true and `forceValue` is not specified, the command will apply the previous admonition type (if the command was already executed). | ||||||
|  | 	 */ | ||||||
|  | 	usePreviousChoice?: boolean | ||||||
|  | } | ||||||
|  |  | ||||||
| export default class AdmonitionCommand extends Command { | export default class AdmonitionCommand extends Command { | ||||||
| 	/** | 	/** | ||||||
| 	 * Whether the selection starts in a block quote. | 	 * Whether the selection starts in a block quote. | ||||||
| @@ -29,6 +41,8 @@ export default class AdmonitionCommand extends Command { | |||||||
| 	 */ | 	 */ | ||||||
| 	declare public value: AdmonitionType | false; | 	declare public value: AdmonitionType | false; | ||||||
|  |  | ||||||
|  | 	private _lastType?: AdmonitionType; | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * @inheritDoc | 	 * @inheritDoc | ||||||
| 	 */ | 	 */ | ||||||
| @@ -44,19 +58,15 @@ export default class AdmonitionCommand extends Command { | |||||||
| 	 * | 	 * | ||||||
| 	 * @fires execute | 	 * @fires execute | ||||||
| 	 * @param options Command options. | 	 * @param options Command options. | ||||||
| 	 * @param options.forceValue If set, it will force the command behavior. If `true`, the command will apply a block quote, |  | ||||||
| 	 * otherwise the command will remove the block quote. If not set, the command will act basing on its current value. |  | ||||||
| 	 */ | 	 */ | ||||||
| 	public override execute( options: { forceValue?: AdmonitionType } = {} ): void { | 	public override execute( options: ExecuteOpts = {} ): void { | ||||||
| 		const model = this.editor.model; | 		const model = this.editor.model; | ||||||
| 		const schema = model.schema; | 		const schema = model.schema; | ||||||
| 		const selection = model.document.selection; | 		const selection = model.document.selection; | ||||||
|  |  | ||||||
| 		const blocks = Array.from( selection.getSelectedBlocks() ); | 		const blocks = Array.from( selection.getSelectedBlocks() ); | ||||||
|  |  | ||||||
| 		const value = ( options.forceValue === undefined ) ? !this.value : options.forceValue; | 		const value = this._getType(options); | ||||||
| 		// TODO: Fix me. |  | ||||||
| 		const valueString = (typeof value === "string" ? value : "note"); |  | ||||||
|  |  | ||||||
| 		model.change( writer => { | 		model.change( writer => { | ||||||
| 			if ( !value ) { | 			if ( !value ) { | ||||||
| @@ -68,11 +78,33 @@ export default class AdmonitionCommand extends Command { | |||||||
| 					return findQuote( block ) || checkCanBeQuoted( schema, block ); | 					return findQuote( block ) || checkCanBeQuoted( schema, block ); | ||||||
| 				} ); | 				} ); | ||||||
|  |  | ||||||
| 				this._applyQuote( writer, blocksToQuote, valueString); | 				this._applyQuote( writer, blocksToQuote, value); | ||||||
| 			} | 			} | ||||||
| 		} ); | 		} ); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	private _getType(options: ExecuteOpts): AdmonitionType | false { | ||||||
|  | 		const value = (options.forceValue === undefined) ? !this.value : options.forceValue; | ||||||
|  |  | ||||||
|  | 		// Allow removing the admonition. | ||||||
|  | 		if (!value) { | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Prefer the type from the command, if any. | ||||||
|  | 		if (typeof value === "string") { | ||||||
|  | 			return value; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// See if we can restore the previous language. | ||||||
|  | 		if (options.usePreviousChoice && this._lastType) { | ||||||
|  | 			return this._lastType; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Otherwise return a default. | ||||||
|  | 		return "note"; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Checks the command's {@link #value}. | 	 * Checks the command's {@link #value}. | ||||||
| 	 */ | 	 */ | ||||||
| @@ -156,7 +188,8 @@ export default class AdmonitionCommand extends Command { | |||||||
| 	/** | 	/** | ||||||
| 	 * Applies the quote to given blocks. | 	 * Applies the quote to given blocks. | ||||||
| 	 */ | 	 */ | ||||||
| 	private _applyQuote( writer: Writer, blocks: Array<Element>, type?: AdmonitionType | false): void { | 	private _applyQuote( writer: Writer, blocks: Array<Element>, type?: AdmonitionType): void { | ||||||
|  | 		this._lastType = type; | ||||||
| 		const quotesToMerge: Array<Element | DocumentFragment> = []; | 		const quotesToMerge: Array<Element | DocumentFragment> = []; | ||||||
|  |  | ||||||
| 		// Quote all groups of block. Iterate in the reverse order to not break following ranges. | 		// Quote all groups of block. Iterate in the reverse order to not break following ranges. | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| import { Plugin, } from 'ckeditor5/src/core.js'; | import { Plugin, } from 'ckeditor5/src/core.js'; | ||||||
| import { addListToDropdown, createDropdown, ListDropdownButtonDefinition, ViewModel } from 'ckeditor5/src/ui.js'; | import { addListToDropdown, createDropdown, ListDropdownButtonDefinition, SplitButtonView, ViewModel } from 'ckeditor5/src/ui.js'; | ||||||
|  |  | ||||||
| import '../theme/blockquote.css'; | import '../theme/blockquote.css'; | ||||||
| import admonitionIcon from '../theme/icons/admonition.svg'; | import admonitionIcon from '../theme/icons/admonition.svg'; | ||||||
| @@ -72,23 +72,28 @@ export default class AdmonitionUI extends Plugin { | |||||||
| 		const editor = this.editor; | 		const editor = this.editor; | ||||||
| 		const locale = editor.locale; | 		const locale = editor.locale; | ||||||
| 		const command = editor.commands.get( 'admonition' )!; | 		const command = editor.commands.get( 'admonition' )!; | ||||||
| 		const dropdownView = createDropdown(locale); | 		const dropdownView = createDropdown(locale, SplitButtonView); | ||||||
|  | 		const splitButtonView = dropdownView.buttonView; | ||||||
| 		const t = locale.t; | 		const t = locale.t; | ||||||
|  |  | ||||||
| 		addListToDropdown(dropdownView, this._getDropdownItems()) | 		addListToDropdown(dropdownView, this._getDropdownItems()) | ||||||
|  |  | ||||||
| 		dropdownView.buttonView.set( { | 		// Button configuration. | ||||||
|  | 		splitButtonView.set( { | ||||||
| 			label: t( 'Admonition' ), | 			label: t( 'Admonition' ), | ||||||
| 			icon: admonitionIcon, | 			icon: admonitionIcon, | ||||||
| 			isToggleable: true, | 			isToggleable: true, | ||||||
| 			tooltip: true | 			tooltip: true | ||||||
| 		} ); | 		} ); | ||||||
|  | 		splitButtonView.on("execute", () => { | ||||||
|  | 			editor.execute("admonition", { usePreviousChoice: true }); | ||||||
|  | 			editor.editing.view.focus(); | ||||||
|  | 		}); | ||||||
|  | 		splitButtonView.bind( 'isOn' ).to( command, 'value', value => (!!value) as boolean); | ||||||
|  |  | ||||||
|  | 		// Dropdown configuration | ||||||
| 		dropdownView.bind( 'isEnabled' ).to( command, 'isEnabled' ); | 		dropdownView.bind( 'isEnabled' ).to( command, 'isEnabled' ); | ||||||
| 		// view.buttonView.bind( 'isOn' ).to( command, 'value' ); | 		dropdownView.on("execute", evt => { | ||||||
|  |  | ||||||
| 		// Execute the command. |  | ||||||
| 		this.listenTo(dropdownView, 'execute', evt => { |  | ||||||
| 			editor.execute("admonition", { forceValue: ( evt.source as any ).commandParam } ); | 			editor.execute("admonition", { forceValue: ( evt.source as any ).commandParam } ); | ||||||
| 			editor.editing.view.focus(); | 			editor.editing.view.focus(); | ||||||
| 		}); | 		}); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user