Detaljpanel
- Komponent
- Status
-
Beta
Detaljpanel (FDetailsPanel) används tillsammand med applikationslayout för att visa detaljer om ett objekt som användaren har valt.
Detaljpanel består av tre slottar:
header
- rubrikcontent
- huvudinnehållfooter
- frivilligt innehåll som placeras längst ner
Detaljpanel kombineras med fördel med justerbar yta (FResizePane) eller fixerad yta (FFixedPane).
Användning
Lägg till en FDetailsPanel
i en yta i FPageLayout
och namnge den med ett unikt namn.
<f-page-layout layout="three-column">
<template #default="layoutScope">
+ <f-details-panel :slot="layoutScope.right" name="awesome-panel">
+ <template #default> </template>
+ </f-details-panel>
<div :slot="layoutScope.content">Innehållsyta</div>
</template>
</f-page-layout>
Om panelen ska ha en justerbar storlek lägg en FResizePane
runt om:
<f-page-layout layout="three-column">
<template #default="layoutScope">
- <f-details-panel :slot="layoutScope.right" name="awesome-panel">
+ <f-resize-pane :slot="layoutScope.right">
+ <f-details-panel name="awesome-panel">
<template #default> </template>
</f-details-panel>
+ </f-resize-pane>
<div :slot="layoutScope.content">Innehållsyta</div>
</template>
</f-page-layout>
Du lägger innehåll i respektive slot:
<f-page-layout layout="three-column">
<template #default="layoutScope">
<f-details-panel :slot="layoutScope.right" name="awesome-panel">
- <template #default> </template>
+ <template #default="panelScope">
+ <h2 :slot="panelScope.header">Rubrik</h2>
+ <div :slot="panelScope.content">Innehåll</div>
+ <div :slot="panelScope.footer">Footer</div>
+ </template>
</f-details-panel>
<div :slot="layoutScope.content">Innehållsyta</div>
</template>
Detalpanelen öppnas med API från useDetailsPanel()
och kräver ett objekt.
Använd namnet du angett i propen name
som identifierare för att hämta ut rätt detaljpanel.
import { useDetailsPanel } from "@fkui/vue";
const panel = useDetailsPanel("awesome-panel");
panel.open(myItem); // öppnar panelen med innehållet från myItem
panel.close(); // stänger panelen, samma som att användaren klickar på stängkrysset
useDetailsPanel()
kan användas överallt i din kodbas så länge namnet matchar en detaljpanel.
Det är säkert att anropa useDetailsPanel()
före detaljpanelen skapats upp men den måste finnas när open()
senare anropas.
Vi rekommenderar att du lägger namnet på panelen i en konstant som återanvänds mellan filer.
export const awesomePanel = "awesomePanel";
import { awesomePanel } from "./constants";
const panel = useDetailsPanel(awesomePanel);
-<f-details-panel name="awesome-panel">
+<f-details-panel :name="awesomePanel">
Du återfår objektet i panelen med scope attribute item
:
<f-details-panel :slot="layoutScope.right" name="awesome-panel">
<template #default="panelScope">
<h2 :slot="panelScope.header">Rubrik</h2>
- <div :slot="panelScope.content">Innehåll</div>
+ <div :slot="panelScope.content">
+ <pre>{{ panelScope.item }}</pre>
+ </div>
<div :slot="panelScope.footer">Footer</div>
</template>
</f-details-panel>
Skicka en valfri callback om du vill agera på att detaljpanelen stängs:
panel.open(myItem, {
onClose() {
/* anropas när detaljpanel stängs */
},
});
Typescript
Detaljpanelen är generic och kan typsäkras genom att skapa ett alias för komponenten.
import { FDetailsPanel, useDetailsPanel } from "@fkui/vue";
interface Item {
name: string;
}
const panel = useDetailsPanel<Item>("awesome-panel");
const ItemPanel = FDetailsPanel<Item>;
panel.open({ name: "Kalle Anka" });
-<f-details-panel name="awesome-panel">
+<item-panel name="awesome-panel">
<template #default="{ item }">
item
kommer då vara av typen Item
.
Definiera upp att elementet ärver från FDetailsPanel
om du använder HTML-validate:
"elements": [
"html5",
+ {
+ "item-panel": { "inherits": "f-details-panel" }
+ }
]
Egna knappar
Du kan lägga in egna knappar som stänger detaljpanelen.
<f-details-panel :slot="layoutScope.right" name="awesome-panel">
<template #default="panelScope">
<h2 :slot="panelScope.header">Rubrik</h2>
- <div :slot="panelScope.content">Innehåll</div>
+ <div :slot="panelScope.content">
+ <button type="button" @click="panelScope.close()">
+ Stäng
+ </button>
+ </div>
<div :slot="panelScope.footer">Footer</div>
</template>
</f-details-panel>
close()
tar en optional sträng som kan användas för att särskilja olika knappar:
<button type="button" @click="close('save')">Spara</button>
<button type="button" @click="close('cancel')">Avbryt</button>
panel.open(myItem, {
onClose({ reason }) {
if (reason === "save") {
/* ... */
}
},
});
Redigera objekt
Riktlinjer för att använda detaljpanelen för att redigera objekt:
- Använd en separat knapp med en annan orsak (
@click="close('save')"
) för att låta slutanvändaren ha möjlighet att ångra sig och förhindra att man oavsikligt redigerar data. - Använd en kopia av objektet och mutera inte originalobjektet direkt förrän användaren explicit valt att spara.
Flera detaljpaneler i samma yta
Ibland är det användbart att skapa upp flera detaljpaneler i samma yta. Som en riktlinje rekommenderar vi att endast visa en detaljpanel åt gången.
Om du har flera detaljpaneler och vill stoppa andra från att visas samtidigt sätt propen exclusive
till ett gemensamt gruppnamn:
Då det blir flera rotelement behöver panelerna placeras i en FFixedPane
eller FResizePane
för att layout ska bete sig korrekt.
<f-fixed-pane>
<f-details-panel name="panel-1" exclusive="panels"></f-details-panel>
<f-details-panel name="panel-2" exclusive="panels"></f-details-panel>
</f-fixed-pane>
Om en detaljpanel i samma grupp öppnas stängs alla andra detaljpaneler automatiskt (utan att onClose()
anropas).
<f-fixed-pane>
<f-details-panel name="panel-1" exclusive="panels"></f-details-panel>
<f-details-panel name="panel-2" exclusive="panels"></f-details-panel>
</f-fixed-pane>
Textnycklar
-
fkui.details-panel.close
-
‐
Default: "Stäng"
Props, Events & Slots
Props
-
name: string
-
Name of this panel. Used when referencing the panel in useDetailsPanel.
-
exclusive: string
Optional -
An optional identifier to prevent other panels with the same identifier from being open at the same time.
Slots
-
default
-
Panel content. Use native slots
Bindings:
item: T
— Object the panel was opened with.close: (reason?: string) => void
— Callback to close the panel. The optional reason will be passed to theonClose()
callback.header: string
— Native slot name for header contentfooter: string
— Native slot name for footer contentcontent: string
— Native slot name for main content