Files
privacy.sexy/src/presentation/components/Scripts/View/Cards/CardSelectionIndicator.vue
undergroundwires ded55a66d6 Refactor executable IDs to use strings #262
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.
2024-08-03 16:54:14 +02:00

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>