From 6ddcdd5d1bab9481ea55fe39ffa0c11e827115db Mon Sep 17 00:00:00 2001
From: Denis Bykhov <bykhov.denis@gmail.com>
Date: Fri, 6 Dec 2024 22:15:32 +0500
Subject: [PATCH] Fix office sidebar (#7283)

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
---
 models/love/src/index.ts                      |   3 +-
 .../src/components/FloorPreview.svelte        |   9 +-
 .../src/components/Floors.svelte              | 105 ------------------
 .../love-resources/src/components/Hall.svelte |  27 +++--
 .../src/components/LoveWidget.svelte          | 102 +++++++++--------
 plugins/love-resources/src/stores.ts          |   1 +
 6 files changed, 71 insertions(+), 176 deletions(-)
 delete mode 100644 plugins/love-resources/src/components/Floors.svelte

diff --git a/models/love/src/index.ts b/models/love/src/index.ts
index a5222eeef7..9457c67b8b 100644
--- a/models/love/src/index.ts
+++ b/models/love/src/index.ts
@@ -275,8 +275,7 @@ export function createModel (builder: Builder): void {
       label: love.string.Office,
       type: WidgetType.Fixed,
       icon: love.icon.Love,
-      component: love.component.LoveWidget,
-      headerLabel: love.string.Office
+      component: love.component.LoveWidget
     },
     love.ids.LoveWidget
   )
