kts-component-invoice-operate 3.2.3 → 3.2.4

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 (54) hide show
  1. package/dist/Invoice/{ui/digtal/GoodsList.o/ui/AddRowButton → Invoice-digtal/_test/prefab}/index.d.ts +1 -0
  2. package/dist/Invoice/ui/digtal/GoodsList/hook/useRowSelection/index.d.ts +1 -1
  3. package/dist/index.esm.js +19 -4
  4. package/dist/index.js +19 -4
  5. package/package.json +1 -1
  6. package/src/Invoice/Invoice-digtal/_test/prefab/index.tsx +150 -0
  7. package/src/Invoice/Invoice-digtal/index.md +3 -0
  8. package/src/Invoice/ui/digtal/GoodsList/hook/useRowSelection/index.tsx +12 -2
  9. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +1 -0
  10. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +1 -0
  11. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useReselectInvoiceType/index.tsx +1 -0
  12. package/src/Invoice/ui/digtal/Stakeholder/index.tsx +5 -1
  13. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/autoFillFn/index.d.ts +0 -35
  14. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/index.d.ts +0 -3
  15. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/ItemNameInput/index.d.ts +0 -7
  16. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowEditButton/index.d.ts +0 -6
  17. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.d.ts +0 -4
  18. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.d.ts +0 -7
  19. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/useDelItem/index.d.ts +0 -7
  20. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.d.ts +0 -7
  21. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/index.d.ts +0 -7
  22. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowSaveButton/index.d.ts +0 -6
  23. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/TitleText/index.d.ts +0 -8
  24. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useDeduction/index.d.ts +0 -8
  25. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useOnRow/index.d.ts +0 -8
  26. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useRowSelection/index.d.ts +0 -8
  27. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useWindowClick/index.d.ts +0 -8
  28. package/dist/Invoice/ui/digtal/GoodsList.o/index.d.ts +0 -20
  29. package/dist/Invoice/ui/digtal/GoodsList.o/ui/TableRow/index.d.ts +0 -2
  30. package/dist/Invoice/ui/digtal/GoodsList.o/ui/TableVirtual/index.d.ts +0 -4
  31. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/autoFillFn/index.ts +0 -520
  32. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/index.tsx +0 -624
  33. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/ItemNameInput/index.less +0 -10
  34. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/ItemNameInput/index.tsx +0 -19
  35. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowEditButton/index.tsx +0 -30
  36. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +0 -43
  37. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +0 -76
  38. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +0 -41
  39. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +0 -34
  40. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/index.less +0 -13
  41. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/index.tsx +0 -98
  42. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/spot.svg +0 -1
  43. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowSaveButton/index.tsx +0 -14
  44. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/TitleText/index.tsx +0 -20
  45. package/src/Invoice/ui/digtal/GoodsList.o/hook/useDeduction/index.tsx +0 -24
  46. package/src/Invoice/ui/digtal/GoodsList.o/hook/useOnRow/index.tsx +0 -39
  47. package/src/Invoice/ui/digtal/GoodsList.o/hook/useRowSelection/index.tsx +0 -112
  48. package/src/Invoice/ui/digtal/GoodsList.o/hook/useWindowClick/index.tsx +0 -23
  49. package/src/Invoice/ui/digtal/GoodsList.o/index.less +0 -7
  50. package/src/Invoice/ui/digtal/GoodsList.o/index.tsx +0 -132
  51. package/src/Invoice/ui/digtal/GoodsList.o/ui/AddRowButton/index.tsx +0 -66
  52. package/src/Invoice/ui/digtal/GoodsList.o/ui/TableRow/index.tsx +0 -28
  53. package/src/Invoice/ui/digtal/GoodsList.o/ui/TableVirtual/index.less +0 -43
  54. package/src/Invoice/ui/digtal/GoodsList.o/ui/TableVirtual/index.tsx +0 -109
