From 021dcafeb0e035ac0dd67832b3c20b8db94e824e Mon Sep 17 00:00:00 2001 From: Alexander Onnikov Date: Tue, 25 Jul 2023 17:49:23 +0700 Subject: [PATCH] UBER-615 HR Management: Add departments sidebar (#3522) Signed-off-by: Alexander Onnikov --- models/hr/src/index.ts | 22 +-- models/hr/src/plugin.ts | 4 +- .../src/components/icons/ChevronDown.svelte | 22 +++ packages/ui/src/index.ts | 1 + plugins/hr-assets/lang/en.json | 1 + plugins/hr-assets/lang/ru.json | 1 + plugins/hr-resources/package.json | 1 + .../src/components/Schedule.svelte | 181 ++++++++++-------- .../sidebar/DepartmentsHierarchy.svelte | 59 ++++++ .../src/components/sidebar/Sidebar.svelte | 53 +++++ .../src/components/sidebar/TreeElement.svelte | 70 +++++++ plugins/hr-resources/src/plugin.ts | 5 +- .../components/navigator/TreeElement.svelte | 7 +- .../src/components/NavFooter.svelte | 35 ++++ .../src/components/Navigator.svelte | 19 +- .../src/components/Workbench.svelte | 12 +- plugins/workbench-resources/src/index.ts | 2 + tests/sanity/tests/hr.spec.ts | 2 +- 18 files changed, 365 insertions(+), 132 deletions(-) create mode 100644 packages/ui/src/components/icons/ChevronDown.svelte create mode 100644 plugins/hr-resources/src/components/sidebar/DepartmentsHierarchy.svelte create mode 100644 plugins/hr-resources/src/components/sidebar/Sidebar.svelte create mode 100644 plugins/hr-resources/src/components/sidebar/TreeElement.svelte create mode 100644 plugins/workbench-resources/src/components/NavFooter.svelte diff --git a/models/hr/src/index.ts b/models/hr/src/index.ts index b93bdb49c6..2ae5d2e3c9 100644 --- a/models/hr/src/index.ts +++ b/models/hr/src/index.ts @@ -1,5 +1,5 @@ // -// Copyright © 2022 Hardcore Engineering Inc. +// Copyright © 2022, 2023 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 @@ -185,25 +185,7 @@ export function createModel (builder: Builder): void { icon: hr.icon.HR, alias: hrId, hidden: false, - navigatorModel: { - specials: [ - { - id: 'structure', - component: hr.component.Structure, - icon: hr.icon.Structure, - label: hr.string.Structure, - position: 'top' - }, - { - id: 'schedule', - component: hr.component.Schedule, - icon: calendar.icon.Calendar, - label: hr.string.Schedule, - position: 'top' - } - ], - spaces: [] - } + component: hr.component.Schedule }, hr.app.HR ) diff --git a/models/hr/src/plugin.ts b/models/hr/src/plugin.ts index a36359cb4d..c61b506028 100644 --- a/models/hr/src/plugin.ts +++ b/models/hr/src/plugin.ts @@ -1,5 +1,5 @@ // -// Copyright © 2022 Hardcore Engineering Inc. +// Copyright © 2022, 2023 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 @@ -23,8 +23,6 @@ import { Action, ActionCategory, ViewAction } from '@hcengineering/view' export default mergeIds(hrId, hr, { string: { - HRApplication: '' as IntlString, - Departments: '' as IntlString, Request: '' as IntlString, Vacation: '' as IntlString, Sick: '' as IntlString, diff --git a/packages/ui/src/components/icons/ChevronDown.svelte b/packages/ui/src/components/icons/ChevronDown.svelte new file mode 100644 index 0000000000..e602bba1cb --- /dev/null +++ b/packages/ui/src/components/icons/ChevronDown.svelte @@ -0,0 +1,22 @@ + + + + + + diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index c1a6c5c297..22a99e11e2 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -141,6 +141,7 @@ export { default as IconInfo } from './components/icons/Info.svelte' export { default as IconBlueCheck } from './components/icons/BlueCheck.svelte' export { default as IconCheck } from './components/icons/Check.svelte' export { default as IconCheckAll } from './components/icons/CheckAll.svelte' +export { default as IconChevronDown } from './components/icons/ChevronDown.svelte' export { default as IconArrowLeft } from './components/icons/ArrowLeft.svelte' export { default as IconArrowRight } from './components/icons/ArrowRight.svelte' export { default as IconNavPrev } from './components/icons/NavPrev.svelte' diff --git a/plugins/hr-assets/lang/en.json b/plugins/hr-assets/lang/en.json index 66039f8374..b95710158f 100644 --- a/plugins/hr-assets/lang/en.json +++ b/plugins/hr-assets/lang/en.json @@ -15,6 +15,7 @@ "MoveStaff": "Employee transfer", "MoveStaffDescr": "Do you want to transfer employee from {current} to {department}", "Departments": "Departments", + "Positions": "Positions", "ShowEmployees": "Show employees", "AddEmployee": "Add employee", "SelectEmployee": "Select employee", diff --git a/plugins/hr-assets/lang/ru.json b/plugins/hr-assets/lang/ru.json index 1dea119b6c..462fe064e2 100644 --- a/plugins/hr-assets/lang/ru.json +++ b/plugins/hr-assets/lang/ru.json @@ -15,6 +15,7 @@ "MoveStaff": "Перевод сотрудника", "MoveStaffDescr": "Вы действительно хотите перевести сотрудника из {current} в {department}", "Departments": "Департаменты", + "Positions": "Позиции", "ShowEmployees": "Просмотреть сотрудников", "AddEmployee": "Добавить сотрудника", "SelectEmployee": "Выберите сотрудника", diff --git a/plugins/hr-resources/package.json b/plugins/hr-resources/package.json index 8a513b8f79..c81684cd94 100644 --- a/plugins/hr-resources/package.json +++ b/plugins/hr-resources/package.json @@ -45,6 +45,7 @@ "@hcengineering/view-resources": "^0.6.0", "@hcengineering/contact-resources": "^0.6.0", "@hcengineering/attachment-resources": "^0.6.0", + "@hcengineering/workbench-resources": "^0.6.1", "@hcengineering/text-editor": "^0.6.0", "@hcengineering/setting": "^0.6.9", "@hcengineering/attachment": "^0.6.8", diff --git a/plugins/hr-resources/src/components/Schedule.svelte b/plugins/hr-resources/src/components/Schedule.svelte index 0291d9e2cc..be20fd353b 100644 --- a/plugins/hr-resources/src/components/Schedule.svelte +++ b/plugins/hr-resources/src/components/Schedule.svelte @@ -19,12 +19,17 @@ import { employeeByIdStore } from '@hcengineering/contact-resources' import { DocumentQuery, getCurrentAccount, Ref } from '@hcengineering/core' import { Department, Staff } from '@hcengineering/hr' - import { createQuery, SpaceSelector } from '@hcengineering/presentation' + import { createQuery } from '@hcengineering/presentation' import type { TabItem } from '@hcengineering/ui' import { Button, IconBack, IconForward, Label, SearchEdit, TabList } from '@hcengineering/ui' import view from '@hcengineering/view' + import hr from '../plugin' + import ScheduleView from './ScheduleView.svelte' + import Sidebar from './sidebar/Sidebar.svelte' + + export let visibileNav = true const accountEmployee = $employeeByIdStore.get((getCurrentAccount() as EmployeeAccount).employee) let accountStaff: Staff | undefined @@ -97,94 +102,104 @@ } } + function departmentSelected (selected: Ref): void { + department = selected + } + const viewslist: TabItem[] = [ { id: 'chart', icon: view.icon.Views }, { id: 'stats', icon: view.icon.Table } ] -
-
- -
+
+ {#if visibileNav} + departmentSelected(e.detail)} + /> + {/if} -
- {#if mode === CalendarMode.Month} - { - if (result.detail !== undefined) display = result.detail.id - }} - /> - {/if} - -
-
-
-
- updateResultQuery(search)} /> - -
-
- - -
-
-
-
-
-
- -
- + + + diff --git a/plugins/hr-resources/src/components/sidebar/DepartmentsHierarchy.svelte b/plugins/hr-resources/src/components/sidebar/DepartmentsHierarchy.svelte new file mode 100644 index 0000000000..116fc08b84 --- /dev/null +++ b/plugins/hr-resources/src/components/sidebar/DepartmentsHierarchy.svelte @@ -0,0 +1,59 @@ + + + +{#each departments as dep} + {@const department = departmentById.get(dep)} + {@const desc = getDescendants(dep)} + + {#if department} + 0} + {level} + on:click={() => handleDepartmentSelected(department._id)} + > + {#if desc.length} + + {/if} + + {/if} +{/each} diff --git a/plugins/hr-resources/src/components/sidebar/Sidebar.svelte b/plugins/hr-resources/src/components/sidebar/Sidebar.svelte new file mode 100644 index 0000000000..bc8ef5d2b8 --- /dev/null +++ b/plugins/hr-resources/src/components/sidebar/Sidebar.svelte @@ -0,0 +1,53 @@ + + + +
+ + + + + +
+ + + + + +
+ + + + + + + +
diff --git a/plugins/hr-resources/src/components/sidebar/TreeElement.svelte b/plugins/hr-resources/src/components/sidebar/TreeElement.svelte new file mode 100644 index 0000000000..c05eed4177 --- /dev/null +++ b/plugins/hr-resources/src/components/sidebar/TreeElement.svelte @@ -0,0 +1,70 @@ + + + + +
{ + if (selected) { + collapsed = !collapsed + } + dispatch('click') + }} +> + + {#if icon && !parent} +
+ +
+ {/if} + + {#if label} + + {#if node} +
+ +
+ {/if} +
+
+{#if node && !collapsed} +
+{/if} diff --git a/plugins/hr-resources/src/plugin.ts b/plugins/hr-resources/src/plugin.ts index da007216df..828ab725e0 100644 --- a/plugins/hr-resources/src/plugin.ts +++ b/plugins/hr-resources/src/plugin.ts @@ -18,7 +18,9 @@ import { IntlString, mergeIds } from '@hcengineering/platform' export default mergeIds(hrId, hr, { string: { + HRApplication: '' as IntlString, Department: '' as IntlString, + Departments: '' as IntlString, ParentDepartmentLabel: '' as IntlString, Structure: '' as IntlString, CreateDepartment: '' as IntlString, @@ -55,6 +57,7 @@ export default mergeIds(hrId, hr, { Managers: '' as IntlString, Export: '' as IntlString, Separator: '' as IntlString, - ChooseSeparator: '' as IntlString + ChooseSeparator: '' as IntlString, + Positions: '' as IntlString } }) diff --git a/plugins/view-resources/src/components/navigator/TreeElement.svelte b/plugins/view-resources/src/components/navigator/TreeElement.svelte index 471fd80b0b..ef33385bbc 100644 --- a/plugins/view-resources/src/components/navigator/TreeElement.svelte +++ b/plugins/view-resources/src/components/navigator/TreeElement.svelte @@ -1,5 +1,6 @@ + + +