ll-plus 2.6.17 → 2.6.18

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 (118) hide show
  1. package/es/components/advanced-filtering/index.d.ts +388 -0
  2. package/es/components/advanced-filtering/src/advanced-filtering.vue.d.ts +194 -0
  3. package/es/components/advanced-filtering/src/components/advanced-filtering-params.vue.d.ts +194 -0
  4. package/es/components/cropper/index.d.ts +19 -0
  5. package/es/components/cropper/src/cropper-image.d.ts +2 -0
  6. package/es/components/cropper/src/cropper-image.vue.d.ts +6 -0
  7. package/es/components/cropper/src/cropper-modal.vue.d.ts +13 -0
  8. package/es/components/form/index.d.ts +197 -0
  9. package/es/components/form/src/components/form-component.vue.d.ts +3 -0
  10. package/es/components/form/src/config/form.d.ts +3 -0
  11. package/es/components/form/src/form.vue.d.ts +194 -0
  12. package/es/components/icon-picker/index.d.ts +4 -0
  13. package/es/components/icon-picker/src/components/modal.vue.d.ts +4 -0
  14. package/es/components/icon-picker/src/icon-picker.vue.d.ts +4 -0
  15. package/es/components/input/index.d.ts +2 -0
  16. package/es/components/input/src/input.vue.d.ts +2 -0
  17. package/es/components/input-number/index.d.ts +2 -0
  18. package/es/components/input-number/src/input-number.vue.d.ts +2 -0
  19. package/es/components/key-value/index.d.ts +1493 -338
  20. package/es/components/key-value/src/components/key-value-item.vue.d.ts +385 -0
  21. package/es/components/key-value/src/key-value.vue.d.ts +1493 -338
  22. package/es/components/number-range/index.d.ts +2 -0
  23. package/es/components/number-range/src/number-range.vue.d.ts +2 -0
  24. package/es/packages/components/cropper/src/cropper-image.mjs +8 -0
  25. package/es/packages/components/cropper/src/cropper-image.mjs.map +1 -1
  26. package/es/packages/components/cropper/src/cropper-image.vue2.mjs +43 -22
  27. package/es/packages/components/cropper/src/cropper-image.vue2.mjs.map +1 -1
  28. package/es/packages/components/cropper/src/cropper-modal.vue2.mjs +108 -72
  29. package/es/packages/components/cropper/src/cropper-modal.vue2.mjs.map +1 -1
  30. package/es/packages/components/form/src/components/form-component.vue2.mjs +19 -2
  31. package/es/packages/components/form/src/components/form-component.vue2.mjs.map +1 -1
  32. package/es/packages/components/form/src/config/form.mjs +21 -0
  33. package/es/packages/components/form/src/config/form.mjs.map +1 -1
  34. package/es/packages/components/form/src/form.vue2.mjs +56 -5
  35. package/es/packages/components/form/src/form.vue2.mjs.map +1 -1
  36. package/es/packages/components/icon-picker/src/components/modal.vue2.mjs +97 -76
  37. package/es/packages/components/icon-picker/src/components/modal.vue2.mjs.map +1 -1
  38. package/es/packages/components/input/src/input.vue2.mjs +8 -1
  39. package/es/packages/components/input/src/input.vue2.mjs.map +1 -1
  40. package/es/packages/components/input-number/src/input-number.vue2.mjs +8 -1
  41. package/es/packages/components/input-number/src/input-number.vue2.mjs.map +1 -1
  42. package/es/packages/components/key-value/src/config/key-value.mjs +2 -2
  43. package/es/packages/components/key-value/src/config/key-value.mjs.map +1 -1
  44. package/index.full.js +362 -175
  45. package/index.full.min.js +17 -17
  46. package/index.full.min.js.map +1 -1
  47. package/index.full.min.mjs +21 -21
  48. package/index.full.min.mjs.map +1 -1
  49. package/index.full.mjs +362 -175
  50. package/lib/components/advanced-filtering/index.d.ts +388 -0
  51. package/lib/components/advanced-filtering/src/advanced-filtering.vue.d.ts +194 -0
  52. package/lib/components/advanced-filtering/src/components/advanced-filtering-params.vue.d.ts +194 -0
  53. package/lib/components/cropper/index.d.ts +19 -0
  54. package/lib/components/cropper/src/cropper-image.d.ts +2 -0
  55. package/lib/components/cropper/src/cropper-image.vue.d.ts +6 -0
  56. package/lib/components/cropper/src/cropper-modal.vue.d.ts +13 -0
  57. package/lib/components/form/index.d.ts +197 -0
  58. package/lib/components/form/src/components/form-component.vue.d.ts +3 -0
  59. package/lib/components/form/src/config/form.d.ts +3 -0
  60. package/lib/components/form/src/form.vue.d.ts +194 -0
  61. package/lib/components/icon-picker/index.d.ts +4 -0
  62. package/lib/components/icon-picker/src/components/modal.vue.d.ts +4 -0
  63. package/lib/components/icon-picker/src/icon-picker.vue.d.ts +4 -0
  64. package/lib/components/input/index.d.ts +2 -0
  65. package/lib/components/input/src/input.vue.d.ts +2 -0
  66. package/lib/components/input-number/index.d.ts +2 -0
  67. package/lib/components/input-number/src/input-number.vue.d.ts +2 -0
  68. package/lib/components/key-value/index.d.ts +1493 -338
  69. package/lib/components/key-value/src/components/key-value-item.vue.d.ts +385 -0
  70. package/lib/components/key-value/src/key-value.vue.d.ts +1493 -338
  71. package/lib/components/number-range/index.d.ts +2 -0
  72. package/lib/components/number-range/src/number-range.vue.d.ts +2 -0
  73. package/lib/packages/components/cropper/src/cropper-image.js +8 -0
  74. package/lib/packages/components/cropper/src/cropper-image.js.map +1 -1
  75. package/lib/packages/components/cropper/src/cropper-image.vue2.js +42 -21
  76. package/lib/packages/components/cropper/src/cropper-image.vue2.js.map +1 -1
  77. package/lib/packages/components/cropper/src/cropper-modal.vue2.js +107 -71
  78. package/lib/packages/components/cropper/src/cropper-modal.vue2.js.map +1 -1
  79. package/lib/packages/components/form/src/components/form-component.vue2.js +18 -1
  80. package/lib/packages/components/form/src/components/form-component.vue2.js.map +1 -1
  81. package/lib/packages/components/form/src/config/form.js +21 -0
  82. package/lib/packages/components/form/src/config/form.js.map +1 -1
  83. package/lib/packages/components/form/src/form.vue2.js +54 -3
  84. package/lib/packages/components/form/src/form.vue2.js.map +1 -1
  85. package/lib/packages/components/icon-picker/src/components/modal.vue2.js +96 -75
  86. package/lib/packages/components/icon-picker/src/components/modal.vue2.js.map +1 -1
  87. package/lib/packages/components/input/src/input.vue2.js +8 -1
  88. package/lib/packages/components/input/src/input.vue2.js.map +1 -1
  89. package/lib/packages/components/input-number/src/input-number.vue2.js +8 -1
  90. package/lib/packages/components/input-number/src/input-number.vue2.js.map +1 -1
  91. package/lib/packages/components/key-value/src/config/key-value.js +2 -2
  92. package/lib/packages/components/key-value/src/config/key-value.js.map +1 -1
  93. package/package.json +1 -1
  94. package/theme-chalk/css/icon-picker.css +1 -1
  95. package/theme-chalk/css/index.css +1 -1
  96. package/types/packages/components/advanced-filtering/index.d.ts +388 -0
  97. package/types/packages/components/advanced-filtering/src/advanced-filtering.vue.d.ts +194 -0
  98. package/types/packages/components/advanced-filtering/src/components/advanced-filtering-params.vue.d.ts +194 -0
  99. package/types/packages/components/cropper/index.d.ts +19 -0
  100. package/types/packages/components/cropper/src/cropper-image.d.ts +2 -0
  101. package/types/packages/components/cropper/src/cropper-image.vue.d.ts +6 -0
  102. package/types/packages/components/cropper/src/cropper-modal.vue.d.ts +13 -0
  103. package/types/packages/components/form/index.d.ts +197 -0
  104. package/types/packages/components/form/src/components/form-component.vue.d.ts +3 -0
  105. package/types/packages/components/form/src/config/form.d.ts +3 -0
  106. package/types/packages/components/form/src/form.vue.d.ts +194 -0
  107. package/types/packages/components/icon-picker/index.d.ts +4 -0
  108. package/types/packages/components/icon-picker/src/components/modal.vue.d.ts +4 -0
  109. package/types/packages/components/icon-picker/src/icon-picker.vue.d.ts +4 -0
  110. package/types/packages/components/input/index.d.ts +2 -0
  111. package/types/packages/components/input/src/input.vue.d.ts +2 -0
  112. package/types/packages/components/input-number/index.d.ts +2 -0
  113. package/types/packages/components/input-number/src/input-number.vue.d.ts +2 -0
  114. package/types/packages/components/key-value/index.d.ts +1493 -338
  115. package/types/packages/components/key-value/src/components/key-value-item.vue.d.ts +385 -0
  116. package/types/packages/components/key-value/src/key-value.vue.d.ts +1493 -338
  117. package/types/packages/components/number-range/index.d.ts +2 -0
  118. package/types/packages/components/number-range/src/number-range.vue.d.ts +2 -0
