<template>
<RequestStatusMessage
v-if="!loadAssetReqStatus || loadAssetReqStatus.isPending"
:requestStatus="loadAssetReqStatus"
/>
<div v-else-if="loadAssetReqStatus.isError" class="p-2 text-center text-neutral-400 dark:text-neutral-300">
<template v-if="schemaVariantId"> Asset "{{ schemaVariantId }}" Function does not exist! </template>
<template v-else>Select an asset to view it.</template>
</div>
<ScrollArea
v-else-if="selectedAsset && editingAsset"
class="flex flex-col h-full border border-t-0 border-neutral-300 dark:border-neutral-600"
>
<template #top>
<AssetEditorHeader :selectedAsset="selectedAsset" />
</template>
<CodeEditor
:id="
changeSetsStore.headChangeSetId === changeSetsStore.selectedChangeSetId ? undefined : `asset-${schemaVariantId}`
"
v-model="editingAsset"
:disabled="selectedAsset.isLocked"
:recordId="selectedAsset.schemaVariantId"
:typescript="editorTs || ''"
@change="onChange"
/>
</ScrollArea>
<LoadingMessage v-else />
</template>
<script lang="ts" setup>
import { ref, watch, computed, onMounted, ComputedRef } from "vue";
import { ApiRequestStatus } from "@si/vue-lib/pinia";
import * as _ from "lodash-es";
import { RequestStatusMessage, ScrollArea, LoadingMessage } from "@si/vue-lib/design-system";
import { useAssetStore } from "@/store/asset.store";
import { useFuncStore } from "@/store/func/funcs.store";
import { useChangeSetsStore } from "@/store/change_sets.store";
import { editor_ts, loadEditorTs } from "@/utils/load_editor_ts";
import { SchemaVariantId } from "@/api/sdf/dal/schema";
import CodeEditor from "./CodeEditor.vue";
import AssetEditorHeader from "./AssetEditorHeader.vue";
const changeSetsStore = useChangeSetsStore();
const editorTs = ref<string | null>(null);
const props = defineProps<{
schemaVariantId?: SchemaVariantId;
}>();
const assetStore = useAssetStore();
const funcStore = useFuncStore();
const selectedAsset = computed(() =>
props.schemaVariantId ? assetStore.variantFromListById[props.schemaVariantId] : undefined,
);
const selectedAssetFuncCode = computed(() => {
const fId = selectedAsset.value?.assetFuncId;
if (!fId) return null;
return funcStore.funcCodeById[fId]?.code;
});
const editingAsset = ref<string>(selectedAssetFuncCode.value ?? "");
let loadAssetReqStatus: ComputedRef<ApiRequestStatus>;
watch(
() => selectedAsset.value,
() => {
loadAssetReqStatus = funcStore.getRequestStatus("FETCH_CODE", selectedAsset.value?.assetFuncId);
},
{ immediate: true },
);
watch(
[() => editingAsset.value, () => selectedAssetFuncCode.value],
async () => {
if (editingAsset.value !== selectedAssetFuncCode.value) {
editingAsset.value = selectedAssetFuncCode.value ?? "";
}
},
{ immediate: true },
);
const updatedHead = ref(false);
watch(
() => changeSetsStore.selectedChangeSetId,
() => {
updatedHead.value = false;
},
);
const onChange = (_schemaVariantId: string, code: string, debounce: boolean) => {
if (
!selectedAsset.value ||
selectedAsset.value.isLocked ||
selectedAssetFuncCode.value === editingAsset.value ||
updatedHead.value
) {
return;
}
updatedHead.value = changeSetsStore.selectedChangeSetId === changeSetsStore.headChangeSetId;
if (!updatedHead.value) {
const asset = _.cloneDeep(selectedAsset.value);
assetStore.enqueueVariantSave(
{
...asset,
},
code,
debounce,
);
}
};
onMounted(async () => {
if (!editor_ts) {
editorTs.value = await loadEditorTs();
} else {
editorTs.value = editor_ts;
}
});
</script>