Skip to content

Commit b3e927d

Browse files
Merge pull request #129 from dbarenholz/feat/character-limit
Feat: Add a character limit to Text and TextArea fields
2 parents 53f706c + 8be8e15 commit b3e927d

File tree

8 files changed

+54
-3
lines changed

8 files changed

+54
-3
lines changed

src/fieldArguments/inputFieldArguments/InputFieldArgumentFactory.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { PlaceholderInputFieldArgument } from './arguments/PlaceholderInputField
1414
import { InputFieldArgumentType } from '../../parsers/inputFieldParser/InputFieldConfigs';
1515
import { UseLinksInputFieldArgument } from './arguments/UseLinksInputFieldArgument';
1616
import { StepSizeValueInputFieldArgument } from './arguments/StepSizeValueInputFieldArgument';
17+
import { LimitInputFieldArgument } from './arguments/LimitInputFieldArgument';
1718

1819
export const INPUT_FIELD_ARGUMENT_MAP = {
1920
[InputFieldArgumentType.CLASS]: ClassInputFieldArgument,
@@ -30,6 +31,7 @@ export const INPUT_FIELD_ARGUMENT_MAP = {
3031
[InputFieldArgumentType.DEFAULT_VALUE]: DefaultValueInputFieldArgument,
3132
[InputFieldArgumentType.PLACEHOLDER]: PlaceholderInputFieldArgument,
3233
[InputFieldArgumentType.USE_LINKS]: UseLinksInputFieldArgument,
34+
[InputFieldArgumentType.LIMIT]: LimitInputFieldArgument,
3335
} as const;
3436

3537
export type InputFieldArgumentMapType<T extends InputFieldArgumentType> = T extends keyof typeof INPUT_FIELD_ARGUMENT_MAP
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { AbstractInputFieldArgument } from '../AbstractInputFieldArgument';
2+
import { type InputFieldArgumentConfig, InputFieldArgumentConfigs } from '../../../parsers/inputFieldParser/InputFieldConfigs';
3+
import { type ParsingResultNode } from '../../../parsers/nomParsers/GeneralParsers';
4+
import { ErrorLevel, MetaBindParsingError } from '../../../utils/errors/MetaBindErrors';
5+
6+
export class LimitInputFieldArgument extends AbstractInputFieldArgument {
7+
value: number | undefined = undefined;
8+
9+
_parseValue(value: ParsingResultNode[]): void {
10+
this.value = Number.parseInt(value[0].value);
11+
if (Number.isNaN(this.value)) {
12+
throw new MetaBindParsingError(
13+
ErrorLevel.WARNING,
14+
'failed to set value for input field argument',
15+
"value of argument 'limit' must be of type number",
16+
);
17+
}
18+
19+
if (this.value <= 0) {
20+
throw new MetaBindParsingError(ErrorLevel.WARNING, 'failed to set value for input field argument', "value of argument 'limit' must be positive");
21+
}
22+
}
23+
24+
public getConfig(): InputFieldArgumentConfig {
25+
return InputFieldArgumentConfigs.limit;
26+
}
27+
}

src/fieldArguments/inputFieldArguments/arguments/StepSizeValueInputFieldArgument.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ export class StepSizeValueInputFieldArgument extends AbstractInputFieldArgument
2121
'failed to set value for input field argument',
2222
"value of argument 'stepSize' must be a positive number",
2323
);
24-
2524
}
2625
}
2726

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
<script lang='ts'>
22
export let value: string;
33
export let placeholder: string;
4+
export let limit: number | undefined;
45
export let onValueChange: (value: string) => void;
56
67
export function setValue(v: string): void {
78
value = v;
89
}
910
</script>
1011

11-
<input type='text' tabindex='0' placeholder={placeholder} bind:value={value} on:input={() => onValueChange(value)}>
12+
<input type='text' tabindex='0' placeholder={placeholder} bind:value={value} maxlength={limit}
13+
on:input={() => onValueChange(value)}>

src/inputFields/_new/fields/Text/TextIPF.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export class TextIPF extends NewAbstractInputField<string, string> {
3333
protected getMountArgs(): Record<string, unknown> {
3434
return {
3535
placeholder: this.renderChild.getArgument(InputFieldArgumentType.PLACEHOLDER)?.value ?? 'Text',
36+
limit: this.renderChild.getArgument(InputFieldArgumentType.LIMIT)?.value,
3637
};
3738
}
3839
}
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
<script lang='ts'>
22
export let value: string;
33
export let placeholder: string;
4+
export let limit: number | undefined;
5+
46
export let onValueChange: (value: string) => void;
57
68
export function setValue(v: string): void {
79
value = v;
810
}
911
</script>
1012

11-
<textarea tabindex='0' placeholder={placeholder} bind:value={value} on:input={() => onValueChange(value)}></textarea>
13+
<textarea tabindex='0' placeholder={placeholder} bind:value={value} maxlength={limit}
14+
on:input={() => onValueChange(value)}></textarea>

src/inputFields/_new/fields/TextArea/TextAreaIPF.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export class TextAreaIPF extends NewAbstractInputField<string, string> {
3333
protected getMountArgs(): Record<string, unknown> {
3434
return {
3535
placeholder: this.renderChild.getArgument(InputFieldArgumentType.PLACEHOLDER)?.value ?? 'Text',
36+
limit: this.renderChild.getArgument(InputFieldArgumentType.LIMIT)?.value,
3637
};
3738
}
3839
}

src/parsers/inputFieldParser/InputFieldConfigs.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export enum InputFieldArgumentType {
4040
DEFAULT_VALUE = 'defaultValue',
4141
PLACEHOLDER = 'placeholder',
4242
USE_LINKS = 'useLinks',
43+
LIMIT = 'limit',
4344

4445
INVALID = 'invalid',
4546
}
@@ -387,4 +388,19 @@ export const InputFieldArgumentConfigs: Record<InputFieldArgumentType, InputFiel
387388
values: [[]],
388389
allowMultiple: true,
389390
},
391+
[InputFieldArgumentType.LIMIT]: {
392+
type: InputFieldArgumentType.LIMIT,
393+
// FIXME: LIST is not yet converted to the newer version, so should still implement the LIMIT argument
394+
allowedFieldTypes: [InputFieldType.TEXT, InputFieldType.TEXT_AREA, InputFieldType.LIST],
395+
values: [
396+
[
397+
{
398+
name: 'value',
399+
allowed: ['number'],
400+
description: 'character limit for text fields',
401+
},
402+
],
403+
],
404+
allowMultiple: false,
405+
},
390406
};

0 commit comments

Comments
 (0)