123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- const panelsConfig = {
- stylePrefix: 'pn-',
- defaults: [
- {
- id: 'commands',
- buttons: [{}],
- },
- {
- id: 'options',
- buttons: [
- {
- active: false,
- id: 'sw-visibility',
- className: 'fa fa-square-o',
- command: 'core:component-outline',
- context: 'sw-visibility',
- attributes: { title: 'View components' },
- },
- {
- id: 'preview',
- className: 'fa fa-eye',
- command: 'preview',
- context: 'preview',
- attributes: { title: 'Preview' },
- },
- {
- id: 'fullscreen',
- className: 'fa fa-arrows-alt',
- command: 'fullscreen',
- context: 'fullscreen',
- attributes: { title: 'Fullscreen' },
- },
-
-
-
-
-
-
- ],
- },
- {
- id: 'views',
- buttons: [
-
-
-
-
-
-
-
-
- {
- id: 'open-tm',
- className: 'fa fa-cog',
- command: 'open-tm',
- active: true,
- togglable: true,
- attributes: { title: 'Settings' },
- },
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ],
- },
- ],
- };
- const myNewComponentTypes = (editor) => {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- editor.Components.addType('img', {
- isComponent: (el) => el.tagName === 'IMG',
- model: {
- defaults: {
- traits: [
- {
- type: 'text',
- name: 'title',
- label: 'title',
- },
- {
- type: 'text',
- name: 'width',
- label: 'width',
- },
- {
- type: 'text',
- name: 'height',
- label: 'height',
- },
- ],
- },
- },
- });
- };
- const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
- const editor = grapesjs.init({
- container: '#gjs',
- fromElement: true,
- height: '100%',
- width: '100%',
- storageManager: false,
- panels: panelsConfig,
- plugins: [myNewComponentTypes],
- assetManager: {
- upload: '/dist/visual-editor/upload',
- uploadName: '_file_',
- multiUpload:false,
- headers: {
- 'X-CSRF-TOKEN': csrfToken,
- },
- },
- });
- const am = editor.AssetManager;
- editor.getWrapper().set({ locked: true });
- const edit_classes = ['mtb_edit'];
- editor.getComponents().each(component => {
- component.onAll(component => {
-
- let html = component.toHTML();
- const classes = component.getClasses();
-
- const hasIntersection = classes.some(item => {
-
- if (Array.isArray(item)) {
- return item.some(subItem => edit_classes.includes(subItem));
- }
-
- return edit_classes.includes(item);
- });
-
- if (hasIntersection || component.get('attributes').mtb_edit == 'true') {
- component.set({ locked: false });
- setBorder(component);
- }
- if (component.get('attributes').mtb_edit == 'false') {
- component.set({ locked: true });
- }
- if (component.get('attributes').mtb_edit_this == 'true') {
- component.set({ locked: false });
- setBorder(component);
-
- component.forEachChild(child => {
- child.set({ locked: true });
- })
- }
- if (component.get('attributes').mtb_edit_this == 'false') {
- component.set({ locked: true });
- }
- })
- });
- function setBorder(component) {
- if (component.attributes.tagName == 'a') {
- component.setStyle({
- border: '3px dotted #f08300'
- });
- } else {
- component.setStyle({
- border: '1px dotted #3b97e3'
- });
- }
- }
- editor.on('component:selected', (comp) => {
-
- const selectedComponent = editor.getSelected();
- const defaultToolbar = selectedComponent.get('toolbar');
- selectedComponent.set({
-
- toolbar: [ ]
- });
-
-
-
-
-
-
-
-
- if (selectedComponent.attributes.tagName == 'img') {
-
- const el = selectedComponent.getEl();
-
- el.addEventListener('dblclick', () => {
- am.open({
- types: ['image'],
-
- select(asset, complete) {
- const selected = editor.getSelected();
- if (selected) {
- selected.addAttributes({ src: asset.getSrc() });
-
-
- complete && am.close();
- }
- },
- });
- });
- }
-
- });
- var open_tm_show = true;
- var cogIcons = document.querySelectorAll('.fa-cog');
- cogIcons.forEach(function(icon) {
- icon.addEventListener('click', function() {
-
- if (open_tm_show) {
- open_tm_show = false;
- } else {
- open_tm_show = true;
- }
- leftPanelDisplay(open_tm_show);
- });
- });
- function leftPanelDisplay(isShow = true) {
- if (isShow) {
-
-
- let elements1 = document.querySelectorAll('.gjs-pn-views-container');
- elements1.forEach(function(element) {
- element.style.display = 'block';
- });
- let elements2 = document.querySelectorAll('.gjs-pn-views');
- elements2.forEach(function(element) {
- element.style = 'border_bottom: 2px solid var(--gjs-main-dark-color)';
- });
- } else {
-
-
- let elements1 = document.querySelectorAll('.gjs-pn-views-container');
- elements1.forEach(function(element) {
- element.style.display = 'none';
- });
- let elements2 = document.querySelectorAll('.gjs-pn-views');
- elements2.forEach(function(element) {
- element.style = 'border:none';
- });
- }
- }
- editor.on('load', () => {
-
-
- const targetElement = document.querySelector('.fa-arrows-alt');
-
- const dropdown = document.createElement('select');
- dropdown.className = 'custom-select';
- dropdown.id = 'dropdown';
-
- var options = '';
- siteMenu.forEach(function (item) {
- if (mid == item.id) {
- options += `<option value="${item.id}" uri="${item.url}" selected>${item.title}</option>`;
- } else {
- options += `<option value="${item.id}" uri="${item.url}">${item.title}</option>`;
- }
- });
-
- dropdown.innerHTML = options;
-
- targetElement.insertAdjacentElement('afterend', dropdown);
- dropdownel = document.getElementById('dropdown');
-
- dropdownel.addEventListener('change', function () {
-
- var selectedOption = dropdownel.options[dropdownel.selectedIndex];
-
- var id = selectedOption.value;
- var uri = selectedOption.getAttribute('uri');
- if (id > 0) {
-
- var redirectUrl = `?mid=${id}&uri=${encodeURIComponent(uri)}`;
-
- window.location.href = redirectUrl;
- }
- });
-
- customSelect = document.querySelector('.custom-select');
-
- const sendButton = document.createElement('button');
- sendButton.textContent = 'publish';
- sendButton.classList.add('send-button');
- sendButton.classList.add('layui-btn');
- sendButton.classList.add('layui-btn-radius');
- sendButton.classList.add('layui-btn-radius');
- sendButton.style = 'margin-left:10px;height:25px;line-height:25px;padding:0 10px;vertical-align:unset;';
- customSelect.insertAdjacentElement('afterend', sendButton);
- });
- editor.on('update', () => {
- const html = editor.getHtml();
-
-
- $.ajax({
- url: '/dist/visual-editor/preview-save',
- type: 'POST',
- headers: {
- 'X-CSRF-TOKEN': csrfToken,
- },
- data: {
- html: html
- },
- success: function (res) {
- if (res.status != 1) {
- alert('save error');
- }
- },
- error: function (err) {
- alert(err);
- }
- });
- });
- var layer = layui.layer;
- var loadIndex = null;
- editor.on('asset:upload:start', () => {
- loadIndex = layer.load(0, {shade: [0.5, '#000']});
- });
- editor.on('asset:upload:end', () => {
- layer.close(loadIndex);
- });
|