@cwellt_software/shared-employee 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/AccountingRulesTab-CdYj-dz8.js +84 -0
  2. package/dist/AccountingRulesTab-DQJ7nD71.cjs +1 -0
  3. package/dist/AdditionalInfoTab-DW-S373w.cjs +1 -0
  4. package/dist/AdditionalInfoTab-j-Ixuvog.js +114 -0
  5. package/dist/App.d.ts +3 -0
  6. package/dist/ChangeRequestsTab-CFCWKZkt.js +342 -0
  7. package/dist/ChangeRequestsTab-CY7-qObu.cjs +1 -0
  8. package/dist/CosmicRadiationTab-6fqnDLH3.cjs +1 -0
  9. package/dist/CosmicRadiationTab-CLlfjJNA.js +120 -0
  10. package/dist/DeleteDialog-BqXtjGGi.cjs +1 -0
  11. package/dist/DeleteDialog-CyRsLr_c.js +21 -0
  12. package/dist/DetailsTab-DKFAMvlW.cjs +1 -0
  13. package/dist/DetailsTab-Dh1lfSr2.js +248 -0
  14. package/dist/DivisionsTab--eEVFupH.cjs +1 -0
  15. package/dist/DivisionsTab-BfIIZ_ld.js +86 -0
  16. package/dist/FunctionsTab-BMWoqfK2.js +160 -0
  17. package/dist/FunctionsTab-DQPsK0rq.cjs +1 -0
  18. package/dist/HistoryTab-CViMxBYc.cjs +1 -0
  19. package/dist/HistoryTab-CwCD46f3.js +277 -0
  20. package/dist/LanguagesTab-BKa7nmoT.cjs +1 -0
  21. package/dist/LanguagesTab-BznJDDXK.js +181 -0
  22. package/dist/RelatedPersonsTab-C-6ti_Be.js +260 -0
  23. package/dist/RelatedPersonsTab-DgoBLK21.cjs +1 -0
  24. package/dist/VaccinesTab-BGhy3EgY.cjs +1 -0
  25. package/dist/VaccinesTab-BtdAXAyo.js +171 -0
  26. package/dist/context/DialogShellContext.d.ts +22 -0
  27. package/dist/dateUtils-BULQTXVb.cjs +1 -0
  28. package/dist/dateUtils-CTu1RDq1.js +25 -0
  29. package/dist/domain/model/ChangeRequest.d.ts +23 -0
  30. package/dist/domain/model/Dietary.d.ts +24 -0
  31. package/dist/domain/model/EmployeeDetail.d.ts +89 -0
  32. package/dist/domain/model/EmployeeDropdowns.d.ts +31 -0
  33. package/dist/domain/model/EmployeeListItem.d.ts +15 -0
  34. package/dist/domain/model/EmployeeTabModels.d.ts +91 -0
  35. package/dist/domain/repository/DietaryRepository.d.ts +8 -0
  36. package/dist/domain/repository/EmployeeRepository.d.ts +62 -0
  37. package/dist/index.d.ts +18 -0
  38. package/dist/infrastructure/DietaryRepositoryImpl.d.ts +20 -0
  39. package/dist/infrastructure/EmployeeRepositoryImpl.d.ts +74 -0
  40. package/dist/infrastructure/dto/DietaryDto.d.ts +26 -0
  41. package/dist/main.d.ts +1 -0
  42. package/dist/presentation/EmployeeOverview.d.ts +18 -0
  43. package/dist/presentation/common/DeleteDialog.d.ts +16 -0
  44. package/dist/presentation/common/EmptyState.d.ts +11 -0
  45. package/dist/presentation/common/LazyImage.d.ts +15 -0
  46. package/dist/presentation/common/useLazyTabs.d.ts +14 -0
  47. package/dist/presentation/comps/modals/AddEmployeeModal.d.ts +10 -0
  48. package/dist/presentation/comps/modals/EditEmployeeModal.d.ts +13 -0
  49. package/dist/presentation/comps/tabs/AccountingRulesTab.d.ts +10 -0
  50. package/dist/presentation/comps/tabs/AdditionalInfoTab.d.ts +12 -0
  51. package/dist/presentation/comps/tabs/ChangeRequestsTab.d.ts +16 -0
  52. package/dist/presentation/comps/tabs/CosmicRadiationTab.d.ts +8 -0
  53. package/dist/presentation/comps/tabs/DetailsTab.d.ts +8 -0
  54. package/dist/presentation/comps/tabs/DivisionsTab.d.ts +11 -0
  55. package/dist/presentation/comps/tabs/FunctionsTab.d.ts +13 -0
  56. package/dist/presentation/comps/tabs/HistoryTab.d.ts +15 -0
  57. package/dist/presentation/comps/tabs/LanguagesTab.d.ts +13 -0
  58. package/dist/presentation/comps/tabs/RelatedPersonsTab.d.ts +13 -0
  59. package/dist/presentation/comps/tabs/VaccinesTab.d.ts +12 -0
  60. package/dist/presentation/dietary/DietaryPage.d.ts +9 -0
  61. package/dist/presentation/dietary/comps/DietaryEntryDialog.d.ts +13 -0
  62. package/dist/presentation/dietary/comps/DietarySection.d.ts +8 -0
  63. package/dist/presentation/dietary/hooks/useDietary.d.ts +12 -0
  64. package/dist/presentation/dietary/parsers/catalogSuggestions.d.ts +12 -0
  65. package/dist/presentation/hooks/data/useChangeRequests.d.ts +17 -0
  66. package/dist/presentation/hooks/data/useEmployeeData.d.ts +79 -0
  67. package/dist/presentation/hooks/data/useEmployeeFilters.d.ts +10 -0
  68. package/dist/presentation/hooks/ui/useEmployeeOverviewUI.d.ts +15 -0
  69. package/dist/presentation/parsers/dateUtils.d.ts +12 -0
  70. package/dist/presentation/parsers/employeeParsers.d.ts +3 -0
  71. package/dist/presentation/parsers/imageUtils.d.ts +1 -0
  72. package/dist/shared-employee.cjs.js +1 -0
  73. package/dist/shared-employee.css +2 -0
  74. package/dist/shared-employee.es.js +2592 -0
  75. package/package.json +58 -0
