@concretecms/bedrock 1.0.2 → 1.1.2
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/.idea/codeStyles/Project.xml +33 -0
- package/.idea/inspectionProfiles/Project_Default.xml +7 -0
- package/assets/account/js/frontend/components/Avatar/Cropper.js +12 -4
- package/assets/bedrock/scss/_theme-grid.scss +4 -2
- 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/FileManager.vue +75 -72
- package/assets/cms/components/file-manager/Chooser/FileSets.vue +24 -9
- package/assets/cms/components/file-manager/Chooser/FileUpload.vue +3 -1
- package/assets/cms/components/file-manager/Chooser/Files.vue +57 -9
- package/assets/cms/components/file-manager/Chooser/FolderBookmark.vue +4 -0
- package/assets/cms/components/file-manager/Chooser/RecentUploads.vue +4 -0
- package/assets/cms/components/file-manager/Chooser/SavedSearch.vue +24 -9
- package/assets/cms/components/file-manager/Chooser/Search.vue +25 -9
- package/assets/cms/components/file-manager/Chooser.vue +82 -8
- package/assets/cms/components/file-manager/Uploader/UploadFromComputer.vue +3 -2
- package/assets/cms/components/file-manager/Uploader.vue +1 -0
- package/assets/cms/components/form/ConcreteFileDirectoryInput.vue +17 -4
- package/assets/cms/components/form/ConcreteFileInput.vue +8 -1
- 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/layouts.js +4 -4
- 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/typography.js +8 -1
- package/assets/cms/js/file-manager/file-manager.js +1 -8
- package/assets/cms/scss/_inline-toolbar.scss +10 -179
- package/assets/cms/scss/panels/_shared.scss +1 -1
- package/package.json +2 -2
- package/.idea/dataSources.local.xml +0 -4
- package/.idea/misc.xml +0 -6
- package/.idea/workspace.xml +0 -317
|
@@ -21,16 +21,16 @@
|
|
|
21
21
|
</div>
|
|
22
22
|
|
|
23
23
|
<div>
|
|
24
|
-
<h5>
|
|
24
|
+
<h5>{{ i18n.customCSS }}</h5>
|
|
25
25
|
<div class="card mb-4">
|
|
26
26
|
<div class="list-group list-group-flush">
|
|
27
27
|
<div class="list-group-item">
|
|
28
28
|
<div class="form-check form-switch">
|
|
29
29
|
<input class="form-check-input" type="checkbox" id="addCustomCSS" v-model="addCustomCss">
|
|
30
|
-
<label class="form-check-label" for="addCustomCSS">
|
|
30
|
+
<label class="form-check-label" for="addCustomCSS">{{ i18n.addCustomCSS }}</label>
|
|
31
31
|
</div>
|
|
32
32
|
<div v-if="addCustomCss" class="d-grid mt-2">
|
|
33
|
-
<button class="btn btn-secondary btn-sm" @click="showCustomCssDialog">
|
|
33
|
+
<button class="btn btn-secondary btn-sm" @click="showCustomCssDialog">{{ i18n.editCSS }}</button>
|
|
34
34
|
</div>
|
|
35
35
|
</div>
|
|
36
36
|
</div>
|
|
@@ -41,13 +41,13 @@
|
|
|
41
41
|
<div data-dialog="save-theme-customizer-changes">
|
|
42
42
|
|
|
43
43
|
<div class="form-group">
|
|
44
|
-
<label class="form-label" for="newSkinName">
|
|
44
|
+
<label class="form-label" for="newSkinName">{{ i18n.skinName }}</label>
|
|
45
45
|
<input type="text" :class='{"form-control": true, "is-invalid": invalidSkinName}' name="newSkinName"
|
|
46
46
|
id="newSkinName" v-model="newSkinName">
|
|
47
47
|
</div>
|
|
48
48
|
|
|
49
49
|
<div class="dialog-buttons">
|
|
50
|
-
<button class="btn btn-primary float-end" @click="createNewSkin" type="button">
|
|
50
|
+
<button class="btn btn-primary float-end" @click="createNewSkin" type="button">{{ i18n.create }}</button>
|
|
51
51
|
</div>
|
|
52
52
|
|
|
53
53
|
</div>
|
|
@@ -57,21 +57,21 @@
|
|
|
57
57
|
<div data-dialog="save-theme-customizer-styles">
|
|
58
58
|
|
|
59
59
|
<div class="form-group">
|
|
60
|
-
<p>
|
|
60
|
+
<p>{{ i18n.applyCustomizations }}</p>
|
|
61
61
|
|
|
62
62
|
<div class="form-check">
|
|
63
63
|
<input class="form-check-input" type="radio" id="applyToThisPage" v-model="applyTo" value="page">
|
|
64
|
-
<label class="form-check-label" for="applyToThisPage">
|
|
64
|
+
<label class="form-check-label" for="applyToThisPage">{{ i18n.thisPage }}</label>
|
|
65
65
|
</div>
|
|
66
66
|
<div class="form-check">
|
|
67
67
|
<input class="form-check-input" type="radio" id="applyToEntireSite" v-model="applyTo" value="site">
|
|
68
|
-
<label class="form-check-label" for="applyToEntireSite">
|
|
68
|
+
<label class="form-check-label" for="applyToEntireSite">{{ i18n.entireSite }}</label>
|
|
69
69
|
</div>
|
|
70
70
|
|
|
71
71
|
</div>
|
|
72
72
|
|
|
73
73
|
<div class="dialog-buttons">
|
|
74
|
-
<button class="btn btn-primary float-end" @click="saveStyles" type="button">
|
|
74
|
+
<button class="btn btn-primary float-end" @click="saveStyles" type="button">{{ i18n.confirm }}</button>
|
|
75
75
|
</div>
|
|
76
76
|
|
|
77
77
|
</div>
|
|
@@ -80,10 +80,10 @@
|
|
|
80
80
|
<div class="d-none">
|
|
81
81
|
<div data-dialog="delete-theme-customizer-skin">
|
|
82
82
|
|
|
83
|
-
<p>
|
|
83
|
+
<p>{{ i18n.confirmSkinDeletion }}</p>
|
|
84
84
|
|
|
85
85
|
<div class="dialog-buttons">
|
|
86
|
-
<button class="btn btn-primary float-end" @click="deleteSkin" type="button">
|
|
86
|
+
<button class="btn btn-primary float-end" @click="deleteSkin" type="button">{{ i18n.delete }}</button>
|
|
87
87
|
</div>
|
|
88
88
|
|
|
89
89
|
</div>
|
|
@@ -195,7 +195,7 @@ export default {
|
|
|
195
195
|
modal: true,
|
|
196
196
|
width: '800px',
|
|
197
197
|
height: '70%',
|
|
198
|
-
title:
|
|
198
|
+
title: my.i18n.customCSS,
|
|
199
199
|
onOpen: function() {
|
|
200
200
|
var editor = ace.edit('theme-customizer-custom-css-editor')
|
|
201
201
|
editor.setTheme('ace/theme/eclipse')
|
|
@@ -254,6 +254,20 @@ export default {
|
|
|
254
254
|
},
|
|
255
255
|
data: function () {
|
|
256
256
|
return {
|
|
257
|
+
i18n: {
|
|
258
|
+
addCustomCSS: 'Add Custom CSS',
|
|
259
|
+
editCSS: 'Edit CSS',
|
|
260
|
+
skinName: 'Skin Name',
|
|
261
|
+
create: 'Create',
|
|
262
|
+
applyCustomizations: 'Apply customizations to:',
|
|
263
|
+
thisPage: 'This Page',
|
|
264
|
+
entireSite: 'Entire Site',
|
|
265
|
+
confirm: 'Confirm',
|
|
266
|
+
confirmSkinDeletion: 'Are you sure you want to delete this custom skin? This cannot be undone.',
|
|
267
|
+
delete: 'Delete',
|
|
268
|
+
customCSS: 'Custom CSS',
|
|
269
|
+
save: 'Save'
|
|
270
|
+
},
|
|
257
271
|
invalidSkinName: false,
|
|
258
272
|
newSkinName: '',
|
|
259
273
|
addCustomCss: false,
|
|
@@ -263,6 +277,13 @@ export default {
|
|
|
263
277
|
}
|
|
264
278
|
},
|
|
265
279
|
mounted() {
|
|
280
|
+
if (window.ccmi18n_styleCustomizer) {
|
|
281
|
+
for (const key in this.i18n) {
|
|
282
|
+
if (window.ccmi18n_styleCustomizer[key]) {
|
|
283
|
+
this.i18n[key] = window.ccmi18n_styleCustomizer[key]
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
266
287
|
if (this.customCss) {
|
|
267
288
|
this.addCustomCss = true
|
|
268
289
|
this.customizerCustomCss = this.customCss
|
|
@@ -295,7 +316,7 @@ export default {
|
|
|
295
316
|
element: 'div[data-dialog=delete-theme-customizer-skin]',
|
|
296
317
|
modal: true,
|
|
297
318
|
width: '400',
|
|
298
|
-
title:
|
|
319
|
+
title: my.i18n.save,
|
|
299
320
|
height: 'auto'
|
|
300
321
|
})
|
|
301
322
|
})
|
|
@@ -305,7 +326,7 @@ export default {
|
|
|
305
326
|
element: 'div[data-dialog=save-theme-customizer-changes]',
|
|
306
327
|
modal: true,
|
|
307
328
|
width: '400',
|
|
308
|
-
title:
|
|
329
|
+
title: my.i18n.save,
|
|
309
330
|
height: 'auto'
|
|
310
331
|
})
|
|
311
332
|
})
|
|
@@ -315,7 +336,7 @@ export default {
|
|
|
315
336
|
element: 'div[data-dialog=save-theme-customizer-styles]',
|
|
316
337
|
modal: true,
|
|
317
338
|
width: '400',
|
|
318
|
-
title:
|
|
339
|
+
title: my.i18n.save,
|
|
319
340
|
height: 'auto'
|
|
320
341
|
})
|
|
321
342
|
})
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<div v-if="loadingPreview">
|
|
8
8
|
<div class="text-center mt-5 display-4 text-secondary">
|
|
9
9
|
<i class="fa fa-cog fa-spin"></i>
|
|
10
|
-
|
|
10
|
+
{{ i18n.loading }}
|
|
11
11
|
</div>
|
|
12
12
|
</div>
|
|
13
13
|
</div>
|
|
@@ -22,11 +22,21 @@ export default {
|
|
|
22
22
|
},
|
|
23
23
|
data: function () {
|
|
24
24
|
return {
|
|
25
|
+
i18n: {
|
|
26
|
+
loading: 'Loading...'
|
|
27
|
+
},
|
|
25
28
|
loadingPreview: true
|
|
26
29
|
}
|
|
27
30
|
},
|
|
28
31
|
mounted() {
|
|
29
32
|
var my = this
|
|
33
|
+
if (window.ccmi18n_styleCustomizer) {
|
|
34
|
+
for (const key in my.i18n) {
|
|
35
|
+
if (window.ccmi18n_styleCustomizer[key]) {
|
|
36
|
+
my.i18n[key] = window.ccmi18n_styleCustomizer[key]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
30
40
|
$('iframe[name=ccm-theme-preview-frame]').on('load', function() {
|
|
31
41
|
my.loadingPreview = false
|
|
32
42
|
})
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
</template>
|
|
6
6
|
<template v-slot:content>
|
|
7
7
|
<div class="mb-2">
|
|
8
|
-
<label class="form-label">
|
|
8
|
+
<label class="form-label">{{ i18n.fontFamily }}</label>
|
|
9
9
|
<div class="d-flex">
|
|
10
10
|
<font-family-page-customizer-widget @update="componentUpdated" v-if="fontFamilySubTypeValue" :style-value="fontFamilySubTypeValue"></font-family-page-customizer-widget>
|
|
11
11
|
<div class="ms-1 d-flex align-items-center" v-if="colorSubTypeValue">
|
|
@@ -14,23 +14,23 @@
|
|
|
14
14
|
</div>
|
|
15
15
|
</div>
|
|
16
16
|
<div class="mb-2" v-if="fontSizeSubTypeValue">
|
|
17
|
-
<label class="form-label">
|
|
17
|
+
<label class="form-label">{{ i18n.fontSize }}</label>
|
|
18
18
|
<size-page-customizer-widget @update="componentUpdated" :style-value="fontSizeSubTypeValue"></size-page-customizer-widget>
|
|
19
19
|
</div>
|
|
20
20
|
<div class="mb-2" v-if="fontWeightSubTypeValue">
|
|
21
|
-
<label class="form-label">
|
|
21
|
+
<label class="form-label">{{ i18n.fontWeight }}</label>
|
|
22
22
|
<font-weight-page-customizer-widget @update="componentUpdated" :style-value="fontWeightSubTypeValue"></font-weight-page-customizer-widget>
|
|
23
23
|
</div>
|
|
24
24
|
<div class="mb-2" v-if="fontStyleSubTypeValue">
|
|
25
|
-
<label class="form-label">
|
|
25
|
+
<label class="form-label">{{ i18n.fontStyle }}</label>
|
|
26
26
|
<font-style-page-customizer-widget @update="componentUpdated" :style-value="fontStyleSubTypeValue"></font-style-page-customizer-widget>
|
|
27
27
|
</div>
|
|
28
28
|
<div class="mb-2" v-if="textDecorationSubTypeValue">
|
|
29
|
-
<label class="form-label">
|
|
29
|
+
<label class="form-label">{{ i18n.textDecoration }}</label>
|
|
30
30
|
<text-decoration-page-customizer-widget @update="componentUpdated" :style-value="textDecorationSubTypeValue"></text-decoration-page-customizer-widget>
|
|
31
31
|
</div>
|
|
32
32
|
<div class="mb-2" v-if="textTransformSubTypeValue">
|
|
33
|
-
<label class="form-label">
|
|
33
|
+
<label class="form-label">{{ i18n.textTransform }}</label>
|
|
34
34
|
<text-transform-page-customizer-widget @update="componentUpdated" :style-value="textTransformSubTypeValue"></text-transform-page-customizer-widget>
|
|
35
35
|
</div>
|
|
36
36
|
</template>
|
|
@@ -60,6 +60,14 @@ export default {
|
|
|
60
60
|
},
|
|
61
61
|
data() {
|
|
62
62
|
return {
|
|
63
|
+
i18n: {
|
|
64
|
+
fontFamily: 'Font Family',
|
|
65
|
+
fontSize: 'Size',
|
|
66
|
+
fontWeight: 'Font Weight',
|
|
67
|
+
fontStyle: 'Font Style',
|
|
68
|
+
textDecoration: 'Text Decoration',
|
|
69
|
+
textTransform: 'Text Transform'
|
|
70
|
+
},
|
|
63
71
|
fontFamilySubTypeValue: null,
|
|
64
72
|
colorSubTypeValue: null,
|
|
65
73
|
fontSizeSubTypeValue: null,
|
|
@@ -76,6 +84,13 @@ export default {
|
|
|
76
84
|
},
|
|
77
85
|
mounted() {
|
|
78
86
|
var my = this
|
|
87
|
+
if (window.ccmi18n_styleCustomizer) {
|
|
88
|
+
for (const key in my.i18n) {
|
|
89
|
+
if (window.ccmi18n_styleCustomizer[key]) {
|
|
90
|
+
my.i18n[key] = window.ccmi18n_styleCustomizer[key]
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
79
94
|
this.styleValue.value.values.forEach(function(styleValue) {
|
|
80
95
|
if (styleValue.style.type === 'color') {
|
|
81
96
|
my.colorSubTypeValue = styleValue
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<form @submit.prevent="getExpressEntries">
|
|
6
6
|
<div class="ccm-header-search-form-input input-group">
|
|
7
7
|
<!--suppress HtmlFormInputWithoutLabel -->
|
|
8
|
-
<input type="text" class="form-control border-end-0" placeholder="
|
|
8
|
+
<input type="text" class="form-control border-end-0" :placeholder="i18n.search" autocomplete="false"
|
|
9
9
|
v-model="keywords">
|
|
10
10
|
|
|
11
11
|
<button type="submit" class="input-group-icon">
|
|
@@ -30,16 +30,16 @@
|
|
|
30
30
|
<th></th>
|
|
31
31
|
<th :class="getSortColumnClassName('e.exEntryDateCreated')">
|
|
32
32
|
<a href="#" @click.prevent="sortBy('exEntryDateCreated')">
|
|
33
|
-
|
|
33
|
+
{{ i18n.dateAdded }}
|
|
34
34
|
</a>
|
|
35
35
|
</th>
|
|
36
36
|
<th :class="getSortColumnClassName('e.exEntryDateModified')">
|
|
37
37
|
<a href="#" @click.prevent="sortBy('e.exEntryDateModified')">
|
|
38
|
-
|
|
38
|
+
{{ i18n.dateModified }}
|
|
39
39
|
</a>
|
|
40
40
|
</th>
|
|
41
41
|
<th>
|
|
42
|
-
<span>
|
|
42
|
+
<span>{{ i18n.name }}</span>
|
|
43
43
|
</th>
|
|
44
44
|
</tr>
|
|
45
45
|
</thead>
|
|
@@ -67,11 +67,11 @@
|
|
|
67
67
|
|
|
68
68
|
<div class="dialog-buttons">
|
|
69
69
|
<button class="btn btn-secondary" data-dialog-action="cancel">
|
|
70
|
-
|
|
70
|
+
{{ i18n.cancel }}
|
|
71
71
|
</button>
|
|
72
72
|
|
|
73
73
|
<button type="button" @click="selectEntry" :disabled="selectedEntry === null" class="btn btn-primary">
|
|
74
|
-
|
|
74
|
+
{{ i18n.select }}
|
|
75
75
|
</button>
|
|
76
76
|
</div>
|
|
77
77
|
</div>
|
|
@@ -95,6 +95,14 @@ export default {
|
|
|
95
95
|
}
|
|
96
96
|
},
|
|
97
97
|
data: () => ({
|
|
98
|
+
i18n: {
|
|
99
|
+
search: 'Search',
|
|
100
|
+
dateAdded: 'Date Added',
|
|
101
|
+
dateModified: 'Date Modified',
|
|
102
|
+
name: 'Name',
|
|
103
|
+
cancel: 'Cancel',
|
|
104
|
+
select: 'Select'
|
|
105
|
+
},
|
|
98
106
|
keywords: '',
|
|
99
107
|
selectedEntry: null,
|
|
100
108
|
currentPage: 1,
|
|
@@ -210,6 +218,13 @@ export default {
|
|
|
210
218
|
}
|
|
211
219
|
},
|
|
212
220
|
mounted() {
|
|
221
|
+
if (window.ccmi18n_express) {
|
|
222
|
+
for (const key in this.i18n) {
|
|
223
|
+
if (window.ccmi18n_express[key]) {
|
|
224
|
+
this.i18n[key] = window.ccmi18n_express[key]
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
213
228
|
this.getExpressEntries()
|
|
214
229
|
}
|
|
215
230
|
}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
</option>
|
|
13
13
|
</select>
|
|
14
14
|
|
|
15
|
-
<input type="text" class="form-control border-end-0" placeholder="
|
|
15
|
+
<input type="text" class="form-control border-end-0" :placeholder="i18n.search" autocomplete="false"
|
|
16
16
|
v-model="searchText">
|
|
17
17
|
<button type="submit" class="input-group-icon">
|
|
18
18
|
<svg width="16" height="16">
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
<span class="search-icon my-4">
|
|
28
28
|
<Icon icon="search" type="fas" color="#f4f4f4"/>
|
|
29
29
|
</span>
|
|
30
|
-
<p><b>
|
|
30
|
+
<p><b>{{ i18n.initialExternalFileProviderChooserTip }}</b></p>
|
|
31
31
|
</div>
|
|
32
32
|
<div>
|
|
33
33
|
<files v-if="keywords"
|
|
@@ -66,6 +66,10 @@ export default {
|
|
|
66
66
|
ConcreteFileDirectoryInput
|
|
67
67
|
},
|
|
68
68
|
data: () => ({
|
|
69
|
+
i18n: {
|
|
70
|
+
search: 'Search',
|
|
71
|
+
initialExternalFileProviderChooserTip: "Let's get some info on what you're looking for."
|
|
72
|
+
},
|
|
69
73
|
uploadDirectoryId: 0,
|
|
70
74
|
fileTypes: [],
|
|
71
75
|
searchText: '',
|
|
@@ -121,6 +125,13 @@ export default {
|
|
|
121
125
|
}
|
|
122
126
|
},
|
|
123
127
|
mounted() {
|
|
128
|
+
if (window.ccmi18n_filemanager) {
|
|
129
|
+
for (const key in this.i18n) {
|
|
130
|
+
if (window.ccmi18n_filemanager[key]) {
|
|
131
|
+
this.i18n[key] = window.ccmi18n_filemanager[key]
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
124
135
|
this.formFactor = this.resultsFormFactor
|
|
125
136
|
this.getFileTypes()
|
|
126
137
|
this.$refs.folderSelector.selectedDirectoryID = this.extraData.uploadDirectoryId
|
|
@@ -1,92 +1,95 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
<div>
|
|
3
|
+
<chooser-header :resultsFormFactor.sync="formFactor"
|
|
4
|
+
:breadcrumb-items="breadcrumbItems"
|
|
5
|
+
@breadcrumbItemClick="activeFolder = $event.folderId"
|
|
6
|
+
:title="title"/>
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
8
|
+
<files :selectedFiles.sync="selectedFiles"
|
|
9
|
+
:resultsFormFactor="formFactor"
|
|
10
|
+
:routePath="routePath + activeFolder"
|
|
11
|
+
:enable-pagination="true"
|
|
12
|
+
:enable-sort="true"
|
|
13
|
+
:filters="filters"
|
|
14
|
+
:multipleSelection="multipleSelection"
|
|
15
|
+
@folderClick="activeFolder = $event"/>
|
|
16
|
+
</div>
|
|
16
17
|
</template>
|
|
17
18
|
|
|
18
19
|
<script>
|
|
19
20
|
/* global CCM_DISPATCHER_FILENAME, ConcreteAjaxRequest */
|
|
20
|
-
/* eslint indent: [2, 2, {"SwitchCase": 1}] */
|
|
21
21
|
/* eslint-disable no-new */
|
|
22
22
|
import ChooserHeader from './Header'
|
|
23
23
|
import Files from './Files'
|
|
24
24
|
|
|
25
25
|
export default {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
},
|
|
30
|
-
data: () => ({
|
|
31
|
-
activeFolder: '',
|
|
32
|
-
selectedFiles: [],
|
|
33
|
-
breadcrumbItems: [],
|
|
34
|
-
routePath: '/ccm/system/file/chooser/get_folder_files/',
|
|
35
|
-
formFactor: 'grid'
|
|
36
|
-
}),
|
|
37
|
-
props: {
|
|
38
|
-
resultsFormFactor: {
|
|
39
|
-
type: String,
|
|
40
|
-
required: false,
|
|
41
|
-
default: 'grid', // grid | list
|
|
42
|
-
validator: value => ['grid', 'list'].indexOf(value) !== -1
|
|
26
|
+
components: {
|
|
27
|
+
ChooserHeader,
|
|
28
|
+
Files
|
|
43
29
|
},
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
30
|
+
data: () => ({
|
|
31
|
+
activeFolder: '',
|
|
32
|
+
selectedFiles: [],
|
|
33
|
+
breadcrumbItems: [],
|
|
34
|
+
routePath: '/ccm/system/file/chooser/get_folder_files/',
|
|
35
|
+
formFactor: 'grid'
|
|
36
|
+
}),
|
|
37
|
+
props: {
|
|
38
|
+
resultsFormFactor: {
|
|
39
|
+
type: String,
|
|
40
|
+
required: false,
|
|
41
|
+
default: 'grid', // grid | list
|
|
42
|
+
validator: value => ['grid', 'list'].indexOf(value) !== -1
|
|
43
|
+
},
|
|
44
|
+
startFolder: {
|
|
45
|
+
type: String,
|
|
46
|
+
required: true
|
|
47
|
+
},
|
|
48
|
+
title: {
|
|
49
|
+
type: String,
|
|
50
|
+
required: true
|
|
51
|
+
},
|
|
52
|
+
multipleSelection: {
|
|
53
|
+
type: Boolean,
|
|
54
|
+
default: true
|
|
55
|
+
},
|
|
56
|
+
filters: {
|
|
57
|
+
type: Array
|
|
58
|
+
}
|
|
47
59
|
},
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
60
|
+
created() {
|
|
61
|
+
this.activeFolder = this.$props.startFolder
|
|
62
|
+
this.fetchBreadcrumb(this.activeFolder)
|
|
51
63
|
},
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
},
|
|
61
|
-
methods: {
|
|
62
|
-
fetchBreadcrumb(folderId = '') {
|
|
63
|
-
new ConcreteAjaxRequest({
|
|
64
|
-
url: `${CCM_DISPATCHER_FILENAME}/ccm/system/file/chooser/get_breadcrumb/${folderId}`,
|
|
65
|
-
success: r => {
|
|
66
|
-
this.breadcrumbItems = r.data
|
|
64
|
+
methods: {
|
|
65
|
+
fetchBreadcrumb(folderId = '') {
|
|
66
|
+
new ConcreteAjaxRequest({
|
|
67
|
+
url: `${CCM_DISPATCHER_FILENAME}/ccm/system/file/chooser/get_breadcrumb/${folderId}`,
|
|
68
|
+
success: r => {
|
|
69
|
+
this.breadcrumbItems = r.data
|
|
70
|
+
}
|
|
71
|
+
})
|
|
67
72
|
}
|
|
68
|
-
})
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
watch: {
|
|
72
|
-
activeFolder(value) {
|
|
73
|
-
this.fetchBreadcrumb(value)
|
|
74
73
|
},
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
74
|
+
watch: {
|
|
75
|
+
activeFolder(value) {
|
|
76
|
+
this.fetchBreadcrumb(value)
|
|
77
|
+
},
|
|
78
|
+
selectedFiles(value) {
|
|
79
|
+
this.$emit('update:selectedFiles', value)
|
|
80
|
+
},
|
|
81
|
+
formFactor(value) {
|
|
82
|
+
this.$emit('update:resultsFormFactor', value)
|
|
83
|
+
},
|
|
84
|
+
startFolder(value) {
|
|
85
|
+
this.activeFolder = value
|
|
86
|
+
this.fetchBreadcrumb(value)
|
|
87
|
+
}
|
|
80
88
|
},
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
89
|
+
mounted() {
|
|
90
|
+
this.formFactor = this.resultsFormFactor
|
|
91
|
+
this.activeFolder = this.$props.startFolder
|
|
92
|
+
this.fetchBreadcrumb(this.activeFolder)
|
|
84
93
|
}
|
|
85
|
-
},
|
|
86
|
-
mounted() {
|
|
87
|
-
this.formFactor = this.resultsFormFactor
|
|
88
|
-
this.activeFolder = this.$props.startFolder
|
|
89
|
-
this.fetchBreadcrumb(this.activeFolder)
|
|
90
|
-
}
|
|
91
94
|
}
|
|
92
95
|
</script>
|
|
@@ -4,25 +4,26 @@
|
|
|
4
4
|
|
|
5
5
|
<div class="form-group row row-cols-auto g-0 align-items-center justify-content-end">
|
|
6
6
|
<div class="col-auto">
|
|
7
|
-
<label for="fileSetSelector" class="me-2">
|
|
7
|
+
<label for="fileSetSelector" class="me-2">{{ i18n.fileSet }}</label>
|
|
8
8
|
</div>
|
|
9
9
|
<div class="col-auto">
|
|
10
10
|
<select id="fileSetSelector" class="form-select file-set-menu" v-model="activeSet">
|
|
11
|
-
<option value="" selected>
|
|
11
|
+
<option value="" selected>{{ i18n.selectFileSet }}</option>
|
|
12
12
|
<option v-for="set in sets" :key="set.id" :value="set.id">
|
|
13
|
-
{{set.name}}
|
|
13
|
+
{{ set.name }}
|
|
14
14
|
</option>
|
|
15
15
|
</select>
|
|
16
16
|
</div>
|
|
17
17
|
</div>
|
|
18
18
|
<div class="mt-3" v-show="activeSet">
|
|
19
19
|
<files v-if="activeSet"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
:selectedFiles.sync="selectedFiles"
|
|
21
|
+
:resultsFormFactor="formFactor"
|
|
22
|
+
:routePath="routePath + activeSet"
|
|
23
|
+
:enable-pagination="true"
|
|
24
|
+
:enable-sort="true"
|
|
25
|
+
:filters="filters"
|
|
26
|
+
:multipleSelection="multipleSelection"/>
|
|
26
27
|
</div>
|
|
27
28
|
</div>
|
|
28
29
|
</template>
|
|
@@ -45,6 +46,10 @@ export default {
|
|
|
45
46
|
Files
|
|
46
47
|
},
|
|
47
48
|
data: () => ({
|
|
49
|
+
i18n: {
|
|
50
|
+
fileSet: 'File Set',
|
|
51
|
+
selectFileSet: 'Select a Set'
|
|
52
|
+
},
|
|
48
53
|
sets: [],
|
|
49
54
|
activeSet: '',
|
|
50
55
|
selectedFiles: [],
|
|
@@ -65,6 +70,9 @@ export default {
|
|
|
65
70
|
multipleSelection: {
|
|
66
71
|
type: Boolean,
|
|
67
72
|
default: true
|
|
73
|
+
},
|
|
74
|
+
filters: {
|
|
75
|
+
type: Array
|
|
68
76
|
}
|
|
69
77
|
},
|
|
70
78
|
methods: {
|
|
@@ -86,6 +94,13 @@ export default {
|
|
|
86
94
|
}
|
|
87
95
|
},
|
|
88
96
|
mounted() {
|
|
97
|
+
if (window.ccmi18n_filemanager) {
|
|
98
|
+
for (const key in this.i18n) {
|
|
99
|
+
if (window.ccmi18n_filemanager[key]) {
|
|
100
|
+
this.i18n[key] = window.ccmi18n_filemanager[key]
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
89
104
|
this.formFactor = this.resultsFormFactor
|
|
90
105
|
|
|
91
106
|
this.getSets()
|