Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat (Conversion-config): pass target tool config to the conversionConfig.import method #2848

Merged
merged 7 commits into from
Oct 17, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
### 2.31.0

- `New` - Inline tools (those with `isReadOnlySupported` specified) can now be used in read-only mode
- `New` - Block manager passes target tool config to the `conversionConfig.import` method on conversion
- `Fix` - Fix selection of first block in read-only initialization with "autofocus=true"
- `Fix` - Incorrect caret position after blocks merging in Safari

Expand Down
2 changes: 1 addition & 1 deletion src/components/modules/blockManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -863,7 +863,7 @@ export default class BlockManager extends Module {
/**
* Now using Conversion Config "import" we compose a new Block data
*/
let newBlockData = convertStringToBlockData(cleanData, replacingTool.conversionConfig);
let newBlockData = convertStringToBlockData(cleanData, replacingTool.conversionConfig, replacingTool.settings);
neSpecc marked this conversation as resolved.
Show resolved Hide resolved

/**
* Optional data overrides.
Expand Down
6 changes: 3 additions & 3 deletions src/components/utils/blocks.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { BlockAPI } from '../../../types';
import type { BlockAPI, ToolConfig } from '../../../types';
import type { ConversionConfig } from '../../../types/configs/conversion-config';
import type { SavedData } from '../../../types/data-formats';
import type { BlockToolData } from '../../../types/tools/block-tool-data';
Expand Down Expand Up @@ -175,11 +175,11 @@ export function convertBlockDataToString(blockData: BlockToolData, conversionCon
* @param stringToImport - string to convert
* @param conversionConfig - tool's conversion config
*/
export function convertStringToBlockData(stringToImport: string, conversionConfig?: ConversionConfig): BlockToolData {
export function convertStringToBlockData(stringToImport: string, conversionConfig?: ConversionConfig, config?: ToolConfig): BlockToolData {
const importProp = conversionConfig?.import;
neSpecc marked this conversation as resolved.
Show resolved Hide resolved

if (isFunction(importProp)) {
return importProp(stringToImport);
return importProp(stringToImport, config);
} else if (isString(importProp)) {
return {
[importProp]: stringToImport,
Expand Down
2 changes: 1 addition & 1 deletion test/cypress/fixtures/tools/ToolMock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { BlockTool, BlockToolConstructorOptions } from '../../../../types';
/**
* Simple structure for Tool data
*/
interface MockToolData {
export interface MockToolData {
text: string;
}

Expand Down
83 changes: 81 additions & 2 deletions test/cypress/tests/api/blocks.cy.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type EditorJS from '../../../../types/index';
import type { ConversionConfig, ToolboxConfig } from '../../../../types';
import ToolMock from '../../fixtures/tools/ToolMock';
import type { ConversionConfig, ToolboxConfig, ToolConfig } from '../../../../types';
import ToolMock, { type MockToolData } from '../../fixtures/tools/ToolMock';
import { nanoid } from 'nanoid';

/**
Expand Down Expand Up @@ -444,5 +444,84 @@ describe('api.blocks', () => {
});
});
});

it.only('should get target tool config', function () {
neSpecc marked this conversation as resolved.
Show resolved Hide resolved
const existingBlock = {
id: 'test-id-123',
type: 'paragraph',
data: {
text: 'Some text',
},
};

const conversionTargetToolConfig = {
defaultStyle: 'defaultStyle',
};

/**
* Mock of Tool with conversionConfig
*/
class ToolWithConversionConfig extends ToolMock {
/**
* Specify conversion config of the tool
*/
public static get conversionConfig(): {
/**
* Method that is responsible for conversion from data to string
*/
export: (data: string) => string;

/**
* Method that is responsible for conversion from string to data
* Should return stringified config to see, if Editor actually passed tool config to it
*/
import: (content: string, config: ToolConfig) => MockToolData;
} {
return {
export: (data) => data,
/**
* Passed config should be returned
*/
import: (_content, config) => {
return { text: JSON.stringify(config) };
},
};
}
}

cy.createEditor({
tools: {
conversionTargetTool: {
class: ToolWithConversionConfig,
config: conversionTargetToolConfig,
},
},
data: {
blocks: [
existingBlock,
],
},
}).then(async (editor) => {
const { convert } = editor.blocks;

await convert(existingBlock.id, 'conversionTargetTool');

// wait for block to be converted
cy.wait(100).then(async () => {
/**
* Check that block was converted
*/
const { blocks } = await editor.save();

expect(blocks.length).to.eq(1);
expect(blocks[0].type).to.eq('conversionTargetTool');

/**
* Check that tool converted returned config as a result of import
*/
expect(blocks[0].data.text).to.eq(JSON.stringify(conversionTargetToolConfig));
});
});
});
});
});
4 changes: 2 additions & 2 deletions types/configs/conversion-config.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { BlockToolData } from '../tools';
import type { BlockToolData, ToolConfig } from '../tools';

/**
* Config allows Tool to specify how it can be converted into/from another Tool
Expand All @@ -12,7 +12,7 @@ export interface ConversionConfig {
* 1. String — the key of Tool data object to fill it with imported string on render.
* 2. Function — method that accepts importing string and composes Tool data to render.
*/
import?: ((data: string) => string) | string;
import?: ((data: string, config: ToolConfig) => BlockToolData) | string;

neSpecc marked this conversation as resolved.
Show resolved Hide resolved
/**
* How to export this Tool to make other Block.
Expand Down
Loading