@ni/nimble-components 20.14.7 → 20.14.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/all-components-bundle.js +244 -14
- package/dist/all-components-bundle.js.map +1 -1
- package/dist/all-components-bundle.min.js +1059 -1035
- package/dist/all-components-bundle.min.js.map +1 -1
- package/dist/esm/number-field/index.js +2 -0
- package/dist/esm/number-field/index.js.map +1 -1
- package/dist/esm/rich-text/models/markdown-parser-mention-configuration.d.ts +15 -0
- package/dist/esm/rich-text/models/markdown-parser-mention-configuration.js +26 -0
- package/dist/esm/rich-text/models/markdown-parser-mention-configuration.js.map +1 -0
- package/dist/esm/rich-text/models/markdown-parser.d.ts +9 -2
- package/dist/esm/rich-text/models/markdown-parser.js +34 -9
- package/dist/esm/rich-text/models/markdown-parser.js.map +1 -1
- package/dist/esm/rich-text/models/testing/markdown-parser-utils.d.ts +1 -0
- package/dist/esm/rich-text/models/testing/markdown-parser-utils.js +3 -0
- package/dist/esm/rich-text/models/testing/markdown-parser-utils.js.map +1 -1
- package/dist/esm/rich-text/viewer/index.d.ts +24 -0
- package/dist/esm/rich-text/viewer/index.js +66 -4
- package/dist/esm/rich-text/viewer/index.js.map +1 -1
- package/dist/esm/rich-text/viewer/styles.js +14 -1
- package/dist/esm/rich-text/viewer/styles.js.map +1 -1
- package/dist/esm/rich-text/viewer/template.js +4 -2
- package/dist/esm/rich-text/viewer/template.js.map +1 -1
- package/dist/esm/rich-text/viewer/testing/rich-text-viewer.pageobject.d.ts +1 -0
- package/dist/esm/rich-text/viewer/testing/rich-text-viewer.pageobject.js +6 -3
- package/dist/esm/rich-text/viewer/testing/rich-text-viewer.pageobject.js.map +1 -1
- package/dist/esm/rich-text-mention/base/models/mention-internals.d.ts +5 -0
- package/dist/esm/rich-text-mention/base/models/mention-internals.js +1 -0
- package/dist/esm/rich-text-mention/base/models/mention-internals.js.map +1 -1
- package/dist/esm/rich-text-mention/users/index.js +3 -1
- package/dist/esm/rich-text-mention/users/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -55,6 +55,7 @@ const nimbleNumberField = NumberField.compose({
|
|
|
55
55
|
appearance="ghost"
|
|
56
56
|
content-hidden
|
|
57
57
|
tabindex="-1"
|
|
58
|
+
aria-hidden="true"
|
|
58
59
|
>
|
|
59
60
|
${x => numericDecrementLabel.getValueFor(x)}
|
|
60
61
|
<${iconMinusWideTag}
|
|
@@ -69,6 +70,7 @@ const nimbleNumberField = NumberField.compose({
|
|
|
69
70
|
appearance="ghost"
|
|
70
71
|
content-hidden
|
|
71
72
|
tabindex="-1"
|
|
73
|
+
aria-hidden="true"
|
|
72
74
|
>
|
|
73
75
|
${x => numericIncrementLabel.getValueFor(x)}
|
|
74
76
|
<${iconAddTag}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/number-field/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EACH,YAAY,EACZ,WAAW,IAAI,qBAAqB,EAEpC,mBAAmB,IAAI,QAAQ,EAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EACH,qBAAqB,EACrB,qBAAqB,EACxB,MAAM,qCAAqC,CAAC;AAQ7C;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,qBAAqB;IAAtD;;QAEW,eAAU,GAA0B,qBAAqB,CAAC,SAAS,CAAC;QAapE,iBAAY,GAAG,KAAK,CAAC;IAQhC,CAAC;IANmB,iBAAiB;QAC7B,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE1B,qFAAqF;QACrF,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpD,CAAC;CACJ;AArBG;IADC,IAAI;+CACsE;AAU3E;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;8CACR;AAG1B;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;iDAC1B;AAUhC;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAG,WAAW,CAAC,OAAO,CAAqB;IAC9D,QAAQ,EAAE,cAAc;IACxB,SAAS,EAAE,qBAAqB;IAChC,QAAQ;IACR,MAAM;IACN,aAAa,EAAE;QACX,cAAc,EAAE,IAAI;KACvB;IACD,aAAa,EAAE,IAAI,CAAa;WACzB,SAAS
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/number-field/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EACH,YAAY,EACZ,WAAW,IAAI,qBAAqB,EAEpC,mBAAmB,IAAI,QAAQ,EAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EACH,qBAAqB,EACrB,qBAAqB,EACxB,MAAM,qCAAqC,CAAC;AAQ7C;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,qBAAqB;IAAtD;;QAEW,eAAU,GAA0B,qBAAqB,CAAC,SAAS,CAAC;QAapE,iBAAY,GAAG,KAAK,CAAC;IAQhC,CAAC;IANmB,iBAAiB;QAC7B,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE1B,qFAAqF;QACrF,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpD,CAAC;CACJ;AArBG;IADC,IAAI;+CACsE;AAU3E;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;8CACR;AAG1B;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;iDAC1B;AAUhC;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAG,WAAW,CAAC,OAAO,CAAqB;IAC9D,QAAQ,EAAE,cAAc;IACxB,SAAS,EAAE,qBAAqB;IAChC,QAAQ;IACR,MAAM;IACN,aAAa,EAAE;QACX,cAAc,EAAE,IAAI;KACvB;IACD,aAAa,EAAE,IAAI,CAAa;WACzB,SAAS;;;;;;;cAON,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC;eACxC,gBAAgB;;;gBAGf,gBAAgB;YACpB,SAAS;KAChB;IACD,WAAW,EAAE,IAAI,CAAa;WACvB,SAAS;;;;;;;cAON,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC;eACxC,UAAU;;gBAET,UAAU;YACd,SAAS;KAChB;IACD,GAAG,EAAE,IAAI,CAAa;WACf,sBAAsB;;;aAGpB,sBAAsB;UACzB,iBAAiB;KACtB;CACJ,CAAC,CAAC;AAEH,YAAY,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RichTextMentionConfig } from '../../rich-text-mention/base';
|
|
2
|
+
import type { MentionInternals } from '../../rich-text-mention/base/models/mention-internals';
|
|
3
|
+
/**
|
|
4
|
+
* A configuration object for a Markdown parser, to be used by the viewer and editor components.
|
|
5
|
+
* This object maintains the necessary internal values for handling mentions within the Markdown parser.
|
|
6
|
+
*/
|
|
7
|
+
export declare class MarkdownParserMentionConfiguration {
|
|
8
|
+
readonly viewElement: string;
|
|
9
|
+
private readonly regexPattern;
|
|
10
|
+
private readonly mappingConfigs?;
|
|
11
|
+
constructor(mentionInternals: MentionInternals<RichTextMentionConfig>);
|
|
12
|
+
isValidMentionHref(mentionHref: string): boolean;
|
|
13
|
+
getDisplayName(mentionHref: string): string | undefined;
|
|
14
|
+
private extractMentionId;
|
|
15
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A configuration object for a Markdown parser, to be used by the viewer and editor components.
|
|
3
|
+
* This object maintains the necessary internal values for handling mentions within the Markdown parser.
|
|
4
|
+
*/
|
|
5
|
+
export class MarkdownParserMentionConfiguration {
|
|
6
|
+
constructor(mentionInternals) {
|
|
7
|
+
this.regexPattern = new RegExp(mentionInternals.pattern ?? '');
|
|
8
|
+
this.mappingConfigs = mentionInternals.mentionConfig?.mappingConfigs;
|
|
9
|
+
this.viewElement = mentionInternals.viewElement;
|
|
10
|
+
}
|
|
11
|
+
isValidMentionHref(mentionHref) {
|
|
12
|
+
return this.regexPattern.test(mentionHref);
|
|
13
|
+
}
|
|
14
|
+
getDisplayName(mentionHref) {
|
|
15
|
+
const mentionMapping = this.mappingConfigs?.get(mentionHref);
|
|
16
|
+
const mentionId = this.extractMentionId(mentionHref);
|
|
17
|
+
return mentionMapping?.displayName ?? mentionId;
|
|
18
|
+
}
|
|
19
|
+
extractMentionId(mentionHref) {
|
|
20
|
+
const regexpArray = this.regexPattern.exec(mentionHref);
|
|
21
|
+
// Matches and gets the first group specified in the regex pattern
|
|
22
|
+
// that renders as an alternative to the display name if missing.
|
|
23
|
+
return regexpArray?.[1] ?? undefined;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=markdown-parser-mention-configuration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-parser-mention-configuration.js","sourceRoot":"","sources":["../../../../src/rich-text/models/markdown-parser-mention-configuration.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,OAAO,kCAAkC;IAM3C,YACI,gBAAyD;QAEzD,IAAI,CAAC,YAAY,GAAG,IAAI,MAAM,CAAC,gBAAgB,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,cAAc,GAAG,gBAAgB,CAAC,aAAa,EAAE,cAAc,CAAC;QACrE,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,WAAW,CAAC;IACpD,CAAC;IAEM,kBAAkB,CAAC,WAAmB;QACzC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/C,CAAC;IAEM,cAAc,CAAC,WAAmB;QACrC,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACrD,OAAO,cAAc,EAAE,WAAW,IAAI,SAAS,CAAC;IACpD,CAAC;IAEO,gBAAgB,CAAC,WAAmB;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAExD,kEAAkE;QAClE,iEAAiE;QACjE,OAAO,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IACzC,CAAC;CACJ"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { MarkdownParserMentionConfiguration } from './markdown-parser-mention-configuration';
|
|
1
2
|
/**
|
|
2
3
|
* Provides markdown parser for rich text components
|
|
3
4
|
*/
|
|
@@ -5,12 +6,18 @@ export declare class RichTextMarkdownParser {
|
|
|
5
6
|
private static readonly updatedSchema;
|
|
6
7
|
private static readonly markdownParser;
|
|
7
8
|
private static readonly domSerializer;
|
|
9
|
+
/**
|
|
10
|
+
* The markdown parser is static (shared across all rich text components) because it is expensive to create.
|
|
11
|
+
* To configure parse calls with the mention configurations which can be unique per component instance
|
|
12
|
+
* we store static configuration in this member and access it from Prosemirror callbacks.
|
|
13
|
+
*/
|
|
14
|
+
private static mentionConfigs?;
|
|
8
15
|
/**
|
|
9
16
|
* This function takes a markdown string, parses it using the ProseMirror MarkdownParser, serializes the parsed content into a
|
|
10
17
|
* DOM structure using a DOMSerializer, and returns the serialized result.
|
|
11
18
|
* If the markdown parser returns null, it will clear the viewer component by creating an empty document fragment.
|
|
12
19
|
*/
|
|
13
|
-
static parseMarkdownToDOM(value: string): HTMLElement | DocumentFragment;
|
|
20
|
+
static parseMarkdownToDOM(value: string, markdownParserMentionConfig?: MarkdownParserMentionConfiguration[]): HTMLElement | DocumentFragment;
|
|
14
21
|
private static initializeMarkdownParser;
|
|
15
|
-
private static
|
|
22
|
+
private static getCustomSchemaConfiguration;
|
|
16
23
|
}
|
|
@@ -11,12 +11,18 @@ export class RichTextMarkdownParser {
|
|
|
11
11
|
* DOM structure using a DOMSerializer, and returns the serialized result.
|
|
12
12
|
* If the markdown parser returns null, it will clear the viewer component by creating an empty document fragment.
|
|
13
13
|
*/
|
|
14
|
-
static parseMarkdownToDOM(value) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
static parseMarkdownToDOM(value, markdownParserMentionConfig) {
|
|
15
|
+
try {
|
|
16
|
+
this.mentionConfigs = markdownParserMentionConfig;
|
|
17
|
+
const parsedMarkdownContent = this.markdownParser.parse(value);
|
|
18
|
+
if (parsedMarkdownContent === null) {
|
|
19
|
+
return document.createDocumentFragment();
|
|
20
|
+
}
|
|
21
|
+
return this.domSerializer.serializeFragment(parsedMarkdownContent.content);
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
this.mentionConfigs = undefined;
|
|
18
25
|
}
|
|
19
|
-
return this.domSerializer.serializeFragment(parsedMarkdownContent.content);
|
|
20
26
|
}
|
|
21
27
|
static initializeMarkdownParser() {
|
|
22
28
|
/**
|
|
@@ -35,7 +41,6 @@ export class RichTextMarkdownParser {
|
|
|
35
41
|
'autolink',
|
|
36
42
|
'newline'
|
|
37
43
|
]);
|
|
38
|
-
supportedTokenizerRules.validateLink = href => /^https?:\/\//i.test(href);
|
|
39
44
|
/**
|
|
40
45
|
* In order to display encoded characters, non-ASCII characters, emojis, and other special characters in their original form,
|
|
41
46
|
* we bypass the default normalization of link text in markdown-it. This is done because we support only "AutoLink" feature in CommonMark flavor.
|
|
@@ -47,7 +52,7 @@ export class RichTextMarkdownParser {
|
|
|
47
52
|
supportedTokenizerRules.normalizeLinkText = url => url;
|
|
48
53
|
return new MarkdownParser(this.updatedSchema, supportedTokenizerRules, defaultMarkdownParser.tokens);
|
|
49
54
|
}
|
|
50
|
-
static
|
|
55
|
+
static getCustomSchemaConfiguration() {
|
|
51
56
|
return new Schema({
|
|
52
57
|
nodes: schema.spec.nodes,
|
|
53
58
|
marks: {
|
|
@@ -63,10 +68,30 @@ export class RichTextMarkdownParser {
|
|
|
63
68
|
// See: https://github.com/ni/nimble/issues/1527
|
|
64
69
|
excludes: '_',
|
|
65
70
|
toDOM(node) {
|
|
71
|
+
const href = node.attrs.href;
|
|
72
|
+
const currentMention = RichTextMarkdownParser.mentionConfigs?.find(mention => mention.isValidMentionHref(href));
|
|
73
|
+
const displayName = currentMention?.getDisplayName(href);
|
|
74
|
+
if (currentMention && displayName) {
|
|
75
|
+
return [
|
|
76
|
+
currentMention.viewElement,
|
|
77
|
+
{
|
|
78
|
+
'mention-href': href,
|
|
79
|
+
'mention-label': displayName,
|
|
80
|
+
'disable-editing': true
|
|
81
|
+
}
|
|
82
|
+
];
|
|
83
|
+
}
|
|
66
84
|
return [
|
|
67
85
|
anchorTag,
|
|
68
86
|
{
|
|
69
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Both mention and absolute link markdown share the autolink format in CommonMark flavor.
|
|
89
|
+
* Absolute links with HTTP/HTTPS will be rendered as links. Absolute links that match the
|
|
90
|
+
* mention pattern will be rendered as mention view element. Absolute links without HTTP/HTTPS
|
|
91
|
+
* scheme and no matching mention pattern will be rendered as plain text (anchor with no href).
|
|
92
|
+
* With this, the user can click the links only when the scheme is HTTP/HTTPS
|
|
93
|
+
*/
|
|
94
|
+
href: /^https?:\/\//i.test(href) ? href : null,
|
|
70
95
|
rel: node.attrs.rel
|
|
71
96
|
}
|
|
72
97
|
];
|
|
@@ -79,7 +104,7 @@ export class RichTextMarkdownParser {
|
|
|
79
104
|
}
|
|
80
105
|
}
|
|
81
106
|
_a = RichTextMarkdownParser;
|
|
82
|
-
RichTextMarkdownParser.updatedSchema = _a.
|
|
107
|
+
RichTextMarkdownParser.updatedSchema = _a.getCustomSchemaConfiguration();
|
|
83
108
|
RichTextMarkdownParser.markdownParser = _a.initializeMarkdownParser();
|
|
84
109
|
RichTextMarkdownParser.domSerializer = DOMSerializer.fromSchema(_a.updatedSchema);
|
|
85
110
|
//# sourceMappingURL=markdown-parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../../../src/rich-text/models/markdown-parser.ts"],"names":[],"mappings":";AAAA,OAAO,EACH,MAAM,EACN,qBAAqB,EACrB,cAAc,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../../../src/rich-text/models/markdown-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare const getTagsFromElement: (doc: DocumentFragment | HTMLElement) => string[];
|
|
2
2
|
export declare const getLeafContentsFromElement: (doc: DocumentFragment | HTMLElement) => string[];
|
|
3
3
|
export declare const getLastChildElementAttribute: (attribute: string, doc: DocumentFragment | HTMLElement) => string;
|
|
4
|
+
export declare const lastChildElementHasAttribute: (attribute: string, doc: DocumentFragment | HTMLElement) => boolean;
|
|
4
5
|
export declare function getLastChildElement(doc: DocumentFragment | HTMLElement): Element | null | undefined;
|
|
@@ -13,6 +13,9 @@ export const getLeafContentsFromElement = (doc) => {
|
|
|
13
13
|
export const getLastChildElementAttribute = (attribute, doc) => {
|
|
14
14
|
return getLastChildElement(doc)?.getAttribute(attribute) ?? '';
|
|
15
15
|
};
|
|
16
|
+
export const lastChildElementHasAttribute = (attribute, doc) => {
|
|
17
|
+
return getLastChildElement(doc)?.hasAttribute(attribute) ?? false;
|
|
18
|
+
};
|
|
16
19
|
export function getLastChildElement(doc) {
|
|
17
20
|
let lastElement = doc.lastElementChild;
|
|
18
21
|
while (lastElement?.lastElementChild) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-parser-utils.js","sourceRoot":"","sources":["../../../../../src/rich-text/models/testing/markdown-parser-utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAC9B,GAAmC,EAC3B,EAAE;IACV,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACtC,GAAmC,EAC3B,EAAE;IACV,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;SAC9C,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IACpC,CAAC,CAAC;SACD,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CACxC,SAAiB,EACjB,GAAmC,EAC7B,EAAE;IACR,OAAO,mBAAmB,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAC/B,GAAmC;IAEnC,IAAI,WAAW,GAAG,GAAG,CAAC,gBAAgB,CAAC;IAEvC,OAAO,WAAW,EAAE,gBAAgB,EAAE;QAClC,WAAW,GAAG,WAAW,CAAC,gBAAgB,CAAC;KAC9C;IACD,OAAO,WAAW,CAAC;AACvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"markdown-parser-utils.js","sourceRoot":"","sources":["../../../../../src/rich-text/models/testing/markdown-parser-utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAC9B,GAAmC,EAC3B,EAAE;IACV,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACtC,GAAmC,EAC3B,EAAE;IACV,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;SAC9C,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IACpC,CAAC,CAAC;SACD,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CACxC,SAAiB,EACjB,GAAmC,EAC7B,EAAE;IACR,OAAO,mBAAmB,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CACxC,SAAiB,EACjB,GAAmC,EAC5B,EAAE;IACT,OAAO,mBAAmB,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;AACtE,CAAC,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAC/B,GAAmC;IAEnC,IAAI,WAAW,GAAG,GAAG,CAAC,gBAAgB,CAAC;IAEvC,OAAO,WAAW,EAAE,gBAAgB,EAAE;QAClC,WAAW,GAAG,WAAW,CAAC,gBAAgB,CAAC;KAC9C;IACD,OAAO,WAAW,CAAC;AACvB,CAAC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { FoundationElement } from '@microsoft/fast-foundation';
|
|
2
|
+
import { RichTextMention } from '../../rich-text-mention/base';
|
|
3
|
+
import { MarkdownParserMentionConfiguration } from '../models/markdown-parser-mention-configuration';
|
|
2
4
|
declare global {
|
|
3
5
|
interface HTMLElementTagNameMap {
|
|
4
6
|
'nimble-rich-text-viewer': RichTextViewer;
|
|
@@ -18,6 +20,19 @@ export declare class RichTextViewer extends FoundationElement {
|
|
|
18
20
|
* @internal
|
|
19
21
|
*/
|
|
20
22
|
viewer: HTMLDivElement;
|
|
23
|
+
/**
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
mentionElements: RichTextMention[];
|
|
27
|
+
/**
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
mentionInternalsConfig: MarkdownParserMentionConfiguration[];
|
|
31
|
+
/**
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
readonly childItems: Element[];
|
|
35
|
+
private mentionInternalsNotifiers;
|
|
21
36
|
/**
|
|
22
37
|
* @internal
|
|
23
38
|
*/
|
|
@@ -26,6 +41,15 @@ export declare class RichTextViewer extends FoundationElement {
|
|
|
26
41
|
* @internal
|
|
27
42
|
*/
|
|
28
43
|
markdownChanged(): void;
|
|
44
|
+
/**
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
handleChange(source: unknown, args: unknown): void;
|
|
48
|
+
private childItemsChanged;
|
|
49
|
+
private updateMentionsFromChildItems;
|
|
50
|
+
private observeMentions;
|
|
51
|
+
private removeMentionObservers;
|
|
52
|
+
private updateMentionInternalsConfig;
|
|
29
53
|
private updateView;
|
|
30
54
|
}
|
|
31
55
|
export declare const richTextViewerTag: string;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
2
|
import { DesignSystem, FoundationElement } from '@microsoft/fast-foundation';
|
|
3
|
-
import { observable } from '@microsoft/fast-element';
|
|
3
|
+
import { Observable, observable } from '@microsoft/fast-element';
|
|
4
4
|
import { template } from './template';
|
|
5
5
|
import { styles } from './styles';
|
|
6
6
|
import { RichTextMarkdownParser } from '../models/markdown-parser';
|
|
7
|
+
import { RichTextMention } from '../../rich-text-mention/base';
|
|
8
|
+
import { MentionInternals } from '../../rich-text-mention/base/models/mention-internals';
|
|
9
|
+
import { MarkdownParserMentionConfiguration } from '../models/markdown-parser-mention-configuration';
|
|
7
10
|
/**
|
|
8
11
|
* A nimble styled rich text viewer
|
|
9
12
|
*/
|
|
@@ -16,6 +19,19 @@ export class RichTextViewer extends FoundationElement {
|
|
|
16
19
|
* Markdown string to render its corresponding rich text content in the component.
|
|
17
20
|
*/
|
|
18
21
|
this.markdown = '';
|
|
22
|
+
/**
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
this.mentionElements = [];
|
|
26
|
+
/**
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
this.mentionInternalsConfig = [];
|
|
30
|
+
/**
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
this.childItems = [];
|
|
34
|
+
this.mentionInternalsNotifiers = [];
|
|
19
35
|
}
|
|
20
36
|
/**
|
|
21
37
|
* @internal
|
|
@@ -28,13 +44,56 @@ export class RichTextViewer extends FoundationElement {
|
|
|
28
44
|
* @internal
|
|
29
45
|
*/
|
|
30
46
|
markdownChanged() {
|
|
31
|
-
|
|
32
|
-
|
|
47
|
+
this.updateView();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* @internal
|
|
51
|
+
*/
|
|
52
|
+
handleChange(source, args) {
|
|
53
|
+
if (source instanceof MentionInternals && typeof args === 'string') {
|
|
54
|
+
this.updateMentionInternalsConfig();
|
|
33
55
|
}
|
|
34
56
|
}
|
|
57
|
+
childItemsChanged() {
|
|
58
|
+
void this.updateMentionsFromChildItems();
|
|
59
|
+
}
|
|
60
|
+
async updateMentionsFromChildItems() {
|
|
61
|
+
const definedElements = this.childItems.map(async (item) => (item.matches(':not(:defined)')
|
|
62
|
+
? customElements.whenDefined(item.localName)
|
|
63
|
+
: Promise.resolve()));
|
|
64
|
+
await Promise.all(definedElements);
|
|
65
|
+
this.mentionElements = this.childItems.filter((x) => x instanceof RichTextMention);
|
|
66
|
+
this.observeMentions();
|
|
67
|
+
this.updateMentionInternalsConfig();
|
|
68
|
+
}
|
|
69
|
+
observeMentions() {
|
|
70
|
+
this.removeMentionObservers();
|
|
71
|
+
for (const mention of this.mentionElements) {
|
|
72
|
+
const notifierInternals = Observable.getNotifier(mention.mentionInternals);
|
|
73
|
+
notifierInternals.subscribe(this);
|
|
74
|
+
this.mentionInternalsNotifiers.push(notifierInternals);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
removeMentionObservers() {
|
|
78
|
+
this.mentionInternalsNotifiers.forEach(notifier => {
|
|
79
|
+
notifier.unsubscribe(this);
|
|
80
|
+
});
|
|
81
|
+
this.mentionInternalsNotifiers = [];
|
|
82
|
+
}
|
|
83
|
+
updateMentionInternalsConfig() {
|
|
84
|
+
// TODO: Add a rich text validator to check if the `mentionElements` contains duplicate configuration element
|
|
85
|
+
// For example, having two `nimble-rich-text-mention-users` within the children of rich text viewer or editor is an invalid configuration
|
|
86
|
+
this.mentionInternalsConfig = this.mentionElements
|
|
87
|
+
.filter(mention => mention.mentionInternals.validConfiguration)
|
|
88
|
+
.map(mention => new MarkdownParserMentionConfiguration(mention.mentionInternals));
|
|
89
|
+
this.updateView();
|
|
90
|
+
}
|
|
35
91
|
updateView() {
|
|
92
|
+
if (!this.$fastController.isConnected) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
36
95
|
if (this.markdown) {
|
|
37
|
-
const serializedContent = RichTextMarkdownParser.parseMarkdownToDOM(this.markdown);
|
|
96
|
+
const serializedContent = RichTextMarkdownParser.parseMarkdownToDOM(this.markdown, this.mentionInternalsConfig);
|
|
38
97
|
this.viewer.replaceChildren(serializedContent);
|
|
39
98
|
}
|
|
40
99
|
else {
|
|
@@ -45,6 +104,9 @@ export class RichTextViewer extends FoundationElement {
|
|
|
45
104
|
__decorate([
|
|
46
105
|
observable
|
|
47
106
|
], RichTextViewer.prototype, "markdown", void 0);
|
|
107
|
+
__decorate([
|
|
108
|
+
observable
|
|
109
|
+
], RichTextViewer.prototype, "childItems", void 0);
|
|
48
110
|
const nimbleRichTextViewer = RichTextViewer.compose({
|
|
49
111
|
baseName: 'rich-text-viewer',
|
|
50
112
|
template,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/rich-text/viewer/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/rich-text/viewer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { css } from '@microsoft/fast-element';
|
|
2
2
|
import { display } from '@microsoft/fast-foundation';
|
|
3
|
-
import { bodyFont, bodyFontColor } from '../../theme-provider/design-tokens';
|
|
3
|
+
import { bodyFont, bodyFontColor, linkFontColor } from '../../theme-provider/design-tokens';
|
|
4
4
|
export const styles = css `
|
|
5
5
|
${display('flex')}
|
|
6
6
|
|
|
@@ -39,5 +39,18 @@ export const styles = css `
|
|
|
39
39
|
li > p:empty {
|
|
40
40
|
display: none;
|
|
41
41
|
}
|
|
42
|
+
|
|
43
|
+
${
|
|
44
|
+
/**
|
|
45
|
+
* When an absolute link is not HTTPS/HTTP, the anchor tag renders without an `href`, appearing as plain text.
|
|
46
|
+
* However, the `nimble-anchor` displays differently in color when the `href` attribute is absent.
|
|
47
|
+
* To ensure a consistent appearance, the font color is forced to the default link color regardless of the `href`
|
|
48
|
+
* attribute's presence.
|
|
49
|
+
*
|
|
50
|
+
* See models/markdown-parser.ts where link elements are emitted for more info.
|
|
51
|
+
*/ ''}
|
|
52
|
+
nimble-anchor::part(control) {
|
|
53
|
+
color: ${linkFontColor};
|
|
54
|
+
}
|
|
42
55
|
`;
|
|
43
56
|
//# sourceMappingURL=styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../src/rich-text/viewer/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../src/rich-text/viewer/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EACH,QAAQ,EACR,aAAa,EACb,aAAa,EAChB,MAAM,oCAAoC,CAAC;AAE5C,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;MACnB,OAAO,CAAC,MAAM,CAAC;;;gBAGL,QAAQ;;iBAEP,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;MA2BxB;AACE,gLAAgL,CAAC,EACrL;;;;;MAKE;AACE;;;;;;;GAOG,CAAC,EACR;;iBAEa,aAAa;;CAE7B,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { html, ref } from '@microsoft/fast-element';
|
|
1
|
+
import { children, elements, html, ref } from '@microsoft/fast-element';
|
|
2
2
|
export const template = html `
|
|
3
|
-
<
|
|
3
|
+
<template ${children({ property: 'childItems', filter: elements() })}>
|
|
4
|
+
<div ${ref('viewer')} class="viewer"></div>
|
|
5
|
+
</template>
|
|
4
6
|
`;
|
|
5
7
|
//# sourceMappingURL=template.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../../src/rich-text/viewer/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../../src/rich-text/viewer/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAGxE,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAgB;gBAC5B,QAAQ,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;eACzD,GAAG,CAAC,QAAQ,CAAC;;CAE3B,CAAC"}
|
|
@@ -21,6 +21,7 @@ export declare class RichTextViewerPageObject {
|
|
|
21
21
|
* @returns An array of text contents of last elements in a tree
|
|
22
22
|
*/
|
|
23
23
|
getRenderedMarkdownLeafContents(): string[];
|
|
24
|
+
getRenderedMarkdownAttributeValues(attribute: string): string[];
|
|
24
25
|
private getMarkdownRenderedElement;
|
|
25
26
|
private getLastChildMarkdownRenderedElement;
|
|
26
27
|
}
|
|
@@ -43,11 +43,14 @@ export class RichTextViewerPageObject {
|
|
|
43
43
|
*/
|
|
44
44
|
getRenderedMarkdownLeafContents() {
|
|
45
45
|
return Array.from(this.getMarkdownRenderedElement().querySelectorAll('*'))
|
|
46
|
-
.filter((el, _) =>
|
|
47
|
-
return el.children.length === 0;
|
|
48
|
-
})
|
|
46
|
+
.filter((el, _) => el.children.length === 0)
|
|
49
47
|
.map(el => el.textContent || '');
|
|
50
48
|
}
|
|
49
|
+
getRenderedMarkdownAttributeValues(attribute) {
|
|
50
|
+
return Array.from(this.getMarkdownRenderedElement().querySelectorAll('*'))
|
|
51
|
+
.filter((el, _) => el.children.length === 0)
|
|
52
|
+
.map(el => el.getAttribute(attribute) || '');
|
|
53
|
+
}
|
|
51
54
|
getMarkdownRenderedElement() {
|
|
52
55
|
return this.richTextViewerElement.shadowRoot?.querySelector('.viewer');
|
|
53
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rich-text-viewer.pageobject.js","sourceRoot":"","sources":["../../../../../src/rich-text/viewer/testing/rich-text-viewer.pageobject.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,wBAAwB;IACjC,YACqB,qBAAqC;QAArC,0BAAqB,GAArB,qBAAqB,CAAgB;IACvD,CAAC;IAEG,oCAAoC;QACvC,OAAO,IAAI,CAAC,mCAAmC,EAAE,EAAE,WAAW,IAAI,EAAE,CAAC;IACzE,CAAC;IAEM,qCAAqC,CAAC,SAAiB;QAC1D,OAAO,CACH,IAAI,CAAC,mCAAmC,EAAE,EAAE,YAAY,CACpD,SAAS,CACZ,IAAI,EAAE,CACV,CAAC;IACN,CAAC;IAED;;;OAGG;IACI,2BAA2B;QAC9B,OAAO,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,0BAA0B,EAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAC3D,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,0CAA0C;QAC7C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAE1D,MAAM,WAAW,GAAG,CAAC,IAAU,EAAQ,EAAE;YACrC,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE;gBACrC,MAAM,EAAE,GAAG,IAAe,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;gBAE1B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAEnC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;aACnC;QACL,CAAC,CAAC;QAEF,IAAI,eAAe,EAAE;YACjB,WAAW,CAAC,eAAe,CAAC,CAAC;SAChC;QAED,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,+BAA+B;QAClC,OAAO,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,0BAA0B,EAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAC3D;aACI,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE
|
|
1
|
+
{"version":3,"file":"rich-text-viewer.pageobject.js","sourceRoot":"","sources":["../../../../../src/rich-text/viewer/testing/rich-text-viewer.pageobject.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,wBAAwB;IACjC,YACqB,qBAAqC;QAArC,0BAAqB,GAArB,qBAAqB,CAAgB;IACvD,CAAC;IAEG,oCAAoC;QACvC,OAAO,IAAI,CAAC,mCAAmC,EAAE,EAAE,WAAW,IAAI,EAAE,CAAC;IACzE,CAAC;IAEM,qCAAqC,CAAC,SAAiB;QAC1D,OAAO,CACH,IAAI,CAAC,mCAAmC,EAAE,EAAE,YAAY,CACpD,SAAS,CACZ,IAAI,EAAE,CACV,CAAC;IACN,CAAC;IAED;;;OAGG;IACI,2BAA2B;QAC9B,OAAO,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,0BAA0B,EAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAC3D,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,0CAA0C;QAC7C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAE1D,MAAM,WAAW,GAAG,CAAC,IAAU,EAAQ,EAAE;YACrC,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE;gBACrC,MAAM,EAAE,GAAG,IAAe,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;gBAE1B,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAEnC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;aACnC;QACL,CAAC,CAAC;QAEF,IAAI,eAAe,EAAE;YACjB,WAAW,CAAC,eAAe,CAAC,CAAC;SAChC;QAED,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED;;;OAGG;IACI,+BAA+B;QAClC,OAAO,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,0BAA0B,EAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAC3D;aACI,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;aAC3C,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAEM,kCAAkC,CAAC,SAAiB;QACvD,OAAO,KAAK,CAAC,IAAI,CACb,IAAI,CAAC,0BAA0B,EAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAC3D;aACI,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;aAC3C,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAEO,0BAA0B;QAC9B,OAAO,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAC3E,CAAC;IAEO,mCAAmC;QACvC,IAAI,WAAW,GAAG,IAAI,CAAC,0BAA0B,EAAE,EAAE,gBAAgB,CAAC;QAEtE,OAAO,WAAW,EAAE,gBAAgB,EAAE;YAClC,WAAW,GAAG,WAAW,EAAE,gBAAgB,CAAC;SAC/C;QACD,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export interface MentionInternalsOptions {
|
|
2
2
|
readonly icon: string;
|
|
3
3
|
readonly character: string;
|
|
4
|
+
readonly viewElement: string;
|
|
4
5
|
}
|
|
5
6
|
/**
|
|
6
7
|
* Internal mention state
|
|
@@ -26,5 +27,9 @@ export declare class MentionInternals<TMentionConfig> {
|
|
|
26
27
|
* Character to show respective mention list
|
|
27
28
|
*/
|
|
28
29
|
readonly character: string;
|
|
30
|
+
/**
|
|
31
|
+
* Mention view element to render in rich text components
|
|
32
|
+
*/
|
|
33
|
+
readonly viewElement: string;
|
|
29
34
|
constructor(options: MentionInternalsOptions);
|
|
30
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mention-internals.js","sourceRoot":"","sources":["../../../../../src/rich-text-mention/base/models/mention-internals.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"mention-internals.js","sourceRoot":"","sources":["../../../../../src/rich-text-mention/base/models/mention-internals.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAQrD;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAiCzB,YAAmB,OAAgC;QA1BnD;;WAEG;QAEI,uBAAkB,GAAG,IAAI,CAAC;QAuB7B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAC3C,CAAC;CACJ;AAjCG;IADC,UAAU;uDAC2B;AAMtC;IADC,UAAU;4DACsB"}
|
|
@@ -5,6 +5,7 @@ import { template } from '../base/template';
|
|
|
5
5
|
import { iconAtTag } from '../../icons/at';
|
|
6
6
|
import { MappingUser } from '../../mapping/user';
|
|
7
7
|
import { RichTextMentionUsersValidator } from './models/rich-text-mention-users-validator';
|
|
8
|
+
import { richTextMentionUsersViewTag } from './view';
|
|
8
9
|
/**
|
|
9
10
|
* Rich Text user mention configuration element which will have MappingMentionUser elements as children
|
|
10
11
|
*/
|
|
@@ -15,7 +16,8 @@ export class RichTextMentionUsers extends RichTextMention {
|
|
|
15
16
|
getMentionInternalsOptions() {
|
|
16
17
|
return {
|
|
17
18
|
icon: iconAtTag,
|
|
18
|
-
character: '@'
|
|
19
|
+
character: '@',
|
|
20
|
+
viewElement: richTextMentionUsersViewTag
|
|
19
21
|
};
|
|
20
22
|
}
|
|
21
23
|
createMentionConfig(mappingConfigs) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/rich-text-mention/users/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAEH,eAAe,EAElB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/rich-text-mention/users/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAEH,eAAe,EAElB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAC3F,OAAO,EAAE,2BAA2B,EAAE,MAAM,QAAQ,CAAC;AAQrD;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,eAGzC;IACsB,eAAe;QAC9B,OAAO,IAAI,6BAA6B,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACpE,CAAC;IAEkB,0BAA0B;QACzC,OAAO;YACH,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,GAAG;YACd,WAAW,EAAE,2BAA2B;SAC3C,CAAC;IACN,CAAC;IAEkB,mBAAmB,CAClC,cAA8B;QAE9B,OAAO;YACH,cAAc;SACjB,CAAC;IACN,CAAC;IAES,mBAAmB,CACzB,OAAgC;QAEhC,IAAI,OAAO,YAAY,WAAW,EAAE;YAChC,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;SAClE;QACD,+EAA+E;QAC/E,mEAAmE;QACnE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC3C,CAAC;CACJ;AACD,MAAM,0BAA0B,GAAG,oBAAoB,CAAC,OAAO,CAAC;IAC5D,QAAQ,EAAE,yBAAyB;IACnC,QAAQ;CACX,CAAC,CAAC;AAEH,YAAY,CAAC,WAAW,EAAE;KACrB,UAAU,CAAC,QAAQ,CAAC;KACpB,QAAQ,CAAC,0BAA0B,EAAE,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ni/nimble-components",
|
|
3
|
-
"version": "20.14.
|
|
3
|
+
"version": "20.14.9",
|
|
4
4
|
"description": "Styled web components for the NI Nimble Design System",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "npm run generate-icons && npm run build-components && npm run bundle-components && npm run generate-scss && npm run build-storybook",
|