@concretecms/bedrock 1.3.7 → 1.4.0

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.
Files changed (105) hide show
  1. package/.eslintrc.yml +2 -0
  2. package/assets/account/js/frontend/components/AvatarCropper.vue +159 -0
  3. package/assets/account/js/frontend.js +1 -1
  4. package/assets/account/scss/frontend/_frontend.scss +2 -0
  5. package/assets/account/scss/frontend/avatar/_avatar-cropper.scss +82 -0
  6. package/assets/account/scss/frontend/avatar/_avatar.scss +6 -0
  7. package/assets/bedrock/scss/_frontend.scss +0 -1
  8. package/assets/calendar/js/backend/duration.js +13 -13
  9. package/assets/calendar/js/vendor/fullcalendar.js +1 -0
  10. package/assets/cms/components/Announcement/Action/ExternalLinkAction.vue +25 -0
  11. package/assets/cms/components/Announcement/Action/GuideAction.vue +36 -0
  12. package/assets/cms/components/Announcement/Action/VideoAction.vue +31 -0
  13. package/assets/cms/components/Announcement/Broadcast.vue +63 -0
  14. package/assets/cms/components/Announcement/Button/ExternalLinkButton.vue +26 -0
  15. package/assets/cms/components/Announcement/Header/Header.vue +33 -0
  16. package/assets/cms/components/Announcement/Item/Item.vue +50 -0
  17. package/assets/cms/components/Announcement/Modal/Modal.vue +77 -0
  18. package/assets/cms/components/Announcement/Slide/CollectSiteInformationSlide.vue +61 -0
  19. package/assets/cms/components/Announcement/Slide/FeatureSlide.vue +81 -0
  20. package/assets/cms/components/Announcement/Slide/WelcomeSlide.vue +87 -0
  21. package/assets/cms/components/Help/Modal.vue +48 -0
  22. package/assets/cms/components/Image/ThumbnailEditor.vue +117 -0
  23. package/assets/cms/components/RunningProcessList.vue +6 -1
  24. package/assets/cms/components/customizer/FontFamilyPageCustomizerWidget.vue +27 -7
  25. package/assets/cms/components/file-manager/Chooser/FileManager.vue +0 -1
  26. package/assets/cms/components/file-manager/Chooser/FolderBookmark.vue +0 -1
  27. package/assets/cms/components/file-manager/Chooser.vue +1 -1
  28. package/assets/cms/components/form/ConcreteAjaxSelect.vue +173 -0
  29. package/assets/cms/components/form/ConcreteExpressEntrySelect.vue +74 -0
  30. package/assets/cms/components/form/ConcreteFileDirectoryInput.vue +28 -26
  31. package/assets/cms/components/form/ConcreteFileInput.vue +17 -5
  32. package/assets/cms/components/form/ConcreteGroupInput.vue +134 -0
  33. package/assets/cms/components/form/ConcreteLocaleSelect.vue +58 -0
  34. package/assets/cms/components/form/ConcreteOptionSelect.vue +92 -0
  35. package/assets/cms/components/form/ConcretePageSelect.vue +67 -0
  36. package/assets/cms/components/form/ConcreteSelect.vue +75 -0
  37. package/assets/cms/components/form/ConcreteThemeColorInput.vue +19 -14
  38. package/assets/cms/components/form/ConcreteUserInput.vue +24 -4
  39. package/assets/cms/components/form/ConcreteUserSelect.vue +126 -0
  40. package/assets/cms/components/form/IconSelector.vue +14 -5
  41. package/assets/cms/components/form/PasswordInput.vue +141 -24
  42. package/assets/cms/components/groups/Chooser.vue +6 -5
  43. package/assets/cms/components/index.js +24 -0
  44. package/assets/cms/components/toolbar/ConcreteToolbarSiteList.vue +62 -0
  45. package/assets/cms/components/user/Chooser/Search.vue +5 -0
  46. package/assets/cms/components/user/Chooser/Users.vue +6 -2
  47. package/assets/cms/components/user/Chooser.vue +9 -3
  48. package/assets/cms/js/ajax-request/base.js +13 -4
  49. package/assets/cms/js/alert.js +2 -1
  50. package/assets/cms/js/base.js +3 -10
  51. package/assets/cms/js/edit-mode/area.js +0 -35
  52. package/assets/cms/js/edit-mode/block.js +27 -0
  53. package/assets/cms/js/edit-mode/containerblock.js +33 -3
  54. package/assets/cms/js/edit-mode/editmode.js +12 -0
  55. package/assets/cms/js/edit-mode/layout.js +56 -0
  56. package/assets/cms/js/edit-mode/style-customizer/style-customizer.js +0 -1
  57. package/assets/cms/js/file-manager/uploader.js +30 -206
  58. package/assets/cms/js/help/help.js +11 -8
  59. package/assets/cms/js/in-context-menu.js +5 -0
  60. package/assets/cms/js/jquery-vue.js +22 -0
  61. package/assets/cms/js/legacy-dialog.js +74 -65
  62. package/assets/cms/js/modal.js +73 -0
  63. package/assets/cms/js/panels.js +8 -0
  64. package/assets/cms/js/search/base.js +0 -18
  65. package/assets/cms/js/search/field-selector.js +6 -14
  66. package/assets/cms/js/select-combo-box.js +2 -0
  67. package/assets/cms/js/sitemap/sitemap-selector.js +2 -2
  68. package/assets/cms/js/sitemap/sitemap.js +15 -20
  69. package/assets/cms/js/toolbar.js +25 -2
  70. package/assets/cms/js/tree.js +7 -7
  71. package/assets/cms/js/users/group-manager.js +55 -0
  72. package/assets/cms/js/users/user-manager.js +2 -1
  73. package/assets/cms/js/users.js +1 -0
  74. package/assets/cms/js/vue/Manager.js +6 -3
  75. package/assets/cms/scss/_base.scss +2 -8
  76. package/assets/cms/scss/_cards.scss +7 -0
  77. package/assets/cms/scss/_file-manager.scss +1 -0
  78. package/assets/cms/scss/_file-uploader.scss +13 -3
  79. package/assets/cms/scss/_help.scss +11 -2
  80. package/assets/cms/scss/_item-selector.scss +10 -0
  81. package/assets/cms/scss/_layouts.scss +16 -0
  82. package/assets/cms/scss/_page-areas.scss +517 -245
  83. package/assets/cms/scss/_popover.scss +5 -0
  84. package/assets/cms/scss/_select-combo-box.scss +18 -0
  85. package/assets/cms/scss/_toolbar.scss +5 -14
  86. package/assets/cms/scss/_transitions.scss +13 -0
  87. package/assets/cms/scss/_variables.scss +18 -7
  88. package/assets/cms/scss/bootstrap/_reboot-tags.scss +17 -32
  89. package/assets/cms/scss/bootstrap/_reboot.scss +17 -7
  90. package/assets/cms/scss/bootstrap/_root-modified.scss +41 -20
  91. package/assets/cms/scss/file-manager/_thumbnail-image-editor.scss +45 -0
  92. package/assets/cms/scss/panels/_help.scss +0 -10
  93. package/assets/staging/scss/frontend/_frontend.scss +12 -0
  94. package/assets/staging/scss/frontend.scss +4 -0
  95. package/package.json +9 -9
  96. package/assets/account/js/frontend/components/Avatar/Avatar.js +0 -270
  97. package/assets/account/js/frontend/components/Avatar/Avatar.scss +0 -17
  98. package/assets/account/js/frontend/components/Avatar/Avatar.vue +0 -18
  99. package/assets/account/js/frontend/components/Avatar/Cropper.js +0 -202
  100. package/assets/account/js/frontend/components/Avatar/Cropper.scss +0 -136
  101. package/assets/account/js/frontend/components/Avatar/Cropper.vue +0 -40
  102. package/assets/bedrock/scss/_theme-grid.scss +0 -7
  103. package/assets/cms/js/edit-mode/style-customizer/inline-toolbar.js +0 -279
  104. package/assets/cms/js/modifiable-ajax-bootstrap-select.js +0 -78
  105. package/assets/cms/js/modifiable-bootstrap-select.js +0 -112
