quasar-ui-sellmate-ui-kit 3.11.1 → 3.11.2

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 (84) hide show
  1. package/.eslintrc.cjs +104 -104
  2. package/.prettierrc +25 -25
  3. package/README.md +156 -156
  4. package/dist/index.common.js +2 -2
  5. package/dist/index.css +1 -1
  6. package/dist/index.esm.js +2 -2
  7. package/dist/index.min.css +1 -1
  8. package/dist/index.rtl.css +1 -1
  9. package/dist/index.rtl.min.css +1 -1
  10. package/dist/index.umd.js +4417 -4405
  11. package/dist/index.umd.min.js +2 -2
  12. package/html/assets/index-iPSQW1bz.css +1 -1
  13. package/html/assets/index-pzCGhZhc.js +35 -35
  14. package/html/favicon.svg +5 -5
  15. package/html/index.html +26 -26
  16. package/package.json +95 -95
  17. package/src/assets/icons.js +63 -63
  18. package/src/components/SBadge.vue +75 -75
  19. package/src/components/SButton.vue +206 -206
  20. package/src/components/SButtonGroup.vue +41 -41
  21. package/src/components/SButtonToggle.vue +200 -200
  22. package/src/components/SCaution.vue +143 -143
  23. package/src/components/SCheckbox.vue +123 -123
  24. package/src/components/SChip.vue +99 -99
  25. package/src/components/SDate.vue +664 -664
  26. package/src/components/SDateAutoRangePicker.vue +311 -311
  27. package/src/components/SDatePicker.vue +465 -465
  28. package/src/components/SDateRange.vue +382 -382
  29. package/src/components/SDateRangePicker.vue +582 -582
  30. package/src/components/SDateTimePicker.vue +259 -259
  31. package/src/components/SDialog.vue +250 -250
  32. package/src/components/SDropdown.vue +273 -273
  33. package/src/components/SEditor.vue +590 -590
  34. package/src/components/SFilePicker.vue +207 -207
  35. package/src/components/SHelp.vue +126 -126
  36. package/src/components/SHelpMessage.vue +57 -57
  37. package/src/components/SInput.vue +379 -379
  38. package/src/components/SInputCounter.vue +46 -46
  39. package/src/components/SInputNumber.vue +194 -194
  40. package/src/components/SList.vue +29 -29
  41. package/src/components/SMarkupTable.vue +142 -142
  42. package/src/components/SPagination.vue +345 -345
  43. package/src/components/SRadio.vue +78 -78
  44. package/src/components/SRouteTab.vue +67 -67
  45. package/src/components/SSelect.vue +299 -299
  46. package/src/components/SSelectCheckbox.vue +238 -238
  47. package/src/components/SSelectCustom.vue +189 -189
  48. package/src/components/SSelectGroupCheckbox.vue +372 -372
  49. package/src/components/SSelectSearchAutoComplete.vue +172 -172
  50. package/src/components/SSelectSearchCheckbox.vue +360 -360
  51. package/src/components/SStringToInput.vue +66 -66
  52. package/src/components/STab.vue +147 -147
  53. package/src/components/STable.vue +21 -9
  54. package/src/components/STableTree.vue +502 -502
  55. package/src/components/STabs.vue +32 -32
  56. package/src/components/STag.vue +152 -152
  57. package/src/components/STimePicker.vue +186 -186
  58. package/src/components/SToggle.vue +68 -68
  59. package/src/components/STooltip.vue +209 -209
  60. package/src/components/SYearMonthPicker.vue +211 -211
  61. package/src/components/SelelctItem.vue +21 -21
  62. package/src/components/TableTreeNode.vue +177 -177
  63. package/src/components/TimePickerCard.vue +393 -393
  64. package/src/components/__tests__/SButton.test.js +18 -18
  65. package/src/components/__tests__/SInput.test.js +42 -42
  66. package/src/components/__tests__/SInputCounter.test.js +30 -30
  67. package/src/components/__tests__/SInputNumber.test.js +32 -32
  68. package/src/components/__tests__/STimePicker.spec.js +78 -78
  69. package/src/composables/date.js +11 -11
  70. package/src/composables/modelBinder.js +13 -13
  71. package/src/composables/resizable.js +55 -55
  72. package/src/composables/table/use-navigator.js +110 -110
  73. package/src/composables/table/use-resizable-tree.js +96 -96
  74. package/src/composables/table/use-resizable.js +187 -187
  75. package/src/constants/locale.js +102 -102
  76. package/src/css/app.scss +106 -106
  77. package/src/css/default.scss +393 -393
  78. package/src/css/extends.scss +177 -177
  79. package/src/css/quasar.variables.scss +187 -187
  80. package/src/directives/Directive.js +7 -7
  81. package/src/index.scss +3 -3
  82. package/src/vue-plugin.js +93 -93
  83. package/tsconfig.json +35 -35
  84. package/vitest.config.ts +31 -31
