kts-component-invoice-operate 3.2.3 → 3.2.5

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 (67) 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 +29 -8
  4. package/dist/index.js +29 -8
  5. package/docs-dist/404.html +33 -0
  6. package/docs-dist/index.html +33 -0
  7. package/docs-dist/static/add.a70623b4.svg +12 -0
  8. package/docs-dist/static/arrowDown.a1cbf0d8.svg +3 -0
  9. package/docs-dist/static/arrowUp.4c482054.svg +3 -0
  10. package/docs-dist/static/auto.a6cd905c.svg +1 -0
  11. package/docs-dist/static/fork.5431267d.svg +12 -0
  12. package/docs-dist/static/magnifier.2b26be6e.svg +1 -0
  13. package/docs-dist/static/plus.4fd1af30.svg +12 -0
  14. package/docs-dist/umi.css +20 -0
  15. package/docs-dist/umi.js +1 -0
  16. package/package.json +1 -1
  17. package/src/Invoice/Invoice-digtal/_test/prefab/index.tsx +150 -0
  18. package/src/Invoice/Invoice-digtal/index.md +3 -0
  19. package/src/Invoice/ui/digtal/GoodsList/hook/useRowSelection/index.tsx +12 -2
  20. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useAddDiscountRowButton/index.tsx +1 -0
  21. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useEmptyRefill/index.tsx +1 -0
  22. package/src/Invoice/ui/digtal/GoodsList/ui/BulkMenu/hooks/useReselectInvoiceType/index.tsx +1 -0
  23. package/src/Invoice/ui/digtal/Stakeholder/index.tsx +5 -1
  24. package/src/InvoiceTypeModal/dist/index.js +92 -0
  25. package/src/InvoiceTypeModal/index.tsx +8 -2
  26. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/autoFillFn/index.d.ts +0 -35
  27. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/index.d.ts +0 -3
  28. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/ItemNameInput/index.d.ts +0 -7
  29. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowEditButton/index.d.ts +0 -6
  30. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.d.ts +0 -4
  31. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.d.ts +0 -7
  32. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/useDelItem/index.d.ts +0 -7
  33. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.d.ts +0 -7
  34. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/index.d.ts +0 -7
  35. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowSaveButton/index.d.ts +0 -6
  36. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/TitleText/index.d.ts +0 -8
  37. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useDeduction/index.d.ts +0 -8
  38. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useOnRow/index.d.ts +0 -8
  39. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useRowSelection/index.d.ts +0 -8
  40. package/dist/Invoice/ui/digtal/GoodsList.o/hook/useWindowClick/index.d.ts +0 -8
  41. package/dist/Invoice/ui/digtal/GoodsList.o/index.d.ts +0 -20
  42. package/dist/Invoice/ui/digtal/GoodsList.o/ui/TableRow/index.d.ts +0 -2
  43. package/dist/Invoice/ui/digtal/GoodsList.o/ui/TableVirtual/index.d.ts +0 -4
  44. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/autoFillFn/index.ts +0 -520
  45. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/index.tsx +0 -624
  46. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/ItemNameInput/index.less +0 -10
  47. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/ItemNameInput/index.tsx +0 -19
  48. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowEditButton/index.tsx +0 -30
  49. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/_useAddComparison/index.tsx +0 -43
  50. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/useAddDiscount/index.tsx +0 -76
  51. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/useDelItem/index.tsx +0 -41
  52. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/hook/useEndowCode/index.tsx +0 -34
  53. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/index.less +0 -13
  54. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/index.tsx +0 -98
  55. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowSaveButton/index.tsx +0 -14
  56. package/src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/TitleText/index.tsx +0 -20
  57. package/src/Invoice/ui/digtal/GoodsList.o/hook/useDeduction/index.tsx +0 -24
  58. package/src/Invoice/ui/digtal/GoodsList.o/hook/useOnRow/index.tsx +0 -39
  59. package/src/Invoice/ui/digtal/GoodsList.o/hook/useRowSelection/index.tsx +0 -112
  60. package/src/Invoice/ui/digtal/GoodsList.o/hook/useWindowClick/index.tsx +0 -23
  61. package/src/Invoice/ui/digtal/GoodsList.o/index.less +0 -7
  62. package/src/Invoice/ui/digtal/GoodsList.o/index.tsx +0 -132
  63. package/src/Invoice/ui/digtal/GoodsList.o/ui/AddRowButton/index.tsx +0 -66
  64. package/src/Invoice/ui/digtal/GoodsList.o/ui/TableRow/index.tsx +0 -28
  65. package/src/Invoice/ui/digtal/GoodsList.o/ui/TableVirtual/index.less +0 -43
  66. package/src/Invoice/ui/digtal/GoodsList.o/ui/TableVirtual/index.tsx +0 -109
  67. /package/{src/Invoice/ui/digtal/GoodsList.o/hook/useColumns/ui/RowMenu/spot.svg → docs-dist/static/spot.42e620e1.svg} +0 -0
@@ -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
- };