@@ -1,5 +1,6 @@
1
1
  /* global ccmi18n_fileuploader, CCM_SECURITY_TOKEN, NProgress, ConcreteEvent */
2
2
  /* eslint indent: [2, 4, {"SwitchCase": 1}] */
3
+ /* eslint-disable no-new */
3
4
 
4
5
  (function ($) {
5
6
  $.fn.concreteFileUploader = function (options) {
@@ -384,73 +385,32 @@
384
385
 
385
386
  $column.append($tabContent)
386
387
 
387
- /*
388
- * Add folder selector
389
- */
390
-
391
- const $selectDirectoryContainer = $('<div/>')
392
- .addClass('ccm-directory-selector-container')
393
-
394
- const $selectDirectoryFormGroup = $('<div/>')
395
- .addClass('form-group')
396
-
397
- const selectDirectoryId = 'input-' + fileUploader.getUniqueId()
398
-
399
- // noinspection JSUnresolvedVariable
400
- const $selectDirectoryLabel = $('<label/>')
401
- .addClass('form-label')
402
- .attr('for', selectDirectoryId)
403
- .html(ccmi18n_fileuploader.uploadFilesTo)
404
-
405
- const $selectDirectoryInputGroup = $('<div/>')
406
- .addClass('input-group')
407
-
408
- const $select = $('<select/>')
409
- .addClass('ccm-directory-selector')
410
- .attr('data-size', 5)
411
- .attr('data-live-search', 'true')
412
- .attr('id', selectDirectoryId)
413
-
414
- // noinspection JSUnresolvedVariable
415
- const $a = $('<a/>')
416
- .attr('href', 'javascript:void(0);')
417
- .addClass('btn btn-outline-secondary ccm-file-uploader-create-new-directory-button')
418
- .html(ccmi18n_fileuploader.createNewDirectoryButton)
419
-
420
- $selectDirectoryInputGroup.append($select)
421
- $selectDirectoryInputGroup.append($a)
422
- $selectDirectoryFormGroup.append($selectDirectoryLabel)
423
- $selectDirectoryFormGroup.append($selectDirectoryInputGroup)
424
-
425
- $selectDirectoryContainer.append($selectDirectoryFormGroup)
426
- $column.append($selectDirectoryContainer)
427
-
428
- const $div = $('<div/>')
429
- .addClass('ccm-file-uploader-new-directory-name-container')
430
- .addClass('hidden-container')
431
-
432
- const $formGroup = $('<div/>')
433
- .addClass('form-group')
434
-
435
- const inputId = 'input-' + fileUploader.getUniqueId()
436
-
437
- const $label = $('<label/>')
438
- .addClass('form-label')
439
- .attr('for', inputId)
440
- .html(ccmi18n_fileuploader.directoryName)
441
-
442
- // noinspection JSUnresolvedVariable
443
- const $input = $('<input/>')
444
- .attr('type', 'text')
445
- .attr('placeholder', ccmi18n_fileuploader.directoryPlaceholder)
446
- .attr('id', inputId)
447
- .addClass('ccm-file-uploader-new-directory-name')
448
- .addClass('form-control')
388
+ let directoryId = 0
389
+ if (fileUploader.isFunction(fileUploader.options.folderID)) {
390
+ directoryId = parseInt(fileUploader.options.folderID())
391
+ }
449
392
 
450
- $formGroup.append($label)
451
- $formGroup.append($input)
452
- $div.append($formGroup)
453
- $column.append($div)
393
+ const $directoryContainer = $('<div/>')
394
+ .attr('style', 'min-height: 200px')
395
+ $directoryContainer.html('<concrete-file-directory-input input-label="Upload files to" :directory-id="' + directoryId + '" input-name="uploadDirectoryId" :show-add-directory-button="true" @change="currentFolder = $event"></concrete-file-directory-input>')
396
+
397
+ $('<input />').attr('type', 'hidden').attr('name', 'fileUploaderDirectoryId').appendTo($directoryContainer)
398
+ $column.append($directoryContainer)
399
+
400
+ Concrete.Vue.activateContext('cms', function (Vue, config) {
401
+ new Vue({
402
+ el: $directoryContainer.get(0),
403
+ components: config.components,
404
+ data: {
405
+ currentFolder: 0
406
+ },
407
+ watch: {
408
+ currentFolder() {
409
+ $('input[name=fileUploaderDirectoryId]').val(this.currentFolder)
410
+ }
411
+ }
412
+ })
413
+ })
454
414
 
455
415
  $row.append($column)
456
416
 
@@ -588,9 +548,6 @@
588
548
 
589
549
  fileUploader.refresh()
590
550
 
591
- $dialogEl.find('.ccm-directory-selector').removeAttr('disabled').selectpicker('refresh')
592
- $dialogEl.find('.ccm-file-uploader-create-new-directory-button').removeClass('disabled')
593
-
594
551
  let error = ''
595
552
 
596
553
  for (error of errors) {
@@ -627,7 +584,7 @@
627
584
  ccm_token: CCM_SECURITY_TOKEN,
628
585
  send_file: fileIds,
629
586
  removeFilesAfterPost: removeFilesAfterPost,
630
- currentFolder: $dialogEl.find('select.ccm-directory-selector').find('option:selected').val()
587
+ currentFolder: $('input[name=fileUploaderDirectoryId]').val()
631
588
  }, fileUploader.options.formData),
632
589
  dataType: 'json',
633
590
  success: function (data) {
@@ -654,7 +611,7 @@
654
611
  data: $.extend({
655
612
  ccm_token: CCM_SECURITY_TOKEN,
656
613
  url_upload: $dialogEl.find('.ccm-remote-file-url:not(.d-none)').val(),
657
- currentFolder: $dialogEl.find('select.ccm-directory-selector').find('option:selected').val()
614
+ currentFolder: $('input[name=fileUploaderDirectoryId]').val()
658
615
  }, fileUploader.options.formData),
659
616
  dataType: 'json',
660
617
  success: function (data) {
@@ -715,98 +672,6 @@
715
672
  $dialogEl.append(fileUploader.templates.getDialog())
716
673
  },
717
674
 
718
- createDirectory: function (directoryName) {
719
- $.ajax({
720
- url: CCM_DISPATCHER_FILENAME + '/ccm/system/file/create_directory' + '?_=' + new Date().getTime(),
721
- method: 'POST',
722
- data: {
723
- ccm_token: CCM_SECURITY_TOKEN,
724
- directoryName: directoryName,
725
- currentFolder: $dialogEl.find('select.ccm-directory-selector').find('option:selected').val()
726
- },
727
- dataType: 'json',
728
- success: function (data) {
729
- if (!data.error) {
730
- // re-fetch the directories and select the new folder
731
- // noinspection JSUnresolvedVariable
732
- fileUploader.fetchDirectories(data.directoryId, function () {
733
- fileUploader.upload()
734
- })
735
- } else {
736
- fileUploader.raiseError(data.errors)
737
- }
738
- }
739
- })
740
- },
741
-
742
- fetchDirectories: function (selectedDirectoryId, clb) {
743
- $.ajax({
744
- url: CCM_DISPATCHER_FILENAME + '/ccm/system/file/fetch_directories' + '?_=' + new Date().getTime(),
745
- method: 'POST',
746
- data: {
747
- ccm_token: CCM_SECURITY_TOKEN
748
- },
749
- dataType: 'json',
750
- success: function (data) {
751
- if (!data.error) {
752
- const $selectBox = $dialogEl.find('select.ccm-directory-selector')
753
-
754
- if (typeof selectedDirectoryId === 'undefined' || selectedDirectoryId === null) {
755
- selectedDirectoryId = $selectBox.find('option:selected').val()
756
- }
757
-
758
- $selectBox.empty()
759
-
760
- let directory = ''
761
-
762
- for (directory of data.directories) {
763
- const $option = $('<option/>')
764
-
765
- // noinspection JSUnresolvedVariable
766
- $option
767
- .attr('data-icon', 'fas fa-folder')
768
- .addClass('level-' + directory.directoryLevel)
769
- .attr('value', directory.directoryId)
770
- .html(directory.directoryName)
771
-
772
- $selectBox.append($option)
773
- }
774
-
775
- // refresh options
776
- $selectBox.selectpicker('refresh')
777
-
778
- if ($selectBox.find('option[value=\'' + selectedDirectoryId + '\']').length) {
779
- // re-selected previous selected option
780
- $selectBox.selectpicker('val', '' + selectedDirectoryId)
781
- } else {
782
- // the option is not available, select first options instead
783
- const firstDirectoryId = $selectBox.find('option:first').val()
784
-
785
- $selectBox.selectpicker('val', '' + firstDirectoryId)
786
- }
787
-
788
- $dialogEl.find('.ccm-file-uploader-new-directory-name').val('')
789
-
790
- if (!$dialogEl.find('.ccm-file-uploader-new-directory-name-container').hasClass('hidden-container')) {
791
- $dialogEl.find('.ccm-file-uploader-create-new-directory-button').trigger('click')
792
- }
793
-
794
- if (typeof clb === 'function') {
795
- clb()
796
- }
797
- } else {
798
- fileUploader.raiseError(data.errors)
799
- }
800
- }
801
- })
802
- },
803
-
804
- initDirectorySelector: function () {
805
- $dialogEl.find('select.ccm-directory-selector')
806
- .selectpicker()
807
- .addClass('form-control')
808
- },
809
-
810
675
  fetchFilesFromIncomingDirectory: function () {
811
676
  $.ajax({
812
677
  url: CCM_DISPATCHER_FILENAME + '/ccm/system/file/fetch_incoming_files' + '?_=' + new Date().getTime(),
@@ -941,11 +806,6 @@
941
806
 
942
807
  break
943
808
  }
944
-
945
- if (!$dialogEl.find('.ccm-file-uploader-new-directory-name-container').hasClass('hidden-container') &&
946
- $dialogEl.find('.ccm-file-uploader-new-directory-name').val().length === 0) {
947
- $dialogEl.closest('.ui-dialog').find('.ccm-file-uploader-submit-button').attr('disabled', 'disabled')
948
- }
949
809
  },
950
810
 
951
811
  reset: function () {
@@ -1020,11 +880,9 @@
1020
880
  },
1021
881
 
1022
882
  sending: function (file, xhr, formData) {
1023
- const $selectBox = $dialogEl.find('select.ccm-directory-selector')
1024
-
1025
883
  formData.append('responseFormat', 'dropzone')
1026
884
  formData.append('ccm_token', CCM_SECURITY_TOKEN)
1027
- formData.append('currentFolder', $selectBox.find('option:selected').val())
885
+ formData.append('currentFolder', $('input[name=fileUploaderDirectoryId]').val())
1028
886
 
1029
887
  if (typeof fileUploader.options.formData === 'object') {
1030
888
  let key = ''
@@ -1047,9 +905,6 @@
1047
905
 
1048
906
  fileUploader.dropzone.options.autoProcessQueue = false
1049
907
 
1050
- $dialogEl.find('.ccm-directory-selector').removeAttr('disabled').selectpicker('refresh')
1051
- $dialogEl.find('.ccm-file-uploader-create-new-directory-button').removeClass('disabled')
1052
-
1053
908
  if (fileUploader.uploadedFiles.length !== 0) {
1054
909
  if (typeof fileUploader.options.formData.fID === 'undefined') {
1055
910
  ConcreteEvent.publish('FileManagerAddFilesComplete', {
@@ -1091,9 +946,6 @@
1091
946
 
1092
947
  $fileElement.find('.ccm-file-upload-progress-text-value').html(parseInt(progress) + '%')
1093
948
  $fileElement.addClass('in-progress')
1094
-
1095
- $dialogEl.find('.ccm-directory-selector').attr('disabled', 'disabled').selectpicker('refresh')
1096
- $dialogEl.find('.ccm-file-uploader-create-new-directory-button').addClass('disabled')
1097
949
  }
1098
950
  }
1099
951
  if (this.options && this.options.dropzone) {
@@ -1177,7 +1029,6 @@
1177
1029
  $dialogEl.dialog({
1178
1030
  title: ccmi18n_fileuploader.dialogTitle,
1179
1031
  width: '80%',
1180
- height: '800',
1181
1032
  modal: true,
1182
1033
  autoOpen: false,
1183
1034
  buttons: [{
@@ -1189,21 +1040,7 @@
1189
1040
  text: ccmi18n_fileuploader.continueButton,
1190
1041
  click: function (e) {
1191
1042
  e.preventDefault()
1192
-
1193
- if (!$dialogEl.find('.ccm-file-uploader-new-directory-name-container').hasClass('hidden-container')) {
1194
- /*
1195
- * Create the directory before uploading.
1196
- *
1197
- * In this case the upload will be started after the directory has been created.
1198
- */
1199
-
1200
- fileUploader.createDirectory(
1201
- $dialogEl.find('.ccm-file-uploader-new-directory-name').val()
1202
- )
1203
- } else {
1204
- fileUploader.upload()
1205
- }
1206
-
1043
+ fileUploader.upload()
1207
1044
  return false
1208
1045
  }
1209
1046
  }],
@@ -1235,12 +1072,6 @@
1235
1072
 
1236
1073
  fileUploader.forceClose = false
1237
1074
 
1238
- // select the first value in directory input
1239
- const $selectBox = $dialogEl.find('select.ccm-directory-selector')
1240
-
1241
- $selectBox.val($selectBox.find('option:first').val())
1242
- $selectBox.selectpicker('refresh')
1243
-
1244
1075
  // reset everything
1245
1076
  fileUploader.reset()
1246
1077
 
@@ -1249,12 +1080,6 @@
1249
1080
  },
1250
1081
 
1251
1082
  open: function () {
1252
- if (fileUploader.isFunction(fileUploader.options.folderID)) {
1253
- fileUploader.fetchDirectories(parseInt(fileUploader.options.folderID()))
1254
- } else {
1255
- fileUploader.fetchDirectories()
1256
- }
1257
-
1258
1083
  /*
1259
1084
  * Ugly polyfill to re-initialize the bootstrap tab navigation
1260
1085
  * because within a dynamic window the tab's wont work after
@@ -1317,7 +1142,6 @@
1317
1142
 
1318
1143
  // init components
1319
1144
  fileUploader.initTabNavigation()
1320
- fileUploader.initDirectorySelector()
1321
1145
  fileUploader.initCreateNewFolderFunctionality()
1322
1146
 
1323
1147
  fileUploader.initYourComputerTab()
@@ -2,12 +2,15 @@ import 'bootstrap-tourist'
2
2
 
3
3
  import './guide-manager'
4
4
 
5
- import './guides/add-content'
6
- import './guides/add-content-edit-mode'
7
- import './guides/add-page'
8
- import './guides/change-content'
9
- import './guides/change-content-edit-mode'
10
- import './guides/dashboard'
11
- import './guides/location-panel'
12
- import './guides/personalize'
13
5
  import './guides/toolbar'
6
+
7
+ // These guides are no longer used but let's keep them in the source in case we need to repurpose them
8
+ // and/or bring them back.
9
+ // import './guides/add-content'
10
+ // import './guides/add-content-edit-mode'
11
+ // import './guides/add-page'
12
+ // import './guides/change-content'
13
+ // import './guides/change-content-edit-mode'
14
+ // import './guides/dashboard'
15
+ // import './guides/location-panel'
16
+ // import './guides/personalize'
@@ -19,6 +19,7 @@
19
19
  menuLauncherHoverParentClass: 'ccm-parent-menu-item-hover',
20
20
  enabled: true,
21
21
  enableClickProxy: true,
22
+ onShow: false,
22
23
  onHide: false
23
24
  }, options)
24
25
 
@@ -280,6 +281,10 @@
280
281
  ConcreteMenuManager.activeMenu = my
281
282
 
282
283
  ConcreteEvent.publish('ConcreteMenuShow', { menu: my, menuElement: $menu })
284
+
285
+ if (my.options.onShow) {
286
+ my.options.onShow(my)
287
+ }
283
288
  },
284
289
 
285
290
  hide: function (e) {
@@ -0,0 +1,22 @@
1
+ /* I know this is an insane library name. This is a simple plugin meant to bring our vue contexts to different
2
+ /* places */
3
+ /* eslint-disable no-new, no-unused-vars, camelcase, eqeqeq */
4
+ /* global _, ccmi18n, ccmi18n_filemanager, ConcreteProgressiveOperation, ConcreteAlert, ConcreteAssetLoader, ConcreteEvent, ConcreteMenu */
5
+ ;(function(global, $) {
6
+ 'use strict'
7
+ // jQuery Plugin
8
+ $.fn.concreteVue = function(options) {
9
+ this.each(function () {
10
+ var $element = $(this)
11
+ if (!$element.data('jquery-vue-attached')) {
12
+ Concrete.Vue.activateContext(options.context, function (Vue, config) {
13
+ new Vue({
14
+ el: $element.get(0),
15
+ components: config.components
16
+ })
17
+ })
18
+ $element.data('jquery-vue-attached', true)
19
+ }
20
+ })
21
+ }
22
+ })(global, jQuery)
@@ -302,82 +302,91 @@
302
302
  }
303
303
 
304
304
  $.fn.dialog.activateDialogContents = function($dialog) {
305
- // handle buttons
306
- $dialog.find('button[data-dialog-action=cancel]').on('click', function() {
307
- $.fn.dialog.closeTop()
308
- })
309
- $dialog.find('[data-dialog-form]').each(function() {
310
- var $form = $(this)
311
- var options = {}
312
- if ($form.attr('data-dialog-form-processing') == 'progressive') {
313
- options.progressiveOperation = true
314
- options.progressiveOperationElement = 'div[data-dialog-form-element=progress-bar]'
315
- }
316
- $form.concreteAjaxForm(options)
317
- })
318
-
319
- $dialog.find('button[data-dialog-action=submit]').on('click', function() {
320
- $dialog.find('[data-dialog-form]').submit()
321
- })
322
-
323
- fixDialogButtons($dialog)
305
+ setTimeout(function () {
306
+ // handle buttons
307
+ $dialog.find('button[data-dialog-action=cancel]').on('click', function () {
308
+ $.fn.dialog.closeTop()
309
+ })
310
+ $dialog.find('[data-dialog-form]').each(function () {
311
+ var $form = $(this)
312
+ var options = {}
313
+ if ($form.attr('data-dialog-form-processing') == 'progressive') {
314
+ options.progressiveOperation = true
315
+ options.progressiveOperationElement = 'div[data-dialog-form-element=progress-bar]'
316
+ }
317
+ $form.concreteAjaxForm(options)
318
+ })
324
319
 
325
- // make dialogs
326
- $dialog.find('.dialog-launch').dialog()
320
+ $dialog.find('button[data-dialog-action=submit]').on('click', function () {
321
+ $dialog.find('[data-dialog-form]').submit()
322
+ })
327
323
 
328
- // automated close handling
329
- $dialog.find('.ccm-dialog-close').on('click', function() {
330
- $dialog.dialog('close')
331
- })
324
+ fixDialogButtons($dialog)
332
325
 
333
- const tooltipTriggerList = [].slice.call($dialog.find('.launch-tooltip'))
334
- tooltipTriggerList.map(function (tooltipTriggerEl) {
335
- return new bootstrap.Tooltip(tooltipTriggerEl, { container: '#ccm-tooltip-holder' })
336
- })
326
+ // make dialogs
327
+ $dialog.find('.dialog-launch').dialog()
337
328
 
338
- // help handling
339
- if ($dialog.find('.dialog-help').length > 0) {
340
- $dialog.find('.dialog-help').hide()
341
- var helpContent = $dialog.find('.dialog-help').html()
342
- var helpText
343
- if (ccmi18n.helpPopup) {
344
- helpText = ccmi18n.helpPopup
345
- } else {
346
- helpText = 'Help'
347
- }
348
- var button = $('<button class="btn-help"><svg><use xlink:href="#icon-dialog-help" /></svg></button>')
349
- var container = $('#ccm-tooltip-holder')
350
- button.insertBefore($dialog.parent().find('.ui-dialog-titlebar-close'))
329
+ // Handle vue components within
330
+ $dialog.find('[data-vue]').each(function() {
331
+ $(this).concreteVue({ context: $(this).attr('data-vue') })
332
+ })
351
333
 
352
- button.popover({
353
- content: function() {
354
- return helpContent
355
- },
356
- placement: 'bottom',
357
- html: true,
358
- container: container,
359
- trigger: 'click'
334
+ // automated close handling
335
+ $dialog.find('.ccm-dialog-close').on('click', function () {
336
+ $dialog.dialog('close')
360
337
  })
361
- button.on('shown.bs.popover', function() {
362
- var binding = function() {
363
- button.popover('hide', button)
364
- binding = $.noop
365
- }
366
338
 
367
- button.on('hide.bs.popover', function(event) {
368
- button.unbind(event)
369
- binding = $.noop
339
+ const tooltipTriggerList = [].slice.call($dialog.find('.launch-tooltip'))
340
+ tooltipTriggerList.map(function (tooltipTriggerEl) {
341
+ return new bootstrap.Tooltip(tooltipTriggerEl, {
342
+ container: '#ccm-tooltip-holder'
370
343
  })
344
+ })
371
345
 
372
- $('body').mousedown(function(e) {
373
- if ($(e.target).closest(container).length || $(e.target).closest(button).length) {
374
- return
346
+ // help handling
347
+ if ($dialog.find('.dialog-help').length > 0) {
348
+ $dialog.find('.dialog-help').hide()
349
+ var helpContent = $dialog.find('.dialog-help').html()
350
+ var helpText
351
+ if (ccmi18n.helpPopup) {
352
+ helpText = ccmi18n.helpPopup
353
+ } else {
354
+ helpText = 'Help'
355
+ }
356
+ var button = $('<button class="btn-help"><svg><use xlink:href="#icon-dialog-help" /></svg></button>')
357
+ var container = $('#ccm-tooltip-holder')
358
+ button.insertBefore($dialog.parent().find('.ui-dialog-titlebar-close'))
359
+
360
+ button.popover({
361
+ content: function () {
362
+ return helpContent
363
+ },
364
+ placement: 'bottom',
365
+ html: true,
366
+ container: container,
367
+ trigger: 'click'
368
+ })
369
+ button.on('shown.bs.popover', function () {
370
+ var binding = function () {
371
+ button.popover('hide', button)
372
+ binding = $.noop
375
373
  }
376
- $(this).unbind(e)
377
- binding()
374
+
375
+ button.on('hide.bs.popover', function (event) {
376
+ button.unbind(event)
377
+ binding = $.noop
378
+ })
379
+
380
+ $('body').mousedown(function (e) {
381
+ if ($(e.target).closest(container).length || $(e.target).closest(button).length) {
382
+ return
383
+ }
384
+ $(this).unbind(e)
385
+ binding()
386
+ })
378
387
  })
379
- })
380
- }
388
+ }
389
+ }, 10)
381
390
  }
382
391
 
383
392
  $.fn.dialog.getTop = function() {
@@ -0,0 +1,73 @@
1
+ /* eslint-disable no-new, no-unused-vars, camelcase, eqeqeq */
2
+ /* global bootstrap */
3
+ // This is a bridge between our various old custom code and Bootstrap Modals. The ultimate goal is to first
4
+ // Remove jQuery UI, on the way to removing jQuery (if the latter is ever an option.) So the first thing we need to
5
+ // do is remove all instances of dialog-launch legacy jQuery UI dialogs in favor of a single modal BS modal approach.
6
+
7
+ import bootbox from 'bootbox'
8
+
9
+ class ConcreteModal {
10
+ openExternal(url, title, options) {
11
+ var my = this
12
+ new ConcreteAjaxRequest({
13
+ url: url,
14
+ dataType: 'html',
15
+ success: function (r) {
16
+ options.message = r
17
+ options.title = title
18
+ my.show(options)
19
+ }
20
+ })
21
+ }
22
+
23
+ show(options) {
24
+ options = $.extend(options, {
25
+ className: 'ccm-ui',
26
+ centerVertical: true,
27
+ show: false,
28
+ backdrop: 'static',
29
+ container: '#ccm-tooltip-holder' // This was we get the .ccm-ui namespace for things like transition, etc..
30
+ })
31
+ const $_dialog = bootbox.dialog(options)
32
+ const element = $_dialog.get(0)
33
+
34
+ // Turn the _dialog jQuery object into the new Bs5 modal
35
+ const dialog = new bootstrap.Modal(element)
36
+
37
+ // Handle buttons in the response
38
+ const responseButtons = $_dialog.find('.dialog-buttons')
39
+ if (responseButtons.length) {
40
+ // move it out to the root.
41
+ responseButtons.attr('class', 'modal-footer').insertAfter($_dialog.find('.modal-body'))
42
+ }
43
+
44
+ // Handle the legacy dialog buttons
45
+ $_dialog.find('[data-dialog-form]').concreteAjaxForm()
46
+ $_dialog.find('button[data-dialog-action=cancel]').on('click', function() {
47
+ dialog.hide()
48
+ })
49
+ $_dialog.find('button[data-dialog-action=submit]').on('click', function() {
50
+ $_dialog.find('[data-dialog-form]').submit()
51
+ })
52
+
53
+ // Change the Close button to be white.
54
+ $_dialog.find('.btn-close').addClass('btn-close-white')
55
+
56
+ // Show the dialog
57
+ // dialog._config.backdrop = 'static'
58
+ dialog.show()
59
+
60
+ if (options.backdrop === 'static') {
61
+ dialog._config.backdrop = 'static'
62
+ }
63
+
64
+ element.addEventListener('hide.bs.modal', function() {
65
+ ConcreteModal.totalOpen--
66
+ })
67
+ ConcreteModal.totalOpen++
68
+ }
69
+ }
70
+
71
+ ConcreteModal.totalOpen = 0
72
+
73
+ global.ConcreteModal = ConcreteModal
@@ -337,6 +337,10 @@ function ConcretePanel(options) {
337
337
  $('[data-panel-detail-form]').submit()
338
338
  })
339
339
 
340
+ $content.find('[data-vue]').each(function() {
341
+ $(this).concreteVue({ context: $(this).attr('data-vue') })
342
+ })
343
+
340
344
  ConcreteEvent.subscribe('AjaxFormSubmitSuccess', function (e, data) {
341
345
  if ($('[data-panel-detail-form="' + data.form + '"]').data('action-after-save') == 'reload') {
342
346
  window.location.reload()
@@ -413,6 +417,10 @@ function ConcretePanel(options) {
413
417
  })
414
418
 
415
419
  $panel.find('.dialog-launch').dialog()
420
+ $panel.find('[data-vue]').each(function() {
421
+ $(this).concreteVue({ context: $(this).attr('data-vue') })
422
+ })
423
+
416
424
  $panel.find('[data-launch-panel-detail]').unbind('.detail').on('click.detail', function () {
417
425
  $.fn.dialog.showLoader()
418
426
  $('.ccm-panel-menu-item-active').removeClass('ccm-panel-menu-item-active')