@concretecms/bedrock 1.0.0 → 1.1.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.
- package/assets/account/js/frontend/components/Avatar/Cropper.js +12 -4
- package/assets/calendar/js/backend/duration.js +1 -1
- package/assets/ckeditor/js/concrete/link.js +5 -4
- package/assets/ckeditor/js/concrete/styles.js +2 -2
- package/assets/cms/components/BoardInstanceRule.vue +16 -3
- package/assets/cms/components/BoardInstanceRuleList.vue +24 -7
- package/assets/cms/components/CompletedProcessList.vue +28 -9
- package/assets/cms/components/Icon.vue +16 -1
- package/assets/cms/components/Pagination.vue +45 -8
- package/assets/cms/components/customizer/ColorPageCustomizerWidget.vue +7 -0
- package/assets/cms/components/customizer/FontWeightPageCustomizerWidget.vue +7 -1
- package/assets/cms/components/customizer/ImagePageCustomizerWidget.vue +13 -3
- package/assets/cms/components/customizer/TextTransformPageCustomizerWidget.vue +7 -1
- package/assets/cms/components/customizer/ThemeCustomizer.vue +36 -15
- package/assets/cms/components/customizer/ThemeCustomizerPreview.vue +11 -1
- package/assets/cms/components/customizer/TypePageCustomizerWidget.vue +21 -6
- package/assets/cms/components/express/Selector.vue +21 -6
- package/assets/cms/components/file-manager/Chooser/ExternalFileProvider.vue +13 -2
- package/assets/cms/components/file-manager/Chooser/FileSets.vue +13 -2
- package/assets/cms/components/file-manager/Chooser/Files.vue +19 -5
- package/assets/cms/components/file-manager/Chooser/SavedSearch.vue +13 -2
- package/assets/cms/components/file-manager/Chooser/Search.vue +13 -2
- package/assets/cms/components/file-manager/Chooser.vue +64 -8
- package/assets/cms/components/form/ConcreteFileDirectoryInput.vue +17 -4
- package/assets/cms/components/gallery/GalleryEdit.vue +20 -5
- package/assets/cms/components/gallery/ImageDetail.vue +22 -5
- package/assets/cms/components/groups/Chooser.vue +17 -4
- package/assets/cms/components/page/Chooser/ChooserSearch.vue +15 -2
- package/assets/cms/components/page/PageList.vue +15 -3
- package/assets/cms/components/user/Chooser/Search.vue +15 -2
- package/assets/cms/components/user/Chooser/Users.vue +19 -5
- package/assets/cms/components/user/Chooser.vue +15 -2
- package/assets/cms/js/edit-mode/style-customizer/color.js +10 -3
- package/assets/cms/js/edit-mode/style-customizer/custom.js +1 -1
- package/assets/cms/js/edit-mode/style-customizer/inline-toolbar.js +27 -27
- package/assets/cms/js/edit-mode/style-customizer/typography.js +8 -1
- package/assets/cms/scss/_inline-toolbar.scss +9 -180
- package/assets/cms/scss/panels/_shared.scss +1 -1
- package/assets/desktop/js/frontend/draft-list.js +0 -17
- package/package.json +2 -2
- package/.idea/bedrock.iml +0 -8
- package/.idea/codeStyles/Project.xml +0 -15
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/dataSources.local.xml +0 -4
- package/.idea/misc.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/vcs.xml +0 -6
- package/.idea/workspace.xml +0 -313
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<button type="button"
|
|
13
13
|
:class="{'btn': true, 'btn-outline-secondary': true, 'ccm-create-new-directory-button': true, 'disabled': disabled === true}"
|
|
14
14
|
@click="toggleDirectoryInput" :disabled="disabled">
|
|
15
|
-
|
|
15
|
+
{{ i18n.createNewFolder }}
|
|
16
16
|
</button>
|
|
17
17
|
</div>
|
|
18
18
|
<select v-else :id="directorySelectInputId" :name="inputName" class="ccm-directory-selector form-select" v-model="selectedDirectoryID" ref="directoryInput" :disabled="disabled">
|
|
@@ -24,16 +24,16 @@
|
|
|
24
24
|
</div>
|
|
25
25
|
<div v-if="showAddDirectoryButton" v-show="showAddDirectoryInput" class="ccm-new-directory-name-container">
|
|
26
26
|
<div class="form-group">
|
|
27
|
-
<label class="form-label" :for="directoryInputId">
|
|
27
|
+
<label class="form-label" :for="directoryInputId">{{ i18n.name }}</label>
|
|
28
28
|
<div class="input-group">
|
|
29
29
|
<input type="text"
|
|
30
30
|
:id="directoryInputId"
|
|
31
|
-
placeholder="
|
|
31
|
+
:placeholder="i18n.specifyName" class="ccm-new-directory-name form-control"
|
|
32
32
|
v-model="newDirectoryName" @keyup.enter.stop.prevent="createDirectory" :disabled="disabled">
|
|
33
33
|
<button type="button"
|
|
34
34
|
:class="{'btn': true, 'btn-outline-secondary': true, 'disabled': disabled === true}"
|
|
35
35
|
@click.stop.prevent="createDirectory" :disabled="disabled">
|
|
36
|
-
|
|
36
|
+
{{ i18n.add }}
|
|
37
37
|
</button>
|
|
38
38
|
</div>
|
|
39
39
|
</div>
|
|
@@ -46,6 +46,12 @@
|
|
|
46
46
|
/* global CCM_DISPATCHER_FILENAME, CCM_SECURITY_TOKEN, ConcreteAjaxRequest, _ */
|
|
47
47
|
export default {
|
|
48
48
|
data: () => ({
|
|
49
|
+
i18n: {
|
|
50
|
+
createNewFolder: 'Create New Folder',
|
|
51
|
+
name: 'Name',
|
|
52
|
+
specifyName: 'Please enter a name...',
|
|
53
|
+
add: 'Add'
|
|
54
|
+
},
|
|
49
55
|
showAddDirectoryInput: false,
|
|
50
56
|
selectedDirectoryID: 0,
|
|
51
57
|
directorySelectInputId: _.uniqueId('input-'),
|
|
@@ -109,6 +115,13 @@ export default {
|
|
|
109
115
|
this.fetchDirectories()
|
|
110
116
|
},
|
|
111
117
|
mounted() {
|
|
118
|
+
if (window.ccmi18n_filemanager) {
|
|
119
|
+
for (const key in this.i18n) {
|
|
120
|
+
if (window.ccmi18n_filemanager[key]) {
|
|
121
|
+
this.i18n[key] = window.ccmi18n_filemanager[key]
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
112
125
|
$(this.$refs.directoryInput).selectpicker()
|
|
113
126
|
|
|
114
127
|
if (this.directoryId) {
|
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
<a class="nav-link"
|
|
7
7
|
:class="activeTab === 'image' ? 'active' : ''"
|
|
8
8
|
@click="openTab('image')">
|
|
9
|
-
|
|
9
|
+
{{ i18n.images }}
|
|
10
10
|
</a>
|
|
11
11
|
</li>
|
|
12
12
|
<li class="nav-item">
|
|
13
13
|
<a class="nav-link"
|
|
14
14
|
@click="openTab('settings')"
|
|
15
15
|
:class="activeTab === 'settings' ? 'active' : ''">
|
|
16
|
-
|
|
16
|
+
{{ i18n.settings }}
|
|
17
17
|
</a>
|
|
18
18
|
</li>
|
|
19
19
|
</ul>
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
<div v-show="activeTab === 'image'" id="galleryImages">
|
|
23
23
|
<div class="text-end mt-4">
|
|
24
24
|
<icon-button icon="plus" icon-type="fas" type="outline" class="btn btn-secondary" @click="addImage()">
|
|
25
|
-
|
|
25
|
+
{{ i18n.addImages }}
|
|
26
26
|
</icon-button>
|
|
27
27
|
</div>
|
|
28
28
|
<div class="image-container mt-4"
|
|
@@ -51,13 +51,13 @@
|
|
|
51
51
|
</div>
|
|
52
52
|
<div v-show="activeTab === 'settings'" id="gallerySettings">
|
|
53
53
|
<h3>
|
|
54
|
-
|
|
54
|
+
{{ i18n.settings }}
|
|
55
55
|
</h3>
|
|
56
56
|
|
|
57
57
|
<div class="form-check">
|
|
58
58
|
<input class="form-check-input" type="checkbox" id="includeDownloadLink" :value="1" :checked="$root.includeDownloadLink" name="includeDownloadLink">
|
|
59
59
|
<label class="form-check-label" for="includeDownloadLink">
|
|
60
|
-
|
|
60
|
+
{{ i18n.includeOriginalDownloadLink }}
|
|
61
61
|
</label>
|
|
62
62
|
</div>
|
|
63
63
|
</div>
|
|
@@ -143,6 +143,12 @@ export default {
|
|
|
143
143
|
...ImageDetail.components
|
|
144
144
|
},
|
|
145
145
|
data: () => ({
|
|
146
|
+
i18n: {
|
|
147
|
+
images: 'Images',
|
|
148
|
+
settings: 'Settings',
|
|
149
|
+
addImages: 'Add Images',
|
|
150
|
+
includeOriginalDownloadLink: 'Include link to download original'
|
|
151
|
+
},
|
|
146
152
|
activeTab: 'image',
|
|
147
153
|
activeImage: null
|
|
148
154
|
}),
|
|
@@ -200,6 +206,15 @@ export default {
|
|
|
200
206
|
})
|
|
201
207
|
}
|
|
202
208
|
},
|
|
209
|
+
mounted() {
|
|
210
|
+
if (window.ccmi18n_gallery) {
|
|
211
|
+
for (const key in this.i18n) {
|
|
212
|
+
if (window.ccmi18n_gallery[key]) {
|
|
213
|
+
this.i18n[key] = window.ccmi18n_gallery[key]
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
},
|
|
203
218
|
props: {
|
|
204
219
|
gallery: {
|
|
205
220
|
type: Array,
|
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
@click="$emit('delete')"
|
|
11
11
|
type="outline"
|
|
12
12
|
>
|
|
13
|
-
|
|
13
|
+
{{ i18n.removeFromGallery }}
|
|
14
14
|
</IconButton>
|
|
15
|
-
<!-- <button type="button" class="btn btn-secondary" @click="$emit('delete')">
|
|
15
|
+
<!-- <button type="button" class="btn btn-secondary" @click="$emit('delete')">{{ i18n.removeFromGallery }}</button> -->
|
|
16
16
|
</div>
|
|
17
17
|
<div class="image-details">
|
|
18
18
|
<section>
|
|
19
|
-
<strong>
|
|
19
|
+
<strong>{{ i18n.customAttributes }}</strong>
|
|
20
20
|
|
|
21
21
|
<p class="image-title">{{this.$props.image.title}}</p>
|
|
22
22
|
<p class="image-description">{{this.$props.image.description}}</p>
|
|
@@ -32,14 +32,14 @@
|
|
|
32
32
|
type="outline"
|
|
33
33
|
v-if="$props.image.detailUrl"
|
|
34
34
|
>
|
|
35
|
-
|
|
35
|
+
{{ i18n.editAttributes }}
|
|
36
36
|
</IconButton>
|
|
37
37
|
</div>
|
|
38
38
|
</section>
|
|
39
39
|
|
|
40
40
|
<section v-if="!this.$props.image.displayChoices.length">
|
|
41
41
|
<div class="mb-2">
|
|
42
|
-
<strong>
|
|
42
|
+
<strong>{{ i18n.displayOptions }}</strong>
|
|
43
43
|
</div>
|
|
44
44
|
<div v-for="(choice, index) in this.$props.image.displayChoices" :key="index">
|
|
45
45
|
<input v-if="choice.type === 'text'"
|
|
@@ -123,6 +123,23 @@ export default {
|
|
|
123
123
|
IconButton,
|
|
124
124
|
...IconButton.components
|
|
125
125
|
},
|
|
126
|
+
data: () => ({
|
|
127
|
+
i18n: {
|
|
128
|
+
removeFromGallery: 'Remove from Gallery',
|
|
129
|
+
customAttributes: 'Custom Attributes',
|
|
130
|
+
editAttributes: 'Edit Attributes',
|
|
131
|
+
displayOptions: 'Display Options'
|
|
132
|
+
}
|
|
133
|
+
}),
|
|
134
|
+
mounted() {
|
|
135
|
+
if (window.ccmi18n_gallery) {
|
|
136
|
+
for (const key in this.i18n) {
|
|
137
|
+
if (window.ccmi18n_gallery[key]) {
|
|
138
|
+
this.i18n[key] = window.ccmi18n_gallery[key]
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
},
|
|
126
143
|
props: {
|
|
127
144
|
image: {
|
|
128
145
|
type: Object,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<div class="mb-3 ccm-header-search-form">
|
|
4
4
|
<form method="get" @submit="performSearch">
|
|
5
5
|
<div class="input-group">
|
|
6
|
-
<input type="search" v-model="searchKeywords" placeholder="
|
|
6
|
+
<input type="search" v-model="searchKeywords" :placeholder="i18n.search" class="form-control border-end-0" autocomplete="off">
|
|
7
7
|
<button type="submit" class="input-group-icon">
|
|
8
8
|
<svg width="16" height="16">
|
|
9
9
|
<use xlink:href="#icon-search"/>
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
<table class="border-top ccm-search-results-table">
|
|
19
19
|
<thead>
|
|
20
20
|
<tr>
|
|
21
|
-
<th>
|
|
22
|
-
<th class="w-100">
|
|
21
|
+
<th>{{ i18n.id }}</th>
|
|
22
|
+
<th class="w-100">{{ i18n.name }}</th>
|
|
23
23
|
</tr>
|
|
24
24
|
</thead>
|
|
25
25
|
<tbody>
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
</table>
|
|
32
32
|
</div>
|
|
33
33
|
<div v-else>
|
|
34
|
-
|
|
34
|
+
{{ i18n.noResults }}
|
|
35
35
|
</div>
|
|
36
36
|
</div>
|
|
37
37
|
<div v-show="searchSubmitted === 'searching'">
|
|
@@ -65,6 +65,12 @@ export default {
|
|
|
65
65
|
},
|
|
66
66
|
data() {
|
|
67
67
|
return {
|
|
68
|
+
i18n: {
|
|
69
|
+
search: 'Search',
|
|
70
|
+
id: 'ID',
|
|
71
|
+
name: 'Name',
|
|
72
|
+
noResults: 'No results found.'
|
|
73
|
+
},
|
|
68
74
|
searchKeywords: '',
|
|
69
75
|
searchResults: [],
|
|
70
76
|
searchSubmitted: false,
|
|
@@ -91,6 +97,13 @@ export default {
|
|
|
91
97
|
}
|
|
92
98
|
},
|
|
93
99
|
mounted() {
|
|
100
|
+
if (window.ccmi18n_groups) {
|
|
101
|
+
for (const key in this.i18n) {
|
|
102
|
+
if (window.ccmi18n_groups[key]) {
|
|
103
|
+
this.i18n[key] = window.ccmi18n_groups[key]
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
94
107
|
var my = this
|
|
95
108
|
new ConcreteAjaxRequest({
|
|
96
109
|
method: 'POST',
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<div class="col-md-4 ms-auto">
|
|
5
5
|
<form @submit.prevent="search">
|
|
6
6
|
<div class="ccm-header-search-form-input input-group">
|
|
7
|
-
<input type="text" class="form-control border-end-0" placeholder="
|
|
7
|
+
<input type="text" class="form-control border-end-0" :placeholder="i18n.search" autocomplete="false" v-model="searchText">
|
|
8
8
|
<button type="submit" class="input-group-icon">
|
|
9
9
|
<svg width="16" height="16">
|
|
10
10
|
<use xlink:href="#icon-search"/>
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
<span class="search-icon my-4">
|
|
19
19
|
<Icon icon="search" type="fas" color="#f4f4f4"/>
|
|
20
20
|
</span>
|
|
21
|
-
<p><b>
|
|
21
|
+
<p><b>{{ i18n.initialPageSearchChooserTip }}</b></p>
|
|
22
22
|
</div>
|
|
23
23
|
<div v-if="keywords">
|
|
24
24
|
<PageList
|
|
@@ -37,6 +37,10 @@ import PageList from './../PageList'
|
|
|
37
37
|
export default {
|
|
38
38
|
components: { Icon, PageList },
|
|
39
39
|
data: () => ({
|
|
40
|
+
i18n: {
|
|
41
|
+
search: 'Search',
|
|
42
|
+
initialPageSearchChooserTip: "Let's get some info on what you're looking for."
|
|
43
|
+
},
|
|
40
44
|
searchText: '',
|
|
41
45
|
keywords: '',
|
|
42
46
|
routePath: '/ccm/system/page/chooser/search/'
|
|
@@ -52,6 +56,15 @@ export default {
|
|
|
52
56
|
title: page.name
|
|
53
57
|
})
|
|
54
58
|
}
|
|
59
|
+
},
|
|
60
|
+
mounted() {
|
|
61
|
+
if (window.ccmi18n_sitemap) {
|
|
62
|
+
for (const key in this.i18n) {
|
|
63
|
+
if (window.ccmi18n_sitemap[key]) {
|
|
64
|
+
this.i18n[key] = window.ccmi18n_sitemap[key]
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
55
68
|
}
|
|
56
69
|
}
|
|
57
70
|
</script>
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
<thead>
|
|
9
9
|
<tr>
|
|
10
10
|
<th><span>Type</span></th>
|
|
11
|
-
<th :class="orderBy === 'cv.cvName' ? 'ccm-results-list-active-sort-' + orderByDirection : ''"><a href="#" @click="sortResults('cv.cvName', 'asc', $event)">
|
|
12
|
-
<th :class="orderBy === 'cv.cvDatePublic' ? 'ccm-results-list-active-sort-' + orderByDirection : ''"><a href="#" @click="sortResults('cv.cvDatePublic', 'asc', $event)">
|
|
13
|
-
<th :class="orderBy === 'c.cDateModified' ? 'ccm-results-list-active-sort-' + orderByDirection : ''"><a href="#" @click="sortResults('c.cDateModified', 'desc', $event)">
|
|
11
|
+
<th :class="orderBy === 'cv.cvName' ? 'ccm-results-list-active-sort-' + orderByDirection : ''"><a href="#" @click="sortResults('cv.cvName', 'asc', $event)">{{ i118n.name }}</a></th>
|
|
12
|
+
<th :class="orderBy === 'cv.cvDatePublic' ? 'ccm-results-list-active-sort-' + orderByDirection : ''"><a href="#" @click="sortResults('cv.cvDatePublic', 'asc', $event)">{{ i18n.date }}</a></th>
|
|
13
|
+
<th :class="orderBy === 'c.cDateModified' ? 'ccm-results-list-active-sort-' + orderByDirection : ''"><a href="#" @click="sortResults('c.cDateModified', 'desc', $event)">{{ i18n.lastModified }}</a></th>
|
|
14
14
|
<th><span>Author</span></th>
|
|
15
15
|
</tr>
|
|
16
16
|
</thead>
|
|
@@ -58,6 +58,11 @@ import Pagination from '../Pagination'
|
|
|
58
58
|
export default {
|
|
59
59
|
components: { Pagination },
|
|
60
60
|
data: () => ({
|
|
61
|
+
i18n: {
|
|
62
|
+
name: 'Name',
|
|
63
|
+
date: 'Date',
|
|
64
|
+
lastModified: 'Last Modified'
|
|
65
|
+
},
|
|
61
66
|
currentPage: -1,
|
|
62
67
|
latestSearchID: null,
|
|
63
68
|
mouseOver: 0,
|
|
@@ -190,6 +195,13 @@ export default {
|
|
|
190
195
|
}
|
|
191
196
|
},
|
|
192
197
|
mounted () {
|
|
198
|
+
if (window.ccmi18n_sitemap) {
|
|
199
|
+
for (const key in this.i18n) {
|
|
200
|
+
if (window.ccmi18n_sitemap[key]) {
|
|
201
|
+
this.i18n[key] = window.ccmi18n_sitemap[key]
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
193
205
|
this.fetchPages()
|
|
194
206
|
}
|
|
195
207
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<div class="col-md-6 ms-auto">
|
|
5
5
|
<form @submit.prevent="search">
|
|
6
6
|
<div class="ccm-header-search-form-input input-group">
|
|
7
|
-
<input type="text" class="form-control border-end-0" placeholder="
|
|
7
|
+
<input type="text" class="form-control border-end-0" :placeholder="i18n.search" autocomplete="false" v-model="searchText">
|
|
8
8
|
<button type="submit" class="input-group-icon">
|
|
9
9
|
<svg width="16" height="16">
|
|
10
10
|
<use xlink:href="#icon-search"/>
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
<span class="search-icon my-4">
|
|
19
19
|
<Icon icon="search" type="fas" color="#f4f4f4"/>
|
|
20
20
|
</span>
|
|
21
|
-
<p><b>
|
|
21
|
+
<p><b>{{ i18n.initialUserSearchChooserTip }}</b></p>
|
|
22
22
|
</div>
|
|
23
23
|
<div>
|
|
24
24
|
<users v-if="keywords"
|
|
@@ -39,6 +39,10 @@ export default {
|
|
|
39
39
|
Users
|
|
40
40
|
},
|
|
41
41
|
data: () => ({
|
|
42
|
+
i18n: {
|
|
43
|
+
search: 'Search',
|
|
44
|
+
initialUserSearchChooserTip: "Let's get some info on what you're looking for."
|
|
45
|
+
},
|
|
42
46
|
keywords: '',
|
|
43
47
|
searchText: '',
|
|
44
48
|
selectedUsers: [],
|
|
@@ -59,6 +63,15 @@ export default {
|
|
|
59
63
|
selectedUsers: function(value) {
|
|
60
64
|
this.$emit('update:selectedUsers', value)
|
|
61
65
|
}
|
|
66
|
+
},
|
|
67
|
+
mounted() {
|
|
68
|
+
if (window.ccmi18n_users) {
|
|
69
|
+
for (const key in this.i18n) {
|
|
70
|
+
if (window.ccmi18n_users[key]) {
|
|
71
|
+
this.i18n[key] = window.ccmi18n_users[key]
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
62
75
|
}
|
|
63
76
|
}
|
|
64
77
|
</script>
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
<thead>
|
|
7
7
|
<tr>
|
|
8
8
|
<th></th>
|
|
9
|
-
<th @click="sortBy('name')" :class="getSortColumnClassName('name')"><a href="javascript:void(0)">
|
|
10
|
-
<th @click="sortBy('email')" :class="getSortColumnClassName('email')"><a href="javascript:void(0)">
|
|
11
|
-
<th @click="sortBy('dateAdded')" :class="getSortColumnClassName('dateAdded')"><a href="javascript:void(0)">
|
|
12
|
-
<th>
|
|
13
|
-
<th @click="sortBy('totalLogins')" :class="getSortColumnClassName('totalLogins')"><a href="javascript:void(0)"
|
|
9
|
+
<th @click="sortBy('name')" :class="getSortColumnClassName('name')"><a href="javascript:void(0)">{{ i18n.username }}</a></th>
|
|
10
|
+
<th @click="sortBy('email')" :class="getSortColumnClassName('email')"><a href="javascript:void(0)">{{ i18n.email }}</a></th>
|
|
11
|
+
<th @click="sortBy('dateAdded')" :class="getSortColumnClassName('dateAdded')"><a href="javascript:void(0)">{{ i18n.date }}</a></th>
|
|
12
|
+
<th>{{ i18n.status }}</th>
|
|
13
|
+
<th @click="sortBy('totalLogins')" :class="getSortColumnClassName('totalLogins')"><a href="javascript:void(0)">{{ i18n.numLogins }}</a></th>
|
|
14
14
|
</tr>
|
|
15
15
|
</thead>
|
|
16
16
|
<tbody>
|
|
@@ -36,6 +36,13 @@
|
|
|
36
36
|
export default {
|
|
37
37
|
data() {
|
|
38
38
|
return {
|
|
39
|
+
i18n: {
|
|
40
|
+
username: 'Username',
|
|
41
|
+
email: 'Email',
|
|
42
|
+
date: 'Date',
|
|
43
|
+
status: 'Status',
|
|
44
|
+
numLogins: '# Logins'
|
|
45
|
+
},
|
|
39
46
|
isLoading: true,
|
|
40
47
|
userList: [],
|
|
41
48
|
selectedUsers: [],
|
|
@@ -111,6 +118,13 @@ export default {
|
|
|
111
118
|
}
|
|
112
119
|
},
|
|
113
120
|
mounted() {
|
|
121
|
+
if (window.ccmi18n_users) {
|
|
122
|
+
for (const key in this.i18n) {
|
|
123
|
+
if (window.ccmi18n_users[key]) {
|
|
124
|
+
this.i18n[key] = window.ccmi18n_users[key]
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
114
128
|
this.getUsers()
|
|
115
129
|
}
|
|
116
130
|
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
<div>
|
|
3
3
|
<search :selectedUsers.sync="selectedUsers" :multiple-selection="multipleSelection"/>
|
|
4
4
|
<div class="dialog-buttons">
|
|
5
|
-
<button class="btn btn-secondary" data-dialog-action="cancel">
|
|
6
|
-
<button type="button" @click="chooseUsers" :disabled="selectedUsers.length === 0" class="btn btn-primary">
|
|
5
|
+
<button class="btn btn-secondary" data-dialog-action="cancel">{{ i18n.cancel }}</button>
|
|
6
|
+
<button type="button" @click="chooseUsers" :disabled="selectedUsers.length === 0" class="btn btn-primary">{{ i18n.choose }}</button>
|
|
7
7
|
</div>
|
|
8
8
|
</div>
|
|
9
9
|
</template>
|
|
@@ -25,6 +25,10 @@ export default {
|
|
|
25
25
|
},
|
|
26
26
|
data() {
|
|
27
27
|
return {
|
|
28
|
+
i18n: {
|
|
29
|
+
cancel: 'Cancel',
|
|
30
|
+
choose: 'Choose'
|
|
31
|
+
},
|
|
28
32
|
selectedUsers: []
|
|
29
33
|
}
|
|
30
34
|
},
|
|
@@ -32,6 +36,15 @@ export default {
|
|
|
32
36
|
chooseUsers() {
|
|
33
37
|
window.ConcreteEvent.publish('UserSearchDialogSelectUser.core', { users: this.selectedUsers })
|
|
34
38
|
}
|
|
39
|
+
},
|
|
40
|
+
mounted() {
|
|
41
|
+
if (window.ccmi18n_users) {
|
|
42
|
+
for (const key in this.i18n) {
|
|
43
|
+
if (window.ccmi18n_users[key]) {
|
|
44
|
+
this.i18n[key] = window.ccmi18n_users[key]
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
35
48
|
}
|
|
36
49
|
}
|
|
37
50
|
</script>
|
|
@@ -3,12 +3,16 @@
|
|
|
3
3
|
function ConcreteStyleCustomizerColorPicker($element, options) {
|
|
4
4
|
var my = this
|
|
5
5
|
my.$element = $element
|
|
6
|
+
const defaulti18n = window.ccmi18n_styleCustomizer || null
|
|
6
7
|
my.options = $.extend(true, {
|
|
7
8
|
initialColor: '',
|
|
8
9
|
i18n: {
|
|
9
|
-
cancel: 'Cancel',
|
|
10
|
-
choose: 'Choose',
|
|
11
|
-
clear: '
|
|
10
|
+
cancel: defaulti18n && defaulti18n.cancel ? defaulti18n.cancel : 'Cancel',
|
|
11
|
+
choose: defaulti18n && defaulti18n.choose ? defaulti18n.choose : 'Choose',
|
|
12
|
+
clear: defaulti18n && defaulti18n.clearColorSelection ? defaulti18n.clearColorSelection : 'Clear Color Selection',
|
|
13
|
+
noColorSelected: defaulti18n && defaulti18n.noColorSelected ? defaulti18n.noColorSelected : 'No Color Selected',
|
|
14
|
+
togglePaletteMore: defaulti18n && defaulti18n.togglePaletteMore ? defaulti18n.togglePaletteMore : 'More',
|
|
15
|
+
togglePaletteLess: defaulti18n && defaulti18n.togglePaletteLess ? defaulti18n.togglePaletteLess : 'Less'
|
|
12
16
|
}
|
|
13
17
|
}, options || {})
|
|
14
18
|
$element.spectrum({
|
|
@@ -22,6 +26,9 @@ function ConcreteStyleCustomizerColorPicker($element, options) {
|
|
|
22
26
|
cancelText: my.options.i18n.cancel,
|
|
23
27
|
chooseText: my.options.i18n.choose,
|
|
24
28
|
clearText: my.options.i18n.clear,
|
|
29
|
+
noColorSelectedText: my.options.i18n.noColorSelected,
|
|
30
|
+
togglePaletteMoreText: my.options.i18n.togglePaletteMore,
|
|
31
|
+
togglePaletteLessText: my.options.i18n.togglePaletteLess,
|
|
25
32
|
change: function() {
|
|
26
33
|
ConcreteEvent.publish('StyleCustomizerControlUpdate')
|
|
27
34
|
}
|
|
@@ -16,7 +16,7 @@ function ConcreteStyleCustomizerCustomCss($element, options) {
|
|
|
16
16
|
url: ''
|
|
17
17
|
},
|
|
18
18
|
i18n: {
|
|
19
|
-
editTitle: 'Custom CSS'
|
|
19
|
+
editTitle: window.ccmi18n_styleCustomizer && window.ccmi18n_styleCustomizer.customCSS ? window.ccmi18n_styleCustomizer.customCSS : 'Custom CSS'
|
|
20
20
|
}
|
|
21
21
|
}, options || {})
|
|
22
22
|
$element
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/* eslint-disable no-new, no-unused-vars, camelcase, no-irregular-whitespace, new-cap */
|
|
2
|
+
|
|
2
3
|
/* global bootstrap */
|
|
3
4
|
function ConcreteInlineStyleCustomizer($element, options) {
|
|
4
5
|
var my = this
|
|
5
|
-
options = $.extend({
|
|
6
|
-
}, options)
|
|
6
|
+
options = $.extend({}, options)
|
|
7
7
|
|
|
8
8
|
my.options = options
|
|
9
9
|
my.$element = $element
|
|
@@ -19,7 +19,7 @@ function ConcreteInlineStyleCustomizer($element, options) {
|
|
|
19
19
|
|
|
20
20
|
ConcreteInlineStyleCustomizer.prototype = {
|
|
21
21
|
|
|
22
|
-
refreshStyles: function(resp) {
|
|
22
|
+
refreshStyles: function (resp) {
|
|
23
23
|
if (resp.oldIssID) {
|
|
24
24
|
$('head').find('style[data-style-set=' + resp.oldIssID + ']').remove()
|
|
25
25
|
}
|
|
@@ -28,41 +28,41 @@ ConcreteInlineStyleCustomizer.prototype = {
|
|
|
28
28
|
}
|
|
29
29
|
},
|
|
30
30
|
|
|
31
|
-
setupForm: function() {
|
|
31
|
+
setupForm: function () {
|
|
32
32
|
var my = this
|
|
33
33
|
const tooltipTriggerList = [].slice.call(my.$element.find('.launch-tooltip'))
|
|
34
34
|
const tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
|
|
35
35
|
return new bootstrap.Tooltip(tooltipTriggerEl)
|
|
36
36
|
})
|
|
37
37
|
my.$element.concreteAjaxForm({
|
|
38
|
-
success: function(resp) {
|
|
38
|
+
success: function (resp) {
|
|
39
39
|
my.handleResponse(resp)
|
|
40
40
|
},
|
|
41
|
-
error: function(r) {
|
|
41
|
+
error: function (r) {
|
|
42
42
|
my.$toolbar.prependTo('#ccm-inline-toolbar-container').show()
|
|
43
43
|
}
|
|
44
44
|
})
|
|
45
45
|
},
|
|
46
46
|
|
|
47
|
-
setupButtons: function() {
|
|
47
|
+
setupButtons: function () {
|
|
48
48
|
var my = this
|
|
49
|
-
my.$toolbar.on('click.inlineStyleCustomizer', 'input[data-action=cancel-design]', function() {
|
|
49
|
+
my.$toolbar.on('click.inlineStyleCustomizer', 'input[data-action=cancel-design]', function () {
|
|
50
50
|
my.$element.hide()
|
|
51
51
|
ConcreteEvent.fire('EditModeExitInline')
|
|
52
52
|
return false
|
|
53
53
|
})
|
|
54
54
|
|
|
55
|
-
my.$toolbar.on('click.inlineStyleCustomizer', 'input[data-action=reset-design]', function() {
|
|
55
|
+
my.$toolbar.on('click.inlineStyleCustomizer', 'input[data-action=reset-design]', function () {
|
|
56
56
|
$.concreteAjax({
|
|
57
57
|
url: $(this).attr('data-reset-action'),
|
|
58
|
-
success: function(resp) {
|
|
58
|
+
success: function (resp) {
|
|
59
59
|
my.handleResponse(resp)
|
|
60
60
|
}
|
|
61
61
|
})
|
|
62
62
|
return false
|
|
63
63
|
})
|
|
64
64
|
|
|
65
|
-
my.$toolbar.on('click.inlineStyleCustomizer', 'input[data-action=save-design]', function() {
|
|
65
|
+
my.$toolbar.on('click.inlineStyleCustomizer', 'input[data-action=save-design]', function () {
|
|
66
66
|
// move the toolbar back into the form so it submits. so great.
|
|
67
67
|
my.$toolbar.hide().prependTo(my.$element)
|
|
68
68
|
my.$element.submit()
|
|
@@ -71,7 +71,7 @@ ConcreteInlineStyleCustomizer.prototype = {
|
|
|
71
71
|
})
|
|
72
72
|
},
|
|
73
73
|
|
|
74
|
-
setupDropdowns: function() {
|
|
74
|
+
setupDropdowns: function () {
|
|
75
75
|
var my = this
|
|
76
76
|
my.$toolbar.find('.ccm-inline-toolbar-icon-cell > a').on('click', function () {
|
|
77
77
|
const $dropdown = $(this).parent().find('.ccm-dropdown-menu')
|
|
@@ -87,7 +87,7 @@ ConcreteInlineStyleCustomizer.prototype = {
|
|
|
87
87
|
})
|
|
88
88
|
},
|
|
89
89
|
|
|
90
|
-
setupDeviceVisibilityComponent: function() {
|
|
90
|
+
setupDeviceVisibilityComponent: function () {
|
|
91
91
|
var my = this
|
|
92
92
|
my.$toolbar.find('button[data-hide-on-device]').on('click', function (e) {
|
|
93
93
|
e.stopPropagation()
|
|
@@ -104,7 +104,7 @@ ConcreteInlineStyleCustomizer.prototype = {
|
|
|
104
104
|
})
|
|
105
105
|
},
|
|
106
106
|
|
|
107
|
-
setupSelectBoxes: function() {
|
|
107
|
+
setupSelectBoxes: function () {
|
|
108
108
|
var my = this
|
|
109
109
|
|
|
110
110
|
my.$toolbar.find('.selectpicker').selectpicker()
|
|
@@ -117,9 +117,9 @@ ConcreteInlineStyleCustomizer.prototype = {
|
|
|
117
117
|
})
|
|
118
118
|
},
|
|
119
119
|
|
|
120
|
-
setupSliders: function() {
|
|
120
|
+
setupSliders: function () {
|
|
121
121
|
var my = this
|
|
122
|
-
my.$toolbar.find('.ccm-inline-style-sliders').each(function() {
|
|
122
|
+
my.$toolbar.find('.ccm-inline-style-sliders').each(function () {
|
|
123
123
|
var targetInput = $(this).next().children('.ccm-inline-style-slider-value')
|
|
124
124
|
var targetInputFormat = targetInput.attr('data-value-format')
|
|
125
125
|
var sliderElement = $(this)
|
|
@@ -139,7 +139,7 @@ ConcreteInlineStyleCustomizer.prototype = {
|
|
|
139
139
|
min: min,
|
|
140
140
|
max: max,
|
|
141
141
|
value: currentValue(),
|
|
142
|
-
slide: function(event, ui) {
|
|
142
|
+
slide: function (event, ui) {
|
|
143
143
|
targetInput.prop('disabled', false)
|
|
144
144
|
targetInput.val(ui.value + targetInputFormat)
|
|
145
145
|
disableCheck()
|
|
@@ -181,7 +181,7 @@ function ConcreteBlockInlineStyleCustomizer($element, options) {
|
|
|
181
181
|
|
|
182
182
|
ConcreteBlockInlineStyleCustomizer.prototype = Object.create(ConcreteInlineStyleCustomizer.prototype)
|
|
183
183
|
|
|
184
|
-
ConcreteBlockInlineStyleCustomizer.prototype.handleResponse = function(resp) {
|
|
184
|
+
ConcreteBlockInlineStyleCustomizer.prototype.handleResponse = function (resp) {
|
|
185
185
|
var my = this
|
|
186
186
|
var editor = new Concrete.getEditMode()
|
|
187
187
|
var area = editor.getAreaByID(resp.aID)
|
|
@@ -222,7 +222,7 @@ function ConcreteAreaInlineStyleCustomizer($element, options) {
|
|
|
222
222
|
|
|
223
223
|
ConcreteAreaInlineStyleCustomizer.prototype = Object.create(ConcreteInlineStyleCustomizer.prototype)
|
|
224
224
|
|
|
225
|
-
ConcreteAreaInlineStyleCustomizer.prototype.handleResponse = function(resp) {
|
|
225
|
+
ConcreteAreaInlineStyleCustomizer.prototype.handleResponse = function (resp) {
|
|
226
226
|
var my = this
|
|
227
227
|
var editor = new Concrete.getEditMode()
|
|
228
228
|
var area = editor.getAreaByID(resp.aID)
|
|
@@ -257,21 +257,21 @@ $.fn.concreteInlineStyleCustomizer = function (options) {
|
|
|
257
257
|
})
|
|
258
258
|
}
|
|
259
259
|
|
|
260
|
-
$.fn.removeClassExcept
|
|
261
|
-
return
|
|
262
|
-
var
|
|
263
|
-
var reAdd
|
|
264
|
-
var $el
|
|
260
|
+
$.fn.removeClassExcept = function (val) {
|
|
261
|
+
return this.each(function (index, el) {
|
|
262
|
+
var keep = val.split(' ')
|
|
263
|
+
var reAdd = [] // ones that should be re-added if found
|
|
264
|
+
var $el = $(el) // element we're working on
|
|
265
265
|
|
|
266
266
|
// look for which we re-add (based on them already existing)
|
|
267
|
-
for
|
|
268
|
-
if
|
|
267
|
+
for (var i = 0; i < keep.length; i++) {
|
|
268
|
+
if ($el.hasClass(keep[i])) reAdd.push(keep[i])
|
|
269
269
|
}
|
|
270
270
|
|
|
271
271
|
// drop all, and only add those confirmed as existing
|
|
272
272
|
$el
|
|
273
273
|
.removeClass() // remove existing classes
|
|
274
|
-
.addClass(reAdd.join(' '))
|
|
274
|
+
.addClass(reAdd.join(' '))
|
|
275
275
|
})
|
|
276
276
|
}
|
|
277
277
|
|