@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.
- package/.eslintrc.yml +2 -0
- package/assets/account/js/frontend/components/AvatarCropper.vue +159 -0
- package/assets/account/js/frontend.js +1 -1
- package/assets/account/scss/frontend/_frontend.scss +2 -0
- package/assets/account/scss/frontend/avatar/_avatar-cropper.scss +82 -0
- package/assets/account/scss/frontend/avatar/_avatar.scss +6 -0
- package/assets/bedrock/scss/_frontend.scss +0 -1
- package/assets/calendar/js/backend/duration.js +13 -13
- package/assets/calendar/js/vendor/fullcalendar.js +1 -0
- package/assets/cms/components/Announcement/Action/ExternalLinkAction.vue +25 -0
- package/assets/cms/components/Announcement/Action/GuideAction.vue +36 -0
- package/assets/cms/components/Announcement/Action/VideoAction.vue +31 -0
- package/assets/cms/components/Announcement/Broadcast.vue +63 -0
- package/assets/cms/components/Announcement/Button/ExternalLinkButton.vue +26 -0
- package/assets/cms/components/Announcement/Header/Header.vue +33 -0
- package/assets/cms/components/Announcement/Item/Item.vue +50 -0
- package/assets/cms/components/Announcement/Modal/Modal.vue +77 -0
- package/assets/cms/components/Announcement/Slide/CollectSiteInformationSlide.vue +61 -0
- package/assets/cms/components/Announcement/Slide/FeatureSlide.vue +81 -0
- package/assets/cms/components/Announcement/Slide/WelcomeSlide.vue +87 -0
- package/assets/cms/components/Help/Modal.vue +48 -0
- package/assets/cms/components/Image/ThumbnailEditor.vue +117 -0
- package/assets/cms/components/RunningProcessList.vue +6 -1
- package/assets/cms/components/customizer/FontFamilyPageCustomizerWidget.vue +27 -7
- package/assets/cms/components/file-manager/Chooser/FileManager.vue +0 -1
- package/assets/cms/components/file-manager/Chooser/FolderBookmark.vue +0 -1
- package/assets/cms/components/file-manager/Chooser.vue +1 -1
- package/assets/cms/components/form/ConcreteAjaxSelect.vue +173 -0
- package/assets/cms/components/form/ConcreteExpressEntrySelect.vue +74 -0
- package/assets/cms/components/form/ConcreteFileDirectoryInput.vue +28 -26
- package/assets/cms/components/form/ConcreteFileInput.vue +17 -5
- package/assets/cms/components/form/ConcreteGroupInput.vue +134 -0
- package/assets/cms/components/form/ConcreteLocaleSelect.vue +58 -0
- package/assets/cms/components/form/ConcreteOptionSelect.vue +92 -0
- package/assets/cms/components/form/ConcretePageSelect.vue +67 -0
- package/assets/cms/components/form/ConcreteSelect.vue +75 -0
- package/assets/cms/components/form/ConcreteThemeColorInput.vue +19 -14
- package/assets/cms/components/form/ConcreteUserInput.vue +24 -4
- package/assets/cms/components/form/ConcreteUserSelect.vue +126 -0
- package/assets/cms/components/form/IconSelector.vue +14 -5
- package/assets/cms/components/form/PasswordInput.vue +141 -24
- package/assets/cms/components/groups/Chooser.vue +6 -5
- package/assets/cms/components/index.js +24 -0
- package/assets/cms/components/toolbar/ConcreteToolbarSiteList.vue +62 -0
- package/assets/cms/components/user/Chooser/Search.vue +5 -0
- package/assets/cms/components/user/Chooser/Users.vue +6 -2
- package/assets/cms/components/user/Chooser.vue +9 -3
- package/assets/cms/js/ajax-request/base.js +13 -4
- package/assets/cms/js/alert.js +2 -1
- package/assets/cms/js/base.js +3 -10
- package/assets/cms/js/edit-mode/area.js +0 -35
- package/assets/cms/js/edit-mode/block.js +27 -0
- package/assets/cms/js/edit-mode/containerblock.js +33 -3
- package/assets/cms/js/edit-mode/editmode.js +12 -0
- package/assets/cms/js/edit-mode/layout.js +56 -0
- package/assets/cms/js/edit-mode/style-customizer/style-customizer.js +0 -1
- package/assets/cms/js/file-manager/uploader.js +30 -206
- package/assets/cms/js/help/help.js +11 -8
- package/assets/cms/js/in-context-menu.js +5 -0
- package/assets/cms/js/jquery-vue.js +22 -0
- package/assets/cms/js/legacy-dialog.js +74 -65
- package/assets/cms/js/modal.js +73 -0
- package/assets/cms/js/panels.js +8 -0
- package/assets/cms/js/search/base.js +0 -18
- package/assets/cms/js/search/field-selector.js +6 -14
- package/assets/cms/js/select-combo-box.js +2 -0
- package/assets/cms/js/sitemap/sitemap-selector.js +2 -2
- package/assets/cms/js/sitemap/sitemap.js +15 -20
- package/assets/cms/js/toolbar.js +25 -2
- package/assets/cms/js/tree.js +7 -7
- package/assets/cms/js/users/group-manager.js +55 -0
- package/assets/cms/js/users/user-manager.js +2 -1
- package/assets/cms/js/users.js +1 -0
- package/assets/cms/js/vue/Manager.js +6 -3
- package/assets/cms/scss/_base.scss +2 -8
- package/assets/cms/scss/_cards.scss +7 -0
- package/assets/cms/scss/_file-manager.scss +1 -0
- package/assets/cms/scss/_file-uploader.scss +13 -3
- package/assets/cms/scss/_help.scss +11 -2
- package/assets/cms/scss/_item-selector.scss +10 -0
- package/assets/cms/scss/_layouts.scss +16 -0
- package/assets/cms/scss/_page-areas.scss +524 -245
- package/assets/cms/scss/_popover.scss +5 -0
- package/assets/cms/scss/_select-combo-box.scss +18 -0
- package/assets/cms/scss/_toolbar.scss +5 -14
- package/assets/cms/scss/_transitions.scss +13 -0
- package/assets/cms/scss/_variables.scss +18 -7
- package/assets/cms/scss/bootstrap/_reboot-tags.scss +17 -32
- package/assets/cms/scss/bootstrap/_reboot.scss +17 -7
- package/assets/cms/scss/bootstrap/_root-modified.scss +41 -20
- package/assets/cms/scss/file-manager/_thumbnail-image-editor.scss +45 -0
- package/assets/cms/scss/panels/_help.scss +0 -10
- package/assets/staging/scss/frontend/_frontend.scss +12 -0
- package/assets/staging/scss/frontend.scss +4 -0
- package/package.json +9 -9
- package/assets/account/js/frontend/components/Avatar/Avatar.js +0 -270
- package/assets/account/js/frontend/components/Avatar/Avatar.scss +0 -17
- package/assets/account/js/frontend/components/Avatar/Avatar.vue +0 -18
- package/assets/account/js/frontend/components/Avatar/Cropper.js +0 -202
- package/assets/account/js/frontend/components/Avatar/Cropper.scss +0 -136
- package/assets/account/js/frontend/components/Avatar/Cropper.vue +0 -40
- package/assets/bedrock/scss/_theme-grid.scss +0 -7
- package/assets/cms/js/edit-mode/style-customizer/inline-toolbar.js +0 -279
- package/assets/cms/js/modifiable-ajax-bootstrap-select.js +0 -78
- 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
|
-
|
|
130
|
-
|
|
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
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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) {
|
package/assets/cms/js/alert.js
CHANGED
|
@@ -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:
|
|
108
|
+
textTrusted: !options.plainTextMessage,
|
|
108
109
|
icon: 'fas fa-' + options.icon,
|
|
109
110
|
type: options.type,
|
|
110
111
|
delay: options.delay,
|
package/assets/cms/js/base.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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
|
|