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.
- package/.eslintrc.js +42 -0
- package/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/.idea/inspectionProfiles/profiles_settings.xml +6 -0
- package/.idea/misc.xml +4 -0
- package/.idea/modules.xml +8 -0
- package/.idea/plugin-item-improvement.iml +8 -0
- package/.idea/vcs.xml +6 -0
- package/README.md +7 -0
- package/assets/arsenal.nedb +704 -0
- package/assets/items.nedb +756 -0
- package/assets/main.css +192 -0
- package/assets/useitem.svg +107 -0
- package/i18n/en-US.json +4 -0
- package/i18n/ja-JP.json +54 -0
- package/i18n/zh-CN.json +53 -0
- package/i18n/zh-TW.json +53 -0
- package/index.es +12 -0
- package/index.js +21 -0
- package/package.json +56 -0
- package/poi-plugin-item-improvement2-0.0.1.tgz +0 -0
- package/views/detail-row.js +186 -0
- package/views/divider.js +17 -0
- package/views/item-info-area.js +157 -0
- package/views/item-info-row.js +93 -0
- package/views/item-wrapper.js +126 -0
- package/views/mat-row.js +153 -0
- package/views/selectors.js +127 -0
- package/views/starcraft/add-new-equip-view.js +110 -0
- package/views/starcraft/control-panel.js +104 -0
- package/views/starcraft/equip-category-view.js +115 -0
- package/views/starcraft/equip-list-view.js +100 -0
- package/views/starcraft/equip-view.js +142 -0
- package/views/starcraft/equiptype.js +109 -0
- package/views/starcraft/plan-modify-control.js +201 -0
- package/views/starcraft/plan-view.js +108 -0
- package/views/starcraft/starcraft-area.js +222 -0
- package/views/starcraft/utils.js +51 -0
- package/views/useitem-icon.js +69 -0
package/views/mat-row.js
ADDED
|
@@ -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
|
+
});
|