@concretecms/bedrock 1.3.6 → 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 (108) 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/FileUpload.vue +5 -0
  27. package/assets/cms/components/file-manager/Chooser/FolderBookmark.vue +0 -1
  28. package/assets/cms/components/file-manager/Chooser.vue +6 -1
  29. package/assets/cms/components/file-manager/Uploader/UploadFromComputer.vue +49 -9
  30. package/assets/cms/components/file-manager/Uploader.vue +7 -0
  31. package/assets/cms/components/form/ConcreteAjaxSelect.vue +173 -0
  32. package/assets/cms/components/form/ConcreteExpressEntrySelect.vue +74 -0
  33. package/assets/cms/components/form/ConcreteFileDirectoryInput.vue +28 -26
  34. package/assets/cms/components/form/ConcreteFileInput.vue +17 -5
  35. package/assets/cms/components/form/ConcreteGroupInput.vue +134 -0
  36. package/assets/cms/components/form/ConcreteLocaleSelect.vue +58 -0
  37. package/assets/cms/components/form/ConcreteOptionSelect.vue +92 -0
  38. package/assets/cms/components/form/ConcretePageSelect.vue +67 -0
  39. package/assets/cms/components/form/ConcreteSelect.vue +75 -0
  40. package/assets/cms/components/form/ConcreteThemeColorInput.vue +19 -14
  41. package/assets/cms/components/form/ConcreteUserInput.vue +69 -29
  42. package/assets/cms/components/form/ConcreteUserSelect.vue +126 -0
  43. package/assets/cms/components/form/IconSelector.vue +14 -5
  44. package/assets/cms/components/form/PasswordInput.vue +141 -24
  45. package/assets/cms/components/groups/Chooser.vue +6 -5
  46. package/assets/cms/components/index.js +24 -0
  47. package/assets/cms/components/toolbar/ConcreteToolbarSiteList.vue +62 -0
  48. package/assets/cms/components/user/Chooser/Search.vue +5 -0
  49. package/assets/cms/components/user/Chooser/Users.vue +6 -2
  50. package/assets/cms/components/user/Chooser.vue +9 -3
  51. package/assets/cms/js/ajax-request/base.js +13 -4
  52. package/assets/cms/js/alert.js +2 -1
  53. package/assets/cms/js/base.js +3 -10
  54. package/assets/cms/js/edit-mode/area.js +0 -35
  55. package/assets/cms/js/edit-mode/block.js +27 -0
  56. package/assets/cms/js/edit-mode/containerblock.js +33 -3
  57. package/assets/cms/js/edit-mode/editmode.js +12 -0
  58. package/assets/cms/js/edit-mode/layout.js +56 -0
  59. package/assets/cms/js/edit-mode/style-customizer/style-customizer.js +0 -1
  60. package/assets/cms/js/file-manager/uploader.js +64 -209
  61. package/assets/cms/js/help/help.js +11 -8
  62. package/assets/cms/js/in-context-menu.js +5 -0
  63. package/assets/cms/js/jquery-vue.js +22 -0
  64. package/assets/cms/js/legacy-dialog.js +74 -65
  65. package/assets/cms/js/modal.js +73 -0
  66. package/assets/cms/js/panels.js +8 -0
  67. package/assets/cms/js/search/base.js +0 -18
  68. package/assets/cms/js/search/field-selector.js +6 -14
  69. package/assets/cms/js/select-combo-box.js +2 -0
  70. package/assets/cms/js/sitemap/sitemap-selector.js +2 -2
  71. package/assets/cms/js/sitemap/sitemap.js +15 -20
  72. package/assets/cms/js/toolbar.js +25 -2
  73. package/assets/cms/js/tree.js +7 -7
  74. package/assets/cms/js/users/group-manager.js +55 -0
  75. package/assets/cms/js/users/user-manager.js +2 -1
  76. package/assets/cms/js/users.js +1 -0
  77. package/assets/cms/js/vue/Manager.js +6 -3
  78. package/assets/cms/scss/_base.scss +2 -8
  79. package/assets/cms/scss/_cards.scss +7 -0
  80. package/assets/cms/scss/_file-manager.scss +1 -0
  81. package/assets/cms/scss/_file-uploader.scss +13 -3
  82. package/assets/cms/scss/_help.scss +11 -2
  83. package/assets/cms/scss/_item-selector.scss +10 -0
  84. package/assets/cms/scss/_layouts.scss +16 -0
  85. package/assets/cms/scss/_page-areas.scss +517 -245
  86. package/assets/cms/scss/_popover.scss +5 -0
  87. package/assets/cms/scss/_select-combo-box.scss +18 -0
  88. package/assets/cms/scss/_toolbar.scss +5 -14
  89. package/assets/cms/scss/_transitions.scss +13 -0
  90. package/assets/cms/scss/_variables.scss +18 -7
  91. package/assets/cms/scss/bootstrap/_reboot-tags.scss +17 -32
  92. package/assets/cms/scss/bootstrap/_reboot.scss +17 -7
  93. package/assets/cms/scss/bootstrap/_root-modified.scss +41 -20
  94. package/assets/cms/scss/file-manager/_thumbnail-image-editor.scss +45 -0
  95. package/assets/cms/scss/panels/_help.scss +0 -10
  96. package/assets/staging/scss/frontend/_frontend.scss +12 -0
  97. package/assets/staging/scss/frontend.scss +4 -0
  98. package/package.json +9 -9
  99. package/assets/account/js/frontend/components/Avatar/Avatar.js +0 -270
  100. package/assets/account/js/frontend/components/Avatar/Avatar.scss +0 -17
  101. package/assets/account/js/frontend/components/Avatar/Avatar.vue +0 -18
  102. package/assets/account/js/frontend/components/Avatar/Cropper.js +0 -202
  103. package/assets/account/js/frontend/components/Avatar/Cropper.scss +0 -136
  104. package/assets/account/js/frontend/components/Avatar/Cropper.vue +0 -40
  105. package/assets/bedrock/scss/_theme-grid.scss +0 -7
  106. package/assets/cms/js/edit-mode/style-customizer/inline-toolbar.js +0 -279
  107. package/assets/cms/js/modifiable-ajax-bootstrap-select.js +0 -78
  108. package/assets/cms/js/modifiable-bootstrap-select.js +0 -112