@@ -1,624 +0,0 @@
1
- import React from 'react';
2
- import { Form } from 'kts-components-antd-x3';
3
- import { AutoComplete, Select, Button, Input, Spin, Tooltip, InputProps } from 'kts-xui';
4
- // import { } from 'kts-components-antd-x3/lib/input';
5
- import { WrappedFormUtils } from 'kts-components-antd-x3/lib/form/Form';
6
- import { IGood } from '../../../../../InvoiceController';
7
- import Invoice from '../../../../..';
8
- // import RowMenu from './ui/RowMenu';
9
- import TitleText from './ui/TitleText';
10
- import ItemNameInput from './ui/ItemNameInput';
11
- import {
12
- onChangeQuantity,
13
- onChangePriceIncludeTax,
14
- onChangePriceExcludeTax,
15
- onChangeLineAmountIncludeTax,
16
- onChangeLineAmountExcludeTax,
17
- onChangeTaxRate,
18
- onChangeItemName,
19
- } from './autoFillFn';
20
- import { getItemNameWithShorthand } from '../../../../../tools/itemName';
21
-
22
- export default (form: WrappedFormUtils) => {
23
- const { getFieldDecorator, getFieldValue } = form;
24
-
25
- const controller = Invoice.useInvoiceController();
26
-
27
- /** 是否含税 */
28
- const isTaxIncluded = controller.useMemo(e => e.goodsListState.isTaxIncluded, []);
29
-
30
- /** 组件模式 */
31
- const model = controller.useMemo(e => e.model, []);
32
-
33
- /** 是否显示我方 */
34
- const isMyShow = controller.useMemo(e => e.goodsListState.isMyShow, []);
35
-
36
- /** 正在编辑的货物 */
37
- const editGood = controller.useMemo((e) => e.goodsListState.editGood, []);
38
-
39
- /** 搜索条件 */
40
- const searchValue = controller.useMemo((e) => e.goodsListState.searchValue, []);
41
-
42
- /** 税率列表 */
43
- const taxRateList = controller.useMemo((e) => e.goodsListState.taxRateList, []);
44
-
45
- /** 单位列表 */
46
- const unitList = controller.useMemo((e) => e.goodsListState.unitList, []);
47
-
48
- /** 商品表格补充配置 */
49
- const columnsReplenish = controller.useMemo((e) => e.goodsListState.columnsReplenish, []);
50
-
51
- /** 扣除额 */
52
- const deduction = controller.useMemo((e) => e.goodsListState.deduction, []);
53
-
54
- /** 计算中启动字段 */
55
- const changeField = controller.useMemo((e) => e.calculatingField, []);
56
-
57
- /** 计算中启动字段 */
58
- const setChangeField = React.useCallback((value: string) => controller.run(async s => { s.calculatingField = value }), []);
59
-
60
- const onNumberValueChange = React.useCallback((e) => {
61
- const value = e?.target?.value;
62
- if (value) {
63
- return value.replace(/[^0-9-\.]/g, '');
64
- }
65
- }, [])
66
-
67
- /** 获取补充校验规则 */
68
- const getReplenishRules = React.useCallback((id: string) => {
69
- return columnsReplenish[id] ? columnsReplenish[id].rules || [] : []
70
- }, [columnsReplenish])
71
-
72
- /** 金额整数位限制,不传默认9位 */
73
- const priceIntegerDigit = controller.useMemo((e) => e.priceIntegerDigit || 9, []);
74
-
75
- /** 表头 */
76
- const columns = React.useMemo(() => {
77
- return [
78
- {
79
- title: '序号',
80
- key: 'serialNo',
81
- dataIndex: 'serialNo',
82
- width: 70,
83
- render: (e: number) => <span style={{ padding: '0 10px' }}>{e}</span>,
84
- },
85
- {
86
- title: <TitleText required >项目名称</TitleText>,
87
- key: 'itemName',
88
- render: (_: string, record: IGood) => {
89
- if (editGood?.$index === record.$index) {
90
- return (
91
- <Form.Item>
92
- <div style={{ display: 'flex' }} >
93
- {getFieldDecorator('itemName', {
94
- initialValue: isMyShow ? record.itemNameSelf : record.itemName,
95
- rules: [
96
- ...getReplenishRules('itemName'),
97
- {
98
- validator: async (_, __, callback) => {
99
- await controller.wait();
100
- const value = controller.state.goodsListState.editGood;
101
- if (!value?.itemName && !value?.itemNameSelf) {
102
- callback('项目名称不能为空');
103
- } else {
104
- return;
105
- }
106
- }
107
- }
108
- ]
109
- })(
110
- <ItemNameInput
111
- shorthand={editGood.shorthand}
112
- onChange={() => {
113
- onChangeItemName(controller, form, record);
114
- }}
115
- />
116
- )}
117
- <div className="kts-invoice-operate-goods-list-able-list-itemName-import">
118
- {controller.getGoodsList && model !== 'readOnly' && (
119
- <Tooltip title="点击从商品管理中添加商品信息">
120
- <Button
121
- onClick={controller.pipeline(async s => { s.goodsListState.importGoods.isVisibleDrawer = true })}
122
- type="link"
123
- icon="plus-circle"
124
- />
125
- </Tooltip>
126
- )}
127
- </div>
128
- </div>
129
- </Form.Item>
130
- );
131
- } else {
132
- return (
133
- <MyItemNameDiv
134
- valueT={formatSearch(getItemNameWithShorthand({shorthand: record.shorthand, full: record.itemNameSelf || ''}), searchValue)}
135
- valueF={formatSearch(getItemNameWithShorthand({shorthand: record.shorthand, full: record.itemName || ''}), searchValue)}
136
- isMyShow={isMyShow}
137
- />
138
- )
139
- }
140
- },
141
- },
142
- {
143
- title: <TitleText rules={columnsReplenish['itemModelName']?.rules} >规格型号</TitleText>,
144
- key: 'itemModelName',
145
- width: 119,
146
- render: (_: string, record: IGood) => {
147
- if (editGood?.$index === record.$index) {
148
- return (
149
- <Form.Item>
150
- {getFieldDecorator('itemModelName', {
151
- initialValue: isMyShow ? editGood.itemModelNameSelf : editGood.itemModelName,
152
- rules: getReplenishRules('itemModelName'),
153
- })(
154
- <MyInput
155
- onChange={async () => {
156
- await controller.wait()
157
- const key = isMyShow ? 'itemModelNameSelf' : 'itemModelName';
158
- const value = {} as any;
159
- value[key] = form.getFieldsValue().itemModelName;
160
- controller.setEditGood(value);
161
- }}
162
- />,
163
- )}
164
- </Form.Item>
165
- );
166
- } else {
167
- return (
168
- <MyItemNameDiv
169
- valueT={formatSearch(record.itemModelNameSelf, searchValue)}
170
- valueF={formatSearch(record.itemModelName, searchValue)}
171
- isMyShow={isMyShow}
172
- />
173
- )
174
- }
175
- },
176
- },
177
- {
178
- title: <TitleText rules={columnsReplenish['unit']?.rules} >单位</TitleText>,
179
- key: 'unit',
180
- width: 70,
181
- render: (_: string, record: IGood) => {
182
- if (editGood?.$index === record.$index) {
183
- return (
184
- <Form.Item>
185
- {getFieldDecorator('unit', {
186
- initialValue: editGood.unit,
187
- rules: getReplenishRules('unit'),
188
- })(
189
- <AutoComplete
190
- style={{ width: '100%' }}
191
- dataSource={unitList}
192
- onChange={async () => {
193
- await controller.wait()
194
- // const key = isMyShow ? 'unit' : 'unitOther';
195
- // const value = {} as any;
196
- // value[key] = form.getFieldsValue().unit;
197
- controller.setEditGood({ unit: form.getFieldsValue().unit });
198
- }}
199
- />,
200
- )}
201
- </Form.Item>
202
- );
203
- } else {
204
- return <span style={{ padding: '0 10px' }}>{record.unit}</span>;
205
- }
206
- },
207
- },
208
- {
209
- title: <TitleText rules={columnsReplenish['quantity']?.rules} >数量</TitleText>,
210
- dataIndex: 'quantity',
211
- key: 'quantity',
212
- align: 'right',
213
- width: 149,
214
- render: (value: string, record: IGood) => {
215
- if (editGood?.$index === record.$index) {
216
- return (
217
- <Form.Item>
218
- {getFieldDecorator('quantity', {
219
- initialValue: editGood.quantity,
220
- getValueFromEvent: onNumberValueChange,
221
- rules: [
222
- ...getReplenishRules('quantity'),
223
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '数量必须为数字' },
224
- {
225
- validator: async (_, value, callback) => {
226
- await controller.wait();
227
- const isvalue = !!value || value === 0;
228
- const isPrice = !!getFieldValue(isTaxIncluded ? 'priceIncludeTax' : 'priceExcludeTax') || getFieldValue(isTaxIncluded ? 'priceIncludeTax' : 'priceExcludeTax') === 0;
229
- if (isvalue || isPrice === isvalue) return;
230
- callback('请输入数量');
231
- }
232
- }
233
- ],
234
- })(
235
- <MyInput
236
- style={{ textAlign: 'right' }}
237
- maxLength={16}
238
- loading={isCipher(changeField, "quantity")}
239
- onChange={async () => {
240
- setChangeField('quantity');
241
- await onChangeQuantity(controller, form, record);
242
- }}
243
- />,
244
- )}
245
- </Form.Item>
246
- );
247
- } else {
248
- return <span style={{ padding: '0 10px' }}>{value}</span>;
249
- }
250
- },
251
- },
252
- {
253
- title: <TitleText rules={columnsReplenish['priceIncludeTax']?.rules} >单价(含税)</TitleText>,
254
- dataIndex: 'priceIncludeTax',
255
- key: 'priceIncludeTax',
256
- align: 'right',
257
- width: 149,
258
- render: (value: string, record: IGood) => {
259
- if (editGood?.$index === record.$index) {
260
- return (
261
- <Form.Item>
262
- {getFieldDecorator('priceIncludeTax', {
263
- initialValue: editGood.priceIncludeTax,
264
- getValueFromEvent: onNumberValueChange,
265
- rules: [
266
- ...getReplenishRules('priceIncludeTax'),
267
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '单价必须为数字' },
268
- {
269
- validator: async (_, value, callback) => {
270
- await controller.wait();
271
- const isQuantity = !!getFieldValue('quantity') || getFieldValue('quantity') === 0;
272
- const isvalue = !!value || value === 0;
273
- if (isvalue || isQuantity === isvalue) return;
274
- callback('请输入单价');
275
- }
276
- }
277
- ],
278
- })(
279
- <MyInput
280
- style={{ textAlign: 'right' }}
281
- maxLength={16}
282
- loading={isCipher(changeField, 'priceIncludeTax')}
283
- onChange={() => {
284
- setChangeField('priceIncludeTax');
285
- onChangePriceIncludeTax(controller, form, record);
286
- }}
287
- />,
288
- )}
289
- </Form.Item>
290
- );
291
- } else {
292
- return <span style={{ padding: '0 10px' }}>{value}</span>;
293
- }
294
- },
295
- },
296
- {
297
- title: <TitleText rules={columnsReplenish['priceExcludeTax']?.rules} >单价(不含税)</TitleText>,
298
- dataIndex: 'priceExcludeTax',
299
- key: 'priceExcludeTax',
300
- align: 'right',
301
- width: 149,
302
- render: (value: string, record: IGood) => {
303
- if (editGood?.$index === record.$index) {
304
- return (
305
- <Form.Item>
306
- {getFieldDecorator('priceExcludeTax', {
307
- initialValue: editGood.priceExcludeTax,
308
- getValueFromEvent: onNumberValueChange,
309
- rules: [
310
- ...getReplenishRules('priceExcludeTax'),
311
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '单价必须为数字' },
312
- {
313
- validator: async (_, value, callback) => {
314
- await controller.wait();
315
- const isQuantity = !!getFieldValue('quantity') || getFieldValue('quantity') === 0;
316
- const isvalue = !!value || value === 0;
317
- if (isvalue || isQuantity === isvalue) return;
318
- callback('请输入单价');
319
- }
320
- }
321
- ],
322
- })(
323
- <MyInput
324
- style={{ textAlign: 'right' }}
325
- maxLength={16}
326
- loading={isCipher(changeField, 'priceExcludeTax')}
327
- onChange={() => {
328
- setChangeField('priceExcludeTax');
329
- onChangePriceExcludeTax(controller, form, record);
330
- }}
331
- />,
332
- )}
333
- </Form.Item>
334
- );
335
- } else {
336
- return <span style={{ padding: '0 10px' }}>{value}</span>;
337
- }
338
- },
339
- },
340
- {
341
- title: <TitleText required >金额(含税)</TitleText>,
342
- dataIndex: 'lineAmountIncludeTax',
343
- key: 'lineAmountIncludeTax',
344
- width: 119,
345
- align: 'right',
346
- render: (value: string, record: IGood) => {
347
- if (editGood?.$index === record.$index) {
348
- return (
349
- <Form.Item>
350
- {getFieldDecorator('lineAmountIncludeTax', {
351
- initialValue: editGood.lineAmountIncludeTax,
352
- getValueFromEvent: onNumberValueChange,
353
- rules: [
354
- ...getReplenishRules('lineAmountIncludeTax'),
355
- { required: true, message: '金额不能为空' },
356
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '金额必须为数字' },
357
- {
358
- validator: async (_, value, callback) => {
359
- if (`${value}`.split('.')[0].length > priceIntegerDigit) {
360
- callback(`金额整数部分不能大于${priceIntegerDigit}位,小数点后最多2位`);
361
- }
362
- }
363
- },
364
- {
365
- validator: async (_, value, callback) => {
366
- if (deduction && parseFloat(value) <= deduction) {
367
- callback('扣除额不能大于等于价税合计');
368
- }
369
- }
370
- },
371
- ],
372
- })(
373
- <MyInput
374
- style={{ textAlign: 'right' }}
375
- loading={isCipher(changeField, 'lineAmountIncludeTax')}
376
- onChange={() => {
377
- setChangeField('lineAmountIncludeTax');
378
- onChangeLineAmountIncludeTax(controller, form, record);
379
- }}
380
- />,
381
- )}
382
- </Form.Item>
383
- );
384
- } else {
385
- return <span style={{ padding: '0 10px' }}>{formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
386
- }
387
- },
388
- },
389
- {
390
- title: <TitleText required >金额(不含税)</TitleText>,
391
- dataIndex: 'lineAmountExcludeTax',
392
- key: 'lineAmountExcludeTax',
393
- align: 'right',
394
- width: 119,
395
- render: (value: string, record: IGood) => {
396
- if (editGood?.$index === record.$index) {
397
- return (
398
- <Form.Item>
399
- {getFieldDecorator('lineAmountExcludeTax', {
400
- initialValue: editGood.lineAmountExcludeTax,
401
- getValueFromEvent: onNumberValueChange,
402
- rules: [
403
- ...getReplenishRules('lineAmountExcludeTax'),
404
- { required: true, message: '金额不能为空' },
405
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: '金额必须为数字' },
406
- {
407
- validator: async (_, value: string, callback) => {
408
- if (`${value}`.split('.')[0].length > priceIntegerDigit) {
409
- callback(`金额整数部分不能大于${priceIntegerDigit}位,小数点后最多2位`);
410
- }
411
- }
412
- },
413
- ],
414
- })(
415
- <MyInput
416
- style={{ textAlign: 'right' }}
417
- loading={isCipher(changeField, 'lineAmountExcludeTax')}
418
- onChange={() => {
419
- setChangeField('lineAmountExcludeTax');
420
- onChangeLineAmountExcludeTax(controller, form, record);
421
- }}
422
- />,
423
- )}
424
- </Form.Item>
425
- );
426
- } else {
427
- return <span style={{ padding: '0 10px' }}>{formatSearch(parseFloat(value).toFixed(2), searchValue)}</span>;
428
- }
429
- },
430
- },
431
- {
432
- title: <TitleText required >税率%</TitleText>,
433
- dataIndex: 'taxRate',
434
- key: 'taxRate',
435
- align: 'right',
436
- width: 90,
437
- render: (value: string, record: IGood) => {
438
- if (editGood?.$index === record.$index) {
439
- return (
440
- <Form.Item>
441
- {getFieldDecorator('taxRate', {
442
- initialValue: editGood.taxRate,
443
- rules: [
444
- ...getReplenishRules('taxRate'),
445
- { required: true, message: ' ' },
446
- { pattern: /^[+-]?(0|([1-9]\d*))(\.\d+)?$/, message: ' ' },
447
- ],
448
- })(
449
- <Select
450
- className="kts-invoice-operate-goods-list-table-tax-rate"
451
- // dropdownMenuStyle={{ textAlign: "right" }}
452
- showArrow={false}
453
- style={{ width: '100%' }}
454
- onChange={() => {
455
- setChangeField('taxRate');
456
- onChangeTaxRate(controller, form, record);
457
- }}
458
- >
459
- {taxRateList.map((e, i) => {
460
- return (
461
- <Select.Option key={i} value={e}>
462
- {e}%
463
- </Select.Option>
464
- );
465
- })}
466
- </Select>,
467
- )}
468
- </Form.Item>
469
- );
470
- } else {
471
- return <span style={{ padding: '0 10px' }}>{value}%</span>;
472
- }
473
- },
474
- },
475
- {
476
- title: <TitleText rules={columnsReplenish['taxAmount']?.rules} >税额</TitleText>,
477
- dataIndex: 'taxAmount',
478
- key: 'taxAmount',
479
- align: 'right',
480
- width: 119,
481
- render: (value: string, record: IGood) => {
482
- if (editGood?.$index === record.$index) {
483
- return getFieldDecorator('taxAmount', {
484
- initialValue: editGood.taxAmount,
485
- rules: getReplenishRules('taxAmount'),
486
- })(<MyDiv loading={isCipher(changeField, 'taxAmount')} />);
487
- } else {
488
- return <span style={{ padding: '0 10px' }}>{parseFloat(value).toFixed(2)}</span>;
489
- }
490
- },
491
- },
492
- // {
493
- // title: '操作',
494
- // key: 'operating',
495
- // align: 'right',
496
- // width: 130,
497
- // fixed: 'right',
498
- // render: (_value: string, record: IGood) => <RowMenu key={record.lineAttribute} goods={record} />,
499
- // },
500
- ]
501
- // 含税不含税
502
- .filter((e) => {
503
- if (isTaxIncluded) {
504
- return !(e.key === 'priceExcludeTax' || e.key === 'lineAmountExcludeTax');
505
- } else {
506
- return !(e.key === 'priceIncludeTax' || e.key === 'lineAmountIncludeTax');
507
- }
508
- })
509
- // 只读
510
- .filter(e => {
511
- if (model === 'readOnly') {
512
- return e.key !== 'operating';
513
- } else {
514
- return true;
515
- }
516
- })
517
- .map((e) => {
518
- return {
519
- ...e,
520
- ellipsis: true,
521
- };
522
- }) as any[];
523
- }, [isTaxIncluded, editGood, controller, changeField, deduction, isMyShow, searchValue, model, columnsReplenish]);
524
-
525
- // React.useEffect(() => {
526
- // clearTimeout(t)
527
- // const t = setTimeout(() => { setChangeField('') }, 1000);
528
- // return () => { clearTimeout(t) }
529
- // }, [changeField]);
530
-
531
- return columns;
532
- };
533
-
534
- /** 字段 */
535
- function isCipher(name?: string, field?: string) {
536
- if (!name || !field) return false;
537
- return name !== field;
538
- }
539
-
540
- class MyInput extends React.Component<InputProps & { loading?: boolean }> {
541
- render() {
542
- if (this.props.loading) {
543
- return (
544
- <Spin size="small">
545
- <Input {...this.props} autoComplete="off" />
546
- </Spin>
547
- )
548
- } else {
549
- return (
550
- <Input {...this.props} autoComplete="off" />
551
- )
552
- }
553
- }
554
- }
555
-
556
- class MyDiv extends React.Component<{ value?: any, loading?: boolean }> {
557
-
558
- render() {
559
- if (this.props.loading) {
560
- return (
561
- <Spin size="small">
562
- <span style={{ padding: '0 10px' }}>{this.props.value}</span>
563
- </Spin>
564
- )
565
- } else {
566
- return <span style={{ padding: '0 10px' }}>{this.props.value}</span>
567
- }
568
- }
569
- }
570
-
571
- class MyItemNameDiv extends React.Component<{ valueT?: React.ReactNode, valueF?: React.ReactNode, isMyShow: boolean }> {
572
- render(): React.ReactNode {
573
-
574
- const { isMyShow, valueT, valueF } = this.props;
575
-
576
- if (isMyShow) {
577
- if (valueT) {
578
- return (
579
- <Tooltip title={valueT}>
580
- <span style={{ padding: '0 10px', color: '#0074ff' }}>{valueT}</span>
581
- </Tooltip>
582
- )
583
- } else {
584
- return (
585
- <Tooltip title={valueF}>
586
- <span style={{ padding: '0 10px' }}>{valueF}</span>
587
- </Tooltip>
588
- )
589
- }
590
- } else {
591
- if (valueF) {
592
- return (
593
- <Tooltip title={valueF}>
594
- <span style={{ padding: '0 10px' }}>{valueF}</span>
595
- </Tooltip>
596
- )
597
- } else {
598
- return (
599
- <Tooltip title={valueT}>
600
- <span style={{ padding: '0 10px', color: '#0074ff' }}>{valueT}</span>
601
- </Tooltip>
602
- )
603
- }
604
- }
605
- }
606
- }
607
-
608
- /** 格式搜索结果 */
609
- function formatSearch(value?: string, search?: string) {
610
- if (!value || !search) return value;
611
-
612
- const __html = ucoding(value).split(new RegExp(ucoding(search), 'g')).map(e => dcoding(e)).join(`<span class="kts-invoice-operate-goods-list-table-search-protrude" >${search}</span>`);
613
- return <span dangerouslySetInnerHTML={{ __html }} />
614
- }
615
-
616
- /** 编码 */
617
- function ucoding(v: string): string {
618
- return v.split('').map(e => `U${e.charCodeAt(0)}E`).join('');
619
- }
620
-
621
- /** 解码 */
622
- function dcoding(v: string): string {
623
- return v.split('U').map(e => e ? String.fromCharCode(parseInt(e.replace('E', ''))) : '').join('');
624
- }
@@ -1,10 +0,0 @@
1
- .kts-invoice-operate-goods-list-itemName-input {
2
- display : flex;
3
- flex : 1;
4
- padding-left: 10px;
5
- height : 31px;
6
- }
7
-
8
- .has-error .kts-invoice-operate-goods-list-itemName-input{
9
- border: 1px solid #f5222d;
10
- }
@@ -1,19 +0,0 @@
1
-
2
- import { Input } from 'kts-xui';
3
- import React, { ChangeEvent } from 'react';
4
- import './index.less';
5
-
6
- export default function ItemNameInput(props: { onChange?: (e: ChangeEvent<HTMLInputElement>) => void, value?: string, shorthand?: string }) {
7
-
8
- const onChange = React.useCallback((e: ChangeEvent<HTMLInputElement>) => {
9
- const event = { ...e };
10
- props.onChange && props.onChange(event);
11
- }, [])
12
-
13
- return (
14
- <div className='kts-invoice-operate-goods-list-itemName-input'>
15
- {props.shorthand && <span style={{ alignSelf: 'center', fontSize: 12 }} >*{props.shorthand}*</span>}
16
- <Input style={{ height: '100%' }} value={props.value} onChange={onChange} />
17
- </div>
18
- )
19
- }
@@ -1,30 +0,0 @@
1
- import React from 'react';
2
- import { Button, message } from 'kts-components-antd-x3';
3
- import Invoice from '../../../../../../';
4
- import { IGood } from '../../../../../../InvoiceController';
5
- import LineAttributeType from '../../../../../../InvoiceController/InvoiceControllerState/GoodsListState/LineAttributeType';
6
-
7
- export default (props: { goods: IGood }) => {
8
- const { goods } = props;
9
-
10
- const controller = Invoice.useInvoiceController();
11
-
12
- const editGood = controller.useMemo((s) => s.goodsListState.editGood, []);
13
-
14
- const onClick = React.useCallback(() => {
15
- if (editGood) {
16
- message.error({
17
- content: '你正在编辑一个货物',
18
- key: '你正在编辑一个货物',
19
- });
20
- return;
21
- }
22
- controller.setEditGood(goods);
23
- }, [controller, goods, editGood]);
24
-
25
- if (goods.lineAttribute !== LineAttributeType.正常) {
26
- return <></>;
27
- } else {
28
- return <Button type="link" icon="edit" onClick={onClick} />;
29
- }
30
- };