@ni/nimble-components 28.3.0 → 29.0.0

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.
@@ -13,5 +13,5 @@ export declare class MappingIconConfig extends MappingConfig {
13
13
  readonly severity: IconSeverity;
14
14
  readonly textHidden: boolean;
15
15
  readonly iconTemplate: ViewTemplate<IconView>;
16
- constructor(resolvedIcon: string | undefined, severity: IconSeverity, text: string | undefined, textHidden: boolean);
16
+ constructor(resolvedIcon: string, severity: IconSeverity, text: string | undefined, textHidden: boolean);
17
17
  }
@@ -1,13 +1,6 @@
1
1
  import { html } from '@microsoft/fast-element';
2
2
  import { MappingConfig } from './mapping-config';
3
- // Create an empty template containing only a space because creating a ViewTemplate
4
- // with an empty string throws an exception at runtime.
5
- // prettier-ignore
6
- const emptyTemplate = html ` `;
7
3
  const createIconTemplate = (icon) => {
8
- if (icon === undefined) {
9
- return emptyTemplate;
10
- }
11
4
  return html `
12
5
  <${icon}
13
6
  title="${x => (x.textHidden ? x.text : '')}"
@@ -1 +1 @@
1
- {"version":3,"file":"mapping-icon-config.js","sourceRoot":"","sources":["../../../../../src/table-column/enum-base/models/mapping-icon-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAqB,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjD,mFAAmF;AACnF,uDAAuD;AACvD,kBAAkB;AAClB,MAAM,aAAa,GAAG,IAAI,CAAU,GAAG,CAAC;AAExC,MAAM,kBAAkB,GAAG,CACvB,IAAwB,EACF,EAAE;IACxB,IAAI,IAAI,KAAK,SAAS,EAAE;QACpB,OAAO,aAAa,CAAC;KACxB;IAED,OAAO,IAAI,CAAA;WACJ,IAAI;qBACM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;;0BAE5B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;2BACV,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;wBACzC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;;YAE3B,IAAI;KACX,CAAC;AACN,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAGhD,YACI,YAAgC,EAChB,QAAsB,EACtC,IAAwB,EACR,UAAmB;QAEnC,KAAK,CAAC,IAAI,CAAC,CAAC;QAJI,aAAQ,GAAR,QAAQ,CAAc;QAEtB,eAAU,GAAV,UAAU,CAAS;QAGnC,IAAI,CAAC,YAAY,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC;CACJ","sourcesContent":["import { html, type ViewTemplate } from '@microsoft/fast-element';\nimport type { IconSeverity } from '../../../icon-base/types';\nimport { MappingConfig } from './mapping-config';\n\nexport interface IconView {\n severity: IconSeverity;\n text?: string;\n textHidden: boolean;\n}\n\n// Create an empty template containing only a space because creating a ViewTemplate\n// with an empty string throws an exception at runtime.\n// prettier-ignore\nconst emptyTemplate = html<IconView>` `;\n\nconst createIconTemplate = (\n icon: string | undefined\n): ViewTemplate<IconView> => {\n if (icon === undefined) {\n return emptyTemplate;\n }\n\n return html`\n <${icon}\n title=\"${x => (x.textHidden ? x.text : '')}\"\n role=\"img\"\n aria-label=\"${x => x.text}\"\n aria-hidden=\"${x => (x.textHidden ? 'false' : 'true')}\"\n severity=\"${x => x.severity}\"\n >\n </${icon}>\n `;\n};\n\n/**\n * Mapping configuration corresponding to a icon mapping\n */\nexport class MappingIconConfig extends MappingConfig {\n public readonly iconTemplate: ViewTemplate<IconView>;\n\n public constructor(\n resolvedIcon: string | undefined,\n public readonly severity: IconSeverity,\n text: string | undefined,\n public readonly textHidden: boolean\n ) {\n super(text);\n this.iconTemplate = createIconTemplate(resolvedIcon);\n }\n}\n"]}
1
+ {"version":3,"file":"mapping-icon-config.js","sourceRoot":"","sources":["../../../../../src/table-column/enum-base/models/mapping-icon-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAqB,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjD,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAA0B,EAAE;IAChE,OAAO,IAAI,CAAA;WACJ,IAAI;qBACM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;;0BAE5B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;2BACV,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;wBACzC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;;YAE3B,IAAI;KACX,CAAC;AACN,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAGhD,YACI,YAAoB,EACJ,QAAsB,EACtC,IAAwB,EACR,UAAmB;QAEnC,KAAK,CAAC,IAAI,CAAC,CAAC;QAJI,aAAQ,GAAR,QAAQ,CAAc;QAEtB,eAAU,GAAV,UAAU,CAAS;QAGnC,IAAI,CAAC,YAAY,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC;CACJ","sourcesContent":["import { html, type ViewTemplate } from '@microsoft/fast-element';\nimport type { IconSeverity } from '../../../icon-base/types';\nimport { MappingConfig } from './mapping-config';\n\nexport interface IconView {\n severity: IconSeverity;\n text?: string;\n textHidden: boolean;\n}\n\nconst createIconTemplate = (icon: string): ViewTemplate<IconView> => {\n return html`\n <${icon}\n title=\"${x => (x.textHidden ? x.text : '')}\"\n role=\"img\"\n aria-label=\"${x => x.text}\"\n aria-hidden=\"${x => (x.textHidden ? 'false' : 'true')}\"\n severity=\"${x => x.severity}\"\n >\n </${icon}>\n `;\n};\n\n/**\n * Mapping configuration corresponding to a icon mapping\n */\nexport class MappingIconConfig extends MappingConfig {\n public readonly iconTemplate: ViewTemplate<IconView>;\n\n public constructor(\n resolvedIcon: string,\n public readonly severity: IconSeverity,\n text: string | undefined,\n public readonly textHidden: boolean\n ) {\n super(text);\n this.iconTemplate = createIconTemplate(resolvedIcon);\n }\n}\n"]}
@@ -46,6 +46,9 @@ export class TableColumnMapping extends mixinGroupableColumnAPI(mixinFractionalW
46
46
  }
47
47
  createMappingConfig(mapping) {
48
48
  if (mapping instanceof MappingIcon) {
49
+ if (!mapping.resolvedIcon) {
50
+ throw Error('Unresolved icon');
51
+ }
49
52
  return new MappingIconConfig(mapping.resolvedIcon, mapping.severity, mapping.text, mapping.textHidden);
50
53
  }
51
54
  if (mapping instanceof MappingSpinner) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/table-column/mapping/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { DesignSystem } from '@microsoft/fast-foundation';\nimport { attr } from '@microsoft/fast-element';\nimport {\n MappingConfigs,\n TableColumnEnumBase,\n TableColumnEnumColumnConfig\n} from '../enum-base';\nimport { styles } from '../enum-base/styles';\nimport { template } from '../enum-base/template';\nimport {\n TableColumnSortOperation,\n singleIconColumnWidth,\n defaultMinPixelWidth\n} from '../base/types';\nimport { mixinGroupableColumnAPI } from '../mixins/groupable-column';\nimport { mixinFractionalWidthColumnAPI } from '../mixins/fractional-width-column';\nimport { MappingSpinner } from '../../mapping/spinner';\nimport { MappingIcon } from '../../mapping/icon';\nimport { TableColumnMappingValidator } from './models/table-column-mapping-validator';\nimport type { ColumnInternalsOptions } from '../base/models/column-internals';\nimport { tableColumnMappingGroupHeaderViewTag } from './group-header-view';\nimport { tableColumnMappingCellViewTag } from './cell-view';\nimport type { Mapping } from '../../mapping/base';\nimport type { MappingConfig } from '../enum-base/models/mapping-config';\nimport { MappingIconConfig } from '../enum-base/models/mapping-icon-config';\nimport { MappingSpinnerConfig } from '../enum-base/models/mapping-spinner-config';\nimport { MappingText } from '../../mapping/text';\nimport { MappingTextConfig } from '../enum-base/models/mapping-text-config';\nimport { MappingEmpty } from '../../mapping/empty';\nimport { MappingEmptyConfig } from '../enum-base/models/mapping-empty-config';\nimport { TableColumnMappingWidthMode } from './types';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-table-column-mapping': TableColumnMapping;\n }\n}\n\n/**\n * Table column that maps number, boolean, or string values to an icon, a spinner,\n * text, or an icon/spinner with text.\n */\nexport class TableColumnMapping extends mixinGroupableColumnAPI(\n mixinFractionalWidthColumnAPI(\n TableColumnEnumBase<\n TableColumnEnumColumnConfig,\n TableColumnMappingValidator\n >\n )\n) {\n @attr({ attribute: 'width-mode' })\n public widthMode: TableColumnMappingWidthMode;\n\n public override minPixelWidthChanged(): void {\n if (this.widthMode !== TableColumnMappingWidthMode.iconSize) {\n this.columnInternals.minPixelWidth = this.getConfiguredMinPixelWidth();\n }\n }\n\n protected override getColumnInternalsOptions(): ColumnInternalsOptions<TableColumnMappingValidator> {\n return {\n cellRecordFieldNames: ['value'],\n cellViewTag: tableColumnMappingCellViewTag,\n groupHeaderViewTag: tableColumnMappingGroupHeaderViewTag,\n delegatedEvents: [],\n sortOperation: TableColumnSortOperation.basic,\n validator: new TableColumnMappingValidator()\n };\n }\n\n protected override createColumnConfig(\n mappingConfigs: MappingConfigs\n ): TableColumnEnumColumnConfig {\n return {\n mappingConfigs\n };\n }\n\n protected createMappingConfig(mapping: Mapping<unknown>): MappingConfig {\n if (mapping instanceof MappingIcon) {\n return new MappingIconConfig(\n mapping.resolvedIcon,\n mapping.severity,\n mapping.text,\n mapping.textHidden\n );\n }\n if (mapping instanceof MappingSpinner) {\n return new MappingSpinnerConfig(mapping.text, mapping.textHidden);\n }\n if (mapping instanceof MappingText) {\n return new MappingTextConfig(mapping.text);\n }\n if (mapping instanceof MappingEmpty) {\n return new MappingEmptyConfig(mapping.text);\n }\n // Getting here would indicate a programming error, b/c validation will prevent\n // this function from running when there is an unsupported mapping.\n throw new Error('Unsupported mapping');\n }\n\n private widthModeChanged(): void {\n if (this.widthMode === TableColumnMappingWidthMode.iconSize) {\n this.columnInternals.resizingDisabled = true;\n this.columnInternals.hideHeaderIndicators = true;\n this.columnInternals.pixelWidth = singleIconColumnWidth;\n this.columnInternals.minPixelWidth = singleIconColumnWidth;\n } else {\n this.columnInternals.resizingDisabled = false;\n this.columnInternals.hideHeaderIndicators = false;\n this.columnInternals.pixelWidth = undefined;\n this.columnInternals.minPixelWidth = this.getConfiguredMinPixelWidth();\n }\n }\n\n private getConfiguredMinPixelWidth(): number {\n if (typeof this.minPixelWidth === 'number') {\n return this.minPixelWidth;\n }\n return defaultMinPixelWidth;\n }\n}\n\nconst nimbleTableColumnMapping = TableColumnMapping.compose({\n baseName: 'table-column-mapping',\n template,\n styles\n});\n\nDesignSystem.getOrCreate()\n .withPrefix('nimble')\n .register(nimbleTableColumnMapping());\nexport const tableColumnMappingTag = 'nimble-table-column-mapping';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/table-column/mapping/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { DesignSystem } from '@microsoft/fast-foundation';\nimport { attr } from '@microsoft/fast-element';\nimport {\n MappingConfigs,\n TableColumnEnumBase,\n TableColumnEnumColumnConfig\n} from '../enum-base';\nimport { styles } from '../enum-base/styles';\nimport { template } from '../enum-base/template';\nimport {\n TableColumnSortOperation,\n singleIconColumnWidth,\n defaultMinPixelWidth\n} from '../base/types';\nimport { mixinGroupableColumnAPI } from '../mixins/groupable-column';\nimport { mixinFractionalWidthColumnAPI } from '../mixins/fractional-width-column';\nimport { MappingSpinner } from '../../mapping/spinner';\nimport { MappingIcon } from '../../mapping/icon';\nimport { TableColumnMappingValidator } from './models/table-column-mapping-validator';\nimport type { ColumnInternalsOptions } from '../base/models/column-internals';\nimport { tableColumnMappingGroupHeaderViewTag } from './group-header-view';\nimport { tableColumnMappingCellViewTag } from './cell-view';\nimport type { Mapping } from '../../mapping/base';\nimport type { MappingConfig } from '../enum-base/models/mapping-config';\nimport { MappingIconConfig } from '../enum-base/models/mapping-icon-config';\nimport { MappingSpinnerConfig } from '../enum-base/models/mapping-spinner-config';\nimport { MappingText } from '../../mapping/text';\nimport { MappingTextConfig } from '../enum-base/models/mapping-text-config';\nimport { MappingEmpty } from '../../mapping/empty';\nimport { MappingEmptyConfig } from '../enum-base/models/mapping-empty-config';\nimport { TableColumnMappingWidthMode } from './types';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-table-column-mapping': TableColumnMapping;\n }\n}\n\n/**\n * Table column that maps number, boolean, or string values to an icon, a spinner,\n * text, or an icon/spinner with text.\n */\nexport class TableColumnMapping extends mixinGroupableColumnAPI(\n mixinFractionalWidthColumnAPI(\n TableColumnEnumBase<\n TableColumnEnumColumnConfig,\n TableColumnMappingValidator\n >\n )\n) {\n @attr({ attribute: 'width-mode' })\n public widthMode: TableColumnMappingWidthMode;\n\n public override minPixelWidthChanged(): void {\n if (this.widthMode !== TableColumnMappingWidthMode.iconSize) {\n this.columnInternals.minPixelWidth = this.getConfiguredMinPixelWidth();\n }\n }\n\n protected override getColumnInternalsOptions(): ColumnInternalsOptions<TableColumnMappingValidator> {\n return {\n cellRecordFieldNames: ['value'],\n cellViewTag: tableColumnMappingCellViewTag,\n groupHeaderViewTag: tableColumnMappingGroupHeaderViewTag,\n delegatedEvents: [],\n sortOperation: TableColumnSortOperation.basic,\n validator: new TableColumnMappingValidator()\n };\n }\n\n protected override createColumnConfig(\n mappingConfigs: MappingConfigs\n ): TableColumnEnumColumnConfig {\n return {\n mappingConfigs\n };\n }\n\n protected createMappingConfig(mapping: Mapping<unknown>): MappingConfig {\n if (mapping instanceof MappingIcon) {\n if (!mapping.resolvedIcon) {\n throw Error('Unresolved icon');\n }\n\n return new MappingIconConfig(\n mapping.resolvedIcon,\n mapping.severity,\n mapping.text,\n mapping.textHidden\n );\n }\n if (mapping instanceof MappingSpinner) {\n return new MappingSpinnerConfig(mapping.text, mapping.textHidden);\n }\n if (mapping instanceof MappingText) {\n return new MappingTextConfig(mapping.text);\n }\n if (mapping instanceof MappingEmpty) {\n return new MappingEmptyConfig(mapping.text);\n }\n // Getting here would indicate a programming error, b/c validation will prevent\n // this function from running when there is an unsupported mapping.\n throw new Error('Unsupported mapping');\n }\n\n private widthModeChanged(): void {\n if (this.widthMode === TableColumnMappingWidthMode.iconSize) {\n this.columnInternals.resizingDisabled = true;\n this.columnInternals.hideHeaderIndicators = true;\n this.columnInternals.pixelWidth = singleIconColumnWidth;\n this.columnInternals.minPixelWidth = singleIconColumnWidth;\n } else {\n this.columnInternals.resizingDisabled = false;\n this.columnInternals.hideHeaderIndicators = false;\n this.columnInternals.pixelWidth = undefined;\n this.columnInternals.minPixelWidth = this.getConfiguredMinPixelWidth();\n }\n }\n\n private getConfiguredMinPixelWidth(): number {\n if (typeof this.minPixelWidth === 'number') {\n return this.minPixelWidth;\n }\n return defaultMinPixelWidth;\n }\n}\n\nconst nimbleTableColumnMapping = TableColumnMapping.compose({\n baseName: 'table-column-mapping',\n template,\n styles\n});\n\nDesignSystem.getOrCreate()\n .withPrefix('nimble')\n .register(nimbleTableColumnMapping());\nexport const tableColumnMappingTag = 'nimble-table-column-mapping';\n"]}
@@ -9,7 +9,6 @@ export declare class TableColumnMappingValidator extends TableColumnEnumBaseVali
9
9
  constructor();
10
10
  private static isIconMappingElement;
11
11
  private static isSupportedMappingElement;
12
- private static hasUnresolvedIcon;
13
12
  validate(mappings: Mapping<unknown>[], keyType: MappingKeyType): void;
14
13
  private validateIconNames;
15
14
  private validateNoMissingText;
@@ -25,10 +25,6 @@ export class TableColumnMappingValidator extends TableColumnEnumBaseValidator {
25
25
  || mapping instanceof MappingText
26
26
  || mapping instanceof MappingEmpty);
27
27
  }
28
- static hasUnresolvedIcon(mappingIcon) {
29
- return (typeof mappingIcon.icon === 'string'
30
- && mappingIcon.resolvedIcon === undefined);
31
- }
32
28
  validate(mappings, keyType) {
33
29
  super.validate(mappings, keyType);
34
30
  this.validateMappingTypes(mappings);
@@ -38,7 +34,7 @@ export class TableColumnMappingValidator extends TableColumnEnumBaseValidator {
38
34
  validateIconNames(mappings) {
39
35
  const invalid = mappings
40
36
  .filter(TableColumnMappingValidator.isIconMappingElement)
41
- .some(TableColumnMappingValidator.hasUnresolvedIcon);
37
+ .some(mappingIcon => mappingIcon.resolvedIcon === undefined);
42
38
  this.setConditionValue('invalidIconName', invalid);
43
39
  }
44
40
  validateNoMissingText(mappings) {
@@ -1 +1 @@
1
- {"version":3,"file":"table-column-mapping-validator.js","sourceRoot":"","sources":["../../../../../src/table-column/mapping/models/table-column-mapping-validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EACH,4BAA4B,EAC5B,yBAAyB,EAC5B,MAAM,yDAAyD,CAAC;AAGjE,MAAM,8BAA8B,GAAG;IACnC,GAAG,yBAAyB;IAC5B,wBAAwB;IACxB,iBAAiB;IACjB,kBAAkB;CACZ,CAAC;AAEX;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,4BAEhD;IACG;QACI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC1C,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAC/B,OAAyB;QAEzB,OAAO,OAAO,YAAY,WAAW,CAAC;IAC1C,CAAC;IAEO,MAAM,CAAC,yBAAyB,CACpC,OAAyB;QAEzB,OAAO,CACH,OAAO,YAAY,WAAW;eAC3B,OAAO,YAAY,cAAc;eACjC,OAAO,YAAY,WAAW;eAC9B,OAAO,YAAY,YAAY,CACrC,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,iBAAiB,CAAC,WAAwB;QACrD,OAAO,CACH,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ;eACjC,WAAW,CAAC,YAAY,KAAK,SAAS,CAC5C,CAAC;IACN,CAAC;IAEe,QAAQ,CACpB,QAA4B,EAC5B,OAAuB;QAEvB,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAEO,iBAAiB,CAAC,QAA4B;QAClD,MAAM,OAAO,GAAG,QAAQ;aACnB,MAAM,CAAC,2BAA2B,CAAC,oBAAoB,CAAC;aACxD,IAAI,CAAC,2BAA2B,CAAC,iBAAiB,CAAC,CAAC;QACzD,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAEO,qBAAqB,CAAC,QAA4B;QACtD,MAAM,OAAO,GAAG,QAAQ;aACnB,MAAM,CAAC,2BAA2B,CAAC,yBAAyB,CAAC;aAC7D,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAEO,oBAAoB,CAAC,QAA4B;QACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CACxB,2BAA2B,CAAC,yBAAyB,CACxD,CAAC;QACF,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;CACJ","sourcesContent":["import type { Mapping } from '../../../mapping/base';\nimport { MappingEmpty } from '../../../mapping/empty';\nimport { MappingIcon } from '../../../mapping/icon';\nimport { MappingSpinner } from '../../../mapping/spinner';\nimport { MappingText } from '../../../mapping/text';\nimport {\n TableColumnEnumBaseValidator,\n enumBaseValidityFlagNames\n} from '../../enum-base/models/table-column-enum-base-validator';\nimport type { MappingKeyType } from '../../enum-base/types';\n\nconst mappingColumnValidityFlagNames = [\n ...enumBaseValidityFlagNames,\n 'unsupportedMappingType',\n 'invalidIconName',\n 'missingTextValue'\n] as const;\n\n/**\n * Validator for TableColumnMapping\n */\nexport class TableColumnMappingValidator extends TableColumnEnumBaseValidator<\n typeof mappingColumnValidityFlagNames\n> {\n public constructor() {\n super(mappingColumnValidityFlagNames);\n }\n\n private static isIconMappingElement(\n mapping: Mapping<unknown>\n ): mapping is MappingIcon {\n return mapping instanceof MappingIcon;\n }\n\n private static isSupportedMappingElement(\n mapping: Mapping<unknown>\n ): mapping is MappingIcon | MappingSpinner | MappingText | MappingEmpty {\n return (\n mapping instanceof MappingIcon\n || mapping instanceof MappingSpinner\n || mapping instanceof MappingText\n || mapping instanceof MappingEmpty\n );\n }\n\n private static hasUnresolvedIcon(mappingIcon: MappingIcon): boolean {\n return (\n typeof mappingIcon.icon === 'string'\n && mappingIcon.resolvedIcon === undefined\n );\n }\n\n public override validate(\n mappings: Mapping<unknown>[],\n keyType: MappingKeyType\n ): void {\n super.validate(mappings, keyType);\n this.validateMappingTypes(mappings);\n this.validateIconNames(mappings);\n this.validateNoMissingText(mappings);\n }\n\n private validateIconNames(mappings: Mapping<unknown>[]): void {\n const invalid = mappings\n .filter(TableColumnMappingValidator.isIconMappingElement)\n .some(TableColumnMappingValidator.hasUnresolvedIcon);\n this.setConditionValue('invalidIconName', invalid);\n }\n\n private validateNoMissingText(mappings: Mapping<unknown>[]): void {\n const invalid = mappings\n .filter(TableColumnMappingValidator.isSupportedMappingElement)\n .some(mapping => mapping.text === undefined);\n this.setConditionValue('missingTextValue', invalid);\n }\n\n private validateMappingTypes(mappings: Mapping<unknown>[]): void {\n const valid = mappings.every(\n TableColumnMappingValidator.isSupportedMappingElement\n );\n this.setConditionValue('unsupportedMappingType', !valid);\n }\n}\n"]}
1
+ {"version":3,"file":"table-column-mapping-validator.js","sourceRoot":"","sources":["../../../../../src/table-column/mapping/models/table-column-mapping-validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EACH,4BAA4B,EAC5B,yBAAyB,EAC5B,MAAM,yDAAyD,CAAC;AAGjE,MAAM,8BAA8B,GAAG;IACnC,GAAG,yBAAyB;IAC5B,wBAAwB;IACxB,iBAAiB;IACjB,kBAAkB;CACZ,CAAC;AAEX;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,4BAEhD;IACG;QACI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC1C,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAC/B,OAAyB;QAEzB,OAAO,OAAO,YAAY,WAAW,CAAC;IAC1C,CAAC;IAEO,MAAM,CAAC,yBAAyB,CACpC,OAAyB;QAEzB,OAAO,CACH,OAAO,YAAY,WAAW;eAC3B,OAAO,YAAY,cAAc;eACjC,OAAO,YAAY,WAAW;eAC9B,OAAO,YAAY,YAAY,CACrC,CAAC;IACN,CAAC;IAEe,QAAQ,CACpB,QAA4B,EAC5B,OAAuB;QAEvB,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAEO,iBAAiB,CAAC,QAA4B;QAClD,MAAM,OAAO,GAAG,QAAQ;aACnB,MAAM,CAAC,2BAA2B,CAAC,oBAAoB,CAAC;aACxD,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAEO,qBAAqB,CAAC,QAA4B;QACtD,MAAM,OAAO,GAAG,QAAQ;aACnB,MAAM,CAAC,2BAA2B,CAAC,yBAAyB,CAAC;aAC7D,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAEO,oBAAoB,CAAC,QAA4B;QACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CACxB,2BAA2B,CAAC,yBAAyB,CACxD,CAAC;QACF,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;CACJ","sourcesContent":["import type { Mapping } from '../../../mapping/base';\nimport { MappingEmpty } from '../../../mapping/empty';\nimport { MappingIcon } from '../../../mapping/icon';\nimport { MappingSpinner } from '../../../mapping/spinner';\nimport { MappingText } from '../../../mapping/text';\nimport {\n TableColumnEnumBaseValidator,\n enumBaseValidityFlagNames\n} from '../../enum-base/models/table-column-enum-base-validator';\nimport type { MappingKeyType } from '../../enum-base/types';\n\nconst mappingColumnValidityFlagNames = [\n ...enumBaseValidityFlagNames,\n 'unsupportedMappingType',\n 'invalidIconName',\n 'missingTextValue'\n] as const;\n\n/**\n * Validator for TableColumnMapping\n */\nexport class TableColumnMappingValidator extends TableColumnEnumBaseValidator<\n typeof mappingColumnValidityFlagNames\n> {\n public constructor() {\n super(mappingColumnValidityFlagNames);\n }\n\n private static isIconMappingElement(\n mapping: Mapping<unknown>\n ): mapping is MappingIcon {\n return mapping instanceof MappingIcon;\n }\n\n private static isSupportedMappingElement(\n mapping: Mapping<unknown>\n ): mapping is MappingIcon | MappingSpinner | MappingText | MappingEmpty {\n return (\n mapping instanceof MappingIcon\n || mapping instanceof MappingSpinner\n || mapping instanceof MappingText\n || mapping instanceof MappingEmpty\n );\n }\n\n public override validate(\n mappings: Mapping<unknown>[],\n keyType: MappingKeyType\n ): void {\n super.validate(mappings, keyType);\n this.validateMappingTypes(mappings);\n this.validateIconNames(mappings);\n this.validateNoMissingText(mappings);\n }\n\n private validateIconNames(mappings: Mapping<unknown>[]): void {\n const invalid = mappings\n .filter(TableColumnMappingValidator.isIconMappingElement)\n .some(mappingIcon => mappingIcon.resolvedIcon === undefined);\n this.setConditionValue('invalidIconName', invalid);\n }\n\n private validateNoMissingText(mappings: Mapping<unknown>[]): void {\n const invalid = mappings\n .filter(TableColumnMappingValidator.isSupportedMappingElement)\n .some(mapping => mapping.text === undefined);\n this.setConditionValue('missingTextValue', invalid);\n }\n\n private validateMappingTypes(mappings: Mapping<unknown>[]): void {\n const valid = mappings.every(\n TableColumnMappingValidator.isSupportedMappingElement\n );\n this.setConditionValue('unsupportedMappingType', !valid);\n }\n}\n"]}
@@ -70,9 +70,11 @@ export class Computations {
70
70
  // this scale is used for positioning the dies on the canvas
71
71
  this._verticalScale = this.createVerticalScale(originLocation, gridDimensions, containerDiameter);
72
72
  this._invertedVerticalScale = this.createInvertedVerticalScale(originLocation, gridDimensions, containerDiameter);
73
+ const dieWidth = this.horizontalScale.bandwidth();
74
+ const dieHeight = this.verticalScale.bandwidth();
73
75
  this._dieDimensions = {
74
- width: this.horizontalScale.bandwidth(),
75
- height: this.verticalScale.bandwidth()
76
+ width: isNaN(dieWidth) ? 0 : dieWidth,
77
+ height: isNaN(dieHeight) ? 0 : dieHeight
76
78
  };
77
79
  }
78
80
  gridDimensionsValidAndDefined() {
@@ -1 +1 @@
1
- {"version":3,"file":"computations.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/computations.ts"],"names":[],"mappings":"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","sourcesContent":["import { range } from 'd3-array';\nimport { ScaleBand, scaleBand, scaleQuantile, ScaleQuantile } from 'd3-scale';\nimport type { WaferMap } from '..';\nimport type { WaferMapDie } from '../types';\nimport { Dimensions, Margin, WaferMapOriginLocation } from '../types';\n\ninterface GridDimensions {\n origin: {\n x: number,\n y: number\n };\n rows: number;\n cols: number;\n}\n\n/**\n * Computations calculates and stores different measures which are used in the Wafermap\n */\nexport class Computations {\n public get containerDimensions(): Dimensions {\n return this._containerDimensions;\n }\n\n public get dieDimensions(): Dimensions {\n return this._dieDimensions;\n }\n\n public get radius(): number {\n return this._radius;\n }\n\n public get margin(): Margin {\n return this._margin;\n }\n\n public get horizontalScale(): ScaleBand<number> {\n return this._horizontalScale;\n }\n\n public get verticalScale(): ScaleBand<number> {\n return this._verticalScale;\n }\n\n public get invertedHorizontalScale(): ScaleQuantile<number, number> {\n return this._invertedHorizontalScale;\n }\n\n public get invertedVerticalScale(): ScaleQuantile<number, number> {\n return this._invertedVerticalScale;\n }\n\n private _containerDimensions!: Dimensions;\n private _dieDimensions!: Dimensions;\n private _radius!: number;\n private _margin!: Margin;\n private _horizontalScale!: ScaleBand<number>;\n private _verticalScale!: ScaleBand<number>;\n private _invertedHorizontalScale!: ScaleQuantile<number, number>;\n private _invertedVerticalScale!: ScaleQuantile<number, number>;\n private readonly defaultPadding = 0;\n private readonly baseMarginPercentage = 0.04;\n\n public constructor(private readonly wafermap: WaferMap) {}\n\n public updateContainerDimensions(): void {\n const canvasDimensions = {\n width: this.wafermap.canvasWidth,\n height: this.wafermap.canvasHeight\n };\n const canvasDiameter = Math.min(\n canvasDimensions.width,\n canvasDimensions.height\n );\n const canvasMargin = {\n top: (canvasDimensions.height - canvasDiameter) / 2,\n right: (canvasDimensions.width - canvasDiameter) / 2,\n bottom: (canvasDimensions.height - canvasDiameter) / 2,\n left: (canvasDimensions.width - canvasDiameter) / 2\n };\n const baseMargin = {\n top: canvasDiameter * this.baseMarginPercentage,\n right: canvasDiameter * this.baseMarginPercentage,\n bottom: canvasDiameter * this.baseMarginPercentage,\n left: canvasDiameter * this.baseMarginPercentage\n };\n this._margin = this.calculateMarginAddition(baseMargin, canvasMargin);\n this._containerDimensions = this.calculateContainerDimensions(\n canvasDimensions,\n this._margin\n );\n const containerDiameter = Math.min(\n this._containerDimensions.width,\n this._containerDimensions.height\n );\n this._radius = containerDiameter / 2;\n this.updateScales();\n }\n\n public updateScales(): void {\n const containerDiameter = Math.min(\n this._containerDimensions.width,\n this._containerDimensions.height\n );\n const gridDimensions = this.gridDimensionsValidAndDefined()\n ? this.calculateGridDimensionsFromBoundingBox()\n : this.calculateGridDimensionsFromDies(this.wafermap.dies);\n // this scale is used for positioning the dies on the canvas\n const originLocation = this.wafermap.originLocation;\n this._horizontalScale = this.createHorizontalScale(\n originLocation,\n gridDimensions,\n containerDiameter\n );\n this._invertedHorizontalScale = this.createInvertedHorizontalScale(\n originLocation,\n gridDimensions,\n containerDiameter\n );\n // this scale is used for positioning the dies on the canvas\n this._verticalScale = this.createVerticalScale(\n originLocation,\n gridDimensions,\n containerDiameter\n );\n this._invertedVerticalScale = this.createInvertedVerticalScale(\n originLocation,\n gridDimensions,\n containerDiameter\n );\n this._dieDimensions = {\n width: this.horizontalScale.bandwidth(),\n height: this.verticalScale.bandwidth()\n };\n }\n\n private gridDimensionsValidAndDefined(): boolean {\n return (\n !this.wafermap.validity.invalidGridDimensions\n && typeof this.wafermap.gridMinX === 'number'\n && typeof this.wafermap.gridMinY === 'number'\n && typeof this.wafermap.gridMaxX === 'number'\n && typeof this.wafermap.gridMinX === 'number'\n );\n }\n\n private calculateGridDimensionsFromBoundingBox(): GridDimensions {\n const gridDimensions = { origin: { x: 0, y: 0 }, rows: 0, cols: 0 };\n if (\n typeof this.wafermap.gridMaxY === 'number'\n && typeof this.wafermap.gridMinY === 'number'\n && typeof this.wafermap.gridMaxX === 'number'\n && typeof this.wafermap.gridMinX === 'number'\n ) {\n gridDimensions.origin.x = this.wafermap.gridMinX;\n gridDimensions.origin.y = this.wafermap.gridMinY;\n gridDimensions.rows = this.wafermap.gridMaxY - this.wafermap.gridMinY + 1;\n gridDimensions.cols = this.wafermap.gridMaxX - this.wafermap.gridMinX + 1;\n }\n return gridDimensions;\n }\n\n private calculateGridDimensionsFromDies(\n dies: Readonly<Readonly<WaferMapDie>[]>\n ): GridDimensions {\n if (dies.length === 0 || dies[0] === undefined) {\n return { origin: { x: 0, y: 0 }, rows: 0, cols: 0 };\n }\n\n const minPoint = { x: dies[0].x, y: dies[0].y };\n const maxPoint = { x: dies[0].x, y: dies[0].y };\n\n for (const die of dies) {\n if (die.x < minPoint.x) {\n minPoint.x = die.x;\n }\n if (die.y < minPoint.y) {\n minPoint.y = die.y;\n }\n if (die.x > maxPoint.x) {\n maxPoint.x = die.x;\n }\n if (die.y > maxPoint.y) {\n maxPoint.y = die.y;\n }\n }\n\n return {\n origin: minPoint,\n rows: maxPoint.y - minPoint.y + 1,\n cols: maxPoint.x - minPoint.x + 1\n };\n }\n\n private calculateContainerDimensions(\n canvasDimensions: Dimensions,\n margin: Margin\n ): Dimensions {\n return {\n width: canvasDimensions.width - margin.left - margin.right,\n height: canvasDimensions.height - margin.top - margin.bottom\n };\n }\n\n private createHorizontalScale(\n originLocation: WaferMapOriginLocation,\n grid: GridDimensions,\n containerWidth: number\n ): ScaleBand<number> {\n const scale = scaleBand<number>()\n .domain(range(grid.origin.x, grid.origin.x + grid.cols))\n .paddingInner(0)\n .paddingOuter(0)\n .align(0)\n .round(false);\n if (\n originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.topLeft\n ) {\n return scale.range([0, containerWidth]);\n }\n return scale.range([containerWidth, 0]);\n }\n\n private createInvertedHorizontalScale(\n originLocation: WaferMapOriginLocation,\n grid: GridDimensions,\n containerWidth: number\n ): ScaleQuantile<number, number> {\n const scale = scaleQuantile().domain([0, containerWidth]);\n if (\n originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.topLeft\n ) {\n return scale.range(range(grid.origin.x, grid.origin.x + grid.cols));\n }\n return scale.range(\n range(grid.origin.x, grid.origin.x + grid.cols).reverse()\n );\n }\n\n private createVerticalScale(\n originLocation: WaferMapOriginLocation,\n grid: GridDimensions,\n containerHeight: number\n ): ScaleBand<number> {\n const scale = scaleBand<number>()\n .domain(range(grid.origin.y, grid.origin.y + grid.rows))\n .paddingInner(this.defaultPadding)\n .paddingOuter(0)\n .align(0)\n .round(false);\n // html canvas has top-left origin https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes#the_grid\n // we need to flip the vertical scale\n if (\n originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.bottomRight\n ) {\n return scale.range([containerHeight, 0]);\n }\n return scale.range([0, containerHeight]);\n }\n\n private createInvertedVerticalScale(\n originLocation: WaferMapOriginLocation,\n grid: GridDimensions,\n containerHeight: number\n ): ScaleQuantile<number, number> {\n const scale = scaleQuantile().domain([0, containerHeight]);\n // html canvas has top-left origin https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes#the_grid\n // we need to flip the inverted vertical scale\n if (\n originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.bottomRight\n ) {\n return scale.range(\n range(grid.origin.y, grid.origin.y + grid.rows).reverse()\n );\n }\n return scale.range(range(grid.origin.y, grid.origin.y + grid.rows));\n }\n\n private calculateMarginAddition(\n baseMargin: Margin,\n addedMargin: Margin\n ): Margin {\n return {\n top: baseMargin.top + addedMargin.top,\n right: baseMargin.right + addedMargin.right,\n bottom: baseMargin.bottom + addedMargin.bottom,\n left: baseMargin.left + addedMargin.left\n };\n }\n}\n"]}
1
+ {"version":3,"file":"computations.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/computations.ts"],"names":[],"mappings":"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","sourcesContent":["import { range } from 'd3-array';\nimport { ScaleBand, scaleBand, scaleQuantile, ScaleQuantile } from 'd3-scale';\nimport type { WaferMap } from '..';\nimport type { WaferMapDie } from '../types';\nimport { Dimensions, Margin, WaferMapOriginLocation } from '../types';\n\ninterface GridDimensions {\n origin: {\n x: number,\n y: number\n };\n rows: number;\n cols: number;\n}\n\n/**\n * Computations calculates and stores different measures which are used in the Wafermap\n */\nexport class Computations {\n public get containerDimensions(): Dimensions {\n return this._containerDimensions;\n }\n\n public get dieDimensions(): Dimensions {\n return this._dieDimensions;\n }\n\n public get radius(): number {\n return this._radius;\n }\n\n public get margin(): Margin {\n return this._margin;\n }\n\n public get horizontalScale(): ScaleBand<number> {\n return this._horizontalScale;\n }\n\n public get verticalScale(): ScaleBand<number> {\n return this._verticalScale;\n }\n\n public get invertedHorizontalScale(): ScaleQuantile<number, number> {\n return this._invertedHorizontalScale;\n }\n\n public get invertedVerticalScale(): ScaleQuantile<number, number> {\n return this._invertedVerticalScale;\n }\n\n private _containerDimensions!: Dimensions;\n private _dieDimensions!: Dimensions;\n private _radius!: number;\n private _margin!: Margin;\n private _horizontalScale!: ScaleBand<number>;\n private _verticalScale!: ScaleBand<number>;\n private _invertedHorizontalScale!: ScaleQuantile<number, number>;\n private _invertedVerticalScale!: ScaleQuantile<number, number>;\n private readonly defaultPadding = 0;\n private readonly baseMarginPercentage = 0.04;\n\n public constructor(private readonly wafermap: WaferMap) {}\n\n public updateContainerDimensions(): void {\n const canvasDimensions = {\n width: this.wafermap.canvasWidth,\n height: this.wafermap.canvasHeight\n };\n const canvasDiameter = Math.min(\n canvasDimensions.width,\n canvasDimensions.height\n );\n const canvasMargin = {\n top: (canvasDimensions.height - canvasDiameter) / 2,\n right: (canvasDimensions.width - canvasDiameter) / 2,\n bottom: (canvasDimensions.height - canvasDiameter) / 2,\n left: (canvasDimensions.width - canvasDiameter) / 2\n };\n const baseMargin = {\n top: canvasDiameter * this.baseMarginPercentage,\n right: canvasDiameter * this.baseMarginPercentage,\n bottom: canvasDiameter * this.baseMarginPercentage,\n left: canvasDiameter * this.baseMarginPercentage\n };\n this._margin = this.calculateMarginAddition(baseMargin, canvasMargin);\n this._containerDimensions = this.calculateContainerDimensions(\n canvasDimensions,\n this._margin\n );\n const containerDiameter = Math.min(\n this._containerDimensions.width,\n this._containerDimensions.height\n );\n this._radius = containerDiameter / 2;\n this.updateScales();\n }\n\n public updateScales(): void {\n const containerDiameter = Math.min(\n this._containerDimensions.width,\n this._containerDimensions.height\n );\n const gridDimensions = this.gridDimensionsValidAndDefined()\n ? this.calculateGridDimensionsFromBoundingBox()\n : this.calculateGridDimensionsFromDies(this.wafermap.dies);\n // this scale is used for positioning the dies on the canvas\n const originLocation = this.wafermap.originLocation;\n this._horizontalScale = this.createHorizontalScale(\n originLocation,\n gridDimensions,\n containerDiameter\n );\n this._invertedHorizontalScale = this.createInvertedHorizontalScale(\n originLocation,\n gridDimensions,\n containerDiameter\n );\n // this scale is used for positioning the dies on the canvas\n this._verticalScale = this.createVerticalScale(\n originLocation,\n gridDimensions,\n containerDiameter\n );\n this._invertedVerticalScale = this.createInvertedVerticalScale(\n originLocation,\n gridDimensions,\n containerDiameter\n );\n const dieWidth = this.horizontalScale.bandwidth();\n const dieHeight = this.verticalScale.bandwidth();\n this._dieDimensions = {\n width: isNaN(dieWidth) ? 0 : dieWidth,\n height: isNaN(dieHeight) ? 0 : dieHeight\n };\n }\n\n private gridDimensionsValidAndDefined(): boolean {\n return (\n !this.wafermap.validity.invalidGridDimensions\n && typeof this.wafermap.gridMinX === 'number'\n && typeof this.wafermap.gridMinY === 'number'\n && typeof this.wafermap.gridMaxX === 'number'\n && typeof this.wafermap.gridMinX === 'number'\n );\n }\n\n private calculateGridDimensionsFromBoundingBox(): GridDimensions {\n const gridDimensions = { origin: { x: 0, y: 0 }, rows: 0, cols: 0 };\n if (\n typeof this.wafermap.gridMaxY === 'number'\n && typeof this.wafermap.gridMinY === 'number'\n && typeof this.wafermap.gridMaxX === 'number'\n && typeof this.wafermap.gridMinX === 'number'\n ) {\n gridDimensions.origin.x = this.wafermap.gridMinX;\n gridDimensions.origin.y = this.wafermap.gridMinY;\n gridDimensions.rows = this.wafermap.gridMaxY - this.wafermap.gridMinY + 1;\n gridDimensions.cols = this.wafermap.gridMaxX - this.wafermap.gridMinX + 1;\n }\n return gridDimensions;\n }\n\n private calculateGridDimensionsFromDies(\n dies: Readonly<Readonly<WaferMapDie>[]>\n ): GridDimensions {\n if (dies.length === 0 || dies[0] === undefined) {\n return { origin: { x: 0, y: 0 }, rows: 0, cols: 0 };\n }\n\n const minPoint = { x: dies[0].x, y: dies[0].y };\n const maxPoint = { x: dies[0].x, y: dies[0].y };\n\n for (const die of dies) {\n if (die.x < minPoint.x) {\n minPoint.x = die.x;\n }\n if (die.y < minPoint.y) {\n minPoint.y = die.y;\n }\n if (die.x > maxPoint.x) {\n maxPoint.x = die.x;\n }\n if (die.y > maxPoint.y) {\n maxPoint.y = die.y;\n }\n }\n\n return {\n origin: minPoint,\n rows: maxPoint.y - minPoint.y + 1,\n cols: maxPoint.x - minPoint.x + 1\n };\n }\n\n private calculateContainerDimensions(\n canvasDimensions: Dimensions,\n margin: Margin\n ): Dimensions {\n return {\n width: canvasDimensions.width - margin.left - margin.right,\n height: canvasDimensions.height - margin.top - margin.bottom\n };\n }\n\n private createHorizontalScale(\n originLocation: WaferMapOriginLocation,\n grid: GridDimensions,\n containerWidth: number\n ): ScaleBand<number> {\n const scale = scaleBand<number>()\n .domain(range(grid.origin.x, grid.origin.x + grid.cols))\n .paddingInner(0)\n .paddingOuter(0)\n .align(0)\n .round(false);\n if (\n originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.topLeft\n ) {\n return scale.range([0, containerWidth]);\n }\n return scale.range([containerWidth, 0]);\n }\n\n private createInvertedHorizontalScale(\n originLocation: WaferMapOriginLocation,\n grid: GridDimensions,\n containerWidth: number\n ): ScaleQuantile<number, number> {\n const scale = scaleQuantile().domain([0, containerWidth]);\n if (\n originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.topLeft\n ) {\n return scale.range(range(grid.origin.x, grid.origin.x + grid.cols));\n }\n return scale.range(\n range(grid.origin.x, grid.origin.x + grid.cols).reverse()\n );\n }\n\n private createVerticalScale(\n originLocation: WaferMapOriginLocation,\n grid: GridDimensions,\n containerHeight: number\n ): ScaleBand<number> {\n const scale = scaleBand<number>()\n .domain(range(grid.origin.y, grid.origin.y + grid.rows))\n .paddingInner(this.defaultPadding)\n .paddingOuter(0)\n .align(0)\n .round(false);\n // html canvas has top-left origin https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes#the_grid\n // we need to flip the vertical scale\n if (\n originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.bottomRight\n ) {\n return scale.range([containerHeight, 0]);\n }\n return scale.range([0, containerHeight]);\n }\n\n private createInvertedVerticalScale(\n originLocation: WaferMapOriginLocation,\n grid: GridDimensions,\n containerHeight: number\n ): ScaleQuantile<number, number> {\n const scale = scaleQuantile().domain([0, containerHeight]);\n // html canvas has top-left origin https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes#the_grid\n // we need to flip the inverted vertical scale\n if (\n originLocation === WaferMapOriginLocation.bottomLeft\n || originLocation === WaferMapOriginLocation.bottomRight\n ) {\n return scale.range(\n range(grid.origin.y, grid.origin.y + grid.rows).reverse()\n );\n }\n return scale.range(range(grid.origin.y, grid.origin.y + grid.rows));\n }\n\n private calculateMarginAddition(\n baseMargin: Margin,\n addedMargin: Margin\n ): Margin {\n return {\n top: baseMargin.top + addedMargin.top,\n right: baseMargin.right + addedMargin.right,\n bottom: baseMargin.bottom + addedMargin.bottom,\n left: baseMargin.left + addedMargin.left\n };\n }\n}\n"]}
@@ -61,6 +61,10 @@ export class WorkerRenderer {
61
61
  this.renderHover();
62
62
  }
63
63
  renderHover() {
64
+ if (this.wafermap.experimentalDataManager.dieDimensions === undefined
65
+ || this.wafermap.transform === undefined) {
66
+ return;
67
+ }
64
68
  this.wafermap.hoverWidth = this.wafermap.experimentalDataManager.dieDimensions.width
65
69
  * this.wafermap.transform.k;
66
70
  this.wafermap.hoverHeight = this.wafermap.experimentalDataManager.dieDimensions.height
@@ -1 +1 @@
1
- {"version":3,"file":"worker-renderer.js","sourceRoot":"","sources":["../../../../../src/wafer-map/modules/experimental/worker-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGjE;;GAEG;AACH,MAAM,OAAO,cAAc;IAGvB,YAAoC,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IAEnD,KAAK,CAAC,UAAU;QACnB,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE;YACnC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAC;YACxD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;YACrC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,0BAA0B,EAAE,CAAC;YAChF,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAC/B,QAAQ,CAAC,eAAe,EAAE,CAAC,eAAe,CAAC,CAAC,CAC/C,CAAC;SACL;QAED,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC;YACrC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC;SAC1C,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CACvC,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CACtD,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC,CAAE;cAClE,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC,CAAE,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAE;cAChE,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAE,CAAC;QAC9D,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAC9B,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC,CAAE,EACzD,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC,CAAE,CAC1D,CAAC;QACF,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAC/B,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,MAAM,CAC/C,CAAC;QAEF,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE;YACvC,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAChE,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7D,OAAO;SACV;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS;aACxC,QAAQ,CAAC,UAAU,CAAE;aACrB,OAAO,EAAE,CAAC;QACf,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAE1D,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS;aACrC,QAAQ,CAAC,UAAU,CAAE;aACrB,OAAO,EAAE,CAAC;QACf,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAEM,KAAK,CAAC,SAAS;QAClB,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAChE,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,uBAAuB,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC;YAC3D,IAAI,CAAC,QAAQ,CAAC,WAAW;YACzB,IAAI,CAAC,QAAQ,CAAC,YAAY;SAC7B,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CACtC;YACI,CAAC,EACG,mBAAmB,CAAC,CAAC,CAAC;kBACpB,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,KAAK;YAC/D,CAAC,EACG,mBAAmB,CAAC,CAAC,CAAC;kBACpB,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,MAAM;SACnE,EACD;YACI,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC;YAC7B,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC;SAChC,CACJ,CAAC;QACF,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,WAAW;QACd,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,KAAK;cAC9E,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,MAAM;cAChF,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS;YAC7D,CAAC,CAAC,eAAe,CAAC,IAAI;YACtB,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;IAClE,CAAC;IAEO,uBAAuB;QAC3B,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,eAAe,CACjE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAC3B,CAAC;YACF,IAAI,OAAO,KAAK,SAAS,EAAE;gBACvB,OAAO,EAAE,CAAC;aACb;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CAC/D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAC3B,CAAC;YACF,IAAI,OAAO,KAAK,SAAS,EAAE;gBACvB,OAAO,EAAE,CAAC;aACb;YACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;gBACnD,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI;gBAC3D,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,MAAM,CAAC,GAAG;aAC7D,CAAC,CAAC;YACH,OAAO,aAAa,gBAAgB,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC;SACtE;QACD,OAAO,EAAE,CAAC;IACd,CAAC;CACJ","sourcesContent":["import { type Remote, transfer } from 'comlink';\nimport type { WaferMap } from '../..';\nimport { HoverDieOpacity } from '../../types';\nimport { createMatrixRenderer } from '../create-matrix-renderer';\nimport type { MatrixRenderer } from '../../../../build/generate-workers/dist/esm/source/matrix-renderer';\n\n/**\n * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas\n */\nexport class WorkerRenderer {\n private matrixRenderer!: Remote<MatrixRenderer>;\n\n public constructor(private readonly wafermap: WaferMap) {}\n\n public async setupWafer(): Promise<void> {\n if (this.matrixRenderer === undefined) {\n const { matrixRenderer } = await createMatrixRenderer();\n this.matrixRenderer = matrixRenderer;\n const offscreenCanvas = this.wafermap.workerCanvas.transferControlToOffscreen();\n await this.matrixRenderer.setCanvas(\n transfer(offscreenCanvas, [offscreenCanvas])\n );\n }\n\n await this.matrixRenderer.setCanvasDimensions({\n width: this.wafermap.canvasWidth ?? 0,\n height: this.wafermap.canvasHeight ?? 0\n });\n await this.matrixRenderer.setDiesDimensions(\n this.wafermap.experimentalDataManager.dieDimensions\n );\n const scaleX = this.wafermap.experimentalDataManager.horizontalScale(1)!\n - this.wafermap.experimentalDataManager.horizontalScale(0)!;\n const scaleY = this.wafermap.experimentalDataManager.verticalScale(1)!\n - this.wafermap.experimentalDataManager.verticalScale(0)!;\n await this.matrixRenderer.setScaling(scaleX, scaleY);\n await this.matrixRenderer.setBases(\n this.wafermap.experimentalDataManager.horizontalScale(0)!,\n this.wafermap.experimentalDataManager.verticalScale(0)!\n );\n await this.matrixRenderer.setMargin(\n this.wafermap.experimentalDataManager.margin\n );\n\n if (this.wafermap.diesTable === undefined) {\n await this.matrixRenderer.setColumnIndexes(Int32Array.from([]));\n await this.matrixRenderer.setRowIndexes(Int32Array.from([]));\n return;\n }\n\n const columnIndexes = this.wafermap.diesTable\n .getChild('colIndex')!\n .toArray();\n await this.matrixRenderer.setColumnIndexes(columnIndexes);\n\n const rowIndexes = this.wafermap.diesTable\n .getChild('rowIndex')!\n .toArray();\n await this.matrixRenderer.setRowIndexes(rowIndexes);\n }\n\n public async drawWafer(): Promise<void> {\n await this.matrixRenderer.setTransform(this.wafermap.transform);\n const topLeftCanvasCorner = this.wafermap.transform.invert([0, 0]);\n const bottomRightCanvasCorner = this.wafermap.transform.invert([\n this.wafermap.canvasWidth,\n this.wafermap.canvasHeight\n ]);\n await this.matrixRenderer.setCanvasCorners(\n {\n x:\n topLeftCanvasCorner[0]\n - this.wafermap.experimentalDataManager.dieDimensions.width,\n y:\n topLeftCanvasCorner[1]\n - this.wafermap.experimentalDataManager.dieDimensions.height\n },\n {\n x: bottomRightCanvasCorner[0],\n y: bottomRightCanvasCorner[1]\n }\n );\n await this.matrixRenderer.drawWafer();\n this.renderHover();\n }\n\n public renderHover(): void {\n this.wafermap.hoverWidth = this.wafermap.experimentalDataManager.dieDimensions.width\n * this.wafermap.transform.k;\n this.wafermap.hoverHeight = this.wafermap.experimentalDataManager.dieDimensions.height\n * this.wafermap.transform.k;\n this.wafermap.hoverOpacity = this.wafermap.hoverDie === undefined\n ? HoverDieOpacity.hide\n : HoverDieOpacity.show;\n this.wafermap.hoverTransform = this.calculateHoverTransform();\n }\n\n private calculateHoverTransform(): string {\n if (this.wafermap.hoverDie !== undefined) {\n const scaledX = this.wafermap.experimentalDataManager.horizontalScale(\n this.wafermap.hoverDie.x\n );\n if (scaledX === undefined) {\n return '';\n }\n const scaledY = this.wafermap.experimentalDataManager.verticalScale(\n this.wafermap.hoverDie.y\n );\n if (scaledY === undefined) {\n return '';\n }\n const transformedPoint = this.wafermap.transform.apply([\n scaledX + this.wafermap.experimentalDataManager.margin.left,\n scaledY + this.wafermap.experimentalDataManager.margin.top\n ]);\n return `translate(${transformedPoint[0]}, ${transformedPoint[1]})`;\n }\n return '';\n }\n}\n"]}
1
+ {"version":3,"file":"worker-renderer.js","sourceRoot":"","sources":["../../../../../src/wafer-map/modules/experimental/worker-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Remote, transfer } from 'comlink';\nimport type { WaferMap } from '../..';\nimport { HoverDieOpacity } from '../../types';\nimport { createMatrixRenderer } from '../create-matrix-renderer';\nimport type { MatrixRenderer } from '../../../../build/generate-workers/dist/esm/source/matrix-renderer';\n\n/**\n * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas\n */\nexport class WorkerRenderer {\n private matrixRenderer!: Remote<MatrixRenderer>;\n\n public constructor(private readonly wafermap: WaferMap) {}\n\n public async setupWafer(): Promise<void> {\n if (this.matrixRenderer === undefined) {\n const { matrixRenderer } = await createMatrixRenderer();\n this.matrixRenderer = matrixRenderer;\n const offscreenCanvas = this.wafermap.workerCanvas.transferControlToOffscreen();\n await this.matrixRenderer.setCanvas(\n transfer(offscreenCanvas, [offscreenCanvas])\n );\n }\n\n await this.matrixRenderer.setCanvasDimensions({\n width: this.wafermap.canvasWidth ?? 0,\n height: this.wafermap.canvasHeight ?? 0\n });\n await this.matrixRenderer.setDiesDimensions(\n this.wafermap.experimentalDataManager.dieDimensions\n );\n const scaleX = this.wafermap.experimentalDataManager.horizontalScale(1)!\n - this.wafermap.experimentalDataManager.horizontalScale(0)!;\n const scaleY = this.wafermap.experimentalDataManager.verticalScale(1)!\n - this.wafermap.experimentalDataManager.verticalScale(0)!;\n await this.matrixRenderer.setScaling(scaleX, scaleY);\n await this.matrixRenderer.setBases(\n this.wafermap.experimentalDataManager.horizontalScale(0)!,\n this.wafermap.experimentalDataManager.verticalScale(0)!\n );\n await this.matrixRenderer.setMargin(\n this.wafermap.experimentalDataManager.margin\n );\n\n if (this.wafermap.diesTable === undefined) {\n await this.matrixRenderer.setColumnIndexes(Int32Array.from([]));\n await this.matrixRenderer.setRowIndexes(Int32Array.from([]));\n return;\n }\n\n const columnIndexes = this.wafermap.diesTable\n .getChild('colIndex')!\n .toArray();\n await this.matrixRenderer.setColumnIndexes(columnIndexes);\n\n const rowIndexes = this.wafermap.diesTable\n .getChild('rowIndex')!\n .toArray();\n await this.matrixRenderer.setRowIndexes(rowIndexes);\n }\n\n public async drawWafer(): Promise<void> {\n await this.matrixRenderer.setTransform(this.wafermap.transform);\n const topLeftCanvasCorner = this.wafermap.transform.invert([0, 0]);\n const bottomRightCanvasCorner = this.wafermap.transform.invert([\n this.wafermap.canvasWidth,\n this.wafermap.canvasHeight\n ]);\n await this.matrixRenderer.setCanvasCorners(\n {\n x:\n topLeftCanvasCorner[0]\n - this.wafermap.experimentalDataManager.dieDimensions.width,\n y:\n topLeftCanvasCorner[1]\n - this.wafermap.experimentalDataManager.dieDimensions.height\n },\n {\n x: bottomRightCanvasCorner[0],\n y: bottomRightCanvasCorner[1]\n }\n );\n await this.matrixRenderer.drawWafer();\n this.renderHover();\n }\n\n public renderHover(): void {\n if (\n this.wafermap.experimentalDataManager.dieDimensions === undefined\n || this.wafermap.transform === undefined\n ) {\n return;\n }\n this.wafermap.hoverWidth = this.wafermap.experimentalDataManager.dieDimensions.width\n * this.wafermap.transform.k;\n this.wafermap.hoverHeight = this.wafermap.experimentalDataManager.dieDimensions.height\n * this.wafermap.transform.k;\n this.wafermap.hoverOpacity = this.wafermap.hoverDie === undefined\n ? HoverDieOpacity.hide\n : HoverDieOpacity.show;\n this.wafermap.hoverTransform = this.calculateHoverTransform();\n }\n\n private calculateHoverTransform(): string {\n if (this.wafermap.hoverDie !== undefined) {\n const scaledX = this.wafermap.experimentalDataManager.horizontalScale(\n this.wafermap.hoverDie.x\n );\n if (scaledX === undefined) {\n return '';\n }\n const scaledY = this.wafermap.experimentalDataManager.verticalScale(\n this.wafermap.hoverDie.y\n );\n if (scaledY === undefined) {\n return '';\n }\n const transformedPoint = this.wafermap.transform.apply([\n scaledX + this.wafermap.experimentalDataManager.margin.left,\n scaledY + this.wafermap.experimentalDataManager.margin.top\n ]);\n return `translate(${transformedPoint[0]}, ${transformedPoint[1]})`;\n }\n return '';\n }\n}\n"]}
@@ -29,6 +29,10 @@ export class RenderingModule {
29
29
  this.renderHover();
30
30
  }
31
31
  renderHover() {
32
+ if (this.wafermap.dataManager.dieDimensions === undefined
33
+ || this.wafermap.transform === undefined) {
34
+ return;
35
+ }
32
36
  this.wafermap.hoverWidth = this.wafermap.dataManager.dieDimensions.width
33
37
  * this.wafermap.transform.k;
34
38
  this.wafermap.hoverHeight = this.wafermap.dataManager.dieDimensions.height
@@ -1 +1 @@
1
- {"version":3,"file":"rendering.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/rendering.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WaferMap } from '..';\r\nimport { DieRenderInfo, HoverDieOpacity } from '../types';\r\n\r\n/**\r\n * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas\r\n */\r\nexport class RenderingModule {\r\n private dies!: DieRenderInfo[];\r\n private readonly minDieDim = 50;\r\n\r\n public constructor(private readonly wafermap: WaferMap) {}\r\n\r\n public updateSortedDiesAndDrawWafer(): void {\r\n this.dies = this.wafermap.dataManager.diesRenderInfo.sort((a, b) => {\r\n if (a.fillStyle > b.fillStyle) {\r\n return 1;\r\n }\r\n if (b.fillStyle > a.fillStyle) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n });\r\n this.drawWafer();\r\n }\r\n\r\n public drawWafer(): void {\r\n this.wafermap.canvasContext.save();\r\n this.clearCanvas();\r\n this.scaleCanvas();\r\n this.renderDies();\r\n this.renderText();\r\n this.wafermap.canvasContext.restore();\r\n this.renderHover();\r\n }\r\n\r\n public renderHover(): void {\r\n this.wafermap.hoverWidth = this.wafermap.dataManager.dieDimensions.width\r\n * this.wafermap.transform.k;\r\n this.wafermap.hoverHeight = this.wafermap.dataManager.dieDimensions.height\r\n * this.wafermap.transform.k;\r\n this.wafermap.hoverOpacity = this.wafermap.hoverDie === undefined\r\n ? HoverDieOpacity.hide\r\n : HoverDieOpacity.show;\r\n this.wafermap.hoverTransform = this.calculateHoverTransform();\r\n }\r\n\r\n private calculateHoverTransform(): string {\r\n if (this.wafermap.hoverDie !== undefined) {\r\n const scaledX = this.wafermap.dataManager.horizontalScale(\r\n this.wafermap.hoverDie.x\r\n );\r\n if (scaledX === undefined) {\r\n return '';\r\n }\r\n const scaledY = this.wafermap.dataManager.verticalScale(\r\n this.wafermap.hoverDie.y\r\n );\r\n if (scaledY === undefined) {\r\n return '';\r\n }\r\n const transformedPoint = this.wafermap.transform.apply([\r\n scaledX + this.wafermap.dataManager.margin.left,\r\n scaledY + this.wafermap.dataManager.margin.top\r\n ]);\r\n return `translate(${transformedPoint[0]}, ${transformedPoint[1]})`;\r\n }\r\n return '';\r\n }\r\n\r\n private renderDies(): void {\r\n const context = this.wafermap.canvasContext;\r\n const dieWidth = this.wafermap.dataManager.dieDimensions.width;\r\n const dieHeight = this.wafermap.dataManager.dieDimensions.height;\r\n const transformedCanvasMinPoint = this.wafermap.transform.invert([\r\n 0, 0\r\n ]);\r\n const transformedCanvasMaxPoint = this.wafermap.transform.invert([\r\n this.wafermap.canvas.width,\r\n this.wafermap.canvas.height\r\n ]);\r\n transformedCanvasMinPoint[0] -= dieWidth;\r\n transformedCanvasMinPoint[1] -= dieHeight;\r\n\r\n for (const die of this.dies) {\r\n if (\r\n this.isDieVisible(\r\n die,\r\n transformedCanvasMinPoint,\r\n transformedCanvasMaxPoint\r\n )\r\n ) {\r\n context.fillStyle = die.fillStyle;\r\n context.fillRect(die.x, die.y, dieWidth, dieHeight);\r\n }\r\n }\r\n }\r\n\r\n private renderText(): void {\r\n if (this.wafermap.dieLabelsHidden) {\r\n return;\r\n }\r\n const dieWidth = this.wafermap.dataManager.dieDimensions.width;\r\n const dieHeight = this.wafermap.dataManager.dieDimensions.height;\r\n const dieSize = dieWidth * dieHeight * (this.wafermap.transform.k || 1);\r\n if (dieSize >= this.minDieDim) {\r\n const fontsize = this.wafermap.dataManager.labelsFontSize;\r\n const context = this.wafermap.canvasContext;\r\n context.font = `${fontsize.toString()}px sans-serif`;\r\n context.fillStyle = '#ffffff';\r\n context.textAlign = 'center';\r\n context.lineCap = 'butt';\r\n const approximateTextHeight = context.measureText('M');\r\n\r\n const transformedCanvasMinPoint = this.wafermap.transform.invert([\r\n 0, 0\r\n ]);\r\n const transformedCanvasMaxPoint = this.wafermap.transform.invert([\r\n this.wafermap.canvas.width,\r\n this.wafermap.canvas.height\r\n ]);\r\n transformedCanvasMinPoint[0] -= dieWidth;\r\n transformedCanvasMinPoint[1] -= dieHeight;\r\n\r\n for (const die of this.dies) {\r\n if (\r\n this.isDieVisible(\r\n die,\r\n transformedCanvasMinPoint,\r\n transformedCanvasMaxPoint\r\n )\r\n ) {\r\n context.fillText(\r\n die.text,\r\n die.x + dieWidth / 2,\r\n die.y + dieHeight / 2 + approximateTextHeight.width / 2,\r\n dieWidth - (dieWidth / 100) * 20\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n private clearCanvas(): void {\r\n this.wafermap.canvasContext.clearRect(\r\n 0,\r\n 0,\r\n this.wafermap.canvas.width,\r\n this.wafermap.canvas.height\r\n );\r\n }\r\n\r\n private scaleCanvas(): void {\r\n this.wafermap.canvasContext.translate(\r\n this.wafermap.transform.x,\r\n this.wafermap.transform.y\r\n );\r\n this.wafermap.canvasContext.scale(\r\n this.wafermap.transform.k,\r\n this.wafermap.transform.k\r\n );\r\n }\r\n\r\n private isDieVisible(\r\n die: DieRenderInfo,\r\n minPoint: [number, number],\r\n maxPoint: [number, number]\r\n ): boolean {\r\n return (\r\n die.x >= minPoint[0]\r\n && die.x < maxPoint[0]\r\n && die.y >= minPoint[1]\r\n && die.y < maxPoint[1]\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"rendering.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/rendering.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WaferMap } from '..';\r\nimport { DieRenderInfo, HoverDieOpacity } from '../types';\r\n\r\n/**\r\n * Responsible for drawing the dies inside the wafer map, adding dieText and scaling the canvas\r\n */\r\nexport class RenderingModule {\r\n private dies!: DieRenderInfo[];\r\n private readonly minDieDim = 50;\r\n\r\n public constructor(private readonly wafermap: WaferMap) {}\r\n\r\n public updateSortedDiesAndDrawWafer(): void {\r\n this.dies = this.wafermap.dataManager.diesRenderInfo.sort((a, b) => {\r\n if (a.fillStyle > b.fillStyle) {\r\n return 1;\r\n }\r\n if (b.fillStyle > a.fillStyle) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n });\r\n this.drawWafer();\r\n }\r\n\r\n public drawWafer(): void {\r\n this.wafermap.canvasContext.save();\r\n this.clearCanvas();\r\n this.scaleCanvas();\r\n this.renderDies();\r\n this.renderText();\r\n this.wafermap.canvasContext.restore();\r\n this.renderHover();\r\n }\r\n\r\n public renderHover(): void {\r\n if (\r\n this.wafermap.dataManager.dieDimensions === undefined\r\n || this.wafermap.transform === undefined\r\n ) {\r\n return;\r\n }\r\n this.wafermap.hoverWidth = this.wafermap.dataManager.dieDimensions.width\r\n * this.wafermap.transform.k;\r\n this.wafermap.hoverHeight = this.wafermap.dataManager.dieDimensions.height\r\n * this.wafermap.transform.k;\r\n this.wafermap.hoverOpacity = this.wafermap.hoverDie === undefined\r\n ? HoverDieOpacity.hide\r\n : HoverDieOpacity.show;\r\n this.wafermap.hoverTransform = this.calculateHoverTransform();\r\n }\r\n\r\n private calculateHoverTransform(): string {\r\n if (this.wafermap.hoverDie !== undefined) {\r\n const scaledX = this.wafermap.dataManager.horizontalScale(\r\n this.wafermap.hoverDie.x\r\n );\r\n if (scaledX === undefined) {\r\n return '';\r\n }\r\n const scaledY = this.wafermap.dataManager.verticalScale(\r\n this.wafermap.hoverDie.y\r\n );\r\n if (scaledY === undefined) {\r\n return '';\r\n }\r\n const transformedPoint = this.wafermap.transform.apply([\r\n scaledX + this.wafermap.dataManager.margin.left,\r\n scaledY + this.wafermap.dataManager.margin.top\r\n ]);\r\n return `translate(${transformedPoint[0]}, ${transformedPoint[1]})`;\r\n }\r\n return '';\r\n }\r\n\r\n private renderDies(): void {\r\n const context = this.wafermap.canvasContext;\r\n const dieWidth = this.wafermap.dataManager.dieDimensions.width;\r\n const dieHeight = this.wafermap.dataManager.dieDimensions.height;\r\n const transformedCanvasMinPoint = this.wafermap.transform.invert([\r\n 0, 0\r\n ]);\r\n const transformedCanvasMaxPoint = this.wafermap.transform.invert([\r\n this.wafermap.canvas.width,\r\n this.wafermap.canvas.height\r\n ]);\r\n transformedCanvasMinPoint[0] -= dieWidth;\r\n transformedCanvasMinPoint[1] -= dieHeight;\r\n\r\n for (const die of this.dies) {\r\n if (\r\n this.isDieVisible(\r\n die,\r\n transformedCanvasMinPoint,\r\n transformedCanvasMaxPoint\r\n )\r\n ) {\r\n context.fillStyle = die.fillStyle;\r\n context.fillRect(die.x, die.y, dieWidth, dieHeight);\r\n }\r\n }\r\n }\r\n\r\n private renderText(): void {\r\n if (this.wafermap.dieLabelsHidden) {\r\n return;\r\n }\r\n const dieWidth = this.wafermap.dataManager.dieDimensions.width;\r\n const dieHeight = this.wafermap.dataManager.dieDimensions.height;\r\n const dieSize = dieWidth * dieHeight * (this.wafermap.transform.k || 1);\r\n if (dieSize >= this.minDieDim) {\r\n const fontsize = this.wafermap.dataManager.labelsFontSize;\r\n const context = this.wafermap.canvasContext;\r\n context.font = `${fontsize.toString()}px sans-serif`;\r\n context.fillStyle = '#ffffff';\r\n context.textAlign = 'center';\r\n context.lineCap = 'butt';\r\n const approximateTextHeight = context.measureText('M');\r\n\r\n const transformedCanvasMinPoint = this.wafermap.transform.invert([\r\n 0, 0\r\n ]);\r\n const transformedCanvasMaxPoint = this.wafermap.transform.invert([\r\n this.wafermap.canvas.width,\r\n this.wafermap.canvas.height\r\n ]);\r\n transformedCanvasMinPoint[0] -= dieWidth;\r\n transformedCanvasMinPoint[1] -= dieHeight;\r\n\r\n for (const die of this.dies) {\r\n if (\r\n this.isDieVisible(\r\n die,\r\n transformedCanvasMinPoint,\r\n transformedCanvasMaxPoint\r\n )\r\n ) {\r\n context.fillText(\r\n die.text,\r\n die.x + dieWidth / 2,\r\n die.y + dieHeight / 2 + approximateTextHeight.width / 2,\r\n dieWidth - (dieWidth / 100) * 20\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n private clearCanvas(): void {\r\n this.wafermap.canvasContext.clearRect(\r\n 0,\r\n 0,\r\n this.wafermap.canvas.width,\r\n this.wafermap.canvas.height\r\n );\r\n }\r\n\r\n private scaleCanvas(): void {\r\n this.wafermap.canvasContext.translate(\r\n this.wafermap.transform.x,\r\n this.wafermap.transform.y\r\n );\r\n this.wafermap.canvasContext.scale(\r\n this.wafermap.transform.k,\r\n this.wafermap.transform.k\r\n );\r\n }\r\n\r\n private isDieVisible(\r\n die: DieRenderInfo,\r\n minPoint: [number, number],\r\n maxPoint: [number, number]\r\n ): boolean {\r\n return (\r\n die.x >= minPoint[0]\r\n && die.x < maxPoint[0]\r\n && die.y >= minPoint[1]\r\n && die.y < maxPoint[1]\r\n );\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ni/nimble-components",
3
- "version": "28.3.0",
3
+ "version": "29.0.0",
4
4
  "description": "Styled web components for the NI Nimble Design System",
5
5
  "scripts": {
6
6
  "build": "npm run generate-icons && npm run generate-workers && npm run build-components && npm run bundle-components && npm run generate-scss",