{"version":3,"file":"rockButton.obs.js","sources":["../../../Framework/Controls/rockButton.obs"],"sourcesContent":["<!-- Copyright by the Spark Development Network; Licensed under the Rock Community License -->\n<template>\n    <button ref=\"element\" :class=\"cssClass\" :disabled=\"isButtonDisabled\" @click=\"onButtonClick\" :type=\"type\" v-bind=\"tooltipAttrs\" :data-shortcut-key=\"shortcutKey\">\n        <template v-if=\"isButtonLoading\">\n            <slot name=\"loading\" v-if=\"$slots.loading || loadingText\">{{ loadingText }}</slot>\n            <slot v-else />\n            <template v-if=\"!disableLoadingIndicator\">&nbsp;\n                <LoadingIndicator isSmall class=\"d-inline\" />\n            </template>\n        </template>\n        <slot v-else />\n    </button>\n</template>\n\n<script setup lang=\"ts\">\n    import { computed, onBeforeUnmount, PropType, ref, watch } from \"vue\";\n    import { isPromise } from \"@Obsidian/Utility/promiseUtils\";\n    import { LiteralUnion } from \"@Obsidian/Types/Utility/support\";\n    import { BtnType } from \"@Obsidian/Enums/Controls/btnType\";\n    import { BtnSize } from \"@Obsidian/Enums/Controls/btnSize\";\n    import { tooltip, destroyTooltip } from \"@Obsidian/Utility/tooltip\";\n    import LoadingIndicator from \"./loadingIndicator.obs\";\n\n    const props = defineProps({\n        isLoading: {\n            type: Boolean as PropType<boolean>,\n            default: false\n        },\n        loadingText: {\n            type: String as PropType<string>,\n            default: \"\"\n        },\n        type: {\n            type: String as PropType<\"button\" | \"submit\" | \"reset\">,\n            default: \"button\"\n        },\n        disabled: {\n            type: Boolean as PropType<boolean>,\n            default: false\n        },\n        btnType: {\n            type: String as PropType<LiteralUnion<BtnType>>,\n            default: BtnType.Default\n        },\n        btnSize: {\n            type: String as PropType<BtnSize>,\n            default: BtnSize.Default\n        },\n        autoLoading: {\n            type: Boolean as PropType<boolean>,\n            default: false\n        },\n\n        /**\n         * Automatically disables the button when it is in a loading state or\n         * the click handler is processing. This can prevent duplicate clicks.\n         */\n        autoDisable: {\n            type: Boolean as PropType<boolean>,\n            default: false\n        },\n\n        onClick: {\n            type: Function as PropType<((event: MouseEvent) => void | PromiseLike<void>)>,\n            required: false\n        },\n\n        /** Change button proportions to make it a square. Used for buttons with only an icon. */\n        isSquare: {\n            type: Boolean as PropType<boolean>,\n            default: false\n        },\n\n        /** This gets turned into a tooltip as well as being the accessibility title */\n        title: {\n            type: String\n        },\n\n        shortcutKey: {\n            type: String as PropType<string>,\n            default: \"\"\n        },\n\n        disableLoadingIndicator: {\n            type: Boolean,\n            default: false\n        }\n    });\n\n    const isProcessing = ref(false);\n    const element = ref();\n\n    const isButtonDisabled = computed((): boolean => {\n        return props.disabled || (props.autoDisable && isProcessing.value) || props.isLoading;\n    });\n\n    const isButtonLoading = computed((): boolean => {\n        return props.isLoading || (props.autoLoading && isProcessing.value);\n    });\n\n    const typeClass = computed((): string => {\n        return `btn-${props.btnType}`;\n    });\n\n    const sizeClass = computed((): string => {\n        if (!props.btnSize) {\n            return \"\";\n        }\n\n        return `btn-${props.btnSize}`;\n    });\n\n    const cssClass = computed((): string => {\n        return `btn ${typeClass.value} ${sizeClass.value} ${props.isSquare ? \"btn-square\" : \"\"}`;\n    });\n\n    const tooltipAttrs = computed(() => {\n        if (props.title) {\n            return {\n                title: props.title,\n                \"data-toggle\": \"tooltip\"\n            };\n        }\n        return {};\n    });\n\n    watch([element, () => props.title], () => {\n        if (props.title && element.value) {\n            tooltip(element.value);\n        }\n    });\n\n    onBeforeUnmount(() => {\n        destroyTooltip(element.value);\n    });\n\n    const onButtonClick = async (event: MouseEvent): Promise<void> => {\n        if (isButtonDisabled.value || isButtonLoading.value) {\n            return;\n        }\n\n        isProcessing.value = true;\n\n        try {\n            const clickHandler = props.onClick;\n\n            if (clickHandler) {\n                const result = clickHandler(event);\n\n                if (isPromise(result)) {\n                    await result;\n                }\n            }\n        }\n        finally {\n            isProcessing.value = false;\n        }\n    };\n</script>\n"],"names":["props","__props","isProcessing","ref","element","isButtonDisabled","computed","disabled","autoDisable","value","isLoading","isButtonLoading","autoLoading","typeClass","concat","btnType","sizeClass","btnSize","cssClass","isSquare","tooltipAttrs","title","watch","tooltip","onBeforeUnmount","destroyTooltip","onButtonClick","_ref","_asyncToGenerator","event","clickHandler","onClick","result","isPromise","_x","apply","arguments"],"mappings":"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"}