@@ -1,311 +1,311 @@
1
- <template>
2
- <q-input
3
- dense
4
- outlined
5
- :class="{
6
- 'text-Grey_Default bg-Grey_Lighten-5': disable,
7
- 's-date-auto-range-picker--inside': insideLabel,
8
- 's-date-auto-range-picker--use-icon': useDelete,
9
- }"
10
- readonly
11
- class="q-pa-none s-date-auto-range-picker bg-white"
12
- :disable="disable"
13
- @click="calendarOpen = true"
14
- data-cy="autoRangeCalendar"
15
- v-model="inputDate"
16
- >
17
- <template v-slot:before v-if="insideLabel">
18
- <div
19
- class="date-picker-label s-px-sm q-py-xs text-Grey_Darken-4 bg-Grey_Lighten-5"
20
- :class="disable
21
- ? 's-border-Grey_Lighten-2'
22
- : 's-border-Grey_Lighten-1'"
23
- >
24
- {{ insideLabel }}
25
- </div>
26
- </template>
27
- <template v-slot:prepend>
28
- <q-icon
29
- :name="dateRangeIcon"
30
- class="cursor-pointer q-pa-none no-hover"
31
- size="20px"
32
- :color="disable ? 'Grey_Default' : 'Grey_Darken-1'"
33
- >
34
- <q-menu v-model="calendarOpen" fit class="date-picker-range-wrapper" ref="dateMenuRef">
35
- <q-date
36
- v-model="dateModel.from"
37
- minimal
38
- square
39
- color="positive"
40
- class="q-pa-none"
41
- mask="YYYY-MM-DD"
42
- :locale="lang ? locale[lang] : {}"
43
- :options="optionsStartFn"
44
- @update:model-value="(value) => updateDate(value, 'from')"
45
- />
46
- <q-separator vertical />
47
- <q-date
48
- v-model="dateModel.to"
49
- minimal
50
- square
51
- color="positive"
52
- class="q-pa-none"
53
- mask="YYYY-MM-DD"
54
- :locale="lang ? locale[lang] : {}"
55
- :options="optionsEndFn"
56
- @update:model-value="(value) => updateDate(value, 'to')"
57
- >
58
- <q-btn
59
- class="reset-to-today-btn no-shadow no-hover"
60
- unelevated
61
- text-color="black"
62
- :label="locale[lang].today"
63
- @click="resetDate"
64
- />
65
- </q-date>
66
- </q-menu>
67
- </q-icon>
68
- </template>
69
- <template v-slot:default>
70
- <span class="text-center date-str">{{
71
- dateModel.from
72
- }}</span>~<span class="text-center date-str">{{
73
- dateModel.to
74
- }}</span>
75
- </template>
76
- <template v-slot:append v-if="useDelete">
77
- <q-icon
78
- :name="closeIcon"
79
- size="16px"
80
- class="cursor-pointer"
81
- @click="deleteDate"
82
- data-cy="delete-icon"
83
- />
84
- </template>
85
- </q-input>
86
- </template>
87
-
88
- <script>
89
- // @ts-check
90
- import { defineComponent, ref, computed, watch } from 'vue';
91
- import { QInput, QBtn, QDate, QMenu, QIcon, QSeparator, date } from 'quasar';
92
- import { dateRangeIcon, closeIcon } from '../assets/icons';
93
- import { initLocaleObj } from '../constants/locale'
94
-
95
- export default defineComponent({
96
- name: 'SDateAutoRangePicker',
97
- components: {
98
- QInput,
99
- QBtn,
100
- QDate,
101
- QMenu,
102
- QIcon,
103
- QSeparator,
104
- },
105
- props: {
106
- disable: {
107
- type: Boolean,
108
- default: false,
109
- },
110
- insideLabel: {
111
- type: String,
112
- default: '',
113
- },
114
- modelValue: {
115
- type: Object,
116
- /**
117
- * @returns {{ from: null | string; to: null | string; }}
118
- */
119
- default: () => ({ from: null, to: null }),
120
- require: true,
121
- },
122
- useDelete: {
123
- type: Boolean,
124
- default: false,
125
- },
126
- lang: {
127
- type: String,
128
- default: 'ko',
129
- },
130
- dateLimit: {
131
- type: [Object, Number, null],
132
- /**
133
- * number 일 경우, 기본 값 date
134
- * @returns {null | number | { ['date' | 'month' | 'year']: number; }}
135
- */
136
- default: null,
137
- },
138
- width: {
139
- type: String,
140
- default: 'fit-content',
141
- },
142
- locale: {
143
- type: Object,
144
- default: initLocaleObj,
145
- },
146
- },
147
- setup(props, { emit }) {
148
- const todayReset = date.formatDate(new Date(), 'YYYY/MM/DD');
149
-
150
- const dateModel = ref({ from: todayReset, to: todayReset });
151
- watch(() => props.modelValue, (newValue) => {
152
- dateModel.value = newValue;
153
- }, { immediate: true });
154
-
155
- function resetDate() {
156
- dateModel.value.from = date.formatDate(todayReset, 'YYYY-MM-DD');
157
- dateModel.value.to = date.formatDate(todayReset, 'YYYY-MM-DD');
158
- }
159
-
160
- function deleteDate() {
161
- dateModel.value = { from: null, to: null };
162
- }
163
-
164
- const limit = ref('');
165
- function optionsStartFn() {
166
- if (dateModel.value.from && props.dateLimit) {
167
- limit.value = '';
168
- limit.value = date.formatDate(date.addToDate(new Date(dateModel.value.from), typeof props.dateLimit === 'number'
169
- ? { date: props.dateLimit }
170
- : props.dateLimit), 'YYYY-MM-DD');
171
- }
172
- return true;
173
- }
174
-
175
- function optionsEndFn(to = '') {
176
- if (!dateModel.value.from) {
177
- dateModel.value.to = null;
178
- return false;
179
- }
180
- if (!props.dateLimit) {
181
- return true;
182
- }
183
- const formatTo = date.formatDate(to, 'YYYY-MM-DD');
184
- return formatTo >= dateModel.value.from && formatTo <= limit.value;
185
- }
186
-
187
- /**
188
- * @param {string} model
189
- * @param {'from' | 'to'} position
190
- */
191
- function updateDate(model, position = 'from') {
192
- dateModel.value[position] = model;
193
- emit('update:modelValue', dateModel.value);
194
- }
195
-
196
- return {
197
- dateRangeIcon,
198
- closeIcon,
199
- dateModel,
200
- calendarOpen: ref(false),
201
- inputDate: computed({
202
- get() {
203
- return `${dateModel.value.from} ~ ${dateModel.value.to}`;
204
- },
205
- set() {
206
- return `${dateModel.value.from} ~ ${dateModel.value.to}`;
207
- },
208
- }),
209
- dateWidth: computed(() => props.width || 'fit-content'),
210
- resetDate,
211
- deleteDate,
212
- updateDate,
213
- optionsStartFn,
214
- optionsEndFn,
215
- };
216
- },
217
- });
218
- </script>
219
-
220
- <style lang="scss">
221
- @import '../css/quasar.variables.scss';
222
-
223
- .s-date-auto-range-picker {
224
- width: v-bind(dateWidth);
225
- .q-field__control {
226
- max-height: $default-height;
227
- height: $default-height;
228
- padding: 0;
229
- &:before {
230
- border: 1px solid $Grey_Lighten-1 !important;
231
- }
232
- &:after {
233
- border-color: transparent !important;
234
- box-shadow: none !important;
235
- }
236
- &:hover,
237
- &:active {
238
- box-sizing: none;
239
- background-color: $Grey_Lighten-5;
240
- }
241
- .q-field__prepend {
242
- padding: 0;
243
- margin: 0 4px 0 8px;
244
- height: 28px;
245
- width: 20px;
246
- }
247
- &-container {
248
- align-items: center;
249
- padding: 0;
250
- margin: 0 16px 0 8px;
251
- .q-field__native {
252
- display: none;
253
- }
254
- .date-str {
255
- min-width: 66px;
256
- line-height: $default-height;
257
- font-size: $default-font;
258
- display: block;
259
- color: $Grey_Darken-4;
260
- height: 100%;
261
- user-select: none;
262
- &:first-of-type {
263
- margin-right: $between-margin-sm;
264
- }
265
- &:last-of-type {
266
- margin-left: $between-margin-sm;
267
- }
268
- }
269
- }
270
- .q-field__append {
271
- height: $default-height;
272
- padding: 0;
273
- margin: 0 8px 0 0;
274
- }
275
- }
276
- &.q-field--disabled {
277
- .q-field__control {
278
- &:before {
279
- border: 1px solid $Grey_Lighten-2 !important;
280
- }
281
- &-container {
282
- .date-str {
283
- color: $Grey_Default;
284
- }
285
- }
286
- }
287
- }
288
- &--inside {
289
- .q-field__before {
290
- height: $default-height;
291
- line-height: $default-content-height;
292
- padding: 0;
293
- .date-picker-label {
294
- border-right: none !important;
295
- border-radius: $generic-border-radius 0 0 $generic-border-radius;
296
- height: $default-height;
297
- font-size: $default-font;
298
- }
299
- }
300
- .q-field__control {
301
- border-top-left-radius: 0;
302
- border-bottom-left-radius: 0;
303
- }
304
- }
305
- &--use-icon {
306
- .q-field__control-container {
307
- margin: 0 8px 0 4px;
308
- }
309
- }
310
- }
311
- </style>
1
+ <template>
2
+ <q-input
3
+ dense
4
+ outlined
5
+ :class="{
6
+ 'text-Grey_Default bg-Grey_Lighten-5': disable,
7
+ 's-date-auto-range-picker--inside': insideLabel,
8
+ 's-date-auto-range-picker--use-icon': useDelete,
9
+ }"
10
+ readonly
11
+ class="q-pa-none s-date-auto-range-picker bg-white"
12
+ :disable="disable"
13
+ @click="calendarOpen = true"
14
+ data-cy="autoRangeCalendar"
15
+ v-model="inputDate"
16
+ >
17
+ <template v-slot:before v-if="insideLabel">
18
+ <div
19
+ class="date-picker-label s-px-sm q-py-xs text-Grey_Darken-4 bg-Grey_Lighten-5"
20
+ :class="disable
21
+ ? 's-border-Grey_Lighten-2'
22
+ : 's-border-Grey_Lighten-1'"
23
+ >
24
+ {{ insideLabel }}
25
+ </div>
26
+ </template>
27
+ <template v-slot:prepend>
28
+ <q-icon
29
+ :name="dateRangeIcon"
30
+ class="cursor-pointer q-pa-none no-hover"
31
+ size="20px"
32
+ :color="disable ? 'Grey_Default' : 'Grey_Darken-1'"
33
+ >
34
+ <q-menu v-model="calendarOpen" fit class="date-picker-range-wrapper" ref="dateMenuRef">
35
+ <q-date
36
+ v-model="dateModel.from"
37
+ minimal
38
+ square
39
+ color="positive"
40
+ class="q-pa-none"
41
+ mask="YYYY-MM-DD"
42
+ :locale="lang ? locale[lang] : {}"
43
+ :options="optionsStartFn"
44
+ @update:model-value="(value) => updateDate(value, 'from')"
45
+ />
46
+ <q-separator vertical />
47
+ <q-date
48
+ v-model="dateModel.to"
49
+ minimal
50
+ square
51
+ color="positive"
52
+ class="q-pa-none"
53
+ mask="YYYY-MM-DD"
54
+ :locale="lang ? locale[lang] : {}"
55
+ :options="optionsEndFn"
56
+ @update:model-value="(value) => updateDate(value, 'to')"
57
+ >
58
+ <q-btn
59
+ class="reset-to-today-btn no-shadow no-hover"
60
+ unelevated
61
+ text-color="black"
62
+ :label="locale[lang].today"
63
+ @click="resetDate"
64
+ />
65
+ </q-date>
66
+ </q-menu>
67
+ </q-icon>
68
+ </template>
69
+ <template v-slot:default>
70
+ <span class="text-center date-str">{{
71
+ dateModel.from
72
+ }}</span>~<span class="text-center date-str">{{
73
+ dateModel.to
74
+ }}</span>
75
+ </template>
76
+ <template v-slot:append v-if="useDelete">
77
+ <q-icon
78
+ :name="closeIcon"
79
+ size="16px"
80
+ class="cursor-pointer"
81
+ @click="deleteDate"
82
+ data-cy="delete-icon"
83
+ />
84
+ </template>
85
+ </q-input>
86
+ </template>
87
+
88
+ <script>
89
+ // @ts-check
90
+ import { defineComponent, ref, computed, watch } from 'vue';
91
+ import { QInput, QBtn, QDate, QMenu, QIcon, QSeparator, date } from 'quasar';
92
+ import { dateRangeIcon, closeIcon } from '../assets/icons';
93
+ import { initLocaleObj } from '../constants/locale'
94
+
95
+ export default defineComponent({
96
+ name: 'SDateAutoRangePicker',
97
+ components: {
98
+ QInput,
99
+ QBtn,
100
+ QDate,
101
+ QMenu,
102
+ QIcon,
103
+ QSeparator,
104
+ },
105
+ props: {
106
+ disable: {
107
+ type: Boolean,
108
+ default: false,
109
+ },
110
+ insideLabel: {
111
+ type: String,
112
+ default: '',
113
+ },
114
+ modelValue: {
115
+ type: Object,
116
+ /**
117
+ * @returns {{ from: null | string; to: null | string; }}
118
+ */
119
+ default: () => ({ from: null, to: null }),
120
+ require: true,
121
+ },
122
+ useDelete: {
123
+ type: Boolean,
124
+ default: false,
125
+ },
126
+ lang: {
127
+ type: String,
128
+ default: 'ko',
129
+ },
130
+ dateLimit: {
131
+ type: [Object, Number, null],
132
+ /**
133
+ * number 일 경우, 기본 값 date
134
+ * @returns {null | number | { ['date' | 'month' | 'year']: number; }}
135
+ */
136
+ default: null,
137
+ },
138
+ width: {
139
+ type: String,
140
+ default: 'fit-content',
141
+ },
142
+ locale: {
143
+ type: Object,
144
+ default: initLocaleObj,
145
+ },
146
+ },
147
+ setup(props, { emit }) {
148
+ const todayReset = date.formatDate(new Date(), 'YYYY/MM/DD');
149
+
150
+ const dateModel = ref({ from: todayReset, to: todayReset });
151
+ watch(() => props.modelValue, (newValue) => {
152
+ dateModel.value = newValue;
153
+ }, { immediate: true });
154
+
155
+ function resetDate() {
156
+ dateModel.value.from = date.formatDate(todayReset, 'YYYY-MM-DD');
157
+ dateModel.value.to = date.formatDate(todayReset, 'YYYY-MM-DD');
158
+ }
159
+
160
+ function deleteDate() {
161
+ dateModel.value = { from: null, to: null };
162
+ }
163
+
164
+ const limit = ref('');
165
+ function optionsStartFn() {
166
+ if (dateModel.value.from && props.dateLimit) {
167
+ limit.value = '';
168
+ limit.value = date.formatDate(date.addToDate(new Date(dateModel.value.from), typeof props.dateLimit === 'number'
169
+ ? { date: props.dateLimit }
170
+ : props.dateLimit), 'YYYY-MM-DD');
171
+ }
172
+ return true;
173
+ }
174
+
175
+ function optionsEndFn(to = '') {
176
+ if (!dateModel.value.from) {
177
+ dateModel.value.to = null;
178
+ return false;
179
+ }
180
+ if (!props.dateLimit) {
181
+ return true;
182
+ }
183
+ const formatTo = date.formatDate(to, 'YYYY-MM-DD');
184
+ return formatTo >= dateModel.value.from && formatTo <= limit.value;
185
+ }
186
+
187
+ /**
188
+ * @param {string} model
189
+ * @param {'from' | 'to'} position
190
+ */
191
+ function updateDate(model, position = 'from') {
192
+ dateModel.value[position] = model;
193
+ emit('update:modelValue', dateModel.value);
194
+ }
195
+
196
+ return {
197
+ dateRangeIcon,
198
+ closeIcon,
199
+ dateModel,
200
+ calendarOpen: ref(false),
201
+ inputDate: computed({
202
+ get() {
203
+ return `${dateModel.value.from} ~ ${dateModel.value.to}`;
204
+ },
205
+ set() {
206
+ return `${dateModel.value.from} ~ ${dateModel.value.to}`;
207
+ },
208
+ }),
209
+ dateWidth: computed(() => props.width || 'fit-content'),
210
+ resetDate,
211
+ deleteDate,
212
+ updateDate,
213
+ optionsStartFn,
214
+ optionsEndFn,
215
+ };
216
+ },
217
+ });
218
+ </script>
219
+
220
+ <style lang="scss">
221
+ @import '../css/quasar.variables.scss';
222
+
223
+ .s-date-auto-range-picker {
224
+ width: v-bind(dateWidth);
225
+ .q-field__control {
226
+ max-height: $default-height;
227
+ height: $default-height;
228
+ padding: 0;
229
+ &:before {
230
+ border: 1px solid $Grey_Lighten-1 !important;
231
+ }
232
+ &:after {
233
+ border-color: transparent !important;
234
+ box-shadow: none !important;
235
+ }
236
+ &:hover,
237
+ &:active {
238
+ box-sizing: none;
239
+ background-color: $Grey_Lighten-5;
240
+ }
241
+ .q-field__prepend {
242
+ padding: 0;
243
+ margin: 0 4px 0 8px;
244
+ height: 28px;
245
+ width: 20px;
246
+ }
247
+ &-container {
248
+ align-items: center;
249
+ padding: 0;
250
+ margin: 0 16px 0 8px;
251
+ .q-field__native {
252
+ display: none;
253
+ }
254
+ .date-str {
255
+ min-width: 66px;
256
+ line-height: $default-height;
257
+ font-size: $default-font;
258
+ display: block;
259
+ color: $Grey_Darken-4;
260
+ height: 100%;
261
+ user-select: none;
262
+ &:first-of-type {
263
+ margin-right: $between-margin-sm;
264
+ }
265
+ &:last-of-type {
266
+ margin-left: $between-margin-sm;
267
+ }
268
+ }
269
+ }
270
+ .q-field__append {
271
+ height: $default-height;
272
+ padding: 0;
273
+ margin: 0 8px 0 0;
274
+ }
275
+ }
276
+ &.q-field--disabled {
277
+ .q-field__control {
278
+ &:before {
279
+ border: 1px solid $Grey_Lighten-2 !important;
280
+ }
281
+ &-container {
282
+ .date-str {
283
+ color: $Grey_Default;
284
+ }
285
+ }
286
+ }
287
+ }
288
+ &--inside {
289
+ .q-field__before {
290
+ height: $default-height;
291
+ line-height: $default-content-height;
292
+ padding: 0;
293
+ .date-picker-label {
294
+ border-right: none !important;
295
+ border-radius: $generic-border-radius 0 0 $generic-border-radius;
296
+ height: $default-height;
297
+ font-size: $default-font;
298
+ }
299
+ }
300
+ .q-field__control {
301
+ border-top-left-radius: 0;
302
+ border-bottom-left-radius: 0;
303
+ }
304
+ }
305
+ &--use-icon {
306
+ .q-field__control-container {
307
+ margin: 0 8px 0 4px;
308
+ }
309
+ }
310
+ }
311
+ </style>