@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
@@ -87,7 +87,7 @@ export default {
87
87
  if (my.mode === 'select') {
88
88
  options.onClick = function(node) {
89
89
  if (node.data.gID) {
90
- my.triggerSelect(node.data.gID, node.title)
90
+ my.triggerSelect(node.data.gID, node.data.gName ?? node.title, node.data.gDisplayName ?? node.title)
91
91
  } else {
92
92
  return false
93
93
  }
@@ -122,12 +122,13 @@ export default {
122
122
  window.location.href = CCM_DISPATCHER_FILENAME + '/dashboard/users/groups/edit/' + group.gID
123
123
  }
124
124
  if (this.mode === 'select') {
125
- this.triggerSelect(group.gID, group.gDisplayName)
125
+ this.triggerSelect(group.gID, group.gName, group.gDisplayName)
126
126
  }
127
127
  },
128
- triggerSelect(gID, gName) {
129
- ConcreteEvent.publish('SelectGroup', { gID: gID, gName: gName })
130
- this.$emit('select', { gID: gID, gName: gName })
128
+ triggerSelect(gID, gName, gDisplayName) {
129
+ gID = parseInt(gID) || 0
130
+ ConcreteEvent.publish('SelectGroup', { gID, gName, gDisplayName })
131
+ this.$emit('select', { gID, gName, gDisplayName })
131
132
  },
132
133
  performSearch(event) {
133
134
  this.searchSubmitted = 'searching'
@@ -20,7 +20,19 @@ import ConcreteFileChooser from './file-manager/Chooser'
20
20
  import ConcreteExpressEntrySelector from './express/Selector'
21
21
  import ConcreteUserChooser from './user/Chooser'
22
22
  import ConcreteGroupChooser from './groups/Chooser'
23
+ import ConcreteSelect from './form/ConcreteSelect'
24
+ import ConcreteAjaxSelect from './form/ConcreteAjaxSelect'
25
+ import ConcreteExpressEntrySelect from './form/ConcreteExpressEntrySelect'
26
+ import ConcretePageSelect from './form/ConcretePageSelect'
27
+ import ConcreteUserSelect from './form/ConcreteUserSelect'
28
+ import ConcreteOptionSelect from './form/ConcreteOptionSelect'
29
+ import ConcreteLocaleSelect from './form/ConcreteLocaleSelect'
30
+ import ConcreteToolbarSiteList from './toolbar/ConcreteToolbarSiteList'
31
+ import ConcreteGroupInput from './form/ConcreteGroupInput'
23
32
  import ConcreteFileUploader from './file-manager/Uploader/UploadFromComputer'
33
+ import ConcreteAnnouncementBroadcast from './Announcement/Broadcast'
34
+ import ConcreteThumbnailEditor from './Image/ThumbnailEditor'
35
+ import ConcreteHelpModal from './Help/Modal'
24
36
  import Board from './Board'
25
37
  import BoardSlot from './BoardSlot'
26
38
  import BoardInstanceRule from './BoardInstanceRule'
@@ -52,14 +64,26 @@ export default {
52
64
  ConcreteFileInput,
53
65
  ConcreteThemeColorInput,
54
66
  ConcreteExpressEntryInput,
67
+ ConcreteExpressEntrySelect,
55
68
  ConcreteExpressEntrySelector,
56
69
  ConcreteFileUploader,
57
70
  ConcreteGroupChooser,
71
+ ConcreteGroupInput,
58
72
  ConcretePageChooserSearch,
59
73
  ConcretePageInput,
74
+ ConcreteSelect,
75
+ ConcreteAjaxSelect,
76
+ ConcretePageSelect,
77
+ ConcreteUserSelect,
78
+ ConcreteOptionSelect,
79
+ ConcreteLocaleSelect,
80
+ ConcreteThumbnailEditor,
81
+ ConcreteToolbarSiteList,
60
82
  ConcreteUserInput,
61
83
  ConcreteEventOccurrenceInput,
62
84
  ConcreteFileDirectoryInput,
85
+ ConcreteAnnouncementBroadcast,
86
+ ConcreteHelpModal,
63
87
  Board,
64
88
  BoardSlot,
65
89
  BoardInstanceRule,
@@ -0,0 +1,62 @@
1
+ <template>
2
+ <input />
3
+ </template>
4
+
5
+ <script>
6
+ /* eslint-disable no-new, no-unused-vars, camelcase, eqeqeq */
7
+ /* globals TomSelect */
8
+ export default {
9
+ data() {
10
+ return {
11
+
12
+ }
13
+ },
14
+ props: {
15
+ token: {
16
+ type: String,
17
+ required: true
18
+ },
19
+ uri: {
20
+ type: String,
21
+ required: true
22
+ },
23
+ selectedSite: {
24
+ type: [String, Number],
25
+ required: false
26
+ },
27
+ sites: {
28
+ type: Array,
29
+ required: true
30
+ }
31
+ },
32
+ watch: {
33
+ },
34
+ computed: {
35
+ options: function() {
36
+ const options = []
37
+ this.sites.forEach((site) => {
38
+ options.push({ value: site.id, text: site.name })
39
+ })
40
+ return options
41
+ }
42
+ },
43
+ mounted() {
44
+ var config = {}
45
+ config.maxOptions = null
46
+ config.options = this.options
47
+ config.maxItems = 1
48
+ config.items = [this.selectedSite]
49
+ this.$nextTick(() => {
50
+ const select = new TomSelect(this.$el, config)
51
+ select.on('change', (option) => {
52
+ const url = CCM_DISPATCHER_FILENAME + '/ccm/site/redirect/' + option +
53
+ '?rUri=' + encodeURIComponent(this.uri) +
54
+ '&ccm_token=' + this.token
55
+ window.location.href = url
56
+ })
57
+ })
58
+ },
59
+ methods: {
60
+ }
61
+ }
62
+ </script>
@@ -24,6 +24,7 @@
24
24
  <users v-if="keywords"
25
25
  :selectedUsers.sync="selectedUsers"
26
26
  :multipleSelection="multipleSelection"
27
+ :hideUsername="hideUsername"
27
28
  :routePath="this.routePath + keywords"/>
28
29
  </div>
29
30
  </div>
@@ -57,6 +58,10 @@ export default {
57
58
  multipleSelection: {
58
59
  type: Boolean,
59
60
  default: true
61
+ },
62
+ hideUsername: {
63
+ type: Boolean,
64
+ default: false
60
65
  }
61
66
  },
62
67
  watch: {
@@ -6,7 +6,7 @@
6
6
  <thead>
7
7
  <tr>
8
8
  <th></th>
9
- <th @click="sortBy('name')" :class="getSortColumnClassName('name')"><a href="javascript:void(0)">{{ i18n.username }}</a></th>
9
+ <th v-if="!hideUsername" @click="sortBy('name')" :class="getSortColumnClassName('name')"><a href="javascript:void(0)">{{ i18n.username }}</a></th>
10
10
  <th @click="sortBy('email')" :class="getSortColumnClassName('email')"><a href="javascript:void(0)">{{ i18n.email }}</a></th>
11
11
  <th @click="sortBy('dateAdded')" :class="getSortColumnClassName('dateAdded')"><a href="javascript:void(0)">{{ i18n.date }}</a></th>
12
12
  <th>{{ i18n.status }}</th>
@@ -19,7 +19,7 @@
19
19
  <input type="checkbox" v-if="multipleSelection" v-model="selectedUsers" :id="'user-' + user.id" :value="user">
20
20
  <input type="radio" v-if="!multipleSelection" v-model="selectedUsers" :id="'user-' + user.id" :value="user">
21
21
  </td>
22
- <td>{{user.name}}</td>
22
+ <td v-if="!hideUsername">{{user.name}}</td>
23
23
  <td>{{user.email}}</td>
24
24
  <td>{{user.dateAdded}}</td>
25
25
  <td>{{user.status}}</td>
@@ -58,6 +58,10 @@ export default {
58
58
  multipleSelection: {
59
59
  type: Boolean,
60
60
  default: true
61
+ },
62
+ hideUsername: {
63
+ type: Boolean,
64
+ default: true
61
65
  }
62
66
  },
63
67
  methods: {
@@ -1,6 +1,10 @@
1
1
  <template>
2
2
  <div>
3
- <search :selectedUsers.sync="selectedUsers" :multiple-selection="multipleSelection"/>
3
+ <search
4
+ :selectedUsers.sync="selectedUsers"
5
+ :multiple-selection="multipleSelection"
6
+ :hide-username="hideUsername"
7
+ />
4
8
  <div class="dialog-buttons">
5
9
  <button class="btn btn-secondary" data-dialog-action="cancel">{{ i18n.cancel }}</button>
6
10
  <button type="button" @click="chooseUsers" :disabled="selectedUsers.length === 0" class="btn btn-primary">{{ i18n.choose }}</button>
@@ -9,18 +13,20 @@
9
13
  </template>
10
14
 
11
15
  <script>
12
- import Users from './Chooser/Users'
13
16
  import Search from './Chooser/Search'
14
17
 
15
18
  export default {
16
19
  components: {
17
- Users,
18
20
  Search
19
21
  },
20
22
  props: {
21
23
  multipleSelection: {
22
24
  type: Boolean,
23
25
  default: true
26
+ },
27
+ hideUsername: {
28
+ type: Boolean,
29
+ default: false
24
30
  }
25
31
  },
26
32
  data() {
@@ -49,10 +49,19 @@
49
49
  },
50
50
 
51
51
  error: function(r, my) {
52
- ConcreteEvent.fire('AjaxRequestError', {
53
- response: r
54
- })
55
- ConcreteAlert.dialog(ccmi18n.error, ConcreteAjaxRequest.renderErrorResponse(r, true))
52
+ if (r.readyState !== 0) {
53
+ // This happens in Firefox. I don't know why. It happens when an AJAX request is in process and then
54
+ // the page is navigated away from. I feel like Chrome handles this transparently, or maybe jQuery
55
+ // handles it better behind the scenes and doesn't send the error object on to the 'error' handler
56
+ // of the jquery .ajax() method. Regardless, sometimes incomplete AJAX requests in Firefox
57
+ // trigger the error handler without real data, so they just show "Undefined" as a popup.
58
+ // (e.g. https://github.com/concretecms/concretecms/issues/11135)
59
+ // So let's only pop the dialog if the readyState is NOT 0.
60
+ ConcreteEvent.fire('AjaxRequestError', {
61
+ response: r
62
+ })
63
+ ConcreteAlert.dialog(ccmi18n.error, ConcreteAjaxRequest.renderErrorResponse(r, true))
64
+ }
56
65
  },
57
66
 
58
67
  validateResponse: function(r, callback) {
@@ -98,13 +98,14 @@ class ConcreteAlert {
98
98
  icon: 'check-circle',
99
99
  title: false,
100
100
  message: false,
101
+ plainTextMessage: false,
101
102
  delay: 2000,
102
103
  callback: () => {}
103
104
  }, defaults)
104
105
 
105
106
  const notifyOptions = {
106
107
  text: options.message,
107
- textTrusted: true,
108
+ textTrusted: !options.plainTextMessage,
108
109
  icon: 'fas fa-' + options.icon,
109
110
  type: options.type,
110
111
  delay: options.delay,
@@ -7,10 +7,6 @@ import PNotify from './pnotify'
7
7
  import 'json5'
8
8
  import 'jquery.cookie'
9
9
  import 'jquery-form'
10
- import 'bootstrap-select/js/bootstrap-select'
11
- import './modifiable-bootstrap-select'
12
- import 'ajax-bootstrap-select'
13
- import './modifiable-ajax-bootstrap-select'
14
10
  import 'dropzone/dist/dropzone'
15
11
 
16
12
  // jQuery UI components
@@ -32,8 +28,10 @@ import './concrete'
32
28
  import './panels'
33
29
  import './toolbar'
34
30
  import './legacy-dialog'
31
+ import './modal'
35
32
  import './alert'
36
33
  import './page-notification'
34
+ import './select-combo-box'
37
35
 
38
36
  // Edit Mode
39
37
  import './edit-mode'
@@ -74,17 +72,11 @@ import './users'
74
72
  // Express
75
73
  import './express'
76
74
 
77
- // Style customizer
78
-
79
- // In-page editable fields
80
- // TBD
81
-
82
75
  // File Manager
83
76
  import './file-manager/uploader'
84
77
  import './file-manager/file-manager'
85
78
 
86
79
  // Miscellaneous UI components
87
- import 'selectize'
88
80
  import 'spectrum-colorpicker2'
89
81
  import 'tristate/jquery.tristate'
90
82
  import 'jquery-text-counter/textcounter'
@@ -101,6 +93,7 @@ import './calendar'
101
93
  // Vue components.
102
94
  import components from '@concretecms/bedrock/assets/cms/components/index'
103
95
  import VueManager from '@concretecms/bedrock/assets/cms/js/vue/Manager'
96
+ import './jquery-vue'
104
97
 
105
98
  window.NProgress = NProgress
106
99
  window._ = _
@@ -154,11 +154,6 @@
154
154
  menu: $('[data-area-menu=' + elem.attr('data-launch-area-menu') + ']')
155
155
  }
156
156
 
157
- if (my.getElem().hasClass('ccm-global-area')) {
158
- menu_config.menuActiveClass += ' ccm-global-area-highlight'
159
- menu_config.highlightClassName += ' ccm-global-area-highlight'
160
- }
161
-
162
157
  my.setAttr('menu', new ConcreteMenu(elem, menu_config))
163
158
 
164
159
  $menuElem.find('a[data-menu-action=add-inline]')
@@ -181,36 +176,6 @@
181
176
  return false
182
177
  })
183
178
 
184
- $menuElem.find('a[data-menu-action=edit-container-layout]')
185
- .off('click.edit-mode')
186
- .on('click.edit-mode', function (e) {
187
- // we are going to place this at the END of the list.
188
- var $link = $(this)
189
- var bID = parseInt($link.attr('data-container-layout-block-id'))
190
- var editor = Concrete.getEditMode()
191
- var block = _.findWhere(editor.getBlocks(), { id: bID })
192
- Concrete.event.fire('EditModeBlockEditInline', {
193
- block: block,
194
- arGridMaximumColumns: $link.attr('data-area-grid-maximum-columns'),
195
- event: e
196
- })
197
- return false
198
- })
199
-
200
- $menuElem.find('a[data-menu-action=edit-container-layout-style]')
201
- .off('click.edit-mode')
202
- .on('click.edit-mode', function (e) {
203
- e.preventDefault()
204
- // we are going to place this at the END of the list.
205
- var $link = $(this)
206
- var bID = parseInt($link.attr('data-container-layout-block-id'))
207
- var editor = Concrete.getEditMode()
208
- var block = _.findWhere(editor.getBlocks(), { id: bID })
209
- Concrete.event.fire('EditModeBlockEditInline', {
210
- block: block, event: e, action: CCM_DISPATCHER_FILENAME + '/ccm/system/dialogs/block/design'
211
- })
212
- })
213
-
214
179
  $menuElem.find('a[data-menu-action=area-add-block]')
215
180
  .off('click.edit-mode')
216
181
  .on('click.edit-mode', function(e) {
@@ -83,6 +83,14 @@
83
83
  e.stopPropagation()
84
84
  return false
85
85
  }).pep(my.getPepSettings())
86
+
87
+ my.getPeper().on('mouseover', function(e) {
88
+ my.getElem().addClass('ccm-block-move-hover')
89
+ })
90
+
91
+ my.getPeper().on('mouseout', function(e) {
92
+ my.getElem().removeClass('ccm-block-move-hover')
93
+ })
86
94
  },
87
95
 
88
96
  /**
@@ -583,6 +591,25 @@
583
591
  })
584
592
  },
585
593
 
594
+ /**
595
+ * Sets an area as accepting a block drag operation. By default all areas will be set up as possible
596
+ * in this block.js, but extending classes like layout.js and containerblock.js can restrict this
597
+ * to just their own areas.
598
+ *
599
+ * Note: This payload is JUST visual - other operations deeper within on dragstop actually handle rejecting
600
+ * this operation. This is only so that when we drag layouts and blocks around we don't see drop areas
601
+ * that _look_ like they will work, only to have the operation rejected when we attempt to drop.
602
+ *
603
+ * @param areas
604
+ */
605
+ setupAreaDragPayloads: function setupAreaDragPayloads(areas) {
606
+ _(areas).map((area) => {
607
+ if (area.acceptsBlockType(this.getHandle())) {
608
+ area.getElem().addClass('ccm-area-accepts-block-drag-payload')
609
+ }
610
+ })
611
+ },
612
+
586
613
  pepStop: function blockPepStop(context, event, pep) {
587
614
  var my = this; var drag_area
588
615
  my.getDragger().stop(1)
@@ -16,24 +16,54 @@ import _ from 'underscore'
16
16
  var my = this
17
17
  Concrete.Block.prototype.init.call(my, elem, edit_mode, $())
18
18
 
19
+ var notch = elem.siblings('.ccm-edit-mode-title-notch-wrapper').find('.ccm-edit-mode-title-notch')
20
+ my.setAttr('notch', notch)
21
+
19
22
  elem.children('.ccm-block-cover').remove()
20
23
  my.bindDrag()
21
24
  my.bindDelete()
22
25
  my.bindEditDesign()
26
+ my.bindNotchMenu()
27
+ },
28
+
29
+ getMenu: function() {
30
+ var my = this
31
+ return $('[data-container-menu=' + my.getId() + ']')
32
+ },
33
+
34
+ bindNotchMenu: function() {
35
+ var my = this
36
+ var menu_config = {
37
+ highlightClassName: 'ccm-edit-mode-title-notch-highlight',
38
+ menuActiveClass: 'ccm-edit-mode-title-notch-highlight',
39
+ menu: my.getMenu(),
40
+ onShow: function(menu) {
41
+ my.getElem().addClass('ccm-block-edit-container-highlight')
42
+ },
43
+ onHide: function(menu) {
44
+ my.getElem().removeClass('ccm-block-edit-container-highlight')
45
+ }
46
+ }
47
+ new ConcreteMenu(my.getNotch(), menu_config)
23
48
  },
24
49
 
25
50
  bindDelete: function ContainerBlockDelete() {
26
51
  var my = this
27
- var deleter = my.getElem().find('ul.ccm-edit-mode-inline-container a[data-inline-command=delete-block]')
52
+ var deleter = my.getMenu().find('a[data-inline-command=delete-block]')
28
53
  deleter.unbind('click.containerDelete').on('click.containerDelete', function(e) {
29
54
  e.preventDefault()
30
55
  my.delete()
31
56
  })
32
57
  },
33
58
 
59
+ setupAreaDragPayloads: function setupAreaDragPayloads(areas) {
60
+ var my = this
61
+ my.getArea().getElem().addClass('ccm-area-accepts-block-drag-payload')
62
+ },
63
+
34
64
  bindEditDesign: function ContainerBlockEditDesign() {
35
65
  var my = this
36
- var menuElem = my.getElem().find('ul.ccm-edit-mode-inline-container a[data-inline-command=edit-container-design]')
66
+ var menuElem = my.getMenu().find('a[data-inline-command=edit-container-design]')
37
67
  menuElem.off('click.edit-mode')
38
68
  .on('click.edit-mode', function (e) {
39
69
  e.preventDefault()
@@ -51,7 +81,7 @@ import _ from 'underscore'
51
81
 
52
82
  bindDrag: function ContainerBlockBindDrag() {
53
83
  var my = this
54
- var mover = my.getElem().find('ul.ccm-edit-mode-inline-container a[data-inline-command=move-block]').parent()
84
+ var mover = my.getNotch().find('a[data-inline-command=move-block]').parent()
55
85
 
56
86
  $.pep.unbind(mover)
57
87
  mover.pep(my.getPepSettings())
@@ -322,6 +322,12 @@
322
322
  }
323
323
  }
324
324
 
325
+ my.bindEvent('EditModeBlockDragInitialization', function(event, data) {
326
+ var block = data.block
327
+ var areas = my.getAreas()
328
+ block.setupAreaDragPayloads(areas)
329
+ })
330
+
325
331
  my.bindEvent('EditModeBlockDrag', _.throttle(function editModeEditModeBlockDragEventHandler(event, data) {
326
332
  if (!my.getDragging()) {
327
333
  return
@@ -374,6 +380,12 @@
374
380
  Concrete.event.fire('EditModeSelectableContender')
375
381
  html.removeClass('ccm-block-dragging')
376
382
 
383
+ _(my.getAreas()).map((area) => {
384
+ area.getElem().removeClass('ccm-area-accepts-block-drag-payload')
385
+ })
386
+
387
+ my.setDragging(false)
388
+
377
389
  if (data.block instanceof Concrete.BlockType) return
378
390
  my.scanBlocks()
379
391
  })
@@ -21,7 +21,57 @@ import _ from 'underscore'
21
21
  })
22
22
  Concrete.Block.prototype.init.call(my, elem, edit_mode, $())
23
23
 
24
+ my.setAttr('notch', elem.siblings('.ccm-edit-mode-title-notch-wrapper').find('.ccm-edit-mode-title-notch'))
25
+
24
26
  elem.children('.ccm-block-cover').remove()
27
+ my.bindNotchMenu()
28
+ },
29
+
30
+ bindNotchMenu: function() {
31
+ var my = this
32
+ var $menuElem = $('[data-layout-menu=' + my.getId() + ']')
33
+ var menu_config = {
34
+ highlightClassName: 'ccm-edit-mode-title-notch-highlight',
35
+ menuActiveClass: 'ccm-edit-mode-title-notch-highlight',
36
+ menu: $menuElem,
37
+ onShow: function(menu) {
38
+ my.getElem().addClass('ccm-block-edit-layout-highlight')
39
+ },
40
+ onHide: function(menu) {
41
+ my.getElem().removeClass('ccm-block-edit-layout-highlight')
42
+ }
43
+ }
44
+ new ConcreteMenu(my.getNotch(), menu_config)
45
+
46
+ $menuElem.find('a[data-menu-action=edit-container-layout]')
47
+ .off('click.edit-mode')
48
+ .on('click.edit-mode', function (e) {
49
+ // we are going to place this at the END of the list.
50
+ var $link = $(this)
51
+ var bID = parseInt($link.attr('data-container-layout-block-id'))
52
+ var editor = Concrete.getEditMode()
53
+ var block = _.findWhere(editor.getBlocks(), { id: bID })
54
+ Concrete.event.fire('EditModeBlockEditInline', {
55
+ block: block,
56
+ arGridMaximumColumns: $link.attr('data-area-grid-maximum-columns'),
57
+ event: e
58
+ })
59
+ return false
60
+ })
61
+
62
+ $menuElem.find('a[data-menu-action=edit-container-layout-style]')
63
+ .off('click.edit-mode')
64
+ .on('click.edit-mode', function (e) {
65
+ e.preventDefault()
66
+ // we are going to place this at the END of the list.
67
+ var $link = $(this)
68
+ var bID = parseInt($link.attr('data-container-layout-block-id'))
69
+ var editor = Concrete.getEditMode()
70
+ var block = _.findWhere(editor.getBlocks(), { id: bID })
71
+ Concrete.event.fire('EditModeBlockEditInline', {
72
+ block: block, event: e, action: CCM_DISPATCHER_FILENAME + '/ccm/system/dialogs/block/design'
73
+ })
74
+ })
25
75
  },
26
76
 
27
77
  bindDrag: function layoutBindDrag() {
@@ -31,6 +81,12 @@ import _ from 'underscore'
31
81
  peper.pep(my.getPepSettings())
32
82
  },
33
83
 
84
+ setupAreaDragPayloads: function setupAreaDragPayloads(areas) {
85
+ var my = this
86
+
87
+ my.getArea().getElem().addClass('ccm-area-accepts-block-drag-payload')
88
+ },
89
+
34
90
  addToDragArea: function layoutAddToDragArea() {
35
91
  Concrete.Block.prototype.addToDragArea.apply(this, _.toArray(arguments))
36
92
 
@@ -1,4 +1,3 @@
1
- // import './inline-toolbar'
2
1
  import './palette'
3
2
  import './color'
4
3
  import './image'