@@ -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')
@@ -54,7 +54,6 @@
54
54
  this.setupCheckboxes()
55
55
  this.setupSort()
56
56
  this.setupPagination()
57
- this.setupSelectize()
58
57
  this.setupAdvancedSearch()
59
58
  this.setupCustomizeColumns()
60
59
  this.updateResults(options.result)
@@ -120,23 +119,6 @@
120
119
  return data
121
120
  }
122
121
 
123
- ConcreteAjaxSearch.prototype.setupSelectize = function() {
124
- var selects = this.$element.find('.ccm-enhanced-select')
125
- console.log('base')
126
- if (selects.length) {
127
- selects.selectpicker({
128
- liveSearch: true,
129
- width: '100%'
130
- })
131
- }
132
- // var selects = this.$element.find('.selectize-select')
133
- // if (selects.length) {
134
- // selects.selectize({
135
- // plugins: ['remove_button']
136
- // })
137
- // }
138
- }
139
-
140
122
  /**
141
123
  * The legacy create menu function for simple list items without multiple selection
142
124
  * @param $selector
@@ -36,13 +36,9 @@
36
36
  var $content = $container.append(
37
37
  renderFieldRowTemplate({ field: r })
38
38
  )
39
- var selects = $content.find('select.ccm-enhanced-select')
40
- if (selects.length) {
41
- selects.selectpicker({
42
- liveSearch: true,
43
- width: '100%'
44
- })
45
- }
39
+ $content.find('[data-vue]').each(function() {
40
+ $(this).concreteVue({ context: $(this).attr('data-vue') })
41
+ })
46
42
  }
47
43
  })
48
44
  }
@@ -73,13 +69,9 @@
73
69
  })
74
70
  }
75
71
 
76
- var selects = $container.find('select.ccm-enhanced-select')
77
- if (selects.length) {
78
- selects.selectpicker({
79
- liveSearch: true,
80
- width: '100%'
81
- })
82
- }
72
+ $container.find('[data-vue]').each(function() {
73
+ $(this).concreteVue({ context: $(this).attr('data-vue') })
74
+ })
83
75
  }
84
76
 
85
77
  // jQuery Plugin
@@ -0,0 +1,2 @@
1
+ import TomSelect from 'tom-select'
2
+ window.TomSelect = TomSelect
@@ -35,13 +35,13 @@
35
35
  if (options.selected) {
36
36
  if (options.mode == 'multiple') {
37
37
  $.each(options.selected, function(i, cID) {
38
- var node = my.$element.find('.ccm-sitemap-tree').fancytree('getTree').getNodeByKey(String(cID))
38
+ var node = $.ui.fancytree.getTree(my.$element.find('.ccm-sitemap-tree')).getNodeByKey(String(cID))
39
39
  if (node) {
40
40
  node.setSelected(true)
41
41
  }
42
42
  })
43
43
  } else {
44
- var tree = my.$element.find('.ccm-sitemap-tree').fancytree('getTree')
44
+ var tree = $.ui.fancytree.getTree(my.$element.find('.ccm-sitemap-tree'))
45
45
  var node = tree.getNodeByKey(String(options.selected))
46
46
  if (node) {
47
47
  node.setSelected(true)
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable no-new, no-unused-vars, camelcase, eqeqeq */
2
- /* global _, ccmi18n_sitemap, CCM_DISPATCHER_FILENAME, CCM_SECURITY_TOKEN, CCM_REL, Concrete, ConcreteAlert, ConcretePageMenu, ccm_parseJSON, ConcreteProgressiveOperation, ConcreteEvent */
2
+ /* global TomSelect, _, ccmi18n_sitemap, CCM_DISPATCHER_FILENAME, CCM_SECURITY_TOKEN, CCM_REL, Concrete, ConcreteAlert, ConcretePageMenu, ccm_parseJSON, ConcreteProgressiveOperation, ConcreteEvent */
3
3
 
