@teambit/lanes.ui.inputs.lane-selector 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.
- package/dist/index.d.ts +3 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/lane-grouped-menu-item.d.ts +8 -0
- package/dist/lane-grouped-menu-item.js +36 -0
- package/dist/lane-grouped-menu-item.js.map +1 -0
- package/dist/lane-grouped-menu-item.module.scss +10 -0
- package/dist/lane-menu-item.d.ts +7 -0
- package/dist/lane-menu-item.js +60 -0
- package/dist/lane-menu-item.js.map +1 -0
- package/dist/lane-menu-item.module.scss +14 -0
- package/dist/lane-placeholder.d.ts +8 -0
- package/dist/lane-placeholder.js +35 -0
- package/dist/lane-placeholder.js.map +1 -0
- package/dist/lane-placeholder.module.scss +23 -0
- package/dist/lane-search.d.ts +6 -0
- package/dist/lane-search.js +43 -0
- package/dist/lane-search.js.map +1 -0
- package/dist/lane-search.module.scss +8 -0
- package/dist/lane-selector.d.ts +8 -0
- package/dist/lane-selector.js +84 -0
- package/dist/lane-selector.js.map +1 -0
- package/dist/lane-selector.module.scss +26 -0
- package/dist/tsconfig.json +32 -0
- package/index.ts +3 -0
- package/lane-grouped-menu-item.module.scss +10 -0
- package/lane-grouped-menu-item.tsx +34 -0
- package/lane-menu-item.module.scss +14 -0
- package/lane-menu-item.tsx +38 -0
- package/lane-placeholder.module.scss +23 -0
- package/lane-placeholder.tsx +34 -0
- package/lane-search.module.scss +8 -0
- package/lane-search.tsx +31 -0
- package/lane-selector.module.scss +26 -0
- package/lane-selector.tsx +79 -0
- package/package-tar/teambit-lanes.ui.inputs.lane-selector-0.0.1.tgz +0 -0
- package/package.json +56 -0
- package/preview-1664735485436.js +7 -0
- package/tsconfig.json +32 -0
- package/types/asset.d.ts +29 -0
- package/types/style.d.ts +42 -0
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LanePlaceholder = exports.LaneMenuItem = exports.LaneSelector = void 0;
|
|
4
|
+
var lane_selector_1 = require("./lane-selector");
|
|
5
|
+
Object.defineProperty(exports, "LaneSelector", { enumerable: true, get: function () { return lane_selector_1.LaneSelector; } });
|
|
6
|
+
var lane_menu_item_1 = require("./lane-menu-item");
|
|
7
|
+
Object.defineProperty(exports, "LaneMenuItem", { enumerable: true, get: function () { return lane_menu_item_1.LaneMenuItem; } });
|
|
8
|
+
var lane_placeholder_1 = require("./lane-placeholder");
|
|
9
|
+
Object.defineProperty(exports, "LanePlaceholder", { enumerable: true, get: function () { return lane_placeholder_1.LanePlaceholder; } });
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;AAAA,iDAAkE;AAAzD,6GAAA,YAAY,OAAA;AACrB,mDAAmE;AAA1D,8GAAA,YAAY,OAAA;AACrB,uDAA2E;AAAlE,mHAAA,eAAe,OAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { HTMLAttributes } from 'react';
|
|
2
|
+
import { LaneId } from '@teambit/lane-id';
|
|
3
|
+
export declare type LaneGroupedMenuItemProps = {
|
|
4
|
+
selected?: LaneId;
|
|
5
|
+
current: LaneId[];
|
|
6
|
+
scope: string;
|
|
7
|
+
} & HTMLAttributes<HTMLDivElement>;
|
|
8
|
+
export declare function LaneGroupedMenuItem({ selected, current, className, scope, ...rest }: LaneGroupedMenuItemProps): JSX.Element;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.LaneGroupedMenuItem = void 0;
|
|
18
|
+
const react_1 = __importDefault(require("react"));
|
|
19
|
+
const classnames_1 = __importDefault(require("classnames"));
|
|
20
|
+
const lane_menu_item_1 = require("./lane-menu-item");
|
|
21
|
+
const lane_grouped_menu_item_module_scss_1 = __importDefault(require("./lane-grouped-menu-item.module.scss"));
|
|
22
|
+
function LaneGroupedMenuItem(_a) {
|
|
23
|
+
var { selected, current, className, scope } = _a, rest = __rest(_a, ["selected", "current", "className", "scope"]);
|
|
24
|
+
if (current.length === 0)
|
|
25
|
+
return null;
|
|
26
|
+
if (current[0].isDefault()) {
|
|
27
|
+
const defaultLane = current[0];
|
|
28
|
+
return react_1.default.createElement(lane_menu_item_1.LaneMenuItem, { key: defaultLane.toString(), selected: selected, current: defaultLane });
|
|
29
|
+
}
|
|
30
|
+
const onClickStopPropagation = (e) => e.stopPropagation();
|
|
31
|
+
return (react_1.default.createElement("div", Object.assign({ className: (0, classnames_1.default)(lane_grouped_menu_item_module_scss_1.default.groupedMenuItem, className) }, rest),
|
|
32
|
+
react_1.default.createElement("div", { onClick: onClickStopPropagation, className: lane_grouped_menu_item_module_scss_1.default.scope }, scope),
|
|
33
|
+
current.map((lane) => (react_1.default.createElement(lane_menu_item_1.LaneMenuItem, { key: lane.toString(), selected: selected, current: lane })))));
|
|
34
|
+
}
|
|
35
|
+
exports.LaneGroupedMenuItem = LaneGroupedMenuItem;
|
|
36
|
+
//# sourceMappingURL=lane-grouped-menu-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lane-grouped-menu-item.js","sourceRoot":"","sources":["../lane-grouped-menu-item.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,kDAA8C;AAE9C,4DAAoC;AACpC,qDAAgD;AAEhD,8GAA0D;AAQ1D,SAAgB,mBAAmB,CAAC,EAA0E;QAA1E,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,OAAqC,EAAhC,IAAI,cAA9C,6CAAgD,CAAF;IAChF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE;QAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAW,CAAC;QACzC,OAAO,8BAAC,6BAAY,IAAC,GAAG,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,GAAI,CAAC;KAChG;IAED,MAAM,sBAAsB,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;IAE1D,OAAO,CACL,qDAAK,SAAS,EAAE,IAAA,oBAAU,EAAC,4CAAM,CAAC,eAAe,EAAE,SAAS,CAAC,IAAM,IAAI;QACrE,uCAAK,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,4CAAM,CAAC,KAAK,IAC1D,KAAK,CACF;QACL,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACrB,8BAAC,6BAAY,IAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,GAAI,CAC1E,CAAC,CACE,CACP,CAAC;AACJ,CAAC;AApBD,kDAoBC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { HTMLAttributes } from 'react';
|
|
2
|
+
import { LaneId } from '@teambit/lane-id';
|
|
3
|
+
export declare type LaneMenuItemProps = {
|
|
4
|
+
selected?: LaneId;
|
|
5
|
+
current: LaneId;
|
|
6
|
+
} & HTMLAttributes<HTMLDivElement>;
|
|
7
|
+
export declare function LaneMenuItem({ selected, current, className, ...rest }: LaneMenuItemProps): JSX.Element;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
22
|
+
var t = {};
|
|
23
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
24
|
+
t[p] = s[p];
|
|
25
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
26
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
27
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
28
|
+
t[p[i]] = s[p[i]];
|
|
29
|
+
}
|
|
30
|
+
return t;
|
|
31
|
+
};
|
|
32
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
33
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
34
|
+
};
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.LaneMenuItem = void 0;
|
|
37
|
+
const react_1 = __importStar(require("react"));
|
|
38
|
+
const lanes_ui_models_lanes_model_1 = require("@teambit/lanes.ui.models.lanes-model");
|
|
39
|
+
const design_ui_pill_label_1 = require("@teambit/design.ui.pill-label");
|
|
40
|
+
const design_ui_surfaces_menu_link_item_1 = require("@teambit/design.ui.surfaces.menu.link-item");
|
|
41
|
+
const lane_menu_item_module_scss_1 = __importDefault(require("./lane-menu-item.module.scss"));
|
|
42
|
+
function LaneMenuItem(_a) {
|
|
43
|
+
var { selected, current, className } = _a, rest = __rest(_a, ["selected", "current", "className"]);
|
|
44
|
+
const isCurrent = (selected === null || selected === void 0 ? void 0 : selected.toString()) === current.toString();
|
|
45
|
+
const currentVersionRef = (0, react_1.useRef)(null);
|
|
46
|
+
(0, react_1.useEffect)(() => {
|
|
47
|
+
var _a;
|
|
48
|
+
if (isCurrent) {
|
|
49
|
+
(_a = currentVersionRef.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
|
|
50
|
+
}
|
|
51
|
+
}, [isCurrent]);
|
|
52
|
+
const href = lanes_ui_models_lanes_model_1.LanesModel.getLaneUrl(current);
|
|
53
|
+
return (react_1.default.createElement("div", Object.assign({}, rest, { className: className, ref: currentVersionRef }),
|
|
54
|
+
react_1.default.createElement(design_ui_surfaces_menu_link_item_1.MenuLinkItem, { active: isCurrent, href: href, className: lane_menu_item_module_scss_1.default.menuItem },
|
|
55
|
+
react_1.default.createElement("div", { className: lane_menu_item_module_scss_1.default.laneName }, current.name),
|
|
56
|
+
current.isDefault() && (react_1.default.createElement(design_ui_pill_label_1.PillLabel, { className: lane_menu_item_module_scss_1.default.defaultLanePill },
|
|
57
|
+
react_1.default.createElement("span", null, "default"))))));
|
|
58
|
+
}
|
|
59
|
+
exports.LaneMenuItem = LaneMenuItem;
|
|
60
|
+
//# sourceMappingURL=lane-menu-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lane-menu-item.js","sourceRoot":"","sources":["../lane-menu-item.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiE;AAEjE,sFAAkE;AAClE,wEAA0D;AAC1D,kGAA0E;AAE1E,8FAAkD;AAOlD,SAAgB,YAAY,CAAC,EAA4D;QAA5D,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,OAA8B,EAAzB,IAAI,cAAvC,oCAAyC,CAAF;IAClE,MAAM,SAAS,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,QAAQ,EAAE,MAAK,OAAO,CAAC,QAAQ,EAAE,CAAC;IAE9D,MAAM,iBAAiB,GAAG,IAAA,cAAM,EAAiB,IAAI,CAAC,CAAC;IACvD,IAAA,iBAAS,EAAC,GAAG,EAAE;;QACb,IAAI,SAAS,EAAE;YACb,MAAA,iBAAiB,CAAC,OAAO,0CAAE,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;SACrF;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,IAAI,GAAG,wCAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAE5C,OAAO,CACL,uDAAS,IAAI,IAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,iBAAiB;QACzD,8BAAC,gDAAY,IAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,oCAAM,CAAC,QAAQ;YACrE,uCAAK,SAAS,EAAE,oCAAM,CAAC,QAAQ,IAAG,OAAO,CAAC,IAAI,CAAO;YACpD,OAAO,CAAC,SAAS,EAAE,IAAI,CACtB,8BAAC,gCAAS,IAAC,SAAS,EAAE,oCAAM,CAAC,eAAe;gBAC1C,sDAAoB,CACV,CACb,CACY,CACX,CACP,CAAC;AACJ,CAAC;AAxBD,oCAwBC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
.menuItem {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: row;
|
|
4
|
+
padding: 8px 16px;
|
|
5
|
+
min-width: 120px;
|
|
6
|
+
cursor: pointer;
|
|
7
|
+
justify-content: space-between;
|
|
8
|
+
border-bottom: 1px solid var(--bit-border-color-lightest, #ededed);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.defaultLanePill {
|
|
12
|
+
font-size: var(--bit-p-xxs, 12px);
|
|
13
|
+
text-transform: lowercase;
|
|
14
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { HTMLAttributes } from 'react';
|
|
2
|
+
import { LaneId } from '@teambit/lane-id';
|
|
3
|
+
export declare type LanePlaceholderProps = {
|
|
4
|
+
selectedLaneId?: LaneId;
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
showScope?: boolean;
|
|
7
|
+
} & HTMLAttributes<HTMLDivElement>;
|
|
8
|
+
export declare function LanePlaceholder({ selectedLaneId, disabled, className, showScope, ...rest }: LanePlaceholderProps): JSX.Element;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.LanePlaceholder = void 0;
|
|
18
|
+
const react_1 = __importDefault(require("react"));
|
|
19
|
+
const evangelist_elements_icon_1 = require("@teambit/evangelist.elements.icon");
|
|
20
|
+
const lanes_ui_icons_lane_icon_1 = require("@teambit/lanes.ui.icons.lane-icon");
|
|
21
|
+
const classnames_1 = __importDefault(require("classnames"));
|
|
22
|
+
const design_ui_styles_ellipsis_1 = require("@teambit/design.ui.styles.ellipsis");
|
|
23
|
+
const lane_placeholder_module_scss_1 = __importDefault(require("./lane-placeholder.module.scss"));
|
|
24
|
+
function LanePlaceholder(_a) {
|
|
25
|
+
var { selectedLaneId, disabled, className, showScope = true } = _a, rest = __rest(_a, ["selectedLaneId", "disabled", "className", "showScope"]);
|
|
26
|
+
const laneIdStr = (selectedLaneId === null || selectedLaneId === void 0 ? void 0 : selectedLaneId.isDefault())
|
|
27
|
+
? selectedLaneId.name
|
|
28
|
+
: (showScope && (selectedLaneId === null || selectedLaneId === void 0 ? void 0 : selectedLaneId.toString())) || (selectedLaneId === null || selectedLaneId === void 0 ? void 0 : selectedLaneId.name);
|
|
29
|
+
return (react_1.default.createElement("div", Object.assign({}, rest, { className: (0, classnames_1.default)(lane_placeholder_module_scss_1.default.placeholder, className, disabled && lane_placeholder_module_scss_1.default.disabled) }),
|
|
30
|
+
react_1.default.createElement(lanes_ui_icons_lane_icon_1.LaneIcon, { className: lane_placeholder_module_scss_1.default.icon }),
|
|
31
|
+
react_1.default.createElement(design_ui_styles_ellipsis_1.Ellipsis, { className: lane_placeholder_module_scss_1.default.placeholderText }, laneIdStr),
|
|
32
|
+
!disabled && react_1.default.createElement(evangelist_elements_icon_1.Icon, { of: "fat-arrow-down" })));
|
|
33
|
+
}
|
|
34
|
+
exports.LanePlaceholder = LanePlaceholder;
|
|
35
|
+
//# sourceMappingURL=lane-placeholder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lane-placeholder.js","sourceRoot":"","sources":["../lane-placeholder.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,kDAA8C;AAC9C,gFAAyD;AACzD,gFAA6D;AAE7D,4DAAoC;AACpC,kFAA8D;AAE9D,kGAAoD;AAQpD,SAAgB,eAAe,CAAC,EAMT;QANS,EAC9B,cAAc,EACd,QAAQ,EACR,SAAS,EACT,SAAS,GAAG,IAAI,OAEK,EADlB,IAAI,cALuB,wDAM/B,CADQ;IAEP,MAAM,SAAS,GAAG,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,SAAS,EAAE;QAC3C,CAAC,CAAC,cAAc,CAAC,IAAI;QACrB,CAAC,CAAC,CAAC,SAAS,KAAI,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,QAAQ,EAAE,CAAA,CAAC,KAAI,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,CAAA,CAAC;IAEtE,OAAO,CACL,uDAAS,IAAI,IAAE,SAAS,EAAE,IAAA,oBAAU,EAAC,sCAAM,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,IAAI,sCAAM,CAAC,QAAQ,CAAC;QAC9F,8BAAC,mCAAQ,IAAC,SAAS,EAAE,sCAAM,CAAC,IAAI,GAAI;QACpC,8BAAC,oCAAQ,IAAC,SAAS,EAAE,sCAAM,CAAC,eAAe,IAAG,SAAS,CAAY;QAClE,CAAC,QAAQ,IAAI,8BAAC,+BAAI,IAAC,EAAE,EAAC,gBAAgB,GAAG,CACtC,CACP,CAAC;AACJ,CAAC;AAlBD,0CAkBC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
.placeholder {
|
|
2
|
+
display: flex;
|
|
3
|
+
align-items: center;
|
|
4
|
+
padding: 4px 8px 4px 4px;
|
|
5
|
+
line-height: var(--bit-p-md, 16px);
|
|
6
|
+
font-size: var(--bit-p-md, 16px);
|
|
7
|
+
border-radius: 6px;
|
|
8
|
+
border: 1px solid var(--bit-border-color-light, #cccfd4);
|
|
9
|
+
background-color: var(--bit-border-color-lightest, #ededed);
|
|
10
|
+
&.disabled {
|
|
11
|
+
border: unset;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.placeholderText {
|
|
16
|
+
padding: 4px 12px;
|
|
17
|
+
font-size: var(--bit-p-xs, 14px);
|
|
18
|
+
flex: 1;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.icon {
|
|
22
|
+
padding-left: 8px;
|
|
23
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.LaneSearch = void 0;
|
|
26
|
+
const react_1 = __importStar(require("react"));
|
|
27
|
+
const lane_search_module_scss_1 = __importDefault(require("./lane-search.module.scss"));
|
|
28
|
+
function LaneSearch({ onChange, focus }) {
|
|
29
|
+
const inputRef = (0, react_1.createRef)();
|
|
30
|
+
(0, react_1.useEffect)(() => {
|
|
31
|
+
var _a;
|
|
32
|
+
if (focus)
|
|
33
|
+
(_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
34
|
+
}, [focus]);
|
|
35
|
+
const handleOnClicked = (e) => {
|
|
36
|
+
var _a;
|
|
37
|
+
(_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
38
|
+
e.stopPropagation();
|
|
39
|
+
};
|
|
40
|
+
return (react_1.default.createElement("input", { className: lane_search_module_scss_1.default.search, placeholder: 'Search', onClick: handleOnClicked, ref: inputRef, onChange: onChange }));
|
|
41
|
+
}
|
|
42
|
+
exports.LaneSearch = LaneSearch;
|
|
43
|
+
//# sourceMappingURL=lane-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lane-search.js","sourceRoot":"","sources":["../lane-search.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAwE;AAExE,wFAA+C;AAO/C,SAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAmB;IAC7D,MAAM,QAAQ,GAAG,IAAA,iBAAS,GAAoB,CAAC;IAE/C,IAAA,iBAAS,EAAC,GAAG,EAAE;;QACb,IAAI,KAAK;YAAE,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;IACvC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,eAAe,GAAG,CAAC,CAAC,EAAE,EAAE;;QAC5B,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;QAC1B,CAAC,CAAC,eAAe,EAAE,CAAC;IACtB,CAAC,CAAC;IAEF,OAAO,CACL,yCACE,SAAS,EAAE,iCAAM,CAAC,MAAM,EACxB,WAAW,EAAE,QAAQ,EACrB,OAAO,EAAE,eAAe,EACxB,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,QAAQ,GACX,CACV,CAAC;AACJ,CAAC;AArBD,gCAqBC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { HTMLAttributes } from 'react';
|
|
2
|
+
import { LaneId } from '@teambit/lane-id';
|
|
3
|
+
export declare type LaneSelectorProps = {
|
|
4
|
+
lanes: Array<LaneId>;
|
|
5
|
+
selectedLaneId?: LaneId;
|
|
6
|
+
groupByScope?: boolean;
|
|
7
|
+
} & HTMLAttributes<HTMLDivElement>;
|
|
8
|
+
export declare function LaneSelector({ className, lanes, selectedLaneId, groupByScope, ...rest }: LaneSelectorProps): JSX.Element;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
22
|
+
var t = {};
|
|
23
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
24
|
+
t[p] = s[p];
|
|
25
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
26
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
27
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
28
|
+
t[p[i]] = s[p[i]];
|
|
29
|
+
}
|
|
30
|
+
return t;
|
|
31
|
+
};
|
|
32
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
33
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
34
|
+
};
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.LaneSelector = void 0;
|
|
37
|
+
const react_1 = __importStar(require("react"));
|
|
38
|
+
const classnames_1 = __importDefault(require("classnames"));
|
|
39
|
+
const evangelist_surfaces_dropdown_1 = require("@teambit/evangelist.surfaces.dropdown");
|
|
40
|
+
const lanes_ui_models_lanes_model_1 = require("@teambit/lanes.ui.models.lanes-model");
|
|
41
|
+
const lane_menu_item_1 = require("./lane-menu-item");
|
|
42
|
+
const lane_placeholder_1 = require("./lane-placeholder");
|
|
43
|
+
const lane_grouped_menu_item_1 = require("./lane-grouped-menu-item");
|
|
44
|
+
const lane_search_1 = require("./lane-search");
|
|
45
|
+
const lane_selector_module_scss_1 = __importDefault(require("./lane-selector.module.scss"));
|
|
46
|
+
function LaneSelector(_a) {
|
|
47
|
+
var { className, lanes, selectedLaneId, groupByScope = true } = _a, rest = __rest(_a, ["className", "lanes", "selectedLaneId", "groupByScope"]);
|
|
48
|
+
const [filteredLanes, setFilteredLanes] = (0, react_1.useState)(lanes);
|
|
49
|
+
const [focus, setFocus] = (0, react_1.useState)(false);
|
|
50
|
+
(0, react_1.useEffect)(() => {
|
|
51
|
+
setFilteredLanes(lanes);
|
|
52
|
+
}, [lanes]);
|
|
53
|
+
const multipleLanes = lanes.length > 1;
|
|
54
|
+
const laneDropdownItems = groupByScope
|
|
55
|
+
? Array.from(lanes_ui_models_lanes_model_1.LanesModel.groupByScope(filteredLanes).entries())
|
|
56
|
+
: filteredLanes;
|
|
57
|
+
const handleOnChange = (e) => {
|
|
58
|
+
e.stopPropagation();
|
|
59
|
+
const searchTerm = e.target.value;
|
|
60
|
+
if (!searchTerm || searchTerm === '') {
|
|
61
|
+
setFilteredLanes(lanes);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
setFilteredLanes((value) => value.filter((laneId) => laneId.name.includes(searchTerm)));
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const onDropdownToggled = (_, open) => {
|
|
68
|
+
setFocus(open);
|
|
69
|
+
};
|
|
70
|
+
return (react_1.default.createElement(evangelist_surfaces_dropdown_1.Dropdown, Object.assign({}, rest, { open: !multipleLanes ? false : undefined, dropClass: lane_selector_module_scss_1.default.menu, onChange: multipleLanes ? onDropdownToggled : undefined,
|
|
71
|
+
// @ts-ignore - mismatch between @types/react
|
|
72
|
+
placeholder: react_1.default.createElement(lane_placeholder_1.LanePlaceholder, { disabled: !multipleLanes, selectedLaneId: selectedLaneId, showScope: groupByScope }), className: (0, classnames_1.default)(className, lane_selector_module_scss_1.default.dropdown, !multipleLanes && lane_selector_module_scss_1.default.disabled) }),
|
|
73
|
+
multipleLanes && react_1.default.createElement("div", { className: lane_selector_module_scss_1.default.header }, "Switch lane"),
|
|
74
|
+
multipleLanes && (react_1.default.createElement("div", { className: lane_selector_module_scss_1.default.search },
|
|
75
|
+
react_1.default.createElement(lane_search_1.LaneSearch, { focus: focus, onChange: handleOnChange }))),
|
|
76
|
+
multipleLanes &&
|
|
77
|
+
groupByScope &&
|
|
78
|
+
laneDropdownItems.map(([scope, lanesByScope]) => (react_1.default.createElement(lane_grouped_menu_item_1.LaneGroupedMenuItem, { key: scope, scope: scope, selected: selectedLaneId, current: lanesByScope }))),
|
|
79
|
+
multipleLanes &&
|
|
80
|
+
!groupByScope &&
|
|
81
|
+
laneDropdownItems.map((lane) => (react_1.default.createElement(lane_menu_item_1.LaneMenuItem, { key: lane.toString(), selected: selectedLaneId, current: lane })))));
|
|
82
|
+
}
|
|
83
|
+
exports.LaneSelector = LaneSelector;
|
|
84
|
+
//# sourceMappingURL=lane-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lane-selector.js","sourceRoot":"","sources":["../lane-selector.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
@import '~@teambit/ui-foundation.ui.constants.z-indexes/z-indexes.module.scss';
|
|
2
|
+
|
|
3
|
+
.dropdown {
|
|
4
|
+
// otherwise when the dropdown is open it clashes with the content of the tree
|
|
5
|
+
// (this is bizarre, the tree has no position absolute)
|
|
6
|
+
z-index: $nav-z-index;
|
|
7
|
+
&.disabled {
|
|
8
|
+
> div {
|
|
9
|
+
cursor: unset;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.header {
|
|
15
|
+
padding: 8px 16px;
|
|
16
|
+
border-bottom: 1px solid var(--bit-border-color-lightest, #ededed);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.search {
|
|
20
|
+
margin: 8px 0px 0px 0px;
|
|
21
|
+
border-bottom: 1px solid var(--bit-border-color-lightest, #ededed);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.menu {
|
|
25
|
+
width: calc(100% - 24px);
|
|
26
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"lib": [
|
|
4
|
+
"es2019",
|
|
5
|
+
"DOM",
|
|
6
|
+
"ES6",
|
|
7
|
+
"DOM.Iterable"
|
|
8
|
+
],
|
|
9
|
+
"target": "es2015",
|
|
10
|
+
"module": "CommonJS",
|
|
11
|
+
"jsx": "react",
|
|
12
|
+
"allowJs": true,
|
|
13
|
+
"composite": true,
|
|
14
|
+
"declaration": true,
|
|
15
|
+
"sourceMap": true,
|
|
16
|
+
"skipLibCheck": true,
|
|
17
|
+
"experimentalDecorators": true,
|
|
18
|
+
"outDir": "dist",
|
|
19
|
+
"moduleResolution": "node",
|
|
20
|
+
"esModuleInterop": true,
|
|
21
|
+
"rootDir": ".",
|
|
22
|
+
"resolveJsonModule": true
|
|
23
|
+
},
|
|
24
|
+
"exclude": [
|
|
25
|
+
"dist",
|
|
26
|
+
"package.json"
|
|
27
|
+
],
|
|
28
|
+
"include": [
|
|
29
|
+
"**/*",
|
|
30
|
+
"**/*.json"
|
|
31
|
+
]
|
|
32
|
+
}
|
package/index.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import React, { HTMLAttributes } from 'react';
|
|
2
|
+
import { LaneId } from '@teambit/lane-id';
|
|
3
|
+
import classnames from 'classnames';
|
|
4
|
+
import { LaneMenuItem } from './lane-menu-item';
|
|
5
|
+
|
|
6
|
+
import styles from './lane-grouped-menu-item.module.scss';
|
|
7
|
+
|
|
8
|
+
export type LaneGroupedMenuItemProps = {
|
|
9
|
+
selected?: LaneId;
|
|
10
|
+
current: LaneId[];
|
|
11
|
+
scope: string;
|
|
12
|
+
} & HTMLAttributes<HTMLDivElement>;
|
|
13
|
+
|
|
14
|
+
export function LaneGroupedMenuItem({ selected, current, className, scope, ...rest }: LaneGroupedMenuItemProps) {
|
|
15
|
+
if (current.length === 0) return null;
|
|
16
|
+
|
|
17
|
+
if (current[0].isDefault()) {
|
|
18
|
+
const defaultLane = current[0] as LaneId;
|
|
19
|
+
return <LaneMenuItem key={defaultLane.toString()} selected={selected} current={defaultLane} />;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const onClickStopPropagation = (e) => e.stopPropagation();
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<div className={classnames(styles.groupedMenuItem, className)} {...rest}>
|
|
26
|
+
<div onClick={onClickStopPropagation} className={styles.scope}>
|
|
27
|
+
{scope}
|
|
28
|
+
</div>
|
|
29
|
+
{current.map((lane) => (
|
|
30
|
+
<LaneMenuItem key={lane.toString()} selected={selected} current={lane} />
|
|
31
|
+
))}
|
|
32
|
+
</div>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
.menuItem {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: row;
|
|
4
|
+
padding: 8px 16px;
|
|
5
|
+
min-width: 120px;
|
|
6
|
+
cursor: pointer;
|
|
7
|
+
justify-content: space-between;
|
|
8
|
+
border-bottom: 1px solid var(--bit-border-color-lightest, #ededed);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.defaultLanePill {
|
|
12
|
+
font-size: var(--bit-p-xxs, 12px);
|
|
13
|
+
text-transform: lowercase;
|
|
14
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import React, { HTMLAttributes, useRef, useEffect } from 'react';
|
|
2
|
+
import { LaneId } from '@teambit/lane-id';
|
|
3
|
+
import { LanesModel } from '@teambit/lanes.ui.models.lanes-model';
|
|
4
|
+
import { PillLabel } from '@teambit/design.ui.pill-label';
|
|
5
|
+
import { MenuLinkItem } from '@teambit/design.ui.surfaces.menu.link-item';
|
|
6
|
+
|
|
7
|
+
import styles from './lane-menu-item.module.scss';
|
|
8
|
+
|
|
9
|
+
export type LaneMenuItemProps = {
|
|
10
|
+
selected?: LaneId;
|
|
11
|
+
current: LaneId;
|
|
12
|
+
} & HTMLAttributes<HTMLDivElement>;
|
|
13
|
+
|
|
14
|
+
export function LaneMenuItem({ selected, current, className, ...rest }: LaneMenuItemProps) {
|
|
15
|
+
const isCurrent = selected?.toString() === current.toString();
|
|
16
|
+
|
|
17
|
+
const currentVersionRef = useRef<HTMLDivElement>(null);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
if (isCurrent) {
|
|
20
|
+
currentVersionRef.current?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
|
|
21
|
+
}
|
|
22
|
+
}, [isCurrent]);
|
|
23
|
+
|
|
24
|
+
const href = LanesModel.getLaneUrl(current);
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<div {...rest} className={className} ref={currentVersionRef}>
|
|
28
|
+
<MenuLinkItem active={isCurrent} href={href} className={styles.menuItem}>
|
|
29
|
+
<div className={styles.laneName}>{current.name}</div>
|
|
30
|
+
{current.isDefault() && (
|
|
31
|
+
<PillLabel className={styles.defaultLanePill}>
|
|
32
|
+
<span>default</span>
|
|
33
|
+
</PillLabel>
|
|
34
|
+
)}
|
|
35
|
+
</MenuLinkItem>
|
|
36
|
+
</div>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
.placeholder {
|
|
2
|
+
display: flex;
|
|
3
|
+
align-items: center;
|
|
4
|
+
padding: 4px 8px 4px 4px;
|
|
5
|
+
line-height: var(--bit-p-md, 16px);
|
|
6
|
+
font-size: var(--bit-p-md, 16px);
|
|
7
|
+
border-radius: 6px;
|
|
8
|
+
border: 1px solid var(--bit-border-color-light, #cccfd4);
|
|
9
|
+
background-color: var(--bit-border-color-lightest, #ededed);
|
|
10
|
+
&.disabled {
|
|
11
|
+
border: unset;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.placeholderText {
|
|
16
|
+
padding: 4px 12px;
|
|
17
|
+
font-size: var(--bit-p-xs, 14px);
|
|
18
|
+
flex: 1;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.icon {
|
|
22
|
+
padding-left: 8px;
|
|
23
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import React, { HTMLAttributes } from 'react';
|
|
2
|
+
import { Icon } from '@teambit/evangelist.elements.icon';
|
|
3
|
+
import { LaneIcon } from '@teambit/lanes.ui.icons.lane-icon';
|
|
4
|
+
import { LaneId } from '@teambit/lane-id';
|
|
5
|
+
import classnames from 'classnames';
|
|
6
|
+
import { Ellipsis } from '@teambit/design.ui.styles.ellipsis';
|
|
7
|
+
|
|
8
|
+
import styles from './lane-placeholder.module.scss';
|
|
9
|
+
|
|
10
|
+
export type LanePlaceholderProps = {
|
|
11
|
+
selectedLaneId?: LaneId;
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
showScope?: boolean;
|
|
14
|
+
} & HTMLAttributes<HTMLDivElement>;
|
|
15
|
+
|
|
16
|
+
export function LanePlaceholder({
|
|
17
|
+
selectedLaneId,
|
|
18
|
+
disabled,
|
|
19
|
+
className,
|
|
20
|
+
showScope = true,
|
|
21
|
+
...rest
|
|
22
|
+
}: LanePlaceholderProps) {
|
|
23
|
+
const laneIdStr = selectedLaneId?.isDefault()
|
|
24
|
+
? selectedLaneId.name
|
|
25
|
+
: (showScope && selectedLaneId?.toString()) || selectedLaneId?.name;
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<div {...rest} className={classnames(styles.placeholder, className, disabled && styles.disabled)}>
|
|
29
|
+
<LaneIcon className={styles.icon} />
|
|
30
|
+
<Ellipsis className={styles.placeholderText}>{laneIdStr}</Ellipsis>
|
|
31
|
+
{!disabled && <Icon of="fat-arrow-down" />}
|
|
32
|
+
</div>
|
|
33
|
+
);
|
|
34
|
+
}
|
package/lane-search.tsx
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import React, { createRef, useEffect, ChangeEventHandler } from 'react';
|
|
2
|
+
|
|
3
|
+
import styles from './lane-search.module.scss';
|
|
4
|
+
|
|
5
|
+
export type LaneSearchProps = {
|
|
6
|
+
onChange: ChangeEventHandler<HTMLInputElement>;
|
|
7
|
+
focus: boolean;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export function LaneSearch({ onChange, focus }: LaneSearchProps) {
|
|
11
|
+
const inputRef = createRef<HTMLInputElement>();
|
|
12
|
+
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (focus) inputRef.current?.focus();
|
|
15
|
+
}, [focus]);
|
|
16
|
+
|
|
17
|
+
const handleOnClicked = (e) => {
|
|
18
|
+
inputRef.current?.focus();
|
|
19
|
+
e.stopPropagation();
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<input
|
|
24
|
+
className={styles.search}
|
|
25
|
+
placeholder={'Search'}
|
|
26
|
+
onClick={handleOnClicked}
|
|
27
|
+
ref={inputRef}
|
|
28
|
+
onChange={onChange}
|
|
29
|
+
></input>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
@import '~@teambit/ui-foundation.ui.constants.z-indexes/z-indexes.module.scss';
|
|
2
|
+
|
|
3
|
+
.dropdown {
|
|
4
|
+
// otherwise when the dropdown is open it clashes with the content of the tree
|
|
5
|
+
// (this is bizarre, the tree has no position absolute)
|
|
6
|
+
z-index: $nav-z-index;
|
|
7
|
+
&.disabled {
|
|
8
|
+
> div {
|
|
9
|
+
cursor: unset;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.header {
|
|
15
|
+
padding: 8px 16px;
|
|
16
|
+
border-bottom: 1px solid var(--bit-border-color-lightest, #ededed);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.search {
|
|
20
|
+
margin: 8px 0px 0px 0px;
|
|
21
|
+
border-bottom: 1px solid var(--bit-border-color-lightest, #ededed);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.menu {
|
|
25
|
+
width: calc(100% - 24px);
|
|
26
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import React, { HTMLAttributes, useState, ChangeEventHandler, useEffect } from 'react';
|
|
2
|
+
import classnames from 'classnames';
|
|
3
|
+
import { LaneId } from '@teambit/lane-id';
|
|
4
|
+
import { Dropdown } from '@teambit/evangelist.surfaces.dropdown';
|
|
5
|
+
|
|
6
|
+
import { LanesModel } from '@teambit/lanes.ui.models.lanes-model';
|
|
7
|
+
import { LaneMenuItem } from './lane-menu-item';
|
|
8
|
+
import { LanePlaceholder } from './lane-placeholder';
|
|
9
|
+
import { LaneGroupedMenuItem } from './lane-grouped-menu-item';
|
|
10
|
+
import { LaneSearch } from './lane-search';
|
|
11
|
+
|
|
12
|
+
import styles from './lane-selector.module.scss';
|
|
13
|
+
|
|
14
|
+
export type LaneSelectorProps = {
|
|
15
|
+
lanes: Array<LaneId>;
|
|
16
|
+
selectedLaneId?: LaneId;
|
|
17
|
+
groupByScope?: boolean;
|
|
18
|
+
} & HTMLAttributes<HTMLDivElement>;
|
|
19
|
+
|
|
20
|
+
type LaneDropdownItems = Array<LaneId> | Array<[scope: string, lanes: LaneId[]]>;
|
|
21
|
+
|
|
22
|
+
export function LaneSelector({ className, lanes, selectedLaneId, groupByScope = true, ...rest }: LaneSelectorProps) {
|
|
23
|
+
const [filteredLanes, setFilteredLanes] = useState<LaneId[]>(lanes);
|
|
24
|
+
const [focus, setFocus] = useState<boolean>(false);
|
|
25
|
+
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
setFilteredLanes(lanes);
|
|
28
|
+
}, [lanes]);
|
|
29
|
+
|
|
30
|
+
const multipleLanes = lanes.length > 1;
|
|
31
|
+
const laneDropdownItems: LaneDropdownItems = groupByScope
|
|
32
|
+
? Array.from(LanesModel.groupByScope(filteredLanes).entries())
|
|
33
|
+
: filteredLanes;
|
|
34
|
+
|
|
35
|
+
const handleOnChange: ChangeEventHandler<HTMLInputElement> = (e) => {
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
const searchTerm = e.target.value;
|
|
38
|
+
if (!searchTerm || searchTerm === '') {
|
|
39
|
+
setFilteredLanes(lanes);
|
|
40
|
+
} else {
|
|
41
|
+
setFilteredLanes((value) => value.filter((laneId) => laneId.name.includes(searchTerm)));
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const onDropdownToggled = (_, open) => {
|
|
46
|
+
setFocus(open);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<Dropdown
|
|
51
|
+
{...rest}
|
|
52
|
+
open={!multipleLanes ? false : undefined}
|
|
53
|
+
dropClass={styles.menu}
|
|
54
|
+
onChange={multipleLanes ? onDropdownToggled : undefined}
|
|
55
|
+
// @ts-ignore - mismatch between @types/react
|
|
56
|
+
placeholder={
|
|
57
|
+
<LanePlaceholder disabled={!multipleLanes} selectedLaneId={selectedLaneId} showScope={groupByScope} />
|
|
58
|
+
}
|
|
59
|
+
className={classnames(className, styles.dropdown, !multipleLanes && styles.disabled)}
|
|
60
|
+
>
|
|
61
|
+
{multipleLanes && <div className={styles.header}>Switch lane</div>}
|
|
62
|
+
{multipleLanes && (
|
|
63
|
+
<div className={styles.search}>
|
|
64
|
+
<LaneSearch focus={focus} onChange={handleOnChange} />
|
|
65
|
+
</div>
|
|
66
|
+
)}
|
|
67
|
+
{multipleLanes &&
|
|
68
|
+
groupByScope &&
|
|
69
|
+
(laneDropdownItems as Array<[scope: string, lanes: LaneId[]]>).map(([scope, lanesByScope]) => (
|
|
70
|
+
<LaneGroupedMenuItem key={scope} scope={scope} selected={selectedLaneId} current={lanesByScope} />
|
|
71
|
+
))}
|
|
72
|
+
{multipleLanes &&
|
|
73
|
+
!groupByScope &&
|
|
74
|
+
(laneDropdownItems as LaneId[]).map((lane) => (
|
|
75
|
+
<LaneMenuItem key={lane.toString()} selected={selectedLaneId} current={lane}></LaneMenuItem>
|
|
76
|
+
))}
|
|
77
|
+
</Dropdown>
|
|
78
|
+
);
|
|
79
|
+
}
|
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@teambit/lanes.ui.inputs.lane-selector",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"componentId": {
|
|
6
|
+
"scope": "teambit.lanes",
|
|
7
|
+
"name": "ui/inputs/lane-selector",
|
|
8
|
+
"version": "0.0.1"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"classnames": "2.2.6",
|
|
12
|
+
"core-js": "^3.0.0",
|
|
13
|
+
"@teambit/design.ui.surfaces.menu.link-item": "1.0.0",
|
|
14
|
+
"@teambit/evangelist.elements.icon": "1.0.2",
|
|
15
|
+
"@teambit/evangelist.surfaces.dropdown": "1.0.2",
|
|
16
|
+
"@teambit/lane-id": "0.0.97",
|
|
17
|
+
"@teambit/design.ui.pill-label": "0.0.356",
|
|
18
|
+
"@teambit/lanes.ui.models.lanes-model": "0.0.1",
|
|
19
|
+
"@teambit/design.ui.styles.ellipsis": "0.0.353",
|
|
20
|
+
"@teambit/lanes.ui.icons.lane-icon": "0.0.1",
|
|
21
|
+
"@teambit/ui-foundation.ui.constants.z-indexes": "0.0.494"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/classnames": "2.2.11",
|
|
25
|
+
"@types/react": "^17.0.8",
|
|
26
|
+
"@types/mocha": "9.1.0",
|
|
27
|
+
"@types/testing-library__jest-dom": "5.9.5",
|
|
28
|
+
"@babel/runtime": "7.12.18",
|
|
29
|
+
"@types/jest": "^26.0.0",
|
|
30
|
+
"@types/react-dom": "^17.0.5",
|
|
31
|
+
"@types/node": "12.20.4"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"react-dom": "^16.8.0 || ^17.0.0",
|
|
35
|
+
"react": "^16.8.0 || ^17.0.0"
|
|
36
|
+
},
|
|
37
|
+
"license": "Apache-2.0",
|
|
38
|
+
"private": false,
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=12.22.0"
|
|
41
|
+
},
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "https://github.com/teambit/bit"
|
|
45
|
+
},
|
|
46
|
+
"keywords": [
|
|
47
|
+
"bit",
|
|
48
|
+
"components",
|
|
49
|
+
"collaboration",
|
|
50
|
+
"web",
|
|
51
|
+
"react",
|
|
52
|
+
"react-components",
|
|
53
|
+
"angular",
|
|
54
|
+
"angular-components"
|
|
55
|
+
]
|
|
56
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"lib": [
|
|
4
|
+
"es2019",
|
|
5
|
+
"DOM",
|
|
6
|
+
"ES6",
|
|
7
|
+
"DOM.Iterable"
|
|
8
|
+
],
|
|
9
|
+
"target": "es2015",
|
|
10
|
+
"module": "CommonJS",
|
|
11
|
+
"jsx": "react",
|
|
12
|
+
"allowJs": true,
|
|
13
|
+
"composite": true,
|
|
14
|
+
"declaration": true,
|
|
15
|
+
"sourceMap": true,
|
|
16
|
+
"skipLibCheck": true,
|
|
17
|
+
"experimentalDecorators": true,
|
|
18
|
+
"outDir": "dist",
|
|
19
|
+
"moduleResolution": "node",
|
|
20
|
+
"esModuleInterop": true,
|
|
21
|
+
"rootDir": ".",
|
|
22
|
+
"resolveJsonModule": true
|
|
23
|
+
},
|
|
24
|
+
"exclude": [
|
|
25
|
+
"dist",
|
|
26
|
+
"package.json"
|
|
27
|
+
],
|
|
28
|
+
"include": [
|
|
29
|
+
"**/*",
|
|
30
|
+
"**/*.json"
|
|
31
|
+
]
|
|
32
|
+
}
|
package/types/asset.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
declare module '*.png' {
|
|
2
|
+
const value: any;
|
|
3
|
+
export = value;
|
|
4
|
+
}
|
|
5
|
+
declare module '*.svg' {
|
|
6
|
+
import type { FunctionComponent, SVGProps } from 'react';
|
|
7
|
+
|
|
8
|
+
export const ReactComponent: FunctionComponent<SVGProps<SVGSVGElement> & { title?: string }>;
|
|
9
|
+
const src: string;
|
|
10
|
+
export default src;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// @TODO Gilad
|
|
14
|
+
declare module '*.jpg' {
|
|
15
|
+
const value: any;
|
|
16
|
+
export = value;
|
|
17
|
+
}
|
|
18
|
+
declare module '*.jpeg' {
|
|
19
|
+
const value: any;
|
|
20
|
+
export = value;
|
|
21
|
+
}
|
|
22
|
+
declare module '*.gif' {
|
|
23
|
+
const value: any;
|
|
24
|
+
export = value;
|
|
25
|
+
}
|
|
26
|
+
declare module '*.bmp' {
|
|
27
|
+
const value: any;
|
|
28
|
+
export = value;
|
|
29
|
+
}
|
package/types/style.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
declare module '*.module.css' {
|
|
2
|
+
const classes: { readonly [key: string]: string };
|
|
3
|
+
export default classes;
|
|
4
|
+
}
|
|
5
|
+
declare module '*.module.scss' {
|
|
6
|
+
const classes: { readonly [key: string]: string };
|
|
7
|
+
export default classes;
|
|
8
|
+
}
|
|
9
|
+
declare module '*.module.sass' {
|
|
10
|
+
const classes: { readonly [key: string]: string };
|
|
11
|
+
export default classes;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
declare module '*.module.less' {
|
|
15
|
+
const classes: { readonly [key: string]: string };
|
|
16
|
+
export default classes;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
declare module '*.less' {
|
|
20
|
+
const classes: { readonly [key: string]: string };
|
|
21
|
+
export default classes;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
declare module '*.css' {
|
|
25
|
+
const classes: { readonly [key: string]: string };
|
|
26
|
+
export default classes;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
declare module '*.sass' {
|
|
30
|
+
const classes: { readonly [key: string]: string };
|
|
31
|
+
export default classes;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
declare module '*.scss' {
|
|
35
|
+
const classes: { readonly [key: string]: string };
|
|
36
|
+
export default classes;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
declare module '*.mdx' {
|
|
40
|
+
const component: any;
|
|
41
|
+
export default component;
|
|
42
|
+
}
|