@forwardimpact/pathway 0.22.0 → 0.23.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.
- package/bin/fit-pathway.js +8 -4
- package/package.json +6 -2
- package/src/commands/agent.js +6 -3
- package/src/commands/behaviour.js +11 -1
- package/src/commands/build.js +11 -2
- package/src/commands/command-factory.js +4 -2
- package/src/commands/dev.js +9 -2
- package/src/commands/discipline.js +25 -10
- package/src/commands/driver.js +11 -1
- package/src/commands/job.js +127 -28
- package/src/commands/level.js +25 -3
- package/src/commands/skill.js +11 -1
- package/src/commands/stage.js +11 -1
- package/src/commands/tool.js +6 -3
- package/src/commands/track.js +20 -4
- package/src/components/card.js +8 -104
- package/src/components/comparison-radar.js +1 -1
- package/src/components/detail.js +16 -118
- package/src/components/error-page.js +8 -68
- package/src/components/grid.js +12 -106
- package/src/components/list.js +7 -116
- package/src/components/nav.js +7 -60
- package/src/css/bundles/app.css +25 -21
- package/src/css/bundles/handout.css +33 -33
- package/src/css/bundles/slides.css +25 -25
- package/src/formatters/discipline/markdown.js +16 -1
- package/src/formatters/interview/shared.js +3 -3
- package/src/formatters/job/description.js +2 -2
- package/src/formatters/progress/shared.js +3 -3
- package/src/formatters/skill/shared.js +1 -1
- package/src/formatters/track/markdown.js +14 -0
- package/src/formatters/track/shared.js +1 -1
- package/src/handout.html +32 -13
- package/src/index.html +32 -13
- package/src/lib/error-boundary.js +3 -66
- package/src/lib/errors.js +7 -45
- package/src/lib/job-cache.js +1 -1
- package/src/lib/markdown.js +2 -109
- package/src/lib/reactive.js +7 -73
- package/src/lib/render.js +49 -197
- package/src/lib/router-core.js +2 -156
- package/src/lib/router-pages.js +2 -11
- package/src/lib/router-slides.js +2 -197
- package/src/lib/state.js +14 -63
- package/src/lib/utils.js +3 -10
- package/src/lib/yaml-loader.js +13 -71
- package/src/pages/agent-builder.js +1 -1
- package/src/pages/assessment-results.js +1 -1
- package/src/pages/job-builder.js +1 -1
- package/src/pages/job.js +1 -1
- package/src/pages/skill.js +1 -1
- package/src/slide-main.js +1 -1
- package/src/slides/index.js +1 -1
- package/src/slides/job.js +1 -1
- package/src/slides/overview.js +1 -1
- package/src/slides.html +32 -13
- package/src/css/base.css +0 -56
- package/src/css/components/badges.css +0 -232
- package/src/css/components/buttons.css +0 -101
- package/src/css/components/forms.css +0 -191
- package/src/css/components/layout.css +0 -218
- package/src/css/components/nav.css +0 -206
- package/src/css/components/progress.css +0 -166
- package/src/css/components/states.css +0 -82
- package/src/css/components/surfaces.css +0 -347
- package/src/css/components/tables.css +0 -362
- package/src/css/components/top-bar.css +0 -180
- package/src/css/components/typography.css +0 -121
- package/src/css/components/utilities.css +0 -41
- package/src/css/pages/detail.css +0 -119
- package/src/css/reset.css +0 -50
- package/src/css/tokens.css +0 -162
- package/src/css/views/handout.css +0 -30
- package/src/css/views/print.css +0 -634
- package/src/css/views/slide-animations.css +0 -113
- package/src/css/views/slide-base.css +0 -331
- package/src/css/views/slide-sections.css +0 -597
- package/src/css/views/slide-tables.css +0 -275
package/src/components/list.js
CHANGED
|
@@ -1,120 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Reusable list component
|
|
3
|
+
*
|
|
4
|
+
* Re-exports from @forwardimpact/libui/components/list.
|
|
3
5
|
*/
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
* @param {Object} options
|
|
11
|
-
* @param {Function} options.onSearch - Search callback
|
|
12
|
-
* @param {Array<{value: string, label: string}>} [options.filterOptions] - Filter dropdown options
|
|
13
|
-
* @param {Function} [options.onFilter] - Filter callback
|
|
14
|
-
* @param {string} [options.searchPlaceholder='Search...']
|
|
15
|
-
* @param {string} [options.filterPlaceholder='All']
|
|
16
|
-
* @returns {HTMLElement}
|
|
17
|
-
*/
|
|
18
|
-
export function createSearchBar({
|
|
19
|
-
onSearch,
|
|
20
|
-
filterOptions,
|
|
21
|
-
onFilter,
|
|
22
|
-
searchPlaceholder = "Search...",
|
|
23
|
-
filterPlaceholder = "All",
|
|
24
|
-
}) {
|
|
25
|
-
const searchInput = input({
|
|
26
|
-
type: "text",
|
|
27
|
-
className: "form-input",
|
|
28
|
-
placeholder: searchPlaceholder,
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
searchInput.addEventListener("input", (e) => {
|
|
32
|
-
onSearch(e.target.value);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
const children = [searchInput];
|
|
36
|
-
|
|
37
|
-
if (filterOptions && onFilter) {
|
|
38
|
-
const filterSelect = select(
|
|
39
|
-
{ className: "form-select" },
|
|
40
|
-
option({ value: "" }, filterPlaceholder),
|
|
41
|
-
...filterOptions.map((opt) => option({ value: opt.value }, opt.label)),
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
filterSelect.addEventListener("change", (e) => {
|
|
45
|
-
onFilter(e.target.value);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
children.push(filterSelect);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return div({ className: "search-bar" }, ...children);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Create a list of cards
|
|
56
|
-
* @param {Array} items - Items to render
|
|
57
|
-
* @param {Function} renderItem - Function to render each item as a card config
|
|
58
|
-
* @param {string} [emptyMessage='No items found']
|
|
59
|
-
* @returns {HTMLElement}
|
|
60
|
-
*/
|
|
61
|
-
export function createCardList(
|
|
62
|
-
items,
|
|
63
|
-
renderItem,
|
|
64
|
-
emptyMessage = "No items found",
|
|
65
|
-
) {
|
|
66
|
-
if (!items || items.length === 0) {
|
|
67
|
-
return div(
|
|
68
|
-
{ className: "empty-state" },
|
|
69
|
-
div({ className: "empty-message" }, emptyMessage),
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const cards = items.map((item) => {
|
|
74
|
-
const config = renderItem(item);
|
|
75
|
-
return createCard(config);
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
return div({ className: "grid grid-3" }, ...cards);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Create a grouped list (like skills by capability)
|
|
83
|
-
* @param {Object} groups - Object with group names as keys and arrays as values
|
|
84
|
-
* @param {Function} renderItem - Function to render each item
|
|
85
|
-
* @param {Function} [renderGroupHeader] - Function to render group header
|
|
86
|
-
* @returns {HTMLElement}
|
|
87
|
-
*/
|
|
88
|
-
export function createGroupedList(groups, renderItem, renderGroupHeader) {
|
|
89
|
-
const sections = Object.entries(groups).map(([groupName, items]) => {
|
|
90
|
-
const header = renderGroupHeader
|
|
91
|
-
? renderGroupHeader(groupName, items.length)
|
|
92
|
-
: div(
|
|
93
|
-
{ className: "capability-header" },
|
|
94
|
-
h2({ className: "capability-title" }, formatGroupName(groupName)),
|
|
95
|
-
createBadge(`${items.length}`, "default"),
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
const cards = items.map((item) => {
|
|
99
|
-
const config = renderItem(item);
|
|
100
|
-
return createCard(config);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
return div(
|
|
104
|
-
{ className: "capability-group" },
|
|
105
|
-
header,
|
|
106
|
-
div({ className: "grid grid-3" }, ...cards),
|
|
107
|
-
);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
return div({ className: "grouped-list" }, ...sections);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Format a group name for display
|
|
115
|
-
* @param {string} name
|
|
116
|
-
* @returns {string}
|
|
117
|
-
*/
|
|
118
|
-
function formatGroupName(name) {
|
|
119
|
-
return name.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
120
|
-
}
|
|
7
|
+
export {
|
|
8
|
+
createSearchBar,
|
|
9
|
+
createCardList,
|
|
10
|
+
createGroupedList,
|
|
11
|
+
} from "@forwardimpact/libui/components/list";
|
package/src/components/nav.js
CHANGED
|
@@ -1,64 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Navigation component helpers
|
|
3
|
+
*
|
|
4
|
+
* Re-exports from @forwardimpact/libui/components/nav.
|
|
3
5
|
*/
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
*/
|
|
11
|
-
export function updateActiveNav(path) {
|
|
12
|
-
const links = document.querySelectorAll("#drawer-nav a");
|
|
13
|
-
links.forEach((link) => {
|
|
14
|
-
const href = link.getAttribute("href").slice(1); // Remove #
|
|
15
|
-
const isActive = path === href || (href !== "/" && path.startsWith(href));
|
|
16
|
-
link.classList.toggle("active", isActive);
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Create a back link
|
|
22
|
-
* @param {string} href - Link destination
|
|
23
|
-
* @param {string} [text='Back'] - Link text
|
|
24
|
-
* @returns {HTMLElement}
|
|
25
|
-
*/
|
|
26
|
-
export function createBackLink(href, text = "← Back") {
|
|
27
|
-
return a({ href: `#${href}`, className: "back-link" }, text);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Create breadcrumbs
|
|
32
|
-
* @param {Array<{label: string, href?: string}>} items
|
|
33
|
-
* @returns {HTMLElement}
|
|
34
|
-
*/
|
|
35
|
-
export function createBreadcrumbs(items) {
|
|
36
|
-
const crumbs = items.map((item, index) => {
|
|
37
|
-
const isLast = index === items.length - 1;
|
|
38
|
-
if (isLast || !item.href) {
|
|
39
|
-
return span({ className: "breadcrumb-item" }, item.label);
|
|
40
|
-
}
|
|
41
|
-
return a(
|
|
42
|
-
{ href: `#${item.href}`, className: "breadcrumb-item" },
|
|
43
|
-
item.label,
|
|
44
|
-
);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
const separator = " / ";
|
|
48
|
-
const children = [];
|
|
49
|
-
crumbs.forEach((crumb, i) => {
|
|
50
|
-
children.push(crumb);
|
|
51
|
-
if (i < crumbs.length - 1) {
|
|
52
|
-
children.push(document.createTextNode(separator));
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
return div({ className: "breadcrumbs" }, ...children);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function span(attrs, text) {
|
|
60
|
-
const el = document.createElement("span");
|
|
61
|
-
if (attrs.className) el.className = attrs.className;
|
|
62
|
-
if (text) el.textContent = text;
|
|
63
|
-
return el;
|
|
64
|
-
}
|
|
7
|
+
export {
|
|
8
|
+
updateActiveNav,
|
|
9
|
+
createBackLink,
|
|
10
|
+
createBreadcrumbs,
|
|
11
|
+
} from "@forwardimpact/libui/components/nav";
|
package/src/css/bundles/app.css
CHANGED
|
@@ -8,36 +8,40 @@
|
|
|
8
8
|
/* Layer order declaration - must be first */
|
|
9
9
|
@layer tokens, reset, base, components, utilities, pages;
|
|
10
10
|
|
|
11
|
-
/* Foundation */
|
|
12
|
-
@import "
|
|
13
|
-
@import "
|
|
14
|
-
@import "
|
|
15
|
-
|
|
16
|
-
/* Components */
|
|
17
|
-
@import "
|
|
18
|
-
@import "
|
|
19
|
-
@import "
|
|
20
|
-
@import "
|
|
21
|
-
@import "
|
|
22
|
-
@import "
|
|
23
|
-
@import "
|
|
24
|
-
@import "
|
|
25
|
-
@import "
|
|
26
|
-
@import "
|
|
27
|
-
@import "
|
|
11
|
+
/* Foundation (from libui) */
|
|
12
|
+
@import "/ui/css/tokens.css" layer(tokens);
|
|
13
|
+
@import "/ui/css/reset.css" layer(reset);
|
|
14
|
+
@import "/ui/css/base.css" layer(base);
|
|
15
|
+
|
|
16
|
+
/* Components (from libui) */
|
|
17
|
+
@import "/ui/css/components/layout.css" layer(components);
|
|
18
|
+
@import "/ui/css/components/surfaces.css" layer(components);
|
|
19
|
+
@import "/ui/css/components/typography.css" layer(components);
|
|
20
|
+
@import "/ui/css/components/badges.css" layer(components);
|
|
21
|
+
@import "/ui/css/components/buttons.css" layer(components);
|
|
22
|
+
@import "/ui/css/components/forms.css" layer(components);
|
|
23
|
+
@import "/ui/css/components/tables.css" layer(components);
|
|
24
|
+
@import "/ui/css/components/progress.css" layer(components);
|
|
25
|
+
@import "/ui/css/components/states.css" layer(components);
|
|
26
|
+
@import "/ui/css/components/nav.css" layer(components);
|
|
27
|
+
@import "/ui/css/components/top-bar.css" layer(components);
|
|
28
|
+
|
|
29
|
+
/* Components (Pathway-specific) */
|
|
28
30
|
@import "../components/command-prompt.css" layer(components);
|
|
29
31
|
@import "../components/skill-file-viewer.css" layer(components);
|
|
30
32
|
@import "../components/file-card.css" layer(components);
|
|
31
33
|
|
|
32
|
-
/* Utilities */
|
|
33
|
-
@import "
|
|
34
|
+
/* Utilities (from libui) */
|
|
35
|
+
@import "/ui/css/components/utilities.css" layer(utilities);
|
|
36
|
+
|
|
37
|
+
/* Pages (from libui) */
|
|
38
|
+
@import "/ui/css/pages/detail.css" layer(pages);
|
|
34
39
|
|
|
35
|
-
/* Pages */
|
|
40
|
+
/* Pages (Pathway-specific) */
|
|
36
41
|
@import "../pages/landing.css" layer(pages);
|
|
37
42
|
@import "../pages/job-builder.css" layer(pages);
|
|
38
43
|
@import "../pages/agent-builder.css" layer(pages);
|
|
39
44
|
@import "../pages/lifecycle.css" layer(pages);
|
|
40
|
-
@import "../pages/detail.css" layer(pages);
|
|
41
45
|
@import "../pages/interview-builder.css" layer(pages);
|
|
42
46
|
@import "../pages/self-assessment.css" layer(pages);
|
|
43
47
|
@import "../pages/assessment-results.css" layer(pages);
|
|
@@ -8,36 +8,36 @@
|
|
|
8
8
|
/* Layer order declaration - must be first */
|
|
9
9
|
@layer tokens, reset, base, components, utilities, pages, slides, handout, print;
|
|
10
10
|
|
|
11
|
-
/* Foundation */
|
|
12
|
-
@import "
|
|
13
|
-
@import "
|
|
14
|
-
@import "
|
|
15
|
-
|
|
16
|
-
/* Components */
|
|
17
|
-
@import "
|
|
18
|
-
@import "
|
|
19
|
-
@import "
|
|
20
|
-
@import "
|
|
21
|
-
@import "
|
|
22
|
-
@import "
|
|
23
|
-
@import "
|
|
24
|
-
@import "
|
|
25
|
-
@import "
|
|
26
|
-
|
|
27
|
-
/* Utilities */
|
|
28
|
-
@import "
|
|
29
|
-
|
|
30
|
-
/* Pages (
|
|
31
|
-
@import "
|
|
32
|
-
|
|
33
|
-
/* Slide views */
|
|
34
|
-
@import "
|
|
35
|
-
@import "
|
|
36
|
-
@import "
|
|
37
|
-
@import "
|
|
38
|
-
|
|
39
|
-
/* Handout overrides */
|
|
40
|
-
@import "
|
|
41
|
-
|
|
42
|
-
/* Print */
|
|
43
|
-
@import "
|
|
11
|
+
/* Foundation (from libui) */
|
|
12
|
+
@import "/ui/css/tokens.css" layer(tokens);
|
|
13
|
+
@import "/ui/css/reset.css" layer(reset);
|
|
14
|
+
@import "/ui/css/base.css" layer(base);
|
|
15
|
+
|
|
16
|
+
/* Components (from libui) */
|
|
17
|
+
@import "/ui/css/components/layout.css" layer(components);
|
|
18
|
+
@import "/ui/css/components/surfaces.css" layer(components);
|
|
19
|
+
@import "/ui/css/components/typography.css" layer(components);
|
|
20
|
+
@import "/ui/css/components/badges.css" layer(components);
|
|
21
|
+
@import "/ui/css/components/buttons.css" layer(components);
|
|
22
|
+
@import "/ui/css/components/forms.css" layer(components);
|
|
23
|
+
@import "/ui/css/components/tables.css" layer(components);
|
|
24
|
+
@import "/ui/css/components/progress.css" layer(components);
|
|
25
|
+
@import "/ui/css/components/states.css" layer(components);
|
|
26
|
+
|
|
27
|
+
/* Utilities (from libui) */
|
|
28
|
+
@import "/ui/css/components/utilities.css" layer(utilities);
|
|
29
|
+
|
|
30
|
+
/* Pages (from libui) */
|
|
31
|
+
@import "/ui/css/pages/detail.css" layer(pages);
|
|
32
|
+
|
|
33
|
+
/* Slide views (from libui) */
|
|
34
|
+
@import "/ui/css/views/slide-animations.css" layer(slides);
|
|
35
|
+
@import "/ui/css/views/slide-base.css" layer(slides);
|
|
36
|
+
@import "/ui/css/views/slide-sections.css" layer(slides);
|
|
37
|
+
@import "/ui/css/views/slide-tables.css" layer(slides);
|
|
38
|
+
|
|
39
|
+
/* Handout overrides (from libui) */
|
|
40
|
+
@import "/ui/css/views/handout.css" layer(handout);
|
|
41
|
+
|
|
42
|
+
/* Print (from libui) */
|
|
43
|
+
@import "/ui/css/views/print.css" layer(print);
|
|
@@ -8,33 +8,33 @@
|
|
|
8
8
|
/* Layer order declaration - must be first */
|
|
9
9
|
@layer tokens, reset, base, components, utilities, pages, slides, print;
|
|
10
10
|
|
|
11
|
-
/* Foundation */
|
|
12
|
-
@import "
|
|
13
|
-
@import "
|
|
14
|
-
@import "
|
|
11
|
+
/* Foundation (from libui) */
|
|
12
|
+
@import "/ui/css/tokens.css" layer(tokens);
|
|
13
|
+
@import "/ui/css/reset.css" layer(reset);
|
|
14
|
+
@import "/ui/css/base.css" layer(base);
|
|
15
15
|
|
|
16
|
-
/* Components */
|
|
17
|
-
@import "
|
|
18
|
-
@import "
|
|
19
|
-
@import "
|
|
20
|
-
@import "
|
|
21
|
-
@import "
|
|
22
|
-
@import "
|
|
23
|
-
@import "
|
|
24
|
-
@import "
|
|
25
|
-
@import "
|
|
16
|
+
/* Components (from libui) */
|
|
17
|
+
@import "/ui/css/components/layout.css" layer(components);
|
|
18
|
+
@import "/ui/css/components/surfaces.css" layer(components);
|
|
19
|
+
@import "/ui/css/components/typography.css" layer(components);
|
|
20
|
+
@import "/ui/css/components/badges.css" layer(components);
|
|
21
|
+
@import "/ui/css/components/buttons.css" layer(components);
|
|
22
|
+
@import "/ui/css/components/forms.css" layer(components);
|
|
23
|
+
@import "/ui/css/components/tables.css" layer(components);
|
|
24
|
+
@import "/ui/css/components/progress.css" layer(components);
|
|
25
|
+
@import "/ui/css/components/states.css" layer(components);
|
|
26
26
|
|
|
27
|
-
/* Utilities */
|
|
28
|
-
@import "
|
|
27
|
+
/* Utilities (from libui) */
|
|
28
|
+
@import "/ui/css/components/utilities.css" layer(utilities);
|
|
29
29
|
|
|
30
|
-
/* Pages (
|
|
31
|
-
@import "
|
|
30
|
+
/* Pages (from libui) */
|
|
31
|
+
@import "/ui/css/pages/detail.css" layer(pages);
|
|
32
32
|
|
|
33
|
-
/* Slide views */
|
|
34
|
-
@import "
|
|
35
|
-
@import "
|
|
36
|
-
@import "
|
|
37
|
-
@import "
|
|
33
|
+
/* Slide views (from libui) */
|
|
34
|
+
@import "/ui/css/views/slide-animations.css" layer(slides);
|
|
35
|
+
@import "/ui/css/views/slide-base.css" layer(slides);
|
|
36
|
+
@import "/ui/css/views/slide-sections.css" layer(slides);
|
|
37
|
+
@import "/ui/css/views/slide-tables.css" layer(slides);
|
|
38
38
|
|
|
39
|
-
/* Print */
|
|
40
|
-
@import "
|
|
39
|
+
/* Print (from libui) */
|
|
40
|
+
@import "/ui/css/views/print.css" layer(print);
|
|
@@ -35,16 +35,31 @@ export function disciplineListToMarkdown(disciplines) {
|
|
|
35
35
|
* @param {Object} context - Additional context
|
|
36
36
|
* @param {Array} context.skills - All skills
|
|
37
37
|
* @param {Array} context.behaviours - All behaviours
|
|
38
|
+
* @param {Array} [context.tracks] - All tracks (for showing valid track names)
|
|
38
39
|
* @param {boolean} [context.showBehaviourModifiers=true] - Whether to show behaviour modifiers section
|
|
39
40
|
* @returns {string}
|
|
40
41
|
*/
|
|
41
42
|
export function disciplineToMarkdown(
|
|
42
43
|
discipline,
|
|
43
|
-
{ skills, behaviours, showBehaviourModifiers = true } = {},
|
|
44
|
+
{ skills, behaviours, tracks, showBehaviourModifiers = true } = {},
|
|
44
45
|
) {
|
|
45
46
|
const view = prepareDisciplineDetail(discipline, { skills, behaviours });
|
|
47
|
+
const type = discipline.isProfessional ? "Professional" : "Management";
|
|
46
48
|
const lines = [`# 📋 ${view.name}`, "", view.description, ""];
|
|
47
49
|
|
|
50
|
+
// Type and valid tracks
|
|
51
|
+
const validTracks = (discipline.validTracks || []).filter((t) => t !== null);
|
|
52
|
+
if (validTracks.length > 0) {
|
|
53
|
+
const trackNames = validTracks.map((tid) => {
|
|
54
|
+
const track = tracks?.find((t) => t.id === tid);
|
|
55
|
+
return track ? track.name : tid;
|
|
56
|
+
});
|
|
57
|
+
lines.push(`**Type:** ${type} `);
|
|
58
|
+
lines.push(`**Valid Tracks:** ${trackNames.join(", ")}`, "");
|
|
59
|
+
} else {
|
|
60
|
+
lines.push(`**Type:** ${type}`, "");
|
|
61
|
+
}
|
|
62
|
+
|
|
48
63
|
// Core skills
|
|
49
64
|
if (view.coreSkills.length > 0) {
|
|
50
65
|
lines.push("## Core Skills", "");
|
|
@@ -8,13 +8,13 @@ import {
|
|
|
8
8
|
isValidJobCombination,
|
|
9
9
|
generateJobTitle,
|
|
10
10
|
getDisciplineSkillIds,
|
|
11
|
-
} from "@forwardimpact/
|
|
11
|
+
} from "@forwardimpact/libskill/derivation";
|
|
12
12
|
import {
|
|
13
13
|
deriveMissionFitInterview,
|
|
14
14
|
deriveDecompositionInterview,
|
|
15
15
|
deriveStakeholderInterview,
|
|
16
|
-
} from "@forwardimpact/
|
|
17
|
-
import { getOrCreateJob } from "@forwardimpact/
|
|
16
|
+
} from "@forwardimpact/libskill/interview";
|
|
17
|
+
import { getOrCreateJob } from "@forwardimpact/libskill/job-cache";
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* Interview type configurations
|
|
@@ -85,7 +85,7 @@ function prepareJobDescriptionData({ job, discipline, level, track }) {
|
|
|
85
85
|
let capabilitySkills = [];
|
|
86
86
|
const derivedResponsibilities = job.derivedResponsibilities || [];
|
|
87
87
|
if (derivedResponsibilities.length > 0) {
|
|
88
|
-
// derivedResponsibilities is sorted: highest proficiency first, then by
|
|
88
|
+
// derivedResponsibilities is sorted: highest proficiency first, then by skill count
|
|
89
89
|
const highestProficiency = derivedResponsibilities[0].proficiency;
|
|
90
90
|
|
|
91
91
|
// Filter responsibilities to only the highest proficiency
|
|
@@ -103,7 +103,7 @@ function prepareJobDescriptionData({ job, discipline, level, track }) {
|
|
|
103
103
|
skillsByCapability[skill.capability].push(skill);
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
-
// Build capability sections in
|
|
106
|
+
// Build capability sections in skill count order
|
|
107
107
|
capabilitySkills = topResponsibilities
|
|
108
108
|
.filter((r) => skillsByCapability[r.capability]?.length > 0)
|
|
109
109
|
.map((r) => {
|
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
import {
|
|
8
8
|
isValidJobCombination,
|
|
9
9
|
generateJobTitle,
|
|
10
|
-
} from "@forwardimpact/
|
|
10
|
+
} from "@forwardimpact/libskill/derivation";
|
|
11
11
|
import {
|
|
12
12
|
analyzeProgression,
|
|
13
13
|
analyzeCustomProgression,
|
|
14
14
|
getNextLevel,
|
|
15
|
-
} from "@forwardimpact/
|
|
16
|
-
import { getOrCreateJob } from "@forwardimpact/
|
|
15
|
+
} from "@forwardimpact/libskill/progression";
|
|
16
|
+
import { getOrCreateJob } from "@forwardimpact/libskill/job-cache";
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* Get the next level for progression
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
groupSkillsByCapability,
|
|
9
9
|
getCapabilityEmoji,
|
|
10
10
|
} from "@forwardimpact/map/levels";
|
|
11
|
-
import { getSkillTypeForDiscipline } from "@forwardimpact/
|
|
11
|
+
import { getSkillTypeForDiscipline } from "@forwardimpact/libskill/derivation";
|
|
12
12
|
import { truncate } from "../shared.js";
|
|
13
13
|
|
|
14
14
|
/**
|
|
@@ -44,6 +44,20 @@ export function trackToMarkdown(
|
|
|
44
44
|
const emoji = framework ? getConceptEmoji(framework, "track") : "🛤️";
|
|
45
45
|
const lines = [`# ${emoji} ${view.name}`, "", view.description, ""];
|
|
46
46
|
|
|
47
|
+
// Show which disciplines use this track
|
|
48
|
+
if (disciplines) {
|
|
49
|
+
const usedBy = disciplines.filter(
|
|
50
|
+
(d) => d.validTracks && d.validTracks.includes(track.id),
|
|
51
|
+
);
|
|
52
|
+
if (usedBy.length > 0) {
|
|
53
|
+
const names = usedBy.map(
|
|
54
|
+
(d) =>
|
|
55
|
+
`${d.specialization || d.id} (${d.isProfessional ? "professional" : "management"})`,
|
|
56
|
+
);
|
|
57
|
+
lines.push(`**Used by:** ${names.join(", ")}`, "");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
47
61
|
// Skill modifiers - show expanded skills for capabilities
|
|
48
62
|
if (view.skillModifiers.length > 0) {
|
|
49
63
|
lines.push("## Skill Modifiers", "");
|
package/src/handout.html
CHANGED
|
@@ -13,19 +13,38 @@
|
|
|
13
13
|
"@forwardimpact/map/levels": "/map/lib/levels.js",
|
|
14
14
|
"@forwardimpact/map/loader": "/map/lib/loader.js",
|
|
15
15
|
"@forwardimpact/map/validation": "/map/lib/validation.js",
|
|
16
|
-
"@forwardimpact/
|
|
17
|
-
"@forwardimpact/
|
|
18
|
-
"@forwardimpact/
|
|
19
|
-
"@forwardimpact/
|
|
20
|
-
"@forwardimpact/
|
|
21
|
-
"@forwardimpact/
|
|
22
|
-
"@forwardimpact/
|
|
23
|
-
"@forwardimpact/
|
|
24
|
-
"@forwardimpact/
|
|
25
|
-
"@forwardimpact/
|
|
26
|
-
"@forwardimpact/
|
|
27
|
-
"@forwardimpact/
|
|
28
|
-
"@forwardimpact/
|
|
16
|
+
"@forwardimpact/libskill": "/model/lib/index.js",
|
|
17
|
+
"@forwardimpact/libskill/derivation": "/model/lib/derivation.js",
|
|
18
|
+
"@forwardimpact/libskill/modifiers": "/model/lib/modifiers.js",
|
|
19
|
+
"@forwardimpact/libskill/agent": "/model/lib/agent.js",
|
|
20
|
+
"@forwardimpact/libskill/interview": "/model/lib/interview.js",
|
|
21
|
+
"@forwardimpact/libskill/job": "/model/lib/job.js",
|
|
22
|
+
"@forwardimpact/libskill/job-cache": "/model/lib/job-cache.js",
|
|
23
|
+
"@forwardimpact/libskill/checklist": "/model/lib/checklist.js",
|
|
24
|
+
"@forwardimpact/libskill/matching": "/model/lib/matching.js",
|
|
25
|
+
"@forwardimpact/libskill/profile": "/model/lib/profile.js",
|
|
26
|
+
"@forwardimpact/libskill/progression": "/model/lib/progression.js",
|
|
27
|
+
"@forwardimpact/libskill/policies": "/model/lib/policies/index.js",
|
|
28
|
+
"@forwardimpact/libskill/toolkit": "/model/lib/toolkit.js",
|
|
29
|
+
"@forwardimpact/libui": "/ui/lib/index.js",
|
|
30
|
+
"@forwardimpact/libui/render": "/ui/lib/render.js",
|
|
31
|
+
"@forwardimpact/libui/reactive": "/ui/lib/reactive.js",
|
|
32
|
+
"@forwardimpact/libui/state": "/ui/lib/state.js",
|
|
33
|
+
"@forwardimpact/libui/errors": "/ui/lib/errors.js",
|
|
34
|
+
"@forwardimpact/libui/error-boundary": "/ui/lib/error-boundary.js",
|
|
35
|
+
"@forwardimpact/libui/router-core": "/ui/lib/router-core.js",
|
|
36
|
+
"@forwardimpact/libui/router-pages": "/ui/lib/router-pages.js",
|
|
37
|
+
"@forwardimpact/libui/router-slides": "/ui/lib/router-slides.js",
|
|
38
|
+
"@forwardimpact/libui/yaml-loader": "/ui/lib/yaml-loader.js",
|
|
39
|
+
"@forwardimpact/libui/markdown": "/ui/lib/markdown.js",
|
|
40
|
+
"@forwardimpact/libui/utils": "/ui/lib/utils.js",
|
|
41
|
+
"@forwardimpact/libui/components": "/ui/lib/components/index.js",
|
|
42
|
+
"@forwardimpact/libui/components/card": "/ui/lib/components/card.js",
|
|
43
|
+
"@forwardimpact/libui/components/grid": "/ui/lib/components/grid.js",
|
|
44
|
+
"@forwardimpact/libui/components/list": "/ui/lib/components/list.js",
|
|
45
|
+
"@forwardimpact/libui/components/detail": "/ui/lib/components/detail.js",
|
|
46
|
+
"@forwardimpact/libui/components/nav": "/ui/lib/components/nav.js",
|
|
47
|
+
"@forwardimpact/libui/components/error-page": "/ui/lib/components/error-page.js"
|
|
29
48
|
}
|
|
30
49
|
}
|
|
31
50
|
</script>
|
package/src/index.html
CHANGED
|
@@ -25,19 +25,38 @@
|
|
|
25
25
|
"@forwardimpact/map/levels": "/map/lib/levels.js",
|
|
26
26
|
"@forwardimpact/map/loader": "/map/lib/loader.js",
|
|
27
27
|
"@forwardimpact/map/validation": "/map/lib/validation.js",
|
|
28
|
-
"@forwardimpact/
|
|
29
|
-
"@forwardimpact/
|
|
30
|
-
"@forwardimpact/
|
|
31
|
-
"@forwardimpact/
|
|
32
|
-
"@forwardimpact/
|
|
33
|
-
"@forwardimpact/
|
|
34
|
-
"@forwardimpact/
|
|
35
|
-
"@forwardimpact/
|
|
36
|
-
"@forwardimpact/
|
|
37
|
-
"@forwardimpact/
|
|
38
|
-
"@forwardimpact/
|
|
39
|
-
"@forwardimpact/
|
|
40
|
-
"@forwardimpact/
|
|
28
|
+
"@forwardimpact/libskill": "/model/lib/index.js",
|
|
29
|
+
"@forwardimpact/libskill/derivation": "/model/lib/derivation.js",
|
|
30
|
+
"@forwardimpact/libskill/modifiers": "/model/lib/modifiers.js",
|
|
31
|
+
"@forwardimpact/libskill/agent": "/model/lib/agent.js",
|
|
32
|
+
"@forwardimpact/libskill/interview": "/model/lib/interview.js",
|
|
33
|
+
"@forwardimpact/libskill/job": "/model/lib/job.js",
|
|
34
|
+
"@forwardimpact/libskill/job-cache": "/model/lib/job-cache.js",
|
|
35
|
+
"@forwardimpact/libskill/checklist": "/model/lib/checklist.js",
|
|
36
|
+
"@forwardimpact/libskill/matching": "/model/lib/matching.js",
|
|
37
|
+
"@forwardimpact/libskill/profile": "/model/lib/profile.js",
|
|
38
|
+
"@forwardimpact/libskill/progression": "/model/lib/progression.js",
|
|
39
|
+
"@forwardimpact/libskill/policies": "/model/lib/policies/index.js",
|
|
40
|
+
"@forwardimpact/libskill/toolkit": "/model/lib/toolkit.js",
|
|
41
|
+
"@forwardimpact/libui": "/ui/lib/index.js",
|
|
42
|
+
"@forwardimpact/libui/render": "/ui/lib/render.js",
|
|
43
|
+
"@forwardimpact/libui/reactive": "/ui/lib/reactive.js",
|
|
44
|
+
"@forwardimpact/libui/state": "/ui/lib/state.js",
|
|
45
|
+
"@forwardimpact/libui/errors": "/ui/lib/errors.js",
|
|
46
|
+
"@forwardimpact/libui/error-boundary": "/ui/lib/error-boundary.js",
|
|
47
|
+
"@forwardimpact/libui/router-core": "/ui/lib/router-core.js",
|
|
48
|
+
"@forwardimpact/libui/router-pages": "/ui/lib/router-pages.js",
|
|
49
|
+
"@forwardimpact/libui/router-slides": "/ui/lib/router-slides.js",
|
|
50
|
+
"@forwardimpact/libui/yaml-loader": "/ui/lib/yaml-loader.js",
|
|
51
|
+
"@forwardimpact/libui/markdown": "/ui/lib/markdown.js",
|
|
52
|
+
"@forwardimpact/libui/utils": "/ui/lib/utils.js",
|
|
53
|
+
"@forwardimpact/libui/components": "/ui/lib/components/index.js",
|
|
54
|
+
"@forwardimpact/libui/components/card": "/ui/lib/components/card.js",
|
|
55
|
+
"@forwardimpact/libui/components/grid": "/ui/lib/components/grid.js",
|
|
56
|
+
"@forwardimpact/libui/components/list": "/ui/lib/components/list.js",
|
|
57
|
+
"@forwardimpact/libui/components/detail": "/ui/lib/components/detail.js",
|
|
58
|
+
"@forwardimpact/libui/components/nav": "/ui/lib/components/nav.js",
|
|
59
|
+
"@forwardimpact/libui/components/error-page": "/ui/lib/components/error-page.js"
|
|
41
60
|
}
|
|
42
61
|
}
|
|
43
62
|
</script>
|