poi-plugin-item-improvement2 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/.eslintrc.js +42 -0
  2. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  3. package/.idea/inspectionProfiles/profiles_settings.xml +6 -0
  4. package/.idea/misc.xml +4 -0
  5. package/.idea/modules.xml +8 -0
  6. package/.idea/plugin-item-improvement.iml +8 -0
  7. package/.idea/vcs.xml +6 -0
  8. package/README.md +7 -0
  9. package/assets/arsenal.nedb +704 -0
  10. package/assets/items.nedb +756 -0
  11. package/assets/main.css +192 -0
  12. package/assets/useitem.svg +107 -0
  13. package/i18n/en-US.json +4 -0
  14. package/i18n/ja-JP.json +54 -0
  15. package/i18n/zh-CN.json +53 -0
  16. package/i18n/zh-TW.json +53 -0
  17. package/index.es +12 -0
  18. package/index.js +21 -0
  19. package/package.json +56 -0
  20. package/poi-plugin-item-improvement2-0.0.1.tgz +0 -0
  21. package/views/detail-row.js +186 -0
  22. package/views/divider.js +17 -0
  23. package/views/item-info-area.js +157 -0
  24. package/views/item-info-row.js +93 -0
  25. package/views/item-wrapper.js +126 -0
  26. package/views/mat-row.js +153 -0
  27. package/views/selectors.js +127 -0
  28. package/views/starcraft/add-new-equip-view.js +110 -0
  29. package/views/starcraft/control-panel.js +104 -0
  30. package/views/starcraft/equip-category-view.js +115 -0
  31. package/views/starcraft/equip-list-view.js +100 -0
  32. package/views/starcraft/equip-view.js +142 -0
  33. package/views/starcraft/equiptype.js +109 -0
  34. package/views/starcraft/plan-modify-control.js +201 -0
  35. package/views/starcraft/plan-view.js +108 -0
  36. package/views/starcraft/starcraft-area.js +222 -0
  37. package/views/starcraft/utils.js +51 -0
  38. package/views/useitem-icon.js +69 -0
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.MatRow = void 0;
5
+
6
+ var _react = _interopRequireDefault(require("react"));
7
+
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+
10
+ var _reactFontawesome = _interopRequireDefault(require("react-fontawesome"));
11
+
12
+ var _icon = require("views/components/etc/icon");
13
+
14
+ var _useitemIcon = require("./useitem-icon");
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
19
+
20
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
21
+
22
+ const {
23
+ __
24
+ } = window.i18n['poi-plugin-item-improvement'];
25
+ const {
26
+ __: __r
27
+ } = window.i18n.resources;
28
+ const WEEKDAY = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
29
+
30
+ const ItemIcon = (_ref) => {
31
+ let {
32
+ item
33
+ } = _ref,
34
+ props = _objectWithoutProperties(_ref, ["item"]);
35
+
36
+ return item.type === 'useitem' ? _react.default.createElement(_useitemIcon.UseitemIcon, _extends({
37
+ useitemId: item.icon,
38
+ className: 'useitem'
39
+ }, props)) : _react.default.createElement(_icon.SlotitemIcon, _extends({
40
+ slotitemId: item.icon,
41
+ className: "equip-icon"
42
+ }, props));
43
+ };
44
+
45
+ ItemIcon.propTypes = {
46
+ item: _propTypes.default.shape({
47
+ type: _propTypes.default.string.isRequired,
48
+ icon: _propTypes.default.number.isRequired
49
+ }).isRequired // React Elements
50
+
51
+ };
52
+
53
+ const MatRow = ({
54
+ stage,
55
+ day,
56
+ assistants,
57
+ upgrade,
58
+ items,
59
+ development,
60
+ improvement
61
+ }) => {
62
+ const rowCnt = upgrade.icon ? 3 : 2;
63
+ let hishoCol = '';
64
+
65
+ if (day === -1) {
66
+ hishoCol = assistants.map(hisho => {
67
+ let days = [];
68
+ hisho.day.forEach((v, i) => {
69
+ if (v) days.push(__(WEEKDAY[i]));
70
+ });
71
+
72
+ if (days.length === 7) {
73
+ days = '';
74
+ } else {
75
+ days = `(${days.join(' / ')})`;
76
+ }
77
+
78
+ return _react.default.createElement("div", {
79
+ className: "hisho-col",
80
+ key: hisho.name
81
+ }, hisho.name, _react.default.createElement("br", null), _react.default.createElement("span", {
82
+ className: "available-days"
83
+ }, days));
84
+ });
85
+ } else {
86
+ hishoCol = assistants.map(hisho => _react.default.createElement("div", {
87
+ key: hisho.name
88
+ }, hisho.name));
89
+ }
90
+
91
+ let stageRow = '';
92
+ let star = '';
93
+
94
+ switch (stage) {
95
+ case 0:
96
+ stageRow = _react.default.createElement("span", null, _react.default.createElement(_reactFontawesome.default, {
97
+ name: "star"
98
+ }), " 1 ~ ", _react.default.createElement(_reactFontawesome.default, {
99
+ name: "star"
100
+ }), " 6 ");
101
+ break;
102
+
103
+ case 1:
104
+ stageRow = _react.default.createElement("span", null, _react.default.createElement(_reactFontawesome.default, {
105
+ name: "star"
106
+ }), " 6 ~ ", _react.default.createElement(_reactFontawesome.default, {
107
+ name: "star"
108
+ }), " MAX ");
109
+ break;
110
+
111
+ case 2:
112
+ if (upgrade.level) {
113
+ star = _react.default.createElement("span", null, " ", _react.default.createElement(_reactFontawesome.default, {
114
+ name: "star"
115
+ }), ` ${upgrade.level}`);
116
+ }
117
+
118
+ stageRow = _react.default.createElement("div", null, _react.default.createElement(_icon.SlotitemIcon, {
119
+ slotitemId: upgrade.icon,
120
+ className: "equip-icon"
121
+ }), window.i18n.resources.__(upgrade.name), star);
122
+ break;
123
+
124
+ default:
125
+ console.error('unreachable code: stage is out of range');
126
+ }
127
+
128
+ return _react.default.createElement("tr", null, stage === 0 && _react.default.createElement("td", {
129
+ rowSpan: rowCnt
130
+ }, hishoCol), _react.default.createElement("td", null, stageRow), _react.default.createElement("td", null, development[0], "(", development[1], ")"), _react.default.createElement("td", null, improvement[0], "(", improvement[1], ")"), _react.default.createElement("td", null, _react.default.createElement("div", null, items.map(item => !!item.icon && _react.default.createElement("div", {
131
+ key: item.icon
132
+ }, item.count, " \xD7", _react.default.createElement(ItemIcon, {
133
+ item: item
134
+ }), __r(item.name), typeof item.available === 'number' && __('Available', item.available))))));
135
+ };
136
+
137
+ exports.MatRow = MatRow;
138
+ MatRow.propTypes = {
139
+ day: _propTypes.default.number.isRequired,
140
+ development: _propTypes.default.arrayOf(_propTypes.default.number).isRequired,
141
+ improvement: _propTypes.default.arrayOf(_propTypes.default.number).isRequired,
142
+ stage: _propTypes.default.number.isRequired,
143
+ items: _propTypes.default.arrayOf(_propTypes.default.object).isRequired,
144
+ upgrade: _propTypes.default.shape({
145
+ level: _propTypes.default.number.isRequired,
146
+ icon: _propTypes.default.number.isRequired,
147
+ name: _propTypes.default.string.isRequired
148
+ }).isRequired,
149
+ assistants: _propTypes.default.arrayOf(_propTypes.default.shape({
150
+ day: _propTypes.default.arrayOf(_propTypes.default.bool).isRequired,
151
+ name: _propTypes.default.string.isRequired
152
+ })).isRequired
153
+ };
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.$shipsSelector = exports.itemLevelStatFactory = exports.improveItemIdsByDaySelector = exports.improvementDataSelector = exports.equipLevelStatSelector = exports.equipAvailableSelector = exports.starCraftPlanSelector = exports.adjustedRemodelChainsSelector = exports.shipUniqueMapSelector = exports.uniqueShipIdsSelector = void 0;
5
+
6
+ var _fs = _interopRequireDefault(require("fs"));
7
+
8
+ var _path = _interopRequireDefault(require("path"));
9
+
10
+ var _lodash = _interopRequireDefault(require("lodash"));
11
+
12
+ var _reselect = require("reselect");
13
+
14
+ var _selectors = require("views/utils/selectors");
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
19
+
20
+ function loadNedbAsMap(nedbPath, key = 'id') {
21
+ try {
22
+ if (!_fs.default.existsSync(nedbPath)) {
23
+ console.warn('[nedb] file not found:', nedbPath);
24
+ return {};
25
+ }
26
+
27
+ const content = _fs.default.readFileSync(nedbPath, 'utf-8');
28
+
29
+ return (0, _lodash.default)(content.split('\n')).filter(Boolean).map(line => {
30
+ try {
31
+ return JSON.parse(line);
32
+ } catch (e) {
33
+ return null;
34
+ }
35
+ }).filter(Boolean).keyBy(key).value();
36
+ } catch (e) {
37
+ console.error('[nedb] load failed:', e);
38
+ return {};
39
+ }
40
+ }
41
+
42
+ const ourShipsSelector = (0, _reselect.createSelector)([_selectors.constSelector], ({
43
+ $ships = {}
44
+ } = {}) => (0, _lodash.default)($ships).pickBy(({
45
+ api_sortno
46
+ }) => Boolean(api_sortno)).value()); // the chain starts from each ship, thus incomplete if the ship is not the starting one
47
+ // the adjustedRemodelChainsSelector will return complete chains for all ships
48
+
49
+ const remodelChainsSelector = (0, _reselect.createSelector)([ourShipsSelector], $ships => (0, _lodash.default)($ships).mapValues(({
50
+ api_id: shipId
51
+ }) => {
52
+ let current = $ships[shipId];
53
+ let next = +(current.api_aftershipid || 0);
54
+ let same = [shipId];
55
+
56
+ while (!same.includes(next) && next > 0) {
57
+ same = [...same, next];
58
+ current = $ships[next] || {};
59
+ next = +(current.api_aftershipid || 0);
60
+ }
61
+
62
+ return same;
63
+ }).value());
64
+ const beforeShipMapSelector = (0, _reselect.createSelector)([ourShipsSelector], $ships => (0, _lodash.default)($ships).filter(ship => +(ship.api_aftershipid || 0) > 0).map(ship => [ship.api_aftershipid, ship.api_id]).fromPairs().value());
65
+ const uniqueShipIdsSelector = (0, _reselect.createSelector)([ourShipsSelector, beforeShipMapSelector], ($ships, beforeShipMap) => (0, _lodash.default)($ships).filter(({
66
+ api_id
67
+ }) => !(api_id in beforeShipMap)) // eslint-disable-line camelcase
68
+ .map(({
69
+ api_id
70
+ }) => api_id) // eslint-disable-line camelcase
71
+ .value());
72
+ exports.uniqueShipIdsSelector = uniqueShipIdsSelector;
73
+ const shipUniqueMapSelector = (0, _reselect.createSelector)([uniqueShipIdsSelector, remodelChainsSelector], (shipIds, chains) => (0, _lodash.default)(shipIds).flatMap(shipId => (0, _lodash.default)(chains[shipId]).map(id => [id, shipId]).value()).fromPairs().value());
74
+ exports.shipUniqueMapSelector = shipUniqueMapSelector;
75
+ const adjustedRemodelChainsSelector = (0, _reselect.createSelector)([remodelChainsSelector, shipUniqueMapSelector], (remodelChains, uniqueMap) => (0, _lodash.default)(uniqueMap).mapValues(uniqueId => remodelChains[uniqueId]).value());
76
+ exports.adjustedRemodelChainsSelector = adjustedRemodelChainsSelector;
77
+ const starCraftPlanSelector = (0, _reselect.createSelector)([_selectors.configSelector], config => _lodash.default.get(config, 'plugin.poi-plugin-starcraft.plans', {}));
78
+ exports.starCraftPlanSelector = starCraftPlanSelector;
79
+ const equipAvailableSelector = (0, _reselect.createSelector)([_selectors.equipsSelector], equips => (0, _lodash.default)(equips).filter({
80
+ 'api_level': 0
81
+ }).groupBy('api_slotitem_id').value());
82
+ exports.equipAvailableSelector = equipAvailableSelector;
83
+ const equipLevelStatSelector = (0, _reselect.createSelector)([_selectors.equipsSelector], equips => (0, _lodash.default)(equips).groupBy('api_slotitem_id').mapValues(items => (0, _lodash.default)(items).map(item => item.api_level || 0).value()).value()); // base data is dependent on wctf-db and const
84
+
85
+ exports.equipLevelStatSelector = equipLevelStatSelector;
86
+ const baseImprovementDataSelector = (0, _reselect.createSelector)([_selectors.wctfSelector, _selectors.constSelector, adjustedRemodelChainsSelector, shipUniqueMapSelector], (db, $const, chains, uniqMap) => {
87
+ // ✅ 仅此 selector 使用本地 nedb
88
+ const ARSENAL_NEDB_PATH = _path.default.join(__dirname, '../assets/arsenal.nedb');
89
+
90
+ const ITEMS_NEDB_PATH = _path.default.join(__dirname, '../assets/items.nedb');
91
+
92
+ const arsenalAll = loadNedbAsMap(ARSENAL_NEDB_PATH, 'id');
93
+ const itemsDb = loadNedbAsMap(ITEMS_NEDB_PATH, 'id');
94
+ return (0, _lodash.default)(arsenalAll).keys().map(itemId => {
95
+ const item = itemsDb[itemId] || {};
96
+ const assistants = (0, _lodash.default)(_lodash.default.range(7).concat(-1)).map(day => [day, (0, _lodash.default)(item.improvement).flatMap(entry => (0, _lodash.default)(entry.req).flatMap(([days, ships]) => day === -1 || days[day] ? ships : []).groupBy(id => uniqMap[id]).mapValues(ids => (0, _lodash.default)(ids).sortBy(id => (chains[id] || []).indexOf(id)).take(1).value()).values().flatten().map(id => window.i18n['poi-plugin-item-improvement'].__(window.i18n.resources.__(_lodash.default.get($const, ['$ships', id, 'api_name'], 'None')))).value()).join('/')]).fromPairs().value();
97
+ return _extends({}, _lodash.default.get($const, ['$equips', item.id], {}), item, {
98
+ priority: 0,
99
+ assistants
100
+ });
101
+ }).value();
102
+ });
103
+ const improvementDataSelector = (0, _reselect.createSelector)([baseImprovementDataSelector, starCraftPlanSelector, equipLevelStatSelector], (data, plans, levels) => (0, _lodash.default)(data).map(item => {
104
+ const {
105
+ id
106
+ } = item;
107
+
108
+ if (!plans[id] || _lodash.default.keys(plans[id]).length === 0) {
109
+ return item;
110
+ }
111
+
112
+ const isNotFull = (0, _lodash.default)(plans[id]).entries().some(([star, count]) => count > (0, _lodash.default)(levels[id]).countBy(lv => lv >= parseInt(star, 10)));
113
+ return _extends({}, item, {
114
+ priority: isNotFull ? 2 : 1
115
+ });
116
+ }).value());
117
+ exports.improvementDataSelector = improvementDataSelector;
118
+ const improveItemIdsByDaySelector = (0, _reselect.createSelector)([_selectors.wctfSelector], db => (0, _lodash.default)(_lodash.default.get(db, 'arsenal_weekday')).mapValues(day => (0, _lodash.default)(day.improvements).map(([id]) => id).value()).value());
119
+ exports.improveItemIdsByDaySelector = improveItemIdsByDaySelector;
120
+
121
+ const arrayResultWrapper = selector => (0, _selectors.createDeepCompareArraySelector)(selector, result => result);
122
+
123
+ const itemLevelStatFactory = _lodash.default.memoize(id => arrayResultWrapper((0, _reselect.createSelector)([equipLevelStatSelector], equipLevels => equipLevels[id] || [])));
124
+
125
+ exports.itemLevelStatFactory = itemLevelStatFactory;
126
+ const $shipsSelector = (0, _reselect.createSelector)([_selectors.constSelector], $const => _lodash.default.get($const, '$ships', {}));
127
+ exports.$shipsSelector = $shipsSelector;
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.AddNewEquipView = void 0;
5
+
6
+ var _react = _interopRequireWildcard(require("react"));
7
+
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+
10
+ var _reactFontawesome = _interopRequireDefault(require("react-fontawesome"));
11
+
12
+ var _reactBootstrap = require("react-bootstrap");
13
+
14
+ var _utils = require("./utils");
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
19
+
20
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
21
+
22
+ const {
23
+ __
24
+ } = window.i18n['poi-plugin-item-improvement'];
25
+
26
+ class AddNewEquipView extends _react.Component {
27
+ constructor() {
28
+ super();
29
+ Object.defineProperty(this, "handleChange", {
30
+ configurable: true,
31
+ enumerable: true,
32
+ writable: true,
33
+ value: e => {
34
+ this.setState({
35
+ selected: e.target.value
36
+ });
37
+ }
38
+ });
39
+ Object.defineProperty(this, "handleAddItem", {
40
+ configurable: true,
41
+ enumerable: true,
42
+ writable: true,
43
+ value: () => {
44
+ const {
45
+ selected
46
+ } = this.state;
47
+
48
+ if (selected !== 'none') {
49
+ (0, _utils.modifyPlans)(plans => _extends({}, plans, {
50
+ [selected]: {}
51
+ }));
52
+ } else {
53
+ console.error('trying adding an invaid equipment');
54
+ }
55
+ }
56
+ });
57
+ this.state = {
58
+ selected: 'none'
59
+ };
60
+ }
61
+
62
+ render() {
63
+ return _react.default.createElement("div", {
64
+ style: {
65
+ display: 'flex',
66
+ margin: '5px',
67
+ fontSize: '12px',
68
+ alignItems: 'center'
69
+ }
70
+ }, _react.default.createElement(_reactFontawesome.default, {
71
+ style: {
72
+ marginRight: '10px'
73
+ },
74
+ name: "plus"
75
+ }), _react.default.createElement(_reactBootstrap.FormControl, {
76
+ style: {
77
+ marginRight: '10px',
78
+ fontSize: '14px'
79
+ },
80
+ onChange: this.handleChange,
81
+ value: this.state.selected,
82
+ componentClass: "select"
83
+ }, _react.default.createElement("option", {
84
+ key: "none",
85
+ value: "none"
86
+ }, __('New equipment plan')), this.props.equips.map(equip => _react.default.createElement("option", {
87
+ key: equip.mstId,
88
+ value: equip.mstId
89
+ }, `${equip.mstId}: ${equip.name}`))), _react.default.createElement(_reactBootstrap.Button, {
90
+ disabled: this.state.selected === 'none',
91
+ onClick: this.handleAddItem,
92
+ bsStyle: "primary"
93
+ }, __('Add')));
94
+ }
95
+
96
+ }
97
+
98
+ exports.AddNewEquipView = AddNewEquipView;
99
+ Object.defineProperty(AddNewEquipView, "propTypes", {
100
+ configurable: true,
101
+ enumerable: true,
102
+ writable: true,
103
+ value: {
104
+ equips: _propTypes.default.arrayOf(_propTypes.default.shape({
105
+ iconId: _propTypes.default.number.isRequired,
106
+ mstId: _propTypes.default.number.isRequired,
107
+ name: _propTypes.default.string.isRequired
108
+ })).isRequired
109
+ }
110
+ });
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.ControlPanel = void 0;
5
+
6
+ var _react = _interopRequireWildcard(require("react"));
7
+
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+
10
+ var _reactBootstrap = require("react-bootstrap");
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
15
+
16
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
17
+
18
+ const {
19
+ __
20
+ } = window.i18n['poi-plugin-item-improvement'];
21
+
22
+ class ControlPanel extends _react.Component {
23
+ constructor(...args) {
24
+ var _temp;
25
+
26
+ return _temp = super(...args), Object.defineProperty(this, "handleAction", {
27
+ configurable: true,
28
+ enumerable: true,
29
+ writable: true,
30
+ value: action => () => {
31
+ this.props.onControlAction(action);
32
+ }
33
+ }), _temp;
34
+ }
35
+
36
+ render() {
37
+ const {
38
+ viewMode
39
+ } = this.props;
40
+ const btnStyle = {
41
+ marginRight: '5px'
42
+ };
43
+ const labelStyle = {
44
+ marginRight: '5px',
45
+ marginLeft: '5px',
46
+ paddingTop: '5px',
47
+ width: '60px'
48
+ };
49
+ return _react.default.createElement("div", {
50
+ style: {
51
+ display: 'flex',
52
+ marginBottom: '10px',
53
+ flexDirection: 'column'
54
+ }
55
+ }, _react.default.createElement("div", {
56
+ style: {
57
+ display: 'flex',
58
+ marginBottom: '2px',
59
+ alignItems: 'center'
60
+ }
61
+ }, _react.default.createElement("div", {
62
+ style: _extends({}, labelStyle)
63
+ }, __('Content')), _react.default.createElement(_reactBootstrap.Button, {
64
+ style: _extends({}, btnStyle),
65
+ onClick: this.handleAction('Auto'),
66
+ title: __('Expand only non-empty categories')
67
+ }, __('Default')), _react.default.createElement(_reactBootstrap.Button, {
68
+ onClick: this.handleAction('ExpandAll'),
69
+ style: _extends({}, btnStyle)
70
+ }, __('Expand All')), _react.default.createElement(_reactBootstrap.Button, {
71
+ onClick: this.handleAction('CollapseAll'),
72
+ style: _extends({}, btnStyle)
73
+ }, __('Collapse All'))), _react.default.createElement("div", {
74
+ style: {
75
+ display: 'flex',
76
+ marginBottom: '2px',
77
+ alignItems: 'center'
78
+ }
79
+ }, _react.default.createElement("div", {
80
+ style: _extends({}, labelStyle)
81
+ }, __('View')), _react.default.createElement(_reactBootstrap.Button, {
82
+ style: _extends({}, btnStyle),
83
+ onClick: this.props.onToggleViewMode,
84
+ active: this.props.viewMode
85
+ }, __('View Mode')), viewMode && _react.default.createElement(_reactBootstrap.Button, {
86
+ onClick: this.props.onExportAsImage,
87
+ style: _extends({}, btnStyle)
88
+ }, __('Export as Image'))));
89
+ }
90
+
91
+ }
92
+
93
+ exports.ControlPanel = ControlPanel;
94
+ Object.defineProperty(ControlPanel, "propTypes", {
95
+ configurable: true,
96
+ enumerable: true,
97
+ writable: true,
98
+ value: {
99
+ viewMode: _propTypes.default.bool.isRequired,
100
+ onControlAction: _propTypes.default.func.isRequired,
101
+ onToggleViewMode: _propTypes.default.func.isRequired,
102
+ onExportAsImage: _propTypes.default.func.isRequired
103
+ }
104
+ });
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.EquipCategoryView = void 0;
5
+
6
+ var _react = _interopRequireWildcard(require("react"));
7
+
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+
10
+ var _icon = require("views/components/etc/icon");
11
+
12
+ var _reactFontawesome = _interopRequireDefault(require("react-fontawesome"));
13
+
14
+ var _reactBootstrap = require("react-bootstrap");
15
+
16
+ var _lodash = _interopRequireDefault(require("lodash"));
17
+
18
+ var _equipListView = require("./equip-list-view");
19
+
20
+ var _utils = require("./utils");
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
24
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
25
+
26
+ // props:
27
+ // - $equips
28
+ // - catInfo
29
+ // - collapsed
30
+ // - equipLevels
31
+ // - equipType
32
+ // - onToggle
33
+ // - plans
34
+ // - viewMode
35
+ class EquipCategoryView extends _react.Component {
36
+ shouldComponentUpdate(nextProps) {
37
+ // skipping "catInfo" as it's generated from $equips
38
+ return this.props.collapsed !== nextProps.collapsed || this.props.viewMode !== nextProps.viewMode || !_lodash.default.isEqual(this.props.equipType, nextProps.equipType) || !_lodash.default.isEqual(this.props.plans, nextProps.plans) || !(0, _utils.isEquipMasterEqual)(this.props.$equips, nextProps.$equips);
39
+ }
40
+
41
+ render() {
42
+ const et = this.props.equipType;
43
+ const ci = this.props.catInfo;
44
+ const {
45
+ $equips,
46
+ collapsed
47
+ } = this.props;
48
+ const hasPlan = ci.group.some(mstId => this.props.plans[mstId]); // for view mode, no need of showing anything .. if there's nothing to show...
49
+
50
+ if (this.props.viewMode && (collapsed || !hasPlan)) {
51
+ return null;
52
+ }
53
+
54
+ return _react.default.createElement("div", null, _react.default.createElement(_reactBootstrap.Button, {
55
+ onClick: this.props.onToggle,
56
+ style: {
57
+ width: '100%',
58
+ margin: '2px',
59
+ display: 'flex',
60
+ alignItems: 'center'
61
+ }
62
+ }, !this.props.viewMode && _react.default.createElement(_reactFontawesome.default, {
63
+ className: "eqcat-collapse-toggle",
64
+ style: {
65
+ marginRight: '10px'
66
+ },
67
+ name: collapsed ? 'chevron-right' : 'chevron-down'
68
+ }), _react.default.createElement("div", {
69
+ style: {
70
+ flex: '1',
71
+ textAlign: 'left'
72
+ },
73
+ key: "name"
74
+ }, et.api_name), _react.default.createElement("div", null, ci.icons.map(iconId => _react.default.createElement(_icon.SlotitemIcon, {
75
+ key: iconId,
76
+ slotitemId: iconId,
77
+ className: "equip-icon"
78
+ })))), _react.default.createElement(_reactBootstrap.Collapse, {
79
+ timeout: 100,
80
+ "in": !collapsed
81
+ }, _react.default.createElement("div", {
82
+ style: {
83
+ paddingLeft: '20px'
84
+ }
85
+ }, _react.default.createElement(_equipListView.EquipListView, {
86
+ viewMode: this.props.viewMode,
87
+ plans: this.props.plans,
88
+ equipMstIds: this.props.catInfo.group,
89
+ $equips: $equips
90
+ }))));
91
+ }
92
+
93
+ }
94
+
95
+ exports.EquipCategoryView = EquipCategoryView;
96
+ Object.defineProperty(EquipCategoryView, "propTypes", {
97
+ configurable: true,
98
+ enumerable: true,
99
+ writable: true,
100
+ value: {
101
+ $equips: _propTypes.default.object.isRequired,
102
+ collapsed: _propTypes.default.bool.isRequired,
103
+ viewMode: _propTypes.default.bool.isRequired,
104
+ catInfo: _propTypes.default.shape({
105
+ group: _propTypes.default.arrayOf(_propTypes.default.number).isRequired,
106
+ icons: _propTypes.default.arrayOf(_propTypes.default.number).isRequired
107
+ }).isRequired,
108
+ plans: _propTypes.default.object.isRequired,
109
+ equipType: _propTypes.default.shape({
110
+ api_id: _propTypes.default.number.isRequired,
111
+ api_name: _propTypes.default.string.isRequired
112
+ }).isRequired,
113
+ onToggle: _propTypes.default.func.isRequired
114
+ }
115
+ });