diff --git a/app/javascript/dashboard/i18n/locale/en/macros.json b/app/javascript/dashboard/i18n/locale/en/macros.json index 67a5c5003..e51975921 100644 --- a/app/javascript/dashboard/i18n/locale/en/macros.json +++ b/app/javascript/dashboard/i18n/locale/en/macros.json @@ -49,6 +49,9 @@ "ERROR_MESSAGE": "There was an error deleting the macro. Please try again later" } }, + "VIEW": { + "TOOLTIP": "View macro" + }, "EDIT": { "TOOLTIP": "Edit macro", "API": { @@ -66,7 +69,9 @@ "LABEL": "Macro Visibility", "GLOBAL": { "LABEL": "Public", - "DESCRIPTION": "This macro is available publicly for all agents in this account." + "DESCRIPTION": "This macro is available publicly for all agents in this account.", + "CREATE_DISABLED_DESCRIPTION": "Only administrators can create public macros.", + "EDIT_DISABLED_DESCRIPTION": "Only administrators can edit public macros." }, "PERSONAL": { "LABEL": "Private", diff --git a/app/javascript/dashboard/routes/dashboard/settings/macros/Index.vue b/app/javascript/dashboard/routes/dashboard/settings/macros/Index.vue index 2ff6122b7..b79d78e30 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/macros/Index.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/macros/Index.vue @@ -9,10 +9,12 @@ import { useI18n } from 'vue-i18n'; import { useStoreGetters, useStore } from 'dashboard/composables/store'; import Button from 'dashboard/components-next/button/Button.vue'; import { BaseTable } from 'dashboard/components-next/table'; +import { useAdmin } from 'dashboard/composables/useAdmin'; const getters = useStoreGetters(); const store = useStore(); const { t } = useI18n(); +const { isAdmin } = useAdmin(); const showDeleteConfirmationPopup = ref(false); const selectedMacro = ref({}); @@ -109,6 +111,7 @@ const tableHeaders = computed(() => { v-for="macro in items" :key="macro.id" :macro="macro" + :can-manage-public-macros="isAdmin" @delete="openDeletePopup(macro)" /> diff --git a/app/javascript/dashboard/routes/dashboard/settings/macros/MacroEditor.vue b/app/javascript/dashboard/routes/dashboard/settings/macros/MacroEditor.vue index 0b916a4ab..b941598fe 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/macros/MacroEditor.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/macros/MacroEditor.vue @@ -8,6 +8,7 @@ import { MACRO_ACTION_TYPES } from './constants'; import { useAlert } from 'dashboard/composables'; import actionQueryGenerator from 'dashboard/helper/actionQueryGenerator.js'; import { useMacros } from 'dashboard/composables/useMacros'; +import { useAdmin } from 'dashboard/composables/useAdmin'; const store = useStore(); const getters = useStoreGetters(); @@ -18,6 +19,7 @@ const router = useRouter(); const { t } = useI18n(); const { getMacroDropdownValues } = useMacros(); +const { isAdmin } = useAdmin(); const macro = ref(null); const mode = ref('CREATE'); @@ -33,6 +35,9 @@ provide('macroActionTypes', macroActionTypes); const uiFlags = computed(() => getters['macros/getUIFlags'].value); const macroId = computed(() => route.params.macroId); +const isPublicMacroReadOnly = computed( + () => macro.value?.visibility === 'global' && !isAdmin.value +); const fetchDropdownData = () => { store.dispatch('agents/get'); @@ -92,7 +97,7 @@ const initNewMacro = () => { action_params: [], }, ], - visibility: 'global', + visibility: isAdmin.value ? 'global' : 'personal', }; }; @@ -110,6 +115,8 @@ watch( ); const saveMacro = async macroData => { + if (isPublicMacroReadOnly.value) return; + try { const action = mode.value === 'EDIT' ? 'macros/update' : 'macros/create'; const successMessage = @@ -136,6 +143,8 @@ const saveMacro = async macroData => { diff --git a/app/javascript/dashboard/routes/dashboard/settings/macros/MacroForm.vue b/app/javascript/dashboard/routes/dashboard/settings/macros/MacroForm.vue index 432b0d46b..b8b00aac9 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/macros/MacroForm.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/macros/MacroForm.vue @@ -16,6 +16,14 @@ export default { type: Object, default: () => ({}), }, + canManagePublicMacros: { + type: Boolean, + default: true, + }, + readOnly: { + type: Boolean, + default: false, + }, }, emits: ['submit'], setup() { @@ -112,19 +120,23 @@ export default {
- +
+ +
@@ -55,8 +89,13 @@ export default {