From 10032dff1510ada5e8aa9f5be65485c9d991e427 Mon Sep 17 00:00:00 2001 From: Danny Coulombe Date: Tue, 16 Dec 2025 08:10:49 -0500 Subject: [PATCH 1/5] Allow triggers to be scoped to development or user #89 --- docs/structure.md | 3 +++ src/assets/example-structure.yaml | 1 + src/components/ActionBar.vue | 14 ++++++++++++++ src/components/JSONms.vue | 13 +++++++++++-- src/components/SitePreview.vue | 24 +++++++++++++++++++----- src/components/StructureEditor.vue | 21 ++++++++++++++++++--- src/components/Toolbar.vue | 11 ++++++++++- src/components/TriggerMenu.vue | 14 +++++++++----- src/interfaces.ts | 1 + src/stores/global.ts | 2 +- 10 files changed, 87 insertions(+), 17 deletions(-) diff --git a/docs/structure.md b/docs/structure.md index 26bc200..de928f9 100644 --- a/docs/structure.md +++ b/docs/structure.md @@ -447,6 +447,9 @@ triggers: # URL called when the trigger is executed url: https://json.ms/?action=build + + # Location of the trigger button (structure, toolbar, data) + location: editor # HTTP method used for the request method: POST diff --git a/src/assets/example-structure.yaml b/src/assets/example-structure.yaml index 69232af..3a28b6d 100644 --- a/src/assets/example-structure.yaml +++ b/src/assets/example-structure.yaml @@ -22,6 +22,7 @@ triggers: label: Build icon: mdi-play url: [BUILD_URL]/build + location: structure method: POST headers: Content-Type: application/json diff --git a/src/components/ActionBar.vue b/src/components/ActionBar.vue index aa41544..f287ab8 100644 --- a/src/components/ActionBar.vue +++ b/src/components/ActionBar.vue @@ -6,6 +6,14 @@ import {useGlobalStore} from '@/stores/global'; import {computed} from "vue"; import {useTypings} from "@/composables/typings"; import {useModelStore} from "@/stores/model"; +import TriggerMenu from "@/components/TriggerMenu.vue"; +import type {IStructure, IStructureData} from "@/interfaces"; + +const structure = defineModel({ required: true }); +const { structureData, userData } = defineProps<{ + structureData: IStructureData, + userData: any, +}>(); const globalStore = useGlobalStore(); const modelStore = useModelStore(); @@ -56,6 +64,12 @@ const reset = () => { @@ -466,7 +471,11 @@ if (globalStore.session.loggedIn) { class="pl-3" >
- +
diff --git a/src/components/SitePreview.vue b/src/components/SitePreview.vue index 0ff4fee..3b1a145 100644 --- a/src/components/SitePreview.vue +++ b/src/components/SitePreview.vue @@ -24,7 +24,7 @@ const loaded = ref(false); const loading = ref(false); const killIframe = ref(false); const siteNotCompatibleSnack = ref(false); -const hoveringEditor = ref(false); +const expanded = ref(false); const { layoutSize, windowHeight, layoutPx } = useLayout(); const { reloading, siteCompatible, sendMessageToIframe, getPathsFromSectionKey, listenIframeMessage, sendUserDataToIframe } = useIframe(); const { userDataLoading } = useUserData(); @@ -33,7 +33,7 @@ const iframeErrorMsg = ref('This site is not JSONms compatible'); const editorHeight = computed((): number => { const padding = (globalStore.userSettings.data.layoutSitePreviewPadding ? 96 : 63); const result = windowHeight.value - padding; - if (hoveringEditor.value) { + if (expanded.value) { return result + 32; } return result - layoutSize.value.preview.height; @@ -153,6 +153,7 @@ defineExpose({ :width="layoutSize.preview.width" :location="globalStore.userSettings.data.layoutSitePreviewLocation" scrim + class="site-preview-drawer" color="transparent" border="0" permanent @@ -228,8 +229,6 @@ defineExpose({ flat class="editor-card" theme="dark" - @mouseover="hoveringEditor = true" - @mouseleave="hoveringEditor = false" > + > + + @@ -259,4 +270,7 @@ defineExpose({ .editor-card { transition: height 300ms ease; } +.site-preview-drawer ::v-deep .v-navigation-drawer__content { + overflow: hidden !important; +} diff --git a/src/components/StructureEditor.vue b/src/components/StructureEditor.vue index 5064715..8668a01 100644 --- a/src/components/StructureEditor.vue +++ b/src/components/StructureEditor.vue @@ -13,7 +13,7 @@ import {useTypings} from "@/composables/typings"; import {useModelStore} from "@/stores/model"; // import yaml from 'js-yaml'; -const emit = defineEmits(['save', 'create', 'change']) +const emit = defineEmits(['save', 'create', 'change', 'focus', 'blur']); const structure = defineModel({ required: true }); const { columns = false, userData } = defineProps<{ columns?: boolean, @@ -155,6 +155,16 @@ const findNeedleInString = (haystack: string, needle: string) => { return -1 } + +const onFocus = () => { + setTimeout(() => { + emit('focus'); + }, 100); +} +const onBlur = () => { + emit('blur'); +} + const scrollToSection = (section: string) => { const instance = structureEditor.value?.getAceInstance(); if (instance) { @@ -443,8 +453,8 @@ watch(() => globalStore.userSettings.data, () => { text="Access to this template has not been granted by the owner." />
-
- +
+