|
16 | 16 | counter |
17 | 17 | data-name="author" |
18 | 18 | :label="$tr('author')" |
19 | | - @change="emitChange" |
20 | 19 | /> |
21 | 20 | <VTextField |
22 | 21 | v-model="provider" |
|
25 | 24 | counter |
26 | 25 | data-name="provider" |
27 | 26 | :label="$tr('provider')" |
28 | | - @change="emitChange" |
29 | 27 | /> |
30 | 28 | <VTextField |
31 | 29 | v-model="aggregator" |
|
34 | 32 | counter |
35 | 33 | data-name="aggregator" |
36 | 34 | :label="$tr('aggregator')" |
37 | | - @change="emitChange" |
38 | 35 | /> |
39 | 36 | <VTextField |
40 | 37 | v-model="copyrightHolder" |
|
43 | 40 | counter |
44 | 41 | data-name="copyrightHolder" |
45 | 42 | :label="$tr('copyrightHolder')" |
46 | | - @change="emitChange" |
47 | 43 | /> |
48 | 44 | <VSelect |
49 | 45 | v-model="license" |
|
52 | 48 | :items="licenseOpts" |
53 | 49 | :label="$tr('license')" |
54 | 50 | menuProps="offsetY" |
55 | | - @change="emitChange" |
56 | 51 | /> |
57 | 52 | <VTextarea |
58 | 53 | v-if="isCustomLicense" |
|
63 | 58 | data-name="licenseDescription" |
64 | 59 | :label="$tr('licenseDescription')" |
65 | 60 | auto-grow |
66 | | - @change="emitChange" |
67 | 61 | /> |
68 | 62 | </fieldset> |
69 | 63 |
|
|
77 | 71 | class="mt-2" |
78 | 72 | data-name="autoDeriveVideoThumbnail" |
79 | 73 | :label="$tr('videos')" |
80 | | - @change="emitChange" |
81 | 74 | /> |
82 | 75 | <Checkbox |
83 | 76 | v-model="autoDeriveAudioThumbnail" |
84 | 77 | class="mt-2" |
85 | 78 | data-name="autoDeriveAudioThumbnail" |
86 | 79 | :label="translateConstant('audio')" |
87 | | - @change="emitChange" |
88 | 80 | /> |
89 | 81 | <Checkbox |
90 | 82 | v-model="autoDeriveHtml5Thumbnail" |
91 | 83 | class="mt-2" |
92 | 84 | data-name="autoDeriveHtml5Thumbnail" |
93 | 85 | :label="$tr('html5')" |
94 | | - @change="emitChange" |
95 | 86 | /> |
96 | 87 | <Checkbox |
97 | 88 | v-model="autoDeriveDocumentThumbnail" |
98 | 89 | class="mt-2" |
99 | 90 | data-name="autoDeriveDocumentThumbnail" |
100 | 91 | :label="$tr('documents')" |
101 | | - @change="emitChange" |
102 | 92 | /> |
103 | 93 | </fieldset> |
104 | 94 | </div> |
|
124 | 114 | }, {}); |
125 | 115 | } |
126 | 116 |
|
| 117 | + function camelToSnakeCase(contentDefaults) { |
| 118 | + return Object.entries(ContentDefaults).reduce((data, [snakeCaseName, camelCaseName]) => { |
| 119 | + const value = contentDefaults[camelCaseName] === '' ? null : contentDefaults[camelCaseName]; |
| 120 | + return Object.assign(data, { [snakeCaseName]: value }); |
| 121 | + }, {}); |
| 122 | + } |
| 123 | +
|
| 124 | + function generateGetterSetter(key) { |
| 125 | + return { |
| 126 | + get() { |
| 127 | + return this.normalized[key]; |
| 128 | + }, |
| 129 | + set(value) { |
| 130 | + this.normalized[key] = value; |
| 131 | + this.emitChange(); |
| 132 | + }, |
| 133 | + }; |
| 134 | + } |
| 135 | +
|
127 | 136 | export default { |
128 | 137 | name: 'ContentDefaults', |
129 | 138 | components: { |
|
152 | 161 | }, |
153 | 162 | }, |
154 | 163 | data() { |
155 | | - const normalized = normalizeContentDefaults(this.contentDefaults); |
156 | | -
|
157 | 164 | return { |
158 | | - author: normalized.author, |
159 | | - provider: normalized.provider, |
160 | | - aggregator: normalized.aggregator, |
161 | | - copyrightHolder: normalized.copyrightHolder, |
162 | | - license: findLicense(normalized.license, { license_name: '' }).license_name, |
163 | | - licenseDescription: normalized.licenseDescription, |
164 | | - autoDeriveAudioThumbnail: normalized.autoDeriveAudioThumbnail, |
165 | | - autoDeriveDocumentThumbnail: normalized.autoDeriveDocumentThumbnail, |
166 | | - autoDeriveHtml5Thumbnail: normalized.autoDeriveHtml5Thumbnail, |
167 | | - autoDeriveVideoThumbnail: normalized.autoDeriveVideoThumbnail, |
| 165 | + normalized: normalizeContentDefaults(this.contentDefaults), |
168 | 166 | }; |
169 | 167 | }, |
170 | 168 | computed: { |
| 169 | + author: generateGetterSetter('author'), |
| 170 | + provider: generateGetterSetter('provider'), |
| 171 | + aggregator: generateGetterSetter('aggregator'), |
| 172 | + copyrightHolder: generateGetterSetter('copyrightHolder'), |
| 173 | + licenseDescription: generateGetterSetter('licenseDescription'), |
| 174 | + autoDeriveAudioThumbnail: generateGetterSetter('autoDeriveAudioThumbnail'), |
| 175 | + autoDeriveDocumentThumbnail: generateGetterSetter('autoDeriveDocumentThumbnail'), |
| 176 | + autoDeriveHtml5Thumbnail: generateGetterSetter('autoDeriveHtml5Thumbnail'), |
| 177 | + autoDeriveVideoThumbnail: generateGetterSetter('autoDeriveVideoThumbnail'), |
| 178 | + license: { |
| 179 | + get() { |
| 180 | + return findLicense(this.normalized.license, { license_name: '' }).license_name; |
| 181 | + }, |
| 182 | + set(value) { |
| 183 | + this.normalized['license'] = value; |
| 184 | + this.emitChange(); |
| 185 | + }, |
| 186 | + }, |
171 | 187 | licenseOpts() { |
172 | 188 | const licenseOpts = LicensesList.map(license => ({ |
173 | 189 | value: license.license_name, |
|
184 | 200 | return findLicense(this.license, { is_custom: false }).is_custom; |
185 | 201 | }, |
186 | 202 | }, |
| 203 | + watch: { |
| 204 | + contentDefaults(newValue) { |
| 205 | + this.normalized = normalizeContentDefaults(newValue); |
| 206 | + }, |
| 207 | + }, |
187 | 208 | methods: { |
188 | 209 | emitChange() { |
189 | | - // When any field in our component changes, this gets triggered which then triggers the |
190 | | - // event that updates the prop passed into us as `contentDefaults` in the parent component. |
191 | | - // This assigns the data into a object, with snake cased keys instead of camel cased here |
192 | | - this.$nextTick(() => { |
193 | | - this.$emit( |
194 | | - 'change', |
195 | | - Object.entries(ContentDefaults).reduce((data, [snakeCaseName, camelCaseName]) => { |
196 | | - const value = this[camelCaseName] === '' ? null : this[camelCaseName]; |
197 | | - return Object.assign(data, { [snakeCaseName]: value }); |
198 | | - }, {}) |
199 | | - ); |
200 | | - }); |
| 210 | + this.$emit('change', camelToSnakeCase(this.normalized)); |
201 | 211 | }, |
202 | 212 | }, |
203 | 213 | $trs: { |
|
0 commit comments