editor-image.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. let vueImage = new Vue({
  2. el: '#modal-editor-image',
  3. data: {
  4. isLoading: false,
  5. isLoadingText: '',
  6. newFolderName: '',
  7. newFolderShow: false,
  8. newFolderError: false,
  9. fetchFromUrlURL: '',
  10. fetchFromUrlShow: false,
  11. folders: [],
  12. currentFolder: '',
  13. currentImage: '',
  14. currentAlign: 'left',
  15. images: []
  16. },
  17. methods: {
  18. open: () => {
  19. mdeModalOpenState = true;
  20. $('#modal-editor-image').slideDown();
  21. vueImage.refreshFolders();
  22. },
  23. cancel: (ev) => {
  24. mdeModalOpenState = false;
  25. $('#modal-editor-image').slideUp();
  26. },
  27. insertImage: (ev) => {
  28. if(mde.codemirror.doc.somethingSelected()) {
  29. mde.codemirror.execCommand('singleSelection');
  30. }
  31. let selImage = _.find(vueImage.images, ['uid', vueImage.currentImage]);
  32. selImage.normalizedPath = (selImage.folder === '') ? selImage.filename : selImage.folder + '/' + selImage.filename;
  33. selImage.titleGuess = _.startCase(selImage.basename);
  34. let imageText = '![' + selImage.titleGuess + '](/uploads/' + selImage.normalizedPath + ' "' + selImage.titleGuess + '")';
  35. switch(vueImage.currentAlign) {
  36. case 'center':
  37. imageText += '{.align-center}';
  38. break;
  39. case 'right':
  40. imageText += '{.align-right}';
  41. break;
  42. case 'logo':
  43. imageText += '{.pagelogo}';
  44. break;
  45. }
  46. mde.codemirror.doc.replaceSelection(imageText);
  47. vueImage.cancel();
  48. },
  49. newFolder: (ev) => {
  50. vueImage.newFolderName = '';
  51. vueImage.newFolderError = false;
  52. vueImage.newFolderShow = true;
  53. _.delay(() => { $('#txt-editor-newfoldername').focus(); }, 400);
  54. },
  55. newFolderDiscard: (ev) => {
  56. vueImage.newFolderShow = false;
  57. },
  58. newFolderCreate: (ev) => {
  59. let regFolderName = new RegExp("^[a-z0-9][a-z0-9\-]*[a-z0-9]$");
  60. vueImage.newFolderName = _.kebabCase(_.trim(vueImage.newFolderName));
  61. if(_.isEmpty(vueImage.newFolderName) || !regFolderName.test(vueImage.newFolderName)) {
  62. vueImage.newFolderError = true;
  63. return;
  64. }
  65. vueImage.newFolderDiscard();
  66. vueImage.isLoading = true;
  67. vueImage.isLoadingText = 'Creating new folder...';
  68. Vue.nextTick(() => {
  69. socket.emit('uploadsCreateFolder', { foldername: vueImage.newFolderName }, (data) => {
  70. vueImage.folders = data;
  71. vueImage.currentFolder = vueImage.newFolderName;
  72. vueImage.images = [];
  73. vueImage.isLoading = false;
  74. });
  75. });
  76. },
  77. fetchFromUrl: (ev) => {
  78. vueImage.fetchFromUrlShow = true;
  79. },
  80. fetchFromUrlDiscard: (ev) => {
  81. vueImage.fetchFromUrlShow = false;
  82. },
  83. selectFolder: (fldName) => {
  84. vueImage.currentFolder = fldName;
  85. vueImage.loadImages();
  86. },
  87. refreshFolders: () => {
  88. vueImage.isLoading = true;
  89. vueImage.isLoadingText = 'Fetching folders list...';
  90. vueImage.currentFolder = '';
  91. vueImage.currentImage = '';
  92. Vue.nextTick(() => {
  93. socket.emit('uploadsGetFolders', { }, (data) => {
  94. vueImage.folders = data;
  95. vueImage.loadImages();
  96. });
  97. });
  98. },
  99. loadImages: () => {
  100. vueImage.isLoading = true;
  101. vueImage.isLoadingText = 'Fetching images...';
  102. Vue.nextTick(() => {
  103. socket.emit('uploadsGetImages', { folder: vueImage.currentFolder }, (data) => {
  104. vueImage.images = data;
  105. vueImage.isLoading = false;
  106. });
  107. });
  108. },
  109. selectImage: (imageId) => {
  110. vueImage.currentImage = imageId;
  111. },
  112. selectAlignment: (align) => {
  113. vueImage.currentAlign = align;
  114. }
  115. }
  116. });