mali-applet-ui 0.0.43 → 0.0.45

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.
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <view class="ml-amount-text" :class="className">
2
+ <view class="ml-amount-text" :class="[className || '', status ? `status-${status}` : '', {'is-underline': underline}]">
3
3
  <slot name="symbol">
4
4
  <view v-if="symbol" class="amount-flag">¥</view>
5
5
  </slot>
@@ -23,6 +23,7 @@ export default {
23
23
  props: {
24
24
  value: [String, Number],
25
25
  simplify: Boolean,
26
+ status: String,
26
27
  symbol: {
27
28
  type: Boolean,
28
29
  default: true
@@ -31,6 +32,7 @@ export default {
31
32
  type: Boolean,
32
33
  default: false
33
34
  },
35
+ underline: Boolean,
34
36
  className: String
35
37
  },
36
38
  computed: {
@@ -53,6 +55,10 @@ export default {
53
55
  <style lang="scss">
54
56
  .ml-amount-text {
55
57
  display: inline;
58
+ padding: 0 4rpx;
59
+ &.is-underline {
60
+ text-decoration: underline;
61
+ }
56
62
  .amount-flag,
57
63
  .amount-num,
58
64
  .amount-unit {
@@ -62,5 +68,20 @@ export default {
62
68
  font-size: 0.65em;
63
69
  color: rgba(39, 42, 48, 0.45);
64
70
  }
71
+ &.status-primary {
72
+ color: $uni-color-primary;
73
+ }
74
+ &.status-success {
75
+ color: $uni-color-success;
76
+ }
77
+ &.status-info {
78
+ color: #909399;
79
+ }
80
+ &.status-warning {
81
+ color: $uni-color-warning;
82
+ }
83
+ &.status-danger {
84
+ color: $uni-color-error;
85
+ }
65
86
  }
66
87
  </style>
@@ -0,0 +1,155 @@
1
+ <template>
2
+ <view class="ml-approval-record">
3
+ <view class="ml-approval-record-header">
4
+ <view class="ml-approval-record-header-title">审批记录</view>
5
+ </view>
6
+ <view class="ml-approval-record-body">
7
+ <view class="ml-approval-record-list" v-for="(group, index) in options" :key="index">
8
+ <view class="ml-approval-record-flow-line"></view>
9
+ <view class="ml-approval-record-item">
10
+ <view class="ml-approval-record-item-title">{{ group.name }}</view>
11
+ </view>
12
+ <view class="ml-approval-record-users">
13
+ <view class="ml-approval-record-user-item" v-for="(item, index) in group.users" :key="index">
14
+ <view class="ml-approval-record-user-item-info">
15
+ <view class="ml-approval-record-user-item-left">
16
+ <image class="ml-approval-record-user-picture" :src="item.picture" mode="scaleToFill"></image>
17
+ </view>
18
+ <view class="ml-approval-record-user-item-content">
19
+ <view class="ml-approval-record-user-item-top">
20
+ <view class="ml-approval-record-user-name">{{ item.name }}</view>
21
+ <ml-approval-type :value="item.status"></ml-approval-type>
22
+ </view>
23
+ <view class="ml-approval-record-user-role">{{ item.role }}</view>
24
+ </view>
25
+ <view class="ml-approval-record-user-item-right">
26
+ <view class="ml-approval-record-user-date">{{ item.date }}</view>
27
+ </view>
28
+ </view>
29
+ <view class="ml-approval-record-user-item-comment">
30
+ <text>{{ item.comment }}</text>
31
+ </view>
32
+ </view>
33
+ </view>
34
+ </view>
35
+ </view>
36
+ </view>
37
+ </template>
38
+
39
+ <script>
40
+ export default {
41
+ name: 'MlApprovalRecord',
42
+ props: {
43
+ value: Array,
44
+ options: Array
45
+ }
46
+ }
47
+ </script>
48
+
49
+ <style lang="scss">
50
+ .ml-approval-record {
51
+ background: #ffffff;
52
+ padding: 20rpx;
53
+ border-radius: 10rpx;
54
+ font-size: 30rpx;
55
+ }
56
+ .ml-approval-record-header-title {
57
+ font-weight: 700;
58
+ line-height: 60rpx;
59
+ }
60
+ .ml-approval-record-list {
61
+ position: relative;
62
+ padding-bottom: 10rpx;
63
+ .ml-approval-record-flow-line {
64
+ position: absolute;
65
+ top: 0;
66
+ left: 0;
67
+ height: 100%;
68
+ width: 4rpx;
69
+ background: #D9D9D9;
70
+ &::before {
71
+ content: "";
72
+ position: absolute;
73
+ top: 16rpx;
74
+ left: -8rpx;
75
+ width: 20rpx;
76
+ height: 20rpx;
77
+ border-radius: 50%;
78
+ background: #D9D9D9;
79
+ }
80
+ }
81
+ &:first-child {
82
+ .ml-approval-record-flow-line {
83
+ top: 16rpx;
84
+ &::before {
85
+ top: 0;
86
+ }
87
+ }
88
+ }
89
+ &:last-child {
90
+ .ml-approval-record-flow-line {
91
+ height: 30rpx;
92
+ }
93
+ }
94
+ }
95
+ .ml-approval-record-item-title {
96
+ padding-left: 40rpx;
97
+ line-height: 50rpx;
98
+ }
99
+ .ml-approval-record-users {
100
+ display: flex;
101
+ flex-direction: column;
102
+ padding-left: 40rpx;
103
+ }
104
+ .ml-approval-record-user-item {
105
+ display: flex;
106
+ flex-direction: column;
107
+ padding: 10rpx;
108
+ .ml-approval-record-user-item-info {
109
+ display: flex;
110
+ flex-direction: row;
111
+ }
112
+ .ml-approval-record-user-item-left {
113
+ flex-shrink: 0;
114
+ }
115
+ .ml-approval-record-user-item-content {
116
+ flex-grow: 1;
117
+ padding: 0 10rpx;
118
+ }
119
+ .ml-approval-record-user-item-right {
120
+ flex-shrink: 0;
121
+ }
122
+ .ml-approval-record-user-item-top {
123
+ line-height: 40rpx;
124
+ }
125
+ .ml-approval-record-user-picture {
126
+ width: 100rpx;
127
+ height: 100rpx;
128
+ border-radius: 50%;
129
+ }
130
+ .ml-approval-record-user-name {
131
+ display: inline-block;
132
+ vertical-align: middle;
133
+ max-width: 150rpx;
134
+ overflow: hidden;
135
+ text-overflow: ellipsis;
136
+ white-space: nowrap;
137
+ margin-right: 10rpx;
138
+ color: rgba(0, 0, 0, 0.85);
139
+ }
140
+ .ml-approval-record-user-role {
141
+ font-size: 24rpx;
142
+ color: rgba(0, 0, 0, 0.86);
143
+ }
144
+ .ml-approval-record-user-date {
145
+ font-size: 24rpx;
146
+ }
147
+ .ml-approval-record-user-item-comment{
148
+ padding: 20rpx;
149
+ background: #F0F2F5;
150
+ height: 160rpx;
151
+ border-radius: 10rpx;
152
+ overflow: auto;
153
+ }
154
+ }
155
+ </style>
@@ -0,0 +1,107 @@
1
+ <template>
2
+ <view class="ml-approval-select">
3
+ <view class="ml-approval-select-header">
4
+ <view class="ml-approval-select-header-title">审批流程</view>
5
+ </view>
6
+ <view class="ml-approval-select-body">
7
+ <view class="ml-approval-select-list" v-for="(group, index) in options" :key="index">
8
+ <view class="ml-approval-select-item">
9
+ <view class="ml-approval-select-item-title">{{ group.name }}</view>
10
+ </view>
11
+ <view class="ml-approval-select-users">
12
+ <view class="ml-approval-select-user-item" v-for="(item, index) in group.users" :key="index">
13
+ <image class="ml-approval-select-user-picture" :src="item.picture" mode="scaleToFill"></image>
14
+ <view class="ml-approval-select-user-name">{{ item.name }}</view>
15
+ <view class="ml-approval-select-user-remove">
16
+ <ml-icon name="close"></ml-icon>
17
+ </view>
18
+ </view>
19
+ <view class="ml-approval-select-user-add">
20
+ <view class="ml-approval-select-user-add-icon">
21
+ <ml-icon name="add"></ml-icon>
22
+ </view>
23
+ </view>
24
+ </view>
25
+ </view>
26
+ </view>
27
+ </view>
28
+ </template>
29
+
30
+ <script>
31
+ export default {
32
+ name: 'MlApprovalSelect',
33
+ props: {
34
+ value: Array,
35
+ options: Array
36
+ }
37
+ }
38
+ </script>
39
+
40
+ <style lang="scss">
41
+ .ml-approval-select {
42
+ background: #ffffff;
43
+ padding: 20rpx;
44
+ border-radius: 10rpx;
45
+ font-size: 30rpx;
46
+ }
47
+ .ml-approval-select-header-title {
48
+ font-weight: 700;
49
+ line-height: 60rpx;
50
+ }
51
+ .ml-approval-select-list {
52
+ padding-bottom: 10rpx;
53
+ }
54
+ .ml-approval-select-item-title {
55
+ padding-left: 20rpx;
56
+ line-height: 50rpx;
57
+ }
58
+ .ml-approval-select-users {
59
+ display: flex;
60
+ flex-direction: row;
61
+ flex-wrap: wrap;
62
+ }
63
+ .ml-approval-select-user-item {
64
+ position: relative;
65
+ padding: 10rpx;
66
+ width: 150rpx;
67
+ text-align: center;
68
+ .ml-approval-select-user-picture {
69
+ width: 100rpx;
70
+ height: 100rpx;
71
+ border-radius: 50%;
72
+ }
73
+ .ml-approval-select-user-name {
74
+ overflow: hidden;
75
+ text-overflow: ellipsis;
76
+ white-space: nowrap;
77
+ font-size: 24rpx;
78
+ }
79
+ .ml-approval-select-user-remove {
80
+ position: absolute;
81
+ top: 0;
82
+ right: 10rpx;
83
+ width: 40rpx;
84
+ height: 40rpx;
85
+ line-height: 40rpx;
86
+ border-radius: 50%;
87
+ text-align: center;
88
+ color: #ffffff;
89
+ background: rgba(0, 0, 0, 0.45);
90
+ }
91
+ }
92
+ .ml-approval-select-user-add {
93
+ padding: 10rpx;
94
+ width: 160rpx;
95
+ text-align: center;
96
+ .ml-approval-select-user-add-icon {
97
+ width: 100rpx;
98
+ height: 100rpx;
99
+ line-height: 100rpx;
100
+ border-radius: 50%;
101
+ font-size: 50rpx;
102
+ color: $uni-color-primary;
103
+ background: #DAE6FF;
104
+ overflow: hidden;
105
+ }
106
+ }
107
+ </style>
@@ -43,7 +43,7 @@ export default {
43
43
  .ml-approval-type {
44
44
  display: inline-block;
45
45
  color: #ffffff;
46
- padding: 6rpx 18rpx;
46
+ padding: 4rpx 16rpx;
47
47
  border-radius: 10rpx;
48
48
  font-size: 24rpx;
49
49
  }
@@ -61,8 +61,13 @@ export default {
61
61
  .ml-checkbox-icon {
62
62
  display: inline-block;
63
63
  width: 40rpx;
64
- margin-right: 5rpx;
64
+ margin-right: 10rpx;
65
65
  text-align: center;
66
+ font-size: 1.3em;
67
+ }
68
+ .ml-checkbox-icon,
69
+ .ml-checkbox-content {
70
+ vertical-align: middle;
66
71
  }
67
72
  }
68
73
  </style>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <view class="ml-col" :class="[className || '', span && !width ? `span-${span}` : '', align ? `align-${align}` : '', {'is-flex': flex,'is-fixed': width || shrink}]" :style="styles">
2
+ <view class="ml-col" :class="[className || '', span && !width ? `span-${span}` : '', align ? `align-${align}` : '', verticalAling ? `vertical-${verticalAling}` : '', {'is-light': light, 'is-flex': verticalAling || flex,'is-fixed': width || shrink}]" :style="styles">
3
3
  <slot></slot>
4
4
  </view>
5
5
  </template>
@@ -12,15 +12,17 @@ export default {
12
12
  },
13
13
  props: {
14
14
  span: [String, Number],
15
+ light: Boolean,
15
16
  flex: Boolean,
16
17
  shrink: Boolean,
17
18
  align: String,
19
+ verticalAling: String,
18
20
  width: String,
19
21
  className: String
20
22
  },
21
23
  computed: {
22
24
  styles () {
23
- return this.width ? `width: ${this.width};` : ''
25
+ return this.width ? `width: ${this.width};` : ''
24
26
  }
25
27
  }
26
28
  }
@@ -31,6 +33,9 @@ export default {
31
33
  $spans: 4.16667%, 8.33333%, 12.5%, 16.66667%, 20.83333%, 25%, 29.16667%, 33.33333%,
32
34
  37.5%, 41.66667%, 45.83333%, 50%, 54.16667%, 58.33333%, 62.5%, 66.66667%,
33
35
  70.83333%, 75%, 79.16667%, 83.33333%, 87.5%, 91.66667%, 95.83333%, 100%;
36
+ &.is-light {
37
+ color: rgba(0, 0, 0, 0.45);
38
+ }
34
39
  &.is-flex {
35
40
  display: flex;
36
41
  flex-direction: row;
@@ -43,6 +48,9 @@ export default {
43
48
  &.align-right {
44
49
  justify-content: right;
45
50
  }
51
+ &.vertical-center {
52
+ align-items: center;
53
+ }
46
54
  }
47
55
  &.align-left {
48
56
  text-align: left;
@@ -1,5 +1,8 @@
1
1
  <template>
2
- <uni-datetime-picker :class="className" v-model="selectVal" type="date" :start="start" :end="end" @change="changeEvent" :border="border"/>
2
+ <view v-if="isFromReadonly" class="ml-date-picker is-readonly">
3
+ <view class="ml-date-picker-readonly-content">{{ value }}</view>
4
+ </view>
5
+ <uni-datetime-picker v-else :class="className" v-model="selectVal" type="date" :start="minDate" :end="maxDate" @change="changeEvent" :border="border"/>
3
6
  </template>
4
7
 
5
8
  <script>
@@ -11,15 +14,26 @@ export default {
11
14
  props: {
12
15
  value: String,
13
16
  border: Boolean,
14
- start: [String, Number],
15
- end: [String, Number],
17
+ minDate: [String, Number],
18
+ maxDate: [String, Number],
16
19
  className: String
17
20
  },
21
+ inject: {
22
+ form: {
23
+ from: 'mlForm',
24
+ default: null
25
+ }
26
+ },
18
27
  data () {
19
28
  return {
20
29
  selectVal: ''
21
30
  }
22
31
  },
32
+ computed: {
33
+ isFromReadonly () {
34
+ return this.form ? this.form.readonly : false
35
+ }
36
+ },
23
37
  watch: {
24
38
  value (value) {
25
39
  this.selectVal = value
@@ -37,4 +51,10 @@ export default {
37
51
  }
38
52
  }
39
53
  }
40
- </script>
54
+ </script>
55
+
56
+ <style lang="scss">
57
+ .ml-date-picker-readonly-content {
58
+ padding: 20rpx;
59
+ }
60
+ </style>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <uni-datetime-picker :class="className" v-model="selectDates" type="daterange" :start="start" :end="end" @change="changeEvent" :border="border" :clear-icon="clear"/>
2
+ <uni-datetime-picker :class="className" v-model="selectDates" type="daterange" :start="minDate" :end="maxDate" @change="changeEvent" :border="border" :clear-icon="clear"/>
3
3
  </template>
4
4
 
5
5
  <script>
@@ -12,8 +12,8 @@ export default {
12
12
  border: Boolean,
13
13
  startDate: String,
14
14
  endDate: String,
15
- start: [String, Number],
16
- end: [String, Number],
15
+ minDate: [String, Number],
16
+ maxDate: [String, Number],
17
17
  clear: {
18
18
  type: Boolean,
19
19
  default: true
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <uni-datetime-picker :class="className" v-model="selectVal" type="datetime" :start="start" :end="end" @change="changeEvent" :border="border"/>
2
+ <uni-datetime-picker :class="className" v-model="selectVal" type="datetime" :start="minDate" :end="maxDate" @change="changeEvent" :border="border"/>
3
3
  </template>
4
4
 
5
5
  <script>
@@ -11,8 +11,8 @@ export default {
11
11
  props: {
12
12
  value: String,
13
13
  border: Boolean,
14
- start: [String, Number],
15
- end: [String, Number],
14
+ minDate: [String, Number],
15
+ maxDate: [String, Number],
16
16
  className: String
17
17
  },
18
18
  data () {
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <uni-datetime-picker :class="className" v-model="selectDates" type="datetimerange" :start="start" :end="end" @change="changeEvent" :border="border"/>
2
+ <uni-datetime-picker :class="className" v-model="selectDates" type="datetimerange" :start="minDate" :end="maxDate" @change="changeEvent" :border="border"/>
3
3
  </template>
4
4
 
5
5
  <script>
@@ -9,11 +9,12 @@ export default {
9
9
  virtualHost: true
10
10
  },
11
11
  props: {
12
+ value: Array,
12
13
  border: Boolean,
13
14
  startDate: String,
14
15
  endDate: String,
15
- start: [String, Number],
16
- end: [String, Number],
16
+ minDate: [String, Number],
17
+ maxDate: [String, Number],
17
18
  className: String
18
19
  },
19
20
  data () {
@@ -29,11 +30,14 @@ export default {
29
30
  created () {
30
31
  if (this.startDate) {
31
32
  this.selectDates = this.startDate && this.endDate ? [this.startDate, this.endDate] : []
33
+ } else if (this.value && this.value.length) {
34
+ this.selectDates = this.value
32
35
  }
33
36
  },
34
37
  methods: {
35
38
  changeEvent (value) {
36
39
  const [startDate, endDate] = value
40
+ this.$emit('input', value)
37
41
  this.$emit('update:startDate', startDate)
38
42
  this.$emit('update:endDate', endDate)
39
43
  this.$emit('change', { startDate, endDate })
@@ -0,0 +1,59 @@
1
+ <template>
2
+ <text class="ml-dict-type" :class="[className || '', status ? `status-${status}` : '', {'is-underline': underline}]">{{ selectLabel }}</text>
3
+ </template>
4
+
5
+ <script>
6
+ export default {
7
+ name: 'MlDictType',
8
+ options: {
9
+ virtualHost: true
10
+ },
11
+ props: {
12
+ value: [Number, String],
13
+ options: Array,
14
+ status: String,
15
+ underline: Boolean,
16
+ optionProps: Object,
17
+ className: String
18
+ },
19
+ computed: {
20
+ selectLabel () {
21
+ const item = this.options ? this.options.find(item => item[this.optValueField] === this.value) : null
22
+ return item ? item[this.optLabelField] : this.value
23
+ },
24
+ optOptions () {
25
+ return Object.assign({}, this.optionProps)
26
+ },
27
+ optLabelField () {
28
+ return this.optOptions.label || 'label'
29
+ },
30
+ optValueField () {
31
+ return this.optOptions.value || 'value'
32
+ }
33
+ }
34
+ }
35
+ </script>
36
+
37
+ <style lang="scss">
38
+ .ml-dict-type {
39
+ padding: 0 4rpx;
40
+ &.is-underline {
41
+ text-decoration: underline;
42
+ }
43
+ &.status-primary {
44
+ color: $uni-color-primary;
45
+ }
46
+ &.status-success {
47
+ color: $uni-color-success;
48
+ }
49
+ &.status-info {
50
+ color: #909399;
51
+ }
52
+ &.status-warning {
53
+ color: $uni-color-warning;
54
+ }
55
+ &.status-danger {
56
+ color: $uni-color-error;
57
+ }
58
+ }
59
+ </style>
@@ -77,7 +77,7 @@ export default {
77
77
  return {}
78
78
  })
79
79
  },
80
- updateModel ({ field, value}) {
80
+ updateModel ({ field, value }) {
81
81
  this.$emit('input', { ...this.value, [field]: value })
82
82
  }
83
83
  }
@@ -87,5 +87,6 @@ export default {
87
87
  <style lang="scss">
88
88
  .ml-form {
89
89
  display: block;
90
+ font-size: $uni-font-size-base;
90
91
  }
91
92
  </style>
@@ -43,6 +43,15 @@ export default {
43
43
  }
44
44
  },
45
45
  computed: {
46
+ isRequired () {
47
+ if (this.form && this.form.formRules) {
48
+ const rules = this.form.formRules[this.field]
49
+ if (rules && rules.some(item => item.required)) {
50
+ return true
51
+ }
52
+ }
53
+ return false
54
+ },
46
55
  itemValue () {
47
56
  return this.formData[this.field]
48
57
  },
@@ -28,7 +28,7 @@ export default {
28
28
  .ml-full-watermark-text{
29
29
  float: left;
30
30
  padding: 0 50rpx;
31
- color: rgba(169,169,169,0.2);
31
+ color: rgba(169,169,169,0.15);
32
32
  text-align: center;
33
33
  font-size: 22rpx;
34
34
  margin: 80rpx 0;
@@ -1,5 +1,8 @@
1
1
  <template>
2
- <view class="ml-input" :class="[className || '', {'is-right': align === 'right', 'is-border': border, 'is-prefix': prefixIcon || type === 'search', 'is-suffix': suffixIcon, 'is-disabled': disabled}]">
2
+ <view v-if="isFromReadonly" class="ml-input is-readonly">
3
+ <view class="ml-input-readonly-content">{{ inpVal }}</view>
4
+ </view>
5
+ <view v-else class="ml-input" :class="[className || '', {'is-right': align === 'right', 'is-border': border, 'is-prefix': prefixIcon || type === 'search', 'is-suffix': suffixIcon, 'is-disabled': disabled}]">
3
6
  <view v-if="prefixIcon || type === 'search'" class="ml-input-prefix-icon">
4
7
  <ml-icon v-if="prefixIcon" :className="prefixIcon"></ml-icon>
5
8
  <ml-icon v-else name="search"></ml-icon>
@@ -38,11 +41,22 @@ export default {
38
41
  },
39
42
  className: String
40
43
  },
44
+ inject: {
45
+ form: {
46
+ from: 'mlForm',
47
+ default: null
48
+ }
49
+ },
41
50
  data () {
42
51
  return {
43
52
  inpVal: ''
44
53
  }
45
54
  },
55
+ computed: {
56
+ isFromReadonly () {
57
+ return this.form ? this.form.readonly : false
58
+ }
59
+ },
46
60
  watch: {
47
61
  value (val) {
48
62
  this.inpVal = val
@@ -69,6 +83,9 @@ export default {
69
83
  .ml-input {
70
84
  display: flex;
71
85
  flex-direction: row;
86
+ .ml-input-readonly-content {
87
+ padding: 20rpx;
88
+ }
72
89
  .ml-input-inp {
73
90
  padding: 0 20rpx;
74
91
  height: 70rpx;
@@ -64,7 +64,7 @@ export default {
64
64
  background: #ffffff;
65
65
  .ml-list-item-content {
66
66
  display: flex;
67
- flex-direction: row;
67
+ flex-direction: column;
68
68
  flex-grow: 1;
69
69
  overflow: hidden;
70
70
  text-overflow: ellipsis;
@@ -50,8 +50,12 @@ export default {
50
50
  color: $uni-color-primary;
51
51
  }
52
52
  .ml-radio-icon {
53
- font-size: 1.1em;
54
53
  margin-right: 10rpx;
54
+ font-size: 1.4em;
55
+ }
56
+ .ml-radio-icon,
57
+ .ml-radio-content {
58
+ vertical-align: middle;
55
59
  }
56
60
  }
57
61
  </style>
@@ -1,8 +1,11 @@
1
1
  <template>
2
- <picker class="ml-select-picker" :style="{width: width || '100%'}" :range="optionList" :range-key="optLabelField" @change="changeEvent">
2
+ <view v-if="isFromReadonly" class="ml-select-picker is-readonly">
3
+ <view class="ml-select-picker-readonly-content">{{ selectLabel }}</view>
4
+ </view>
5
+ <picker v-else class="ml-select-picker" :style="{width: width || '100%'}" :range="optionList" :range-key="optLabelField" @change="changeEvent">
3
6
  <view class="ml-select-picker-warpper" :class="[className || '', {'is-border': border}]">
4
7
  <view class="ml-select-picker-text">
5
- <text v-if="value !== null">{{ selectName }}</text>
8
+ <text v-if="value !== null">{{ selectLabel }}</text>
6
9
  <text v-else class="picker-placeholder">{{ placeholder }}</text>
7
10
  </view>
8
11
  <view class="ml-select-picker-icon">
@@ -31,11 +34,20 @@ export default {
31
34
  isAll: Boolean,
32
35
  className: String
33
36
  },
37
+ inject: {
38
+ form: {
39
+ from: 'mlForm',
40
+ default: null
41
+ }
42
+ },
34
43
  data () {
35
44
  return {
36
45
  }
37
46
  },
38
47
  computed: {
48
+ isFromReadonly () {
49
+ return this.form ? this.form.readonly : false
50
+ },
39
51
  optionList () {
40
52
  if (this.isAll) {
41
53
  return [
@@ -45,9 +57,9 @@ export default {
45
57
  }
46
58
  ].concat(this.options)
47
59
  }
48
- return this.options
60
+ return this.options || []
49
61
  },
50
- selectName () {
62
+ selectLabel () {
51
63
  const item = this.optionList.find(item => item[this.optValueField] === this.value)
52
64
  return item ? item[this.optLabelField] : this.value
53
65
  },
@@ -70,7 +82,7 @@ export default {
70
82
  value = item[this.optValueField]
71
83
  }
72
84
  this.$emit('input', value)
73
- this.$emit('change', value)
85
+ this.$emit('change', { value })
74
86
  }
75
87
  }
76
88
  }
@@ -89,6 +101,9 @@ export default {
89
101
  width: 100%;
90
102
  color: #6a6a6a;
91
103
  }
104
+ .ml-select-picker-readonly-content {
105
+ padding: 20rpx;
106
+ }
92
107
  .ml-select-picker-warpper {
93
108
  position: relative;
94
109
  display: flex;
@@ -0,0 +1,41 @@
1
+ <template>
2
+ <text class="ml-text" :class="[className || '', status ? `status-${status}` : '', {'is-underline': underline}]">
3
+ <slot>{{ content }}</slot>
4
+ </text>
5
+ </template>
6
+
7
+ <script>
8
+ export default {
9
+ name: 'MlText',
10
+ props: {
11
+ status: String,
12
+ content: String,
13
+ underline: Boolean,
14
+ className: String
15
+ }
16
+ }
17
+ </script>
18
+
19
+ <style lang="scss">
20
+ .ml-text {
21
+ padding: 0 4rpx;
22
+ &.is-underline {
23
+ text-decoration: underline;
24
+ }
25
+ &.status-primary {
26
+ color: $uni-color-primary;
27
+ }
28
+ &.status-success {
29
+ color: $uni-color-success;
30
+ }
31
+ &.status-info {
32
+ color: #909399;
33
+ }
34
+ &.status-warning {
35
+ color: $uni-color-warning;
36
+ }
37
+ &.status-danger {
38
+ color: $uni-color-error;
39
+ }
40
+ }
41
+ </style>
@@ -1,5 +1,8 @@
1
1
  <template>
2
- <view class="ml-textarea" :class="[className || '', {'is-border': border}]">
2
+ <view v-if="isFromReadonly" class="ml-textarea is-readonly">
3
+ <view class="ml-textarea-readonly-content">{{ inpVal }}</view>
4
+ </view>
5
+ <view v-else class="ml-textarea" :class="[className || '', {'is-border': border}]">
3
6
  <view v-if="readonly" class="ml-textarea-content">{{ inpVal }}</view>
4
7
  <view v-else>
5
8
  <textarea class="ml-textarea-inp" v-model="inpVal" :rows="rows" :maxlength="maxLength" :placeholder="placeholder" @input="inputEvent" :style="{color: fontColor, height: `${rows * 30}rpx`}"></textarea>
@@ -52,11 +55,22 @@ export default {
52
55
  fontColor: String,
53
56
  className: String
54
57
  },
58
+ inject: {
59
+ form: {
60
+ from: 'mlForm',
61
+ default: null
62
+ }
63
+ },
55
64
  data () {
56
65
  return {
57
66
  inpVal: ''
58
67
  }
59
68
  },
69
+ computed: {
70
+ isFromReadonly () {
71
+ return this.form ? this.form.readonly : false
72
+ }
73
+ },
60
74
  watch: {
61
75
  value (val) {
62
76
  this.inpVal = val
@@ -86,6 +100,9 @@ export default {
86
100
  border: 1px solid #e5e5e5;
87
101
  border-radius: 10rpx;
88
102
  }
103
+ .ml-textarea-readonly-content {
104
+ padding: 0;
105
+ }
89
106
  .ml-textarea-content {
90
107
  width: 100%;
91
108
  overflow: auto;
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <view class="ml-upload" :class="className">
3
- <view v-if="readonly">
3
+ <view v-if="isFromReadonly">
4
4
  <view v-if="mediatype === 'image'" class="ml-upload-image-list">
5
5
  <view class="ml-upload-file-item" v-for="(item, index) in value" :key="index">
6
6
  <image class="ml-upload-file-img" mode="aspectFill" :src="getUrl(item)" @click="previewEvent(item, index)"></image>
@@ -72,6 +72,12 @@ export default {
72
72
  uploadFile: Function,
73
73
  removeFile: Function
74
74
  },
75
+ inject: {
76
+ form: {
77
+ from: 'mlForm',
78
+ default: null
79
+ }
80
+ },
75
81
  data () {
76
82
  return {
77
83
  fileList: [],
@@ -89,6 +95,12 @@ export default {
89
95
  }
90
96
  },
91
97
  computed: {
98
+ isFromReadonly () {
99
+ if (this.readonly) {
100
+ return true
101
+ }
102
+ return this.form ? this.form.readonly : false
103
+ },
92
104
  imageList () {
93
105
  return this.value ? this.value.filter(item => this.imgTypes.includes(item[this.typeField])) : []
94
106
  },
@@ -157,8 +169,10 @@ export default {
157
169
  }
158
170
  },
159
171
  updateModel () {
160
- this.$emit('update:urlList', this.fileList.map(item => item[this.urlField]))
172
+ const urlList = this.fileList.map(item => item[this.urlField])
173
+ this.$emit('update:urlList', urlList)
161
174
  this.$emit('input', this.fileList)
175
+ this.$emit('change', { value: this.simpleValue ? urlList : this.fileList })
162
176
  },
163
177
  async selectFile (e) {
164
178
  const { tempFiles } = e
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mali-applet-ui",
3
- "version": "0.0.43",
3
+ "version": "0.0.45",
4
4
  "description": "码里云小程序组件库",
5
5
  "files": [
6
6
  "components",