diff --git a/app/client/models/DataRowModel.ts b/app/client/models/DataRowModel.ts index 16e686a2..3537cc4e 100644 --- a/app/client/models/DataRowModel.ts +++ b/app/client/models/DataRowModel.ts @@ -5,7 +5,7 @@ import * as DataTableModel from 'app/client/models/DataTableModel'; import { IRowModel } from 'app/client/models/DocModel'; import { ValidationRec } from 'app/client/models/entities/ValidationRec'; import * as modelUtil from 'app/client/models/modelUtil'; -import { ColValues } from 'app/common/DocActions'; +import { CellValue, ColValues } from 'app/common/DocActions'; import * as ko from 'knockout'; /** @@ -16,7 +16,7 @@ export class DataRowModel extends BaseRowModel { // Instances of this class are indexable, but that is a little awkward to type. // The cells field gives typed access to that aspect of the instance. This is a // bit hacky, and should be cleaned up when BaseRowModel is ported to typescript. - public readonly cells: {[key: string]: modelUtil.KoSaveableObservable} = this as any; + public readonly cells: {[key: string]: modelUtil.KoSaveableObservable} = this as any; public _validationFailures: ko.PureComputed>>; public _isAddRow: ko.Observable; diff --git a/app/client/widgets/ChoiceListCell.ts b/app/client/widgets/ChoiceListCell.ts index a7f8bf2a..7b4b4a92 100644 --- a/app/client/widgets/ChoiceListCell.ts +++ b/app/client/widgets/ChoiceListCell.ts @@ -1,6 +1,7 @@ import {DataRowModel} from 'app/client/models/DataRowModel'; import {colors} from 'app/client/ui2018/cssVars'; import {ChoiceTextBox} from 'app/client/widgets/ChoiceTextBox'; +import {CellValue} from 'app/common/DocActions'; import {decodeObject} from 'app/plugin/objtypes'; import {Computed, dom, styled} from 'grainjs'; @@ -17,7 +18,9 @@ export class ChoiceListCell extends ChoiceTextBox { dom.cls('field_clip'), cssChoiceList.cls('-wrap', this.wrapping), dom.style('justify-content', this.alignment), - dom.domComputed((use) => use(row._isAddRow) ? null : [use(value), use(this._choiceSet)], (input) => { + dom.domComputed((use) => { + return use(row._isAddRow) ? null : [use(value), use(this._choiceSet)] as [CellValue, Set]; + }, (input) => { if (!input) { return null; } const [rawValue, choiceSet] = input; const val = decodeObject(rawValue); @@ -27,7 +30,7 @@ export class ChoiceListCell extends ChoiceTextBox { return tokens.map(token => cssToken( String(token), - cssInvalidToken.cls('-invalid', !choiceSet.has(token)) + cssInvalidToken.cls('-invalid', !choiceSet.has(token as string)) ) ); }), diff --git a/app/client/widgets/HyperLinkTextBox.ts b/app/client/widgets/HyperLinkTextBox.ts index fe1020ac..76610afd 100644 --- a/app/client/widgets/HyperLinkTextBox.ts +++ b/app/client/widgets/HyperLinkTextBox.ts @@ -1,3 +1,4 @@ +import {CellValue} from 'app/common/DocActions'; import {DataRowModel} from 'app/client/models/DataRowModel'; import {ViewFieldRec} from 'app/client/models/entities/ViewFieldRec'; import {colors, testId} from 'app/client/ui2018/cssVars'; @@ -20,7 +21,7 @@ export class HyperLinkTextBox extends NTextBox { return cssFieldClip( dom.style('text-align', this.alignment), dom.cls('text_wrapping', this.wrapping), - dom.maybe(value, () => + dom.maybe((use) => Boolean(use(value)), () => dom('a', dom.attr('href', (use) => _constructUrl(use(value))), dom.attr('target', '_blank'), @@ -40,7 +41,7 @@ export class HyperLinkTextBox extends NTextBox { /** * Formats value like `foo bar baz` by discarding `baz` and returning `foo bar`. */ -function _formatValue(value: string|null|undefined): string { +function _formatValue(value: CellValue): string { if (typeof value !== 'string') { return ''; } const index = value.lastIndexOf(' '); return index >= 0 ? value.slice(0, index) : value; @@ -50,7 +51,8 @@ function _formatValue(value: string|null|undefined): string { * Given value like `foo bar baz`, constructs URL by checking if `baz` is a valid URL and, * if not, prepending `http://`. */ -function _constructUrl(value: string): string { +function _constructUrl(value: CellValue): string { + if (typeof value !== 'string') { return ''; } const url = value.slice(value.lastIndexOf(' ') + 1); try { // Try to construct a valid URL