Skip to content
This repository was archived by the owner on Jul 28, 2025. It is now read-only.

Commit 2d1f053

Browse files
committed
Merge branch 'js_sources'
2 parents 1f738b4 + eda0a21 commit 2d1f053

File tree

8 files changed

+107
-27
lines changed

8 files changed

+107
-27
lines changed

src/components/Table.tsx

Lines changed: 47 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import { TableDataType, RowDataType, TableColumn } from "cdm/FolderModel";
2121
import StateManager from "StateManager";
2222
import {
2323
DatabaseLimits,
24+
EMITTERS_GROUPS,
25+
EMITTERS_SHORTCUT,
2426
MetadataColumns,
2527
ResizeConfiguration,
2628
} from "helpers/Constants";
@@ -296,31 +298,53 @@ export function Table(tableData: TableDataType) {
296298
{/* ENDS BODY */}
297299
</div>
298300
{/* INIT FOOTER */}
299-
{configInfo.getLocalSettings().enable_footer ? (
300-
<div key={`div-tfoot`} className={c(`tfoot`)}>
301-
{table
302-
.getFooterGroups()
303-
.map((footerGroup: HeaderGroup<RowDataType>) => {
304-
return (
305-
<div
306-
key={`footer-group-${footerGroup.id}`}
307-
className={`${c("tr footer-group")}`}
308-
>
309-
{footerGroup.headers.map(
310-
(header: Header<RowDataType, TableColumn>) => (
311-
<TableFooter
312-
key={`table-footer-${header.index}`}
313-
table={table}
314-
header={header}
315-
/>
316-
)
317-
)}
318-
</div>
301+
<div key={`div-tfoot`} className={c(`tfoot`)}>
302+
<div className={c(`tr footer-group`)}>
303+
<div
304+
className={c(`td footer`)}
305+
key={`footer-add-row-button`}
306+
onClick={() => {
307+
view.emitter.emit(
308+
EMITTERS_GROUPS.SHORTCUT,
309+
EMITTERS_SHORTCUT.ADD_NEW_ROW
319310
);
320-
})}
321-
{/* ENDS FOOTER */}
311+
}}
312+
>
313+
+
314+
</div>
315+
{Array.from(
316+
Array(table.getFooterGroups()[0].headers.length - 1)
317+
).map((_, index) => (
318+
<div
319+
className={c(`td`)}
320+
key={`footer-add-row-mock-td-${index}`}
321+
/>
322+
))}
322323
</div>
323-
) : null}
324+
{configInfo.getLocalSettings().enable_footer
325+
? table
326+
.getFooterGroups()
327+
.map((footerGroup: HeaderGroup<RowDataType>) => {
328+
return (
329+
<div
330+
key={`footer-group-${footerGroup.id}`}
331+
className={`${c("tr footer-group")}`}
332+
>
333+
{footerGroup.headers.map(
334+
(header: Header<RowDataType, TableColumn>) => (
335+
<TableFooter
336+
key={`table-footer-${header.index}`}
337+
table={table}
338+
header={header}
339+
/>
340+
)
341+
)}
342+
</div>
343+
);
344+
})
345+
: null}
346+
{/* ENDS FOOTER */}
347+
</div>
324348
{/* ENDS TABLE */}
325349
</div>
326350
{/* ENDS SCROLL PANE */}

src/components/modals/filters/handlers/AtomicFilterComponent.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ const AtomicFilterComponent = (props: AtomicFilterComponentProps) => {
3535
const onchangeExistedColumnHandler =
3636
(conditionIndex: number[], level: number) =>
3737
(event: SelectChangeEvent<string>, child: React.ReactNode) => {
38-
console.log("onchangeExistedColumnHandler");
3938
commonModifyFilter(
4039
conditionIndex,
4140
level,

src/helpers/Constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ export const SourceDataTypes = Object.freeze({
291291
OUTGOING_LINK: 'outgoing_link',
292292
INCOMING_LINK: 'incoming_link',
293293
QUERY: 'query',
294+
QUERY_JS: 'query_js',
294295
});
295296

296297
export const CellSizeOptions = Object.freeze({

src/helpers/VaultManagement.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,16 @@ export async function sourceDataviewPages(ddbbConfig: LocalSettings, folderPath:
115115
try {
116116
switch (ddbbConfig.source_data) {
117117
case SourceDataTypes.TAG:
118-
pagesResult = DataviewService.getDataviewAPI().pages(`${ddbbConfig.source_form_result.split(',').join(' OR ')}`);
118+
pagesResult = obtainPagesResult(`${ddbbConfig.source_form_result.split(',').join(' OR ')}`);
119119
break;
120120
case SourceDataTypes.INCOMING_LINK:
121-
pagesResult = DataviewService.getDataviewAPI().pages(`[[${ddbbConfig.source_form_result}]]`);
121+
pagesResult = obtainPagesResult(`[[${ddbbConfig.source_form_result}]]`);
122122
break;
123123
case SourceDataTypes.OUTGOING_LINK:
124-
pagesResult = DataviewService.getDataviewAPI().pages(`outgoing([[${ddbbConfig.source_form_result}]])`);
124+
pagesResult = obtainPagesResult(`outgoing([[${ddbbConfig.source_form_result}]])`);
125+
break;
126+
case SourceDataTypes.QUERY_JS:
127+
pagesResult = obtainPagesResult(ddbbConfig.source_form_result);
125128
break;
126129
case SourceDataTypes.QUERY:
127130
pagesResult = await obtainQueryResult(
@@ -130,6 +133,7 @@ export async function sourceDataviewPages(ddbbConfig: LocalSettings, folderPath:
130133
ddbbConfig.source_form_result)
131134
);
132135
break;
136+
133137
case SourceDataTypes.CURRENT_FOLDER_WITHOUT_SUBFOLDERS:
134138
if (!folderPath || folderPath === '/') {
135139
pagesResult = DataviewService.getDataviewAPI().pages()
@@ -151,6 +155,10 @@ export async function sourceDataviewPages(ddbbConfig: LocalSettings, folderPath:
151155
return pagesResult;
152156
}
153157

158+
function obtainPagesResult(pageQuery: string): DataArray<Record<string, Literal>> {
159+
return DataviewService.getDataviewAPI().pages(pageQuery);
160+
}
161+
154162
async function obtainQueryResult(query: string): Promise<DataArray<Record<string, Literal>>> {
155163
const result = await DataviewService.getDataviewAPI().query(query);
156164
if (!result.successful || result.value.type !== 'table') {

src/lang/locale/en.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export default {
3232
"outgoing_link": "Outgoing link",
3333
"incoming_link": "Incoming link",
3434
"query": "Dataview query",
35+
"query_js": "Dataview query (JS Pages)",
3536
/** COMMAND OPTIONS */
3637
"active_go_next_page": "Go to next page",
3738
"active_go_previous_page": "Go to previous page",
@@ -347,6 +348,12 @@ export default {
347348
"settings_source_form_query_button_tooltip": "Validate query",
348349
"settings_source_form_query_notice_validate": "Dataview query '{0}' is valid!",
349350
"settings_source_form_query_notice_error": "Dataview query '{0}' is invalid: {1}",
351+
"settings_source_form_query_js_title": "Pages dv query",
352+
"settings_source_form_query_js_desc": "Introduce `dv.pages()` content. Check dataview documentation for more info.",
353+
"settings_source_form_query_js_placeholder": "#myTag | `\"myFolderPath\"`",
354+
"settings_source_form_query_js_button_tooltip": "Validate pages content",
355+
"settings_source_form_query_js_notice_validate": "Pages content is valid!",
356+
"settings_source_form_query_js_notice_error": "The content of `dv.pages()` is invalid: {0}",
350357
"settings_source_form_destination_title": "Select destination folder",
351358
"settings_source_form_destination_desc": "Select the destination of new entries for this source",
352359
"settings_source_form_destination_placeholder": "Example: folder1/folder2",

src/lang/locale/es.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export default {
2626
"outgoing_link": "Enlace saliente",
2727
"incoming_link": "Enlace entrante",
2828
"query": "Consulta de Dataview",
29+
"query_js": "Consulta de Dataview (JS Pages)",
2930
/** COMMAND OPTIONS */
3031
"active_go_next_page": "Ir a la página siguiente",
3132
"active_go_previous_page": "Ir a la página anterior",

src/lang/locale/fr.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export default {
2626
"outgoing_link": "Lien sortant",
2727
"incoming_link": "Lien entrant",
2828
"query": "Requête Dataview",
29+
"query_js": "Requête JS Dataview (Pages)",
2930
/** COMMAND OPTIONS */
3031
"active_go_next_page": "Aller à la page suivante",
3132
"active_go_previous_page": "Aller à la page précédente",

src/settings/handlers/source/SourceFormHandler.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ export class SourceFormHandler extends AbstractSettingsHandler {
2929
case SourceDataTypes.QUERY:
3030
this.queryHandler(view, containerEl, columns);
3131
break;
32+
case SourceDataTypes.QUERY_JS:
33+
this.queryJsHandler(view, containerEl);
34+
break;
3235
default:
3336
//Current folder
3437
}
@@ -97,5 +100,41 @@ export class SourceFormHandler extends AbstractSettingsHandler {
97100
});
98101
destinationFolderSetting(view, containerEl);
99102
}
103+
104+
private queryJsHandler(view: DatabaseView, containerEl: HTMLElement) {
105+
const query_promise = async (value: string): Promise<void> => {
106+
if (this.sourceFormResultTimeout) {
107+
clearTimeout(this.sourceFormResultTimeout);
108+
}
109+
this.sourceFormResultTimeout = setTimeout(() => {
110+
// update settings
111+
view.diskConfig.yaml.config.source_form_result = value;
112+
view.diskConfig.updateConfig({ source_form_result: value });
113+
}, 1500);
114+
115+
};
116+
117+
new Setting(containerEl)
118+
.setName(t("settings_source_form_query_js_title"))
119+
.setDesc(t("settings_source_form_query_js_desc"))
120+
.addTextArea((textArea) => {
121+
textArea.inputEl.addClass(c("textarea-setting"));
122+
textArea.setValue(view.diskConfig.yaml.config.source_form_result);
123+
textArea.setPlaceholder(t("settings_source_form_query_js_placeholder"));
124+
textArea.onChange(query_promise);
125+
}).addExtraButton((cb) => {
126+
cb.setIcon("check")
127+
.setTooltip(t("settings_source_form_query_js_button_tooltip"))
128+
.onClick(async (): Promise<void> => {
129+
try {
130+
DataviewService.getDataviewAPI().pages(view.diskConfig.yaml.config.source_form_result);
131+
new Notice(t("settings_source_form_query_js_notice_validate"), 2000);
132+
} catch (e) {
133+
new Notice(t("settings_source_form_query_js_notice_error", e.message), 10000);
134+
}
135+
});
136+
});
137+
destinationFolderSetting(view, containerEl);
138+
}
100139
}
101140

0 commit comments

Comments
 (0)