mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-03-06 20:41:17 +01:00
* chore: up deps * chore: up composer * fix(deps): bump 2factor to v7 * chore: up harmony * chore: up harmony * fix: missing await * feat: allow middlewares to pass in template values via res.locals * feat: buildAccountData middleware automatically added ot all account routes * fix: properly allow values in res.locals.templateValues to be added to the template data * refactor: user/blocks * refactor(accounts): categories and consent * feat: automatically 404 if exposeUid or exposeGroupName come up empty * refactor: remove calls to getUserDataByUserSlug for most account routes, since it is populated via middleware now * fix: allow exposeUid and exposeGroupName to work with slugs with mixed capitalization * fix: move reputation removal check to accountHelpers method * test: skip i18n tests if ref branch when present is not develop * fix(deps): bump theme versions * fix(deps): bump ntfy and 2factor * chore: up harmony * fix: add missing return * fix: #11191, only focus on search input on md environments and up * feat: allow file uploads on mobile chat closes https://github.com/NodeBB/NodeBB/issues/11217 * chore: up themes * chore: add lang string * fix(deps): bump ntfy to 1.0.15 * refactor: use new if/each syntax * chore: up composer * fix: regression from user helper refactor * chore: up harmony * chore: up composer * chore: up harmony * chore: up harmony * chore: up harmony * chore: fix composer version * feat: add increment helper * chore: up harmony * fix: #11228 no timestamps in future ⌛ * chore: up harmony * check config.theme as well fire action:posts.loaded after processing dom * chore: up harmony * chore: up harmony * chore: up harmony * chore: up themes * chore: up harmony * remove extra class * refactor: move these to core from harmony * chore: up widgets * chore: up widgets * height auto * fix: closes #11238 * dont focus inputs, annoying on mobile * fix: dont focus twice, only focus on chat input on desktop dont wrap widget footer in row * chore: up harmony * chore: up harmony * update chat window * chore: up themes * fix cache buster for skins * chat fixes * chore: up harmony * chore: up composer * refactor: change hook logs to debug * fix: scroll to post right after adding to dom * fix: hash scrolling and highlighting correct post * test: re-enable read API schema tests * fix: add back schema changes for179faa2270andc3920ccb10* fix: schema changes from488f0978a4* fix: schema changes forf4cf482a87* fix: schema update forbe6bbabd0e* fix: schema changes for69c96078ea* fix: schema changes ford1364c3130* fix: schema changes for84ff1152f7* fix: schema changes forb860c2605c* fix: schema changes for23cb67a112* fix: schema changes forb916e42f40* fix: schema change fora9bbb586fc* fix: schema changes for4b738c8cd3* fix: schema changes for58b5781cea* fix: schema changes for794bf01b21* fix: schema changes for80ea12c1c1,e368feef51, and52ead114be* fix: composer-default object in config? * fix: schema changes for9acdc6808cand0930934200* fix: schema changes forc0a52924f1* fix: schema change foraba420a3f3, move loggedInUser to optional props * fix: schema changes for8c67031609* fix: schema changes for27e53b42f3* fix: schema changes for2835966518* fix: breaking test for email confirmation API call * fix: schema changes for refactored search page * fix: schema changes for user object * fix: schema changes for9f531f957e* fix: schema changes forc4042c70deand23175110a2* fix: schema changes for9b3616b103* fix: schema changes for5afd5de07d* fix: schema change for1d7baf1217* fix: schema changes for57bfb37c55andbe6bbabd0e* fix: schema changes for6e86b4afa2and3efad2e13band68f66223e7* fix: allowing optional qs prop in pagination keys (not sure why this didn't break before) * fix: re-login on email change * fix: schema changes forc926358d73* fix: schema changes for388a8270c9* fix: schema change for2658bcc821* fix: no need to call account middlewares for chats routes * fix: schema changes for71743affc3* fix: final schema changes * test: support for anyOf and oneOf * fix: check thumb * dont scroll to top on back press * remove group log * fix: add top margin to merged and deleted alerts * chore: up widgets * fix: improve fix-lists mixin * chore: up harmony/composer * feat: allow hiding quicksearch results during search * dont record searches made by composer * chore: up 54 * chore: up spam be gone * feat: add prev/next page and page count into mobile paginator * chore: up harmony * chore: up harmony * use old style for IS * fix: hide entire toolbar row if no posts or not singlePost * fix: updated messaging for post-queue template, #11206 * fix: btn-sm on post queue back button * fix: bump harmony, closes #11206 * fix: remove unused alert module import * fix: bump harmony * fix: bump harmony * chore: up harmony * refactor: IS scrolltop * fix: update users:search-user-for-chat source string * feat: support for mark-read toggle on chats dropdown and recent chats list * feat: api v3 calls to mark chat read/unread * feat: send event:chats.mark socket event on mark read or unread * refactor: allow frontend to mark chats as unread, use new API v3 routes instead of socket calls, better frontend event handling * docs: openapi schema updates for chat marking * fix: allow unread state toggling in chats dropdown too * fix: issue where repeated openings of the chats dropdown would continually add events for mark-read/unread * fix: debug log * refactor: move userSearch filter to a module * feat(routes): allow remounting /categories (#11230) * feat: send flags count to frontend on flags list page * refactor: filter form client-side js to extract out some logic * fix: applyFilters to not take any arguments, update selectedCids in updateButton instead of onHidden * fix: use userFilter module for assignee, reporterId, targetUid * fix(openapi): schema changes for updated flags page * fix: dont allow adding duplicates to userFilter * use same var * remove log * fix: closes #11282 * feat: lang key for x-topics * chore: up harmony * chore: up emoji * chore: up harmony * fix: update userFilter to allow new option `selectedBlock` * fix: wrong block name passed to userFilter * fix: https://github.com/NodeBB/NodeBB/issues/11283 * fix: chats, allow multiple dropdowns like in harmony * chore: up harmony * refactor: flag note adding/editing, closes #11285 * fix: remove old prepareEdit logic * chore: add caveat about hacky code block in userFilter module * fix: placeholders for userFilter module * refactor: navigator so it works with multiple thumbs/navigators * chore: up harmony * fix: closes #11287, destroy quick reply autocomplete on navigation * fix: filter disabled categories on user categories page count * chore: up harmony * docs: update openapi spec to include info about passing in timestamps for topic creation, removing timestamp as valid request param for topic replying * fix: send back null values on ACP search dashboard for startDate and endDate if not expicitly passed in, fix tests * fix: tweak table order in ACP dash searches * fix: only invoke navigator click drag on left mouse button * feat: add back unread indicator to navigator * clear bookmark on mark unread * fix: navigator crash on ajaxify * better thumb top calculation * fix: reset user bookmark when topic is marked unread * Revert "fix: reset user bookmark when topic is marked unread" This reverts commit9bcd85c2c6. * fix: update unread indicator on scroll, add unread count * chore: bump harmony * fix: crash on navigator unread update when backing out of a topic * fix: closes #11183 * fix: update topics:recent zset when rescheduling a topic * fix: dupe quote button, increase delay, hide immediately on empty selection * fix: navigator not showing up on first load * refactor: remove glance assorted fixes to navigator dont reduce remaning count if user scrolls down and up quickly only call topic.navigatorCallback when index changes * more sanity checks for bookmark dont allow setting bookmark higher than topic postcount * closes #11218, 🚋 * Revert "fix: update topics:recent zset when rescheduling a topic" This reverts commit737973cca9. * fix: #11306, show proper error if queued post doesn't exist was showing no-privileges if someone else accepted the post * https://github.com/NodeBB/NodeBB/issues/11307 dont use li * chore: up harmony * chore: bump version string * fix: copy paste fail * feat: closes #7382, tag filtering add client side support for filtering by tags on /category, /recent and /unread * chore: up harmony * chore: up harmony * Revert "fix: add back req.query fallback for backwards compatibility" [breaking] This reverts commitcf6cc2c454. This commit is no longer required as passing in a CSRF token via query parameter is no longer supported as of NodeBB v3.x This is a breaking change. * fix: pass csrf token in form data, re: NodeBB/NodeBB#11309 * chore: up deps * fix: tests, use x-csrf-token query param removed * test: fix csrf_token * lint: remove unused * feat: add itemprop="image" to avatar helper * fix: get chat upload button in chat modal * breaking: remove deprecated socket.io methods * test: update messaging tests to not use sockets * fix: parent post links * fix: prevent post tooltip if mouse leaves before data/tpl is loaded * chore: up harmony * chore: up harmony * chore: up harmony * chore: up harmony * fix: nested replies indices * fix(deps): bump 2factor * feat: add loggedIn user to all api routes * chore: up themes * refactor: audit admin v3 write api routes as per #11321 * refactor: audit category v3 write api routes as per #11321 [breaking] docs: fix open api spec for #11321 * refactor: audit chat v3 write api routes as per #11321 * refactor: audit files v3 write api routes as per #11321 * refactor: audit flags v3 write api routes as per #11321 * refactor: audit posts v3 write api routes as per #11321 * refactor: audit topics v3 write api routes as per #11321 * refactor: audit users v3 write api routes as per #11321 * fix: lang string * remove min height * fix: empty topic/labels taking up space * fix: tag filtering when changing filter to watched topics or changing popular time limit to month * chore: up harmony * fix: closes #11354, show no post error if queued post already accepted/rejected * test: #11354 * test: #11354 * fix(deps): bump 2factor * fix: #11357 clear cache on thumb remove * fix: thumb remove on windows, closes #11357 * test: openapi for thumbs * test: fix openapi --------- Co-authored-by: Julian Lam <julian@nodebb.org> Co-authored-by: Opliko <opliko.reg@protonmail.com>
389 lines
20 KiB
JavaScript
389 lines
20 KiB
JavaScript
'use strict';
|
|
|
|
|
|
define('iconSelect', ['benchpress', 'bootbox'], function (Benchpress, bootbox) {
|
|
const iconSelect = {};
|
|
const initialIcons = [
|
|
{ id: 'nbb-none', label: 'None (NodeBB)', style: 'nodebb' },
|
|
{ id: 'youtube', label: 'YouTube (brands)', style: 'brands' },
|
|
{ id: 'window-restore', label: 'Window Restore (solid)', style: 'solid' },
|
|
{ id: 'window-maximize', label: 'Window Maximize (solid)', style: 'solid' },
|
|
{ id: 'rectangle-xmark', label: 'Rectangle X Mark (solid)', style: 'solid' },
|
|
{ id: 'triangle-exclamation', label: 'Triangle exclamation (solid)', style: 'solid' },
|
|
{ id: 'phone-volume', label: 'Phone Volume (solid)', style: 'solid' },
|
|
{ id: 'video', label: 'Video (solid)', style: 'solid' },
|
|
{ id: 'address-card', label: 'Address Card (solid)', style: 'solid' },
|
|
{ id: 'user', label: 'User (solid)', style: 'solid' },
|
|
{ id: 'circle-user', label: 'Circle user (solid)', style: 'solid' },
|
|
{ id: 'usb', label: 'USB (brands)', style: 'brands' },
|
|
{ id: 'sort', label: 'Sort (solid)', style: 'solid' },
|
|
{ id: 'unlock', label: 'unlock (solid)', style: 'solid' },
|
|
{ id: 'link-slash', label: 'Link Slash (solid)', style: 'solid' },
|
|
{ id: 'trash-can', label: 'Trash can (solid)', style: 'solid' },
|
|
{ id: 'transgender', label: 'Transgender (solid)', style: 'solid' },
|
|
{ id: 'mars-and-venus', label: 'Mars and Venus (solid)', style: 'solid' },
|
|
{ id: 'square-caret-up', label: 'Square caret up (solid)', style: 'solid' },
|
|
{ id: 'square-caret-right', label: 'Square caret right (solid)', style: 'solid' },
|
|
{ id: 'square-caret-left', label: 'Square caret left (solid)', style: 'solid' },
|
|
{ id: 'square-caret-down', label: 'Square caret down (solid)', style: 'solid' },
|
|
{ id: 'circle-xmark', label: 'Circle X Mark (solid)', style: 'solid' },
|
|
{ id: 'thumbs-up', label: 'thumbs-up (solid)', style: 'solid' },
|
|
{ id: 'thumbs-down', label: 'thumbs-down (solid)', style: 'solid' },
|
|
{ id: 'thumbtack', label: 'Thumbtack (solid)', style: 'solid' },
|
|
{ id: 'temperature-full', label: 'Temperature full (solid)', style: 'solid' },
|
|
{ id: 'temperature-three-quarters', label: 'Temperature three quarters (solid)', style: 'solid' },
|
|
{ id: 'temperature-half', label: 'Temperature half (solid)', style: 'solid' },
|
|
{ id: 'temperature-quarter', label: 'Temperature quarter (solid)', style: 'solid' },
|
|
{ id: 'temperature-empty', label: 'Temperature empty (solid)', style: 'solid' },
|
|
{ id: 'tv', label: 'Television (solid)', style: 'solid' },
|
|
{ id: 'bars-progress', label: 'Bars progress (solid)', style: 'solid' },
|
|
{ id: 'gauge-high', label: 'Gauge (solid)', style: 'solid' },
|
|
{ id: 'tablet-screen-button', label: 'Tablet screen button (solid)', style: 'solid' },
|
|
{ id: 'life-ring', label: 'Life Ring (solid)', style: 'solid' },
|
|
{ id: 'sun', label: 'Sun (solid)', style: 'solid' },
|
|
{ id: 'circle-stop', label: 'Circle stop (solid)', style: 'solid' },
|
|
{ id: 'note-sticky', label: 'Note sticky (solid)', style: 'solid' },
|
|
{ id: 'star', label: 'Star (solid)', style: 'solid' },
|
|
{ id: 'star-half-stroke', label: 'Star half stroke (solid)', style: 'solid' },
|
|
{ id: 'square', label: 'Square (solid)', style: 'solid' },
|
|
{ id: 'arrow-down-9-1', label: 'Arrow down 9 1 (solid)', style: 'solid' },
|
|
{ id: 'arrow-down-1-9', label: 'Arrow down 1 9 (solid)', style: 'solid' },
|
|
{ id: 'sort-down', label: 'Sort Down (Descending) (solid)', style: 'solid' },
|
|
{ id: 'sort-up', label: 'Sort Up (Ascending) (solid)', style: 'solid' },
|
|
{ id: 'arrow-down-wide-short', label: 'Arrow down wide short (solid)', style: 'solid' },
|
|
{ id: 'arrow-down-short-wide', label: 'Arrow down short wide (solid)', style: 'solid' },
|
|
{ id: 'arrow-down-z-a', label: 'Arrow down z a (solid)', style: 'solid' },
|
|
{ id: 'arrow-down-a-z', label: 'Arrow down a z (solid)', style: 'solid' },
|
|
{ id: 'futbol', label: 'Futbol ball (solid)', style: 'solid' },
|
|
{ id: 'snowflake', label: 'Snowflake (solid)', style: 'solid' },
|
|
{ id: 'face-smile', label: 'Face Smile (solid)', style: 'solid' },
|
|
{ id: 'hands', label: 'Hands (solid)', style: 'solid' },
|
|
{ id: 'right-from-bracket', label: 'Right from bracket (solid)', style: 'solid' },
|
|
{ id: 'right-to-bracket', label: 'Right to bracket (solid)', style: 'solid' },
|
|
{ id: 'share-from-square', label: 'Share from square (solid)', style: 'solid' },
|
|
{ id: 'paper-plane', label: 'Paper Plane (solid)', style: 'solid' },
|
|
{ id: 'floppy-disk', label: 'Floppy Disk (solid)', style: 'solid' },
|
|
{ id: 'safari', label: 'Safari (brands)', style: 'brands' },
|
|
{ id: 'bath', label: 'Bath (solid)', style: 'solid' },
|
|
{ id: 'arrow-rotate-right', label: 'Arrow Rotate Right (solid)', style: 'solid' },
|
|
{ id: 'arrow-rotate-left', label: 'Arrow Rotate Left (solid)', style: 'solid' },
|
|
{ id: 'bars', label: 'Bars (solid)', style: 'solid' },
|
|
{ id: 'xmark', label: 'X Mark (solid)', style: 'solid' },
|
|
{ id: 'registered', label: 'Registered Trademark (solid)', style: 'solid' },
|
|
{ id: 'arrows-rotate', label: 'Arrows rotate (solid)', style: 'solid' },
|
|
{ id: 'circle-question', label: 'Circle question (solid)', style: 'solid' },
|
|
{ id: 'square-plus', label: 'Square plus (solid)', style: 'solid' },
|
|
{ id: 'circle-play', label: 'Circle play (solid)', style: 'solid' },
|
|
{ id: 'chart-pie', label: 'Pie Chart (solid)', style: 'solid' },
|
|
{ id: 'image', label: 'Image (solid)', style: 'solid' },
|
|
{ id: 'pen-to-square', label: 'Pen to square (solid)', style: 'solid' },
|
|
{ id: 'square-pen', label: 'Square pen (solid)', style: 'solid' },
|
|
{ id: 'circle-pause', label: 'Circle pause (solid)', style: 'solid' },
|
|
{ id: 'opera', label: 'Opera (brands)', style: 'brands' },
|
|
{ id: 'openid', label: 'OpenID (brands)', style: 'brands' },
|
|
{ id: 'object-ungroup', label: 'Object Ungroup (solid)', style: 'solid' },
|
|
{ id: 'object-group', label: 'Object Group (solid)', style: 'solid' },
|
|
{ id: 'newspaper', label: 'Newspaper (solid)', style: 'solid' },
|
|
{ id: 'graduation-cap', label: 'Graduation Cap (solid)', style: 'solid' },
|
|
{ id: 'moon', label: 'Moon (solid)', style: 'solid' },
|
|
{ id: 'money-bill-1', label: 'Money bill 1 (solid)', style: 'solid' },
|
|
{ id: 'mobile-screen-button', label: 'Mobile screen button (solid)', style: 'solid' },
|
|
{ id: 'square-minus', label: 'Square minus (solid)', style: 'solid' },
|
|
{ id: 'face-meh', label: 'Face meh (solid)', style: 'solid' },
|
|
{ id: 'map', label: 'Map (solid)', style: 'solid' },
|
|
{ id: 'location-dot', label: 'Location dot (solid)', style: 'solid' },
|
|
{ id: 'reply-all', label: 'reply-all (solid)', style: 'solid' },
|
|
{ id: 'reply', label: 'Reply (solid)', style: 'solid' },
|
|
{ id: 'share', label: 'Share (solid)', style: 'solid' },
|
|
{ id: 'wand-magic-sparkles', label: 'Wand magic sparkles (solid)', style: 'solid' },
|
|
{ id: 'up-long', label: 'Up long (solid)', style: 'solid' },
|
|
{ id: 'right-long', label: 'Right long (solid)', style: 'solid' },
|
|
{ id: 'left-long', label: 'Left long (solid)', style: 'solid' },
|
|
{ id: 'down-long', label: 'Down long (solid)', style: 'solid' },
|
|
{ id: 'rectangle-list', label: 'Rectangle list (solid)', style: 'solid' },
|
|
{ id: 'chart-line', label: 'Line Chart (solid)', style: 'solid' },
|
|
{ id: 'lightbulb', label: 'Lightbulb (solid)', style: 'solid' },
|
|
{ id: 'turn-up', label: 'Turn up (solid)', style: 'solid' },
|
|
{ id: 'turn-down', label: 'Turn down (solid)', style: 'solid' },
|
|
{ id: 'lemon', label: 'Lemon (solid)', style: 'solid' },
|
|
{ id: 'gavel', label: 'Gavel (solid)', style: 'solid' },
|
|
{ id: 'keyboard', label: 'Keyboard (solid)', style: 'solid' },
|
|
{ id: 'building-columns', label: 'Building with Columns (solid)', style: 'solid' },
|
|
{ id: 'id-card', label: 'Identification Card (solid)', style: 'solid' },
|
|
{ id: 'id-badge', label: 'Identification Badge (solid)', style: 'solid' },
|
|
{ id: 'hourglass', label: 'Hourglass (solid)', style: 'solid' },
|
|
{ id: 'hourglass-end', label: 'Hourglass End (solid)', style: 'solid' },
|
|
{ id: 'hourglass-half', label: 'Hourglass Half (solid)', style: 'solid' },
|
|
{ id: 'hourglass-start', label: 'Hourglass Start (solid)', style: 'solid' },
|
|
{ id: 'bed', label: 'Bed (solid)', style: 'solid' },
|
|
{ id: 'hospital', label: 'hospital (solid)', style: 'solid' },
|
|
{ id: 'house', label: 'House (solid)', style: 'solid' },
|
|
{ id: 'heart', label: 'Heart (solid)', style: 'solid' },
|
|
{ id: 'heading', label: 'heading (solid)', style: 'solid' },
|
|
{ id: 'hard-drive', label: 'Hard drive (solid)', style: 'solid' },
|
|
{ id: 'ear-deaf', label: 'Ear deaf (solid)', style: 'solid' },
|
|
{ id: 'handshake', label: 'Handshake (solid)', style: 'solid' },
|
|
{ id: 'hand', label: 'Paper (Hand) (solid)', style: 'solid' },
|
|
{ id: 'hand-spock', label: 'Spock (Hand) (solid)', style: 'solid' },
|
|
{ id: 'hand-scissors', label: 'Scissors (Hand) (solid)', style: 'solid' },
|
|
{ id: 'hand-back-fist', label: 'Rock (Hand) (solid)', style: 'solid' },
|
|
{ id: 'hand-pointer', label: 'Pointer (Hand) (solid)', style: 'solid' },
|
|
{ id: 'hand-peace', label: 'Peace (Hand) (solid)', style: 'solid' },
|
|
{ id: 'hand-point-up', label: 'Hand Pointing Up (solid)', style: 'solid' },
|
|
{ id: 'hand-point-right', label: 'Hand Pointing Right (solid)', style: 'solid' },
|
|
{ id: 'hand-point-left', label: 'Hand Pointing Left (solid)', style: 'solid' },
|
|
{ id: 'hand-point-down', label: 'Hand Pointing Down (solid)', style: 'solid' },
|
|
{ id: 'hand-lizard', label: 'Lizard (Hand) (solid)', style: 'solid' },
|
|
{ id: 'users', label: 'Users (solid)', style: 'solid' },
|
|
{ id: 'gears', label: 'Gears (solid)', style: 'solid' },
|
|
{ id: 'gear', label: 'Gear (solid)', style: 'solid' },
|
|
{ id: 'face-frown', label: 'Face frown (solid)', style: 'solid' },
|
|
{ id: 'font-awesome', label: 'Font Awesome (brands)', style: 'brands' },
|
|
{ id: 'folder-open', label: 'Folder Open (solid)', style: 'solid' },
|
|
{ id: 'folder', label: 'Folder (solid)', style: 'solid' },
|
|
{ id: 'bolt', label: 'Bolt (solid)', style: 'solid' },
|
|
{ id: 'flag', label: 'flag (solid)', style: 'solid' },
|
|
{ id: 'firefox', label: 'Firefox (brands)', style: 'brands' },
|
|
{ id: 'copy', label: 'Copy (solid)', style: 'solid' },
|
|
{ id: 'file-zipper', label: 'File zipper (solid)', style: 'solid' },
|
|
{ id: 'file-video', label: 'Video File (solid)', style: 'solid' },
|
|
{ id: 'file-lines', label: 'File lines (solid)', style: 'solid' },
|
|
{ id: 'file-audio', label: 'Audio File (solid)', style: 'solid' },
|
|
{ id: 'file-image', label: 'Image File (solid)', style: 'solid' },
|
|
{ id: 'file', label: 'File (solid)', style: 'solid' },
|
|
{ id: 'file-code', label: 'Code File (solid)', style: 'solid' },
|
|
{ id: 'eye-dropper', label: 'Eye Dropper (solid)', style: 'solid' },
|
|
{ id: 'eye-slash', label: 'Eye Slash (solid)', style: 'solid' },
|
|
{ id: 'eye', label: 'Eye (solid)', style: 'solid' },
|
|
{ id: 'square-up-right', label: 'Square up right (solid)', style: 'solid' },
|
|
{ id: 'up-right-from-square', label: 'Up right from square (solid)', style: 'solid' },
|
|
{ id: 'up-right-and-down-left-from-center', label: 'Up right and down left from center (solid)', style: 'solid' },
|
|
{ id: 'right-left', label: 'Right left (solid)', style: 'solid' },
|
|
{ id: 'envelope-open', label: 'Envelope Open (solid)', style: 'solid' },
|
|
{ id: 'envelope', label: 'Envelope (solid)', style: 'solid' },
|
|
{ id: 'edge', label: 'Edge Browser (brands)', style: 'brands' },
|
|
{ id: 'circle-dot', label: 'Circle dot (solid)', style: 'solid' },
|
|
{ id: 'gem', label: 'Gem (solid)', style: 'solid' },
|
|
{ id: 'outdent', label: 'Outdent (solid)', style: 'solid' },
|
|
{ id: 'utensils', label: 'Utensils (solid)', style: 'solid' },
|
|
{ id: 'scissors', label: 'Scissors (solid)', style: 'solid' },
|
|
{ id: 'credit-card', label: 'Credit Card (solid)', style: 'solid' },
|
|
{ id: 'creative-commons', label: 'Creative Commons (brands)', style: 'brands' },
|
|
{ id: 'copyright', label: 'Copyright (solid)', style: 'solid' },
|
|
{ id: 'down-left-and-up-right-to-center', label: 'Down left and up right to center (solid)', style: 'solid' },
|
|
{ id: 'compass', label: 'Compass (solid)', style: 'solid' },
|
|
{ id: 'comments', label: 'comments (solid)', style: 'solid' },
|
|
{ id: 'comment-dots', label: 'Comment Dots (solid)', style: 'solid' },
|
|
{ id: 'comment', label: 'comment (solid)', style: 'solid' },
|
|
{ id: 'code-branch', label: 'Code Branch (solid)', style: 'solid' },
|
|
{ id: 'cloud-arrow-up', label: 'Cloud arrow up (solid)', style: 'solid' },
|
|
{ id: 'cloud-arrow-down', label: 'Cloud arrow down (solid)', style: 'solid' },
|
|
{ id: 'clone', label: 'Clone (solid)', style: 'solid' },
|
|
{ id: 'clock', label: 'Clock (solid)', style: 'solid' },
|
|
{ id: 'paste', label: 'Paste (solid)', style: 'solid' },
|
|
{ id: 'circle', label: 'Circle (solid)', style: 'solid' },
|
|
{ id: 'circle-notch', label: 'Circle Notched (solid)', style: 'solid' },
|
|
{ id: 'chrome', label: 'Chrome (brands)', style: 'brands' },
|
|
{ id: 'square-check', label: 'Square check (solid)', style: 'solid' },
|
|
{ id: 'circle-check', label: 'Circle check (solid)', style: 'solid' },
|
|
{ id: 'link', label: 'Link (solid)', style: 'solid' },
|
|
{ id: 'closed-captioning', label: 'Closed Captioning (solid)', style: 'solid' },
|
|
{ id: 'calendar-xmark', label: 'Calendar X Mark (solid)', style: 'solid' },
|
|
{ id: 'calendar-plus', label: 'Calendar Plus (solid)', style: 'solid' },
|
|
{ id: 'calendar', label: 'Calendar (solid)', style: 'solid' },
|
|
{ id: 'calendar-minus', label: 'Calendar Minus (solid)', style: 'solid' },
|
|
{ id: 'calendar-check', label: 'Calendar Check (solid)', style: 'solid' },
|
|
{ id: 'calendar-days', label: 'Calendar Days (solid)', style: 'solid' },
|
|
{ id: 'taxi', label: 'Taxi (solid)', style: 'solid' },
|
|
{ id: 'building', label: 'Building (solid)', style: 'solid' },
|
|
{ id: 'bookmark', label: 'bookmark (solid)', style: 'solid' },
|
|
{ id: 'bluetooth', label: 'Bluetooth (brands)', style: 'brands' },
|
|
{ id: 'bell-slash', label: 'Bell Slash (solid)', style: 'solid' },
|
|
{ id: 'bell', label: 'bell (solid)', style: 'solid' },
|
|
{ id: 'battery-full', label: 'Battery Full (solid)', style: 'solid' },
|
|
{ id: 'battery-three-quarters', label: 'Battery 3/4 Full (solid)', style: 'solid' },
|
|
{ id: 'battery-half', label: 'Battery 1/2 Full (solid)', style: 'solid' },
|
|
{ id: 'battery-quarter', label: 'Battery 1/4 Full (solid)', style: 'solid' },
|
|
{ id: 'battery-empty', label: 'Battery Empty (solid)', style: 'solid' },
|
|
{ id: 'chart-column', label: 'Chart Column (solid)', style: 'solid' },
|
|
{ id: 'car', label: 'Car (solid)', style: 'solid' },
|
|
{ id: 'hands-asl-interpreting', label: 'Hands american sign language interpreting (solid)', style: 'solid' },
|
|
{ id: 'up-down', label: 'Up down (solid)', style: 'solid' },
|
|
{ id: 'left-right', label: 'Left right (solid)', style: 'solid' },
|
|
{ id: 'maximize', label: 'Maximize (solid)', style: 'solid' },
|
|
{ id: 'up-down-left-right', label: 'Up down left right (solid)', style: 'solid' },
|
|
{ id: 'circle-up', label: 'Circle up (solid)', style: 'solid' },
|
|
{ id: 'circle-right', label: 'Circle right (solid)', style: 'solid' },
|
|
{ id: 'circle-left', label: 'Circle left (solid)', style: 'solid' },
|
|
{ id: 'circle-down', label: 'Circle down (solid)', style: 'solid' },
|
|
{ id: 'chart-area', label: 'Area Chart (solid)', style: 'solid' },
|
|
{ id: 'apple', label: 'Apple (brands)', style: 'brands' },
|
|
{ id: 'android', label: 'Android (brands)', style: 'brands' },
|
|
{ id: 'address-book', label: 'Address Book (solid)', style: 'solid' },
|
|
];
|
|
iconSelect.init = function (el, onModified) {
|
|
onModified = onModified || function () {};
|
|
let selected = cleanFAClass(el.attr('class'));
|
|
|
|
$('#icons .selected').removeClass('selected');
|
|
|
|
if (selected) {
|
|
try {
|
|
$('#icons .nbb-fa-icons .fa.' + selected).addClass('selected');
|
|
} catch (err) {
|
|
selected = '';
|
|
}
|
|
}
|
|
|
|
Benchpress.render('partials/fontawesome', { icons: initialIcons }).then(function (html) {
|
|
html = $(html);
|
|
|
|
const picker = bootbox.dialog({
|
|
onEscape: true,
|
|
backdrop: true,
|
|
show: false,
|
|
message: html,
|
|
size: 'large',
|
|
title: 'Select an Icon',
|
|
buttons: {
|
|
noIcon: {
|
|
label: 'No Icon',
|
|
className: 'btn-default',
|
|
callback: function () {
|
|
el.removeClass(selected);
|
|
el.val('');
|
|
el.attr('value', '');
|
|
onModified(el, '');
|
|
},
|
|
},
|
|
success: {
|
|
label: 'Select',
|
|
className: 'btn-primary',
|
|
callback: function () {
|
|
const iconClass = $('.bootbox .selected').attr('class') || `fa fa-${$('.bootbox #fa-filter').val()}`;
|
|
const newIconClass = cleanFAClass(iconClass);
|
|
|
|
if (newIconClass) {
|
|
el.removeClass(selected).addClass(newIconClass);
|
|
el.val(newIconClass);
|
|
el.attr('value', newIconClass);
|
|
}
|
|
|
|
onModified(el, newIconClass);
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
picker.on('show.bs.modal', function () {
|
|
const modalEl = $(this);
|
|
const searchEl = modalEl.find('input');
|
|
|
|
if (selected) {
|
|
modalEl.find('.' + selected).addClass('selected');
|
|
searchEl.val(selected.replace('fa-', ''));
|
|
}
|
|
}).modal('show');
|
|
|
|
picker.on('shown.bs.modal', function () {
|
|
const modalEl = $(this);
|
|
const searchEl = modalEl.find('input');
|
|
const iconContainer = modalEl.find('.nbb-fa-icons');
|
|
let icons = modalEl.find('.nbb-fa-icons i');
|
|
const submitEl = modalEl.find('button.btn-primary');
|
|
let lastSearch = '';
|
|
|
|
function changeSelection(newSelection) {
|
|
modalEl.find('i.selected').removeClass('selected');
|
|
if (newSelection) {
|
|
newSelection.addClass('selected');
|
|
} else if (searchEl.val().length === 0) {
|
|
if (selected) {
|
|
modalEl.find('.' + selected).addClass('selected');
|
|
}
|
|
} else {
|
|
modalEl.find('i:visible').first().addClass('selected');
|
|
}
|
|
}
|
|
|
|
// Focus on the input box
|
|
searchEl.selectRange(0, searchEl.val().length);
|
|
|
|
modalEl.find('.icon-container').on('click', 'i', function () {
|
|
searchEl.val(cleanFAClass($(this).attr('class')).replace('fa-', ''));
|
|
changeSelection($(this));
|
|
});
|
|
const debouncedSearch = utils.debounce(async () => {
|
|
// Search
|
|
let iconData;
|
|
if (lastSearch.length) {
|
|
iconData = await iconSelect.findIcons(lastSearch);
|
|
} else {
|
|
iconData = initialIcons;
|
|
}
|
|
icons.remove();
|
|
iconData.forEach((iconData) => {
|
|
iconContainer.append($(`<i class="fa fa-xl fa-${iconData.style} fa-${iconData.id}" data-label="${iconData.label}"></i>`));
|
|
});
|
|
icons = modalEl.find('.nbb-fa-icons i');
|
|
changeSelection();
|
|
}, 200);
|
|
searchEl.on('keyup', function (e) {
|
|
if (e.code !== 'Enter' && searchEl.val() !== lastSearch) {
|
|
lastSearch = searchEl.val();
|
|
debouncedSearch();
|
|
} else if (e.code === 'Enter') {
|
|
submitEl.trigger('click');
|
|
}
|
|
});
|
|
});
|
|
});
|
|
};
|
|
|
|
// turns "fa fa-2x fa-solid fa-heart" into "fa-heart"
|
|
function cleanFAClass(className) {
|
|
className = className.replace(/fa-(solid|regular|brands|light|thin|duotone|nodebb) /, '');
|
|
const filterNames = ['fa-2x', 'fa-xl', 'fa', 'fa-'];
|
|
return className.split(' ')
|
|
.filter(c => !filterNames.includes(c))
|
|
.filter(c => c && c.startsWith('fa-')).join('');
|
|
}
|
|
|
|
iconSelect.findIcons = async function (searchString) {
|
|
const request = await fetch('https://api.fontawesome.com', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({
|
|
query: `query {
|
|
search(version: "6.2.0", query: "${searchString}", first: 200) {
|
|
id,
|
|
label,
|
|
familyStylesByLicense {
|
|
free {
|
|
style
|
|
}
|
|
}
|
|
}
|
|
}`,
|
|
}),
|
|
});
|
|
const response = await request.json();
|
|
const icons = response.data.search.filter(icon => icon.familyStylesByLicense.free.length > 0).flatMap((icon) => {
|
|
const result = [];
|
|
icon.familyStylesByLicense.free.forEach((style) => {
|
|
result.push({
|
|
id: icon.id,
|
|
label: `${icon.label} (${style.style})`,
|
|
style: style.style,
|
|
});
|
|
});
|
|
return result;
|
|
});
|
|
return icons;
|
|
};
|
|
|
|
return iconSelect;
|
|
});
|