refactorings of search actions to bulk actions

This commit is contained in:
zadam 2022-06-05 22:32:23 +02:00
parent 4211d0feda
commit 88fa51a34e
16 changed files with 108 additions and 44 deletions

View File

@ -1,27 +1,27 @@
import server from "./server.js"; import server from "./server.js";
import ws from "./ws.js"; import ws from "./ws.js";
import MoveNoteSearchAction from "../widgets/search_actions/move_note.js"; import MoveNoteBulkAction from "../widgets/bulk_actions/move_note.js";
import DeleteNoteSearchAction from "../widgets/search_actions/delete_note.js"; import DeleteNoteBulkAction from "../widgets/bulk_actions/delete_note.js";
import DeleteNoteRevisionsSearchAction from "../widgets/search_actions/delete_note_revisions.js"; import DeleteNoteRevisionsBulkAction from "../widgets/bulk_actions/delete_note_revisions.js";
import DeleteLabelSearchAction from "../widgets/search_actions/delete_label.js"; import DeleteLabelBulkAction from "../widgets/bulk_actions/delete_label.js";
import DeleteRelationSearchAction from "../widgets/search_actions/delete_relation.js"; import DeleteRelationBulkAction from "../widgets/bulk_actions/delete_relation.js";
import RenameLabelSearchAction from "../widgets/search_actions/rename_label.js"; import RenameLabelBulkAction from "../widgets/bulk_actions/rename_label.js";
import RenameRelationSearchAction from "../widgets/search_actions/rename_relation.js"; import RenameRelationBulkAction from "../widgets/bulk_actions/rename_relation.js";
import SetLabelValueSearchAction from "../widgets/search_actions/set_label_value.js"; import SetLabelValueBulkAction from "../widgets/bulk_actions/set_label_value.js";
import SetRelationTargetSearchAction from "../widgets/search_actions/set_relation_target.js"; import SetRelationTargetSearchAction from "../widgets/bulk_actions/set_relation_target.js";
import ExecuteScriptSearchAction from "../widgets/search_actions/execute_script.js"; import ExecuteScriptBulkAction from "../widgets/bulk_actions/execute_script.js";
const ACTION_CLASSES = [ const ACTION_CLASSES = [
MoveNoteSearchAction, MoveNoteBulkAction,
DeleteNoteSearchAction, DeleteNoteBulkAction,
DeleteNoteRevisionsSearchAction, DeleteNoteRevisionsBulkAction,
DeleteLabelSearchAction, DeleteLabelBulkAction,
DeleteRelationSearchAction, DeleteRelationBulkAction,
RenameLabelSearchAction, RenameLabelBulkAction,
RenameRelationSearchAction, RenameRelationBulkAction,
SetLabelValueSearchAction, SetLabelValueBulkAction,
SetRelationTargetSearchAction, SetRelationTargetSearchAction,
ExecuteScriptSearchAction ExecuteScriptBulkAction
]; ];
async function addAction(noteId, actionName) { async function addAction(noteId, actionName) {
@ -65,4 +65,4 @@ export default {
addAction, addAction,
parseActions, parseActions,
ACTION_CLASSES ACTION_CLASSES
}; };

View File

@ -3,7 +3,7 @@ import ws from "../../services/ws.js";
import Component from "../component.js"; import Component from "../component.js";
import utils from "../../services/utils.js"; import utils from "../../services/utils.js";
export default class AbstractSearchAction { export default class AbstractBulkAction {
constructor(attribute, actionDef) { constructor(attribute, actionDef) {
this.attribute = attribute; this.attribute = attribute;
this.actionDef = actionDef; this.actionDef = actionDef;

View File

@ -0,0 +1,65 @@
import SpacedUpdate from "../../services/spaced_update.js";
import AbstractBulkAction from "./abstract_bulk_action.js";
const TPL = `
<tr>
<td colspan="2">
<div style="display: flex; align-items: center">
<div style="margin-right: 10px;" class="text-nowrap">Set label</div>
<input type="text"
class="form-control label-name"
placeholder="label name"
pattern="[\\p{L}\\p{N}_:]+"
title="Alphanumeric characters, underscore and colon are allowed characters."/>
<div style="margin-right: 10px; margin-left: 10px;" class="text-nowrap">to value</div>
<input type="text" class="form-control label-value" placeholder="new value"/>
</div>
</td>
<td class="button-column">
<div class="dropdown help-dropdown">
<span class="bx bx-help-circle icon-action" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></span>
<div class="dropdown-menu dropdown-menu-right p-4">
<p>On all matched notes:</p>
<ul>
<li>create given label if note doesn't have one yet</li>
<li>or change value of the existing label</li>
</ul>
<p>You can also call this method without value, in such case label will be assigned to the note without value.</p>
</div>
</div>
<span class="bx bx-x icon-action action-conf-del"></span>
</td>
</tr>`;
export default class AddLabelBulkAction extends AbstractBulkAction {
static get actionName() { return "setLabelValue"; }
static get actionTitle() { return "Set label value"; }
doRender() {
const $action = $(TPL);
const $labelName = $action.find('.label-name');
$labelName.val(this.actionDef.labelName || "");
const $labelValue = $action.find('.label-value');
$labelValue.val(this.actionDef.labelValue || "");
const spacedUpdate = new SpacedUpdate(async () => {
await this.saveAction({
labelName: $labelName.val(),
labelValue: $labelValue.val()
});
}, 1000)
$labelName.on('input', () => spacedUpdate.scheduleUpdate());
$labelValue.on('input', () => spacedUpdate.scheduleUpdate());
return $action;
}
}

View File

@ -1,5 +1,5 @@
import SpacedUpdate from "../../services/spaced_update.js"; import SpacedUpdate from "../../services/spaced_update.js";
import AbstractSearchAction from "./abstract_search_action.js"; import AbstractBulkAction from "./abstract_bulk_action.js";
const TPL = ` const TPL = `
<tr> <tr>
@ -18,7 +18,7 @@ const TPL = `
</td> </td>
</tr>`; </tr>`;
export default class DeleteLabelSearchAction extends AbstractSearchAction { export default class DeleteLabelBulkAction extends AbstractBulkAction {
static get actionName() { return "deleteLabel"; } static get actionName() { return "deleteLabel"; }
static get actionTitle() { return "Delete label"; } static get actionTitle() { return "Delete label"; }

View File

@ -1,4 +1,4 @@
import AbstractSearchAction from "./abstract_search_action.js"; import AbstractBulkAction from "./abstract_bulk_action.js";
const TPL = ` const TPL = `
<tr> <tr>
@ -12,7 +12,7 @@ const TPL = `
</td> </td>
</tr>`; </tr>`;
export default class DeleteNoteSearchAction extends AbstractSearchAction { export default class DeleteNoteBulkAction extends AbstractBulkAction {
static get actionName() { return "deleteNote"; } static get actionName() { return "deleteNote"; }
static get actionTitle() { return "Delete note"; } static get actionTitle() { return "Delete note"; }

View File

@ -1,4 +1,4 @@
import AbstractSearchAction from "./abstract_search_action.js"; import AbstractBulkAction from "./abstract_bulk_action.js";
const TPL = ` const TPL = `
<tr> <tr>
@ -19,7 +19,7 @@ const TPL = `
</td> </td>
</tr>`; </tr>`;
export default class DeleteNoteRevisionsSearchAction extends AbstractSearchAction { export default class DeleteNoteRevisionsBulkAction extends AbstractBulkAction {
static get actionName() { return "deleteNoteRevisions"; } static get actionName() { return "deleteNoteRevisions"; }
static get actionTitle() { return "Delete note revisions"; } static get actionTitle() { return "Delete note revisions"; }

View File

@ -1,5 +1,5 @@
import SpacedUpdate from "../../services/spaced_update.js"; import SpacedUpdate from "../../services/spaced_update.js";
import AbstractSearchAction from "./abstract_search_action.js"; import AbstractBulkAction from "./abstract_bulk_action.js";
const TPL = ` const TPL = `
<tr> <tr>
@ -20,7 +20,7 @@ const TPL = `
</td> </td>
</tr>`; </tr>`;
export default class DeleteRelationSearchAction extends AbstractSearchAction { export default class DeleteRelationBulkAction extends AbstractBulkAction {
static get actionName() { return "deleteRelation"; } static get actionName() { return "deleteRelation"; }
static get actionTitle() { return "Delete relation"; } static get actionTitle() { return "Delete relation"; }

View File

@ -1,5 +1,5 @@
import SpacedUpdate from "../../services/spaced_update.js"; import SpacedUpdate from "../../services/spaced_update.js";
import AbstractSearchAction from "./abstract_search_action.js"; import AbstractBulkAction from "./abstract_bulk_action.js";
const TPL = ` const TPL = `
<tr> <tr>
@ -33,7 +33,7 @@ const TPL = `
</td> </td>
</tr>`; </tr>`;
export default class ExecuteScriptSearchAction extends AbstractSearchAction { export default class ExecuteScriptBulkAction extends AbstractBulkAction {
static get actionName() { return "executeScript"; } static get actionName() { return "executeScript"; }
static get actionTitle() { return "Execute script"; } static get actionTitle() { return "Execute script"; }

View File

@ -1,5 +1,5 @@
import SpacedUpdate from "../../services/spaced_update.js"; import SpacedUpdate from "../../services/spaced_update.js";
import AbstractSearchAction from "./abstract_search_action.js"; import AbstractBulkAction from "./abstract_bulk_action.js";
import noteAutocompleteService from "../../services/note_autocomplete.js"; import noteAutocompleteService from "../../services/note_autocomplete.js";
const TPL = ` const TPL = `
@ -33,7 +33,7 @@ const TPL = `
</td> </td>
</tr>`; </tr>`;
export default class MoveNoteSearchAction extends AbstractSearchAction { export default class MoveNoteBulkAction extends AbstractBulkAction {
static get actionName() { return "moveNote"; } static get actionName() { return "moveNote"; }
static get actionTitle() { return "Move note"; } static get actionTitle() { return "Move note"; }

View File

@ -1,5 +1,5 @@
import SpacedUpdate from "../../services/spaced_update.js"; import SpacedUpdate from "../../services/spaced_update.js";
import AbstractSearchAction from "./abstract_search_action.js"; import AbstractBulkAction from "./abstract_bulk_action.js";
const TPL = ` const TPL = `
<tr> <tr>
@ -27,7 +27,7 @@ const TPL = `
</td> </td>
</tr>`; </tr>`;
export default class RenameLabelSearchAction extends AbstractSearchAction { export default class RenameLabelBulkAction extends AbstractBulkAction {
static get actionName() { return "renameLabel"; } static get actionName() { return "renameLabel"; }
static get actionTitle() { return "Rename label"; } static get actionTitle() { return "Rename label"; }

View File

@ -1,5 +1,5 @@
import SpacedUpdate from "../../services/spaced_update.js"; import SpacedUpdate from "../../services/spaced_update.js";
import AbstractSearchAction from "./abstract_search_action.js"; import AbstractBulkAction from "./abstract_bulk_action.js";
const TPL = ` const TPL = `
<tr> <tr>
@ -27,7 +27,7 @@ const TPL = `
</td> </td>
</tr>`; </tr>`;
export default class RenameRelationSearchAction extends AbstractSearchAction { export default class RenameRelationBulkAction extends AbstractBulkAction {
static get actionName() { return "renameRelation"; } static get actionName() { return "renameRelation"; }
static get actionTitle() { return "Rename relation"; } static get actionTitle() { return "Rename relation"; }

View File

@ -1,5 +1,5 @@
import SpacedUpdate from "../../services/spaced_update.js"; import SpacedUpdate from "../../services/spaced_update.js";
import AbstractSearchAction from "./abstract_search_action.js"; import AbstractBulkAction from "./abstract_bulk_action.js";
const TPL = ` const TPL = `
<tr> <tr>
@ -37,7 +37,7 @@ const TPL = `
</td> </td>
</tr>`; </tr>`;
export default class SetLabelValueSearchAction extends AbstractSearchAction { export default class SetLabelValueBulkAction extends AbstractBulkAction {
static get actionName() { return "setLabelValue"; } static get actionName() { return "setLabelValue"; }
static get actionTitle() { return "Set label value"; } static get actionTitle() { return "Set label value"; }

View File

@ -1,5 +1,5 @@
import SpacedUpdate from "../../services/spaced_update.js"; import SpacedUpdate from "../../services/spaced_update.js";
import AbstractSearchAction from "./abstract_search_action.js"; import AbstractBulkAction from "./abstract_bulk_action.js";
import noteAutocompleteService from "../../services/note_autocomplete.js"; import noteAutocompleteService from "../../services/note_autocomplete.js";
const TPL = ` const TPL = `
@ -39,7 +39,7 @@ const TPL = `
</td> </td>
</tr>`; </tr>`;
export default class SetRelationTargetSearchAction extends AbstractSearchAction { export default class SetRelationTargetSearchAction extends AbstractBulkAction {
static get actionName() { return "setRelationTarget"; } static get actionName() { return "setRelationTarget"; }
static get actionTitle() { return "Set relation target"; } static get actionTitle() { return "Set relation target"; }

View File

@ -8,7 +8,7 @@ const {sleep} = utils;
const TPL = ` const TPL = `
<div class="canvas-widget note-detail-canvas note-detail-printable note-detail"> <div class="canvas-widget note-detail-canvas note-detail-printable note-detail">
<style type="text/css"> <style>
.excalidraw .App-menu_top .buttonList { .excalidraw .App-menu_top .buttonList {
display: flex; display: flex;
} }

View File

@ -92,7 +92,7 @@ document.addEventListener("DOMContentLoaded", function() {
header += `<script src="../../node_modules/react/umd/react.production.min.js"></script>`; header += `<script src="../../node_modules/react/umd/react.production.min.js"></script>`;
header += `<script src="../../node_modules/react-dom/umd/react-dom.production.min.js"></script>`; header += `<script src="../../node_modules/react-dom/umd/react-dom.production.min.js"></script>`;
header += `<script src="../../node_modules/@excalidraw/excalidraw/dist/excalidraw.production.min.js"></script>`; header += `<script src="../../node_modules/@excalidraw/excalidraw/dist/excalidraw.production.min.js"></script>`;
header += `<style type="text/css"> header += `<style>
.excalidraw-wrapper { .excalidraw-wrapper {
height: 100%; height: 100%;

View File

@ -1,6 +1,5 @@
<style> <style>
#bulk-available-action-list button { #bulk-available-action-list button {
font-size: small;
padding: 2px 7px; padding: 2px 7px;
margin-right: 10px; margin-right: 10px;
margin-bottom: 5px; margin-bottom: 5px;