Skip to content

Commit 12fe137

Browse files
committed
Merge branch 'master' into release
2 parents 88ded1f + af4a596 commit 12fe137

File tree

3 files changed

+86
-5
lines changed

3 files changed

+86
-5
lines changed

README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,19 @@ Examples:
1616
- `INPUT[slider:rating]` will create a slider bound to the metadata field `rating` of this note
1717
- `INPUT[text:taks#completedOn]` will create a text input bound to the metadata field `completedOn` of the note with the name `task`
1818

19-
Be aware that the plugin might do unwanted things when you have multiple files with the same name in your vault.
19+
The plugin also allows further customization with arguments. So the complete syntax looks like this:
20+
```
21+
INPUT[input_type(argument_name(argument_value), argument_name_2, ...):file_name_or_path#metadata_field]
22+
```
23+
24+
#### Input field types
25+
- `slider` a slider from 0 to 100 (custom ranges are on the road map)
26+
- `toggle` a toggle element
27+
- `text` a text field
28+
29+
#### Arguments
30+
- `class(class_name)` adds a css class to the input field
31+
- `addLabels` only for slider, adds labels for the min and max values
2032

2133
### How to install
2234
This plugin is still in **beta**.

src/MarkdownInputField.ts

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ export class MarkdownInputField extends MarkdownRenderChild {
1919
intervalCounter: number;
2020
valueQueue: any[];
2121

22+
arguments: { name: string, value: any }[];
23+
2224
constructor(containerEl: HTMLElement, fullDeclaration: string, plugin: MetaBindPlugin, filePath: string, uid: number) {
2325
super(containerEl);
2426

@@ -33,14 +35,50 @@ export class MarkdownInputField extends MarkdownRenderChild {
3335
this.intervalCounter = 0;
3436
this.limitInterval = window.setInterval(this.incrementInterval.bind(this), 10);
3537

36-
const regExp = new RegExp(/\[.*?\]/);
37-
let declaration = regExp.exec(fullDeclaration)[0];
38+
const declarationRegExp: RegExp = new RegExp(/\[.*?\]/);
39+
let declaration: string = declarationRegExp.exec(fullDeclaration)[0];
3840
declaration = declaration.replace('[', '').replace(']', '');
3941
let declarationParts: string[] = declaration.split(':');
4042
let boundTo: string = declarationParts[1] ?? '';
4143

4244
this.isBound = !!boundTo;
43-
this.inputFieldType = declarationParts[0].toLowerCase();
45+
let inputFieldTypeWithArguments: string = declarationParts[0];
46+
const inputFieldArgumentsRegExp: RegExp = new RegExp(/\(.*\)/);
47+
this.inputFieldType = inputFieldTypeWithArguments.replace(inputFieldArgumentsRegExp, '');
48+
49+
this.arguments = [];
50+
let inputFieldArgumentsRegExpResult = inputFieldArgumentsRegExp.exec(inputFieldTypeWithArguments);
51+
let inputFieldArgumentsString = inputFieldArgumentsRegExpResult ? inputFieldArgumentsRegExpResult[0] : '';
52+
console.log(inputFieldArgumentsString);
53+
if (inputFieldArgumentsString) {
54+
inputFieldArgumentsString = inputFieldArgumentsString.substring(1, inputFieldArgumentsString.length - 1);
55+
let inputFieldArguments: string[] = inputFieldArgumentsString.split(',');
56+
57+
inputFieldArguments = inputFieldArguments.map(x => x.trim());
58+
for (const inputFieldArgument of inputFieldArguments) {
59+
if (inputFieldArgument.startsWith('class')) {
60+
let classArgumentsString: string = inputFieldArgumentsRegExp.exec(inputFieldArgument)[0];
61+
if (!classArgumentsString && classArgumentsString.length >= 2) {
62+
this.error = 'class needs an argument';
63+
return;
64+
}
65+
classArgumentsString = classArgumentsString.substring(1, classArgumentsString.length - 1);
66+
if (!classArgumentsString) {
67+
this.error = 'class argument can not be empty';
68+
return;
69+
}
70+
71+
let inputFieldStyleArgument: { name: string, value: string } = {name: 'class', value: classArgumentsString};
72+
73+
this.arguments.push(inputFieldStyleArgument);
74+
}
75+
76+
if (inputFieldArgument.startsWith('addLabels')) {
77+
this.arguments.push({name: 'labels', value: true});
78+
}
79+
}
80+
}
81+
4482

4583
if (this.isBound) {
4684
let boundToParts = boundTo.split('#');
@@ -75,6 +113,7 @@ export class MarkdownInputField extends MarkdownRenderChild {
75113
this.metaData = plugin.getMetaDataForFile(this.file);
76114
}
77115

116+
78117
// console.log(this, 3)
79118
}
80119

@@ -112,7 +151,7 @@ export class MarkdownInputField extends MarkdownRenderChild {
112151
}
113152

114153
async onload() {
115-
//console.log('load', this);
154+
Logger.logDebug(this);
116155

117156
this.metaData = await this.metaData;
118157

@@ -128,28 +167,54 @@ export class MarkdownInputField extends MarkdownRenderChild {
128167

129168
this.plugin.registerMarkdownInputField(this);
130169

170+
let element: HTMLElement = null;
171+
131172
if (this.inputFieldType === 'toggle') {
132173
const newEl = new ToggleComponent(container);
133174
newEl.setValue(this.getInitialValue());
134175
newEl.onChange(async (value) => {
135176
await this.updateMetaData(value);
136177
});
137178
this.inputElement = newEl;
179+
element = newEl.toggleEl;
138180
} else if (this.inputFieldType === 'slider') {
181+
let minValue = 0;
182+
let maxValue = 100;
183+
184+
let labelArgument = this.arguments.filter(x => x.name === 'labels').first();
185+
if (labelArgument && labelArgument.value === true) {
186+
container.createSpan({text: minValue.toString()});
187+
}
188+
139189
const newEl = new SliderComponent(container);
140190
newEl.setValue(this.getInitialValue());
141191
newEl.onChange(async (value) => {
142192
await this.updateMetaData(value);
143193
});
144194
newEl.setDynamicTooltip();
195+
196+
if (labelArgument && labelArgument.value === true) {
197+
container.createSpan({text: maxValue.toString()});
198+
}
199+
145200
this.inputElement = newEl;
201+
element = newEl.sliderEl;
146202
} else if (this.inputFieldType === 'text') {
147203
const newEl = new TextComponent(container);
148204
newEl.setValue(this.getInitialValue());
149205
newEl.onChange(async (value) => {
150206
await this.updateMetaData(value);
151207
});
152208
this.inputElement = newEl;
209+
element = newEl.inputEl;
210+
}
211+
212+
if (element) {
213+
for (const argument of this.arguments) {
214+
if (argument.name === 'class') {
215+
element.addClass(argument.value);
216+
}
217+
}
153218
}
154219

155220
this.containerEl.empty();

styles.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,7 @@
99
.meta-bind-plugin-error {
1010
color: red;
1111
}
12+
13+
.meta-bind-full-width {
14+
width: 100%;
15+
}

0 commit comments

Comments
 (0)