4
4
  /* Base search class for AJAX forms in the UI */
5
5
  ;(function(global, $) {
@@ -47,7 +47,7 @@
47
47
 
48
48
  getTree: function() {
49
49
  var my = this
50
- return my.$sitemap.fancytree('getTree')
50
+ return $.ui.fancytree.getTree(my.$sitemap)
51
51
  },
52
52
 
53
53
  setupSiteTreeSelector: function(tree) {
@@ -60,13 +60,14 @@
60
60
  my.$element.find('div.ccm-sitemap-tree-selector-wrapper').append($(my.localesWrapperTemplate))
61
61
  var $menu = my.$element.find('div.ccm-sitemap-tree-selector-wrapper select')
62
62
 
63
+ // @todo - refactor TomSelect to bring back nice styling of flags, etc...
63
64
  if (tree.entryGroups && tree.entryGroups.length) {
64
65
  $.each(tree.entryGroups, function (gi, group) {
65
66
  var $optgroup = $('<optgroup label="' + group.label + '">')
66
67
 
67
68
  $.each(tree.entries, function (ti, entry) {
68
69
  if (entry.class == group.value) {
69
- var $option = '<option value="' + entry.siteTreeID + '" data-content=\'<div class="option">' + entry.element + '</div>\''
70
+ var $option = '<option value="' + entry.siteTreeID + '"'
70
71
 
71
72
  if (entry.isSelected) {
72
73
  $option += ' selected'
@@ -81,7 +82,7 @@
81
82
  })
82
83
  } else {
83
84
  $.each(tree.entries, function (ti, entry) {
84
- var $option = '<option value="' + entry.siteTreeID + '" data-content=\'<div class="option">' + entry.element + '</div>\''
85
+ var $option = '<option value="' + entry.siteTreeID + '"'
85
86
 
86
87
  if (entry.isSelected) {
87
88
  $option += ' selected'
@@ -92,19 +93,13 @@
92
93
  })
93
94
  }
94
95
 
95
- $menu.selectpicker({
96
- liveSearch: true,
97
- maxOptions: 1
98
- })
96
+ var menuSelect = new TomSelect($menu.get(0))
99
97
 
100
- $menu.on('changed.bs.select', function (e, clickedIndex, isSelected, previousValue) {
101
- var treeID = $(this).selectpicker('val')
102
- if (treeID != previousValue) {
103
- var source = my.getTree().options.source
104
- my.options.siteTreeID = treeID
105
- source.data.siteTreeID = treeID
106
- my.getTree().reload(source)
107
- }
98
+ menuSelect.on('change', function (treeID) {
99
+ var source = my.getTree().options.source
100
+ my.options.siteTreeID = treeID
101
+ source.data.siteTreeID = treeID
102
+ my.getTree().reload(source)
108
103
  })
109
104
  }
110
105
  }
@@ -340,10 +335,10 @@
340
335
  }
341
336
  ConcreteEvent.unsubscribe('SitemapDeleteRequestComplete.sitemap')
342
337
  ConcreteEvent.subscribe('SitemapDeleteRequestComplete.sitemap', function(e) {
343
- var node = my.$sitemap.fancytree('getActiveNode')
338
+ var node = $.ui.fancytree.getTree($(my.$sitemap)).getActiveNode()
344
339
  var parent = node.parent
345
340
  my.reloadNode(parent)
346
- $(my.$sitemap).fancytree('getTree').visit(function(node) {
341
+ $.ui.fancytree.getTree($(my.$sitemap)).visit(function(node) {
347
342
  // update the trash node when a page is deleted
348
343
  if (node.data.isTrash) {
349
344
  var isTrashNodeExpanded = node.expanded
@@ -456,7 +451,7 @@
456
451
  if (pg.length) {
457
452
  pg.find('a:not([disabled])').unbind('click').on('click', function() {
458
453
  var href = $(this).attr('href')
459
- var root = my.$sitemap.fancytree('getRootNode')
454
+ var root = $.ui.fancytree.getTree(my.$sitemap).getRootNode()
460
455
  jQuery.fn.dialog.showLoader()
461
456
  $.ajax({
462
457
  dataType: 'json',
@@ -482,7 +477,7 @@
482
477
 
483
478
  (my.options.onDisplaySingleLevel || $.noop).call(this, node)
484
479
 
485
- var root = my.$sitemap.fancytree('getRootNode')
480
+ var root = $.ui.fancytree.getTree(my.$sitemap).getRootNode()
486
481
  // my.$sitemap.fancytree('option', 'minExpandLevel', minExpandLevel);
487
482
  var ajaxData = $.extend({
488
483
  dataType: 'json',
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable no-new, no-unused-vars, camelcase, eqeqeq */
2
- /* global CCM_DISPATCHER_FILENAME, ConcreteEvent, ConcreteHelpGuideManager, ConcretePanelManager, bootstrap */
2
+ /* global CCM_DISPATCHER_FILENAME, ConcreteModal, ConcreteEvent, ConcreteHelpGuideManager, ConcretePanelManager, bootstrap */
3
3
 
4
4
  /* Basic toolbar class */
5
5
  ;(function(global, $) {
@@ -14,6 +14,28 @@
14
14
  $searchResults.css('right', $(window).width() - $searchInput.offset().left - $searchResults.width() - 1)
15
15
  }
16
16
 
17
+ function setupAnnouncementAndHelp() {
18
+ if (document.querySelectorAll('div[data-wrapper=concrete-announcement-broadcast]').length) {
19
+ Concrete.Vue.activateContext('cms', function (Vue, config) {
20
+ new Vue({
21
+ el: 'div[data-wrapper=concrete-announcement-broadcast]',
22
+ components: config.components
23
+ })
24
+ })
25
+ }
26
+
27
+ $(document.body).on('click', 'a[data-launch=help-modal]', function (e) {
28
+ e.stopPropagation()
29
+ e.preventDefault()
30
+
31
+ const modal = new ConcreteModal()
32
+ const url = new URL($(this).attr('href'))
33
+ modal.openExternal(url, ccmi18n.helpPopup, {
34
+ size: 'lg'
35
+ })
36
+ })
37
+ }
38
+
17
39
  function setupHelpNotifications() {
18
40
  var manager = ConcreteHelpGuideManager.get()
19
41
  if (manager.getGuideToLaunchOnRefresh()) {
@@ -62,7 +84,7 @@
62
84
 
63
85
  const tooltipTriggerList = [].slice.call(document.querySelectorAll('.launch-tooltip'))
64
86
  tooltipTriggerList.map(function (tooltipTriggerEl) {
65
- return new bootstrap.Tooltip(tooltipTriggerEl, {
87
+ return bootstrap.Tooltip.getInstance(tooltipTriggerEl) || new bootstrap.Tooltip(tooltipTriggerEl, {
66
88
  container: '#ccm-tooltip-holder',
67
89
  delay: {
68
90
  show: 500,
@@ -324,6 +346,7 @@
324
346
  setupTooltips()
325
347
  setupPageAlerts()
326
348
  setupHelpNotifications()
349
+ setupAnnouncementAndHelp()
327
350
  setupMobileNav()
328
351
  }
329
352
  },
@@ -155,7 +155,7 @@ ConcreteTree.prototype = {
155
155
  if (options.removeNodesByKey.length) {
156
156
  for (var i = 0; i < options.removeNodesByKey.length; i++) {
157
157
  var nodeID = options.removeNodesByKey[i]
158
- var node = $tree.fancytree('getTree').getNodeByKey(String(nodeID))
158
+ var node = $.ui.fancytree.getTree($tree).getNodeByKey(String(nodeID))
159
159
  if (node) {
160
160
  node.remove()
161
161
  }
@@ -168,7 +168,7 @@ ConcreteTree.prototype = {
168
168
 
169
169
  var selectedNodes
170
170
  if (options.chooseNodeInForm) {
171
- selectedNodes = $tree.fancytree('getTree')
171
+ selectedNodes = $.ui.fancytree.getTree($tree)
172
172
  selectedNodes = selectedNodes.getSelectedNodes()
173
173
  if (selectedNodes.length) {
174
174
  var keys = $.map(selectedNodes, function (node) {
@@ -332,7 +332,7 @@ ConcreteTree.prototype = {
332
332
  ConcreteAlert.dialog(ccmi18n.error, r.errors.join('<br>'))
333
333
  } else {
334
334
  jQuery.fn.dialog.closeTop()
335
- var node = $tree.fancytree('getTree').getNodeByKey(String(r.treeNodeParentID))
335
+ var node = $.ui.fancytree.getTree($tree).getNodeByKey(String(r.treeNodeParentID))
336
336
  jQuery.fn.dialog.showLoader()
337
337
  my.reloadNode(node, function () {
338
338
  jQuery.fn.dialog.hideLoader()
@@ -411,23 +411,23 @@ ConcreteTree.setupTreeEvents = function (my) {
411
411
  var node
412
412
  if (nodes.length) {
413
413
  for (var i = 0; i < nodes.length; i++) {
414
- node = $tree.fancytree('getTree').getNodeByKey(String(nodes[i].treeNodeParentID))
414
+ node = $.ui.fancytree.getTree($tree).getNodeByKey(String(nodes[i].treeNodeParentID))
415
415
  node.addChildren(nodes)
416
416
  }
417
417
  } else {
418
- node = $tree.fancytree('getTree').getNodeByKey(String(nodes.treeNodeParentID))
418
+ node = $.ui.fancytree.getTree($tree).getNodeByKey(String(nodes.treeNodeParentID))
419
419
  node.addChildren(nodes)
420
420
  }
421
421
  })
422
422
  ConcreteEvent.subscribe('ConcreteTreeUpdateTreeNode.concreteTree', function (e, r) {
423
423
  var $tree = $('[data-tree=' + my.options.treeID + ']')
424
- var node = $tree.fancytree('getTree').getNodeByKey(String(r.node.key))
424
+ var node = $.ui.fancytree.getTree($tree).getNodeByKey(String(r.node.key))
425
425
  node.fromDict(r.node)
426
426
  node.render()
427
427
  })
428
428
  ConcreteEvent.subscribe('ConcreteTreeDeleteTreeNode.concreteTree', function (e, r) {
429
429
  var $tree = $('[data-tree=' + my.options.treeID + ']')
430
- var node = $tree.fancytree('getTree').getNodeByKey(String(r.node.treeNodeID))
430
+ var node = $.ui.fancytree.getTree($tree).getNodeByKey(String(r.node.treeNodeID))
431
431
  node.remove()
432
432
  })
433
433
  }
@@ -0,0 +1,55 @@
1
+ /* global ccmi18n, CCM_DISPATCHER_FILENAME, ConcreteAjaxRequest, ConcreteEvent */
2
+ class ConcreteUserGroupManager {
3
+ static launchDialog(callback, opts) {
4
+ const options = {
5
+ displayDialogButtons: true
6
+ }
7
+
8
+ $.extend(options, opts)
9
+
10
+ $.fn.dialog.open({
11
+ title: ccmi18n.chooseGroup,
12
+ href: `${CCM_DISPATCHER_FILENAME}/ccm/system/dialogs/groups/search`,
13
+ width: '740px',
14
+ modal: true,
15
+ height: '600px',
16
+ data: options,
17
+ onOpen: function() {
18
+ ConcreteEvent.unsubscribe('SelectGroup.core')
19
+ ConcreteEvent.subscribe('SelectGroup.core', function (e, response) {
20
+ $.fn.dialog.closeTop()
21
+ callback(response)
22
+ })
23
+ }
24
+ })
25
+ }
26
+
27
+ static getGroupDetails(groupID, callbackSuccess, callbackFailure) {
28
+ const options = {
29
+ url: `${CCM_DISPATCHER_FILENAME}/ccm/system/group/get_json`,
30
+ data: { gID: groupID },
31
+ skipResponseValidation: true,
32
+ success(r) {
33
+ if (r.error) {
34
+ if (callbackFailure) {
35
+ callbackFailure(r)
36
+ } else {
37
+ ConcreteAjaxRequest.validateResponse(r)
38
+ }
39
+ } else if (callbackSuccess) {
40
+ callbackSuccess(r)
41
+ }
42
+ }
43
+ }
44
+ if (callbackFailure) {
45
+ options.error = function(r) {
46
+ callbackFailure(r)
47
+ }
48
+ }
49
+ /* eslint-disable no-new */
50
+ new ConcreteAjaxRequest(options)
51
+ /* eslint-enable no-new */
52
+ }
53
+ }
54
+
55
+ global.ConcreteUserGroupManager = ConcreteUserGroupManager
@@ -2,7 +2,8 @@
2
2
  class ConcreteUserManager {
3
3
  static launchDialog(callback, opts) {
4
4
  const options = {
5
- multipleSelection: ''
5
+ multipleSelection: false,
6
+ hideUsername: false
6
7
  }
7
8
 
8
9
  $.extend(options, opts)
@@ -1 +1,2 @@
1
1
  import './users/user-manager'
2
+ import './users/group-manager'