diff --git a/plugins/love-resources/src/components/FloorPreview.svelte b/plugins/love-resources/src/components/FloorPreview.svelte
index a055751e95..7e5372e1ac 100644
--- a/plugins/love-resources/src/components/FloorPreview.svelte
+++ b/plugins/love-resources/src/components/FloorPreview.svelte
@@ -86,14 +86,7 @@
   let pressed: boolean = false
   const clickMore = (e: MouseEvent): void => {
     pressed = true
-    const value: SelectPopupValueType[] = [
-      {
-        id: 'configure',
-        icon: IconSettings,
-        label: configure ? plugin.string.FinalizeEditing : plugin.string.EditOffice
-      },
-      { id: 'rename', icon: IconEdit, label: plugin.string.RenameAFloor }
-    ]
+    const value: SelectPopupValueType[] = [{ id: 'rename', icon: IconEdit, label: plugin.string.RenameAFloor }]
     showPopup(SelectPopup, { value }, eventToHTMLElement(e), (result) => {
       if (result === 'configure') {
         dispatch('configure', floor)
diff --git a/plugins/love-resources/src/components/Floors.svelte b/plugins/love-resources/src/components/Floors.svelte
deleted file mode 100644
index ba1a66d752..0000000000
--- a/plugins/love-resources/src/components/Floors.svelte
+++ /dev/null
@@ -1,105 +0,0 @@
-<!--
-// Copyright © 2024 Hardcore Engineering Inc.
-//
-// Licensed under the Eclipse Public License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License. You may
-// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//
-// See the License for the specific language governing permissions and
-// limitations under the License.
--->
-<script lang="ts">
-  import { AccountRole, Ref, getCurrentAccount, hasAccountRole } from '@hcengineering/core'
-  import {
-    ButtonIcon,
-    IconAdd,
-    Label,
-    Scroller,
-    Separator,
-    defineSeparators,
-    eventToHTMLElement,
-    showPopup,
-    deviceOptionsStore as deviceInfo
-  } from '@hcengineering/ui'
-  import { Floor as FloorType, Room } from '@hcengineering/love'
-  import love from '../plugin'
-  import { floors, rooms } from '../stores'
-  import { loveSeparators } from '../types'
-  import EditFloorPopup from './EditFloorPopup.svelte'
-  import FloorPreview from './FloorPreview.svelte'
-
-  export let floor: Ref<FloorType>
-  export let configure: boolean
-
-  const me = getCurrentAccount()
-
-  function getRooms (rooms: Room[], floor: Ref<FloorType>): Room[] {
-    return rooms.filter((p) => p.floor === floor)
-  }
-
-  function addFloor (e: MouseEvent): void {
-    showPopup(EditFloorPopup, {}, eventToHTMLElement(e))
-  }
-
-  let editable: boolean = false
-  $: editable = hasAccountRole(me, AccountRole.Maintainer)
-
-  defineSeparators('love', loveSeparators)
-</script>
-
-{#if $deviceInfo.navigator.visible}
-  <div
-    class="antiPanel-navigator {$deviceInfo.navigator.direction === 'horizontal'
-      ? 'portrait'
-      : 'landscape'} border-left will-change-opacity"
-    class:fly={$deviceInfo.navigator.float}
-  >
-    <div class="antiPanel-wrap__content hulyNavPanel-container">
-      <div class="hulyNavPanel-header" class:withButton={editable}>
-        <span class="overflow-label">
-          <Label label={love.string.Floors} />
-        </span>
-        {#if editable}
-          <ButtonIcon icon={IconAdd} kind={'primary'} size={'small'} on:click={addFloor} />
-        {/if}
-      </div>
-      <Scroller fade={{ multipler: { top: 4, bottom: 0 } }} shrink>
-        {#each $floors as _floor}
-          <FloorPreview
-            showRoomName
-            floor={_floor}
-            configurable
-            configure={configure && floor === _floor._id}
-            rooms={getRooms($rooms, _floor._id)}
-            selected={floor === _floor._id}
-            background={'var(--theme-navpanel-color)'}
-            on:configure={() => {
-              if (floor === _floor._id) {
-                configure = !configure
-              } else {
-                floor = _floor._id
-                configure = true
-              }
-            }}
-            on:select={() => {
-              floor = _floor._id
-            }}
-          />
-        {/each}
-      </Scroller>
-    </div>
-    <Separator name={'love'} float={$deviceInfo.navigator.float ? 'navigator' : true} index={0} color={'transparent'} />
-  </div>
-  <Separator
-    name={'love'}
-    float={$deviceInfo.navigator.float}
-    index={0}
-    color={'transparent'}
-    separatorSize={0}
-    short
-  />
-{/if}
diff --git a/plugins/love-resources/src/components/Hall.svelte b/plugins/love-resources/src/components/Hall.svelte
index 26808c0361..829ee04544 100644
--- a/plugins/love-resources/src/components/Hall.svelte
+++ b/plugins/love-resources/src/components/Hall.svelte
@@ -20,17 +20,26 @@
   import { getClient } from '@hcengineering/presentation'
   import { deviceOptionsStore as deviceInfo, getCurrentLocation, navigate } from '@hcengineering/ui'
   import { onDestroy, onMount } from 'svelte'
-  import { activeFloor, floors, infos, invites, myInfo, myRequests, rooms, storePromise } from '../stores'
+  import {
+    activeFloor,
+    floors,
+    infos,
+    invites,
+    myInfo,
+    myRequests,
+    rooms,
+    selectedFloor,
+    storePromise
+  } from '../stores'
   import { connectToMeeting, tryConnect } from '../utils'
   import Floor from './Floor.svelte'
   import FloorConfigure from './FloorConfigure.svelte'
-  import Floors from './Floors.svelte'
 
   function getRooms (rooms: Room[], floor: Ref<FloorType>): Room[] {
     return rooms.filter((p) => p.floor === floor)
   }
 
-  let selectedFloor = $activeFloor === '' ? $floors[0]?._id : $activeFloor
+  $: floor = $selectedFloor ?? ($activeFloor === '' ? $floors[0]?._id : $activeFloor)
   let configure: boolean = false
   let replacedPanel: HTMLElement
 
@@ -73,21 +82,15 @@
   })
 </script>
 
-<Floors bind:floor={selectedFloor} bind:configure />
 <div class="antiPanel-component filledNav" bind:this={replacedPanel}>
   {#if configure}
     <FloorConfigure
-      rooms={getRooms($rooms, selectedFloor)}
-      floor={selectedFloor}
+      rooms={getRooms($rooms, floor)}
+      {floor}
       {excludedPersons}
       on:configure={() => (configure = false)}
     />
   {:else}
-    <Floor
-      rooms={getRooms($rooms, selectedFloor)}
-      floor={selectedFloor}
-      on:configure={() => (configure = true)}
-      on:open
-    />
+    <Floor rooms={getRooms($rooms, floor)} {floor} on:configure={() => (configure = true)} on:open />
   {/if}
 </div>
diff --git a/plugins/love-resources/src/components/LoveWidget.svelte b/plugins/love-resources/src/components/LoveWidget.svelte
index fda8cfb3b0..ed6fea387e 100644
--- a/plugins/love-resources/src/components/LoveWidget.svelte
+++ b/plugins/love-resources/src/components/LoveWidget.svelte
@@ -13,74 +13,78 @@
 // limitations under the License.
 -->
 <script lang="ts">
-  import { Floor, Room } from '@hcengineering/love'
-  import { Ref } from '@hcengineering/core'
-  import ui, { IconChevronLeft, ModernButton, Scroller } from '@hcengineering/ui'
+  import { AccountRole, getCurrentAccount, hasAccountRole, Ref } from '@hcengineering/core'
+  import love, { Floor, Room } from '@hcengineering/love'
+  import { Breadcrumbs, ButtonIcon, eventToHTMLElement, Header, IconAdd, Scroller, showPopup } from '@hcengineering/ui'
+  import { floors, rooms, selectedFloor } from '../stores'
   import FloorPreview from './FloorPreview.svelte'
-  import { floors, rooms } from '../stores'
-  import IconLayers from './icons/Layers.svelte'
-  import love from '../plugin'
+  import EditFloorPopup from './EditFloorPopup.svelte'
 
-  let selectedFloor: Floor | undefined
-  let floorsSelector: boolean = false
+  let configure: boolean
 
-  $: if (selectedFloor === undefined && $floors.length > 0) {
-    selectedFloor = $floors[0]
+  const me = getCurrentAccount()
+  let floor: Floor | undefined
+
+  $: if (floor === undefined && $floors.length > 0) {
+    floor = $floors[0]
   }
 
   function getRooms (rooms: Room[], floor: Ref<Floor>): Room[] {
     return rooms.filter((p) => p.floor === floor)
   }
 
-  function changeMode (): void {
-    floorsSelector = !floorsSelector
+  function addFloor (e: MouseEvent): void {
+    showPopup(EditFloorPopup, {}, eventToHTMLElement(e))
   }
 
-  function selectFloor (_id: Ref<Floor>): void {
-    selectedFloor = $floors.find((p) => p._id === _id)
-    floorsSelector = false
-  }
+  let editable: boolean = false
+  $: editable = hasAccountRole(me, AccountRole.Maintainer)
 </script>
 
+<Header
+  allowFullsize={false}
+  type="type-aside"
+  hideBefore={true}
+  hideActions={false}
+  hideDescription={true}
+  adaptive="disabled"
+  closeOnEscape={false}
+  on:close
+>
+  <Breadcrumbs items={[{ label: love.string.Office }]} currentOnly />
+  <svelte:fragment slot="extra">
+    {#if editable}
+      <ButtonIcon icon={IconAdd} kind={'primary'} size={'small'} on:click={addFloor} />
+    {/if}
+  </svelte:fragment>
+</Header>
 <div class="hulyModal-container noTopIndent type-aside">
   <div class="hulyModal-content">
     <Scroller>
-      {#if floorsSelector}
-        {#each $floors as _floor}
-          <FloorPreview
-            showRoomName
-            floor={_floor}
-            rooms={getRooms($rooms, _floor._id)}
-            selected={selectedFloor?._id === _floor._id}
-            kind={'no-border'}
-            background={'var(--theme-panel-color)'}
-            on:select={() => {
-              selectFloor(_floor._id)
-            }}
-          />
-        {/each}
-      {:else if selectedFloor}
+      {#each $floors as _floor}
         <FloorPreview
-          floor={selectedFloor}
           showRoomName
-          rooms={getRooms($rooms, selectedFloor._id)}
-          selected
-          isOpen
-          disabled
-          cropped
-          kind={'no-border'}
-          background={'var(--theme-panel-color)'}
+          floor={_floor}
+          configurable
+          configure={configure && floor?._id === _floor._id}
+          rooms={getRooms($rooms, _floor._id)}
+          selected={floor?._id === _floor._id}
+          background={'var(--theme-navpanel-color)'}
+          on:configure={() => {
+            if (floor?._id === _floor._id) {
+              configure = !configure
+            } else {
+              selectedFloor.set(_floor?._id)
+              floor = _floor
+              configure = true
+            }
+          }}
+          on:select={() => {
+            selectedFloor.set(_floor?._id)
+            floor = _floor
+          }}
         />
-      {/if}
+      {/each}
     </Scroller>
   </div>
-  {#if floorsSelector || $floors.length > 1}
-    <div class="hulyModal-footer">
-      <ModernButton
-        on:click={changeMode}
-        icon={floorsSelector ? IconChevronLeft : IconLayers}
-        label={floorsSelector ? ui.string.Back : love.string.ChangeFloor}
-      />
-    </div>
-  {/if}
 </div>
diff --git a/plugins/love-resources/src/stores.ts b/plugins/love-resources/src/stores.ts
index 26a1538a13..a0780768c8 100644
--- a/plugins/love-resources/src/stores.ts
+++ b/plugins/love-resources/src/stores.ts
@@ -34,6 +34,7 @@ export const currentRoom = derived([rooms, myInfo], ([rooms, myInfo]) => {
   return myInfo !== undefined ? rooms.find((p) => p._id === myInfo.room) : undefined
 })
 export const floors = writable<Floor[]>([])
+export const selectedFloor = writable<Ref<Floor> | undefined>(undefined)
 export const activeFloor = derived([rooms, myInfo, myOffice], ([rooms, myInfo, myOffice]) => {
   let res: Ref<Floor> | undefined
   if (myInfo !== undefined) {