@@ -0,0 +1,91 @@
1
+ export interface EmployeeDivision {
2
+ id: number;
3
+ divisionId: number;
4
+ divisionName: string;
5
+ employeeId: number;
6
+ }
7
+ export interface EmployeeFunction {
8
+ id: number;
9
+ functionId: number;
10
+ functionName: string;
11
+ functionStart: string | null;
12
+ functionEnd: string | null;
13
+ active: boolean;
14
+ employeeId: number;
15
+ }
16
+ export interface EmployeeContactInfo {
17
+ id: number;
18
+ contactTypeId: number;
19
+ contactTypeName: string;
20
+ value: string;
21
+ employeeId: number;
22
+ }
23
+ export interface EmployeeHistoryEntry {
24
+ id: number;
25
+ startDate: string | null;
26
+ endDate: string | null;
27
+ functionId: number | null;
28
+ functionName: string;
29
+ homeBaseId: number | null;
30
+ homeBaseIcao: string;
31
+ travelBaseId: number | null;
32
+ travelBaseIcao: string;
33
+ percentage: number | null;
34
+ flightPercentage: number | null;
35
+ officeDays: number | null;
36
+ contractType: string;
37
+ employeeId: number;
38
+ }
39
+ export interface RelatedPerson {
40
+ id: number;
41
+ salutation: string;
42
+ firstName: string;
43
+ middleName: string;
44
+ lastName: string;
45
+ gender: string;
46
+ relationTypeId: number;
47
+ relationTypeName: string;
48
+ birthdate: string | null;
49
+ confirmed: boolean;
50
+ employeeId: number;
51
+ }
52
+ export interface AccountingRule {
53
+ id: number;
54
+ ruleSetId: number | null;
55
+ ruleSetName: string;
56
+ ruleId: number;
57
+ ruleName: string;
58
+ employeeId: number;
59
+ }
60
+ export interface AccountingRuleSet {
61
+ id: number;
62
+ name: string;
63
+ rules: AccountingRuleItem[];
64
+ }
65
+ export interface AccountingRuleItem {
66
+ id: number;
67
+ name: string;
68
+ }
69
+ export interface CosmicRadiation {
70
+ maidenName: string;
71
+ ssrNumber: string;
72
+ pregnantFrom: string | null;
73
+ radiationSincePregnant: number | null;
74
+ }
75
+ export interface EmployeeVaccine {
76
+ id: string;
77
+ vaccineId: string;
78
+ vaccineName: string;
79
+ startDate: string | null;
80
+ endDate: string | null;
81
+ employeeId: number;
82
+ }
83
+ export interface EmployeeLanguage {
84
+ id: string;
85
+ languageId: string;
86
+ languageName: string;
87
+ levelId: string;
88
+ levelName: string;
89
+ startDate: string | null;
90
+ employeeId: number;
91
+ }
@@ -0,0 +1,8 @@
1
+ import type { DietaryEntry, DietaryCatalogItem, SaveDietaryEntry } from "../model/Dietary";
2
+ export interface DietaryRepository {
3
+ getCatalog(): Promise<DietaryCatalogItem[]>;
4
+ getEntries(): Promise<DietaryEntry[]>;
5
+ createEntry(data: SaveDietaryEntry): Promise<DietaryEntry>;
6
+ updateEntry(id: string, data: SaveDietaryEntry): Promise<DietaryEntry>;
7
+ deleteEntry(id: string): Promise<void>;
8
+ }
@@ -0,0 +1,62 @@
1
+ import type { EmployeeListItem } from "../model/EmployeeListItem";
2
+ import type { EmployeeDetail, CreateEmployeeRequest, UpdateEmployeeRequest } from "../model/EmployeeDetail";
3
+ import type { EmployeeDropdowns } from "../model/EmployeeDropdowns";
4
+ import type { EmployeeDivision, EmployeeFunction, EmployeeContactInfo, EmployeeHistoryEntry, RelatedPerson, AccountingRule, AccountingRuleSet, CosmicRadiation, EmployeeVaccine, EmployeeLanguage } from "../model/EmployeeTabModels";
5
+ import type { ChangeRequest, PendingCounts } from "../model/ChangeRequest";
6
+ export interface EmployeeRepository {
7
+ getEmployeeList(): Promise<EmployeeListItem[]>;
8
+ getEmployeeById(id: number): Promise<EmployeeDetail>;
9
+ getEmployeeImage(id: number): Promise<string | null>;
10
+ uploadEmployeeImage(id: number, base64: string): Promise<string>;
11
+ deleteEmployeeImage(id: number): Promise<void>;
12
+ createEmployee(data: CreateEmployeeRequest): Promise<EmployeeListItem>;
13
+ updateEmployee(data: UpdateEmployeeRequest): Promise<EmployeeDetail>;
14
+ deactivateEmployee(id: number): Promise<void>;
15
+ activateEmployee(id: number): Promise<void>;
16
+ check3LC(letterCode: string): Promise<boolean>;
17
+ getDropdowns(): Promise<EmployeeDropdowns>;
18
+ getDivisions(employeeId: number): Promise<EmployeeDivision[]>;
19
+ createDivision(employeeId: number, divisionId: number): Promise<EmployeeDivision>;
20
+ deleteDivision(id: number): Promise<void>;
21
+ getFunctions(employeeId: number, includeInactive: boolean): Promise<EmployeeFunction[]>;
22
+ createFunction(data: Omit<EmployeeFunction, "id" | "functionName" | "active">): Promise<EmployeeFunction>;
23
+ updateFunction(data: EmployeeFunction): Promise<EmployeeFunction>;
24
+ deactivateFunction(id: number): Promise<void>;
25
+ getAdditionalInfo(employeeId: number): Promise<EmployeeContactInfo[]>;
26
+ createAdditionalInfo(data: Omit<EmployeeContactInfo, "id" | "contactTypeName">): Promise<EmployeeContactInfo>;
27
+ updateAdditionalInfo(data: EmployeeContactInfo): Promise<EmployeeContactInfo>;
28
+ deleteAdditionalInfo(employeeId: number, contactTypeId: number): Promise<void>;
29
+ getHistory(employeeId: number): Promise<EmployeeHistoryEntry[]>;
30
+ createHistory(data: Omit<EmployeeHistoryEntry, "id" | "functionName" | "homeBaseIcao" | "travelBaseIcao">): Promise<EmployeeHistoryEntry[]>;
31
+ updateHistory(data: EmployeeHistoryEntry): Promise<EmployeeHistoryEntry>;
32
+ deleteHistory(id: number): Promise<void>;
33
+ getRelatedPersons(employeeId: number): Promise<RelatedPerson[]>;
34
+ createRelatedPerson(data: Omit<RelatedPerson, "id" | "relationTypeName">): Promise<RelatedPerson>;
35
+ updateRelatedPerson(data: RelatedPerson): Promise<RelatedPerson>;
36
+ deleteRelatedPerson(id: number): Promise<void>;
37
+ confirmRelatedPerson(id: number): Promise<RelatedPerson>;
38
+ getUnconfirmedRelatedPersonsCounts(): Promise<Record<number, number>>;
39
+ getAccountingRules(employeeId: number): Promise<AccountingRule[]>;
40
+ getAvailableRuleSets(): Promise<AccountingRuleSet[]>;
41
+ assignAccountingRule(employeeId: number, ruleId: number): Promise<AccountingRule>;
42
+ removeAccountingRule(employeeId: number, ruleId: number): Promise<void>;
43
+ getCosmicRadiation(employeeId: number): Promise<CosmicRadiation>;
44
+ updateCosmicRadiation(employeeId: number, data: CosmicRadiation): Promise<CosmicRadiation>;
45
+ getEmployeeVaccines(employeeId: number): Promise<EmployeeVaccine[]>;
46
+ createEmployeeVaccine(data: Omit<EmployeeVaccine, "id" | "vaccineName">): Promise<EmployeeVaccine>;
47
+ updateEmployeeVaccine(data: EmployeeVaccine): Promise<EmployeeVaccine>;
48
+ deleteEmployeeVaccine(id: string): Promise<void>;
49
+ getEmployeeLanguages(employeeId: number): Promise<EmployeeLanguage[]>;
50
+ createEmployeeLanguage(data: Omit<EmployeeLanguage, "id" | "languageName" | "levelName">): Promise<EmployeeLanguage>;
51
+ updateEmployeeLanguage(data: EmployeeLanguage): Promise<EmployeeLanguage>;
52
+ deleteEmployeeLanguage(id: string): Promise<void>;
53
+ getPendingCounts(): Promise<PendingCounts>;
54
+ getChangeRequests(employeeId: number): Promise<ChangeRequest[]>;
55
+ reviewFields(requestId: number, fieldReviews: {
56
+ changeFieldId: number;
57
+ approved: boolean;
58
+ comment?: string;
59
+ }[]): Promise<void>;
60
+ approveAllFields(requestId: number): Promise<void>;
61
+ reviewPhoto(requestId: number, approved: boolean, comment?: string): Promise<void>;
62
+ }
@@ -0,0 +1,18 @@
1
+ export declare const SHARED_EMPLOYEE_VERSION = "0.0.1";
2
+ export type { EmployeeDetail, CreateEmployeeRequest, UpdateEmployeeRequest, } from "./domain/model/EmployeeDetail";
3
+ export type { EmployeeListItem } from "./domain/model/EmployeeListItem";
4
+ export type { DropdownOption, StringDropdownOption, VaccineDropdownOption, EmployeeDropdowns, } from "./domain/model/EmployeeDropdowns";
5
+ export type { EmployeeDivision, EmployeeFunction, EmployeeContactInfo, EmployeeHistoryEntry, RelatedPerson, AccountingRule, AccountingRuleSet, AccountingRuleItem, CosmicRadiation, EmployeeVaccine, EmployeeLanguage, } from "./domain/model/EmployeeTabModels";
6
+ export type { FieldChange, ChangeRequest, PendingCounts } from "./domain/model/ChangeRequest";
7
+ export type { DietaryItemType, DietaryCatalogItem, DietaryEntry, SaveDietaryEntry, } from "./domain/model/Dietary";
8
+ export type { EmployeeRepository } from "./domain/repository/EmployeeRepository";
9
+ export type { DietaryRepository } from "./domain/repository/DietaryRepository";
10
+ export { EmployeeRepositoryImpl } from "./infrastructure/EmployeeRepositoryImpl";
11
+ export { DietaryRepositoryImpl } from "./infrastructure/DietaryRepositoryImpl";
12
+ export { DialogShellProvider } from "./context/DialogShellContext";
13
+ export type { DialogShellProps, DialogShellRenderer } from "./context/DialogShellContext";
14
+ export { EmployeeOverview } from "./presentation/EmployeeOverview";
15
+ export type { EmployeeOverviewProps } from "./presentation/EmployeeOverview";
16
+ export type { EmployeeTab } from "./presentation/hooks/ui/useEmployeeOverviewUI";
17
+ export { DietaryPage, DietaryPageWithParams } from "./presentation/dietary/DietaryPage";
18
+ export type { DietaryPageParams } from "./presentation/dietary/DietaryPage";
@@ -0,0 +1,20 @@
1
+ import type { DietaryRepository } from "../domain/repository/DietaryRepository";
2
+ import type { DietaryCatalogItem, DietaryEntry, SaveDietaryEntry } from "../domain/model/Dietary";
3
+ /**
4
+ * HTTP implementation of {@link DietaryRepository}.
5
+ * `baseUrl` includes the route prefix, e.g. `"/api/dietary"`. `target` is an employee id
6
+ * (admin view) or `"me"` (logged-in self-service). Converted from WinOps's axios to `fetch`
7
+ * to keep a single HTTP approach across the package (decision #8: baseUrl injected).
8
+ */
9
+ export declare class DietaryRepositoryImpl implements DietaryRepository {
10
+ private readonly baseUrl;
11
+ private readonly target;
12
+ constructor(baseUrl: string, target: number | "me");
13
+ private entriesUrl;
14
+ private json;
15
+ getCatalog(): Promise<DietaryCatalogItem[]>;
16
+ getEntries(): Promise<DietaryEntry[]>;
17
+ createEntry(data: SaveDietaryEntry): Promise<DietaryEntry>;
18
+ updateEntry(id: string, data: SaveDietaryEntry): Promise<DietaryEntry>;
19
+ deleteEntry(id: string): Promise<void>;
20
+ }
@@ -0,0 +1,74 @@
1
+ import type { EmployeeRepository } from "../domain/repository/EmployeeRepository";
2
+ import type { EmployeeListItem } from "../domain/model/EmployeeListItem";
3
+ import type { EmployeeDetail, CreateEmployeeRequest, UpdateEmployeeRequest } from "../domain/model/EmployeeDetail";
4
+ import type { EmployeeDropdowns } from "../domain/model/EmployeeDropdowns";
5
+ import type { EmployeeDivision, EmployeeFunction, EmployeeContactInfo, EmployeeHistoryEntry, RelatedPerson, AccountingRule, AccountingRuleSet, CosmicRadiation, EmployeeVaccine, EmployeeLanguage } from "../domain/model/EmployeeTabModels";
6
+ import type { ChangeRequest, PendingCounts } from "../domain/model/ChangeRequest";
7
+ /**
8
+ * HTTP implementation of {@link EmployeeRepository} that calls the SharedEmployee backend.
9
+ * `baseUrl` includes the route prefix, e.g. `"/api/employee"`. Each host injects its own — this
10
+ * replaces WinOps's global `main.url.getApiURL()` (decision #8), mirroring `HttpInventoryApi`.
11
+ */
12
+ export declare class EmployeeRepositoryImpl implements EmployeeRepository {
13
+ private readonly baseUrl;
14
+ constructor(baseUrl?: string);
15
+ private get;
16
+ private post;
17
+ private put;
18
+ private del;
19
+ getEmployeeList(): Promise<EmployeeListItem[]>;
20
+ getEmployeeById(id: number): Promise<EmployeeDetail>;
21
+ getEmployeeImage(id: number): Promise<string | null>;
22
+ uploadEmployeeImage(id: number, base64: string): Promise<string>;
23
+ deleteEmployeeImage(id: number): Promise<void>;
24
+ createEmployee(data: CreateEmployeeRequest): Promise<EmployeeListItem>;
25
+ updateEmployee(data: UpdateEmployeeRequest): Promise<EmployeeDetail>;
26
+ deactivateEmployee(id: number): Promise<void>;
27
+ activateEmployee(id: number): Promise<void>;
28
+ check3LC(letterCode: string): Promise<boolean>;
29
+ getDropdowns(): Promise<EmployeeDropdowns>;
30
+ getDivisions(employeeId: number): Promise<EmployeeDivision[]>;
31
+ createDivision(employeeId: number, divisionId: number): Promise<EmployeeDivision>;
32
+ deleteDivision(id: number): Promise<void>;
33
+ getFunctions(employeeId: number, includeInactive: boolean): Promise<EmployeeFunction[]>;
34
+ createFunction(data: Omit<EmployeeFunction, "id" | "functionName" | "active">): Promise<EmployeeFunction>;
35
+ updateFunction(data: EmployeeFunction): Promise<EmployeeFunction>;
36
+ deactivateFunction(id: number): Promise<void>;
37
+ getAdditionalInfo(employeeId: number): Promise<EmployeeContactInfo[]>;
38
+ createAdditionalInfo(data: Omit<EmployeeContactInfo, "id" | "contactTypeName">): Promise<EmployeeContactInfo>;
39
+ updateAdditionalInfo(data: EmployeeContactInfo): Promise<EmployeeContactInfo>;
40
+ deleteAdditionalInfo(employeeId: number, contactTypeId: number): Promise<void>;
41
+ getHistory(employeeId: number): Promise<EmployeeHistoryEntry[]>;
42
+ createHistory(data: Omit<EmployeeHistoryEntry, "id" | "functionName" | "homeBaseIcao" | "travelBaseIcao">): Promise<EmployeeHistoryEntry[]>;
43
+ updateHistory(data: EmployeeHistoryEntry): Promise<EmployeeHistoryEntry>;
44
+ deleteHistory(id: number): Promise<void>;
45
+ getRelatedPersons(employeeId: number): Promise<RelatedPerson[]>;
46
+ createRelatedPerson(data: Omit<RelatedPerson, "id" | "relationTypeName">): Promise<RelatedPerson>;
47
+ updateRelatedPerson(data: RelatedPerson): Promise<RelatedPerson>;
48
+ deleteRelatedPerson(id: number): Promise<void>;
49
+ confirmRelatedPerson(id: number): Promise<RelatedPerson>;
50
+ getUnconfirmedRelatedPersonsCounts(): Promise<Record<number, number>>;
51
+ getAccountingRules(employeeId: number): Promise<AccountingRule[]>;
52
+ getAvailableRuleSets(): Promise<AccountingRuleSet[]>;
53
+ assignAccountingRule(employeeId: number, ruleId: number): Promise<AccountingRule>;
54
+ removeAccountingRule(employeeId: number, ruleId: number): Promise<void>;
55
+ getCosmicRadiation(employeeId: number): Promise<CosmicRadiation>;
56
+ updateCosmicRadiation(employeeId: number, data: CosmicRadiation): Promise<CosmicRadiation>;
57
+ getEmployeeVaccines(employeeId: number): Promise<EmployeeVaccine[]>;
58
+ createEmployeeVaccine(data: Omit<EmployeeVaccine, "id" | "vaccineName">): Promise<EmployeeVaccine>;
59
+ updateEmployeeVaccine(data: EmployeeVaccine): Promise<EmployeeVaccine>;
60
+ deleteEmployeeVaccine(id: string): Promise<void>;
61
+ getEmployeeLanguages(employeeId: number): Promise<EmployeeLanguage[]>;
62
+ createEmployeeLanguage(data: Omit<EmployeeLanguage, "id" | "languageName" | "levelName">): Promise<EmployeeLanguage>;
63
+ updateEmployeeLanguage(data: EmployeeLanguage): Promise<EmployeeLanguage>;
64
+ deleteEmployeeLanguage(id: string): Promise<void>;
65
+ getPendingCounts(): Promise<PendingCounts>;
66
+ getChangeRequests(employeeId: number): Promise<ChangeRequest[]>;
67
+ reviewFields(requestId: number, fieldReviews: {
68
+ changeFieldId: number;
69
+ approved: boolean;
70
+ comment?: string;
71
+ }[]): Promise<void>;
72
+ approveAllFields(requestId: number): Promise<void>;
73
+ reviewPhoto(requestId: number, approved: boolean, comment?: string): Promise<void>;
74
+ }
@@ -0,0 +1,26 @@
1
+ import type { DietaryEntry, DietaryCatalogItem, DietaryItemType, SaveDietaryEntry } from "../../domain/model/Dietary";
2
+ export interface DietaryCatalogItemDto {
3
+ id: string;
4
+ name: string;
5
+ itemType: number;
6
+ }
7
+ export interface DietaryEntryDto {
8
+ id: string;
9
+ itemId: string;
10
+ name: string;
11
+ itemType: number;
12
+ isCritical: boolean;
13
+ remarks: string | null;
14
+ }
15
+ export interface SaveDietaryEntryDto {
16
+ itemId: string | null;
17
+ name: string;
18
+ itemType: number;
19
+ isCritical: boolean;
20
+ remarks: string;
21
+ }
22
+ export declare function itemTypeFromDto(itemType: number): DietaryItemType;
23
+ export declare function itemTypeToDto(itemType: DietaryItemType): number;
24
+ export declare function dietaryCatalogItemFromDto(dto: DietaryCatalogItemDto): DietaryCatalogItem;
25
+ export declare function dietaryEntryFromDto(dto: DietaryEntryDto): DietaryEntry;
26
+ export declare function saveDietaryEntryToDto(data: SaveDietaryEntry): SaveDietaryEntryDto;
package/dist/main.d.ts ADDED
@@ -0,0 +1 @@
1
+ import './index.css';
@@ -0,0 +1,18 @@
1
+ import { type ReactNode } from "react";
2
+ import type { EmployeeRepository } from "../domain/repository/EmployeeRepository";
3
+ import type { EmployeeTab } from "./hooks/ui/useEmployeeOverviewUI";
4
+ export interface EmployeeOverviewProps {
5
+ /** The employee data source. The host creates it, e.g. `new EmployeeRepositoryImpl("/api/employee")`. */
6
+ api: EmployeeRepository;
7
+ /** Which tabs to show, in order. Omit to show all (WinOps default); Improve passes a subset. */
8
+ enabledTabs?: EmployeeTab[];
9
+ /** Host config for the History tab's airport picker (was WinOps' main.url.oldBaseUrl). */
10
+ airportConfig?: string;
11
+ /** Backend prefix for the Dietary sub-feature (e.g. "/api/dietary"). Omit to hide the Dietary tab. */
12
+ dietaryBaseUrl?: string;
13
+ /** Host-provided renderers for tabs backed by host systems. Omit one to hide that tab. */
14
+ renderFiles?: (employeeId: number) => ReactNode;
15
+ renderReminders?: (employeeId: number) => ReactNode;
16
+ renderHistoryTrack?: (employeeId: number) => ReactNode;
17
+ }
18
+ export declare function EmployeeOverview({ api, enabledTabs, airportConfig, dietaryBaseUrl, renderFiles, renderReminders, renderHistoryTrack }: EmployeeOverviewProps): import("react").JSX.Element;
@@ -0,0 +1,16 @@
1
+ import { type CwDialogProps } from "@cwellt_software/cwellt-reactjs-lib";
2
+ import type { FC, ReactNode } from "react";
3
+ interface DeleteDialogProps extends Omit<CwDialogProps, "customFooter" | "children"> {
4
+ /** Message to display in the modal body */
5
+ message?: string;
6
+ /** Custom content to display instead of the default message container */
7
+ customContent?: ReactNode;
8
+ /** Function to call when the delete button is clicked */
9
+ onDelete: () => void;
10
+ }
11
+ /**
12
+ * A specialized dialog for delete confirmations. Rebuilt in-package over the component library's
13
+ * CwDialog (was BinOps common/components/modal/DeleteDialog) — see decision #1d.
14
+ */
15
+ export declare const DeleteDialog: FC<DeleteDialogProps>;
16
+ export {};
@@ -0,0 +1,11 @@
1
+ import { type CwNoteProps } from "@cwellt_software/cwellt-reactjs-lib";
2
+ import type { FC, ReactNode } from "react";
3
+ export type EmptyStateColor = CwNoteProps['color'] | 'transparent';
4
+ export interface EmptyStateProps extends Pick<CwNoteProps, 'variant' | 'customColor' | 'icon' | 'className' | 'style' | 'fontSize'> {
5
+ color?: EmptyStateColor;
6
+ content?: ReactNode;
7
+ subtitle?: string;
8
+ footer?: ReactNode;
9
+ children?: ReactNode;
10
+ }
11
+ export declare const EmptyState: FC<EmptyStateProps>;
@@ -0,0 +1,15 @@
1
+ import { type ReactNode, type CSSProperties } from "react";
2
+ interface LazyImageProps<K extends string | number = string | number> {
3
+ /** Stable key that triggers a refetch when it changes (e.g. entity id) */
4
+ entityKey: K;
5
+ /** Async function that returns the image src (base64 or URL), or null */
6
+ loadImage: (key: K) => Promise<string | null>;
7
+ /** Content shown while the image hasn't loaded (icon, initials, etc.) */
8
+ placeholder: ReactNode;
9
+ /** Additional CSS class for sizing & border-radius overrides */
10
+ className?: string;
11
+ /** Inline styles for dynamic per-instance sizing */
12
+ style?: CSSProperties;
13
+ }
14
+ export declare function LazyImage<K extends string | number>({ entityKey, loadImage, placeholder, className, style }: LazyImageProps<K>): import("react").JSX.Element;
15
+ export {};
@@ -0,0 +1,14 @@
1
+ import { type ReactNode } from "react";
2
+ interface UseLazyTabsOptions {
3
+ defaultTab: string;
4
+ entityKey: string | number | null | undefined;
5
+ onTabChange?: (tab: string) => void;
6
+ }
7
+ export declare function useLazyTabs({ defaultTab, entityKey, onTabChange }: UseLazyTabsOptions): {
8
+ activatedTabs: Set<string>;
9
+ handleTabClick: (tab: {
10
+ key: string;
11
+ }) => void;
12
+ renderTab: (key: string, element: ReactNode) => ReactNode;
13
+ };
14
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { CreateEmployeeRequest } from "../../../domain/model/EmployeeDetail";
2
+ import type { EmployeeDropdowns } from "../../../domain/model/EmployeeDropdowns";
3
+ interface AddEmployeeModalProps {
4
+ dropdowns: EmployeeDropdowns;
5
+ onClose: () => void;
6
+ onCheck3LC: (lc: string) => Promise<boolean>;
7
+ onCreate: (data: CreateEmployeeRequest) => Promise<void>;
8
+ }
9
+ export declare function AddEmployeeModal({ dropdowns, onClose, onCheck3LC, onCreate }: AddEmployeeModalProps): import("react").JSX.Element;
10
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { EmployeeDetail, UpdateEmployeeRequest } from "../../../domain/model/EmployeeDetail";
2
+ import type { EmployeeDropdowns } from "../../../domain/model/EmployeeDropdowns";
3
+ interface EditEmployeeModalProps {
4
+ employee: EmployeeDetail;
5
+ dropdowns: EmployeeDropdowns;
6
+ currentImage: string | null;
7
+ onClose: () => void;
8
+ onSave: (data: UpdateEmployeeRequest) => Promise<void>;
9
+ onUploadImage: (id: number, base64: string) => Promise<string>;
10
+ onDeleteImage: (id: number) => Promise<void>;
11
+ }
12
+ export declare function EditEmployeeModal({ employee, dropdowns, currentImage, onClose, onSave, onUploadImage, onDeleteImage }: EditEmployeeModalProps): import("react").JSX.Element;
13
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { AccountingRule, AccountingRuleSet } from "../../../domain/model/EmployeeTabModels";
2
+ interface AccountingRulesTabProps {
3
+ items: AccountingRule[];
4
+ employeeId: number;
5
+ availableRuleSets: AccountingRuleSet[];
6
+ onAssign: (employeeId: number, ruleId: number) => Promise<void>;
7
+ onRemove: (employeeId: number, ruleId: number) => Promise<void>;
8
+ }
9
+ export declare function AccountingRulesTab({ items, employeeId, availableRuleSets, onAssign, onRemove }: AccountingRulesTabProps): import("react").JSX.Element;
10
+ export {};
@@ -0,0 +1,12 @@
1
+ import type { EmployeeContactInfo } from "../../../domain/model/EmployeeTabModels";
2
+ import type { DropdownOption } from "../../../domain/model/EmployeeDropdowns";
3
+ interface AdditionalInfoTabProps {
4
+ items: EmployeeContactInfo[];
5
+ employeeId: number;
6
+ contactTypes: DropdownOption[];
7
+ onCreate: (data: Omit<EmployeeContactInfo, "id" | "contactTypeName">) => Promise<void>;
8
+ onUpdate: (data: EmployeeContactInfo) => Promise<void>;
9
+ onDelete: (employeeId: number, contactTypeId: number) => Promise<void>;
10
+ }
11
+ export declare function AdditionalInfoTab({ items, employeeId, contactTypes, onCreate, onUpdate, onDelete }: AdditionalInfoTabProps): import("react").JSX.Element;
12
+ export {};
@@ -0,0 +1,16 @@
1
+ import type { ChangeRequest } from "../../../domain/model/ChangeRequest";
2
+ interface ChangeRequestsTabProps {
3
+ requests: ChangeRequest[];
4
+ employeeId: number;
5
+ loading: boolean;
6
+ onReviewFields: (requestId: number, fieldReviews: {
7
+ changeFieldId: number;
8
+ approved: boolean;
9
+ comment?: string;
10
+ }[], employeeId: number) => Promise<void>;
11
+ onApproveAll: (requestId: number, employeeId: number) => Promise<void>;
12
+ onReviewPhoto: (requestId: number, approved: boolean, employeeId: number, comment?: string) => Promise<void>;
13
+ currentImage: string | null;
14
+ }
15
+ export declare function ChangeRequestsTab({ requests, employeeId, loading, onReviewFields, onApproveAll, onReviewPhoto, currentImage }: ChangeRequestsTabProps): import("react").JSX.Element;
16
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { CosmicRadiation } from "../../../domain/model/EmployeeTabModels";
2
+ interface CosmicRadiationTabProps {
3
+ data: CosmicRadiation | null;
4
+ employeeId: number;
5
+ onUpdate: (employeeId: number, data: CosmicRadiation) => Promise<void>;
6
+ }
7
+ export declare function CosmicRadiationTab({ data, employeeId, onUpdate }: CosmicRadiationTabProps): import("react").JSX.Element;
8
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { EmployeeDetail } from "../../../domain/model/EmployeeDetail";
2
+ import type { EmployeeDropdowns } from "../../../domain/model/EmployeeDropdowns";
3
+ interface DetailsTabProps {
4
+ employee: EmployeeDetail | null;
5
+ dropdowns: EmployeeDropdowns | null;
6
+ }
7
+ export declare function DetailsTab({ employee, dropdowns }: DetailsTabProps): import("react").JSX.Element;
8
+ export {};
@@ -0,0 +1,11 @@
1
+ import type { EmployeeDivision } from "../../../domain/model/EmployeeTabModels";
2
+ import type { DropdownOption } from "../../../domain/model/EmployeeDropdowns";
3
+ interface DivisionsTabProps {
4
+ items: EmployeeDivision[];
5
+ employeeId: number;
6
+ availableDivisions: DropdownOption[];
7
+ onCreate: (employeeId: number, divisionId: number) => Promise<void>;
8
+ onDelete: (id: number) => Promise<void>;
9
+ }
10
+ export declare function DivisionsTab({ items, employeeId, availableDivisions, onCreate, onDelete }: DivisionsTabProps): import("react").JSX.Element;
11
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { EmployeeFunction } from "../../../domain/model/EmployeeTabModels";
2
+ import type { DropdownOption } from "../../../domain/model/EmployeeDropdowns";
3
+ interface FunctionsTabProps {
4
+ items: EmployeeFunction[];
5
+ employeeId: number;
6
+ availableFunctions: DropdownOption[];
7
+ onCreate: (data: Omit<EmployeeFunction, "id" | "functionName" | "active">) => Promise<void>;
8
+ onUpdate: (data: EmployeeFunction) => Promise<void>;
9
+ onDeactivate: (id: number) => Promise<void>;
10
+ onRefresh: (employeeId: number, includeInactive: boolean) => Promise<void>;
11
+ }
12
+ export declare function FunctionsTab({ items, employeeId, availableFunctions, onCreate, onUpdate, onDeactivate, onRefresh }: FunctionsTabProps): import("react").JSX.Element;
13
+ export {};
@@ -0,0 +1,15 @@
1
+ import type { EmployeeHistoryEntry } from "../../../domain/model/EmployeeTabModels";
2
+ import type { DropdownOption, StringDropdownOption } from "../../../domain/model/EmployeeDropdowns";
3
+ interface HistoryTabProps {
4
+ items: EmployeeHistoryEntry[];
5
+ employeeId: number;
6
+ functions: DropdownOption[];
7
+ contractTypes: StringDropdownOption[];
8
+ /** Host-provided config for the airport picker (was WinOps' global main.url.oldBaseUrl). */
9
+ airportConfig?: string;
10
+ onCreate: (data: Omit<EmployeeHistoryEntry, "id" | "functionName" | "homeBaseIcao" | "travelBaseIcao">) => Promise<void>;
11
+ onUpdate: (data: EmployeeHistoryEntry) => Promise<void>;
12
+ onDelete: (id: number) => Promise<void>;
13
+ }
14
+ export declare function HistoryTab({ items, employeeId, functions, contractTypes, airportConfig, onCreate, onUpdate, onDelete }: HistoryTabProps): import("react").JSX.Element;
15
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { EmployeeLanguage } from "../../../domain/model/EmployeeTabModels";
2
+ import type { StringDropdownOption } from "../../../domain/model/EmployeeDropdowns";
3
+ interface LanguagesTabProps {
4
+ items: EmployeeLanguage[];
5
+ employeeId: number;
6
+ languages: StringDropdownOption[];
7
+ levels: StringDropdownOption[];
8
+ onCreate: (data: Omit<EmployeeLanguage, "id" | "languageName" | "levelName">) => Promise<void>;
9
+ onUpdate: (data: EmployeeLanguage) => Promise<void>;
10
+ onDelete: (id: string) => Promise<void>;
11
+ }
12
+ export declare function LanguagesTab({ items, employeeId, languages, levels, onCreate, onUpdate, onDelete }: LanguagesTabProps): import("react").JSX.Element;
13
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { RelatedPerson } from "../../../domain/model/EmployeeTabModels";
2
+ import type { DropdownOption } from "../../../domain/model/EmployeeDropdowns";
3
+ interface RelatedPersonsTabProps {
4
+ items: RelatedPerson[];
5
+ employeeId: number;
6
+ relationTypes: DropdownOption[];
7
+ onCreate: (data: Omit<RelatedPerson, "id" | "relationTypeName">) => Promise<void>;
8
+ onUpdate: (data: RelatedPerson) => Promise<void>;
9
+ onDelete: (id: number) => Promise<void>;
10
+ onConfirm: (id: number) => Promise<void>;
11
+ }
12
+ export declare function RelatedPersonsTab({ items, employeeId, relationTypes, onCreate, onUpdate, onDelete, onConfirm }: RelatedPersonsTabProps): import("react").JSX.Element;
13
+ export {};
@@ -0,0 +1,12 @@
1
+ import type { EmployeeVaccine } from "../../../domain/model/EmployeeTabModels";
2
+ import type { VaccineDropdownOption } from "../../../domain/model/EmployeeDropdowns";
3
+ interface VaccinesTabProps {
4
+ items: EmployeeVaccine[];
5
+ employeeId: number;
6
+ vaccines: VaccineDropdownOption[];
7
+ onCreate: (data: Omit<EmployeeVaccine, "id" | "vaccineName">) => Promise<void>;
8
+ onUpdate: (data: EmployeeVaccine) => Promise<void>;
9
+ onDelete: (id: string) => Promise<void>;
10
+ }
11
+ export declare function VaccinesTab({ items, employeeId, vaccines, onCreate, onUpdate, onDelete }: VaccinesTabProps): import("react").JSX.Element;
12
+ export {};
@@ -0,0 +1,9 @@
1
+ export interface DietaryPageParams {
2
+ /** Backend route prefix, e.g. "/api/dietary" (host-injected; was WinOps' main.url global). */
3
+ baseUrl: string;
4
+ /** Employee id for the admin view; omit to manage the logged-in user's own data ("me"). */
5
+ employeeId?: number;
6
+ }
7
+ /** Embeddable in a dialog or tab — forward `baseUrl` + `employeeId`. */
8
+ export declare function DietaryPageWithParams({ baseUrl, employeeId }: DietaryPageParams): import("react").JSX.Element;
9
+ export declare function DietaryPage({ baseUrl, employeeId }: DietaryPageParams): import("react").JSX.Element;
@@ -0,0 +1,13 @@
1
+ import type { DietaryEntry, DietaryCatalogItem, DietaryItemType, SaveDietaryEntry } from "../../../domain/model/Dietary";
2
+ export interface DietaryEntryDialogProps {
3
+ open: boolean;
4
+ itemType: DietaryItemType;
5
+ catalog: DietaryCatalogItem[];
6
+ /** Items already assigned to the employee — hidden from suggestions. */
7
+ assignedItemIds: string[];
8
+ editing: DietaryEntry | null;
9
+ saving: boolean;
10
+ onSave: (data: SaveDietaryEntry) => Promise<boolean>;
11
+ onClose: () => void;
12
+ }
13
+ export declare function DietaryEntryDialog({ open, itemType, catalog, assignedItemIds, editing, saving, onSave, onClose }: DietaryEntryDialogProps): import("react").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import type { DietaryItemType } from "../../../domain/model/Dietary";
2
+ import type { UseDietary } from "../hooks/useDietary";
3
+ export interface DietarySectionProps {
4
+ itemType: DietaryItemType;
5
+ title: string;
6
+ dietary: UseDietary;
7
+ }
8
+ export declare function DietarySection({ itemType, title, dietary }: DietarySectionProps): import("react").JSX.Element;
@@ -0,0 +1,12 @@
1
+ import type { DietaryEntry, DietaryCatalogItem, SaveDietaryEntry } from "../../../domain/model/Dietary";
2
+ import type { DietaryRepository } from "../../../domain/repository/DietaryRepository";
3
+ export interface UseDietary {
4
+ entries: DietaryEntry[];
5
+ catalog: DietaryCatalogItem[];
6
+ loading: boolean;
7
+ saving: boolean;
8
+ create: (data: SaveDietaryEntry) => Promise<boolean>;
9
+ update: (id: string, data: SaveDietaryEntry) => Promise<boolean>;
10
+ remove: (id: string) => Promise<void>;
11
+ }
12
+ export declare function useDietary(repository: DietaryRepository): UseDietary;
@@ -0,0 +1,12 @@
1
+ import type { DietaryCatalogItem, DietaryItemType } from "../../../domain/model/Dietary";
2
+ /**
3
+ * Existing catalog items matching what the user is typing, so the same allergy/need
4
+ * is reused instead of re-entered with different text. Items already assigned to the
5
+ * employee are excluded.
6
+ */
7
+ export declare function suggestCatalogItems(catalog: DietaryCatalogItem[], itemType: DietaryItemType, query: string, excludeItemIds: string[], max?: number): DietaryCatalogItem[];
8
+ /**
9
+ * If the typed name matches an existing catalog item (case-insensitive), return its id
10
+ * so the backend reuses it; null means "create a new catalog entry".
11
+ */
12
+ export declare function resolveCatalogItemId(catalog: DietaryCatalogItem[], itemType: DietaryItemType, name: string): string | null;