@quasar/quasar-ui-qiconpicker 2.0.5 → 2.0.7

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.
@@ -0,0 +1,6 @@
1
+ /*!
2
+ * @quasar/quasar-ui-qiconpicker v2.0.7
3
+ * (c) 2023 Jeff Galbraith <jeff@quasar.dev>
4
+ * Released under the MIT License.
5
+ */
6
+ (function(t,a){"object"===typeof exports&&"undefined"!==typeof module?module.exports=a():"function"===typeof define&&define.amd?define(a):(t="undefined"!==typeof globalThis?globalThis:t||self,t.QIconPicker=t.QIconPicker||{},t.QIconPicker.iconSet=t.QIconPicker.iconSet||{},t.QIconPicker.iconSet.themify=a())})(this,function(){"use strict";var t={name:"themify",icons:[{name:"ti-wand",tags:[]},{name:"ti-volume",tags:[]},{name:"ti-user",tags:[]},{name:"ti-unlock",tags:[]},{name:"ti-unlink",tags:[]},{name:"ti-trash",tags:[]},{name:"ti-thought",tags:[]},{name:"ti-target",tags:[]},{name:"ti-tag",tags:[]},{name:"ti-tablet",tags:[]},{name:"ti-star",tags:[]},{name:"ti-spray",tags:[]},{name:"ti-signal",tags:[]},{name:"ti-shopping-cart",tags:[]},{name:"ti-shopping-cart-full",tags:[]},{name:"ti-settings",tags:[]},{name:"ti-search",tags:[]},{name:"ti-zoom-in",tags:[]},{name:"ti-zoom-out",tags:[]},{name:"ti-cut",tags:[]},{name:"ti-ruler",tags:[]},{name:"ti-ruler-pencil",tags:[]},{name:"ti-ruler-alt",tags:[]},{name:"ti-bookmark",tags:[]},{name:"ti-bookmark-alt",tags:[]},{name:"ti-reload",tags:[]},{name:"ti-plus",tags:[]},{name:"ti-pin",tags:[]},{name:"ti-pencil",tags:[]},{name:"ti-pencil-alt",tags:[]},{name:"ti-paint-roller",tags:[]},{name:"ti-paint-bucket",tags:[]},{name:"ti-na",tags:[]},{name:"ti-mobile",tags:[]},{name:"ti-minus",tags:[]},{name:"ti-medall",tags:[]},{name:"ti-medall-alt",tags:[]},{name:"ti-marker",tags:[]},{name:"ti-marker-alt",tags:[]},{name:"ti-arrow-up",tags:[]},{name:"ti-arrow-right",tags:[]},{name:"ti-arrow-left",tags:[]},{name:"ti-arrow-down",tags:[]},{name:"ti-lock",tags:[]},{name:"ti-location-arrow",tags:[]},{name:"ti-link",tags:[]},{name:"ti-layout",tags:[]},{name:"ti-layers",tags:[]},{name:"ti-layers-alt",tags:[]},{name:"ti-key",tags:[]},{name:"ti-import",tags:[]},{name:"ti-image",tags:[]},{name:"ti-heart",tags:[]},{name:"ti-heart-broken",tags:[]},{name:"ti-hand-stop",tags:[]},{name:"ti-hand-open",tags:[]},{name:"ti-hand-drag",tags:[]},{name:"ti-folder",tags:[]},{name:"ti-flag",tags:[]},{name:"ti-flag-alt",tags:[]},{name:"ti-flag-alt-2",tags:[]},{name:"ti-eye",tags:[]},{name:"ti-export",tags:[]},{name:"ti-exchange-vertical",tags:[]},{name:"ti-desktop",tags:[]},{name:"ti-cup",tags:[]},{name:"ti-crown",tags:[]},{name:"ti-comments",tags:[]},{name:"ti-comment",tags:[]},{name:"ti-comment-alt",tags:[]},{name:"ti-close",tags:[]},{name:"ti-clip",tags:[]},{name:"ti-angle-up",tags:[]},{name:"ti-angle-right",tags:[]},{name:"ti-angle-left",tags:[]},{name:"ti-angle-down",tags:[]},{name:"ti-check",tags:[]},{name:"ti-check-box",tags:[]},{name:"ti-camera",tags:[]},{name:"ti-announcement",tags:[]},{name:"ti-brush",tags:[]},{name:"ti-briefcase",tags:[]},{name:"ti-bolt",tags:[]},{name:"ti-bolt-alt",tags:[]},{name:"ti-blackboard",tags:[]},{name:"ti-bag",tags:[]},{name:"ti-move",tags:[]},{name:"ti-arrows-vertical",tags:[]},{name:"ti-arrows-horizontal",tags:[]},{name:"ti-fullscreen",tags:[]},{name:"ti-arrow-top-right",tags:[]},{name:"ti-arrow-top-left",tags:[]},{name:"ti-arrow-circle-up",tags:[]},{name:"ti-arrow-circle-right",tags:[]},{name:"ti-arrow-circle-left",tags:[]},{name:"ti-arrow-circle-down",tags:[]},{name:"ti-angle-double-up",tags:[]},{name:"ti-angle-double-right",tags:[]},{name:"ti-angle-double-left",tags:[]},{name:"ti-angle-double-down",tags:[]},{name:"ti-zip",tags:[]},{name:"ti-world",tags:[]},{name:"ti-wheelchair",tags:[]},{name:"ti-view-list",tags:[]},{name:"ti-view-list-alt",tags:[]},{name:"ti-view-grid",tags:[]},{name:"ti-uppercase",tags:[]},{name:"ti-upload",tags:[]},{name:"ti-underline",tags:[]},{name:"ti-truck",tags:[]},{name:"ti-timer",tags:[]},{name:"ti-ticket",tags:[]},{name:"ti-thumb-up",tags:[]},{name:"ti-thumb-down",tags:[]},{name:"ti-text",tags:[]},{name:"ti-stats-up",tags:[]},{name:"ti-stats-down",tags:[]},{name:"ti-split-v",tags:[]},{name:"ti-split-h",tags:[]},{name:"ti-smallcap",tags:[]},{name:"ti-shine",tags:[]},{name:"ti-shift-right",tags:[]},{name:"ti-shift-left",tags:[]},{name:"ti-shield",tags:[]},{name:"ti-notepad",tags:[]},{name:"ti-server",tags:[]},{name:"ti-quote-right",tags:[]},{name:"ti-quote-left",tags:[]},{name:"ti-pulse",tags:[]},{name:"ti-printer",tags:[]},{name:"ti-power-off",tags:[]},{name:"ti-plug",tags:[]},{name:"ti-pie-chart",tags:[]},{name:"ti-paragraph",tags:[]},{name:"ti-panel",tags:[]},{name:"ti-package",tags:[]},{name:"ti-music",tags:[]},{name:"ti-music-alt",tags:[]},{name:"ti-mouse",tags:[]},{name:"ti-mouse-alt",tags:[]},{name:"ti-money",tags:[]},{name:"ti-microphone",tags:[]},{name:"ti-menu",tags:[]},{name:"ti-menu-alt",tags:[]},{name:"ti-map",tags:[]},{name:"ti-map-alt",tags:[]},{name:"ti-loop",tags:[]},{name:"ti-location-pin",tags:[]},{name:"ti-list",tags:[]},{name:"ti-light-bulb",tags:[]},{name:"ti-Italic",tags:[]},{name:"ti-info",tags:[]},{name:"ti-infinite",tags:[]},{name:"ti-id-badge",tags:[]},{name:"ti-hummer",tags:[]},{name:"ti-home",tags:[]},{name:"ti-help",tags:[]},{name:"ti-headphone",tags:[]},{name:"ti-harddrives",tags:[]},{name:"ti-harddrive",tags:[]},{name:"ti-gift",tags:[]},{name:"ti-game",tags:[]},{name:"ti-filter",tags:[]},{name:"ti-files",tags:[]},{name:"ti-file",tags:[]},{name:"ti-eraser",tags:[]},{name:"ti-envelope",tags:[]},{name:"ti-download",tags:[]},{name:"ti-direction",tags:[]},{name:"ti-direction-alt",tags:[]},{name:"ti-dashboard",tags:[]},{name:"ti-control-stop",tags:[]},{name:"ti-control-shuffle",tags:[]},{name:"ti-control-play",tags:[]},{name:"ti-control-pause",tags:[]},{name:"ti-control-forward",tags:[]},{name:"ti-control-backward",tags:[]},{name:"ti-cloud",tags:[]},{name:"ti-cloud-up",tags:[]},{name:"ti-cloud-down",tags:[]},{name:"ti-clipboard",tags:[]},{name:"ti-car",tags:[]},{name:"ti-calendar",tags:[]},{name:"ti-book",tags:[]},{name:"ti-bell",tags:[]},{name:"ti-basketball",tags:[]},{name:"ti-bar-chart",tags:[]},{name:"ti-bar-chart-alt",tags:[]},{name:"ti-back-right",tags:[]},{name:"ti-back-left",tags:[]},{name:"ti-arrows-corner",tags:[]},{name:"ti-archive",tags:[]},{name:"ti-anchor",tags:[]},{name:"ti-align-right",tags:[]},{name:"ti-align-left",tags:[]},{name:"ti-align-justify",tags:[]},{name:"ti-align-center",tags:[]},{name:"ti-alert",tags:[]},{name:"ti-alarm-clock",tags:[]},{name:"ti-agenda",tags:[]},{name:"ti-write",tags:[]},{name:"ti-window",tags:[]},{name:"ti-widgetized",tags:[]},{name:"ti-widget",tags:[]},{name:"ti-widget-alt",tags:[]},{name:"ti-wallet",tags:[]},{name:"ti-video-clapper",tags:[]},{name:"ti-video-camera",tags:[]},{name:"ti-vector",tags:[]},{name:"ti-themify-logo",tags:[]},{name:"ti-themify-favicon",tags:[]},{name:"ti-themify-favicon-alt",tags:[]},{name:"ti-support",tags:[]},{name:"ti-stamp",tags:[]},{name:"ti-split-v-alt",tags:[]},{name:"ti-slice",tags:[]},{name:"ti-shortcode",tags:[]},{name:"ti-shift-right-alt",tags:[]},{name:"ti-shift-left-alt",tags:[]},{name:"ti-ruler-alt-2",tags:[]},{name:"ti-receipt",tags:[]},{name:"ti-pin2",tags:[]},{name:"ti-pin-alt",tags:[]},{name:"ti-pencil-alt2",tags:[]},{name:"ti-palette",tags:[]},{name:"ti-more",tags:[]},{name:"ti-more-alt",tags:[]},{name:"ti-microphone-alt",tags:[]},{name:"ti-magnet",tags:[]},{name:"ti-line-double",tags:[]},{name:"ti-line-dotted",tags:[]},{name:"ti-line-dashed",tags:[]},{name:"ti-layout-width-full",tags:[]},{name:"ti-layout-width-default",tags:[]},{name:"ti-layout-width-default-alt",tags:[]},{name:"ti-layout-tab",tags:[]},{name:"ti-layout-tab-window",tags:[]},{name:"ti-layout-tab-v",tags:[]},{name:"ti-layout-tab-min",tags:[]},{name:"ti-layout-slider",tags:[]},{name:"ti-layout-slider-alt",tags:[]},{name:"ti-layout-sidebar-right",tags:[]},{name:"ti-layout-sidebar-none",tags:[]},{name:"ti-layout-sidebar-left",tags:[]},{name:"ti-layout-placeholder",tags:[]},{name:"ti-layout-menu",tags:[]},{name:"ti-layout-menu-v",tags:[]},{name:"ti-layout-menu-separated",tags:[]},{name:"ti-layout-menu-full",tags:[]},{name:"ti-layout-media-right-alt",tags:[]},{name:"ti-layout-media-right",tags:[]},{name:"ti-layout-media-overlay",tags:[]},{name:"ti-layout-media-overlay-alt",tags:[]},{name:"ti-layout-media-overlay-alt-2",tags:[]},{name:"ti-layout-media-left-alt",tags:[]},{name:"ti-layout-media-left",tags:[]},{name:"ti-layout-media-center-alt",tags:[]},{name:"ti-layout-media-center",tags:[]},{name:"ti-layout-list-thumb",tags:[]},{name:"ti-layout-list-thumb-alt",tags:[]},{name:"ti-layout-list-post",tags:[]},{name:"ti-layout-list-large-image",tags:[]},{name:"ti-layout-line-solid",tags:[]},{name:"ti-layout-grid4",tags:[]},{name:"ti-layout-grid3",tags:[]},{name:"ti-layout-grid2",tags:[]},{name:"ti-layout-grid2-thumb",tags:[]},{name:"ti-layout-cta-right",tags:[]},{name:"ti-layout-cta-left",tags:[]},{name:"ti-layout-cta-center",tags:[]},{name:"ti-layout-cta-btn-right",tags:[]},{name:"ti-layout-cta-btn-left",tags:[]},{name:"ti-layout-column4",tags:[]},{name:"ti-layout-column3",tags:[]},{name:"ti-layout-column2",tags:[]},{name:"ti-layout-accordion-separated",tags:[]},{name:"ti-layout-accordion-merged",tags:[]},{name:"ti-layout-accordion-list",tags:[]},{name:"ti-ink-pen",tags:[]},{name:"ti-info-alt",tags:[]},{name:"ti-help-alt",tags:[]},{name:"ti-headphone-alt",tags:[]},{name:"ti-hand-point-up",tags:[]},{name:"ti-hand-point-right",tags:[]},{name:"ti-hand-point-left",tags:[]},{name:"ti-hand-point-down",tags:[]},{name:"ti-gallery",tags:[]},{name:"ti-face-smile",tags:[]},{name:"ti-face-sad",tags:[]},{name:"ti-credit-card",tags:[]},{name:"ti-control-skip-forward",tags:[]},{name:"ti-control-skip-backward",tags:[]},{name:"ti-control-record",tags:[]},{name:"ti-control-eject",tags:[]},{name:"ti-comments-smiley",tags:[]},{name:"ti-brush-alt",tags:[]},{name:"ti-youtube",tags:[]},{name:"ti-vimeo",tags:[]},{name:"ti-twitter",tags:[]},{name:"ti-time",tags:[]},{name:"ti-tumblr",tags:[]},{name:"ti-skype",tags:[]},{name:"ti-share",tags:[]},{name:"ti-share-alt",tags:[]},{name:"ti-rocket",tags:[]},{name:"ti-pinterest",tags:[]},{name:"ti-new-window",tags:[]},{name:"ti-microsoft",tags:[]},{name:"ti-list-ol",tags:[]},{name:"ti-linkedin",tags:[]},{name:"ti-layout-sidebar-2",tags:[]},{name:"ti-layout-grid4-alt",tags:[]},{name:"ti-layout-grid3-alt",tags:[]},{name:"ti-layout-grid2-alt",tags:[]},{name:"ti-layout-column4-alt",tags:[]},{name:"ti-layout-column3-alt",tags:[]},{name:"ti-layout-column2-alt",tags:[]},{name:"ti-instagram",tags:[]},{name:"ti-google",tags:[]},{name:"ti-github",tags:[]},{name:"ti-flickr",tags:[]},{name:"ti-facebook",tags:[]},{name:"ti-dropbox",tags:[]},{name:"ti-dribbble",tags:[]},{name:"ti-apple",tags:[]},{name:"ti-android",tags:[]},{name:"ti-save",tags:[]},{name:"ti-save-alt",tags:[]},{name:"ti-yahoo",tags:[]},{name:"ti-wordpress",tags:[]},{name:"ti-vimeo-alt",tags:[]},{name:"ti-twitter-alt",tags:[]},{name:"ti-tumblr-alt",tags:[]},{name:"ti-trello",tags:[]},{name:"ti-stack-overflow",tags:[]},{name:"ti-soundcloud",tags:[]},{name:"ti-sharethis",tags:[]},{name:"ti-sharethis-alt",tags:[]},{name:"ti-reddit",tags:[]},{name:"ti-pinterest-alt",tags:[]},{name:"ti-microsoft-alt",tags:[]},{name:"ti-linux",tags:[]},{name:"ti-jsfiddle",tags:[]},{name:"ti-joomla",tags:[]},{name:"ti-html5",tags:[]},{name:"ti-flickr-alt",tags:[]},{name:"ti-email",tags:[]},{name:"ti-drupal",tags:[]},{name:"ti-dropbox-alt",tags:[]},{name:"ti-css3",tags:[]},{name:"ti-rss",tags:[]},{name:"ti-rss-alt",tags:[]}]};return t});
@@ -0,0 +1,562 @@
1
+ /*!
2
+ * @quasar/quasar-ui-qiconpicker v2.0.7
3
+ * (c) 2023 Jeff Galbraith <jeff@quasar.dev>
4
+ * Released under the MIT License.
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ var vue = require('vue');
10
+ var quasar = require('quasar');
11
+
12
+ /**
13
+ * QIconPicker Properties
14
+ */
15
+ const useIconPickerProps = {
16
+ modelValue: String,
17
+ iconSet: {
18
+ type: String,
19
+ validator: v => [
20
+ 'material-icons',
21
+ 'material-icons-outlined',
22
+ 'material-icons-round',
23
+ 'material-icons-sharp',
24
+ 'ionicons-v4',
25
+ 'mdi-v4',
26
+ 'mdi-v5',
27
+ 'mdi-v6',
28
+ 'fontawesome-v5',
29
+ 'eva-icons',
30
+ 'themify',
31
+ 'line-awesome',
32
+ 'bootstrap-icons',
33
+ ''
34
+ ].includes(v),
35
+ default: ''
36
+ },
37
+ icons: Array,
38
+ filter: String,
39
+ tags: Array,
40
+ dense: Boolean,
41
+ tooltips: Boolean,
42
+ noFooter: Boolean,
43
+ size: {
44
+ type: String,
45
+ default: 'inherit'
46
+ },
47
+ color: String,
48
+ textColor: String,
49
+ selectedColor: {
50
+ type: String,
51
+ default: 'primary'
52
+ },
53
+ selectedTextColor: {
54
+ type: String,
55
+ default: 'grey-1'
56
+ },
57
+ paginationProps: {
58
+ type: Object,
59
+ default: () => ({
60
+ maxPages: 5,
61
+ input: true
62
+ })
63
+ },
64
+ modelPagination: Object,
65
+ animated: Boolean,
66
+ transitionPrev: {
67
+ type: String,
68
+ default: 'slide-right'
69
+ },
70
+ transitionNext: {
71
+ type: String,
72
+ default: 'slide-left'
73
+ }
74
+ };
75
+
76
+ const direction = {
77
+ NEXT: 'next',
78
+ PREV: 'prev'
79
+ };
80
+
81
+ /**
82
+ * Pagination
83
+ */
84
+ function useIconPickerPagination(data, props, emit, computedFilteredIcons) {
85
+
86
+ function fixPagination(p) {
87
+ if (p.page < 1) {
88
+ p.page = 1;
89
+ }
90
+ if (p.itemsPerPage === void 0 || p.itemsPerPage < 1) {
91
+ p.itemsPerPage = 0; // all
92
+ }
93
+ return p
94
+ }
95
+
96
+ // returns true if the pagination is the same,
97
+ // otherwise returns false if it has changed
98
+ function samePagination(oldPag, newPag) {
99
+ for (const prop in newPag) {
100
+ if (newPag[ prop ] !== oldPag[ prop ]) {
101
+ return false
102
+ }
103
+ }
104
+ return true
105
+ }
106
+
107
+ const computedPagination = vue.computed(() => {
108
+ return fixPagination({
109
+ ...data.innerPagination,
110
+ ...props.modelPagination
111
+ })
112
+ });
113
+
114
+ const computedPagesNumber = vue.computed(() => {
115
+ return computedPagination.value.itemsPerPage === 0 ? 1
116
+ : Math.max(1, Math.ceil(computedFilteredIcons.value.length / computedPagination.value.itemsPerPage))
117
+ });
118
+
119
+ function setPagination(val) {
120
+ const newPagination = fixPagination({
121
+ ...computedPagination.value,
122
+ ...val
123
+ });
124
+
125
+ if (!samePagination(data.innerPagination, newPagination)) {
126
+ if (props.modelPagination) {
127
+ emit('update:model-pagination', newPagination);
128
+ }
129
+ data.innerPagination = newPagination;
130
+ }
131
+ }
132
+
133
+ function updatePagination() {
134
+ if (props.modelPagination !== void 0) {
135
+ setPagination({ total: computedFilteredIcons.value.length, totalPages: computedPagesNumber.value });
136
+ }
137
+ }
138
+
139
+ return {
140
+ samePagination,
141
+ computedPagination,
142
+ setPagination,
143
+ updatePagination,
144
+ computedPagesNumber
145
+ }
146
+ }
147
+
148
+ /**
149
+ * Icons
150
+ */
151
+ function useIconPickerIcons(data, props, computedFirstItemIndex, computedLastItemIndex) {
152
+
153
+ function loadIconSet(iconSet) {
154
+ data.iconsList = [];
155
+ if (iconSet) {
156
+ // detect if UMD version is installed
157
+ if (window.QIconPicker) {
158
+ const name = iconSet.replace(/-([a-z])/g, g => g[ 1 ].toUpperCase());
159
+ if (window.QIconPicker.iconSet && window.QIconPicker.iconSet[ name ]) {
160
+ data.iconsList = window.QIconPicker.iconSet[ name ].icons;
161
+ }
162
+ else {
163
+ console.error(`QIconPicker: no icon set loaded called ${ iconSet }`);
164
+ console.error('Be sure to load the UMD version of the icon set in a script tag before using QIconPicker UMD version');
165
+ }
166
+ }
167
+ else {
168
+ try {
169
+ data.iconsList = require(`@quasar/quasar-ui-qiconpicker/src/components/icon-set/${ iconSet }.js`).default.icons;
170
+ }
171
+ catch (e) {
172
+ console.error(`QIconPicker: cannot find icon set found called ${ iconSet }`);
173
+ }
174
+ }
175
+ }
176
+ console.info(`Loaded ${ data.iconsList.length } icons.`);
177
+ }
178
+
179
+ const computedDisplayedIcons = vue.computed(() => {
180
+ let icons = [];
181
+ if (data.iconsList) {
182
+ icons = computedFilteredIcons.value;
183
+
184
+ // should the icons be paged?
185
+ if (props.modelPagination && props.modelPagination.itemsPerPage !== 0) {
186
+ icons = icons.slice(computedFirstItemIndex.value, computedLastItemIndex.value);
187
+ }
188
+ }
189
+ return icons
190
+ });
191
+
192
+ const computedFilteredIcons = vue.computed(() => {
193
+ let icons = data.iconsList;
194
+ if (icons) {
195
+ if (props.tags !== void 0 && props.tags !== '' && props.tags !== null && props.tags.length > 0) {
196
+ icons = icons.filter(icon => {
197
+ return icon.tags.filter(tag => props.tags.includes(tag)).length > 0
198
+ });
199
+ }
200
+ if (props.filter !== void 0 && props.filter !== '' && props.filter !== null) {
201
+ icons = icons.filter(icon => icon.name.includes(props.filter));
202
+ }
203
+ }
204
+ return icons
205
+ });
206
+
207
+ function categories() {
208
+ const t = [];
209
+ data.iconsList.forEach(icon => {
210
+ const tags = icon.tags;
211
+ if (tags && tags.length > 0) {
212
+ tags.forEach(tag => {
213
+ if (t.includes(tag) !== true) {
214
+ t.push(tag);
215
+ }
216
+ });
217
+ }
218
+ });
219
+ t.sort();
220
+ data.categories = t;
221
+ return true
222
+ }
223
+
224
+ return {
225
+ loadIconSet,
226
+ computedDisplayedIcons,
227
+ computedFilteredIcons,
228
+ categories
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Exposes api functions
234
+ */
235
+ function exposeIconPickerApi(data, expose, computedPagination, setPagination, computedFirstItemIndex, computedLastItemIndex, computedFilteredIcons, computedPagesNumber) {
236
+ // goes to previous page
237
+ const prevPage = () => {
238
+ const { page } = computedPagination.value;
239
+ if (page > 1) {
240
+ setPagination({ page: page - 1 });
241
+ data.direction = direction.PREV;
242
+ }
243
+ };
244
+
245
+ // goes to next page
246
+ const nextPage = () => {
247
+ const { page, itemsPerPage } = computedPagination.value;
248
+ if (computedLastItemIndex.value > 0 && page * itemsPerPage < computedFilteredIcons.value.length) {
249
+ setPagination({ page: page + 1 });
250
+ data.direction = direction.NEXT;
251
+ }
252
+ };
253
+
254
+ // goes to last page
255
+ const lastPage = () => {
256
+ setPagination({ page: computedPagesNumber.value });
257
+ };
258
+
259
+ // goes to first page
260
+ const firstPage = () => {
261
+ setPagination({ page: 0 });
262
+ };
263
+
264
+ // checks if we are on the last page
265
+ const isLastPage = vue.computed(() => {
266
+ return computedLastItemIndex.value === 0
267
+ ? true
268
+ : computedPagination.value.page >= computedPagesNumber.value
269
+ });
270
+
271
+
272
+ // checks if we are on the first page
273
+ const isFirstPage = vue.computed(() => {
274
+ return computedPagination.value.page === 1
275
+ });
276
+
277
+ expose({
278
+ prevPage,
279
+ nextPage,
280
+ lastPage,
281
+ firstPage,
282
+ isLastPage,
283
+ isFirstPage
284
+ });
285
+ }
286
+
287
+
288
+ var QIconPicker = vue.defineComponent({
289
+ name: 'QIconPicker',
290
+
291
+ props: {
292
+ ...useIconPickerProps
293
+ },
294
+
295
+ emits: [
296
+ 'update:model-value',
297
+ 'update:tags',
298
+ 'update:model-pagination'
299
+ ],
300
+
301
+ setup(props, { slots, emit, expose }) {
302
+ const scrollAreaRef = vue.ref(null);
303
+ const data = vue.reactive({
304
+ iconsList: [],
305
+ innerPagination: {
306
+ page: 1,
307
+ itemsPerPage: 0,
308
+ totalPages: 0
309
+ },
310
+ categories: [],
311
+ width: '100',
312
+ height: '100',
313
+ direction: ''
314
+ });
315
+
316
+ // index of first item on a page
317
+ const computedFirstItemIndex = vue.computed(() => {
318
+ const { page, itemsPerPage } = computedPagination.value;
319
+ return (page - 1) * itemsPerPage
320
+ });
321
+
322
+ // index of last item on a page
323
+ const computedLastItemIndex = vue.computed(() => {
324
+ const { page, itemsPerPage } = computedPagination.value;
325
+ return page * itemsPerPage
326
+ });
327
+
328
+ const {
329
+ loadIconSet,
330
+ computedDisplayedIcons,
331
+ computedFilteredIcons,
332
+ categories
333
+ } = useIconPickerIcons(data, props, computedFirstItemIndex, computedLastItemIndex);
334
+
335
+ const {
336
+ samePagination,
337
+ computedPagination,
338
+ setPagination,
339
+ updatePagination,
340
+ computedPagesNumber
341
+ } = useIconPickerPagination(data, props, emit, computedFilteredIcons);
342
+
343
+ exposeIconPickerApi(data, expose, computedPagination, setPagination, computedFirstItemIndex, computedLastItemIndex, computedFilteredIcons, computedPagesNumber);
344
+
345
+ vue.onMounted(() => {
346
+ if (props.iconSet) {
347
+ loadIconSet(props.iconSet);
348
+ }
349
+ else if (props.icons !== void 0 && props.icons.length > 0) {
350
+ data.iconsList = props.icons;
351
+ }
352
+ updatePagination();
353
+ });
354
+
355
+
356
+ vue.watch(() => props.iconSet, (val) => {
357
+ if (val) {
358
+ loadIconSet(val);
359
+ updatePagination();
360
+ vue.nextTick(() => {
361
+ // whenever the icon set changes, it resets pagination page to page 1
362
+ setPagination({ page: 1 });
363
+ }).catch(e => console.error(e));
364
+ // scroll to top of QScrollArea, if applicable
365
+ if(scrollAreaRef.value) {
366
+ scrollAreaRef.value.setScrollPosition(0);
367
+ }
368
+ }
369
+ });
370
+
371
+ vue.watch(() => props.icons, (val) => {
372
+ if (props.icons !== void 0 && props.icons.length > 0) {
373
+ data.iconsList = props.icons;
374
+ }
375
+ updatePagination();
376
+ vue.nextTick(() => {
377
+ // whenever the icon set changes, it resets pagination page to page 1
378
+ setPagination({ page: 1 });
379
+ }).catch(e => console.error(e));
380
+ // scroll to top of QScrollArea, if applicable
381
+ if(scrollAreaRef.value) {
382
+ scrollAreaRef.value.setScrollPosition(0);
383
+ }
384
+ });
385
+
386
+ vue.watch(() => props.filter, () => {
387
+ // whenever the filter changes, it resets pagination page to page 1
388
+ setPagination({ page: 1, totalPages: computedPagesNumber.value });
389
+ updatePagination();
390
+ });
391
+
392
+ vue.watch(() => props.tags, (val) => {
393
+ // whenever the tags change, it resets pagination page to page 1
394
+ setPagination({ page: 1, totalPages: computedPagesNumber.value });
395
+ updatePagination();
396
+ });
397
+
398
+ if (props.modelPagination) {
399
+ vue.watch(() => props.modelPagination, (newVal, oldVal) => {
400
+ if (!samePagination(oldVal, newVal)) {
401
+ updatePagination();
402
+ }
403
+ });
404
+ }
405
+
406
+ if (props.modelPagination) {
407
+ vue.watch(() => props.modelPagination.itemsPerPage, () => {
408
+ updatePagination();
409
+ });
410
+
411
+ vue.watch(() =>props.modelPagination.page, () => {
412
+ updatePagination();
413
+ });
414
+ }
415
+
416
+ return () => {
417
+
418
+ function renderPagination() {
419
+ if (props.modelPagination && props.modelPagination.itemsPerPage === 0) return ''
420
+ const slot = (slots.pagination && slots.pagination());
421
+ const { page, totalPages } = computedPagination.value;
422
+
423
+ return slot || vue.h(quasar.QPagination, {
424
+ class: 'q-icon-picker__pagination',
425
+ ...props.paginationProps,
426
+ modelValue: page,
427
+ max: totalPages,
428
+ 'onUpdate:modelValue': value => {
429
+ if (props.animated) {
430
+ if (value > page) {
431
+ data.direction = direction.NEXT;
432
+ }
433
+ else {
434
+ data.direction = direction.PREV;
435
+ }
436
+ }
437
+ setPagination({ page: value });
438
+ }
439
+ })
440
+ }
441
+
442
+ function renderFooter() {
443
+ if (props.noFooter !== true && props.modelPagination !== void 0) {
444
+ const slot = (slots.footer && slots.footer());
445
+
446
+ return vue.h('div', {
447
+ class: 'q-icon-picker__footer flex flex-center'
448
+ }, [
449
+ slot ? slot(computedPagination.value) : renderPagination()
450
+ ])
451
+ }
452
+ }
453
+
454
+ function renderTooltip(name) {
455
+ if (props.tooltips === true) {
456
+ return () => vue.h(quasar.QTooltip, {}, () => name)
457
+ }
458
+ }
459
+
460
+ function renderIcon(icon) {
461
+ const name = (icon.prefix !== void 0 ? icon.prefix + ' ' + icon.name : icon.name);
462
+
463
+ if (slots.icon && slots.icon()) {
464
+ return slots.icon(name)
465
+ }
466
+ const isSelected = name === props.modelValue;
467
+ const textColor = isSelected ? props.selectedTextColor : undefined;
468
+ const color = isSelected ? props.selectedColor : undefined;
469
+ const size = props.size ? props.size : undefined;
470
+
471
+ return vue.h(quasar.QBtn, {
472
+ id: name,
473
+ unelevated: true,
474
+ dense: props.dense,
475
+ noWrap: true,
476
+ size: size,
477
+ textColor: textColor,
478
+ color: color,
479
+ icon: name,
480
+ onClick: () => emit('update:model-value', name),
481
+ }, renderTooltip(name))
482
+ }
483
+
484
+ function renderIcons() {
485
+ return computedDisplayedIcons.value.map(icon => renderIcon(icon))
486
+ }
487
+
488
+ function renderContainer() {
489
+ const container = () => vue.h('div', {
490
+ key: computedPagination.value.page,
491
+ class: 'q-icon-picker__container col'
492
+ }, [...renderIcons()]);
493
+
494
+ if (props.animated === true) {
495
+ const transition = 'q-transition--' + (data.direction === 'prev' ? props.transitionPrev : props.transitionNext);
496
+ return () => vue.h(vue.Transition, {
497
+ name: transition,
498
+ appear: true
499
+ }, container)
500
+ }
501
+
502
+ return container
503
+ }
504
+
505
+
506
+ function renderScrollArea() {
507
+ return vue.h(quasar.QScrollArea, {
508
+ ref: scrollAreaRef,
509
+ style: {
510
+ width: data.width + 'px',
511
+ height: data.height + 'px'
512
+ }
513
+ }, renderContainer())
514
+ }
515
+
516
+ function renderBody() {
517
+ return vue.h('div', {
518
+ class: 'q-icon-picker__body col column'
519
+ }, [
520
+ renderScrollArea(),
521
+ vue.h(quasar.QResizeObserver, {
522
+ onResize: (size) => {
523
+ data.width = size.width;
524
+ data.height = size.height;
525
+ }
526
+ })
527
+ ])
528
+ }
529
+
530
+ const classes = [
531
+ 'q-icon-picker',
532
+ 'column'
533
+ ];
534
+ if (props.color) classes.push('bg-' + props.color);
535
+ if (props.textColor) classes.push('text-' + props.textColor);
536
+
537
+ const picker = vue.h('div', {
538
+ class: classes.join(' ')
539
+ }, [
540
+ renderBody(),
541
+ renderFooter()
542
+ ]);
543
+
544
+ vue.nextTick(() => {
545
+ categories();
546
+ emit('update:tags', data.categories);
547
+ }).catch(e => console.error(e));
548
+
549
+ return picker
550
+ }
551
+ }
552
+ });
553
+
554
+ const version = '2.0.7';
555
+
556
+ function install (app) {
557
+ app.component(QIconPicker.name, QIconPicker);
558
+ }
559
+
560
+ exports.QIconPicker = QIconPicker;
561
+ exports.install = install;
562
+ exports.version = version;
@@ -0,0 +1,6 @@
1
+ /*!
2
+ * @quasar/quasar-ui-qiconpicker v2.0.7
3
+ * (c) 2023 Jeff Galbraith <jeff@quasar.dev>
4
+ * Released under the MIT License.
5
+ */
6
+ "use strict";var vue=require("vue"),quasar=require("quasar");const useIconPickerProps={modelValue:String,iconSet:{type:String,validator:e=>["material-icons","material-icons-outlined","material-icons-round","material-icons-sharp","ionicons-v4","mdi-v4","mdi-v5","mdi-v6","fontawesome-v5","eva-icons","themify","line-awesome","bootstrap-icons",""].includes(e),default:""},icons:Array,filter:String,tags:Array,dense:Boolean,tooltips:Boolean,noFooter:Boolean,size:{type:String,default:"inherit"},color:String,textColor:String,selectedColor:{type:String,default:"primary"},selectedTextColor:{type:String,default:"grey-1"},paginationProps:{type:Object,default:()=>({maxPages:5,input:!0})},modelPagination:Object,animated:Boolean,transitionPrev:{type:String,default:"slide-right"},transitionNext:{type:String,default:"slide-left"}},direction={NEXT:"next",PREV:"prev"};function useIconPickerPagination(n,o,i,e){function a(e){return e.page<1&&(e.page=1),(void 0===e.itemsPerPage||e.itemsPerPage<1)&&(e.itemsPerPage=0),e}function r(e,t){for(const n in t)if(t[n]!==e[n])return!1;return!0}const c=vue.computed(()=>{return a({...n.innerPagination,...o.modelPagination})}),t=vue.computed(()=>{return 0===c.value.itemsPerPage?1:Math.max(1,Math.ceil(e.value.length/c.value.itemsPerPage))});function s(e){const t=a({...c.value,...e});r(n.innerPagination,t)||(o.modelPagination&&i("update:model-pagination",t),n.innerPagination=t)}function u(){void 0!==o.modelPagination&&s({total:e.value.length,totalPages:t.value})}return{samePagination:r,computedPagination:c,setPagination:s,updatePagination:u,computedPagesNumber:t}}function useIconPickerIcons(o,t,n,i){function e(t){if(o.iconsList=[],t)if(window.QIconPicker){const e=t.replace(/-([a-z])/g,e=>e[1].toUpperCase());window.QIconPicker.iconSet&&window.QIconPicker.iconSet[e]?o.iconsList=window.QIconPicker.iconSet[e].icons:(console.error("QIconPicker: no icon set loaded called "+t),console.error("Be sure to load the UMD version of the icon set in a script tag before using QIconPicker UMD version"))}else try{o.iconsList=require(`@quasar/quasar-ui-qiconpicker/src/components/icon-set/${t}.js`).default.icons}catch(e){console.error("QIconPicker: cannot find icon set found called "+t)}console.info(`Loaded ${o.iconsList.length} icons.`)}const a=vue.computed(()=>{let e=[];o.iconsList&&(e=r.value,t.modelPagination)&&0!==t.modelPagination.itemsPerPage&&(e=e.slice(n.value,i.value));return e}),r=vue.computed(()=>{let e=o.iconsList;e&&(void 0!==t.tags&&""!==t.tags&&null!==t.tags&&t.tags.length>0&&(e=e.filter(e=>{return e.tags.filter(e=>t.tags.includes(e)).length>0})),void 0!==t.filter)&&""!==t.filter&&null!==t.filter&&(e=e.filter(e=>e.name.includes(t.filter)));return e});function c(){const n=[];return o.iconsList.forEach(e=>{const t=e.tags;t&&t.length>0&&t.forEach(e=>{!0!==n.includes(e)&&n.push(e)})}),n.sort(),o.categories=n,!0}return{loadIconSet:e,computedDisplayedIcons:a,computedFilteredIcons:r,categories:c}}function exposeIconPickerApi(n,e,o,i,t,a,r,c){const s=()=>{const e=o.value["page"];e>1&&(i({page:e-1}),n.direction=direction.PREV)},u=()=>{const{page:e,itemsPerPage:t}=o.value;a.value>0&&e*t<r.value.length&&(i({page:e+1}),n.direction=direction.NEXT)},l=()=>{i({page:c.value})},d=()=>{i({page:0})},g=vue.computed(()=>{return 0===a.value||o.value.page>=c.value}),p=vue.computed(()=>{return 1===o.value.page});e({prevPage:s,nextPage:u,lastPage:l,firstPage:d,isLastPage:g,isFirstPage:p})}var QIconPicker=vue.defineComponent({name:"QIconPicker",props:{...useIconPickerProps},emits:["update:model-value","update:tags","update:model-pagination"],setup(l,{slots:d,emit:g,expose:e}){const p=vue.ref(null),v=vue.reactive({iconsList:[],innerPagination:{page:1,itemsPerPage:0,totalPages:0},categories:[],width:"100",height:"100",direction:""}),t=vue.computed(()=>{const{page:e,itemsPerPage:t}=f.value;return(e-1)*t}),n=vue.computed(()=>{const{page:e,itemsPerPage:t}=f.value;return e*t}),{loadIconSet:o,computedDisplayedIcons:P,computedFilteredIcons:i,categories:m}=useIconPickerIcons(v,l,t,n),{samePagination:a,computedPagination:f,setPagination:h,updatePagination:r,computedPagesNumber:c}=useIconPickerPagination(v,l,g,i);return exposeIconPickerApi(v,e,f,h,t,n,i,c),vue.onMounted(()=>{l.iconSet?o(l.iconSet):void 0!==l.icons&&l.icons.length>0&&(v.iconsList=l.icons);r()}),vue.watch(()=>l.iconSet,e=>{e&&(o(e),r(),vue.nextTick(()=>{h({page:1})}).catch(e=>console.error(e)),p.value)&&p.value.setScrollPosition(0)}),vue.watch(()=>l.icons,e=>{void 0!==l.icons&&l.icons.length>0&&(v.iconsList=l.icons);r();vue.nextTick(()=>{h({page:1})}).catch(e=>console.error(e));p.value&&p.value.setScrollPosition(0)}),vue.watch(()=>l.filter,()=>{h({page:1,totalPages:c.value});r()}),vue.watch(()=>l.tags,e=>{h({page:1,totalPages:c.value});r()}),l.modelPagination&&vue.watch(()=>l.modelPagination,(e,t)=>{a(t,e)||r()}),l.modelPagination&&(vue.watch(()=>l.modelPagination.itemsPerPage,()=>{r()}),vue.watch(()=>l.modelPagination.page,()=>{r()})),()=>{function t(){if(l.modelPagination&&0===l.modelPagination.itemsPerPage)return"";const e=d.pagination&&d.pagination(),{page:t,totalPages:n}=f.value;return e||vue.h(quasar.QPagination,{class:"q-icon-picker__pagination",...l.paginationProps,modelValue:t,max:n,"onUpdate:modelValue":e=>{l.animated&&(e>t?v.direction=direction.NEXT:v.direction=direction.PREV);h({page:e})}})}function e(){if(!0!==l.noFooter&&void 0!==l.modelPagination){const e=d.footer&&d.footer();return vue.h("div",{class:"q-icon-picker__footer flex flex-center"},[e?e(f.value):t()])}}function r(e){if(!0===l.tooltips)return()=>vue.h(quasar.QTooltip,{},()=>e)}function n(e){const t=void 0!==e.prefix?e.prefix+" "+e.name:e.name;if(d.icon&&d.icon())return d.icon(t);const n=t===l.modelValue,o=n?l.selectedTextColor:void 0,i=n?l.selectedColor:void 0,a=l.size||void 0;return vue.h(quasar.QBtn,{id:t,unelevated:!0,dense:l.dense,noWrap:!0,size:a,textColor:o,color:i,icon:t,onClick:()=>g("update:model-value",t)},r(t))}function o(){return P.value.map(e=>n(e))}function i(){const e=()=>vue.h("div",{key:f.value.page,class:"q-icon-picker__container col"},[...o()]);if(!0!==l.animated)return e;{const t="q-transition--"+("prev"===v.direction?l.transitionPrev:l.transitionNext);return()=>vue.h(vue.Transition,{name:t,appear:!0},e)}}function a(){return vue.h(quasar.QScrollArea,{ref:p,style:{width:v.width+"px",height:v.height+"px"}},i())}function c(){return vue.h("div",{class:"q-icon-picker__body col column"},[a(),vue.h(quasar.QResizeObserver,{onResize:e=>{v.width=e.width;v.height=e.height}})])}const s=["q-icon-picker","column"];l.color&&s.push("bg-"+l.color);l.textColor&&s.push("text-"+l.textColor);const u=vue.h("div",{class:s.join(" ")},[c(),e()]);vue.nextTick(()=>{m();g("update:tags",v.categories)}).catch(e=>console.error(e));return u}}});const version="2.0.7";function install(e){e.component(QIconPicker.name,QIconPicker)}exports.QIconPicker=QIconPicker,exports.install=install,exports.version=version;
package/dist/index.css CHANGED
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * @quasar/quasar-ui-qiconpicker v2.0.5
3
- * (c) 2022 Jeff Galbraith <jeff@quasar.dev>
2
+ * @quasar/quasar-ui-qiconpicker v2.0.7
3
+ * (c) 2023 Jeff Galbraith <jeff@quasar.dev>
4
4
  * Released under the MIT License.
5
5
  */
6
6
  .q-icon-picker {