This commit unifies executable ID structure across categories and scripts, paving the way for more complex ID solutions for #262. It also refactors related code to adapt to the changes. Key changes: - Change numeric IDs to string IDs for categories - Use named types for string IDs to improve code clarity - Add unit tests to verify ID uniqueness Other supporting changes: - Separate concerns in entities for data access and executables by using separate abstractions (`Identifiable` and `RepositoryEntity`) - Simplify usage and construction of entities. - Remove `BaseEntity` for simplicity. - Move creation of categories/scripts to domain layer - Refactor CategoryCollection for better validation logic isolation - Rename some categories to keep the names (used as pseudo-IDs) unique on Windows.
64 lines
1.7 KiB
Vue
64 lines
1.7 KiB
Vue
<template>
|
|
<div class="icon">
|
|
<AppIcon
|
|
v-if="isAnyChildSelected && !areAllChildrenSelected"
|
|
icon="battery-half"
|
|
/>
|
|
<AppIcon
|
|
v-if="areAllChildrenSelected"
|
|
icon="battery-full"
|
|
/>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import { defineComponent, computed, type PropType } from 'vue';
|
|
import AppIcon from '@/presentation/components/Shared/Icon/AppIcon.vue';
|
|
import { injectKey } from '@/presentation/injectionSymbols';
|
|
import type { Category } from '@/domain/Executables/Category/Category';
|
|
import type { ICategoryCollection } from '@/domain/Collection/ICategoryCollection';
|
|
import type { ExecutableId } from '@/domain/Executables/Identifiable';
|
|
|
|
export default defineComponent({
|
|
components: {
|
|
AppIcon,
|
|
},
|
|
props: {
|
|
categoryId: {
|
|
type: String as PropType<ExecutableId>,
|
|
required: true,
|
|
},
|
|
},
|
|
setup(props) {
|
|
const { currentState } = injectKey((keys) => keys.useCollectionState);
|
|
const { currentSelection } = injectKey((keys) => keys.useUserSelectionState);
|
|
const currentCollection = computed<ICategoryCollection>(() => currentState.value.collection);
|
|
|
|
const currentCategory = computed<Category>(
|
|
() => currentCollection.value.getCategory(props.categoryId),
|
|
);
|
|
|
|
const isAnyChildSelected = computed<boolean>(
|
|
() => currentSelection.value.categories.isAnyScriptSelected(currentCategory.value),
|
|
);
|
|
|
|
const areAllChildrenSelected = computed<boolean>(
|
|
() => currentSelection.value.categories.areAllScriptsSelected(currentCategory.value),
|
|
);
|
|
|
|
return {
|
|
isAnyChildSelected,
|
|
areAllChildrenSelected,
|
|
};
|
|
},
|
|
});
|
|
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
@use "@/presentation/assets/styles/main" as *;
|
|
.icon {
|
|
font-size: $font-size-absolute-normal;
|
|
}
|
|
</style>
|