mirror of
https://github.com/google/blockly.git
synced 2026-02-15 03:50:21 +01:00
* feat: define comment collapse event * feat: add firing collapse events * chore: add round-trip test * chore: add tests for firing collapse events * chore: format
104 lines
2.7 KiB
TypeScript
104 lines
2.7 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2024 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import * as registry from '../registry.js';
|
|
import {WorkspaceComment} from '../comments/workspace_comment.js';
|
|
import {CommentBase, CommentBaseJson} from './events_comment_base.js';
|
|
import * as eventUtils from './utils.js';
|
|
import type {Workspace} from '../workspace.js';
|
|
|
|
export class CommentCollapse extends CommentBase {
|
|
override type = eventUtils.COMMENT_COLLAPSE;
|
|
|
|
constructor(
|
|
comment?: WorkspaceComment,
|
|
public newCollapsed?: boolean,
|
|
) {
|
|
super(comment);
|
|
|
|
if (!comment) {
|
|
return; // Blank event to be populated by fromJson.
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Encode the event as JSON.
|
|
*
|
|
* @returns JSON representation.
|
|
*/
|
|
override toJson(): CommentCollapseJson {
|
|
const json = super.toJson() as CommentCollapseJson;
|
|
if (this.newCollapsed === undefined) {
|
|
throw new Error(
|
|
'The new collapse value undefined. Either call recordNew, or ' +
|
|
'call fromJson',
|
|
);
|
|
}
|
|
json['newCollapsed'] = this.newCollapsed;
|
|
return json;
|
|
}
|
|
|
|
/**
|
|
* Deserializes the JSON event.
|
|
*
|
|
* @param event The event to append new properties to. Should be a subclass
|
|
* of CommentCollapse, but we can't specify that due to the fact that
|
|
* parameters to static methods in subclasses must be supertypes of
|
|
* parameters to static methods in superclasses.
|
|
* @internal
|
|
*/
|
|
static fromJson(
|
|
json: CommentCollapseJson,
|
|
workspace: Workspace,
|
|
event?: any,
|
|
): CommentCollapse {
|
|
const newEvent = super.fromJson(
|
|
json,
|
|
workspace,
|
|
event ?? new CommentCollapse(),
|
|
) as CommentCollapse;
|
|
newEvent.newCollapsed = json.newCollapsed;
|
|
return newEvent;
|
|
}
|
|
|
|
/**
|
|
* Run a collapse event.
|
|
*
|
|
* @param forward True if run forward, false if run backward (undo).
|
|
*/
|
|
override run(forward: boolean) {
|
|
const workspace = this.getEventWorkspace_();
|
|
if (!this.commentId) {
|
|
throw new Error(
|
|
'The comment ID is undefined. Either pass a comment to ' +
|
|
'the constructor, or call fromJson',
|
|
);
|
|
}
|
|
// TODO: Remove cast when we update getCommentById.
|
|
const comment = workspace.getCommentById(
|
|
this.commentId,
|
|
) as unknown as WorkspaceComment;
|
|
if (!comment) {
|
|
console.warn(
|
|
"Can't collapse or uncollapse non-existent comment: " + this.commentId,
|
|
);
|
|
return;
|
|
}
|
|
|
|
comment.setCollapsed(forward ? !!this.newCollapsed : !this.newCollapsed);
|
|
}
|
|
}
|
|
|
|
export interface CommentCollapseJson extends CommentBaseJson {
|
|
newCollapsed: boolean;
|
|
}
|
|
|
|
registry.register(
|
|
registry.Type.EVENT,
|
|
eventUtils.COMMENT_COLLAPSE,
|
|
CommentCollapse,
|
|
);
|