diff --git a/sql/00007.sql b/sql/00007.sql deleted file mode 100644 index 0b79d9c..0000000 --- a/sql/00007.sql +++ /dev/null @@ -1,119 +0,0 @@ -CREATE OR REPLACE PROCEDURE public.add_nodes(IN p_user_id integer, IN p_client_uuid uuid, IN p_nodes jsonb) - LANGUAGE plpgsql -AS $procedure$ - -DECLARE - node_data jsonb; - node_updated timestamptz; - db_updated timestamptz; - db_uuid uuid; - db_client uuid; - db_history_uuid uuid; - node_uuid uuid; - node_parent_uuid uuid; - node_history_uuid uuid; - -BEGIN - FOR node_data IN SELECT * FROM jsonb_array_elements(p_nodes) - LOOP - node_uuid = (node_data->>'UUID')::uuid; - node_history_uuid = (node_data->>'HistoryUUID')::uuid; - node_updated = (node_data->>'Updated')::timestamptz; - - - - -- Frontend is using an all-zero UUID to define the root node. - -- Database is using NULL. - IF node_data->>'ParentUUID' = '00000000-0000-0000-0000-000000000000' OR node_data->>'ParentUUID' = '' THEN - node_parent_uuid = NULL; - ELSE - node_parent_uuid = (node_data->>'ParentUUID')::uuid; - END IF; - - - - -- Every jode has a new history UUID to keep the history entry uniquely identifiable - -- across clients. A history entry could potentially be sent again, but should be - -- safe to ignore as every change to a node should have a new history UUID. - -- - -- The current node is also stored as history. - INSERT INTO node_history( - user_id, "uuid", "history_uuid", parents, created, updated, - "name", "content", "content_encrypted", - client - ) - VALUES( - p_user_id, -- combined key - node_uuid, -- combined key - node_history_uuid, -- combined key - (jsonb_populate_record(null::json_ancestor_array, node_data))."Ancestors", - COALESCE((node_data->>'Created')::timestamptz, NOW()), - COALESCE((node_data->>'Updated')::timestamptz, NOW()), - (node_data->>'Name')::varchar, - (node_data->>'Content')::text, - '', /* content_encrypted */ - p_client_uuid - ) - ON CONFLICT ("user_id", "uuid", "history_uuid") - DO NOTHING; - - - - -- Retrieve the current modified timestamp for this node from the database. - SELECT - uuid, updated, client - INTO - db_uuid, db_updated, db_client - FROM public."node" - WHERE - user_id = p_user_id AND - uuid::uuid = node_uuid::uuid; - - - - -- Is the node not in database? It needs to be created. - IF db_uuid IS NULL THEN - RAISE NOTICE '01 New node %', node_uuid; - - INSERT INTO public."node" ( - user_id, "uuid", parent_uuid, created, updated, - "name", "content", "content_encrypted", - client - ) - VALUES( - p_user_id, - node_uuid, - node_parent_uuid, - COALESCE((node_data->>'Created')::timestamptz, NOW()), - COALESCE((node_data->>'Updated')::timestamptz, NOW()), - (node_data->>'Name')::varchar, - (node_data->>'Content')::text, - '', /* content_encrypted */ - p_client_uuid - ); - - CONTINUE; - - END IF; - - - - -- Update the public node as well if it was older than incoming node. - IF node_updated > db_updated THEN - UPDATE public."node" - SET - updated = (node_data->>'Updated')::timestamptz, - updated_seq = nextval('node_updates'), - parent_uuid = node_parent_uuid, - name = (node_data->>'Name')::varchar, - content = (node_data->>'Content')::text, - client = p_client_uuid - WHERE - user_id = p_user_id AND - uuid::uuid = node_uuid::uuid; - END IF; - - END LOOP; -END -$procedure$ -; diff --git a/static/images/icon_menu.svg b/static/images/icon_menu.svg deleted file mode 100644 index e60bdee..0000000 --- a/static/images/icon_menu.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - menu - hamburger - - - diff --git a/static/js/app.mjs b/static/js/app.mjs index c556341..8fc43df 100644 --- a/static/js/app.mjs +++ b/static/js/app.mjs @@ -370,7 +370,7 @@ class N2DragIcon extends CustomHTMLElement { this.style.top = `${e.clientY}px` }) - this.dragSource = null + this.dragTarget = null }// }}} start() {// {{{ this.style.display = 'block' @@ -383,11 +383,11 @@ class N2DragIcon extends CustomHTMLElement { name = '_' + name this.elIcon.setAttribute('src', `/images/${_VERSION}/icon_drag${name}.svg`) }// }}} - setSource(s) {// {{{ - this.dragSource = s + setTarget(t) {// {{{ + this.dragTarget = t }// }}} - getSource() {// {{{ - return this.dragSource + getTarget() {// {{{ + return this.dragTarget }// }}} } diff --git a/static/js/sidebar.mjs b/static/js/sidebar.mjs index 63c4ddc..561de8d 100644 --- a/static/js/sidebar.mjs +++ b/static/js/sidebar.mjs @@ -585,7 +585,6 @@ export class N2TreeNode extends CustomHTMLElement { e.dataTransfer.setDragImage(blankPixel, 0, 0) e.dataTransfer.allowedEffects = 'none' e.stopPropagation() - _app.dragIcon.setSource(this) _app.dragIcon.start() }// }}} dragEnd(e) {// {{{ @@ -599,12 +598,13 @@ export class N2TreeNode extends CustomHTMLElement { }// }}} async dragDrop(e) {// {{{ e.stopPropagation() - const sourceNode = _app.dragIcon.getSource() - await _app.moveNode(sourceNode.node, this.node.UUID) + const moveToNode = _app.dragIcon.getTarget() + await _app.moveNode(this.node, moveToNode.node.UUID) + return - _app.sidebar.setNodeExpanded(this, true) + _app.sidebar.setNodeExpanded(moveToNode, true) await this.render(true, true) - await sourceNode.render(true, true) + await moveToNode.render(true, true) this.dragLeave(e) }// }}} @@ -615,6 +615,8 @@ export class N2TreeNode extends CustomHTMLElement { e.stopPropagation() _app.dragIcon.icon('ok') this.classList.add('drag-target') + + _app.dragIcon.setTarget(this) }// }}} dragLeave(e) {// {{{ e.stopPropagation() @@ -622,6 +624,8 @@ export class N2TreeNode extends CustomHTMLElement { e.dataTransfer.setDragImage(N2TreeNode.DRAG_ICON, -16, 8) _app.dragIcon.icon('') this.classList.remove('drag-target') + + _app.dragIcon.setTarget(null) }// }}} async fetchChildren(force_fetch) {//{{{ if (this.children_populated && !force_fetch)