toggle-components-library 1.27.6 → 1.28.0

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toggle-components-library",
3
- "version": "1.27.6",
3
+ "version": "1.28.0",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "vue-cli-service serve",
@@ -0,0 +1,174 @@
1
+ <template>
2
+
3
+ <div class="toggle-input-container" :class="{'toggle-input-is-invalid':isInvalid, 'toggle-input-is-disabled':disabled, 'toggle-input-is-editable':editable}" v-on:click="focusClosestInput">
4
+ <label
5
+ v-if="label"
6
+ :for="name ? name : 'InputText' "
7
+ class="toggle-input-label"
8
+ > {{ label }}
9
+ </label>
10
+ <span class="toggle-input-counter" v-if="maxLength">{{messageLength(inputVal, maxLength)}}</span>
11
+ <input
12
+ :type="type"
13
+ :name="name ? name : 'ToggleInputText' "
14
+ :class="['toggle-input', size]"
15
+ :placeholder="placeholder ? placeholder : ''"
16
+ :required="required"
17
+ v-model="inputVal"
18
+ :maxlength="maxLength"
19
+ :disabled="disabled"
20
+ :editable="editable"
21
+ ref="toggle-input"
22
+ />
23
+ <ToggleButton
24
+ v-if="editable"
25
+ buttonStyle="mini_edit"
26
+ @click="editText"
27
+ />
28
+ <label
29
+ class="toggle-input-label-error"
30
+ v-if="isInvalid"
31
+ :for="name ? name : 'ToggleInputText' "
32
+ >
33
+ {{ errorMessage }}
34
+ </label>
35
+ </div>
36
+ </template>
37
+
38
+ <script>
39
+
40
+ import { mixins } from '../mixins/mixins'
41
+
42
+ import ToggleButton from '../buttons/ToggleButton.vue';
43
+
44
+ export default {
45
+ mixins:[mixins],
46
+ components:{ToggleButton},
47
+ data: function() {
48
+ return {
49
+ disabled: true
50
+ };
51
+ },
52
+ props: {
53
+ value: {
54
+ type: [Number,String]
55
+ },
56
+ type: {
57
+ type: String,
58
+ required: true,
59
+ validator: function (value) {
60
+ return ['text', 'email', 'number', 'password'].indexOf(value) !== -1
61
+ }
62
+ },
63
+ name: {
64
+ type: String,
65
+ default: "ToggleInputText"
66
+ },
67
+ label: {
68
+ type: String,
69
+ required: false
70
+ },
71
+ placeholder: {
72
+ type: String,
73
+ required: false
74
+ },
75
+ size: {
76
+ type: String,
77
+ validator: function (value) {
78
+ return ['extra-small', 'small', 'medium', 'large', 'full'].indexOf(value) !== -1
79
+ }
80
+ },
81
+ required: {
82
+ type: Boolean,
83
+ default: false
84
+ },
85
+ isInvalid: {
86
+ type: Boolean,
87
+ default: false
88
+ },
89
+ errorMessage: {
90
+ type: String,
91
+ required: false
92
+ },
93
+ maxLength:{
94
+ type: Number,
95
+ required:false
96
+ },
97
+ includeEmojiEntitiesInCharCount: {
98
+ descripion: "If true, emoji's are counted as the length of their HTML entities rather than a signle character length",
99
+ type: Boolean,
100
+ required: false,
101
+ default: false
102
+ },
103
+ readonly: {
104
+ type: Boolean,
105
+ required: false,
106
+ default: false
107
+ },
108
+ editable: {
109
+ type: Boolean,
110
+ required: false,
111
+ default: false
112
+ }
113
+ },
114
+
115
+ created : function(){
116
+ },
117
+ computed: {
118
+ inputVal: {
119
+ get: function (){
120
+ return this.value;
121
+ },
122
+
123
+ set: function (value){
124
+ this.$emit('input', value);
125
+ }
126
+ }
127
+ },
128
+ methods: {
129
+
130
+ /*
131
+ * Concat message for count characters
132
+ * @return string
133
+ */
134
+ messageLength(msg, maxLength)
135
+ {
136
+ let message = msg;
137
+ let mcount = 0;
138
+
139
+ // If the emoji flag is set, make sure the character count takes account of the decoded emoji characters (this will include £ signs)
140
+ if (this.includeEmojiEntitiesInCharCount && msg) {
141
+
142
+ message = this.convertEmojis(msg);
143
+ mcount = message ? message.length : 0;
144
+
145
+ } else {
146
+ mcount = message ? message.length : 0;
147
+ }
148
+
149
+ return mcount+' / '+maxLength;
150
+ },
151
+
152
+ editText() {
153
+ this.disabled = !this.disabled;
154
+
155
+ if(!this.disabled){
156
+ this.$nextTick( () => {
157
+ this.$refs["toggle-input"].focus();
158
+ });
159
+ }
160
+ },
161
+
162
+ onFocus() {
163
+ this.$emit('onFocus');
164
+ },
165
+
166
+ onBlur(){
167
+ this.$emit('onBlur');
168
+ },
169
+ }
170
+ }
171
+
172
+
173
+ </script>
174
+
@@ -6,7 +6,7 @@
6
6
  </label>
