@cratis/scene.blueprint.hr 0.0.0-stage → 4.50.0
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.
- package/blueprint.ts +16 -0
- package/blueprintCatalog.json +164 -0
- package/dist/cjs/blueprint.js +19 -0
- package/dist/cjs/blueprint.js.map +1 -0
- package/dist/cjs/hrApplication.js +49 -0
- package/dist/cjs/hrApplication.js.map +1 -0
- package/dist/cjs/hrParts.js +131 -0
- package/dist/cjs/hrParts.js.map +1 -0
- package/dist/cjs/hrQueries.js +67 -0
- package/dist/cjs/hrQueries.js.map +1 -0
- package/dist/cjs/hrScreenSet.js +61 -0
- package/dist/cjs/hrScreenSet.js.map +1 -0
- package/dist/cjs/index.js +69 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/manifest.js +65 -0
- package/dist/cjs/manifest.js.map +1 -0
- package/dist/cjs/navigation.js +135 -0
- package/dist/cjs/navigation.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/packageName.js +8 -0
- package/dist/cjs/packageName.js.map +1 -0
- package/dist/cjs/screens/index.js +22 -0
- package/dist/cjs/screens/index.js.map +1 -0
- package/dist/cjs/templateProvenance.js +24 -0
- package/dist/cjs/templateProvenance.js.map +1 -0
- package/dist/cjs/templates/formTemplates.js +51 -0
- package/dist/cjs/templates/formTemplates.js.map +1 -0
- package/dist/cjs/templates/index.js +30 -0
- package/dist/cjs/templates/index.js.map +1 -0
- package/dist/cjs/templates/listTemplates.js +210 -0
- package/dist/cjs/templates/listTemplates.js.map +1 -0
- package/dist/cjs/templates/orgChartTemplate.js +63 -0
- package/dist/cjs/templates/orgChartTemplate.js.map +1 -0
- package/dist/cjs/templates/recordTemplates.js +181 -0
- package/dist/cjs/templates/recordTemplates.js.map +1 -0
- package/dist/esm/blueprint.d.ts +3 -0
- package/dist/esm/blueprint.d.ts.map +1 -0
- package/dist/esm/blueprint.js +17 -0
- package/dist/esm/blueprint.js.map +1 -0
- package/dist/esm/hrApplication.d.ts +10 -0
- package/dist/esm/hrApplication.d.ts.map +1 -0
- package/dist/esm/hrApplication.js +44 -0
- package/dist/esm/hrApplication.js.map +1 -0
- package/dist/esm/hrParts.d.ts +15 -0
- package/dist/esm/hrParts.d.ts.map +1 -0
- package/dist/esm/hrParts.js +114 -0
- package/dist/esm/hrParts.js.map +1 -0
- package/dist/esm/hrQueries.d.ts +38 -0
- package/dist/esm/hrQueries.d.ts.map +1 -0
- package/dist/esm/hrQueries.js +59 -0
- package/dist/esm/hrQueries.js.map +1 -0
- package/dist/esm/hrScreenSet.d.ts +7 -0
- package/dist/esm/hrScreenSet.d.ts.map +1 -0
- package/dist/esm/hrScreenSet.js +59 -0
- package/dist/esm/hrScreenSet.js.map +1 -0
- package/dist/esm/index.d.ts +12 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +17 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/manifest.d.ts +3 -0
- package/dist/esm/manifest.d.ts.map +1 -0
- package/dist/esm/manifest.js +63 -0
- package/dist/esm/manifest.js.map +1 -0
- package/dist/esm/navigation.d.ts +5 -0
- package/dist/esm/navigation.d.ts.map +1 -0
- package/dist/esm/navigation.js +131 -0
- package/dist/esm/navigation.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/packageName.d.ts +2 -0
- package/dist/esm/packageName.d.ts.map +1 -0
- package/dist/esm/packageName.js +6 -0
- package/dist/esm/packageName.js.map +1 -0
- package/dist/esm/screens/index.d.ts +3 -0
- package/dist/esm/screens/index.d.ts.map +1 -0
- package/dist/esm/screens/index.js +20 -0
- package/dist/esm/screens/index.js.map +1 -0
- package/dist/esm/templateProvenance.d.ts +3 -0
- package/dist/esm/templateProvenance.d.ts.map +1 -0
- package/dist/esm/templateProvenance.js +22 -0
- package/dist/esm/templateProvenance.js.map +1 -0
- package/dist/esm/templates/formTemplates.d.ts +3 -0
- package/dist/esm/templates/formTemplates.d.ts.map +1 -0
- package/dist/esm/templates/formTemplates.js +49 -0
- package/dist/esm/templates/formTemplates.js.map +1 -0
- package/dist/esm/templates/index.d.ts +7 -0
- package/dist/esm/templates/index.d.ts.map +1 -0
- package/dist/esm/templates/index.js +19 -0
- package/dist/esm/templates/index.js.map +1 -0
- package/dist/esm/templates/listTemplates.d.ts +6 -0
- package/dist/esm/templates/listTemplates.d.ts.map +1 -0
- package/dist/esm/templates/listTemplates.js +205 -0
- package/dist/esm/templates/listTemplates.js.map +1 -0
- package/dist/esm/templates/orgChartTemplate.d.ts +3 -0
- package/dist/esm/templates/orgChartTemplate.d.ts.map +1 -0
- package/dist/esm/templates/orgChartTemplate.js +61 -0
- package/dist/esm/templates/orgChartTemplate.js.map +1 -0
- package/dist/esm/templates/recordTemplates.d.ts +4 -0
- package/dist/esm/templates/recordTemplates.d.ts.map +1 -0
- package/dist/esm/templates/recordTemplates.js +178 -0
- package/dist/esm/templates/recordTemplates.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -0
- package/hrApplication.ts +28 -0
- package/hrParts.ts +52 -0
- package/hrQueries.ts +59 -0
- package/hrScreenSet.ts +24 -0
- package/index.ts +14 -0
- package/manifest.ts +41 -0
- package/navigation.ts +59 -0
- package/package.json +79 -5
- package/packageName.ts +5 -0
- package/sampleData/hr-nordic.json +1659 -0
- package/screens/index.ts +20 -0
- package/templateProvenance.ts +15 -0
- package/templates/formTemplates.ts +34 -0
- package/templates/index.ts +21 -0
- package/templates/listTemplates.ts +109 -0
- package/templates/orgChartTemplate.ts +27 -0
- package/templates/recordTemplates.ts +75 -0
- package/thumbnails/HrEmployeeDirectory.svg +29 -0
- package/thumbnails/HrEmployeePage.svg +18 -0
- package/thumbnails/HrOnboardingChecklist.svg +18 -0
- package/thumbnails/HrOnboardingList.svg +13 -0
- package/thumbnails/HrOrgChart.svg +20 -0
- package/thumbnails/HrQuickCreateEmployee.svg +12 -0
- package/thumbnails/HrRequestTimeOff.svg +12 -0
- package/thumbnails/HrTimeOffBalanceList.svg +13 -0
- package/thumbnails/HrTimeOffList.svg +13 -0
- package/thumbnails/hr.svg +14 -0
- package/README.md +0 -3
package/screens/index.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { Screen } from '@cratis/scene.model';
|
|
5
|
+
import { LayoutName } from '@cratis/scene.blueprint.default';
|
|
6
|
+
import { hrScreenDefinitions } from '../hrScreenSet';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The ready-to-use screens: real `Screen` instances, one for each entry of the manifest's `blueprint.screenSet`, each filling the screen template it names in
|
|
10
|
+
* the foundation's application shell. A new application that adopts the blueprint gets these, wired into its navigation (`hrNavigation`).
|
|
11
|
+
*/
|
|
12
|
+
export const hrScreens: Screen[] = hrScreenDefinitions.map(definition => ({
|
|
13
|
+
name: definition.name,
|
|
14
|
+
layout: LayoutName.AppShell,
|
|
15
|
+
screenTemplate: definition.template,
|
|
16
|
+
slotContent: {},
|
|
17
|
+
forms: [],
|
|
18
|
+
contributions: [],
|
|
19
|
+
path: definition.name.split('.'),
|
|
20
|
+
}));
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { TemplateMetadata } from '@cratis/scene.model';
|
|
5
|
+
|
|
6
|
+
/** The compatibility, attribution and license metadata every template this blueprint ships carries. */
|
|
7
|
+
export const hrTemplateProvenance: Pick<TemplateMetadata, 'compatibility' | 'attribution' | 'license' | 'licenseUrl'> = {
|
|
8
|
+
compatibility: {
|
|
9
|
+
scene: '^4.13.0',
|
|
10
|
+
packages: [{ name: 'Cratis.Blueprint.Default', versionRange: '^1.0.0' }],
|
|
11
|
+
},
|
|
12
|
+
attribution: { author: 'Cratis', url: 'https://github.com/Cratis/Scene/tree/main/Source/JavaScript/blueprint.hr' },
|
|
13
|
+
license: 'MIT',
|
|
14
|
+
licenseUrl: 'https://github.com/Cratis/Scene/blob/main/LICENSE',
|
|
15
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { DialogTemplate, TemplateScope } from '@cratis/scene.model';
|
|
5
|
+
import { quickCreateDialogTemplate } from '@cratis/scene.blueprint.default';
|
|
6
|
+
import { HrQuery, fromQuery, localeOfData } from '../hrQueries';
|
|
7
|
+
import { closesDialog, component, hrMetadata, withBehaviors } from '../hrParts';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* One quick-create dialog: the foundation `QuickCreateDialog` - a short form opened from a page to make one record without leaving it - with the fields
|
|
11
|
+
* that thing needs to get started.
|
|
12
|
+
*/
|
|
13
|
+
function quickCreateOf(name: string, title: string, subtitle: string, sections: string, noun: string, create: string): DialogTemplate {
|
|
14
|
+
return {
|
|
15
|
+
name,
|
|
16
|
+
slots: quickCreateDialogTemplate.slots,
|
|
17
|
+
content: {
|
|
18
|
+
header: [component(`${name}-frame`, 'dialogFrame', { title, subtitle })],
|
|
19
|
+
body: [withBehaviors(component(`${name}-form`, 'formScreenBody', {
|
|
20
|
+
mode: 'create', saveAndNew: false, strings: { formSave: create }, sections: fromQuery(sections), errors: fromQuery(HrQuery.FormErrors, '0'), ...localeOfData,
|
|
21
|
+
}), closesDialog())],
|
|
22
|
+
actions: [],
|
|
23
|
+
},
|
|
24
|
+
displayName: `HR quick create ${noun}`,
|
|
25
|
+
description: noun === 'time-off request' ? 'A short form that asks for time off without leaving the page.' : `A short form that creates one ${noun} without leaving the page.`,
|
|
26
|
+
metadata: hrMetadata(name, 'Dialog', [TemplateScope.Slice]),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Request time off (type, dates, a note), and the quick creation of an employee. */
|
|
31
|
+
export const hrQuickCreateDialogs: DialogTemplate[] = [
|
|
32
|
+
quickCreateOf('HrRequestTimeOff', 'Request time off', 'Say when and what kind', 'TimeOffQuickSections', 'time-off request', 'Send request'),
|
|
33
|
+
quickCreateOf('HrQuickCreateEmployee', 'New employee', 'Only what is needed to get started', 'EmployeeQuickSections', 'employee', 'Create'),
|
|
34
|
+
];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { hrEmployeeDirectoryTemplate, hrOnboardingListTemplate, hrTimeOffBalanceListTemplate, hrTimeOffListTemplate } from './listTemplates';
|
|
5
|
+
import { hrOrgChartTemplate } from './orgChartTemplate';
|
|
6
|
+
import { hrEmployeePageTemplate, hrOnboardingChecklistTemplate } from './recordTemplates';
|
|
7
|
+
|
|
8
|
+
export * from './listTemplates';
|
|
9
|
+
export * from './recordTemplates';
|
|
10
|
+
export * from './orgChartTemplate';
|
|
11
|
+
export * from './formTemplates';
|
|
12
|
+
|
|
13
|
+
/** Every screen template this blueprint provides, in the order the manifest lists them. */
|
|
14
|
+
export const hrScreenTemplates = [
|
|
15
|
+
hrEmployeeDirectoryTemplate, hrEmployeePageTemplate,
|
|
16
|
+
hrOrgChartTemplate,
|
|
17
|
+
hrTimeOffListTemplate, hrTimeOffBalanceListTemplate,
|
|
18
|
+
hrOnboardingListTemplate, hrOnboardingChecklistTemplate,
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
export { hrQuickCreateDialogs as hrDialogTemplates } from './formTemplates';
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { InteractionActionKind, InteractionTriggerKind, NotificationLevel, NotifyAction, ScreenTemplate, TemplateScope } from '@cratis/scene.model';
|
|
5
|
+
import { listScreenTemplate } from '@cratis/scene.blueprint.default';
|
|
6
|
+
import { HrEntityKind, fromQuery, hrQueriesOf, localeOfData } from '../hrQueries';
|
|
7
|
+
import { actionButton, component, goesTo, hrMetadata, opensDialog, opensRecordOnSelect, withBehaviors } from '../hrParts';
|
|
8
|
+
|
|
9
|
+
const listScopes = [TemplateScope.Module, TemplateScope.Feature];
|
|
10
|
+
|
|
11
|
+
/** The Export button: it tells the user the export has started, which is what the shell does for a long-running action it does not wait on. */
|
|
12
|
+
const exportAction = (id: string) => withBehaviors(actionButton(id, 'Export', 'secondary'), [{
|
|
13
|
+
bindings: [{
|
|
14
|
+
trigger: { kind: InteractionTriggerKind.Click },
|
|
15
|
+
actions: [{ kind: InteractionActionKind.Notify, level: NotificationLevel.Info, message: { text: 'The export has started.' } } as unknown as NotifyAction],
|
|
16
|
+
}],
|
|
17
|
+
}]);
|
|
18
|
+
|
|
19
|
+
interface ListOptions {
|
|
20
|
+
name: string;
|
|
21
|
+
entity: HrEntityKind;
|
|
22
|
+
displayName: string;
|
|
23
|
+
description: string;
|
|
24
|
+
title: string;
|
|
25
|
+
subtitle: string;
|
|
26
|
+
searchLabel: string;
|
|
27
|
+
urlKey: string;
|
|
28
|
+
/** The primary action of the header: a quick-create dialog to open, or a screen to go to. */
|
|
29
|
+
primary: { label: string; dialog?: string; screen?: string };
|
|
30
|
+
rowActions: string[];
|
|
31
|
+
bulkActions: string[];
|
|
32
|
+
titleField: string;
|
|
33
|
+
/** The screen a chosen row opens; the list then selects one row at a time. Absent, rows are selected many at a time for the bulk bar. */
|
|
34
|
+
recordScreen?: string;
|
|
35
|
+
/** Rows are not selectable at all: a record of what happened, which nobody edits. */
|
|
36
|
+
readOnly?: boolean;
|
|
37
|
+
/** Show the records as cards, each with the picture its `imageField` names. */
|
|
38
|
+
cards?: { imageField: string };
|
|
39
|
+
/** Tint a row by the tone in this field (always beside a status column that says the same in words). */
|
|
40
|
+
toneField?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* One HR list: the foundation `ListScreen` with its header, toolbar, filters, list and bulk bar filled for an entity. The slots, arrangement and
|
|
45
|
+
* every behavior - sort, search, paging and selection in the address, the table collapsing to cards on a phone - are the foundation's.
|
|
46
|
+
*/
|
|
47
|
+
function listTemplateOf(options: ListOptions): ScreenTemplate {
|
|
48
|
+
const queries = hrQueriesOf(options.entity);
|
|
49
|
+
const id = options.name;
|
|
50
|
+
const listId = `${id}-records`;
|
|
51
|
+
const primary = withBehaviors(actionButton(`${id}-primary`, options.primary.label, 'primary'), options.primary.dialog ? opensDialog(options.primary.dialog) : goesTo(options.primary.screen!));
|
|
52
|
+
const list = component(listId, 'dataList', {
|
|
53
|
+
label: options.title, rows: fromQuery(queries.rows), columns: fromQuery(queries.columns), titleField: options.titleField, pageSize: options.cards ? 12 : 10, urlKey: options.urlKey, ...localeOfData,
|
|
54
|
+
rowActions: options.rowActions,
|
|
55
|
+
...(options.readOnly ? {} : { selectionMode: options.recordScreen ? 'single' : 'multiple' }),
|
|
56
|
+
...(options.cards ? { variant: 'cards', imageField: options.cards.imageField } : {}),
|
|
57
|
+
...(options.toneField ? { toneField: options.toneField } : {}),
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
name: options.name,
|
|
62
|
+
fitsSlot: 'content',
|
|
63
|
+
slots: listScreenTemplate.slots,
|
|
64
|
+
arrangement: listScreenTemplate.arrangement,
|
|
65
|
+
content: {
|
|
66
|
+
header: [component(`${id}-header`, 'pageHeader', { title: options.title, subtitle: options.subtitle }, { actions: [exportAction(`${id}-export`), primary] })],
|
|
67
|
+
toolbar: [
|
|
68
|
+
component(`${id}-search`, 'globalSearch', { placeholder: options.searchLabel, label: options.searchLabel, urlKey: `${options.urlKey}q` }),
|
|
69
|
+
component(`${id}-views`, 'savedViewsMenu', { views: fromQuery(queries.views), savePermission: 'enabled', managePermission: 'enabled' }),
|
|
70
|
+
component(`${id}-columns`, 'columnChooser', { columns: fromQuery(queries.columnChoices) }),
|
|
71
|
+
],
|
|
72
|
+
filters: [component(`${id}-filter`, 'filterBuilder', { fields: fromQuery(queries.filterFields), ...localeOfData })],
|
|
73
|
+
list: [options.recordScreen ? withBehaviors(list, opensRecordOnSelect(listId, options.recordScreen)) : list],
|
|
74
|
+
bulkBar: options.recordScreen || options.readOnly ? [] : [component(`${id}-bulk`, 'bulkBar', { selection: fromQuery(queries.selection), actions: options.bulkActions })],
|
|
75
|
+
footer: [],
|
|
76
|
+
},
|
|
77
|
+
displayName: options.displayName,
|
|
78
|
+
description: options.description,
|
|
79
|
+
metadata: hrMetadata(options.name, 'List', listScopes),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** The directory: everyone in the company as cards - photo, name, title, department and how to reach them. Choosing a card opens the employee. */
|
|
84
|
+
export const hrEmployeeDirectoryTemplate = listTemplateOf({
|
|
85
|
+
name: 'HrEmployeeDirectory', entity: HrEntityKind.Employee, displayName: 'HR employee directory', description: 'Employees as cards with photo, name, title, department and contact, filtered by department, location and status.',
|
|
86
|
+
title: 'Directory', subtitle: 'Everyone in the company', searchLabel: 'Search people', urlKey: 'people', primary: { label: 'New employee', dialog: 'HrQuickCreateEmployee' },
|
|
87
|
+
rowActions: ['View profile', 'Send email'], bulkActions: [], titleField: 'name', recordScreen: 'hr.directory.record', cards: { imageField: 'photo' },
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
/** The time-off requests: who asked for what and when, with the actions a manager takes on one or many at once. */
|
|
91
|
+
export const hrTimeOffListTemplate = listTemplateOf({
|
|
92
|
+
name: 'HrTimeOffList', entity: HrEntityKind.TimeOff, displayName: 'HR time off', description: 'Time-off requests with the employee, type, dates, days and status, filtered by type, status and period.',
|
|
93
|
+
title: 'Time off', subtitle: 'Requests to approve and who is away', searchLabel: 'Search requests', urlKey: 'timeoff', primary: { label: 'Request time off', dialog: 'HrRequestTimeOff' },
|
|
94
|
+
rowActions: ['Approve', 'Decline', 'Cancel'], bulkActions: ['Approve', 'Decline'], titleField: 'employee',
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
/** The balances: what each employee is entitled to, has taken and has left, with how much of the year is used. Read only. */
|
|
98
|
+
export const hrTimeOffBalanceListTemplate = listTemplateOf({
|
|
99
|
+
name: 'HrTimeOffBalanceList', entity: HrEntityKind.Balance, displayName: 'HR time-off balances', description: 'Each employee\'s entitlement, days taken and days left, with how much of it is used.',
|
|
100
|
+
title: 'Balances', subtitle: 'Time off taken and left this year', searchLabel: 'Search balances', urlKey: 'balances', primary: { label: 'Request time off', dialog: 'HrRequestTimeOff' },
|
|
101
|
+
rowActions: ['View employee'], bulkActions: [], titleField: 'employee', readOnly: true,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
/** The onboarding: new hires, when they start, who looks after them and how far along their checklist is. Choosing a row opens the checklist. */
|
|
105
|
+
export const hrOnboardingListTemplate = listTemplateOf({
|
|
106
|
+
name: 'HrOnboardingList', entity: HrEntityKind.Onboarding, displayName: 'HR onboarding', description: 'New hires with their start date, owner and a progress bar of their checklist.',
|
|
107
|
+
title: 'Onboarding', subtitle: 'New hires and how far along they are', searchLabel: 'Search new hires', urlKey: 'onboarding', primary: { label: 'New employee', dialog: 'HrQuickCreateEmployee' },
|
|
108
|
+
rowActions: ['Open checklist', 'Remind owner'], bulkActions: [], titleField: 'name', recordScreen: 'hr.onboarding.record',
|
|
109
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { ScreenTemplate, TemplateScope } from '@cratis/scene.model';
|
|
5
|
+
import { column, slotLeaf } from '@cratis/scene.blueprint.default';
|
|
6
|
+
import { HrQuery, fromQuery, localeOfData } from '../hrQueries';
|
|
7
|
+
import { actionButton, component, goesTo, hrMetadata, withBehaviors } from '../hrParts';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The org chart: the company as a tree - who reports to whom, with each person's title and how many report to them. It follows the ARIA tree pattern, so it is as
|
|
11
|
+
* usable from a keyboard and a screen reader as with a pointer, and the chosen person is kept in the address, so a link points at a place in the chart.
|
|
12
|
+
*/
|
|
13
|
+
export const hrOrgChartTemplate: ScreenTemplate = {
|
|
14
|
+
name: 'HrOrgChart',
|
|
15
|
+
fitsSlot: 'content',
|
|
16
|
+
slots: [{ name: 'header' }, { name: 'chart' }],
|
|
17
|
+
arrangement: { root: column([slotLeaf('header'), slotLeaf('chart')], 16) },
|
|
18
|
+
content: {
|
|
19
|
+
header: [component('HrOrgChart-header', 'pageHeader', { title: 'Org chart', subtitle: 'Who reports to whom' }, {
|
|
20
|
+
actions: [withBehaviors(actionButton('HrOrgChart-directory', 'Open the directory', 'secondary'), goesTo('hr.directory'))],
|
|
21
|
+
})],
|
|
22
|
+
chart: [component('HrOrgChart-tree', 'orgTree', { nodes: fromQuery(HrQuery.OrgNodes), expandedDepth: 2, urlKey: 'person', strings: { orgTree: 'Org chart', orgReports: '{count} reports' }, ...localeOfData })],
|
|
23
|
+
},
|
|
24
|
+
displayName: 'HR org chart',
|
|
25
|
+
description: 'The company as a tree of who reports to whom, with titles and report counts.',
|
|
26
|
+
metadata: hrMetadata('HrOrgChart', 'Detail', [TemplateScope.Module, TemplateScope.Feature]),
|
|
27
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { ScreenTemplate, TemplateScope } from '@cratis/scene.model';
|
|
5
|
+
import { recordPageTemplate } from '@cratis/scene.blueprint.default';
|
|
6
|
+
import { HrEntityKind, HrQuery, fromQuery, hrQueriesOf, localeOfData } from '../hrQueries';
|
|
7
|
+
import { actionButton, component, hrMetadata, opensDialog, withBehaviors } from '../hrParts';
|
|
8
|
+
|
|
9
|
+
const employee = hrQueriesOf(HrEntityKind.Employee);
|
|
10
|
+
const onboarding = hrQueriesOf(HrEntityKind.Onboarding);
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The employee page: the foundation `RecordPage` with the employee's name as its title, the time-off balance as key facts under it, the personal and job
|
|
14
|
+
* information as the record, the employee's documents and time-off requests as related lists, their history and the open tasks beside it.
|
|
15
|
+
*/
|
|
16
|
+
export const hrEmployeePageTemplate: ScreenTemplate = {
|
|
17
|
+
name: 'HrEmployeePage',
|
|
18
|
+
fitsSlot: 'content',
|
|
19
|
+
slots: recordPageTemplate.slots,
|
|
20
|
+
arrangement: recordPageTemplate.arrangement,
|
|
21
|
+
content: {
|
|
22
|
+
header: [component('HrEmployeePage-header', 'pageHeader', { title: fromQuery(employee.record, '0.name'), subtitle: fromQuery(employee.record, '0.title') }, {
|
|
23
|
+
actions: [withBehaviors(actionButton('HrEmployeePage-timeoff', 'Request time off', 'primary'), opensDialog('HrRequestTimeOff'))],
|
|
24
|
+
})],
|
|
25
|
+
summary: [
|
|
26
|
+
component('HrEmployeePage-status', 'statusChip', { status: fromQuery(employee.summary, '0.status'), tone: fromQuery(employee.summary, '0.tone') }),
|
|
27
|
+
component('HrEmployeePage-left', 'statCard', { label: 'Leave left (days)', value: fromQuery(employee.summary, '0.leaveLeft'), ...localeOfData }),
|
|
28
|
+
component('HrEmployeePage-taken', 'statCard', { label: 'Leave taken (days)', value: fromQuery(employee.summary, '0.leaveTaken'), ...localeOfData }),
|
|
29
|
+
component('HrEmployeePage-service', 'statCard', { label: 'Years of service', value: fromQuery(employee.summary, '0.years'), ...localeOfData }),
|
|
30
|
+
component('HrEmployeePage-team', 'avatarStack', { people: fromQuery(employee.summary, '0.people') }),
|
|
31
|
+
],
|
|
32
|
+
tabs: [component('HrEmployeePage-tabs', 'tabSet', { tabs: fromQuery(HrQuery.RecordTabs), urlKey: 'tab', label: 'Employee sections' })],
|
|
33
|
+
main: [component('HrEmployeePage-form', 'formScreenBody', { mode: 'readOnly', sections: fromQuery(employee.sections), values: fromQuery(employee.record, '0'), ...localeOfData })],
|
|
34
|
+
related: [
|
|
35
|
+
component('HrEmployeePage-documents', 'dataList', { label: 'Documents', rows: fromQuery(employee.documents), columns: fromQuery('DocumentColumns'), titleField: 'name', pageSize: 5, ...localeOfData }),
|
|
36
|
+
component('HrEmployeePage-requests', 'dataList', {
|
|
37
|
+
label: 'Time off', rows: fromQuery('EmployeeTimeOff'), columns: fromQuery(hrQueriesOf(HrEntityKind.TimeOff).columns), titleField: 'employee', pageSize: 5, ...localeOfData,
|
|
38
|
+
}),
|
|
39
|
+
],
|
|
40
|
+
activity: [component('HrEmployeePage-activity', 'activityFeed', { label: 'History', entries: fromQuery(employee.activity), ...localeOfData })],
|
|
41
|
+
aside: [component('HrEmployeePage-tasks', 'checklistSection', { label: 'Open tasks', sections: fromQuery(employee.tasks), ...localeOfData })],
|
|
42
|
+
},
|
|
43
|
+
displayName: 'HR employee page',
|
|
44
|
+
description: 'One employee: personal and job information, documents and time-off balance.',
|
|
45
|
+
metadata: hrMetadata('HrEmployeePage', 'Detail', [TemplateScope.Feature, TemplateScope.Subfeature]),
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The onboarding checklist: a `RecordPage` variant for one new hire. Where an ordinary record page leads with the record's fields, this one leads with the checklist -
|
|
50
|
+
* sections of tasks (before the first day, the first week, the first month), each task with an owner and a due date and a way to tick it off - and keeps the
|
|
51
|
+
* key facts of the hire (start date, manager, buddy, equipment) beside it.
|
|
52
|
+
*/
|
|
53
|
+
export const hrOnboardingChecklistTemplate: ScreenTemplate = {
|
|
54
|
+
name: 'HrOnboardingChecklist',
|
|
55
|
+
fitsSlot: 'content',
|
|
56
|
+
slots: recordPageTemplate.slots,
|
|
57
|
+
arrangement: recordPageTemplate.arrangement,
|
|
58
|
+
content: {
|
|
59
|
+
header: [component('HrOnboardingChecklist-header', 'pageHeader', { title: fromQuery(onboarding.record, '0.name'), subtitle: 'Onboarding checklist' })],
|
|
60
|
+
summary: [
|
|
61
|
+
component('HrOnboardingChecklist-status', 'statusChip', { status: fromQuery(onboarding.summary, '0.status'), tone: fromQuery(onboarding.summary, '0.tone') }),
|
|
62
|
+
component('HrOnboardingChecklist-done', 'statCard', { label: 'Tasks done', value: fromQuery(onboarding.summary, '0.done'), ...localeOfData }),
|
|
63
|
+
component('HrOnboardingChecklist-open', 'statCard', { label: 'Tasks open', value: fromQuery(onboarding.summary, '0.open'), ...localeOfData }),
|
|
64
|
+
component('HrOnboardingChecklist-owners', 'avatarStack', { people: fromQuery(onboarding.summary, '0.people') }),
|
|
65
|
+
],
|
|
66
|
+
tabs: [],
|
|
67
|
+
main: [component('HrOnboardingChecklist-tasks', 'checklistSection', { label: 'Onboarding tasks', sections: fromQuery(onboarding.tasks), editPermission: 'enabled', ...localeOfData })],
|
|
68
|
+
related: [],
|
|
69
|
+
activity: [component('HrOnboardingChecklist-activity', 'activityFeed', { label: 'History', entries: fromQuery(onboarding.activity), ...localeOfData })],
|
|
70
|
+
aside: [component('HrOnboardingChecklist-facts', 'formScreenBody', { mode: 'readOnly', sections: fromQuery(onboarding.sections), values: fromQuery(onboarding.record, '0'), ...localeOfData })],
|
|
71
|
+
},
|
|
72
|
+
displayName: 'HR onboarding checklist',
|
|
73
|
+
description: 'One new hire\'s onboarding: checklist sections with an owner and a due date for each task, and the key facts of the hire.',
|
|
74
|
+
metadata: hrMetadata('HrOnboardingChecklist', 'Detail', [TemplateScope.Feature, TemplateScope.Subfeature]),
|
|
75
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="320" height="200" viewBox="0 0 320 200" role="img" aria-label="HR employee directory">
|
|
2
|
+
<rect x="0" y="0" width="320" height="200" rx="8" fill="#f4f5f7"/>
|
|
3
|
+
<rect x="12" y="12" width="296" height="20" rx="4" fill="#9333ea"/>
|
|
4
|
+
<rect x="12" y="40" width="64" height="148" rx="4" fill="#d5d9df"/>
|
|
5
|
+
<rect x="84" y="40" width="68" height="70" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
6
|
+
<rect x="88" y="44" width="60" height="30" rx="4" fill="#d5d9df"/>
|
|
7
|
+
<rect x="90" y="82" width="40" height="5" rx="3" fill="#9333ea"/>
|
|
8
|
+
<rect x="90" y="94" width="52" height="5" rx="3" fill="#9aa3b2"/>
|
|
9
|
+
<rect x="160" y="40" width="68" height="70" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
10
|
+
<rect x="164" y="44" width="60" height="30" rx="4" fill="#d5d9df"/>
|
|
11
|
+
<rect x="166" y="82" width="40" height="5" rx="3" fill="#9333ea"/>
|
|
12
|
+
<rect x="166" y="94" width="52" height="5" rx="3" fill="#9aa3b2"/>
|
|
13
|
+
<rect x="236" y="40" width="68" height="70" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
14
|
+
<rect x="240" y="44" width="60" height="30" rx="4" fill="#d5d9df"/>
|
|
15
|
+
<rect x="242" y="82" width="40" height="5" rx="3" fill="#9333ea"/>
|
|
16
|
+
<rect x="242" y="94" width="52" height="5" rx="3" fill="#9aa3b2"/>
|
|
17
|
+
<rect x="84" y="116" width="68" height="70" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
18
|
+
<rect x="88" y="120" width="60" height="30" rx="4" fill="#d5d9df"/>
|
|
19
|
+
<rect x="90" y="158" width="40" height="5" rx="3" fill="#9333ea"/>
|
|
20
|
+
<rect x="90" y="170" width="52" height="5" rx="3" fill="#9aa3b2"/>
|
|
21
|
+
<rect x="160" y="116" width="68" height="70" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
22
|
+
<rect x="164" y="120" width="60" height="30" rx="4" fill="#d5d9df"/>
|
|
23
|
+
<rect x="166" y="158" width="40" height="5" rx="3" fill="#9333ea"/>
|
|
24
|
+
<rect x="166" y="170" width="52" height="5" rx="3" fill="#9aa3b2"/>
|
|
25
|
+
<rect x="236" y="116" width="68" height="70" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
26
|
+
<rect x="240" y="120" width="60" height="30" rx="4" fill="#d5d9df"/>
|
|
27
|
+
<rect x="242" y="158" width="40" height="5" rx="3" fill="#9333ea"/>
|
|
28
|
+
<rect x="242" y="170" width="52" height="5" rx="3" fill="#9aa3b2"/>
|
|
29
|
+
</svg>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="320" height="200" viewBox="0 0 320 200" role="img" aria-label="HR employee page">
|
|
2
|
+
<rect x="0" y="0" width="320" height="200" rx="8" fill="#f4f5f7"/>
|
|
3
|
+
<rect x="12" y="12" width="296" height="20" rx="4" fill="#9333ea"/>
|
|
4
|
+
<rect x="12" y="40" width="64" height="148" rx="4" fill="#d5d9df"/>
|
|
5
|
+
<rect x="84" y="40" width="224" height="30" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
6
|
+
<rect x="90" y="47" width="46" height="16" rx="3" fill="#d5d9df"/>
|
|
7
|
+
<rect x="144" y="47" width="46" height="16" rx="3" fill="#d5d9df"/>
|
|
8
|
+
<rect x="198" y="47" width="46" height="16" rx="3" fill="#d5d9df"/>
|
|
9
|
+
<rect x="252" y="47" width="46" height="16" rx="3" fill="#d5d9df"/>
|
|
10
|
+
<rect x="84" y="78" width="140" height="110" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
11
|
+
<rect x="92" y="90" width="120" height="6" rx="3" fill="#9aa3b2"/>
|
|
12
|
+
<rect x="92" y="107" width="98" height="6" rx="3" fill="#9aa3b2"/>
|
|
13
|
+
<rect x="92" y="124" width="120" height="6" rx="3" fill="#9aa3b2"/>
|
|
14
|
+
<rect x="92" y="141" width="98" height="6" rx="3" fill="#9aa3b2"/>
|
|
15
|
+
<rect x="92" y="158" width="120" height="6" rx="3" fill="#9aa3b2"/>
|
|
16
|
+
<rect x="232" y="78" width="76" height="52" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
17
|
+
<rect x="232" y="136" width="76" height="52" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
18
|
+
</svg>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="320" height="200" viewBox="0 0 320 200" role="img" aria-label="HR onboarding checklist">
|
|
2
|
+
<rect x="0" y="0" width="320" height="200" rx="8" fill="#f4f5f7"/>
|
|
3
|
+
<rect x="12" y="12" width="296" height="20" rx="4" fill="#9333ea"/>
|
|
4
|
+
<rect x="12" y="40" width="64" height="148" rx="4" fill="#d5d9df"/>
|
|
5
|
+
<rect x="84" y="40" width="224" height="30" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
6
|
+
<rect x="90" y="47" width="46" height="16" rx="3" fill="#d5d9df"/>
|
|
7
|
+
<rect x="144" y="47" width="46" height="16" rx="3" fill="#d5d9df"/>
|
|
8
|
+
<rect x="198" y="47" width="46" height="16" rx="3" fill="#d5d9df"/>
|
|
9
|
+
<rect x="252" y="47" width="46" height="16" rx="3" fill="#d5d9df"/>
|
|
10
|
+
<rect x="84" y="78" width="140" height="110" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
11
|
+
<rect x="92" y="90" width="120" height="6" rx="3" fill="#9aa3b2"/>
|
|
12
|
+
<rect x="92" y="107" width="98" height="6" rx="3" fill="#9aa3b2"/>
|
|
13
|
+
<rect x="92" y="124" width="120" height="6" rx="3" fill="#9aa3b2"/>
|
|
14
|
+
<rect x="92" y="141" width="98" height="6" rx="3" fill="#9aa3b2"/>
|
|
15
|
+
<rect x="92" y="158" width="120" height="6" rx="3" fill="#9aa3b2"/>
|
|
16
|
+
<rect x="232" y="78" width="76" height="52" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
17
|
+
<rect x="232" y="136" width="76" height="52" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
18
|
+
</svg>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="320" height="200" viewBox="0 0 320 200" role="img" aria-label="HR onboarding">
|
|
2
|
+
<rect x="0" y="0" width="320" height="200" rx="8" fill="#f4f5f7"/>
|
|
3
|
+
<rect x="12" y="12" width="296" height="20" rx="4" fill="#9333ea"/>
|
|
4
|
+
<rect x="12" y="40" width="64" height="148" rx="4" fill="#d5d9df"/>
|
|
5
|
+
<rect x="84" y="40" width="224" height="148" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
6
|
+
<rect x="94" y="48" width="60" height="6" rx="3" fill="#9333ea"/>
|
|
7
|
+
<rect x="94" y="70" width="206" height="6" rx="3" fill="#9aa3b2"/>
|
|
8
|
+
<rect x="94" y="87" width="168" height="6" rx="3" fill="#9aa3b2"/>
|
|
9
|
+
<rect x="94" y="104" width="206" height="6" rx="3" fill="#9aa3b2"/>
|
|
10
|
+
<rect x="94" y="121" width="168" height="6" rx="3" fill="#9aa3b2"/>
|
|
11
|
+
<rect x="94" y="138" width="206" height="6" rx="3" fill="#9aa3b2"/>
|
|
12
|
+
<rect x="94" y="155" width="168" height="6" rx="3" fill="#9aa3b2"/>
|
|
13
|
+
</svg>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="320" height="200" viewBox="0 0 320 200" role="img" aria-label="HR org chart">
|
|
2
|
+
<rect x="0" y="0" width="320" height="200" rx="8" fill="#f4f5f7"/>
|
|
3
|
+
<rect x="12" y="12" width="296" height="20" rx="4" fill="#9333ea"/>
|
|
4
|
+
<rect x="12" y="40" width="64" height="148" rx="4" fill="#d5d9df"/>
|
|
5
|
+
<rect x="84" y="40" width="66" height="148" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
6
|
+
<rect x="90" y="54" width="54" height="6" rx="3" fill="#9aa3b2"/>
|
|
7
|
+
<rect x="90" y="71" width="44" height="6" rx="3" fill="#9aa3b2"/>
|
|
8
|
+
<rect x="90" y="88" width="54" height="6" rx="3" fill="#9aa3b2"/>
|
|
9
|
+
<rect x="90" y="105" width="44" height="6" rx="3" fill="#9aa3b2"/>
|
|
10
|
+
<rect x="90" y="122" width="54" height="6" rx="3" fill="#9aa3b2"/>
|
|
11
|
+
<rect x="90" y="139" width="44" height="6" rx="3" fill="#9aa3b2"/>
|
|
12
|
+
<rect x="158" y="40" width="150" height="148" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
13
|
+
<rect x="166" y="48" width="60" height="6" rx="3" fill="#9333ea"/>
|
|
14
|
+
<rect x="166" y="70" width="134" height="6" rx="3" fill="#9aa3b2"/>
|
|
15
|
+
<rect x="166" y="87" width="109" height="6" rx="3" fill="#9aa3b2"/>
|
|
16
|
+
<rect x="166" y="104" width="134" height="6" rx="3" fill="#9aa3b2"/>
|
|
17
|
+
<rect x="166" y="121" width="109" height="6" rx="3" fill="#9aa3b2"/>
|
|
18
|
+
<rect x="166" y="138" width="134" height="6" rx="3" fill="#9aa3b2"/>
|
|
19
|
+
<rect x="166" y="155" width="109" height="6" rx="3" fill="#9aa3b2"/>
|
|
20
|
+
</svg>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="320" height="200" viewBox="0 0 320 200" role="img" aria-label="HR quick create employee">
|
|
2
|
+
<rect x="0" y="0" width="320" height="200" rx="8" fill="#f4f5f7"/>
|
|
3
|
+
<rect x="12" y="12" width="296" height="20" rx="4" fill="#9333ea"/>
|
|
4
|
+
<rect x="12" y="40" width="64" height="148" rx="4" fill="#d5d9df"/>
|
|
5
|
+
<rect x="84" y="40" width="224" height="148" rx="4" fill="#e6e9ee"/>
|
|
6
|
+
<rect x="114" y="62" width="164" height="108" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
7
|
+
<rect x="124" y="70" width="60" height="6" rx="3" fill="#9333ea"/>
|
|
8
|
+
<rect x="124" y="88" width="144" height="14" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
9
|
+
<rect x="124" y="108" width="144" height="14" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
10
|
+
<rect x="124" y="140" width="54" height="20" rx="4" fill="#9333ea"/>
|
|
11
|
+
<rect x="184" y="140" width="54" height="20" rx="4" fill="#d5d9df"/>
|
|
12
|
+
</svg>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="320" height="200" viewBox="0 0 320 200" role="img" aria-label="HR request time off">
|
|
2
|
+
<rect x="0" y="0" width="320" height="200" rx="8" fill="#f4f5f7"/>
|
|
3
|
+
<rect x="12" y="12" width="296" height="20" rx="4" fill="#9333ea"/>
|
|
4
|
+
<rect x="12" y="40" width="64" height="148" rx="4" fill="#d5d9df"/>
|
|
5
|
+
<rect x="84" y="40" width="224" height="148" rx="4" fill="#e6e9ee"/>
|
|
6
|
+
<rect x="114" y="62" width="164" height="108" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
7
|
+
<rect x="124" y="70" width="60" height="6" rx="3" fill="#9333ea"/>
|
|
8
|
+
<rect x="124" y="88" width="144" height="14" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
9
|
+
<rect x="124" y="108" width="144" height="14" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
10
|
+
<rect x="124" y="140" width="54" height="20" rx="4" fill="#9333ea"/>
|
|
11
|
+
<rect x="184" y="140" width="54" height="20" rx="4" fill="#d5d9df"/>
|
|
12
|
+
</svg>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="320" height="200" viewBox="0 0 320 200" role="img" aria-label="HR time-off balances">
|
|
2
|
+
<rect x="0" y="0" width="320" height="200" rx="8" fill="#f4f5f7"/>
|
|
3
|
+
<rect x="12" y="12" width="296" height="20" rx="4" fill="#9333ea"/>
|
|
4
|
+
<rect x="12" y="40" width="64" height="148" rx="4" fill="#d5d9df"/>
|
|
5
|
+
<rect x="84" y="40" width="224" height="148" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
6
|
+
<rect x="94" y="48" width="60" height="6" rx="3" fill="#9333ea"/>
|
|
7
|
+
<rect x="94" y="70" width="206" height="6" rx="3" fill="#9aa3b2"/>
|
|
8
|
+
<rect x="94" y="87" width="168" height="6" rx="3" fill="#9aa3b2"/>
|
|
9
|
+
<rect x="94" y="104" width="206" height="6" rx="3" fill="#9aa3b2"/>
|
|
10
|
+
<rect x="94" y="121" width="168" height="6" rx="3" fill="#9aa3b2"/>
|
|
11
|
+
<rect x="94" y="138" width="206" height="6" rx="3" fill="#9aa3b2"/>
|
|
12
|
+
<rect x="94" y="155" width="168" height="6" rx="3" fill="#9aa3b2"/>
|
|
13
|
+
</svg>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="320" height="200" viewBox="0 0 320 200" role="img" aria-label="HR time off">
|
|
2
|
+
<rect x="0" y="0" width="320" height="200" rx="8" fill="#f4f5f7"/>
|
|
3
|
+
<rect x="12" y="12" width="296" height="20" rx="4" fill="#9333ea"/>
|
|
4
|
+
<rect x="12" y="40" width="64" height="148" rx="4" fill="#d5d9df"/>
|
|
5
|
+
<rect x="84" y="40" width="224" height="148" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
6
|
+
<rect x="94" y="48" width="60" height="6" rx="3" fill="#9333ea"/>
|
|
7
|
+
<rect x="94" y="70" width="206" height="6" rx="3" fill="#9aa3b2"/>
|
|
8
|
+
<rect x="94" y="87" width="168" height="6" rx="3" fill="#9aa3b2"/>
|
|
9
|
+
<rect x="94" y="104" width="206" height="6" rx="3" fill="#9aa3b2"/>
|
|
10
|
+
<rect x="94" y="121" width="168" height="6" rx="3" fill="#9aa3b2"/>
|
|
11
|
+
<rect x="94" y="138" width="206" height="6" rx="3" fill="#9aa3b2"/>
|
|
12
|
+
<rect x="94" y="155" width="168" height="6" rx="3" fill="#9aa3b2"/>
|
|
13
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="320" height="200" viewBox="0 0 320 200" role="img" aria-label="HR People and Time Off blueprint">
|
|
2
|
+
<rect x="0" y="0" width="320" height="200" rx="8" fill="#f4f5f7"/>
|
|
3
|
+
<rect x="12" y="12" width="296" height="20" rx="4" fill="#9333ea"/>
|
|
4
|
+
<rect x="12" y="40" width="64" height="148" rx="4" fill="#d5d9df"/>
|
|
5
|
+
<rect x="84" y="40" width="70" height="30" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
6
|
+
<rect x="160" y="40" width="70" height="30" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
7
|
+
<rect x="236" y="40" width="70" height="30" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
8
|
+
<rect x="84" y="78" width="224" height="110" rx="4" fill="#ffffff" stroke="#d5d9df"/>
|
|
9
|
+
<rect x="94" y="90" width="200" height="6" rx="3" fill="#9aa3b2"/>
|
|
10
|
+
<rect x="94" y="107" width="164" height="6" rx="3" fill="#9aa3b2"/>
|
|
11
|
+
<rect x="94" y="124" width="200" height="6" rx="3" fill="#9aa3b2"/>
|
|
12
|
+
<rect x="94" y="141" width="164" height="6" rx="3" fill="#9aa3b2"/>
|
|
13
|
+
<rect x="94" y="158" width="200" height="6" rx="3" fill="#9aa3b2"/>
|
|
14
|
+
</svg>
|
package/README.md
DELETED