From 68291bdd9f3ef6b271610f38ca1b50a06465362d Mon Sep 17 00:00:00 2001 From: "Mark E. Haase" Date: Thu, 10 Aug 2023 12:44:32 -0400 Subject: [PATCH] AF-177 Create a splash screen Adds a splash screen that is modeled after the CTI Blueprints splash screen. - Display splash screen at startup (if there is no `src` parameter). - The splash screen can create new flows, open flows, and open hyperlinks. - The splash screen options can be customized in the builder config. - Also update webpack config to display a better page title. - Update the AFB logo in the top left to use the Engenuity logo. --- src/attack_flow_builder/src/App.vue | 16 +- src/attack_flow_builder/src/assets/afb.png | Bin 0 -> 6726 bytes .../src/assets/builder.config.ts | 29 +++ .../src/assets/ctid-small.png | Bin 0 -> 7101 bytes src/attack_flow_builder/src/assets/ctid.png | Bin 0 -> 24117 bytes .../src/components/Controls/SplashMenu.vue | 188 ++++++++++++++++++ .../src/components/Elements/AppTitleBar.vue | 20 +- .../src/components/Icons/Link.vue | 12 ++ .../src/components/Icons/NewFlow.vue | 12 ++ .../src/components/Icons/OpenFlow.vue | 12 ++ .../Commands/AppCommands/HideSplashMenu.ts | 22 ++ .../Commands/AppCommands/ShowSplashMenu.ts | 22 ++ .../src/store/Commands/AppCommands/index.ts | 2 + .../src/store/StoreTypes.ts | 27 ++- .../src/store/Stores/ApplicationStore.ts | 16 +- src/attack_flow_builder/vue.config.js | 8 +- 16 files changed, 367 insertions(+), 19 deletions(-) create mode 100644 src/attack_flow_builder/src/assets/afb.png create mode 100644 src/attack_flow_builder/src/assets/ctid-small.png create mode 100755 src/attack_flow_builder/src/assets/ctid.png create mode 100644 src/attack_flow_builder/src/components/Controls/SplashMenu.vue create mode 100644 src/attack_flow_builder/src/components/Icons/Link.vue create mode 100644 src/attack_flow_builder/src/components/Icons/NewFlow.vue create mode 100644 src/attack_flow_builder/src/components/Icons/OpenFlow.vue create mode 100644 src/attack_flow_builder/src/store/Commands/AppCommands/HideSplashMenu.ts create mode 100644 src/attack_flow_builder/src/store/Commands/AppCommands/ShowSplashMenu.ts diff --git a/src/attack_flow_builder/src/App.vue b/src/attack_flow_builder/src/App.vue index 639bfaf0..1a3cf6fb 100644 --- a/src/attack_flow_builder/src/App.vue +++ b/src/attack_flow_builder/src/App.vue @@ -4,6 +4,7 @@
+
@@ -23,14 +24,16 @@ import Configuration from "@/assets/builder.config" import { clamp } from "./assets/scripts/BlockDiagram"; import { PointerTracker } from "./assets/scripts/PointerTracker"; import { mapMutations, mapState } from 'vuex'; -import { LoadFile, LoadSettings } from './store/Commands/AppCommands'; +import * as App from './store/Commands/AppCommands'; import { defineComponent, markRaw, ref } from 'vue'; // Components +import SplashMenu from "@/components/Controls/SplashMenu.vue"; import AppTitleBar from "@/components/Elements/AppTitleBar.vue"; import AppHotkeyBox from "@/components/Elements/AppHotkeyBox.vue"; import BlockDiagram from "@/components/Elements/BlockDiagram.vue"; import AppFooterBar from "@/components/Elements/AppFooterBar.vue"; import EditorSidebar from "@/components/Elements/EditorSidebar.vue"; +import { ShowSplashMenu } from "./store/Commands/AppCommands/ShowSplashMenu"; const Handle = { None : 0, @@ -156,20 +159,22 @@ export default defineComponent({ settings = require("../public/settings.json"); } // Load settings - this.execute(new LoadSettings(this.context, settings)); + this.execute(new App.LoadSettings(this.context, settings)); // Load empty file - this.execute(await LoadFile.fromNew(this.context)); + this.execute(await App.LoadFile.fromNew(this.context)); // Load file from query parameters, if possible let params = new URLSearchParams(window.location.search); let src = params.get("src"); if(src) { try { // TODO: Incorporate loading dialog - this.execute(await LoadFile.fromUrl(this.context, src)); + this.execute(await App.LoadFile.fromUrl(this.context, src)); } catch(ex) { console.error(`Failed to load file from url: '${ src }'`); console.error(ex); } + } else { + this.execute(new ShowSplashMenu(this.context)); } }, mounted() { @@ -193,7 +198,8 @@ export default defineComponent({ AppTitleBar, BlockDiagram, AppFooterBar, - EditorSidebar + EditorSidebar, + SplashMenu, }, }); diff --git a/src/attack_flow_builder/src/assets/afb.png b/src/attack_flow_builder/src/assets/afb.png new file mode 100644 index 0000000000000000000000000000000000000000..c371c7f65c8469d2a0d3e2011ca044a15159441d GIT binary patch literal 6726 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 literal 0 HcmV?d00001 diff --git a/src/attack_flow_builder/src/assets/builder.config.ts b/src/attack_flow_builder/src/assets/builder.config.ts index d6360d29..75434a52 100644 --- a/src/attack_flow_builder/src/assets/builder.config.ts +++ b/src/attack_flow_builder/src/assets/builder.config.ts @@ -24,6 +24,35 @@ const config: AppConfiguration = { application_name: "Attack Flow Builder", file_type_name: "Attack Flow", file_type_extension: "afb", + menu_icon: "./ctid-small.png", + splash: { + product: "./afb.png", + organization: "./ctid.png", + buttons: [ + { + action: "new", + name: "New Flow", + description: "Create a new, blank flow", + }, + { + action: "open", + name: "Open Flow", + description: "Open an existing flow from your computer" + }, + { + action: "link", + name: "Example Flows", + description: "View a list of example flows", + url: "https://center-for-threat-informed-defense.github.io/attack-flow/example_flows/" + }, + { + action: "link", + name: "Builder Help", + description: "View help for Attack Flow Builder", + url: "https://center-for-threat-informed-defense.github.io/attack-flow/builder/" + }, + ], + }, schema: { page_template: "flow", templates: [ diff --git a/src/attack_flow_builder/src/assets/ctid-small.png b/src/attack_flow_builder/src/assets/ctid-small.png new file mode 100644 index 0000000000000000000000000000000000000000..546d94f8634cd34ef181b271a62ca28e4d7dcbd2 GIT binary patch literal 7101 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 J$u6(x{{S(pJZ=C0 literal 0 HcmV?d00001 diff --git a/src/attack_flow_builder/src/assets/ctid.png b/src/attack_flow_builder/src/assets/ctid.png new file mode 100755 index 0000000000000000000000000000000000000000..a93f1ed80ba76865e3ed6de0e8b71576c0840f86 GIT binary patch literal 24117 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%0A7n$G5VB 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 TPyIYS00000NkvXXu0mjfR16+0 literal 0 HcmV?d00001 diff --git a/src/attack_flow_builder/src/components/Controls/SplashMenu.vue b/src/attack_flow_builder/src/components/Controls/SplashMenu.vue new file mode 100644 index 00000000..233d0fc3 --- /dev/null +++ b/src/attack_flow_builder/src/components/Controls/SplashMenu.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/src/attack_flow_builder/src/components/Elements/AppTitleBar.vue b/src/attack_flow_builder/src/components/Elements/AppTitleBar.vue index fabe6f1b..d66ca54f 100644 --- a/src/attack_flow_builder/src/components/Elements/AppTitleBar.vue +++ b/src/attack_flow_builder/src/components/Elements/AppTitleBar.vue @@ -1,12 +1,14 @@ diff --git a/src/attack_flow_builder/src/components/Icons/Link.vue b/src/attack_flow_builder/src/components/Icons/Link.vue new file mode 100644 index 00000000..bcafff3e --- /dev/null +++ b/src/attack_flow_builder/src/components/Icons/Link.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/attack_flow_builder/src/components/Icons/NewFlow.vue b/src/attack_flow_builder/src/components/Icons/NewFlow.vue new file mode 100644 index 00000000..b792a971 --- /dev/null +++ b/src/attack_flow_builder/src/components/Icons/NewFlow.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/attack_flow_builder/src/components/Icons/OpenFlow.vue b/src/attack_flow_builder/src/components/Icons/OpenFlow.vue new file mode 100644 index 00000000..f30eab00 --- /dev/null +++ b/src/attack_flow_builder/src/components/Icons/OpenFlow.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/attack_flow_builder/src/store/Commands/AppCommands/HideSplashMenu.ts b/src/attack_flow_builder/src/store/Commands/AppCommands/HideSplashMenu.ts new file mode 100644 index 00000000..36f7fdb2 --- /dev/null +++ b/src/attack_flow_builder/src/store/Commands/AppCommands/HideSplashMenu.ts @@ -0,0 +1,22 @@ +import { AppCommand } from "../AppCommand"; +import { ApplicationStore } from "@/store/StoreTypes"; + +export class HideSplashMenu extends AppCommand { + + /** + * Display the find dialog + * @param context + * The application context. + */ + constructor(context: ApplicationStore) { + super(context); + } + + /** + * Executes the command. + */ + public execute(): void { + this._context.splashIsVisible = false; + } + +} diff --git a/src/attack_flow_builder/src/store/Commands/AppCommands/ShowSplashMenu.ts b/src/attack_flow_builder/src/store/Commands/AppCommands/ShowSplashMenu.ts new file mode 100644 index 00000000..598f5a4e --- /dev/null +++ b/src/attack_flow_builder/src/store/Commands/AppCommands/ShowSplashMenu.ts @@ -0,0 +1,22 @@ +import { AppCommand } from "../AppCommand"; +import { ApplicationStore } from "@/store/StoreTypes"; + +export class ShowSplashMenu extends AppCommand { + + /** + * Display the find dialog + * @param context + * The application context. + */ + constructor(context: ApplicationStore) { + super(context); + } + + /** + * Executes the command. + */ + public execute(): void { + this._context.splashIsVisible = true; + } + +} diff --git a/src/attack_flow_builder/src/store/Commands/AppCommands/index.ts b/src/attack_flow_builder/src/store/Commands/AppCommands/index.ts index b70eb4aa..4598bc6d 100644 --- a/src/attack_flow_builder/src/store/Commands/AppCommands/index.ts +++ b/src/attack_flow_builder/src/store/Commands/AppCommands/index.ts @@ -1,5 +1,6 @@ export * from "./ClearPageRecoveryBank"; export * from "./CopySelectedChildren"; +export * from "./HideSplashMenu"; export * from "./LoadFile"; export * from "./LoadSettings"; export * from "./NullCommand"; @@ -11,6 +12,7 @@ export * from "./SaveSelectionImageToDevice"; export * from "./SetEditorPointerLocation"; export * from "./SetEditorViewParams"; export * from "./SetRenderQuality"; +export * from "./ShowSplashMenu"; export * from "./SwitchToFullscreen"; export * from "./ToggleDebugDisplay"; export * from "./ToggleGridDisplay"; diff --git a/src/attack_flow_builder/src/store/StoreTypes.ts b/src/attack_flow_builder/src/store/StoreTypes.ts index 05f65ac4..b8f9e974 100644 --- a/src/attack_flow_builder/src/store/StoreTypes.ts +++ b/src/attack_flow_builder/src/store/StoreTypes.ts @@ -29,7 +29,8 @@ export type ApplicationStore = { clipboard: DiagramObjectModel[], publisher: DiagramPublisher | undefined, activePage: PageEditor, - recoveryBank: PageRecoveryBank + recoveryBank: PageRecoveryBank, + splashIsVisible: boolean, } /** @@ -235,6 +236,24 @@ export type SelectHotkeys = { // 3. App Configuration ///////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// +/** + * Actions that a splash button can execute. + */ +export enum SplashButtonAction { + New = "new", + Open = "open", + Link = "link", +} + +/** + * Configuration for a splash button. + */ +export type SplashButton = { + action: string; + name: string; + description: string; + url?: string; +} /** * App Configuration File @@ -242,8 +261,14 @@ export type SelectHotkeys = { export type AppConfiguration = { is_web_hosted: boolean, application_name: string, + splash: { + product: string, + organization: string, + buttons: Array, + }, file_type_name: string, file_type_extension: string, + menu_icon: string, schema: BlockDiagramSchema, menus: { help_menu: { diff --git a/src/attack_flow_builder/src/store/Stores/ApplicationStore.ts b/src/attack_flow_builder/src/store/Stores/ApplicationStore.ts index 8740d06d..eb7bbc4e 100644 --- a/src/attack_flow_builder/src/store/Stores/ApplicationStore.ts +++ b/src/attack_flow_builder/src/store/Stores/ApplicationStore.ts @@ -18,7 +18,8 @@ export default { clipboard: [], publisher: Publisher, activePage: PageEditor.createDummy(), - recoveryBank: new PageRecoveryBank() + recoveryBank: new PageRecoveryBank(), + splashIsVisible: false, }, getters: { @@ -122,7 +123,18 @@ export default { let p = state.activePage; // Use trigger to trip the reactivity system return (state.activePage.trigger.value ? p : p).getValidationWarnings(); - } + }, + + /** + * Indicates whether the splash menu is visible. + * @param state + * The Vuex state. + * @returns + * True if the splash menu is visible. + */ + isShowingSplash(state): boolean { + return state.splashIsVisible; + }, }, mutations: { diff --git a/src/attack_flow_builder/vue.config.js b/src/attack_flow_builder/vue.config.js index e015aca8..32a1468b 100644 --- a/src/attack_flow_builder/vue.config.js +++ b/src/attack_flow_builder/vue.config.js @@ -7,5 +7,11 @@ module.exports = { "~": path.resolve(__dirname, "./") } } + }, + chainWebpack: config => { + config.plugin("html").tap(args => { + args[0].title = "Attack Flow Builder"; + return args; + }) } -}; \ No newline at end of file +};