7
7
 
8
8
  <div class="input-holder">
9
- <multiselect v-model="inputVal" :options="options" :multiple="true" :close-on-select="true" :clear-on-select="false" :preserve-search="true" :placeholder="placeholder" label="label" track-by="value" :preselect-first="false">
9
+ <multiselect v-model="inputVal" :options="options" :multiple="multiple" :close-on-select="true" :clear-on-select="false" :preserve-search="true" :placeholder="placeholder" label="label" track-by="value" :preselect-first="false">
10
10
  </multiselect>
11
11
  </div>
12
12
 
@@ -50,6 +50,11 @@ export default {
50
50
  errorMessage: {
51
51
  type: String,
52
52
  required: false
53
+ },
54
+ multiple: {
55
+ type: Boolean,
56
+ default: true,
57
+ required: false
53
58
  }
54
59
  },
55
60
  computed: {
@@ -1,10 +1,9 @@
1
1
  <template>
2
2
  <div class="toggle-copy-text">
3
3
  <p @click="copyLink($refs.copyLink)"><label>{{copy}}</label><br v-if="copy"/>
4
- <strong>
5
- <a :style="{fontSize}" ref="copyLink">{{ link }}</a>
6
- </strong>
7
- <span class="product-link-icon"></span>
4
+ <a :class="{loading:loading, done:done}" :style="{fontSize}" ref="copyLink">
5
+ {{ link }}
6
+ </a>
8
7
  </p>
9
8
  </div>
10
9
  </template>
@@ -12,6 +11,12 @@
12
11
  <script>
13
12
  export default {
14
13
  name: 'ToggleTextClipboardCopy',
14
+ data: function() {
15
+ return {
16
+ loading: false,
17
+ done: false
18
+ };
19
+ },
15
20
  props: {
16
21
  fontSize: {
17
22
  type:String,
@@ -29,32 +34,38 @@ export default {
29
34
  link: {
30
35
  type: String,
31
36
  required: true
32
- },
33
- /**
34
- * The url for the link
35
- */
36
- url: {
37
- type: String,
38
- required: true
39
- },
37
+ }
40
38
  },
41
39
  methods:{
42
40
  copyLink(el) {
43
41
  let range = document.createRange();
44
- range.selectNode(el);
42
+ range.selectNode(el.firstChild);
45
43
  window.getSelection().removeAllRanges();
46
44
  window.getSelection().addRange(range);
47
45
  document.execCommand("copy");
48
46
  this.click();
47
+ this.loadingDoneAnimation();
49
48
  },
50
49
  click(){
51
- /**
52
- * Emitted when the button is clicked.
53
- * @event click
54
- * @type {Event}
55
- */
56
- this.$emit('click');
57
- }
50
+ /**
51
+ * Emitted when the button is clicked.
52
+ * @event click
53
+ * @type {Event}
54
+ */
55
+ this.$emit('click');
56
+ },
57
+ loadingDoneAnimation() {
58
+ this.done = false; // Reset
59
+ this.loading = false; // Reset
60
+ this.loading = true;
61
+ setTimeout(() => {
62
+ this.loading = false;
63
+ this.done = true;
64
+ setTimeout(() => {
65
+ this.done = false;
66
+ }, 1500);
67
+ }, 500);
68
+ },
58
69
  }
59
70
  };
60
71
  </script>
package/src/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import Vue from "vue";
2
2
 
3
3
  import ToggleInputText from "./components/forms/ToggleInputText.vue";
4
+ import ToggleInputEditableText from "./components/forms/ToggleInputEditableText.vue";
4
5
  import ToggleInputWebsite from "./components/forms/ToggleInputWebsite.vue";
5
6
  import ToggleDatePicker from "./components/forms/ToggleDatePicker.vue";
6
7
  import ToggleDateRangePicker from "./components/forms/ToggleDateRangePicker.vue";
@@ -82,6 +83,7 @@ const Components = {
82
83
  ToggleBadge,
83
84
  ToggleTableColumn,
84
85
  ToggleInputText,
86
+ ToggleInputEditableText,
85
87
  ToggleInputWebsite,
86
88
  ToggleDatePicker,
87
89
  ToggleDateRangePicker,
@@ -926,6 +926,14 @@ $iconWidth:20px;
926
926
 
927
927
  }
928
928
 
929
-
930
-
931
-
929
+ .toggle-input-is-editable{
930
+ .toggle-input{
931
+ width: 90%;
932
+ }
933
+ .toggle-button-container{
934
+ position: absolute;
935
+ right: 20px;
936
+ top: 50%;
937
+ transform: translate(0, -50%);
938
+ }
939
+ }
@@ -39,19 +39,57 @@ a {
39
39
  margin: 0.25rem 0;
40
40
  }
41
41
  a {
42
- font-weight: bold;
42
+ display: block;
43
+ padding: 0 3rem 0 0;
44
+ position: relative;
45
+ cursor: pointer;
46
+ overflow: hidden;
47
+ text-overflow: ellipsis;
48
+ white-space: nowrap;
49
+ transition: all 0.1s ease;
43
50
  &::after{
44
51
  background-image: url("../assets/icons/clipboard.svg");
45
- content:'';
46
- position: static;
47
- padding-right: 1.5rem;
48
- width: $toggle-font-size-regular;
49
- height: $toggle-font-size-regular;
50
- margin-right: 1rem;
52
+ content: '';
53
+ position: absolute;
54
+ width: 1.5rem;
55
+ right: 0;
51
56
  background-position: center;
52
57
  background-size: contain;
53
58
  background-repeat: no-repeat;
54
- cursor:copy;
59
+ cursor: pointer;
60
+ height: 1.2rem;
61
+ top: 0;
62
+ }
63
+ &.loading{
64
+ &:after{
65
+ background: none transparent;
66
+ outline: none;
67
+ border-radius: 50% !important;
68
+ border: 0.25rem solid rgba(0, 0, 0, 0.1);
69
+ border-top-color: white;
70
+ height: 0.7rem;
71
+ width: 0.7rem;
72
+ top: 0;
73
+ animation: spin 0.6s infinite linear;
74
+ }
75
+ }
76
+ &.done{
77
+ &:after{
78
+ background-image: url("../assets/icons/tick_circle.svg");
79
+ }
80
+ }
81
+ .tooltip {
82
+ width: 30%;
83
+ background-color: #3ea8d5;
84
+ color: #fff;
85
+ text-align: center;
86
+ border-radius: 4px;
87
+ padding: 5px 0;
88
+ position: absolute;
89
+ z-index: 1;
90
+ top: 50%;
91
+ left: 50%;
92
+ transform: translate(-50%,-50%);
55
93
  }
56
94
  }
57
95
  }