You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							150 lines
						
					
					
						
							3.1 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							150 lines
						
					
					
						
							3.1 KiB
						
					
					
				
								const styles = (v ='') =>  v.split(';').filter(v => v && !/^[\n\s]+$/.test(v)).map(v => {
							 | 
						|
														const key = v.slice(0, v.indexOf(':'))
							 | 
						|
														const value = v.slice(v.indexOf(':')+1)
							 | 
						|
														return {
							 | 
						|
															[key
							 | 
						|
																.replace(/-([a-z])/g, function() { return arguments[1].toUpperCase()})
							 | 
						|
																.replace(/\s+/g, '')
							 | 
						|
															]: value.replace(/^\s+/, '').replace(/\s+$/, '') || ''
							 | 
						|
														}
							 | 
						|
													})
							 | 
						|
								export function parent(parent) {
							 | 
						|
									return {
							 | 
						|
										provide() {
							 | 
						|
											return {
							 | 
						|
												[parent]: this
							 | 
						|
											}
							 | 
						|
										},
							 | 
						|
										data() {
							 | 
						|
											return {
							 | 
						|
												el: {
							 | 
						|
													id: null,
							 | 
						|
													css: {},
							 | 
						|
													views: []
							 | 
						|
												},
							 | 
						|
											}
							 | 
						|
										},
							 | 
						|
										watch: {
							 | 
						|
											css: { 
							 | 
						|
												handler(v) {
							 | 
						|
													if(this.canvasId) {
							 | 
						|
														this.el.css = (typeof v == 'object' ? v : v && Object.assign(...styles(v))) || {}
							 | 
						|
														this.canvasWidth = this.el.css && this.el.css.width || this.canvasWidth
							 | 
						|
														this.canvasHeight = this.el.css && this.el.css.height || this.canvasHeight
							 | 
						|
													}
							 | 
						|
												},
							 | 
						|
												immediate: true
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								export function children(parent, options = {}) {
							 | 
						|
									const indexKey = options.indexKey || 'index'
							 | 
						|
									return {
							 | 
						|
										inject: {
							 | 
						|
											[parent]: {
							 | 
						|
												default: null
							 | 
						|
											}
							 | 
						|
										},
							 | 
						|
										watch: {
							 | 
						|
											el: {
							 | 
						|
												handler(v, o) {
							 | 
						|
													if(JSON.stringify(v) != JSON.stringify(o))
							 | 
						|
														this.bindRelation()
							 | 
						|
												},
							 | 
						|
												deep: true,
							 | 
						|
												immediate: true
							 | 
						|
											},
							 | 
						|
											src: {
							 | 
						|
												handler(v, o) {
							 | 
						|
													if(v != o)
							 | 
						|
														this.bindRelation()
							 | 
						|
												},
							 | 
						|
												immediate: true
							 | 
						|
											},
							 | 
						|
											text: {
							 | 
						|
												handler(v, o) {
							 | 
						|
													if(v != o) this.bindRelation()
							 | 
						|
												},
							 | 
						|
												immediate: true
							 | 
						|
											},
							 | 
						|
											css: {
							 | 
						|
												handler(v, o) {
							 | 
						|
													if(v != o)
							 | 
						|
														this.el.css = (typeof v == 'object' ? v : v && Object.assign(...styles(v))) || {}
							 | 
						|
												},
							 | 
						|
												immediate: true
							 | 
						|
											},
							 | 
						|
											replace: {
							 | 
						|
												handler(v, o) {
							 | 
						|
													if(JSON.stringify(v) != JSON.stringify(o))
							 | 
						|
														this.bindRelation()
							 | 
						|
												},
							 | 
						|
												deep: true,
							 | 
						|
												immediate: true
							 | 
						|
											}
							 | 
						|
										},
							 | 
						|
										created() {
							 | 
						|
											if(!this._uid) {
							 | 
						|
												this._uid = this._.uid
							 | 
						|
											}
							 | 
						|
											Object.defineProperty(this, 'parent', {
							 | 
						|
												get: () => this[parent] || [],
							 | 
						|
											})
							 | 
						|
											Object.defineProperty(this, 'index', {
							 | 
						|
												get: () =>  {
							 | 
						|
													this.bindRelation();
							 | 
						|
													const {parent: {el: {views=[]}={}}={}} = this
							 | 
						|
													return views.indexOf(this.el)
							 | 
						|
												},
							 | 
						|
											});
							 | 
						|
											this.el.type = this.type
							 | 
						|
											if(this.uid) {
							 | 
						|
												this.el.uid = this.uid
							 | 
						|
											}
							 | 
						|
											this.bindRelation()
							 | 
						|
										},
							 | 
						|
										// #ifdef VUE3
							 | 
						|
										beforeUnmount() {
							 | 
						|
											this.removeEl()
							 | 
						|
										},
							 | 
						|
										// #endif
							 | 
						|
										// #ifdef VUE2
							 | 
						|
										beforeDestroy() {
							 | 
						|
											this.removeEl()
							 | 
						|
										},
							 | 
						|
										// #endif
							 | 
						|
										methods: {
							 | 
						|
											removeEl() {
							 | 
						|
												if (this.parent) {
							 | 
						|
													this.parent.el.views = this.parent.el.views.filter(
							 | 
						|
														(item) => item._uid !== this._uid
							 | 
						|
													);
							 | 
						|
												}
							 | 
						|
											},
							 | 
						|
											bindRelation() {
							 | 
						|
												if(!this.el._uid) {
							 | 
						|
													this.el._uid = this._uid 
							 | 
						|
												}
							 | 
						|
												if(['text','qrcode'].includes(this.type)) {
							 | 
						|
													this.el.text = this.$slots && this.$slots.default && this.$slots.default[0].text || `${this.text || ''}`.replace(/\\n/g, '\n')
							 | 
						|
												}
							 | 
						|
												if(this.type == 'image') {
							 | 
						|
													this.el.src = this.src
							 | 
						|
												}
							 | 
						|
												if (!this.parent) {
							 | 
						|
													return;
							 | 
						|
												}
							 | 
						|
												let views = this.parent.el.views || [];
							 | 
						|
												if(views.indexOf(this.el) !== -1) {
							 | 
						|
													this.parent.el.views = views.map(v => v._uid == this._uid ? this.el : v)
							 | 
						|
												} else {
							 | 
						|
													this.parent.el.views = [...views, this.el];
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										},
							 | 
						|
										mounted() {
							 | 
						|
											// this.bindRelation()
							 | 
						|
										},
							 | 
						|
									}
							 | 
						|
								}
							 |