@concretecms/bedrock 1.3.7 → 1.4.1

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 +524 -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
@@ -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'
@@ -51,9 +51,12 @@ export default class Manager {
51
51
  * @param {Function} callback (Vue, options) => new Vue(options)
52
52
  */
53
53
  activateContext(context, callback) {
54
- return callback(Vue, {
55
- components: this.getContext(context)
56
- })
54
+ // This is stupid but sometimes activateContext and extendContext are called essentially simultaneously and we need this to fire after
55
+ setTimeout(() => {
56
+ return callback(Vue, {
57
+ components: this.getContext(context)
58
+ })
59
+ }, 10)
57
60
  }
58
61
 
59
62
  /**
@@ -4,6 +4,7 @@
4
4
  @import 'buttons';
5
5
  @import 'tables';
6
6
  @import 'breadcrumb';
7
+ @import 'cards';
7
8
  @import 'list-group';
8
9
 
9
10
  // Support classes
@@ -65,10 +66,6 @@
65
66
  // File Uploader
66
67
  @import './file-uploader';
67
68
 
68
- // Bootstrap Select
69
- @import 'bootstrap-select/sass/bootstrap-select';
70
- @import 'ajax-bootstrap-select/dist/css/ajax-bootstrap-select';
71
-
72
69
  // Forms
73
70
  @import './forms';
74
71
 
@@ -77,10 +74,6 @@
77
74
  // Previously wasn't throwing the error because Selectize includes the BS mixins
78
75
  @import '~bootstrap/scss/mixins';
79
76
 
80
- //TODO: Check Selectize replacement
81
- //@import '~selectize-bootstrap4-theme/scss/selectize.bootstrap4';
82
- //@import './selectize';
83
-
84
77
  // Miscellaneous components
85
78
  @import './vue';
86
79
  @import './boards';
@@ -90,6 +83,7 @@
90
83
  @import './tabs';
91
84
  @import './item-selector';
92
85
  @import './item-select-list';
86
+ @import './select-combo-box';
93
87
  @import './permission-grid';
94
88
  @import './tooltips';
95
89
  @import 'spectrum-colorpicker2/dist/spectrum';
@@ -0,0 +1,7 @@
1
+ .ccm-ui {
2
+ .card {
3
+ // Let's disable borders on the outside of the cards. We can't use the $card-border-width variable for this
4
+ // because it also disables borders between card headers and bodies and footers
5
+ border-width: 0;
6
+ }
7
+ }
@@ -1,3 +1,4 @@
1
1
  // CSS for the chooser dialog window:
2
2
  @import 'file-manager/file-chooser';
3
3
  @import 'file-manager/image-cell';
4
+ @import 'file-manager/thumbnail-image-editor';
@@ -30,16 +30,26 @@
30
30
 
31
31
  .ccm-incoming-files-container {
32
32
  margin-bottom: 15px;
33
- max-height: 400px;
33
+ max-height: 280px;
34
34
  overflow-y: scroll;
35
35
  }
36
36
 
37
37
  .ccm-directory-selector-container {
38
38
  margin-top: 15px;
39
39
 
40
- .dropdown-item {
40
+ .item {
41
+ i {
42
+ margin-right: 10px;
43
+ }
44
+ }
45
+
46
+ .option {
41
47
  padding-left: 204px; // We need this default in order to handle the many levels of sub-nodes.
42
48
 
49
+ i {
50
+ margin-right: 5px; // item and option require diferent margins because one is flexbox and the other is not
51
+ }
52
+
43
53
  &.level-1 {
44
54
  padding-left: 12px;
45
55
  }
@@ -77,7 +87,7 @@
77
87
 
78
88
  .ccm-file-upload-container {
79
89
  display: block;
80
- height: 400px;
90
+ height: 280px;
81
91
  overflow-y: auto;
82
92
  position: relative;
83
93
  user-select: none;
@@ -18,6 +18,7 @@ div#ccm-toolbar {
18
18
  .ccm-ui {
19
19
  .ccm-help-tour {
20
20
  background-color: $help-tour-background-color;
21
+ border-color: $help-tour-background-color;
21
22
  font-size: 1rem;
22
23
  padding: $help-tour-padding;
23
24
 
@@ -127,9 +128,8 @@ div#ccm-toolbar {
127
128
  color: $help-tour-position-color !important;
128
129
  margin-left: 1rem;
129
130
 
130
- &,
131
131
  &:hover {
132
- text-decoration: none;
132
+ text-decoration: underline;
133
133
  }
134
134
  }
135
135
  }
@@ -144,3 +144,12 @@ div#ccm-toolbar {
144
144
  padding: 10px 20px;
145
145
  }
146
146
  }
147
+
148
+ .ccm-help-media {
149
+ display: flex;
150
+ margin-top: 0.5rem;
151
+
152
+ > div {
153
+ margin-right: 1rem;
154
+ }
155
+ }
@@ -2,6 +2,10 @@
2
2
  * New selector style
3
3
  */
4
4
  .ccm-item-selector-group {
5
+ .btn-group {
6
+ max-width: 100%;
7
+ }
8
+
5
9
  .btn {
6
10
  padding-left: 1rem;
7
11
  padding-right: 1rem;
@@ -31,6 +35,12 @@
31
35
  }
32
36
  }
33
37
 
38
+ &.is-invalid {
39
+ .btn {
40
+ border-color: $danger;
41
+ }
42
+ }
43
+
34
44
  }
35
45
 
36
46
 
@@ -88,3 +88,19 @@ div.ccm-area-layout-control-bar i {
88
88
  position: absolute;
89
89
  top: -2px;
90
90
  }
91
+
92
+ // Ensure that many grids will display properly within our layout tools.
93
+ // NOTE: If you implement a custom grid framework you must ensure that your row DIVs appear
94
+ // with position: relative within the following two IDs.
95
+ // This ensures that the layout tools work with this theme grid.
96
+ // Note: This HAD been a part of the bedrock frontend toolkit, meant to be included by themes when they include
97
+ // Bedrock. However, if a theme wasn't built on bedrock then it was borking in the layout tools, including Elemental
98
+ // So instead, let's include the very basic implementation of this here, with div.row (which should catch BS4, BS5
99
+ // and other derived grid frameworks). If you have a different series of classes you'll have to figure out your own
100
+ // implementation based on this.
101
+ div#ccm-theme-grid-temp,
102
+ div#ccm-theme-grid-edit-mode-row-wrapper {
103
+ div.row {
104
+ position: relative; // This is necessary in order for the javascript to correctly use jquery position() calls
105
+ }
106
+ }