- <!DOCTYPE html>
- <html class="zg-html">
-
- <head>
- <meta charset="utf-8">
- <title>ZingGrid: Emojis</title>
- <script nonce="undefined" src="https://cdn.jsdelivr.net/npm/emoji-mart@latest/dist/browser.js"></script>
- <!-- Will not work until Emoji Column has been added to ZingGrid -->
- <script nonce="undefined" src="https://cdn.zinggrid.com/zinggrid.min.js"></script>
- <style>
- .zg-body {
- background: #e6e6e6;
- }
-
- zing-grid[loading] {
- height: nullpx;
- }
- </style>
- </head>
-
- <body class="zg-body">
- <zing-grid editor-controls layout-controls spellcheck="false" data='[
- { "name": "Camdyn", "title": "DevRel", "icon": "🤠" }
- ]'>
- <zg-colgroup>
- <zg-column index="name"></zg-column>
- <zg-column index="title"></zg-column>
- <zg-column index="icon" type="emoji" editor="emojiPicker"></zg-column>
- <!-- type-emoji-shortcode="shortcodeConverter" -->
- </zg-colgroup>
- </zing-grid>
- <script>
- ZingGrid.setLicense(['26ccbfec16b8be9ee98c7d57bee6e498']); // References
- let picker = null;
- let oDOMInput = null;
- let zgRef = document.querySelector('zing-grid');
- const pickerOptions = {
- onEmojiSelect: handleChange
- };
-
- function handleChange(data) {
- // Set editor value to picker value
- let beforeInsert = oDOMInput.value.slice(0, oDOMInput.selectionStart);
- let afterInsert = oDOMInput.value.slice(oDOMInput.selectionEnd);
- oDOMInput.value = `${beforeInsert}${data.native}${afterInsert}`;
- }
- // Custom emoji picker
- let editor = {
- init($cell, editorField) {
- // Create ZGEditorRow input field
- oDOMInput = document.createElement('input');
- oDOMInput.type = 'text';
- oDOMInput.autoComplete = 'off';
- oDOMInput.ariaInvalid = false;
- editorField.appendChild(oDOMInput);
- // Unable to get position of `editorField` w/o setTimeout
- setTimeout(() => {
- // Different styles applied depending on editor type
- const editorType = zgRef.editor;
- let styles = null;
- if (editorType === 'inline') {
- // Determine position of inline field and place under
- const editorBCR = editorField.getBoundingClientRect();
- styles = `position: fixed; z-index: 999; top:${editorBCR.top + 47}px; left:${editorBCR.left}px;`;
- } else {
- // Placed under model field
- styles = `position: relative;`;
- }
- // Picker must be newly created every time else does not display all options after first edit
- picker = new EmojiMart.Picker(pickerOptions);
- // Styled to position under cell and make it placed outside and in front of grid
- picker.setAttribute('style', styles);
- // Placed in `editorField`, else navigating through picker submits editing changes
- editorField.appendChild(picker);
- }, 0);
- },
- onOpen($cell, editorField, mData) {
- if (!mData) {
- mData = editorField.value || '';
- }
- oDOMInput.value = String(mData);
- },
- onClose(editorField) {
- // Destroy picker
- editorField.removeChild(picker);
- delete picker;
- // Update editor value
- return editorField.querySelector('input').value;
- },
- };
- ZingGrid.registerEditor(editor, 'emojiPicker');
- </script>
- </body>
-
- </html>
- <!DOCTYPE html>
- <html class="zg-html">
-
- <head>
- <meta charset="utf-8">
- <title>ZingGrid: Emojis</title>
- <script src="https://cdn.jsdelivr.net/npm/emoji-mart@latest/dist/browser.js"></script>
- <!-- Will not work until Emoji Column has been added to ZingGrid -->
- <script src="https://cdn.zinggrid.com/zinggrid.min.js"></script>
- </head>
-
- <body class="zg-body">
- <zing-grid editor-controls layout-controls spellcheck="false" data='[
- { "name": "Camdyn", "title": "DevRel", "icon": "🤠" }
- ]'>
- <zg-colgroup>
- <zg-column index="name"></zg-column>
- <zg-column index="title"></zg-column>
- <zg-column index="icon" type="emoji" editor="emojiPicker"></zg-column>
- <!-- type-emoji-shortcode="shortcodeConverter" -->
- </zg-colgroup>
- </zing-grid>
- </body>
-
- </html>
- .zg-body {
- background: #e6e6e6;
- }
- // References
- let picker = null;
- let oDOMInput = null;
- let zgRef = document.querySelector('zing-grid');
- const pickerOptions = {
- onEmojiSelect: handleChange
- };
-
- function handleChange(data) {
- // Set editor value to picker value
- let beforeInsert = oDOMInput.value.slice(0, oDOMInput.selectionStart);
- let afterInsert = oDOMInput.value.slice(oDOMInput.selectionEnd);
- oDOMInput.value = `${beforeInsert}${data.native}${afterInsert}`;
- }
- // Custom emoji picker
- let editor = {
- init($cell, editorField) {
- // Create ZGEditorRow input field
- oDOMInput = document.createElement('input');
- oDOMInput.type = 'text';
- oDOMInput.autoComplete = 'off';
- oDOMInput.ariaInvalid = false;
- editorField.appendChild(oDOMInput);
- // Unable to get position of `editorField` w/o setTimeout
- setTimeout(() => {
- // Different styles applied depending on editor type
- const editorType = zgRef.editor;
- let styles = null;
- if (editorType === 'inline') {
- // Determine position of inline field and place under
- const editorBCR = editorField.getBoundingClientRect();
- styles = `position: fixed; z-index: 999; top:${editorBCR.top + 47}px; left:${editorBCR.left}px;`;
- } else {
- // Placed under model field
- styles = `position: relative;`;
- }
- // Picker must be newly created every time else does not display all options after first edit
- picker = new EmojiMart.Picker(pickerOptions);
- // Styled to position under cell and make it placed outside and in front of grid
- picker.setAttribute('style', styles);
- // Placed in `editorField`, else navigating through picker submits editing changes
- editorField.appendChild(picker);
- }, 0);
- },
- onOpen($cell, editorField, mData) {
- if (!mData) {
- mData = editorField.value || '';
- }
- oDOMInput.value = String(mData);
- },
- onClose(editorField) {
- // Destroy picker
- editorField.removeChild(picker);
- delete picker;
- // Update editor value
- return editorField.querySelector('input').value;
- },
- };
- ZingGrid.registerEditor(editor, 'emojiPicker');