@@ -71,6 +71,7 @@ export declare const LlNumberRange: import("ll-plus/es/utils").SFCWithInstall<im
71
71
  [x: string]: unknown;
72
72
  };
73
73
  innerValue: import("vue").Ref<string>;
74
+ inputRef: import("vue").Ref<any>;
74
75
  integerCongfig: import("vue").ComputedRef<import("../input-number/src/config").Integer>;
75
76
  getBindValue: import("vue").ComputedRef<Partial<import("vue").ExtractPropTypes<{
76
77
  size: {
@@ -198,6 +199,7 @@ export declare const LlNumberRange: import("ll-plus/es/utils").SFCWithInstall<im
198
199
  getChineseName: import("vue").ComputedRef<string>;
199
200
  setValue: (value: any) => void;
200
201
  onChange: (value: any) => void;
202
+ focus: () => void;
201
203
  readonly InputNumber: {
202
204
  new (...args: any[]): import("@vue/runtime-core").CreateComponentPublicInstance<Readonly<import("vue").ExtractPropTypes<{
203
205
  size: {
@@ -70,6 +70,7 @@ declare const _default: import("vue").DefineComponent<{
70
70
  [x: string]: unknown;
71
71
  };
72
72
  innerValue: import("vue").Ref<string>;
73
+ inputRef: import("vue").Ref<any>;
73
74
  integerCongfig: import("vue").ComputedRef<import("../../input-number/src/config").Integer>;
74
75
  getBindValue: import("vue").ComputedRef<Partial<import("vue").ExtractPropTypes<{
75
76
  size: {
@@ -197,6 +198,7 @@ declare const _default: import("vue").DefineComponent<{
197
198
  getChineseName: import("vue").ComputedRef<string>;
198
199
  setValue: (value: any) => void;
199
200
  onChange: (value: any) => void;
201
+ focus: () => void;
200
202
  readonly InputNumber: {
201
203
  new (...args: any[]): import("vue").CreateComponentPublicInstance<Readonly<import("vue").ExtractPropTypes<{
202
204
  size: {
@@ -38,6 +38,10 @@ const cropperImageProps = runtime.buildProps({
38
38
  type: Boolean,
39
39
  default: false
40
40
  },
41
+ loading: {
42
+ type: Boolean,
43
+ default: false
44
+ },
41
45
  realTimePreview: {
42
46
  type: Boolean,
43
47
  default: true
@@ -75,6 +79,10 @@ const cropperModalProps = runtime.buildProps({
75
79
  type: Boolean,
76
80
  default: false
77
81
  },
82
+ loading: {
83
+ type: Boolean,
84
+ default: false
85
+ },
78
86
  avatar: {
79
87
  type: String,
80
88
  default: ""
@@ -1 +1 @@
1
- {"version":3,"file":"cropper-image.js","sources":["../../../../../../packages/components/cropper/src/cropper-image.ts"],"sourcesContent":["import { buildProps, definePropType } from '@ll-plus/utils'\n\nimport type { ExtractPropTypes, CSSProperties } from 'vue'\nimport type Cropper from 'cropperjs'\nimport type CropperImage from './cropper-image.vue'\nimport type CropperModal from './cropper-modal.vue'\n\nexport interface CropendResult {\n imgBase64: string\n imgInfo: Cropper.Data\n}\n\nexport const defaultCropperOptions: Cropper.Options = {\n aspectRatio: 1,\n zoomable: true,\n zoomOnTouch: true,\n zoomOnWheel: true,\n cropBoxMovable: true,\n cropBoxResizable: true,\n toggleDragModeOnDblclick: true,\n autoCrop: true,\n background: true,\n highlight: true,\n center: true,\n responsive: true,\n restore: true,\n checkCrossOrigin: true,\n checkOrientation: true,\n scalable: true,\n modal: true,\n guides: true,\n movable: true,\n rotatable: true\n}\n\nexport const cropperImageProps = buildProps({\n src: {\n type: String,\n required: true\n },\n alt: {\n type: String\n },\n circled: {\n type: Boolean,\n default: false\n },\n realTimePreview: {\n type: Boolean,\n default: true\n },\n height: {\n type: [String, Number],\n default: '360px'\n },\n crossorigin: {\n type: definePropType<'' | 'anonymous' | 'use-credentials' | undefined>(\n String\n ),\n default: undefined\n },\n imageStyle: {\n type: definePropType<CSSProperties>(Object),\n default: () => ({})\n },\n options: {\n type: definePropType<Cropper.Options>(Object),\n default: () => ({})\n }\n} as const)\n\nexport const cropperImageEmits = {\n cropend: (params: CropendResult) => !!params,\n onReady: (cropper: Cropper) => !!cropper,\n cropendError: () => true\n} as const\n\nexport const cropperModalProps = buildProps({\n circled: {\n type: Boolean,\n default: true\n },\n disabled: {\n type: Boolean,\n default: false\n },\n avatar: {\n type: String,\n default: ''\n },\n avatarSize: {\n type: [String, Number],\n default: 64\n },\n avatarType: {\n type: definePropType<'square' | 'circle'>(String),\n default: () => 'circle'\n },\n title: {\n type: String,\n default: '图片裁剪'\n },\n width: {\n type: [String, Number],\n default: '800px'\n }\n} as const)\n\nexport const cropperModalEmits = {\n confirm: (params: { blob: Blob; previewSource: string }) => !!params\n} as const\n\n// props\nexport type CropperImageProps = ExtractPropTypes<typeof cropperImageProps>\nexport type CropperModalProps = ExtractPropTypes<typeof cropperModalProps>\n\n// emits\nexport type CropperImageEmits = typeof cropperImageEmits\nexport type CropperModalEmits = typeof cropperModalEmits\n\n// instance\nexport type CropperImageInstance = InstanceType<typeof CropperImage>\nexport type CropperModalInstance = InstanceType<typeof CropperModal>\n"],"names":["buildProps","definePropType"],"mappings":";;;;;;AAYO,MAAM,qBAAyC,GAAA;AAAA,EACpD,WAAa,EAAA,CAAA;AAAA,EACb,QAAU,EAAA,IAAA;AAAA,EACV,WAAa,EAAA,IAAA;AAAA,EACb,WAAa,EAAA,IAAA;AAAA,EACb,cAAgB,EAAA,IAAA;AAAA,EAChB,gBAAkB,EAAA,IAAA;AAAA,EAClB,wBAA0B,EAAA,IAAA;AAAA,EAC1B,QAAU,EAAA,IAAA;AAAA,EACV,UAAY,EAAA,IAAA;AAAA,EACZ,SAAW,EAAA,IAAA;AAAA,EACX,MAAQ,EAAA,IAAA;AAAA,EACR,UAAY,EAAA,IAAA;AAAA,EACZ,OAAS,EAAA,IAAA;AAAA,EACT,gBAAkB,EAAA,IAAA;AAAA,EAClB,gBAAkB,EAAA,IAAA;AAAA,EAClB,QAAU,EAAA,IAAA;AAAA,EACV,KAAO,EAAA,IAAA;AAAA,EACP,MAAQ,EAAA,IAAA;AAAA,EACR,OAAS,EAAA,IAAA;AAAA,EACT,SAAW,EAAA,IAAA;AACb,EAAA;AAEO,MAAM,oBAAoBA,kBAAW,CAAA;AAAA,EAC1C,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,MAAA;AAAA,IACN,QAAU,EAAA,IAAA;AAAA,GACZ;AAAA,EACA,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,MAAA;AAAA,GACR;AAAA,EACA,OAAS,EAAA;AAAA,IACP,IAAM,EAAA,OAAA;AAAA,IACN,OAAS,EAAA,KAAA;AAAA,GACX;AAAA,EACA,eAAiB,EAAA;AAAA,IACf,IAAM,EAAA,OAAA;AAAA,IACN,OAAS,EAAA,IAAA;AAAA,GACX;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAA,EAAM,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAA,IACrB,OAAS,EAAA,OAAA;AAAA,GACX;AAAA,EACA,WAAa,EAAA;AAAA,IACX,IAAM,EAAAC,sBAAA;AAAA,MACJ,MAAA;AAAA,KACF;AAAA,IACA,OAAS,EAAA,KAAA,CAAA;AAAA,GACX;AAAA,EACA,UAAY,EAAA;AAAA,IACV,IAAA,EAAMA,uBAA8B,MAAM,CAAA;AAAA,IAC1C,OAAA,EAAS,OAAO,EAAC,CAAA;AAAA,GACnB;AAAA,EACA,OAAS,EAAA;AAAA,IACP,IAAA,EAAMA,uBAAgC,MAAM,CAAA;AAAA,IAC5C,OAAA,EAAS,OAAO,EAAC,CAAA;AAAA,GACnB;AACF,CAAU,EAAA;AAEH,MAAM,iBAAoB,GAAA;AAAA,EAC/B,OAAS,EAAA,CAAC,MAA0B,KAAA,CAAC,CAAC,MAAA;AAAA,EACtC,OAAS,EAAA,CAAC,OAAqB,KAAA,CAAC,CAAC,OAAA;AAAA,EACjC,cAAc,MAAM,IAAA;AACtB,EAAA;AAEO,MAAM,oBAAoBD,kBAAW,CAAA;AAAA,EAC1C,OAAS,EAAA;AAAA,IACP,IAAM,EAAA,OAAA;AAAA,IACN,OAAS,EAAA,IAAA;AAAA,GACX;AAAA,EACA,QAAU,EAAA;AAAA,IACR,IAAM,EAAA,OAAA;AAAA,IACN,OAAS,EAAA,KAAA;AAAA,GACX;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,MAAA;AAAA,IACN,OAAS,EAAA,EAAA;AAAA,GACX;AAAA,EACA,UAAY,EAAA;AAAA,IACV,IAAA,EAAM,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAA,IACrB,OAAS,EAAA,EAAA;AAAA,GACX;AAAA,EACA,UAAY,EAAA;AAAA,IACV,IAAA,EAAMC,uBAAoC,MAAM,CAAA;AAAA,IAChD,SAAS,MAAM,QAAA;AAAA,GACjB;AAAA,EACA,KAAO,EAAA;AAAA,IACL,IAAM,EAAA,MAAA;AAAA,IACN,OAAS,EAAA,0BAAA;AAAA,GACX;AAAA,EACA,KAAO,EAAA;AAAA,IACL,IAAA,EAAM,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAA,IACrB,OAAS,EAAA,OAAA;AAAA,GACX;AACF,CAAU,EAAA;AAEH,MAAM,iBAAoB,GAAA;AAAA,EAC/B,OAAS,EAAA,CAAC,MAAkD,KAAA,CAAC,CAAC,MAAA;AAChE;;;;;;;;"}
1
+ {"version":3,"file":"cropper-image.js","sources":["../../../../../../packages/components/cropper/src/cropper-image.ts"],"sourcesContent":["import { buildProps, definePropType } from '@ll-plus/utils'\n\nimport type { ExtractPropTypes, CSSProperties } from 'vue'\nimport type Cropper from 'cropperjs'\nimport type CropperImage from './cropper-image.vue'\nimport type CropperModal from './cropper-modal.vue'\n\nexport interface CropendResult {\n imgBase64: string\n imgInfo: Cropper.Data\n}\n\nexport const defaultCropperOptions: Cropper.Options = {\n aspectRatio: 1,\n zoomable: true,\n zoomOnTouch: true,\n zoomOnWheel: true,\n cropBoxMovable: true,\n cropBoxResizable: true,\n toggleDragModeOnDblclick: true,\n autoCrop: true,\n background: true,\n highlight: true,\n center: true,\n responsive: true,\n restore: true,\n checkCrossOrigin: true,\n checkOrientation: true,\n scalable: true,\n modal: true,\n guides: true,\n movable: true,\n rotatable: true\n}\n\nexport const cropperImageProps = buildProps({\n src: {\n type: String,\n required: true\n },\n alt: {\n type: String\n },\n circled: {\n type: Boolean,\n default: false\n },\n loading: {\n type: Boolean,\n default: false\n },\n realTimePreview: {\n type: Boolean,\n default: true\n },\n height: {\n type: [String, Number],\n default: '360px'\n },\n crossorigin: {\n type: definePropType<'' | 'anonymous' | 'use-credentials' | undefined>(\n String\n ),\n default: undefined\n },\n imageStyle: {\n type: definePropType<CSSProperties>(Object),\n default: () => ({})\n },\n options: {\n type: definePropType<Cropper.Options>(Object),\n default: () => ({})\n }\n} as const)\n\nexport const cropperImageEmits = {\n cropend: (params: CropendResult) => !!params,\n onReady: (cropper: Cropper) => !!cropper,\n cropendError: () => true\n} as const\n\nexport const cropperModalProps = buildProps({\n circled: {\n type: Boolean,\n default: true\n },\n disabled: {\n type: Boolean,\n default: false\n },\n loading: {\n type: Boolean,\n default: false\n },\n avatar: {\n type: String,\n default: ''\n },\n avatarSize: {\n type: [String, Number],\n default: 64\n },\n avatarType: {\n type: definePropType<'square' | 'circle'>(String),\n default: () => 'circle'\n },\n title: {\n type: String,\n default: '图片裁剪'\n },\n width: {\n type: [String, Number],\n default: '800px'\n }\n} as const)\n\nexport const cropperModalEmits = {\n confirm: (params: { blob: Blob; previewSource: string }) => !!params\n} as const\n\n// props\nexport type CropperImageProps = ExtractPropTypes<typeof cropperImageProps>\nexport type CropperModalProps = ExtractPropTypes<typeof cropperModalProps>\n\n// emits\nexport type CropperImageEmits = typeof cropperImageEmits\nexport type CropperModalEmits = typeof cropperModalEmits\n\n// instance\nexport type CropperImageInstance = InstanceType<typeof CropperImage>\nexport type CropperModalInstance = InstanceType<typeof CropperModal>\n"],"names":["buildProps","definePropType"],"mappings":"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"}
@@ -23,6 +23,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
23
23
  const imgElRef = vue.ref();
24
24
  const cropper = vue.ref();
25
25
  const isReady = vue.ref(false);
26
+ const loading = vue.ref(props.loading);
26
27
  const getImageStyle = vue.computed(() => {
27
28
  return {
28
29
  height: props.height,
@@ -38,10 +39,12 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
38
39
  if (!imgEl) {
39
40
  return;
40
41
  }
42
+ loading.value = true;
41
43
  cropper.value = new Cropper(imgEl, {
42
44
  ...cropperImage.defaultCropperOptions,
43
45
  ready() {
44
46
  isReady.value = true;
47
+ loading.value = false;
45
48
  realTimeCroppered();
46
49
  emits("onReady", cropper.value);
47
50
  },
@@ -107,32 +110,50 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
107
110
  context.fill();
108
111
  return canvas;
109
112
  };
113
+ const handleLoading = () => {
114
+ loading.value = true;
115
+ console.log("loading");
116
+ };
110
117
  vue.onMounted(init);
111
118
  vue.onUnmounted(() => {
112
119
  cropper.value?.destroy();
113
120
  });
121
+ vue.watch(
122
+ () => props.loading,
123
+ (val) => {
124
+ loading.value = val;
125
+ }
126
+ );
114
127
  return (_ctx, _cache) => {
115
- return vue.openBlock(), vue.createElementBlock(
116
- "div",
117
- {
118
- class: vue.normalizeClass([vue.unref(bem).b(), props.circled ? vue.unref(bem).is("circled") : ""]),
119
- style: vue.normalizeStyle(getWrapperStyle.value)
120
- },
121
- [
122
- vue.withDirectives(vue.createElementVNode("img", {
123
- ref_key: "imgElRef",
124
- ref: imgElRef,
125
- src: _ctx.src,
126
- alt: _ctx.alt,
127
- crossorigin: _ctx.crossorigin,
128
- style: vue.normalizeStyle(getImageStyle.value)
129
- }, null, 12, _hoisted_1), [
130
- [vue.vShow, isReady.value]
131
- ])
132
- ],
133
- 6
134
- /* CLASS, STYLE */
135
- );
128
+ const _component_a_spin = vue.resolveComponent("a-spin");
129
+ return vue.openBlock(), vue.createBlock(_component_a_spin, { spinning: loading.value }, {
130
+ default: vue.withCtx(() => [
131
+ vue.createElementVNode(
132
+ "div",
133
+ {
134
+ class: vue.normalizeClass([vue.unref(bem).b(), props.circled ? vue.unref(bem).is("circled") : ""]),
135
+ style: vue.normalizeStyle(getWrapperStyle.value)
136
+ },
137
+ [
138
+ vue.withDirectives(vue.createElementVNode("img", {
139
+ ref_key: "imgElRef",
140
+ ref: imgElRef,
141
+ src: _ctx.src,
142
+ alt: _ctx.alt,
143
+ crossorigin: _ctx.crossorigin,
144
+ style: vue.normalizeStyle(getImageStyle.value),
145
+ onLoad: handleLoading
146
+ }, null, 44, _hoisted_1), [
147
+ [vue.vShow, isReady.value]
148
+ ])
149
+ ],
150
+ 6
151
+ /* CLASS, STYLE */
152
+ )
153
+ ]),
154
+ _: 1
155
+ /* STABLE */
156
+ }, 8, ["spinning"]);
136
157
  };
137
158
  }
138
159
  });
@@ -1 +1 @@
1
- {"version":3,"file":"cropper-image.vue2.js","sources":["../../../../../../packages/components/cropper/src/cropper-image.vue"],"sourcesContent":["<template>\n <div\n :class=\"[bem.b(), props.circled ? bem.is('circled') : '']\"\n :style=\"getWrapperStyle\"\n >\n <img\n v-show=\"isReady\"\n ref=\"imgElRef\"\n :src=\"src\"\n :alt=\"alt\"\n :crossorigin=\"crossorigin\"\n :style=\"getImageStyle\"\n />\n </div>\n</template>\n<script lang=\"ts\" setup>\nimport { onMounted, ref, computed, onUnmounted, type CSSProperties } from 'vue'\nimport { createNamespace } from '@ll-plus/utils'\n//@ts-ignore\nimport Cropper from 'cropperjs'\n// import 'cropperjs/dist/cropper.css'\nimport { useDebounceFn } from '@vueuse/shared'\nimport {\n cropperImageProps,\n cropperImageEmits,\n defaultCropperOptions,\n type CropendResult\n} from './cropper-image'\n\ndefineOptions({ name: 'CropperImage' })\nconst props = defineProps(cropperImageProps)\nconst emits = defineEmits(cropperImageEmits)\n\nconst bem = createNamespace('cropper-image')\n\nconst imgElRef = ref<HTMLImageElement>()\nconst cropper = ref<Cropper>()\nconst isReady = ref(false)\nconst getImageStyle = computed((): CSSProperties => {\n return {\n height: props.height,\n maxWidth: '100%',\n ...props.imageStyle\n }\n})\nconst getWrapperStyle = computed((): CSSProperties => {\n return { height: `${props.height}`.replace(/px/, '') + 'px' }\n})\n\nconst init = async () => {\n const imgEl = imgElRef.value\n if (!imgEl) {\n return\n }\n cropper.value = new Cropper(imgEl, {\n ...defaultCropperOptions,\n ready() {\n isReady.value = true\n realTimeCroppered()\n //@ts-ignore\n emits('onReady', cropper.value)\n },\n crop() {\n debounceRealTimeCroppered()\n },\n zoom() {\n debounceRealTimeCroppered()\n },\n cropmove() {\n debounceRealTimeCroppered()\n },\n ...props.options\n })\n}\n\n// Real-time display preview\nconst realTimeCroppered = () => {\n props.realTimePreview && croppered()\n}\n\nconst debounceRealTimeCroppered = useDebounceFn(realTimeCroppered, 80)\n\n// event: return base64 and width and height information after cropping\nconst croppered = () => {\n if (!cropper.value) {\n return\n }\n const imgInfo = cropper.value.getData()\n const canvas = props.circled\n ? getRoundedCanvas()\n : cropper.value.getCroppedCanvas()\n canvas.toBlob(blob => {\n if (!blob) {\n return\n }\n const fileReader: FileReader = new FileReader()\n fileReader.readAsDataURL(blob)\n fileReader.onloadend = e => {\n emits('cropend', {\n imgBase64: e.target?.result ?? '',\n imgInfo\n } as CropendResult)\n }\n fileReader.onerror = () => {\n emits('cropendError')\n }\n }, 'image/png')\n}\n\n// Get a circular picture canvas\nconst getRoundedCanvas = () => {\n const sourceCanvas = cropper.value!.getCroppedCanvas()\n const canvas = document.createElement('canvas')\n const context = canvas.getContext('2d')!\n const width = sourceCanvas.width\n const height = sourceCanvas.height\n canvas.width = width\n canvas.height = height\n context.imageSmoothingEnabled = true\n context.drawImage(sourceCanvas, 0, 0, width, height)\n context.globalCompositeOperation = 'destination-in'\n context.beginPath()\n context.arc(\n width / 2,\n height / 2,\n Math.min(width, height) / 2,\n 0,\n 2 * Math.PI,\n true\n )\n context.fill()\n return canvas\n}\n\nonMounted(init)\n\nonUnmounted(() => {\n cropper.value?.destroy()\n})\n</script>\n"],"names":["createNamespace","ref","computed","defaultCropperOptions","useDebounceFn","onMounted","onUnmounted"],"mappings":"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"}
1
+ {"version":3,"file":"cropper-image.vue2.js","sources":["../../../../../../packages/components/cropper/src/cropper-image.vue"],"sourcesContent":["<template>\n <a-spin :spinning=\"loading\">\n <div\n :class=\"[bem.b(), props.circled ? bem.is('circled') : '']\"\n :style=\"getWrapperStyle\"\n >\n <img\n v-show=\"isReady\"\n ref=\"imgElRef\"\n :src=\"src\"\n :alt=\"alt\"\n :crossorigin=\"crossorigin\"\n :style=\"getImageStyle\"\n @load=\"handleLoading\"\n />\n </div>\n </a-spin>\n</template>\n<script lang=\"ts\" setup>\nimport {\n onMounted,\n ref,\n computed,\n onUnmounted,\n type CSSProperties,\n watch\n} from 'vue'\nimport { createNamespace } from '@ll-plus/utils'\n//@ts-ignore\nimport Cropper from 'cropperjs'\n// import 'cropperjs/dist/cropper.css'\nimport { useDebounceFn } from '@vueuse/shared'\nimport {\n cropperImageProps,\n cropperImageEmits,\n defaultCropperOptions,\n type CropendResult\n} from './cropper-image'\n\ndefineOptions({ name: 'CropperImage' })\nconst props = defineProps(cropperImageProps)\nconst emits = defineEmits(cropperImageEmits)\n\nconst bem = createNamespace('cropper-image')\n\nconst imgElRef = ref<HTMLImageElement>()\nconst cropper = ref<Cropper>()\nconst isReady = ref(false)\nconst loading = ref(props.loading)\nconst getImageStyle = computed((): CSSProperties => {\n return {\n height: props.height,\n maxWidth: '100%',\n ...props.imageStyle\n }\n})\nconst getWrapperStyle = computed((): CSSProperties => {\n return { height: `${props.height}`.replace(/px/, '') + 'px' }\n})\n\nconst init = async () => {\n const imgEl = imgElRef.value\n if (!imgEl) {\n return\n }\n loading.value = true\n cropper.value = new Cropper(imgEl, {\n ...defaultCropperOptions,\n ready() {\n isReady.value = true\n loading.value = false\n realTimeCroppered()\n //@ts-ignore\n emits('onReady', cropper.value)\n },\n crop() {\n debounceRealTimeCroppered()\n },\n zoom() {\n debounceRealTimeCroppered()\n },\n cropmove() {\n debounceRealTimeCroppered()\n },\n ...props.options\n })\n}\n\n// Real-time display preview\nconst realTimeCroppered = () => {\n props.realTimePreview && croppered()\n}\n\nconst debounceRealTimeCroppered = useDebounceFn(realTimeCroppered, 80)\n\n// event: return base64 and width and height information after cropping\nconst croppered = () => {\n if (!cropper.value) {\n return\n }\n const imgInfo = cropper.value.getData()\n const canvas = props.circled\n ? getRoundedCanvas()\n : cropper.value.getCroppedCanvas()\n canvas.toBlob(blob => {\n if (!blob) {\n return\n }\n const fileReader: FileReader = new FileReader()\n fileReader.readAsDataURL(blob)\n fileReader.onloadend = e => {\n emits('cropend', {\n imgBase64: e.target?.result ?? '',\n imgInfo\n } as CropendResult)\n }\n fileReader.onerror = () => {\n emits('cropendError')\n }\n }, 'image/png')\n}\n\n// Get a circular picture canvas\nconst getRoundedCanvas = () => {\n const sourceCanvas = cropper.value!.getCroppedCanvas()\n const canvas = document.createElement('canvas')\n const context = canvas.getContext('2d')!\n const width = sourceCanvas.width\n const height = sourceCanvas.height\n canvas.width = width\n canvas.height = height\n context.imageSmoothingEnabled = true\n context.drawImage(sourceCanvas, 0, 0, width, height)\n context.globalCompositeOperation = 'destination-in'\n context.beginPath()\n context.arc(\n width / 2,\n height / 2,\n Math.min(width, height) / 2,\n 0,\n 2 * Math.PI,\n true\n )\n context.fill()\n return canvas\n}\n//获取图片加载中\nconst handleLoading = () => {\n loading.value = true\n console.log('loading')\n}\n\nonMounted(init)\n\nonUnmounted(() => {\n cropper.value?.destroy()\n})\n\nwatch(\n () => props.loading,\n val => {\n loading.value = val\n }\n)\n</script>\n"],"names":["createNamespace","ref","computed","defaultCropperOptions","useDebounceFn","onMounted","onUnmounted","watch"],"mappings":"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"}
@@ -16,7 +16,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
16
16
  __name: "cropper-modal",
17
17
  props: cropperImage.cropperModalProps,
18
18
  emits: cropperImage.cropperModalEmits,
19
- setup(__props, { emit: __emit }) {
19
+ setup(__props, { expose: __expose, emit: __emit }) {
20
20
  const props = __props;
21
21
  const emits = __emit;
22
22
  const bem = createNamespace.createNamespace("cropper-modal");
@@ -24,16 +24,23 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
24
24
  const avatar = vue.ref(props.avatar || "");
25
25
  const open = vue.ref(false);
26
26
  const previewSource = vue.ref("");
27
+ const loading = vue.ref(props.loading);
28
+ const uploadLoading = vue.ref(false);
27
29
  const cropper = vue.ref();
28
30
  let scaleX = 1;
29
31
  let scaleY = 1;
30
32
  function handleBeforeUpload(file) {
31
33
  const reader = new FileReader();
32
34
  reader.readAsDataURL(file);
35
+ uploadLoading.value = true;
33
36
  src.value = "";
34
37
  previewSource.value = "";
35
38
  reader.onload = function(e) {
36
39
  src.value = e.target?.result ?? "";
40
+ uploadLoading.value = false;
41
+ };
42
+ reader.onerror = () => {
43
+ uploadLoading.value = false;
37
44
  };
38
45
  return false;
39
46
  }
@@ -63,10 +70,13 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
63
70
  avatar.value = previewSource.value;
64
71
  open.value = false;
65
72
  }
73
+ const cleanValue = () => {
74
+ src.value = "";
75
+ avatar.value = "";
76
+ };
66
77
  vue.watch(
67
78
  () => props.avatar,
68
79
  (val) => {
69
- console.log({ val });
70
80
  src.value = val;
71
81
  avatar.value = val;
72
82
  },
@@ -74,6 +84,12 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
74
84
  immediate: true
75
85
  }
76
86
  );
87
+ vue.watchEffect(() => {
88
+ loading.value = props.loading;
89
+ });
90
+ __expose({
91
+ cleanValue
92
+ });
77
93
  return (_ctx, _cache) => {
78
94
  const _component_ll_icon = vue.resolveComponent("ll-icon");
79
95
  const _component_ll_button = vue.resolveComponent("ll-button");
@@ -81,6 +97,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
81
97
  const _component_a_upload = vue.resolveComponent("a-upload");
82
98
  const _component_ll_space = vue.resolveComponent("ll-space");
83
99
  const _component_ll_image = vue.resolveComponent("ll-image");
100
+ const _component_a_spin = vue.resolveComponent("a-spin");
84
101
  const _component_ll_modal = vue.resolveComponent("ll-modal");
85
102
  return vue.openBlock(), vue.createElementBlock(
86
103
  vue.Fragment,
@@ -93,6 +110,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
93
110
  keyboard: false,
94
111
  "mask-closable": false,
95
112
  "ok-text": "\u786E\u5B9A",
113
+ loading: uploadLoading.value,
96
114
  onCancel: _cache[8] || (_cache[8] = ($event) => open.value = false),
97
115
  onOk: handleOk
98
116
  }, {
@@ -120,9 +138,10 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
120
138
  src: src.value,
121
139
  height: "300px",
122
140
  circled: _ctx.circled,
141
+ loading: uploadLoading.value,
123
142
  onCropend: handleCropend,
124
143
  onOnReady: handleReady
125
- }, null, 8, ["src", "circled"])) : vue.createCommentVNode("v-if", true)
144
+ }, null, 8, ["src", "circled", "loading"])) : vue.createCommentVNode("v-if", true)
126
145
  ],
127
146
  2
128
147
  /* CLASS */
@@ -147,6 +166,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
147
166
  vue.createVNode(_component_ll_button, {
148
167
  type: "primary",
149
168
  size: "small",
169
+ disabled: uploadLoading.value,
150
170
  onClick: _cache[0] || (_cache[0] = ($event) => handlerToolbar("reset"))
151
171
  }, {
152
172
  default: vue.withCtx(() => [
@@ -154,7 +174,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
154
174
  ]),
155
175
  _: 1
156
176
  /* STABLE */
157
- })
177
+ }, 8, ["disabled"])
158
178
  ]),
159
179
  _: 1
160
180
  /* STABLE */
@@ -173,7 +193,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
173
193
  vue.createVNode(_component_ll_button, {
174
194
  type: "primary",
175
195
  size: "small",
176
- disabled: !src.value,
196
+ disabled: !src.value || uploadLoading.value,
177
197
  onClick: _cache[1] || (_cache[1] = ($event) => handlerToolbar("reset"))
178
198
  }, {
179
199
  default: vue.withCtx(() => [
@@ -194,7 +214,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
194
214
  vue.createVNode(_component_ll_button, {
195
215
  type: "primary",
196
216
  size: "small",
197
- disabled: !src.value,
217
+ disabled: !src.value || uploadLoading.value,
198
218
  onClick: _cache[2] || (_cache[2] = ($event) => handlerToolbar("rotate", -45))
199
219
  }, {
200
220
  default: vue.withCtx(() => [
@@ -215,7 +235,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
215
235
  vue.createVNode(_component_ll_button, {
216
236
  type: "primary",
217
237
  size: "small",
218
- disabled: !src.value,
238
+ disabled: !src.value || uploadLoading.value,
219
239
  onClick: _cache[3] || (_cache[3] = ($event) => handlerToolbar("rotate", 45))
220
240
  }, {
221
241
  default: vue.withCtx(() => [
@@ -236,7 +256,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
236
256
  vue.createVNode(_component_ll_button, {
237
257
  type: "primary",
238
258
  size: "small",
239
- disabled: !src.value,
259
+ disabled: !src.value || uploadLoading.value,
240
260
  onClick: _cache[4] || (_cache[4] = ($event) => handlerToolbar("scaleX"))
241
261
  }, {
242
262
  default: vue.withCtx(() => [
@@ -257,7 +277,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
257
277
  vue.createVNode(_component_ll_button, {
258
278
  type: "primary",
259
279
  size: "small",
260
- disabled: !src.value,
280
+ disabled: !src.value || uploadLoading.value,
261
281
  onClick: _cache[5] || (_cache[5] = ($event) => handlerToolbar("scaleY"))
262
282
  }, {
263
283
  default: vue.withCtx(() => [
@@ -278,7 +298,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
278
298
  vue.createVNode(_component_ll_button, {
279
299
  type: "primary",
280
300
  size: "small",
281
- disabled: !src.value,
301
+ disabled: !src.value || uploadLoading.value,
282
302
  onClick: _cache[6] || (_cache[6] = ($event) => handlerToolbar("zoom", 0.1))
283
303
  }, {
284
304
  default: vue.withCtx(() => [
@@ -299,7 +319,7 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
299
319
  vue.createVNode(_component_ll_button, {
300
320
  type: "primary",
301
321
  size: "small",
302
- disabled: !src.value,
322
+ disabled: !src.value || uploadLoading.value,
303
323
  onClick: _cache[7] || (_cache[7] = ($event) => handlerToolbar("zoom", -0.1))
304
324
  }, {
305
325
  default: vue.withCtx(() => [
@@ -330,56 +350,62 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
330
350
  class: vue.normalizeClass(vue.unref(bem).e("right"))
331
351
  },
332
352
  [
333
- vue.createElementVNode(
334
- "div",
335
- {
336
- class: vue.normalizeClass(vue.unref(bem).e("preview"))
337
- },
338
- [
339
- previewSource.value ? (vue.openBlock(), vue.createElementBlock("img", {
340
- key: 0,
341
- src: previewSource.value,
342
- alt: "\u9884\u89C8"
343
- }, null, 8, _hoisted_1)) : vue.createCommentVNode("v-if", true)
344
- ],
345
- 2
346
- /* CLASS */
347
- ),
348
- previewSource.value ? (vue.openBlock(), vue.createElementBlock(
349
- "div",
350
- {
351
- key: 0,
352
- class: vue.normalizeClass(vue.unref(bem).e("group"))
353
- },
354
- [
355
- vue.createVNode(_component_ll_image, {
356
- preview: false,
357
- src: previewSource.value,
358
- width: 32,
359
- height: 32
360
- }, null, 8, ["src"]),
361
- vue.createVNode(_component_ll_image, {
362
- preview: false,
363
- src: previewSource.value,
364
- width: 48,
365
- height: 48
366
- }, null, 8, ["src"]),
367
- vue.createVNode(_component_ll_image, {
368
- preview: false,
369
- src: previewSource.value,
370
- width: 64,
371
- height: 64
372
- }, null, 8, ["src"]),
373
- vue.createVNode(_component_ll_image, {
374
- preview: false,
375
- src: previewSource.value,
376
- width: 80,
377
- height: 80
378
- }, null, 8, ["src"])
379
- ],
380
- 2
381
- /* CLASS */
382
- )) : vue.createCommentVNode("v-if", true)
353
+ vue.createVNode(_component_a_spin, { spinning: uploadLoading.value }, {
354
+ default: vue.withCtx(() => [
355
+ vue.createElementVNode(
356
+ "div",
357
+ {
358
+ class: vue.normalizeClass(vue.unref(bem).e("preview"))
359
+ },
360
+ [
361
+ previewSource.value ? (vue.openBlock(), vue.createElementBlock("img", {
362
+ key: 0,
363
+ src: previewSource.value,
364
+ alt: "\u9884\u89C8"
365
+ }, null, 8, _hoisted_1)) : vue.createCommentVNode("v-if", true)
366
+ ],
367
+ 2
368
+ /* CLASS */
369
+ ),
370
+ previewSource.value ? (vue.openBlock(), vue.createElementBlock(
371
+ "div",
372
+ {
373
+ key: 0,
374
+ class: vue.normalizeClass(vue.unref(bem).e("group"))
375
+ },
376
+ [
377
+ vue.createVNode(_component_ll_image, {
378
+ preview: false,
379
+ src: previewSource.value,
380
+ width: 32,
381
+ height: 32
382
+ }, null, 8, ["src"]),
383
+ vue.createVNode(_component_ll_image, {
384
+ preview: false,
385
+ src: previewSource.value,
386
+ width: 48,
387
+ height: 48
388
+ }, null, 8, ["src"]),
389
+ vue.createVNode(_component_ll_image, {
390
+ preview: false,
391
+ src: previewSource.value,
392
+ width: 64,
393
+ height: 64
394
+ }, null, 8, ["src"]),
395
+ vue.createVNode(_component_ll_image, {
396
+ preview: false,
397
+ src: previewSource.value,
398
+ width: 80,
399
+ height: 80
400
+ }, null, 8, ["src"])
401
+ ],
402
+ 2
403
+ /* CLASS */
404
+ )) : vue.createCommentVNode("v-if", true)
405
+ ]),
406
+ _: 1
407
+ /* STABLE */
408
+ }, 8, ["spinning"])
383
409
  ],
384
410
  2
385
411
  /* CLASS */
@@ -391,25 +417,35 @@ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
391
417
  ]),
392
418
  _: 1
393
419
  /* STABLE */
394
- }, 8, ["open", "title", "width"]),
420
+ }, 8, ["open", "title", "width", "loading"]),
395
421
  vue.createElementVNode(
396
422
  "div",
397
423
  {
398
424
  class: vue.normalizeClass(vue.unref(bem).e("cropper-avatar")),
399
425
  style: vue.normalizeStyle({
400
- cursor: props.disabled ? "not-allowed" : "pointer"
426
+ cursor: props.disabled ? "not-allowed" : "pointer",
427
+ display: "inline-block"
401
428
  }),
402
429
  onClick: handleOpen
403
430
  },
404
431
  [
405
- vue.renderSlot(_ctx.$slots, "default", { src: avatar.value }, () => [
406
- vue.createVNode(_component_ll_image, {
407
- src: avatar.value,
408
- width: 64,
409
- height: 64,
410
- preview: false
411
- }, null, 8, ["src"])
412
- ])
432
+ vue.createVNode(_component_a_spin, {
433
+ spinning: loading.value,
434
+ style: { "display": "inline-block" }
435
+ }, {
436
+ default: vue.withCtx(() => [
437
+ vue.renderSlot(_ctx.$slots, "default", { src: avatar.value }, () => [
438
+ vue.createVNode(_component_ll_image, {
439
+ src: avatar.value,
440
+ width: 64,
441
+ height: 64,
442
+ preview: false
443
+ }, null, 8, ["src"])
444
+ ])
445
+ ]),
446
+ _: 3
447
+ /* FORWARDED */
448
+ }, 8, ["spinning"])
413
449
  ],
414
450
  6
415
451
  /* CLASS, STYLE */
@@ -1 +1 @@
1
- {"version":3,"file":"cropper-modal.vue2.js","sources":["../../../../../../packages/components/cropper/src/cropper-modal.vue"],"sourcesContent":["<template>\n <ll-modal\n :open=\"open\"\n :title=\"props.title\"\n :width=\"props.width\"\n :keyboard=\"false\"\n :mask-closable=\"false\"\n :ok-text=\"'确定'\"\n @cancel=\"open = false\"\n @ok=\"handleOk\"\n >\n <div :class=\"bem.b()\">\n <div :class=\"bem.e('left')\">\n <div :class=\"bem.e('cropper')\">\n <cropper-image\n v-if=\"src && open\"\n :src=\"src\"\n height=\"300px\"\n :circled=\"circled\"\n @cropend=\"handleCropend\"\n @on-ready=\"handleReady\"\n />\n </div>\n <div :class=\"bem.e('toolbar')\">\n <a-upload\n :file-list=\"[]\"\n accept=\"image/*\"\n :before-upload=\"handleBeforeUpload\"\n >\n <ll-tooltip :title=\"'选择图片'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n @click=\"handlerToolbar('reset')\"\n >\n <ll-icon icon-name=\"icon-upload\" />\n </ll-button>\n </ll-tooltip>\n </a-upload>\n <ll-space>\n <ll-tooltip :tip=\"'重置'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"!src\"\n @click=\"handlerToolbar('reset')\"\n >\n <ll-icon icon-name=\"icon-refresh\" />\n </ll-button>\n </ll-tooltip>\n <ll-tooltip :tip=\"'逆时针旋转'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"!src\"\n @click=\"handlerToolbar('rotate', -45)\"\n >\n <ll-icon icon-name=\"icon-counter-clockwise\" />\n </ll-button>\n </ll-tooltip>\n <ll-tooltip :tip=\"'顺时针旋转'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"!src\"\n @click=\"handlerToolbar('rotate', 45)\"\n >\n <ll-icon icon-name=\"icon-flip-horizontal\" />\n </ll-button>\n </ll-tooltip>\n <ll-tooltip :tip=\"'水平翻转'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"!src\"\n @click=\"handlerToolbar('scaleX')\"\n >\n <ll-icon icon-name=\"icon-flip-horizontal\" />\n </ll-button>\n </ll-tooltip>\n <ll-tooltip :tip=\"'垂直翻转'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"!src\"\n @click=\"handlerToolbar('scaleY')\"\n >\n <ll-icon icon-name=\"icon-flip-vertical\" />\n </ll-button>\n </ll-tooltip>\n <ll-tooltip :tip=\"'放大'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"!src\"\n @click=\"handlerToolbar('zoom', 0.1)\"\n >\n <ll-icon icon-name=\"icon-amplify1\" />\n </ll-button>\n </ll-tooltip>\n <ll-tooltip :tip=\"'缩小'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"!src\"\n @click=\"handlerToolbar('zoom', -0.1)\"\n >\n <ll-icon icon-name=\"icon-scale\" />\n </ll-button>\n </ll-tooltip>\n </ll-space>\n </div>\n </div>\n <div :class=\"bem.e('right')\">\n <div :class=\"bem.e('preview')\">\n <img v-if=\"previewSource\" :src=\"previewSource\" :alt=\"'预览'\" />\n </div>\n <template v-if=\"previewSource\">\n <div :class=\"bem.e('group')\">\n <ll-image\n :preview=\"false\"\n :src=\"previewSource\"\n :width=\"32\"\n :height=\"32\"\n />\n <ll-image\n :preview=\"false\"\n :src=\"previewSource\"\n :width=\"48\"\n :height=\"48\"\n />\n <ll-image\n :preview=\"false\"\n :src=\"previewSource\"\n :width=\"64\"\n :height=\"64\"\n />\n <ll-image\n :preview=\"false\"\n :src=\"previewSource\"\n :width=\"80\"\n :height=\"80\"\n />\n </div>\n </template>\n </div>\n </div>\n </ll-modal>\n <div\n :class=\"bem.e('cropper-avatar')\"\n :style=\"{\n cursor: props.disabled ? 'not-allowed' : 'pointer'\n }\"\n @click=\"handleOpen\"\n >\n <slot :src=\"avatar\">\n <ll-image :src=\"avatar\" :width=\"64\" :height=\"64\" :preview=\"false\" />\n </slot>\n </div>\n</template>\n<script lang=\"ts\" setup>\n//@ts-ignore\nimport type Cropper from 'cropperjs'\n\nimport { ref, watch } from 'vue'\nimport { createNamespace, dataURLtoBlob, type Nullable } from '@ll-plus/utils'\nimport CropperImage from './cropper-image.vue'\nimport {\n cropperModalProps,\n cropperModalEmits,\n type CropendResult\n} from './cropper-image'\n\ndefineOptions({ name: 'LlCropperModal' })\nconst props = defineProps(cropperModalProps)\nconst emits = defineEmits(cropperModalEmits)\nconst bem = createNamespace('cropper-modal')\nconst src = ref(props.avatar || '')\nconst avatar = ref(props.avatar || '')\nconst open = ref(false)\nconst previewSource = ref('')\n\nconst cropper = ref<Nullable<Cropper>>()\nlet scaleX = 1\nlet scaleY = 1\n\n// Block upload\nfunction handleBeforeUpload(file: File) {\n const reader = new FileReader()\n reader.readAsDataURL(file)\n src.value = ''\n previewSource.value = ''\n reader.onload = function (e) {\n src.value = (e.target?.result as string) ?? ''\n // filename = file.name\n }\n return false\n}\nfunction handleOpen() {\n if (props.disabled) return\n open.value = true\n}\nfunction handleCropend({ imgBase64 }: CropendResult) {\n previewSource.value = imgBase64\n}\n\nfunction handleReady(cropperInstance: Cropper) {\n cropper.value = cropperInstance\n}\nfunction handlerToolbar(event: string, arg?: number) {\n if (event === 'scaleX') {\n scaleX = arg = scaleX === -1 ? 1 : -1\n }\n if (event === 'scaleY') {\n scaleY = arg = scaleY === -1 ? 1 : -1\n }\n cropper?.value?.[event]?.(arg)\n}\n\nasync function handleOk() {\n const blob = dataURLtoBlob(previewSource.value)\n emits('confirm', { blob, previewSource: previewSource.value })\n avatar.value = previewSource.value\n open.value = false\n}\n\nwatch(\n () => props.avatar,\n val => {\n console.log({ val })\n src.value = val\n avatar.value = val\n },\n {\n immediate: true\n }\n)\n</script>\n"],"names":["createNamespace","ref","dataURLtoBlob","watch"],"mappings":"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"}
1
+ {"version":3,"file":"cropper-modal.vue2.js","sources":["../../../../../../packages/components/cropper/src/cropper-modal.vue"],"sourcesContent":["<template>\n <ll-modal\n :open=\"open\"\n :title=\"props.title\"\n :width=\"props.width\"\n :keyboard=\"false\"\n :mask-closable=\"false\"\n :ok-text=\"'确定'\"\n :loading=\"uploadLoading\"\n @cancel=\"open = false\"\n @ok=\"handleOk\"\n >\n <div :class=\"bem.b()\">\n <div :class=\"bem.e('left')\">\n <div :class=\"bem.e('cropper')\">\n <cropper-image\n v-if=\"src && open\"\n :src=\"src\"\n height=\"300px\"\n :circled=\"circled\"\n :loading=\"uploadLoading\"\n @cropend=\"handleCropend\"\n @on-ready=\"handleReady\"\n />\n </div>\n <div :class=\"bem.e('toolbar')\">\n <a-upload\n :file-list=\"[]\"\n accept=\"image/*\"\n :before-upload=\"handleBeforeUpload\"\n >\n <ll-tooltip :title=\"'选择图片'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"uploadLoading\"\n @click=\"handlerToolbar('reset')\"\n >\n <ll-icon icon-name=\"icon-upload\" />\n </ll-button>\n </ll-tooltip>\n </a-upload>\n <ll-space>\n <ll-tooltip :tip=\"'重置'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"!src || uploadLoading\"\n @click=\"handlerToolbar('reset')\"\n >\n <ll-icon icon-name=\"icon-refresh\" />\n </ll-button>\n </ll-tooltip>\n <ll-tooltip :tip=\"'逆时针旋转'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"!src || uploadLoading\"\n @click=\"handlerToolbar('rotate', -45)\"\n >\n <ll-icon icon-name=\"icon-counter-clockwise\" />\n </ll-button>\n </ll-tooltip>\n <ll-tooltip :tip=\"'顺时针旋转'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"!src || uploadLoading\"\n @click=\"handlerToolbar('rotate', 45)\"\n >\n <ll-icon icon-name=\"icon-flip-horizontal\" />\n </ll-button>\n </ll-tooltip>\n <ll-tooltip :tip=\"'水平翻转'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"!src || uploadLoading\"\n @click=\"handlerToolbar('scaleX')\"\n >\n <ll-icon icon-name=\"icon-flip-horizontal\" />\n </ll-button>\n </ll-tooltip>\n <ll-tooltip :tip=\"'垂直翻转'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"!src || uploadLoading\"\n @click=\"handlerToolbar('scaleY')\"\n >\n <ll-icon icon-name=\"icon-flip-vertical\" />\n </ll-button>\n </ll-tooltip>\n <ll-tooltip :tip=\"'放大'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"!src || uploadLoading\"\n @click=\"handlerToolbar('zoom', 0.1)\"\n >\n <ll-icon icon-name=\"icon-amplify1\" />\n </ll-button>\n </ll-tooltip>\n <ll-tooltip :tip=\"'缩小'\" placement=\"bottom\">\n <ll-button\n type=\"primary\"\n size=\"small\"\n :disabled=\"!src || uploadLoading\"\n @click=\"handlerToolbar('zoom', -0.1)\"\n >\n <ll-icon icon-name=\"icon-scale\" />\n </ll-button>\n </ll-tooltip>\n </ll-space>\n </div>\n </div>\n <div :class=\"bem.e('right')\">\n <a-spin :spinning=\"uploadLoading\">\n <div :class=\"bem.e('preview')\">\n <img v-if=\"previewSource\" :src=\"previewSource\" :alt=\"'预览'\" />\n </div>\n <template v-if=\"previewSource\">\n <div :class=\"bem.e('group')\">\n <ll-image\n :preview=\"false\"\n :src=\"previewSource\"\n :width=\"32\"\n :height=\"32\"\n />\n <ll-image\n :preview=\"false\"\n :src=\"previewSource\"\n :width=\"48\"\n :height=\"48\"\n />\n <ll-image\n :preview=\"false\"\n :src=\"previewSource\"\n :width=\"64\"\n :height=\"64\"\n />\n <ll-image\n :preview=\"false\"\n :src=\"previewSource\"\n :width=\"80\"\n :height=\"80\"\n />\n </div>\n </template>\n </a-spin>\n </div>\n </div>\n </ll-modal>\n <div\n :class=\"bem.e('cropper-avatar')\"\n :style=\"{\n cursor: props.disabled ? 'not-allowed' : 'pointer',\n display: 'inline-block'\n }\"\n @click=\"handleOpen\"\n >\n <a-spin :spinning=\"loading\" style=\"display: inline-block\">\n <slot :src=\"avatar\">\n <ll-image :src=\"avatar\" :width=\"64\" :height=\"64\" :preview=\"false\" />\n </slot>\n </a-spin>\n </div>\n</template>\n<script lang=\"ts\" setup>\n//@ts-ignore\nimport type Cropper from 'cropperjs'\n\nimport { ref, watch, watchEffect } from 'vue'\nimport { createNamespace, dataURLtoBlob, type Nullable } from '@ll-plus/utils'\nimport CropperImage from './cropper-image.vue'\nimport {\n cropperModalProps,\n cropperModalEmits,\n type CropendResult\n} from './cropper-image'\n\ndefineOptions({ name: 'LlCropperModal' })\nconst props = defineProps(cropperModalProps)\nconst emits = defineEmits(cropperModalEmits)\nconst bem = createNamespace('cropper-modal')\nconst src = ref(props.avatar || '')\nconst avatar = ref(props.avatar || '')\nconst open = ref(false)\nconst previewSource = ref('')\nconst loading = ref<boolean>(props.loading)\nconst uploadLoading = ref(false)\n\nconst cropper = ref<Nullable<Cropper>>()\nlet scaleX = 1\nlet scaleY = 1\n\n// Block upload\nfunction handleBeforeUpload(file: File) {\n const reader = new FileReader()\n reader.readAsDataURL(file)\n uploadLoading.value = true\n src.value = ''\n previewSource.value = ''\n reader.onload = function (e) {\n src.value = (e.target?.result as string) ?? ''\n uploadLoading.value = false\n // filename = file.name\n }\n reader.onerror = () => {\n uploadLoading.value = false\n }\n return false\n}\nfunction handleOpen() {\n if (props.disabled) return\n open.value = true\n}\nfunction handleCropend({ imgBase64 }: CropendResult) {\n previewSource.value = imgBase64\n}\n\nfunction handleReady(cropperInstance: Cropper) {\n cropper.value = cropperInstance\n}\nfunction handlerToolbar(event: string, arg?: number) {\n if (event === 'scaleX') {\n scaleX = arg = scaleX === -1 ? 1 : -1\n }\n if (event === 'scaleY') {\n scaleY = arg = scaleY === -1 ? 1 : -1\n }\n cropper?.value?.[event]?.(arg)\n}\n\nasync function handleOk() {\n const blob = dataURLtoBlob(previewSource.value)\n emits('confirm', { blob, previewSource: previewSource.value })\n avatar.value = previewSource.value\n open.value = false\n}\n\nconst cleanValue = () => {\n src.value = ''\n avatar.value = ''\n}\n\nwatch(\n () => props.avatar,\n val => {\n src.value = val\n avatar.value = val\n },\n {\n immediate: true\n }\n)\nwatchEffect(() => {\n loading.value = props.loading\n})\ndefineExpose({\n cleanValue\n})\n</script>\n"],"names":["createNamespace","ref","dataURLtoBlob","watch","watchEffect"],"mappings":"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"}