@titaui/pc 1.15.43 → 1.15.44-beta.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.
@@ -5,7 +5,7 @@ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" =
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports["default"] = void 0;
8
+ exports["default"] = exports.ViewType = void 0;
9
9
 
10
10
  var _react = _interopRequireWildcard(require("react"));
11
11
 
@@ -37,6 +37,8 @@ var _requestApi = require("../request-api");
37
37
 
38
38
  var _getLocale = require("../../../utils/getLocale");
39
39
 
40
+ var _popupSelect = _interopRequireDefault(require("../../../components/popup-select"));
41
+
40
42
  require("./index.css");
41
43
 
42
44
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
@@ -57,6 +59,38 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
57
59
 
58
60
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
59
61
 
62
+ var ViewType;
63
+ exports.ViewType = ViewType;
64
+
65
+ (function (ViewType) {
66
+ ViewType["Card"] = "card";
67
+ ViewType["Table"] = "table";
68
+ ViewType["Map"] = "map";
69
+ })(ViewType || (exports.ViewType = ViewType = {}));
70
+
71
+ var viewConfig = function viewConfig() {
72
+ return {
73
+ table: {
74
+ icon: 'tu-icon-pc-table-s',
75
+ title: (0, _getLocale.getLocale)('OKR_MyO_KRP_Table')
76
+ },
77
+ card: {
78
+ icon: 'tu-icon-pc-card-s',
79
+ title: (0, _getLocale.getLocale)('Pro_Butt_Card')
80
+ },
81
+ map: {
82
+ icon: 'tu-icon-yangshi-ditu',
83
+ title: (0, _getLocale.getLocale)('OKR_MyO_Text_Alignment')
84
+ }
85
+ };
86
+ };
87
+
88
+ var isSelfTenant = function isSelfTenant() {
89
+ return ['352728', '564003', '511477', // 正式环境
90
+ '500019', '500017', '500011', '500036' // 测试环境
91
+ ].includes(String((0, _bsGlobal.getBSGlobal)('tenantInfo').Id));
92
+ };
93
+
60
94
  function Header(props, ref) {
61
95
  var _useContext = (0, _react.useContext)(_context.Context),
62
96
  departmentName = _useContext.departmentName,
@@ -69,22 +103,69 @@ function Header(props, ref) {
69
103
 
70
104
  var relationShip = parseInt(relation, 10);
71
105
  var onSearch = props.onSearch,
72
- onFrontAddOKR = props.onFrontAddOKR;
106
+ onFrontAddOKR = props.onFrontAddOKR,
107
+ _props$viewType = props.viewType,
108
+ defaultViewType = _props$viewType === void 0 ? ViewType.Card : _props$viewType,
109
+ onChangeViewType = props.onChangeViewType;
73
110
 
74
111
  var _useState = (0, _react.useState)(false),
75
112
  _useState2 = _slicedToArray(_useState, 2),
76
113
  onlyThisDept = _useState2[0],
77
114
  setOnlyThisDept = _useState2[1];
78
115
 
79
- var _useState3 = (0, _react.useState)(false),
116
+ var _useState3 = (0, _react.useState)(defaultViewType),
80
117
  _useState4 = _slicedToArray(_useState3, 2),
81
- init = _useState4[0],
82
- setInit = _useState4[1];
83
-
84
- var _useState5 = (0, _react.useState)(),
85
- _useState6 = _slicedToArray(_useState5, 2),
86
- userInfo = _useState6[0],
87
- setUserInfo = _useState6[1];
118
+ viewType = _useState4[0],
119
+ setViewType = _useState4[1];
120
+
121
+ var _useState5 = (0, _react.useState)(isSelfTenant() ? [{
122
+ label: /*#__PURE__*/_react["default"].createElement("p", {
123
+ className: "".concat(_precls.precls, "__view-tyoe-list-item")
124
+ }, /*#__PURE__*/_react["default"].createElement("span", {
125
+ className: "tu-icon-pc-card-s"
126
+ }), /*#__PURE__*/_react["default"].createElement("span", null, (0, _getLocale.getLocale)('Pro_Butt_Card'))),
127
+ value: 'card'
128
+ }, {
129
+ label: /*#__PURE__*/_react["default"].createElement("p", {
130
+ className: "".concat(_precls.precls, "__view-tyoe-list-item")
131
+ }, /*#__PURE__*/_react["default"].createElement("span", {
132
+ className: "tu-icon-pc-table-s"
133
+ }), /*#__PURE__*/_react["default"].createElement("span", null, (0, _getLocale.getLocale)('OKR_MyO_KRP_Table'))),
134
+ value: 'table'
135
+ }, {
136
+ label: /*#__PURE__*/_react["default"].createElement("p", {
137
+ className: "".concat(_precls.precls, "__view-tyoe-list-item")
138
+ }, /*#__PURE__*/_react["default"].createElement("span", {
139
+ className: "tu-icon-yangshi-ditu"
140
+ }), /*#__PURE__*/_react["default"].createElement("span", null, (0, _getLocale.getLocale)('OKR_MyO_Text_Alignment'))),
141
+ value: 'map'
142
+ }] : [{
143
+ label: /*#__PURE__*/_react["default"].createElement("p", {
144
+ className: "".concat(_precls.precls, "__view-tyoe-list-item")
145
+ }, /*#__PURE__*/_react["default"].createElement("span", {
146
+ className: "tu-icon-pc-card-s"
147
+ }), /*#__PURE__*/_react["default"].createElement("span", null, (0, _getLocale.getLocale)('Pro_Butt_Card'))),
148
+ value: 'card'
149
+ }, {
150
+ label: /*#__PURE__*/_react["default"].createElement("p", {
151
+ className: "".concat(_precls.precls, "__view-tyoe-list-item")
152
+ }, /*#__PURE__*/_react["default"].createElement("span", {
153
+ className: "tu-icon-yangshi-ditu"
154
+ }), /*#__PURE__*/_react["default"].createElement("span", null, (0, _getLocale.getLocale)('OKR_MyO_Text_Alignment'))),
155
+ value: 'map'
156
+ }]),
157
+ _useState6 = _slicedToArray(_useState5, 1),
158
+ viewTypeMenuData = _useState6[0];
159
+
160
+ var _useState7 = (0, _react.useState)(false),
161
+ _useState8 = _slicedToArray(_useState7, 2),
162
+ init = _useState8[0],
163
+ setInit = _useState8[1];
164
+
165
+ var _useState9 = (0, _react.useState)(),
166
+ _useState10 = _slicedToArray(_useState9, 2),
167
+ userInfo = _useState10[0],
168
+ setUserInfo = _useState10[1];
88
169
 
89
170
  (0, _react.useEffect)(function () {
90
171
  if (toUserId !== undefined || relationShip === 1) {
@@ -197,6 +278,16 @@ function Header(props, ref) {
197
278
  return null;
198
279
  };
199
280
 
281
+ var onChangeViewTypeHandler = (0, _react.useCallback)(function (type) {
282
+ if (type === ViewType.Map) {
283
+ gotoOkrMap();
284
+ return;
285
+ }
286
+
287
+ setViewType(type);
288
+ if (onChangeViewType) onChangeViewType(type);
289
+ }, [onChangeViewType]);
290
+ var viewInfo = viewConfig()[viewType];
200
291
  return /*#__PURE__*/_react["default"].createElement("div", {
201
292
  className: "".concat(_precls.precls, "__header")
202
293
  }, /*#__PURE__*/_react["default"].createElement("div", {
@@ -218,16 +309,22 @@ function Header(props, ref) {
218
309
  ref: createOkrRef,
219
310
  onFrontAddOKR: onFrontAddOKR
220
311
  })), /*#__PURE__*/_react["default"].createElement("div", {
221
- className: "".concat(_precls.precls, "__header-item"),
222
- onClick: gotoOkrMap
312
+ className: "".concat(_precls.precls, "__header-item")
313
+ }, /*#__PURE__*/_react["default"].createElement(_popupSelect["default"], {
314
+ menuData: viewTypeMenuData,
315
+ popupPlacement: "bottom",
316
+ action: "click",
317
+ onChange: onChangeViewTypeHandler
223
318
  }, /*#__PURE__*/_react["default"].createElement(_tooltip["default"], {
224
- overlay: (0, _getLocale.getLocale)('OKR_MyO_Text_Alignment'),
319
+ overlay: viewInfo.title,
225
320
  placement: "top"
226
321
  }, /*#__PURE__*/_react["default"].createElement("span", {
227
- className: "".concat(_precls.precls, "__header-icon")
322
+ className: "".concat(_precls.precls, "__header-icon--view-type")
228
323
  }, /*#__PURE__*/_react["default"].createElement("span", {
229
- className: "tu-icon-yangshi-ditu"
230
- }))))), /*#__PURE__*/_react["default"].createElement(_comments["default"], {
324
+ className: viewInfo.icon
325
+ }), /*#__PURE__*/_react["default"].createElement("span", {
326
+ className: "tu-icon-caret-down ".concat(_precls.precls, "__header-down-icon")
327
+ })))))), /*#__PURE__*/_react["default"].createElement(_comments["default"], {
231
328
  toUserId: toUserId,
232
329
  relation: relationShip,
233
330
  userInfo: userInfo
@@ -19,9 +19,11 @@ var _pagination = _interopRequireDefault(require("../../components/pagination"))
19
19
 
20
20
  var _dialog = _interopRequireDefault(require("../../components/dialog"));
21
21
 
22
+ var _okrExcel = _interopRequireDefault(require("../../components/okr-excel"));
23
+
22
24
  var _errorBoundary = _interopRequireDefault(require("../../components/error-boundary"));
23
25
 
24
- var _header = _interopRequireDefault(require("./header"));
26
+ var _header = _interopRequireWildcard(require("./header"));
25
27
 
26
28
  var _list = _interopRequireDefault(require("./list"));
27
29
 
@@ -61,12 +63,6 @@ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symb
61
63
 
62
64
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
63
65
 
64
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
65
-
66
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
67
-
68
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
69
-
70
66
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
71
67
 
72
68
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -79,6 +75,32 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
79
75
 
80
76
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
81
77
 
78
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
79
+
80
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
81
+
82
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
83
+
84
+ var cacheViewType = localStorage.getItem('cacheViewType');
85
+
86
+ function getOkrExcelData(okrData) {
87
+ var okrExcelData = [];
88
+ okrData.forEach(function (okrInfo) {
89
+ okrInfo.Krs.forEach(function (kr, i) {
90
+ var data = _objectSpread(_objectSpread({}, i === 0 ? okrInfo : {}), {}, {
91
+ feedId: okrInfo.feedId,
92
+ Kr: _objectSpread(_objectSpread({}, kr), {}, {
93
+ index: i
94
+ })
95
+ });
96
+
97
+ if (i === 0) data.rowSpan = okrInfo.Krs.length;
98
+ okrExcelData.push(data);
99
+ });
100
+ });
101
+ return okrExcelData;
102
+ }
103
+
82
104
  var NewOkrList = function NewOkrList(props) {
83
105
  var OkrListCmp = props.OkrListCmp,
84
106
  OkrCommunicationPush = props.OkrCommunicationPush,
@@ -89,7 +111,10 @@ var NewOkrList = function NewOkrList(props) {
89
111
  var formFieldValues = useLocalStorage.getItem("okr-filter-values") || {
90
112
  targetType: "",
91
113
  targetCategory: "",
92
- targetSort: ""
114
+ targetSort: "",
115
+ okrType: "",
116
+ okrClassify: "",
117
+ orderType: 0
93
118
  };
94
119
 
95
120
  var filterCycle = function () {
@@ -161,12 +186,17 @@ var NewOkrList = function NewOkrList(props) {
161
186
  isInit = _useState14[0],
162
187
  setIsInit = _useState14[1];
163
188
 
189
+ var _useState15 = (0, _react.useState)(cacheViewType || _header.ViewType.Card),
190
+ _useState16 = _slicedToArray(_useState15, 2),
191
+ viewType = _useState16[0],
192
+ setViewType = _useState16[1];
193
+
164
194
  var headerRef = (0, _react.useRef)();
165
195
 
166
- var _useState15 = (0, _react.useState)(false),
167
- _useState16 = _slicedToArray(_useState15, 2),
168
- casesVisible = _useState16[0],
169
- setCasesVisible = _useState16[1];
196
+ var _useState17 = (0, _react.useState)(false),
197
+ _useState18 = _slicedToArray(_useState17, 2),
198
+ casesVisible = _useState18[0],
199
+ setCasesVisible = _useState18[1];
170
200
 
171
201
  var routerData = (0, _tools.getQueryString)();
172
202
  var departmentName = routerData.departmentName,
@@ -233,8 +263,8 @@ var NewOkrList = function NewOkrList(props) {
233
263
  setLoading(true);
234
264
  recordVisitUser();
235
265
  (0, _requestApi.okrSearch)(params).then(function (res) {
236
- setOkrs(res.works || []);
237
- setTotal(res.total);
266
+ setOkrs(res && res.works || []);
267
+ setTotal(res && res.total || 0);
238
268
  setLoading(false);
239
269
  });
240
270
  };
@@ -312,6 +342,13 @@ var NewOkrList = function NewOkrList(props) {
312
342
  (0, _react.useEffect)(function () {
313
343
  getOkrs();
314
344
  }, [pageNum, pageSize, query]);
345
+ var onChangeViewTypeHandler = (0, _react.useCallback)(function (type) {
346
+ localStorage.setItem('cacheViewType', type);
347
+ setViewType(type);
348
+ }, []);
349
+ var okrExcelData = (0, _react.useMemo)(function () {
350
+ return getOkrExcelData(okrs);
351
+ }, [okrs]);
315
352
  return /*#__PURE__*/_react["default"].createElement(_context.Context.Provider, {
316
353
  value: _objectSpread({
317
354
  OkrCommunicationPush: OkrCommunicationPush,
@@ -326,10 +363,12 @@ var NewOkrList = function NewOkrList(props) {
326
363
  }, /*#__PURE__*/_react["default"].createElement(_header["default"], {
327
364
  onSearch: handleOnSearch,
328
365
  ref: headerRef,
329
- onFrontAddOKR: onFrontAddOKR
366
+ onFrontAddOKR: onFrontAddOKR,
367
+ onChangeViewType: onChangeViewTypeHandler,
368
+ viewType: viewType
330
369
  }), /*#__PURE__*/_react["default"].createElement(_loading["default"], {
331
370
  loading: loading
332
- }, okrs.length > 0 && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_list["default"], {
371
+ }, okrs.length > 0 && viewType === _header.ViewType.Card && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_list["default"], {
333
372
  OkrListCmp: OkrListCmp,
334
373
  okrs: okrs,
335
374
  setOkrs: setOkrs,
@@ -349,6 +388,18 @@ var NewOkrList = function NewOkrList(props) {
349
388
  pageSize: pageSize,
350
389
  current: pageNum,
351
390
  size: "sm"
391
+ }))), okrs.length > 0 && viewType === _header.ViewType.Table && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_okrExcel["default"], {
392
+ showCycle: query.cycleType === '-1',
393
+ data: okrExcelData,
394
+ onRefresh: getOkrs
395
+ }), /*#__PURE__*/_react["default"].createElement("div", {
396
+ className: "".concat(_precls.precls, "__pagination")
397
+ }, /*#__PURE__*/_react["default"].createElement(_pagination["default"], {
398
+ total: total,
399
+ onChange: handlePageChange,
400
+ pageSize: pageSize,
401
+ current: pageNum,
402
+ size: "sm"
352
403
  }))), okrs.length === 0 && /*#__PURE__*/_react["default"].createElement(Empty, {
353
404
  openCreate: function openCreate() {
354
405
  return openCreateModal();
@@ -41,11 +41,15 @@ function List(props) {
41
41
  var _useContext = (0, _react.useContext)(_context.Context),
42
42
  annualNum = _useContext.annualNum,
43
43
  cycleType = _useContext.cycleType,
44
- yqmNum = _useContext.yqmNum;
44
+ yqmNum = _useContext.yqmNum,
45
+ orderType = _useContext.orderType,
46
+ relation = _useContext.relation;
45
47
 
46
48
  return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(OkrListCmp, {
49
+ orderType: orderType,
47
50
  okrData: okrs,
48
51
  setData: setOkrs,
52
+ relation: relation,
49
53
  cycle: {
50
54
  annualNum: annualNum,
51
55
  cycleType: cycleType,
@@ -5,10 +5,16 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports["default"] = useQuery;
7
7
  exports.parseUrl = parseUrl;
8
+ exports.useDebounce = useDebounce;
9
+ exports.useDebounceFn = useDebounceFn;
8
10
  exports.useDebouncedEffect = useDebouncedEffect;
9
11
 
10
12
  var _react = require("react");
11
13
 
14
+ var _debounce = _interopRequireDefault(require("lodash/debounce"));
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
17
+
12
18
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
13
19
 
14
20
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -72,6 +78,58 @@ function useQuery(name) {
72
78
  return state;
73
79
  }
74
80
 
81
+ function useLatest(value) {
82
+ var ref = (0, _react.useRef)(value);
83
+ ref.current = value;
84
+ return ref;
85
+ }
86
+
87
+ var useUnmount = function useUnmount(fn) {
88
+ var fnRef = useLatest(fn);
89
+ (0, _react.useEffect)(function () {
90
+ return function () {
91
+ fnRef.current();
92
+ };
93
+ }, []);
94
+ };
95
+
96
+ function useDebounceFn(fn, options) {
97
+ var _options$wait;
98
+
99
+ var fnRef = useLatest(fn);
100
+ var wait = (_options$wait = options === null || options === void 0 ? void 0 : options.wait) !== null && _options$wait !== void 0 ? _options$wait : 1000;
101
+ var debounced = (0, _react.useMemo)(function () {
102
+ return (0, _debounce["default"])(function () {
103
+ return fnRef.current.apply(fnRef, arguments);
104
+ }, wait, options);
105
+ }, []);
106
+ useUnmount(function () {
107
+ debounced.cancel();
108
+ });
109
+ return {
110
+ run: debounced,
111
+ cancel: debounced.cancel,
112
+ flush: debounced.flush
113
+ };
114
+ }
115
+
116
+ function useDebounce(value, options) {
117
+ var _useState3 = (0, _react.useState)(value),
118
+ _useState4 = _slicedToArray(_useState3, 2),
119
+ debounced = _useState4[0],
120
+ setDebounced = _useState4[1];
121
+
122
+ var _useDebounceFn = useDebounceFn(function () {
123
+ setDebounced(value);
124
+ }, options),
125
+ run = _useDebounceFn.run;
126
+
127
+ (0, _react.useEffect)(function () {
128
+ run();
129
+ }, [value]);
130
+ return debounced;
131
+ }
132
+
75
133
  function useDebouncedEffect(fn, ms, deps) {
76
134
  (0, _react.useEffect)(function () {
77
135
  var clean = null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@titaui/pc",
3
- "version": "1.15.43",
3
+ "version": "1.15.44-beta.1",
4
4
  "nameCN": "",
5
5
  "description": "",
6
6
  "main": "lib/index.js",
@@ -75,6 +75,7 @@
75
75
  },
76
76
  "dependencies": {
77
77
  "@antv/g2plot": "2.4.8",
78
+ "@handsontable/react": "^12.1.2",
78
79
  "@juggle/resize-observer": "3.3.1",
79
80
  "@titaui/dagre": "0.8.8-pre",
80
81
  "@titaui/rc-tree2": "4.1.23",
@@ -86,6 +87,9 @@
86
87
  "@types/color": "3.0.3",
87
88
  "@types/prosemirror-commands": "1.0.4",
88
89
  "@types/prosemirror-schema-basic": "1.0.2",
90
+ "ag-grid-community": "^28.0.2",
91
+ "ag-grid-enterprise": "^28.0.2",
92
+ "ag-grid-react": "^28.0.0",
89
93
  "axios": "0.21.1",
90
94
  "bowser": "2.11.0",
91
95
  "can-use-dom": "0.1.0",
@@ -95,6 +99,7 @@
95
99
  "cos-js-sdk-v5": "1.3.3",
96
100
  "dayjs": "1.10.4",
97
101
  "easy-bem": "^1.1.1",
102
+ "handsontable": "^12.1.2",
98
103
  "html2canvas": "1.3.2",
99
104
  "less": "4.1.2",
100
105
  "less-loader": "6.0.0",