Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions cypress/e2e/editing.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -738,6 +738,34 @@ it("can create and edit manually", function () {
);

cy.get("#editor li:nth-child(5) .nav-link").click();

cy.get(
'[data-testid="accordion-item-noter-accordion-se-gen-base:RedovisningsVarderingsprinciper"]',
).should("exist");
cy.get(
'[data-testid="accordion-item-noter-accordion-se-gen-base:NotOvrigaRorelsekostnader"]',
).should("exist");
cy.get(
'[data-testid="accordion-item-noter-accordion-se-gen-base:NotAndraOvrigaUpplysningar"]',
).should("exist");
cy.get(
'[data-testid="accordion-item-noter-accordion-se-gen-base:NotMedelantaletAnstallda"]',
).should("exist");
cy.get('[name="edit-noter-filter"]').click();
cy.get('[name="edit-noter-filter"]').type("anställ");
cy.get(
'[data-testid="accordion-item-noter-accordion-se-gen-base:RedovisningsVarderingsprinciper"]',
).should("not.exist");
cy.get(
'[data-testid="accordion-item-noter-accordion-se-gen-base:NotOvrigaRorelsekostnader"]',
).should("not.exist");
cy.get(
'[data-testid="accordion-item-noter-accordion-se-gen-base:NotAndraOvrigaUpplysningar"]',
).should("not.exist");
cy.get(
'[data-testid="accordion-item-noter-accordion-se-gen-base:NotMedelantaletAnstallda"]',
).should("exist");

cy.get(
'[data-testid="accordion-item-noter-accordion-se-gen-base:NotMedelantaletAnstallda"]',
).click();
Expand Down Expand Up @@ -775,6 +803,20 @@ it("can create and edit manually", function () {
'#arsredovisning-for-export td:nth-child(3) [name="se-gen-base:MedelantaletAnstallda"]',
).should("have.text", "0");

cy.get("#editor .filter-contents .bi.bi-x-lg").click();
cy.get(
'[data-testid="accordion-item-noter-accordion-se-gen-base:RedovisningsVarderingsprinciper"]',
).should("exist");
cy.get(
'[data-testid="accordion-item-noter-accordion-se-gen-base:NotOvrigaRorelsekostnader"]',
).should("exist");
cy.get(
'[data-testid="accordion-item-noter-accordion-se-gen-base:NotAndraOvrigaUpplysningar"]',
).should("exist");
cy.get(
'[data-testid="accordion-item-noter-accordion-se-gen-base:NotMedelantaletAnstallda"]',
).should("exist");

// Fixar till grunduppgifter
cy.get("#editor li:nth-child(2) .nav-link").click();
cy.get(
Expand Down
24 changes: 24 additions & 0 deletions src/components/common/CommonClearableInput.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<script lang="ts" setup>
/**
* Ett inmatningsfält med en "x"-knapp som rensar inmatningen när den klickas.
*/

import type { InputHTMLAttributes } from "vue";
defineProps</* @vue-ignore */ InputHTMLAttributes>();

const input = defineModel<string>();
</script>

<template>
<input v-model="input" v-bind="$attrs" />
<i v-show="input" class="bi bi-x-lg" v-bind="{}" @click="input = ''"></i>
</template>

<style lang="scss" scoped>
.bi.bi-x-lg {
position: absolute;
right: 10px;
cursor: pointer;
z-index: 100;
}
</style>
187 changes: 129 additions & 58 deletions src/components/edit/sections/EditNoter.vue
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import { TaxonomyRootName } from "@/model/taxonomy/TaxonomyItem.ts";
import BaseEditBeloppradTitle from "@/components/edit/blocks/belopprad/BaseEditBeloppradTitle.vue";
import CommonAccordion from "@/components/common/CommonAccordion.vue";
import CommonAccordionItem from "@/components/common/CommonAccordionItem.vue";
import { computed, ref } from "vue";
import CommonClearableInput from "@/components/common/CommonClearableInput.vue";

// TaxonomyManager och rader
const taxonomyManager = await getTaxonomyManager(TaxonomyRootName.NOTER);
Expand All @@ -40,72 +42,141 @@ const groups = availableTaxonomyItems.children[0].children.flatMap(
(c) => c.children,
);
const groupedBelopprader = groupPrepopulatedSection(belopprader, groups);

const filter = ref<string>("");
const visibleGroups = computed(() => {
if (!filter.value) {
return groups;
}

return groups.filter((g) =>
g.additionalData.displayLabel
?.toLowerCase()
?.includes(filter.value.toLowerCase()),
);
});
</script>

<template>
<div class="d-flex flex-column gap-4">
<div v-for="groupOfGroups in groupsOfGroups" :key="groupOfGroups.xmlName">
<div class="mb-2">
<BaseEditBeloppradTitle
:belopprad="createBelopprad(groupOfGroups)"
:taxonomy-manager="taxonomyManager"
/>
<div class="d-flex flex-column">
<div class="filter-container sticky-top">
<div class="filter-contents">
<div class="d-flex flex-col align-items-center gap-2">
<label for="edit-noter-filter">Filtrera noter:</label>
<CommonClearableInput
id="edit-noter-filter"
v-model="filter"
class="form-control"
name="edit-noter-filter"
placeholder='T.ex. "medelantalet anställda"…'
/>
</div>

<hr />
</div>
</div>

<CommonAccordion>
<CommonAccordionItem
v-for="[groupIndex, group] in [...groups.entries()].filter(([, g]) =>
groupOfGroups.children.includes(g),
)"
:id="`noter-accordion-${group.xmlName}`"
:key="group.xmlName"
:title="group.additionalData.displayLabel"
>
<table>
<thead v-if="groupedBelopprader[groupIndex].length > 1">
<tr>
<th scope="col">{{ group.additionalData.displayLabel }}</th>
<component
:is="
getValueColumnHeaderCell(
group,
arsredovisning.noter,
arsredovisning.verksamhetsarNuvarande,
)
"
/>
<component
:is="
getValueColumnHeaderCell(
group,
arsredovisning.noter,
arsredovisning.verksamhetsarTidigare[0],
)
<div v-if="visibleGroups.length < 1" class="mt-4">
Inga noter matchade filtreringen.
</div>

<div class="d-flex flex-column gap-4 mt-4">
<div
v-for="groupOfGroups in groupsOfGroups.filter((gg) =>
gg.children.some((g) => visibleGroups.includes(g)),
)"
:key="groupOfGroups.xmlName"
>
<div class="mb-2">
<BaseEditBeloppradTitle
:belopprad="createBelopprad(groupOfGroups)"
:taxonomy-manager="taxonomyManager"
/>
</div>

<CommonAccordion>
<CommonAccordionItem
v-for="[groupIndex, group] in [...groups.entries()].filter(
([, g]) =>
groupOfGroups.children.includes(g) && visibleGroups.includes(g),
)"
:id="`noter-accordion-${group.xmlName}`"
:key="group.xmlName"
:title="group.additionalData.displayLabel"
>
<table>
<thead v-if="groupedBelopprader[groupIndex].length > 1">
<tr>
<th scope="col">{{ group.additionalData.displayLabel }}</th>
<component
:is="
getValueColumnHeaderCell(
group,
arsredovisning.noter,
arsredovisning.verksamhetsarNuvarande,
)
"
/>
<component
:is="
getValueColumnHeaderCell(
group,
arsredovisning.noter,
arsredovisning.verksamhetsarTidigare[0],
)
"
v-if="arsredovisning.verksamhetsarTidigare.length > 0"
/>
</tr>
</thead>
<tbody>
<EditBelopprad
v-for="(belopprad, index) in groupedBelopprader[groupIndex]"
:key="belopprad.taxonomyItemName"
v-model:belopprad="groupedBelopprader[groupIndex][index]"
v-model:belopprader="groupedBelopprader[groupIndex]"
:comparable-num-previous-years="
Math.min(arsredovisning.verksamhetsarTidigare.length, 1)
"
v-if="arsredovisning.verksamhetsarTidigare.length > 0"
:string-minimum-level="1"
:taxonomy-manager="taxonomyManager"
monetary-show-balance-sign
string-multiline
/>
</tr>
</thead>
<tbody>
<EditBelopprad
v-for="(belopprad, index) in groupedBelopprader[groupIndex]"
:key="belopprad.taxonomyItemName"
v-model:belopprad="groupedBelopprader[groupIndex][index]"
v-model:belopprader="groupedBelopprader[groupIndex]"
:comparable-num-previous-years="
Math.min(arsredovisning.verksamhetsarTidigare.length, 1)
"
:string-minimum-level="1"
:taxonomy-manager="taxonomyManager"
monetary-show-balance-sign
string-multiline
/>
</tbody>
</table>
</CommonAccordionItem>
</CommonAccordion>
</tbody>
</table>
</CommonAccordionItem>
</CommonAccordion>
</div>
</div>
</div>
</template>

<style lang="scss" scoped></style>
<style lang="scss" scoped>
@import "@/assets/_variables.scss";

// Det här är ganska fult...
.filter-container {
top: $spacing-md;

.filter-contents {
background: $background-light;

margin-top: -$spacing-xl;
margin-left: -$spacing-md;
width: calc(100% + 2 * #{$spacing-md});
padding-left: $spacing-md;
padding-right: $spacing-md;
padding-top: $spacing-xl;
}

hr {
margin-top: $spacing-lg;
margin-bottom: 0;
}

:deep(input) {
flex: 1;
}
}
</style>