diff --git a/docs/guides/custom-page-layout.md b/docs/guides/custom-page-layout.md index 5203f2843e..f8490a87ed 100644 --- a/docs/guides/custom-page-layout.md +++ b/docs/guides/custom-page-layout.md @@ -26,6 +26,7 @@ registerLayout({ content: { attachPanel: "none", direction: "column", + scroll: true, }, footer: { attachPanel: "none", @@ -39,6 +40,7 @@ där: - `attachPanel` talar om hur en panel ska fästas. Om ytan inte kan ta paneler sätter man `"none"`. - `direction` talar om ifall ytan flödar horisontellt eller vertikalt. +- `scroll` talar om ifall ytan ska scrolla (i den riktning som `direction` talar om). Styling använder [CSS grid](https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/CSS_layout/Grids) på `::part(grid name)` och kan se ut så här: diff --git a/packages/vue/src/components/FPageClosablePanel/FPageClosablePanel.vue b/packages/vue/src/components/FPageClosablePanel/FPageClosablePanel.vue new file mode 100644 index 0000000000..36090c2a01 --- /dev/null +++ b/packages/vue/src/components/FPageClosablePanel/FPageClosablePanel.vue @@ -0,0 +1,141 @@ + + + + + + + diff --git a/packages/vue/src/components/FPageClosablePanel/index.ts b/packages/vue/src/components/FPageClosablePanel/index.ts new file mode 100644 index 0000000000..889a9eca09 --- /dev/null +++ b/packages/vue/src/components/FPageClosablePanel/index.ts @@ -0,0 +1 @@ +export { default as FPageClosablePanel } from "./FPageClosablePanel.vue"; diff --git a/packages/vue/src/components/FPageClosablePanel/use-panel.ts b/packages/vue/src/components/FPageClosablePanel/use-panel.ts new file mode 100644 index 0000000000..686d186e2a --- /dev/null +++ b/packages/vue/src/components/FPageClosablePanel/use-panel.ts @@ -0,0 +1,57 @@ +import { type Ref, ref } from "vue"; + +type PanelCallback = (data: { item: T; reason: string }) => void; + +interface ClosablePanelControl { + readonly name: Readonly>; + item: Ref; + callback: Ref | null>; + open(item: T, options?: { onClose?: PanelCallback }): void; + close(): void; + destroy(): void; +} + +interface ClosablePanel { + open(item: T, options?: { onClose?: PanelCallback }): void; + close(): void; +} + +const panels: Array> = []; + +export function createClosablePanel(name: string): ClosablePanelControl { + const control: ClosablePanelControl = { + name: ref(name), + item: ref(null), + callback: ref(null), + open(item, options) { + this.item.value = item; + this.callback.value = options?.onClose ?? null; + }, + close() { + this.item.value = null; + this.callback.value = null; + }, + destroy() { + /* do nothing */ + }, + }; + panels.push(control); + return control as ClosablePanelControl; +} + +export function usePanel(name: string): ClosablePanel { + return { + open(item, options) { + const panel = panels.find((it) => it.name.value === name); + if (panel) { + panel.open(item, options); + } + }, + close() { + const panel = panels.find((it) => it.name.value === name); + if (panel) { + panel.close(); + } + }, + }; +} diff --git a/packages/vue/src/components/FPageExpandablePanel/FPageExpandablePanel.vue b/packages/vue/src/components/FPageExpandablePanel/FPageExpandablePanel.vue index fbb0bca257..6847bae54e 100644 --- a/packages/vue/src/components/FPageExpandablePanel/FPageExpandablePanel.vue +++ b/packages/vue/src/components/FPageExpandablePanel/FPageExpandablePanel.vue @@ -1,5 +1,11 @@ + + +